diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
index 2b4171f..5d2bf36 100644
--- a/.git-blame-ignore-revs
+++ b/.git-blame-ignore-revs
@@ -15,3 +15,320 @@
 #   from oldest to newest).
 # - Because you must use a hash, you need to append to this list in a follow-up
 #   CL to the actual reformatting CL that you are trying to ignore.
+
+# This block of commits mechanically renamed scoped_ptr to std::unique_ptr and
+# make_scoped_ptr to base::WrapUnique, throughout the codebase.
+# Convert //android_webview to use std::unique_ptr
+08daa0770adc348a5e3852200352b2cd7f620d21
+# Convert //storage to use std::unique_ptr
+c6378bdd46cb9fbeb4e7a0fbb37d820f8b82232d
+# Convert //gin to use std::unique_ptr
+c862da8ac734722d6928b64ae87564bf2ee0d2ae
+# Convert //url to use std::unique_ptr
+ea64f7caeafef5b77b656d03b4b8c4ec8edab4c0
+# convert //rlz to std::unique_ptr
+03c6cc125a0f63fcf549db5caa525ad5941fffd8
+# convert //apps to std::unique_ptr
+ecb4a22b939cdcd3e022ee2c452dd7f866d1dfb5
+# convert //testing to std::unique_ptr
+d1b5b043fcf499cf46d059f5bb72a6ab07f04d88
+# convert //headless to std::unique_ptr
+c3d183bef609f3c4dab124572281ba13257d37a6
+# convert //chrome_elf to std::unique_ptr
+1795070c67cd08f5c5437b4e0d3ae6e5d3e5fd13
+# convert //mash to std::unique_ptr
+1aaf50682f5b06bea8db36316dcddde48444b54e
+# Convert //base to use std::unique_ptr
+093de9b30c0ba6ded896506a297314e5ed818b89
+# Convert media/mojo/ to use std::unique_ptr
+f1bc82901463a76329b480e1ce55638d105f4616
+# Convert //sandbox to use std::unique_ptr
+d521b63cb0fe3d78ed64bbba2c4cfacfeb7ebfd3
+# Convert //remoting to use std::unique_ptr
+0765c49ae6fb26c49c98bf9205d690174de3c0e4
+# Convert //blimp to use std::unique_ptr
+1b185c49a6f2e9eea0bac36132f79b8ce50f529a
+# Convert //ppapi to use std::unique_ptr
+ced9224fbb7866e6ea7e9da221c0b2570008bd55
+# Convert //third_party/WebKit from scoped_ptr to std::unique_ptr
+a37bedae9c23a82bf8b2f9011d06c9933e0048db
+# Nuke WebPassOwnPtr<T> and replace it with std::unique_ptr<T>.
+e0d99834d5d8f817c55828c1f53b4d0946b2d6df
+# Convert //ios from scoped_ptr to std::unique_ptr.
+942f39d75745824a53ef6ce896bb2462010476bb
+# Convert //chrome/browser/download from scoped_ptr to std::unique_ptr
+abbf4465acfdb9c8d6223c680b634f1fd506813e
+# Convert //printing to use std::unique_ptr
+c3df9bafc8db94bd613fbd76c61abe5057f7a82d
+# Convert //chrome/browser/android from scoped_ptr to std::unique_ptr
+aeceb05e862d97596a0e005a17a4f7d61183b818
+# Convert //chrome/browser/chromeos from scoped_ptr to std::unique_ptr
+24002d093cd0d2b540b0b1895d0044d44a30450d
+# Convert //sync from scoped_ptr to std::unique_ptr
+c3e80570c413b058d8f855a695610b38072d6519
+# Convert //chrome/browser/profiles from scoped_ptr to std::unique_ptr
+6e25ed32b8e7dca8352af477dbc82b67ac836736
+# Convert //chrome/browser/extensions from scoped_ptr to std::unique_ptr
+c963c714c99f34bd80b392d9896ca9cecd66fb6d
+# Convert //chrome/browser/ui from scoped_ptr to std::unique_ptr
+9603ab9714083051fc19942aa171d88af2cd379c
+# Convert //chromecast from scoped_ptr to std::unique_ptr
+3c3c93d549f8685459c9d938e81f1e68c888ad6c
+# Convert //ash from scoped_ptr to std::unique_ptr
+a9454747427889f70d14df4646f7f599d00df02d
+# Convert //chrome/browser/sync_file_system from scoped_ptr to std::unique_ptr
+566c3c55ebc5fa4600c3e6259938c3f9e1baf483
+# Convert //google_apis from scoped_ptr to std::unique_ptr
+f064cccace7bf4d940a494042754760f07e8164f
+# Convert //chromeos from scoped_ptr to std::unique_ptr
+0a6e80cc6b045cb1217a59ad3c9e764c36fb0260
+# Convert //tools to use std::unique_ptr
+a500b69aa06c2bc084a3b1867b9824f4218014de
+# Convert crypto to std::unique_ptr
+d1a1847163c0038284a7053b41ba0dedfad9b7b7
+# Convert //dbus from scoped_ptr to std::unique_ptr
+2a193281aac690b3fdfba1246d6b36877553a9be
+# Convert //chrome/browser/media from scoped_ptr to std::unique_ptr
+c16dc809e7c8026d8fad7d9169f324df7ab6b1ce
+# Convert //content/renderer/media from scoped_ptr to std::unique_ptr
+67e2c0a015fb2d2d2584a44b96da1620d2678bf5
+# Convert //content/browser/renderer_host/media from scoped_ptr to std::unique_ptr
+fd6a38135a1dd716d0f00a86900a03a931a697db
+# Convert //content/browser/media from scoped_ptr to std::unique_ptr
+3b4fe476046af664ea30dcfffb10956eeaba3b9e
+# Convert //content/browser/loader from scoped_ptr to std::unique_ptr
+40ce7b38f09de969a106da37e4dec11464da18c6
+# Convert //content/child from scoped_ptr to std::unique_ptr
+c864f52514c7e8cf9992a524e0294b1cc32c1db5
+# Convert //content/browser/fileapi from scoped_ptr to std::unique_ptr
+b4e18e45c933153b06833a33bf6352c5da38125a
+# Convert //content/browser/download from scoped_ptr to std::unique_ptr
+f6c40587bc9ee68ef8102992ea5c52cc8e0c6933
+# Convert //cc from scoped_ptr to std::unique_ptr.
+60bc3bcfa8b7141986c5e4b3c357c7e03393f230
+# Convert //content/browser/frame_host from scoped_ptr to std::unique_ptr
+9bfa516692718597507a3339a33dafdc7c2f00ba
+# Convert //content/renderer from scoped_ptr to std::unique_ptr
+cedca561f373a9f2d102e7bd896712b504b445db
+# Convert //content/browser/service_worker from scoped_ptr to std::unique_ptr
+86be9c00e6a13acad1851ddc64182a94347c9420
+# Convert //content/browser/cache_storage from scoped_ptr to std::unique_ptr
+92ae1414e686f8f8ba9c5c663b34552362641feb
+# Convert //content/browser/indexed_db from scoped_ptr to std::unique_ptr
+531cca917021e753d5215ddb194200be075944ac
+# Convert //content/common from scoped_ptr to std::unique_ptr
+4ac58c7a6c73f0972e73ce420749f886a8aec18c
+# Convert //content/browser from scoped_ptr to std::unique_ptr
+5971627d34ab2cca303e4a4552fecf2f019f61c6
+# Convert //content from scoped_ptr to std::unique_ptr
+6003e0b1ac1acb0a3973abbca62881d2b6acc0b1
+# Convert device/bluetooth to std::unique_ptr
+08c9d69b0c0d625d2ce38e3d8402f36e1226f0fc
+# Change WebBlobRegistry::createBuilder to return a std::unique_ptr.
+ae4a290306d308cd6c7187df85c1825edf3354db
+# Convert device to std::unique_ptr
+acd68a2e07af43fa67def3830555f294eff2ac8e
+# Convert skia to std::unique_ptr
+b743cc6790dd88fd5b53e4a21f089a38b40a53f8
+# JPEG decoding: replace ownership comments with std::unique_ptr.
+b587f9a457ee20bfc4e3055f3b79ad7b522c8682
+# Convert //sql to use std::unique_ptr
+d82cd995ba83303302900ebe7704a9fab405ef93
+# Convert //chrome/browser/safe_browsing from scoped_ptr to std::unique_ptr
+7bacc0eaa9eb6edb22c9e2734e0e57e64e8b4125
+# Convert chrome/renderer to std::unique_ptr
+fabb28482dce40e1ac570beb5b9eef5832f9a9b1
+# convert //courgette to std::unique_ptr
+1007a4af51fee305fd95933d9bdcd83c89f9df29
+# Convert chrome/browser/printing to std::unique_ptr
+6cb57924b37070a844c7626bc2ab8850c7cf17dd
+# Convert //components/drive from scoped_ptr to std::unique_ptr
+f427502355334e64faa24798a34f7db9f3bf7871
+# Convert //chrome/browser/supervised_user from scoped_ptr to std::unique_ptr
+f624e47486f525e6d266b99f90bcb81ad8f57295
+# Convert chrome/common to std::unique_ptr
+8b51c0ab6c7b58cfa186691dcc973527371b2309
+# Replace scoped_ptr with std::unique_ptr in //ui
+25c52c3f3c407fd9f5678c0079c877ccef34c090
+# Convert //components/dom_distiller from scoped_ptr to std::unique_ptr
+fecbe3fea62c512555c2f9c63b936331c9915619
+# Convert pdf/ to use std::unique_ptr.
+79ce717c93677da7d3db074bad0349995980ce93
+# Convert //components/data_reduction_proxy from scoped_ptr to std::unique_ptr
+5197113e6864b0530dd8b489615c089facd06e70
+# Convert a few components from scoped_ptr to std::unique_ptr
+532924d626b6538b547fd00793f0373bb5271df2
+# Convert //chrome/test from scoped_ptr to std::unique_ptr
+ba06265360528b619b4e6df792b0fb06350a2602
+# Convert //chrome/browser/media_galleries from scoped_ptr to std::unique_ptr
+5ea05e40ab4ad7a6f6dbd4fabd2ffe061d9e15f2
+# Convert //chrome/browser/devtools from scoped_ptr to std::unique_ptr
+b8eac3a8edbd7864438f5e326893fa52da75c16f
+# Convert //chrome/installer from scoped_ptr to std::unique_ptr
+f5d315cecedf2bc83f7499d9c4311215db51ecc6
+# Convert media/formats to std::unique_ptr
+f402ab9f3f02d00d87c840fe79863f4ac0609ba1
+# Convert //chrome/browser/local_discovery from scoped_ptr to std::unique_ptr
+bf70795c3d53b4c087b4276069bc8798048497da
+# Convert //chrome/browser/net from scoped_ptr to std::unique_ptr
+4e7c042ce7fda2baafe59dd88481b2de67644170
+# Convert //chrome/browser/spellchecker from scoped_ptr to std::unique_ptr
+4d0d72efb14b4746ff054fd1867058dc6997cafd
+# Convert //chrome/browser/apps from scoped_ptr to std::unique_ptr
+71f677162f1b860b005e20fc9c2f2417bdfb7030
+# Convert //chrome/browser/metrics from scoped_ptr to std::unique_ptr
+1edb03a4943e4e3de4116adcc031e2dfabbb7805
+# Convert //chrome/browser/history from scoped_ptr to std::unique_ptr
+b11f7ae342eeba3a126b8270171ab3c6981e0bf7
+# Convert //chrome/browser/sync from scoped_ptr to std::unique_ptr
+0569a0ed6347980265b437c61b5849ee2ca2c529
+# Convert //chrome/browser/policy from scoped_ptr to std::unique_ptr
+08cfe9ba9528151087b93894baaf4390a4ad75d0
+# Convert //chrome/browser/search_engines from scoped_ptr to std::unique_ptr
+878bd271da9444eba2a823fe30f0c316656b0d0d
+# Change scoped_ptr to std::unique_ptr in //net/url_request.
+8522a25bece204fd7281ec764af1e0c8e36329d6
+# Change scoped_ptr to std::unique_ptr in //net/spdy.
+aee3e1ec72a9985aa20be4ccf514774373737705
+# Change scoped_ptr to std::unique_ptr in //net/socket.
+655b66c64362dbea1b7e27207545234f7b908106
+# Change scoped_ptr to std::unique_ptr in //net/websockets.
+9c5cab5a712d0762319d115a30f5baed1d07416c
+# Change scoped_ptr to std::unique_ptr in //net/quic.
+ad1777e9c39dc1c7c4d4fb6293a01ca470595134
+# Change scoped_ptr to std::unique_ptr in //net/disk_cache.
+d04b92dd6de3bbe80c94955ac3347523e891f93d
+# Change scoped_ptr to std::unique_ptr in //net/base.
+42edb859e1917c96b988fa2f4e204de63aeb18ae
+# Change scoped_ptr to std::unique_ptr in //net/dns.
+22f90e716ad8674d122781cda62ab739ecb7271c
+# Revert of Change scoped_ptr to std::unique_ptr in //net/base.
+49964c23cbba511c110cfb642f5685694a895d49
+# Change scoped_ptr to std::unique_ptr in //net/proxy.
+8a98ca292bd722516ad23b2d85fdb5663a33dab3
+# Change scoped_ptr to std::unique_ptr in //net/cert.
+3a4770da8b56e8f4c0ef1a85f5786afe35f5401e
+# Change scoped_ptr to std::unique_ptr in //net/http.
+1fd259a0929d9c8ee68923e29ec1bd60d88f5690
+# Change scoped_ptr to std::unique_ptr in //net/base.
+7f767e658961d89959af3bd143e7719fcaca8445
+# Change scoped_ptr to std::unique_ptr in //net.
+a9850e17ec8a7e5e754d2b804ea1a93ff2352310
+# Convert //chrome/browser from scoped_ptr to std::unique_ptr
+4af48586364b625a8bfce51b10aa4a76109a9108
+# Convert //chrome from scoped_ptr to std::unique_ptr
+c0e39d57d0c16684ff7c99632fba9a49d4d2431e
+# convert //gpu to std::unique_ptr
+6682b1c4aac00aee61b09ba8f6084f1790429315
+# Convert //extensions/renderer from scoped_ptr to std::unique_ptr
+f6f806674c4f6ebbb8b20197ae5b6c7a40bba08f
+# Convert //components/policy from scoped_ptr to std::unique_ptr
+a3451b74e1aac0c538d7d6824bd714553eb0141e
+# Convert //services from scoped_ptr to std::unique_ptr
+39fafebd8ff93ca8aac361926e6b3ef840302328
+# Convert //extensions/browser/api from scoped_ptr to std::unique_ptr
+ccfc5401e32e24f29847cd91f643d03ed651b19a
+# Convert //components/proximity_auth from scoped_ptr to std::unique_ptr
+2f01269f405de0dfd12cb1dc56459c4492d65b8b
+# Convert //components/mus from scoped_ptr to std::unique_ptr
+c314381373dc794d3875428994ec7a74edda77e4
+# Convert //components/exo from scoped_ptr to std::unique_ptr
+31759da04512d5815aff6c30134e33856638889d
+# Convert //extensions/browser from scoped_ptr to std::unique_ptr
+f5d2410841791e8c32739a4418159489e1dde324
+# Convert //components/sync_driver from scoped_ptr to std::unique_ptr
+b21a1b10f9a753d3b66e448ca8fa74ac83d5c2cb
+# Convert //jingle from scoped_ptr to std::unique_ptr
+18e946f9ab6250614430fd09cccb849005ca7aeb
+# Convert //components/gcm_driver from scoped_ptr to std::unique_ptr
+a77e28eb3b14d816f2c880d3185af8522c04f6bc
+# Convert //components/metrics from scoped_ptr to std::unique_ptr
+d99c42a1a3c4566d5cdbac0bbbed5c266d09cfeb
+# Convert //media/cast from scoped_ptr to std::unique_ptr
+8a9783e4c8d986f835f8cc2760267d6c1c7b0b57
+# Convert //components/bookmarks from scoped_ptr to std::unique_ptr
+acd3f5279c9bc0c73f25976e1cdfa72f43309dba
+# Convert //components/search_engines from scoped_ptr to std::unique_ptr
+d967d950d071094d70cb480dc3158a48949a7167
+# Convert //components/webcrypto from scoped_ptr to std::unique_ptr
+7036d1e571ea31ea7ae35c9cc71890cef2fa90d7
+# Convert //components/cronet from scoped_ptr to std::unique_ptr
+fe3745e624cc39bca68defa70d92390baf897c8a
+# Convert //components/history from scoped_ptr to std::unique_ptr
+00dfa74c4fe33466816c58d175b60c3a5d4683b4
+# Convert //components/omnibox from scoped_ptr to std::unique_ptr
+259570ccaf98009037d611aac72e9d809d4d438f
+# Convert //mojo from scoped_ptr to std::unique_ptr
+40c732a8f3bb63cc6a16a200819f9d01da3e6039
+# Convert //media/filters from scoped_ptr to std::unique_ptr
+254c536ce14380dc8009240cfff27117a1d52897
+# Convert //components/sessions from scoped_ptr to std::unique_ptr
+c51ac9e88916cb09ed5f0c4ea7d00d835f4223c7
+# Convert //media/capture from scoped_ptr to std::unique_ptr
+b8259a16dea373e71505b1f8d9a02b96612161df
+# Convert //components/domain_reliability from scoped_ptr to std::unique_ptr
+04a35cd4ca655ce8092705d501678ba9edfd005a
+# Convert //components/scheduler from scoped_ptr to std::unique_ptr
+c0d9887721c7d00ad99a7df09ebae75720503a6a
+# Convert //components/update_client from scoped_ptr to std::unique_ptr
+d0fc6aa9a949b8093d5e836e3d6443e869495c6a
+# Convert //components/content_settings from scoped_ptr to std::unique_ptr
+b94ac84f0dc33dcba4d27424777a14fadbb659ef
+# Convert //components/nacl from scoped_ptr to std::unique_ptr
+24f43a5e9841b7177688291a625a373c3b8ba365
+# Convert //components/prefs from scoped_ptr to std::unique_ptr
+5f043bc0ea7c069e3ef5e6ef903b98f4e84ec4cb
+# Convert //components/user_prefs from scoped_ptr to std::unique_ptr
+b707c5c8bed8656c800f613b46967b916e1a7f44
+# Convert //media/blink from scoped_ptr to std::unique_ptr
+3076abbf53ffb74830a097f1c4f7dd232f246fad
+# Convert //components/data_usage from scoped_ptr to std::unique_ptr
+154b22210617a1f3f58d0a19d8b30ea9409b98e4
+# Convert //extensions/{common,shell} from scoped_ptr to std::unique_ptr
+7c2ca35e78f7ba433da3eef399753148fe30f127
+# Convert //components/offline_pages from scoped_ptr to std::unique_ptr
+e399ff07e13116e446b1ee904c1f6c970eb5bc3b
+# Convert //components/copresence from scoped_ptr to std::unique_ptr
+477cae30f89224646d3135ae03cdf93d4901dd78
+# Convert //components/browser_sync from scoped_ptr to std::unique_ptr
+d4593e75ceb64dbf966fc77530f4bd38cdcb687c
+# Replace scoped_ptr with std::unique_ptr in //components/signin
+fc1ac3074134f30e46543f5d9ca97d5d2a6d0282
+# Convert //components/json_schema from scoped_ptr to std::unique_ptr
+6430b2ca82390ebcecedc6c0dbf54008af8322ca
+# Replace scoped_ptr with std::unique_ptr in //components/syncable_prefs
+4d55af59cf486412be6e5e458417f6a423abd7da
+# Replace scoped_ptr with std::unique_ptr in //components/suggestions.
+501f801f0aa603ae08f213091de67f23476eb40e
+# Convert scoped_ptr to std::unique_ptr in //components/translate.
+396f876cf9e02a21687bb78364c2e3c930287e9e
+# Use std::unique_ptr in components/search_provider_logos.
+ef0ef5d8d5ac805e400ed5826a8b9ca57aececbe
+# Replace scoped_ptr with std::unique_ptr in //components/sync_sessions
+5b9c7ed6b732c9b65c851413d0fa5612edc95b85
+# Convert //third_party from scoped_ptr to std::unique_ptr
+91cdd51340b8f6a0cc13ec9f5199defbea6cd49c
+# Convert //extensions from scoped_ptr to std::unique_ptr
+4a7e93b6b2a43ecf9476695bb9046d59a39629dc
+# Convert //components/guest_view from scoped_ptr to std::unique_ptr
+bb7e2b70c8aace67356a53230d104738ebc92693
+# Convert //components/safe_browsing_db from scoped_ptr to std::unique_ptr
+45f93419065eb07f861fe59e3f969e2b3255b2ed
+# Convert //components/invalidation from scoped_ptr to std::unique_ptr
+b753c6fb8b539a9c5febe08f6b159f01b98ecfa8
+# Convert //media/audio from scoped_ptr to std::unique_ptr
+7089de047f9845b19afd5b671ace13aa1aa3ad42
+# Convert scoped_ptr to std::unique_ptr in //ipc.
+03de39b2f64eb2e9fbe69947be3d10042f30469e
+# Convert //components/[u-z]* from scoped_ptr to std::unique_ptr
+3f767dc3724b2e3f36c17ee760007475de7e63cc
+# Convert //components/[o-t]* from scoped_ptr to std::unique_ptr
+82beb4ff418b0dcb40bd6b860d2e9793a0193118
+# Replace scoped_ptr with std::unique_ptr in //media/base.
+6aaed6a40bc23a872e14f19a39ff2d7998c803d0
+# Convert //components/[a-e]* from scoped_ptr to std::unique_ptr
+a0ee5fb8a4dbf546b8da197a055dd3997f3dc475
+# Replace scoped_ptr with std::unique_ptr in //media.
+4d43bc26cc5d105edb1e976582803ea931e572e1
+# Convert //components/[f-n]* from scoped_ptr to std::unique_ptr
+84c358e7a3b1658bf396d39716fb0fffbb0aa018
diff --git a/.gn b/.gn
index c1b812e..33f130db 100644
--- a/.gn
+++ b/.gn
@@ -32,12 +32,14 @@
   "//chrome/tools/*",
   "//chrome/utility/*",
   "//chromecast/*",
+  "//chromeos/*",
   "//chrome_elf/*",
   "//cloud_print/*",
   "//components/*",
 
   #"//content/*",  # A whole lot of errors.
   "//content/browser/*",
+  "//content/child/*",
   "//content/gpu/*",
   "//content/public/*",
   "//content/renderer/*",
@@ -223,6 +225,7 @@
   "//build/toolchain/mac/BUILD.gn",
   "//build/toolchain/nacl/BUILD.gn",
   "//build/toolchain/win/BUILD.gn",
+  "//build/util/branding.gni",
   "//build/util/version.gni",
   "//chrome/android/BUILD.gn",
   "//chrome/browser/BUILD.gn",
diff --git a/AUTHORS b/AUTHORS
index d3e0c0c..614b2a1 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -346,6 +346,7 @@
 Kirill Bobyrev <kirillbobyrev@gmail.com>
 Kirk Shoop <kirk.shoop@microsoft.com>
 Klemen Forstnerič <klemen.forstneric@gmail.com>
+Konrad Dzwinel <kdzwinel@gmail.com>
 Krishna Chaitanya <krish.botta@samsung.com>
 Kristof Kosztyo <kkosztyo.u-szeged@partner.samsung.com>
 Krzysztof Czech <k.czech@samsung.com>
diff --git a/DEPS b/DEPS
index f48a1923..0cafc0d 100644
--- a/DEPS
+++ b/DEPS
@@ -39,11 +39,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '95167758572eca33008dce3e8bebe2a7656a06c9',
+  'skia_revision': '02125d10d5d021f1f3190ca95a3ef62b43349a64',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '44dbe9590a3d63909ea37d9be23a6db496f62e5a',
+  'v8_revision': '2df1c5bfea48c33f6ffaaf7217d301e03a665a69',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -51,7 +51,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '250062bc7fd3f4229332f2dd6381be6576120505',
+  'angle_revision': 'bbd663a2d36e6135402e25fd9c5840eaacf121eb',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling build tools
   # and whatever else without interference from each other.
@@ -59,7 +59,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '76c53794b6202ec37f6dcace5f2ae86870e953b6',
+  'pdfium_revision': 'fd670fdef8984fd7f8824b17d8fcf52fdec9aacc',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -83,7 +83,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling NaCl
   # and whatever else without interference from each other.
-  'nacl_revision': '38d45c78d6e76f557c841627f9edc521a8b3a2ce',
+  'nacl_revision': '2097adc7a23536730a79f424743c079b55a37c57',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling dEQP
   # and whatever else without interference from each other.
@@ -96,7 +96,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '623cc4a59608f3370e0eaab6070265574cf01848',
+  'catapult_revision': '4b74d7696d006be303f7ea1ea5e88cc85c4ee961',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -114,7 +114,7 @@
 
 deps = {
   'src/breakpad/src':
-   Var('chromium_git') + '/breakpad/breakpad/src.git' + '@' + '06029285343afcbe246d512bd3400ebcbfdebbaa',
+   Var('chromium_git') + '/breakpad/breakpad/src.git' + '@' + 'fce2e7c6d509652fb8a39e17e6577cd35982e145',
 
   'src/buildtools':
    Var('chromium_git') + '/chromium/buildtools.git' + '@' +  Var('buildtools_revision'),
@@ -192,13 +192,13 @@
    Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + '40ac6f0443064be7cd085baf538e70fe2a9afc19',
 
   'src/third_party/libjingle/source/talk':
-    Var('chromium_git') + '/external/webrtc/trunk/talk.git' + '@' + '34c4b322551fc9352218fe1a85125e613175f0e7', # commit position 12556
+    Var('chromium_git') + '/external/webrtc/trunk/talk.git' + '@' + 'ca22ce254a986a0b0878d27c4789dacc2eb418a5', # commit position 12581
 
   'src/third_party/usrsctp/usrsctplib':
     Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + 'c60ec8b35c3fe6027d7a3faae89d1c8d7dd3ce98',
 
   'src/third_party/libsrtp':
-   Var('chromium_git') + '/chromium/deps/libsrtp.git' + '@' + 'ea4ed36c8fbe9ea581140e6672c975e5ed23367d', # from svn revision 295151
+   Var('chromium_git') + '/chromium/deps/libsrtp.git' + '@' + '720780acf8fa41c4a6ad515d0382d62f8f5195eb', # from svn revision 295151
 
   'src/third_party/yasm/source/patched-yasm':
    Var('chromium_git') + '/chromium/deps/yasm/patched-yasm.git' + '@' + '7da28c6c7c6a1387217352ce02b31754deb54d2a',
@@ -216,7 +216,7 @@
    Var('chromium_git') + '/native_client/src/third_party/scons-2.0.1.git' + '@' + '1c1550e17fc26355d08627fbdec13d8291227067',
 
   'src/third_party/webrtc':
-    Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + '0d62df917ff5505612636c1e62f3b9cb491bef59', # commit position 12556
+    Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + 'e866d3e75855a456b9dc8ae4e8d6ebf57768806f', # commit position 12604
 
   'src/third_party/openmax_dl':
     Var('chromium_git') + '/external/webrtc/deps/third_party/openmax.git' + '@' +  Var('openmax_dl_revision'),
@@ -361,9 +361,6 @@
       Var('chromium_git') + '/external/github.com/google/google-toolbox-for-mac.git' + '@' + Var('google_toolbox_for_mac_revision'),
 
 
-    'src/third_party/pdfsqueeze':
-      Var('chromium_git') + '/external/pdfsqueeze.git' + '@' + '5936b871e6a087b7e50d4cbcb122378d8a07499f',
-
     'src/third_party/lighttpd':
      Var('chromium_git') + '/chromium/deps/lighttpd.git' + '@' + Var('lighttpd_revision'),
 
@@ -495,7 +492,7 @@
       Var('chromium_git') + '/external/github.com/kennethreitz/requests.git' + '@' + 'f172b30356d821d180fa4ecfa3e71c7274a32de4',
 
     'src/third_party/custom_tabs_client/src':
-      Var('chromium_git') + '/external/github.com/GoogleChrome/custom-tabs-client.git' + '@' + '8ae46d26e739899d2e35f462beeb20e9c194d0ab',
+      Var('chromium_git') + '/external/github.com/GoogleChrome/custom-tabs-client.git' + '@' + '37c00b1d922f5f6f8460621693896a68f6e0bf7b',
   },
 }
 
@@ -788,7 +785,7 @@
     'action': ['python',
                'src/build/get_syzygy_binaries.py',
                '--output-dir=src/third_party/syzygy/binaries',
-               '--revision=1a6e67fecbd5363c425107b2dee4be8f23dbea35',
+               '--revision=262f5599d08ac50aba65ea96b9ee03cce5a3acb7',
                '--overwrite',
     ],
   },
diff --git a/PRESUBMIT_test_mocks.py b/PRESUBMIT_test_mocks.py
index d9d8f95..109b782c 100644
--- a/PRESUBMIT_test_mocks.py
+++ b/PRESUBMIT_test_mocks.py
@@ -140,3 +140,7 @@
 
   def LocalPaths(self):
     return self._changed_files
+
+  def AffectedFiles(self, include_dirs=False, include_deletes=True,
+                    file_filter=None):
+    return self._changed_files
diff --git a/WATCHLISTS b/WATCHLISTS
index 82ea8945..f0cbd28 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -267,6 +267,13 @@
     'clang_update': {
       'filepath': 'tools/clang/scripts/update.py'
     },
+    'clank_uma_settings': {
+      'filepath': 'chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/UsageAndCrashReportsPreferenceFragment.java|'\
+                  'chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManager.java|'\
+                  'chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java|'\
+                  'chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/CrashDumpUploadPreference.java|'\
+                  'chrome/android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java',
+    },
     'clipboard': {
       'filepath': 'clipboard|dnd|drag|drop',
     },
@@ -1798,5 +1805,6 @@
     'blink_xmlhttprequest': [ 'tyoshino+watch@chromium.org' ],
     'test_runner': [ 'jochen+watch@chromium.org',
                      'mlamouri+watch-test-runner@chromium.org' ],
+    'clank_uma_settings': ['gayane+watch@chromium.org'],
   },
 }
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index 6285ace..404149be 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -353,7 +353,7 @@
     "java/res/values-uk/components_strings.xml",
     "java/res/values-vi/components_strings.xml",
     "java/res/values-zh-rCN/components_strings.xml",
-    "java/res/values-zh-rTW/components_strings.xml",
+    "java/res/values-zh/components_strings.xml",
     "java/res/values/components_strings.xml",
   ]
 }
@@ -734,7 +734,7 @@
     "values-uk/android_webview_strings.xml",
     "values-vi/android_webview_strings.xml",
     "values-zh-rCN/android_webview_strings.xml",
-    "values-zh-rTW/android_webview_strings.xml",
+    "values-zh/android_webview_strings.xml",
     "values/android_webview_strings.xml",
   ]
 }
diff --git a/android_webview/browser/aw_render_thread_context_provider.cc b/android_webview/browser/aw_render_thread_context_provider.cc
index b07e849..f3b1915 100644
--- a/android_webview/browser/aw_render_thread_context_provider.cc
+++ b/android_webview/browser/aw_render_thread_context_provider.cc
@@ -120,11 +120,6 @@
     gr_context_->resetContext(state);
 }
 
-void AwRenderThreadContextProvider::SetupLock() {
-  // This context provider is not used on multiple threads.
-  NOTREACHED();
-}
-
 base::Lock* AwRenderThreadContextProvider::GetLock() {
   // This context provider is not used on multiple threads.
   NOTREACHED();
diff --git a/android_webview/browser/aw_render_thread_context_provider.h b/android_webview/browser/aw_render_thread_context_provider.h
index cca675f..c24add4 100644
--- a/android_webview/browser/aw_render_thread_context_provider.h
+++ b/android_webview/browser/aw_render_thread_context_provider.h
@@ -45,7 +45,6 @@
   gpu::ContextSupport* ContextSupport() override;
   class GrContext* GrContext() override;
   void InvalidateGrContext(uint32_t state) override;
-  void SetupLock() override;
   base::Lock* GetLock() override;
   void DeleteCachedResources() override;
   void SetLostContextCallback(
diff --git a/android_webview/browser/browser_view_renderer.cc b/android_webview/browser/browser_view_renderer.cc
index 058431b2..0921acb 100644
--- a/android_webview/browser/browser_view_renderer.cc
+++ b/android_webview/browser/browser_view_renderer.cc
@@ -309,15 +309,15 @@
   return CanOnDraw() && CompositeSW(canvas);
 }
 
-skia::RefPtr<SkPicture> BrowserViewRenderer::CapturePicture(int width,
-                                                            int height) {
+sk_sp<SkPicture> BrowserViewRenderer::CapturePicture(int width,
+                                                     int height) {
   TRACE_EVENT0("android_webview", "BrowserViewRenderer::CapturePicture");
 
   // Return empty Picture objects for empty SkPictures.
   if (width <= 0 || height <= 0) {
     SkPictureRecorder emptyRecorder;
     emptyRecorder.beginRecording(0, 0);
-    return skia::AdoptRef(emptyRecorder.finishRecordingAsPicture());
+    return emptyRecorder.finishRecordingAsPicture();
   }
 
   SkPictureRecorder recorder;
@@ -332,7 +332,7 @@
     compositor_->DidChangeRootLayerScrollOffset(
         gfx::ScrollOffset(scroll_offset_dip_));
   }
-  return skia::AdoptRef(recorder.finishRecordingAsPicture());
+  return recorder.finishRecordingAsPicture();
 }
 
 void BrowserViewRenderer::EnableOnNewPicture(bool enabled) {
diff --git a/android_webview/browser/browser_view_renderer.h b/android_webview/browser/browser_view_renderer.h
index 92430a2f..5108875 100644
--- a/android_webview/browser/browser_view_renderer.h
+++ b/android_webview/browser/browser_view_renderer.h
@@ -17,7 +17,7 @@
 #include "base/trace_event/trace_event.h"
 #include "content/public/browser/android/synchronous_compositor.h"
 #include "content/public/browser/android/synchronous_compositor_client.h"
-#include "skia/ext/refptr.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size_f.h"
 #include "ui/gfx/geometry/vector2d_f.h"
@@ -70,7 +70,7 @@
   bool OnDrawSoftware(SkCanvas* canvas);
 
   // CapturePicture API methods.
-  skia::RefPtr<SkPicture> CapturePicture(int width, int height);
+  sk_sp<SkPicture> CapturePicture(int width, int height);
   void EnableOnNewPicture(bool enabled);
 
   void ClearView();
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java
index 78bff6b..78d1bdc 100644
--- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java
+++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java
@@ -87,7 +87,6 @@
     private WebStorageAdapter mWebStorage;
     private WebViewDatabaseAdapter mWebViewDatabase;
     private AwDevToolsServer mDevToolsServer;
-    private Context mWrappedAppContext;
 
     private ArrayList<WeakReference<WebViewChromium>> mWebViewsToStart =
             new ArrayList<WeakReference<WebViewChromium>>();
@@ -116,6 +115,11 @@
     @SuppressFBWarnings("DMI_HARDCODED_ABSOLUTE_FILENAME")
     private void initialize(WebViewDelegate webViewDelegate) {
         mWebViewDelegate = webViewDelegate;
+
+        // WebView needs to make sure to always use the wrapped application context.
+        ContextUtils.initApplicationContext(
+                ResourcesContextWrapperFactory.get(mWebViewDelegate.getApplication()));
+
         if (isBuildDebuggable()) {
             // Suppress the StrictMode violation as this codepath is only hit on debugglable builds.
             StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
@@ -127,7 +131,7 @@
 
         ThreadUtils.setWillOverrideUiThread();
         // Load chromium library.
-        AwBrowserProcess.loadLibrary(getWrappedCurrentApplicationContext());
+        AwBrowserProcess.loadLibrary(ContextUtils.getApplicationContext());
 
         final PackageInfo packageInfo = WebViewFactory.getLoadedPackageInfo();
 
@@ -264,7 +268,7 @@
             return;
         }
 
-        Context context = getWrappedCurrentApplicationContext();
+        Context context = ContextUtils.getApplicationContext();
         try {
             LibraryLoader.get(LibraryProcessType.PROCESS_WEBVIEW).ensureInitialized(context);
         } catch (ProcessInitException e) {
@@ -322,14 +326,6 @@
         }
     }
 
-    private Context getWrappedCurrentApplicationContext() {
-        if (mWrappedAppContext == null) {
-            mWrappedAppContext = ResourcesContextWrapperFactory.get(
-                    mWebViewDelegate.getApplication());
-        }
-        return mWrappedAppContext;
-    }
-
     AwBrowserContext getBrowserContext() {
         synchronized (mLock) {
             return getBrowserContextLocked();
@@ -341,7 +337,7 @@
         assert mStarted;
         if (mBrowserContext == null) {
             mBrowserContext =
-                    new AwBrowserContext(mWebViewPrefs, getWrappedCurrentApplicationContext());
+                    new AwBrowserContext(mWebViewPrefs, ContextUtils.getApplicationContext());
         }
         return mBrowserContext;
     }
@@ -451,13 +447,6 @@
     public CookieManager getCookieManager() {
         synchronized (mLock) {
             if (mCookieManager == null) {
-                if (!mStarted) {
-                    // We can use CookieManager without starting Chromium; the native code
-                    // will bring up just the parts it needs to make this work on a temporary
-                    // basis until Chromium is started for real. The temporary cookie manager
-                    // needs the application context to have been set.
-                    ContextUtils.initApplicationContext(getWrappedCurrentApplicationContext());
-                }
                 mCookieManager = new CookieManagerAdapter(new AwCookieManager());
             }
         }
diff --git a/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java b/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java
index fd8040be..8d4a1d9 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java
@@ -9,6 +9,7 @@
 
 import org.chromium.android_webview.policy.AwPolicyProvider;
 import org.chromium.base.CommandLine;
+import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
 import org.chromium.base.PathUtils;
 import org.chromium.base.ThreadUtils;
@@ -41,6 +42,7 @@
      */
     public static void loadLibrary(Context context) {
         PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX, context);
+        ContextUtils.initApplicationContext(context.getApplicationContext());
         try {
             LibraryLoader libraryLoader = LibraryLoader.get(LibraryProcessType.PROCESS_WEBVIEW);
             libraryLoader.loadNow(context);
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index 68f77eba..164f6db 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -976,11 +976,11 @@
 
         boolean contextWrapsActivity = activityFromContext(context) != null;
         if (contextWrapsActivity) {
-            wrapper = new WindowAndroidWrapper(new WindowAndroid(context));
-        } else {
             final boolean listenToActivityState = false;
             wrapper = new WindowAndroidWrapper(
                     new ActivityWindowAndroid(context, listenToActivityState));
+        } else {
+            wrapper = new WindowAndroidWrapper(new WindowAndroid(context));
         }
         sContextWindowMap.put(context, wrapper);
         return wrapper;
diff --git a/android_webview/java/strings/android_webview_strings.grd b/android_webview/java/strings/android_webview_strings.grd
index d4a0bf8..8004416 100644
--- a/android_webview/java/strings/android_webview_strings.grd
+++ b/android_webview/java/strings/android_webview_strings.grd
@@ -44,7 +44,7 @@
     <output filename="values-uk/android_webview_strings.xml" lang="uk" type="android" />
     <output filename="values-vi/android_webview_strings.xml" lang="vi" type="android" />
     <output filename="values-zh-rCN/android_webview_strings.xml" lang="zh-CN" type="android" />
-    <output filename="values-zh-rTW/android_webview_strings.xml" lang="zh-TW" type="android" />
+    <output filename="values-zh/android_webview_strings.xml" lang="zh-TW" type="android" />
   </outputs>
   <translations>
     <file lang="am" path="translations/android_webview_strings_am.xtb" />
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java
index 993e988..9b372ca 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java
@@ -4,14 +4,14 @@
 
 package org.chromium.android_webview.test;
 
+import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
+
 import android.app.Instrumentation;
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.os.Build;
 import android.util.Log;
 
-import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
-
 import org.chromium.android_webview.AwBrowserContext;
 import org.chromium.android_webview.AwBrowserProcess;
 import org.chromium.android_webview.AwContents;
@@ -79,8 +79,8 @@
 
     @Override
     protected void setUp() throws Exception {
-        mBrowserContext = new AwBrowserContext(
-                new InMemorySharedPreferences(), getInstrumentation().getTargetContext());
+        Context appContext = getInstrumentation().getTargetContext().getApplicationContext();
+        mBrowserContext = new AwBrowserContext(new InMemorySharedPreferences(), appContext);
 
         super.setUp();
         if (needsBrowserProcessStarted()) {
@@ -98,8 +98,10 @@
         });
     }
 
-    /* Override this to return false if the test doesn't want the browser startup sequence to
+    /**
+     * Override this to return false if the test doesn't want the browser startup sequence to
      * be run automatically.
+     * @return Whether the instrumentation test requires the browser process to already be started.
      */
     protected boolean needsBrowserProcessStarted() {
         return true;
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java
index 6505102..9cb017f 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java
@@ -14,7 +14,6 @@
 import org.chromium.android_webview.AwWebResourceResponse;
 import org.chromium.android_webview.test.util.CommonResources;
 import org.chromium.android_webview.test.util.CookieUtils;
-import org.chromium.base.ContextUtils;
 import org.chromium.base.test.util.Feature;
 import org.chromium.net.test.util.TestWebServer;
 
@@ -30,7 +29,10 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        ContextUtils.initApplicationContext(getActivity().getApplicationContext());
+        // CookeManager assumes that native is loaded, but webview browser should not be loaded for
+        // these tests as webview is not necessarily loaded when CookieManager is called.
+        AwBrowserProcess.loadLibrary(
+                getInstrumentation().getTargetContext().getApplicationContext());
     }
 
     @Override
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/HttpCacheTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/HttpCacheTest.java
index ebde6683..55083d0 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/HttpCacheTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/HttpCacheTest.java
@@ -10,6 +10,7 @@
 import org.chromium.android_webview.AwBrowserProcess;
 import org.chromium.android_webview.AwContents;
 import org.chromium.android_webview.AwContentsStatics;
+import org.chromium.base.ContextUtils;
 import org.chromium.base.PathUtils;
 import org.chromium.base.test.util.Feature;
 import org.chromium.net.test.util.TestWebServer;
@@ -82,6 +83,7 @@
         assertTrue(dummyCacheFile.exists());
 
         // Set up JNI bindings.
+        ContextUtils.initApplicationContext(targetContext.getApplicationContext());
         AwBrowserProcess.loadLibrary(targetContext);
         // No delay before removing the legacy cache files.
         AwContentsStatics.setLegacyCacheRemovalDelayForTest(0);
diff --git a/android_webview/native/aw_pdf_exporter.h b/android_webview/native/aw_pdf_exporter.h
index af225949..fd67b80 100644
--- a/android_webview/native/aw_pdf_exporter.h
+++ b/android_webview/native/aw_pdf_exporter.h
@@ -10,7 +10,6 @@
 #include "base/android/jni_weak_ref.h"
 #include "base/android/scoped_java_ref.h"
 #include "base/macros.h"
-#include "skia/ext/refptr.h"
 
 namespace content {
 class WebContents;
diff --git a/android_webview/native/aw_picture.cc b/android_webview/native/aw_picture.cc
index bb6e0f5..cbce8daa 100644
--- a/android_webview/native/aw_picture.cc
+++ b/android_webview/native/aw_picture.cc
@@ -11,8 +11,8 @@
 
 namespace android_webview {
 
-AwPicture::AwPicture(skia::RefPtr<SkPicture> picture)
-    : picture_(picture) {
+AwPicture::AwPicture(sk_sp<SkPicture> picture)
+    : picture_(std::move(picture)) {
   DCHECK(picture_);
 }
 
diff --git a/android_webview/native/aw_picture.h b/android_webview/native/aw_picture.h
index 409a255..84a0e65 100644
--- a/android_webview/native/aw_picture.h
+++ b/android_webview/native/aw_picture.h
@@ -13,7 +13,7 @@
 #include "base/android/scoped_java_ref.h"
 #include "base/macros.h"
 #include "content/public/browser/web_contents_observer.h"
-#include "skia/ext/refptr.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
 
 class SkPicture;
 
@@ -21,7 +21,7 @@
 
 class AwPicture {
  public:
-  AwPicture(skia::RefPtr<SkPicture> picture);
+  AwPicture(sk_sp<SkPicture> picture);
   ~AwPicture();
 
   // Methods called from Java.
@@ -33,7 +33,7 @@
             const base::android::JavaParamRef<jobject>& canvas);
 
  private:
-  skia::RefPtr<SkPicture> picture_;
+  sk_sp<SkPicture> picture_;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(AwPicture);
 };
diff --git a/android_webview/native/java_browser_view_renderer_helper.cc b/android_webview/native/java_browser_view_renderer_helper.cc
index 348926d..5875119 100644
--- a/android_webview/native/java_browser_view_renderer_helper.cc
+++ b/android_webview/native/java_browser_view_renderer_helper.cc
@@ -11,6 +11,7 @@
 #include "base/trace_event/trace_event.h"
 #include "jni/JavaBrowserViewRendererHelper_jni.h"
 #include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
 #include "third_party/skia/include/utils/SkCanvasStateUtils.h"
 
 using base::android::ScopedJavaLocalRef;
@@ -34,7 +35,7 @@
 
  private:
   AwPixelInfo* pixels_;
-  skia::RefPtr<SkCanvas> canvas_;
+  sk_sp<SkCanvas> canvas_;
   DISALLOW_COPY_AND_ASSIGN(JavaCanvasHolder);
 };
 
@@ -48,14 +49,14 @@
   if (!pixels_ || !pixels_->state)
     return;
 
-  canvas_ =
-      skia::AdoptRef(SkCanvasStateUtils::CreateFromCanvasState(pixels_->state));
+  canvas_ = sk_sp<SkCanvas>(
+      SkCanvasStateUtils::CreateFromCanvasState(pixels_->state));
   // Workarounds for http://crbug.com/271096: SW draw only supports
   // translate & scale transforms, and a simple rectangular clip.
   if (canvas_ && (!canvas_->isClipRect() ||
                   (canvas_->getTotalMatrix().getType() &
                    ~(SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)))) {
-    canvas_.clear();
+    canvas_.reset();
   }
   if (canvas_) {
     canvas_->translate(scroll.x(), scroll.y());
@@ -63,7 +64,6 @@
 }
 
 JavaCanvasHolder::~JavaCanvasHolder() {
-  canvas_.clear();
   if (pixels_)
     g_sw_draw_functions->release_pixels(pixels_);
   pixels_ = nullptr;
@@ -88,7 +88,7 @@
   ScopedJavaLocalRef<jobject> jbitmap_;
   gfx::Vector2d scroll_;
   std::unique_ptr<SkBitmap> bitmap_;
-  skia::RefPtr<SkCanvas> canvas_;
+  sk_sp<SkCanvas> canvas_;
   DISALLOW_COPY_AND_ASSIGN(AuxiliaryCanvasHolder);
 };
 
@@ -121,11 +121,10 @@
       SkImageInfo::MakeN32Premul(bitmap_info.width, bitmap_info.height);
   bitmap_.reset(new SkBitmap);
   bitmap_->installPixels(info, pixels, bitmap_info.stride);
-  canvas_ = skia::AdoptRef(new SkCanvas(*bitmap_));
+  canvas_ = sk_make_sp<SkCanvas>(*bitmap_);
 }
 
 AuxiliaryCanvasHolder::~AuxiliaryCanvasHolder() {
-  canvas_.clear();
   bitmap_.reset();
 
   JNIEnv* env = base::android::AttachCurrentThread();
diff --git a/android_webview/native/java_browser_view_renderer_helper.h b/android_webview/native/java_browser_view_renderer_helper.h
index ba8b3b4..260bfaf 100644
--- a/android_webview/native/java_browser_view_renderer_helper.h
+++ b/android_webview/native/java_browser_view_renderer_helper.h
@@ -9,7 +9,6 @@
 
 #include <memory>
 
-#include "skia/ext/refptr.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/geometry/vector2d.h"
 
diff --git a/android_webview/renderer/aw_render_view_ext.h b/android_webview/renderer/aw_render_view_ext.h
index 25a264b..5e04585 100644
--- a/android_webview/renderer/aw_render_view_ext.h
+++ b/android_webview/renderer/aw_render_view_ext.h
@@ -7,7 +7,6 @@
 
 #include "base/timer/timer.h"
 #include "content/public/renderer/render_view_observer.h"
-#include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace android_webview {
diff --git a/android_webview/test/shell/src/org/chromium/android_webview/test/AwTestRunnerActivity.java b/android_webview/test/shell/src/org/chromium/android_webview/test/AwTestRunnerActivity.java
index d87b6302..c3d4ccb 100644
--- a/android_webview/test/shell/src/org/chromium/android_webview/test/AwTestRunnerActivity.java
+++ b/android_webview/test/shell/src/org/chromium/android_webview/test/AwTestRunnerActivity.java
@@ -13,6 +13,7 @@
 
 import org.chromium.android_webview.AwBrowserProcess;
 import org.chromium.android_webview.shell.AwShellResourceProvider;
+import org.chromium.base.ContextUtils;
 
 /**
  * This is a lightweight activity for tests that only require WebView functionality.
@@ -28,6 +29,7 @@
         super.onCreate(savedInstanceState);
 
         AwShellResourceProvider.registerResources(this);
+        ContextUtils.initApplicationContext(getApplicationContext());
         AwBrowserProcess.loadLibrary(this);
 
         mLinearLayout = new LinearLayout(this);
diff --git a/android_webview/tools/cts_config/webview_cts_gcs_path.txt b/android_webview/tools/cts_config/webview_cts_gcs_path.txt
index 41fd3b8..f434e69 100644
--- a/android_webview/tools/cts_config/webview_cts_gcs_path.txt
+++ b/android_webview/tools/cts_config/webview_cts_gcs_path.txt
@@ -1 +1 @@
-android-cts-5.1_r5-linux_x86-arm.zip
+android-cts-arm_64-2780604.zip
\ No newline at end of file
diff --git a/ash/accelerators/accelerator_controller_unittest.cc b/ash/accelerators/accelerator_controller_unittest.cc
index 0c359a0..de10c1b 100644
--- a/ash/accelerators/accelerator_controller_unittest.cc
+++ b/ash/accelerators/accelerator_controller_unittest.cc
@@ -24,11 +24,11 @@
 #include "ash/test/test_volume_control_delegate.h"
 #include "ash/volume_control_delegate.h"
 #include "ash/wm/aura/wm_window_aura.h"
+#include "ash/wm/common/panels/panel_layout_manager.h"
 #include "ash/wm/common/window_positioning_utils.h"
 #include "ash/wm/common/window_state.h"
 #include "ash/wm/common/wm_event.h"
 #include "ash/wm/lock_state_controller.h"
-#include "ash/wm/panels/panel_layout_manager.h"
 #include "ash/wm/window_state_aura.h"
 #include "ash/wm/window_util.h"
 #include "base/command_line.h"
diff --git a/ash/app_list/app_list_presenter_delegate.cc b/ash/app_list/app_list_presenter_delegate.cc
index c2692f5..4ffe2da 100644
--- a/ash/app_list/app_list_presenter_delegate.cc
+++ b/ash/app_list/app_list_presenter_delegate.cc
@@ -4,8 +4,8 @@
 
 #include "ash/app_list/app_list_presenter_delegate.h"
 
-#include "ash/app_list/app_list_view_delegate_factory.h"
 #include "ash/ash_switches.h"
+#include "ash/display/window_tree_host_manager.h"
 #include "ash/root_window_controller.h"
 #include "ash/screen_util.h"
 #include "ash/shelf/shelf.h"
@@ -18,6 +18,7 @@
 #include "ui/app_list/app_list_constants.h"
 #include "ui/app_list/app_list_switches.h"
 #include "ui/app_list/presenter/app_list_presenter.h"
+#include "ui/app_list/presenter/app_list_view_delegate_factory.h"
 #include "ui/app_list/views/app_list_view.h"
 #include "ui/aura/window.h"
 #include "ui/events/event.h"
@@ -27,17 +28,11 @@
 namespace ash {
 namespace {
 
-// Offset in pixels to animation away/towards the shelf.
-const int kAnimationOffset = 8;
-
 // The minimal anchor position offset to make sure that the bubble is still on
 // the screen with 8 pixels spacing on the left / right. This constant is a
 // result of minimal bubble arrow sizes and offsets.
 const int kMinimalAnchorPositionOffset = 57;
 
-// The minimal margin (in pixels) around the app list when in centered mode.
-const int kMinimalCenteredAppListMargin = 10;
-
 // Gets arrow location based on shelf alignment.
 views::BubbleBorder::Arrow GetBubbleArrow(aura::Window* window) {
   DCHECK(Shell::HasInstance());
@@ -103,11 +98,6 @@
   return bounds.CenterPoint();
 }
 
-// Gets the minimum height of the rectangle to center the app list in.
-int GetMinimumBoundsHeightForAppList(const app_list::AppListView* app_list) {
-  return app_list->bounds().height() + 2 * kMinimalCenteredAppListMargin;
-}
-
 bool IsFullscreenAppListEnabled() {
 #if defined(OS_CHROMEOS)
   return base::CommandLine::ForCurrentProcess()->HasSwitch(
@@ -125,7 +115,7 @@
 
 AppListPresenterDelegate::AppListPresenterDelegate(
     app_list::AppListPresenter* presenter,
-    AppListViewDelegateFactory* view_delegate_factory)
+    app_list::AppListViewDelegateFactory* view_delegate_factory)
     : presenter_(presenter), view_delegate_factory_(view_delegate_factory) {
   Shell::GetInstance()->AddShellObserver(this);
 }
@@ -147,7 +137,7 @@
 }
 
 void AppListPresenterDelegate::Init(app_list::AppListView* view,
-                                    aura::Window* root_window,
+                                    int64_t display_id,
                                     int current_apps_page) {
   // App list needs to know the new shelf layout in order to calculate its
   // UI layout when AppListView visibility changes.
@@ -155,6 +145,9 @@
       ->GetShelfLayoutManager()
       ->UpdateAutoHideState();
   view_ = view;
+  aura::Window* root_window = Shell::GetInstance()
+                                  ->window_tree_host_manager()
+                                  ->GetRootWindowForDisplayId(display_id);
   aura::Window* container = GetRootWindowController(root_window)
                                 ->GetContainer(kShellWindowId_AppListContainer);
   views::View* applist_button =
@@ -208,9 +201,12 @@
       Shelf::ForWindow(root_window)->GetDragAndDropHostForAppList());
 }
 
-void AppListPresenterDelegate::OnShown(aura::Window* root_window) {
+void AppListPresenterDelegate::OnShown(int64_t display_id) {
   is_visible_ = true;
   // Update applist button status when app list visibility is changed.
+  aura::Window* root_window = Shell::GetInstance()
+                                  ->window_tree_host_manager()
+                                  ->GetRootWindowForDisplayId(display_id);
   Shelf::ForWindow(root_window)->GetAppListButtonView()->SchedulePaint();
 }
 
diff --git a/ash/app_list/app_list_presenter_delegate.h b/ash/app_list/app_list_presenter_delegate.h
index 7645171..9068b5f 100644
--- a/ash/app_list/app_list_presenter_delegate.h
+++ b/ash/app_list/app_list_presenter_delegate.h
@@ -5,6 +5,8 @@
 #ifndef ASH_APP_LIST_APP_LIST_PRESENTER_DELEGATE_H_
 #define ASH_APP_LIST_APP_LIST_PRESENTER_DELEGATE_H_
 
+#include <stdint.h>
+
 #include "ash/ash_export.h"
 #include "ash/shelf/shelf_icon_observer.h"
 #include "ash/shell_observer.h"
@@ -16,11 +18,9 @@
 
 namespace app_list {
 class ApplicationDragAndDropHost;
-class AppListView;
-}
-
-namespace app_list {
 class AppListPresenter;
+class AppListView;
+class AppListViewDelegateFactory;
 }
 
 namespace ui {
@@ -33,8 +33,7 @@
 class AppListPresenterAshTestApi;
 }
 
-class AppListViewDelegateFactory;
-
+// Non-Mus+ash implementation of AppListPresetnerDelegate.
 // Responsible for laying out the app list UI as well as updating the Shelf
 // launch icon as the state of the app list changes. Listens to shell events
 // and touches/mouse clicks outside the app list to auto dismiss the UI or
@@ -46,16 +45,17 @@
       public ShellObserver,
       public ShelfIconObserver {
  public:
-  AppListPresenterDelegate(app_list::AppListPresenter* presenter,
-                           AppListViewDelegateFactory* view_delegate_factory);
+  AppListPresenterDelegate(
+      app_list::AppListPresenter* presenter,
+      app_list::AppListViewDelegateFactory* view_delegate_factory);
   ~AppListPresenterDelegate() override;
 
   // app_list::AppListPresenterDelegate:
   app_list::AppListViewDelegate* GetViewDelegate() override;
   void Init(app_list::AppListView* view,
-            aura::Window* root_window,
+            int64_t display_id,
             int current_apps_page) override;
-  void OnShown(aura::Window* root_window) override;
+  void OnShown(int64_t display_id) override;
   void OnDismissed() override;
   void UpdateBounds() override;
   gfx::Vector2d GetVisibilityAnimationOffset(
@@ -89,9 +89,9 @@
   app_list::AppListPresenter* presenter_;
 
   // Not owned. Pointer is guaranteed to be valid while this object is alive.
-  AppListViewDelegateFactory* view_delegate_factory_;
+  app_list::AppListViewDelegateFactory* view_delegate_factory_;
 
-  // The AppListView this class manages, owned by its widget.
+  // Owned by its widget.
   app_list::AppListView* view_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(AppListPresenterDelegate);
diff --git a/ash/app_list/app_list_presenter_delegate_factory.cc b/ash/app_list/app_list_presenter_delegate_factory.cc
index bf051bdc..e74b84b3 100644
--- a/ash/app_list/app_list_presenter_delegate_factory.cc
+++ b/ash/app_list/app_list_presenter_delegate_factory.cc
@@ -5,13 +5,13 @@
 #include "ash/app_list/app_list_presenter_delegate_factory.h"
 
 #include "ash/app_list/app_list_presenter_delegate.h"
-#include "ash/app_list/app_list_view_delegate_factory.h"
 #include "base/memory/ptr_util.h"
+#include "ui/app_list/presenter/app_list_view_delegate_factory.h"
 
 namespace ash {
 
 AppListPresenterDelegateFactory::AppListPresenterDelegateFactory(
-    std::unique_ptr<AppListViewDelegateFactory> view_delegate_factory)
+    std::unique_ptr<app_list::AppListViewDelegateFactory> view_delegate_factory)
     : view_delegate_factory_(std::move(view_delegate_factory)) {}
 
 AppListPresenterDelegateFactory::~AppListPresenterDelegateFactory() {}
diff --git a/ash/app_list/app_list_presenter_delegate_factory.h b/ash/app_list/app_list_presenter_delegate_factory.h
index f8d4f20..c50f06b 100644
--- a/ash/app_list/app_list_presenter_delegate_factory.h
+++ b/ash/app_list/app_list_presenter_delegate_factory.h
@@ -13,24 +13,23 @@
 
 namespace app_list {
 class AppListPresenter;
+class AppListViewDelegateFactory;
 }
 
 namespace ash {
 
-class AppListViewDelegateFactory;
-
 class ASH_EXPORT AppListPresenterDelegateFactory
     : public app_list::AppListPresenterDelegateFactory {
  public:
   explicit AppListPresenterDelegateFactory(
-      std::unique_ptr<AppListViewDelegateFactory> view_delegate_factory);
+      std::unique_ptr<app_list::AppListViewDelegateFactory>);
   ~AppListPresenterDelegateFactory() override;
 
   std::unique_ptr<app_list::AppListPresenterDelegate> GetDelegate(
       app_list::AppListPresenter* presenter) override;
 
  private:
-  std::unique_ptr<AppListViewDelegateFactory> view_delegate_factory_;
+  std::unique_ptr<app_list::AppListViewDelegateFactory> view_delegate_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(AppListPresenterDelegateFactory);
 };
diff --git a/ash/app_list/app_list_view_delegate_factory.h b/ash/app_list/app_list_view_delegate_factory.h
deleted file mode 100644
index 399e874..0000000
--- a/ash/app_list/app_list_view_delegate_factory.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2016 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 ASH_APP_LIST_APP_LIST_VIEW_DELEGATE_FACTORY_H_
-#define ASH_APP_LIST_APP_LIST_VIEW_DELEGATE_FACTORY_H_
-
-#include "ash/ash_export.h"
-
-namespace app_list {
-class AppListViewDelegate;
-}
-
-namespace ash {
-
-class ASH_EXPORT AppListViewDelegateFactory {
- public:
-  virtual ~AppListViewDelegateFactory() {}
-
-  virtual app_list::AppListViewDelegate* GetDelegate() = 0;
-};
-
-}  // namespace ash
-
-#endif  // ASH_APP_LIST_APP_LIST_VIEW_DELEGATE_FACTORY_H_
diff --git a/ash/ash.gyp b/ash/ash.gyp
index 48c0b2e3..90ee2e5 100644
--- a/ash/ash.gyp
+++ b/ash/ash.gyp
@@ -32,7 +32,6 @@
       'app_list/app_list_presenter_delegate.h',
       'app_list/app_list_presenter_delegate_factory.cc',
       'app_list/app_list_presenter_delegate_factory.h',
-      'app_list/app_list_view_delegate_factory.h',
       'ash_constants.cc',
       'ash_constants.h',
       'ash_export.h',
@@ -551,10 +550,16 @@
       'wm/common/dock/docked_window_layout_manager.cc',
       'wm/common/dock/docked_window_layout_manager.h',
       'wm/common/dock/docked_window_layout_manager_observer.h',
+      'wm/common/dock/docked_window_resizer.cc',
+      'wm/common/dock/docked_window_resizer.h',
       'wm/common/drag_details.cc',
       'wm/common/drag_details.h',
       'wm/common/fullscreen_window_finder.cc',
       'wm/common/fullscreen_window_finder.h',
+      'wm/common/panels/panel_layout_manager.cc',
+      'wm/common/panels/panel_layout_manager.h',
+      'wm/common/panels/panel_window_resizer.cc',
+      'wm/common/panels/panel_window_resizer.h',
       'wm/common/root_window_finder.cc',
       'wm/common/root_window_finder.h',
       'wm/common/shelf/wm_shelf.h',
@@ -602,17 +607,25 @@
       'wm/common/wm_window_observer.h',
       'wm/common/wm_window_property.h',
       'wm/common/wm_window_tracker.h',
+      'wm/common/workspace/magnetism_matcher.cc',
+      'wm/common/workspace/magnetism_matcher.h',
+      'wm/common/workspace/multi_window_resize_controller.cc',
+      'wm/common/workspace/multi_window_resize_controller.h',
+      'wm/common/workspace/phantom_window_controller.cc',
+      'wm/common/workspace/phantom_window_controller.h',
+      'wm/common/workspace/two_step_edge_cycler.cc',
+      'wm/common/workspace/two_step_edge_cycler.h',
       'wm/common/workspace/workspace_layout_manager.cc',
       'wm/common/workspace/workspace_layout_manager.h',
       'wm/common/workspace/workspace_layout_manager_backdrop_delegate.h',
       'wm/common/workspace/workspace_layout_manager_delegate.h',
       'wm/common/workspace/workspace_types.h',
+      'wm/common/workspace/workspace_window_resizer.cc',
+      'wm/common/workspace/workspace_window_resizer.h',
       'wm/cursor_manager_chromeos.cc',
       'wm/cursor_manager_chromeos.h',
       'wm/dim_window.cc',
       'wm/dim_window.h',
-      'wm/dock/docked_window_resizer.cc',
-      'wm/dock/docked_window_resizer.h',
       'wm/drag_window_controller.cc',
       'wm/drag_window_controller.h',
       'wm/drag_window_resizer.cc',
@@ -668,12 +681,8 @@
       'wm/panels/attached_panel_window_targeter.h',
       'wm/panels/panel_frame_view.cc',
       'wm/panels/panel_frame_view.h',
-      'wm/panels/panel_layout_manager.cc',
-      'wm/panels/panel_layout_manager.h',
       'wm/panels/panel_window_event_handler.cc',
       'wm/panels/panel_window_event_handler.h',
-      'wm/panels/panel_window_resizer.cc',
-      'wm/panels/panel_window_resizer.h',
       'wm/power_button_controller.cc',
       'wm/power_button_controller.h',
       'wm/resize_handle_window_targeter.cc',
@@ -719,18 +728,8 @@
       'wm/window_state_aura.h',
       'wm/window_util.cc',
       'wm/window_util.h',
-      'wm/workspace/magnetism_matcher.cc',
-      'wm/workspace/magnetism_matcher.h',
-      'wm/workspace/multi_window_resize_controller.cc',
-      'wm/workspace/multi_window_resize_controller.h',
-      'wm/workspace/phantom_window_controller.cc',
-      'wm/workspace/phantom_window_controller.h',
-      'wm/workspace/two_step_edge_cycler.cc',
-      'wm/workspace/two_step_edge_cycler.h',
       'wm/workspace/workspace_event_handler.cc',
       'wm/workspace/workspace_event_handler.h',
-      'wm/workspace/workspace_window_resizer.cc',
-      'wm/workspace/workspace_window_resizer.h',
       'wm/workspace_controller.cc',
       'wm/workspace_controller.h',
     ],
diff --git a/ash/display/screen_ash.cc b/ash/display/screen_ash.cc
index 0f30c35..71cb7a43 100644
--- a/ash/display/screen_ash.cc
+++ b/ash/display/screen_ash.cc
@@ -38,7 +38,7 @@
 
   // display::Screen overrides:
   gfx::Point GetCursorScreenPoint() override { return gfx::Point(); }
-  gfx::NativeWindow GetWindowUnderCursor() override { return NULL; }
+  bool IsWindowUnderCursor(gfx::NativeWindow window) override { return false; }
   gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override {
     return NULL;
   }
@@ -104,9 +104,9 @@
   return aura::Env::GetInstance()->last_mouse_location();
 }
 
-gfx::NativeWindow ScreenAsh::GetWindowUnderCursor() {
+bool ScreenAsh::IsWindowUnderCursor(gfx::NativeWindow window) {
   return GetWindowAtScreenPoint(
-      display::Screen::GetScreen()->GetCursorScreenPoint());
+             display::Screen::GetScreen()->GetCursorScreenPoint()) == window;
 }
 
 gfx::NativeWindow ScreenAsh::GetWindowAtScreenPoint(const gfx::Point& point) {
diff --git a/ash/display/screen_ash.h b/ash/display/screen_ash.h
index fe951b8f..aac8465 100644
--- a/ash/display/screen_ash.h
+++ b/ash/display/screen_ash.h
@@ -32,7 +32,7 @@
 
   // display::Screen overrides:
   gfx::Point GetCursorScreenPoint() override;
-  gfx::NativeWindow GetWindowUnderCursor() override;
+  bool IsWindowUnderCursor(gfx::NativeWindow window) override;
   gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override;
   int GetNumDisplays() const override;
   std::vector<display::Display> GetAllDisplays() const override;
diff --git a/ash/frame/caption_buttons/frame_size_button.cc b/ash/frame/caption_buttons/frame_size_button.cc
index b462d06..c69bcf16 100644
--- a/ash/frame/caption_buttons/frame_size_button.cc
+++ b/ash/frame/caption_buttons/frame_size_button.cc
@@ -11,9 +11,9 @@
 #include "ash/wm/common/window_positioning_utils.h"
 #include "ash/wm/common/window_state.h"
 #include "ash/wm/common/wm_event.h"
+#include "ash/wm/common/workspace/phantom_window_controller.h"
 #include "ash/wm/window_state_aura.h"
 #include "ash/wm/window_util.h"
-#include "ash/wm/workspace/phantom_window_controller.h"
 #include "base/i18n/rtl.h"
 #include "ui/gfx/geometry/vector2d.h"
 #include "ui/views/widget/widget.h"
diff --git a/ash/mus/BUILD.gn b/ash/mus/BUILD.gn
index 78725f2..c244c23 100644
--- a/ash/mus/BUILD.gn
+++ b/ash/mus/BUILD.gn
@@ -10,6 +10,8 @@
 
 source_set("lib") {
   sources = [
+    "app_list_presenter_mus.cc",
+    "app_list_presenter_mus.h",
     "context_menu_mus.cc",
     "context_menu_mus.h",
     "keyboard_ui_mus.cc",
@@ -45,6 +47,7 @@
     "//services/tracing/public/cpp",
     "//skia/public",
     "//ui/app_list/presenter",
+    "//ui/app_list/presenter:mojom",
     "//ui/aura",
     "//ui/events",
     "//ui/events/devices",
diff --git a/ash/mus/app_list_presenter_mus.cc b/ash/mus/app_list_presenter_mus.cc
new file mode 100644
index 0000000..0fba7797
--- /dev/null
+++ b/ash/mus/app_list_presenter_mus.cc
@@ -0,0 +1,49 @@
+// Copyright 2016 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 "ash/mus/app_list_presenter_mus.h"
+
+#include "services/shell/public/cpp/connector.h"
+
+namespace ash {
+namespace {
+
+// TODO(mfomitchev): Remove when http://crbug.com/607300 is fixed.
+// This method should not exist. Sys_ui has different display ids because it
+// uses ScreenAsh instead of ScreenMus.
+int64_t GetMusDisplayId(int64_t sysui_display_id) {
+  return 1;
+}
+
+}  // namespace
+
+AppListPresenterMus::AppListPresenterMus(::shell::Connector* connector) {
+  connector->ConnectToInterface("exe:chrome", &presenter_);
+}
+
+AppListPresenterMus::~AppListPresenterMus() {}
+
+void AppListPresenterMus::Show(int64_t display_id) {
+  display_id = GetMusDisplayId(display_id);
+  presenter_->Show(display_id);
+}
+
+void AppListPresenterMus::Dismiss() {
+  presenter_->Dismiss();
+}
+
+void AppListPresenterMus::ToggleAppList(int64_t display_id) {
+  display_id = GetMusDisplayId(display_id);
+  presenter_->ToggleAppList(display_id);
+}
+
+bool AppListPresenterMus::GetTargetVisibility() const {
+  // TODO(mfomitchev): we have GetTargetVisibility() in mojom, but this
+  // shouldn't be a synchronous method. We should go through the call sites and
+  // either teach them to use a callback, or perhaps use a visibility observer.
+  //  NOTIMPLEMENTED();
+  return false;
+}
+
+}  // namespace ash
diff --git a/ash/mus/app_list_presenter_mus.h b/ash/mus/app_list_presenter_mus.h
new file mode 100644
index 0000000..e360ad7a
--- /dev/null
+++ b/ash/mus/app_list_presenter_mus.h
@@ -0,0 +1,39 @@
+// Copyright 2016 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 ASH_MUS_APP_LIST_PRESENTER_MUS_H_
+#define ASH_MUS_APP_LIST_PRESENTER_MUS_H_
+
+#include "base/macros.h"
+#include "ui/app_list/presenter/app_list_presenter.h"
+#include "ui/app_list/presenter/app_list_presenter.mojom.h"
+
+namespace shell {
+class Connector;
+}
+
+namespace ash {
+
+// Mus+ash implementation of the AppListPresenter interface for mash, which
+// talks to the mojo app list service in chrome.
+class AppListPresenterMus : public app_list::AppListPresenter {
+ public:
+  explicit AppListPresenterMus(::shell::Connector* connector);
+  ~AppListPresenterMus() override;
+
+  // app_list::AppListPresenter:
+  void Show(int64_t display_id) override;
+  void Dismiss() override;
+  void ToggleAppList(int64_t display_id) override;
+  bool GetTargetVisibility() const override;
+
+ private:
+  app_list::mojom::AppListPresenterPtr presenter_;
+
+  DISALLOW_COPY_AND_ASSIGN(AppListPresenterMus);
+};
+
+}  // namespace ash
+
+#endif  // ASH_MUS_APP_LIST_PRESENTER_MUS_H_
diff --git a/ash/mus/shelf_delegate_mus.cc b/ash/mus/shelf_delegate_mus.cc
index 617edeeb..c1e1ac5 100644
--- a/ash/mus/shelf_delegate_mus.cc
+++ b/ash/mus/shelf_delegate_mus.cc
@@ -42,6 +42,11 @@
       : user_window_controller_(user_window_controller) {}
   ~ShelfItemDelegateMus() override {}
 
+  void SetDelegate(
+      mash::shelf::mojom::ShelfItemDelegateAssociatedPtrInfo delegate) {
+    delegate_.Bind(std::move(delegate));
+  }
+
   bool pinned() const { return pinned_; }
   void set_pinned(bool pinned) { pinned_ = pinned; }
 
@@ -102,6 +107,10 @@
   // ShelfItemDelegate:
   ShelfItemDelegate::PerformedAction ItemSelected(
       const ui::Event& event) override {
+    if (window_id_to_title_.empty()) {
+      delegate_->LaunchItem();
+      return kNewWindowCreated;
+    }
     if (window_id_to_title_.size() == 1) {
       user_window_controller_->FocusUserWindow(
           window_id_to_title_.begin()->first);
@@ -133,6 +142,7 @@
 
   void Close() override { NOTIMPLEMENTED(); }
 
+  mash::shelf::mojom::ShelfItemDelegateAssociatedPtr delegate_;
   bool pinned_ = false;
   std::map<uint32_t, base::string16> window_id_to_title_;
   base::string16 title_;
@@ -277,6 +287,7 @@
   if (app_id_to_shelf_id_.count(app_id)) {
     ShelfID shelf_id = app_id_to_shelf_id_[app_id];
     ShelfItemDelegateMus* item_delegate = GetShelfItemDelegate(shelf_id);
+    item_delegate->SetDelegate(std::move(delegate));
     item_delegate->set_pinned(true);
     return;
   }
@@ -293,6 +304,7 @@
 
   std::unique_ptr<ShelfItemDelegateMus> item_delegate(
       new ShelfItemDelegateMus(user_window_controller_.get()));
+  item_delegate->SetDelegate(std::move(delegate));
   item_delegate->set_pinned(true);
   item_delegate->set_title(item->app_title.To<base::string16>());
   Shell::GetInstance()->shelf_item_delegate_manager()->SetShelfItemDelegate(
@@ -313,6 +325,18 @@
   }
 }
 
+void ShelfDelegateMus::SetItemImage(const mojo::String& app_id,
+                                    skia::mojom::BitmapPtr image) {
+  if (!app_id_to_shelf_id_.count(app_id.To<std::string>()))
+    return;
+  ShelfID shelf_id = app_id_to_shelf_id_[app_id.To<std::string>()];
+  int index = model_->ItemIndexByID(shelf_id);
+  DCHECK_GE(index, 0);
+  ShelfItem item = *model_->ItemByID(shelf_id);
+  item.image = GetShelfIconFromBitmap(image.To<SkBitmap>());
+  model_->Set(index, item);
+}
+
 void ShelfDelegateMus::OnUserWindowObserverAdded(
     mojo::Array<mash::wm::mojom::UserWindowPtr> user_windows) {
   for (size_t i = 0; i < user_windows.size(); ++i)
diff --git a/ash/mus/shelf_delegate_mus.h b/ash/mus/shelf_delegate_mus.h
index 54715ec..5baba1b3 100644
--- a/ash/mus/shelf_delegate_mus.h
+++ b/ash/mus/shelf_delegate_mus.h
@@ -50,6 +50,8 @@
       mash::shelf::mojom::ShelfItemPtr item,
       mash::shelf::mojom::ShelfItemDelegateAssociatedPtrInfo delegate) override;
   void UnpinItem(const mojo::String& app_id) override;
+  void SetItemImage(const mojo::String& app_id,
+                    skia::mojom::BitmapPtr image) override;
 
   // mash::wm::mojom::UserWindowObserver:
   void OnUserWindowObserverAdded(
diff --git a/ash/mus/shell_delegate_mus.cc b/ash/mus/shell_delegate_mus.cc
index d46d6f50..654c9cc 100644
--- a/ash/mus/shell_delegate_mus.cc
+++ b/ash/mus/shell_delegate_mus.cc
@@ -8,6 +8,7 @@
 #include "ash/default_user_wallpaper_delegate.h"
 #include "ash/gpu_support_stub.h"
 #include "ash/media_delegate.h"
+#include "ash/mus/app_list_presenter_mus.h"
 #include "ash/mus/context_menu_mus.h"
 #include "ash/mus/pointer_watcher_delegate_mus.h"
 #include "ash/mus/shelf_delegate_mus.h"
@@ -96,31 +97,11 @@
   DISALLOW_COPY_AND_ASSIGN(MediaDelegateStub);
 };
 
-class AppListPresenterMus : public app_list::AppListPresenter {
- public:
-  AppListPresenterMus() {}
-  ~AppListPresenterMus() override {}
-
-  // app_list::AppListPresenter:
-  void Show(aura::Window* window) override { NOTIMPLEMENTED(); }
-  void Dismiss() override { NOTIMPLEMENTED(); }
-  bool IsVisible() const override {
-    NOTIMPLEMENTED();
-    return false;
-  }
-  bool GetTargetVisibility() const override {
-    NOTIMPLEMENTED();
-    return false;
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(AppListPresenterMus);
-};
-
 }  // namespace
 
-ShellDelegateMus::ShellDelegateMus()
-    : app_list_presenter_(new AppListPresenterMus) {}
+ShellDelegateMus::ShellDelegateMus(
+    std::unique_ptr<AppListPresenterMus> app_list_presenter)
+    : app_list_presenter_(std::move(app_list_presenter)) {}
 
 ShellDelegateMus::~ShellDelegateMus() {}
 
diff --git a/ash/mus/shell_delegate_mus.h b/ash/mus/shell_delegate_mus.h
index b24bb87..4913d98a 100644
--- a/ash/mus/shell_delegate_mus.h
+++ b/ash/mus/shell_delegate_mus.h
@@ -15,11 +15,14 @@
 }
 
 namespace ash {
+
+class AppListPresenterMus;
+
 namespace sysui {
 
 class ShellDelegateMus : public ash::ShellDelegate {
  public:
-  ShellDelegateMus();
+  explicit ShellDelegateMus(std::unique_ptr<AppListPresenterMus>);
   ~ShellDelegateMus() override;
 
   bool IsFirstRunAfterBoot() const override;
diff --git a/ash/mus/sysui_application.cc b/ash/mus/sysui_application.cc
index 985cf0b..3ce4f44 100644
--- a/ash/mus/sysui_application.cc
+++ b/ash/mus/sysui_application.cc
@@ -12,6 +12,7 @@
 #include "ash/desktop_background/desktop_background_controller.h"
 #include "ash/host/ash_window_tree_host_init_params.h"
 #include "ash/host/ash_window_tree_host_platform.h"
+#include "ash/mus/app_list_presenter_mus.h"
 #include "ash/mus/keyboard_ui_mus.h"
 #include "ash/mus/shelf_delegate_mus.h"
 #include "ash/mus/shell_delegate_mus.h"
@@ -206,6 +207,7 @@
     // Uninstall the ScreenMus installed by WindowManagerConnection, so that ash
     // installs and uses the ScreenAsh. This can be removed once ash learns to
     // talk to mus for managing displays.
+    // TODO(mfomitchev): We need to fix this. http://crbug.com/607300
     display::Screen::SetScreenInstance(nullptr);
 
     // Install some hook so that the WindowTreeHostMus created for widgets can
@@ -213,7 +215,10 @@
     native_widget_factory_.reset(new NativeWidgetFactory());
 
     ash::AshWindowTreeHost::SetFactory(base::Bind(&CreateWindowTreeHostMus));
-    ash_delegate_ = new ShellDelegateMus;
+
+    std::unique_ptr<ash::AppListPresenterMus> app_list_presenter =
+        base::WrapUnique(new ash::AppListPresenterMus(connector));
+    ash_delegate_ = new ShellDelegateMus(std::move(app_list_presenter));
 
     InitializeComponents();
 
diff --git a/ash/pointer_watcher_delegate_aura.cc b/ash/pointer_watcher_delegate_aura.cc
index f2050bdd..413ea71 100644
--- a/ash/pointer_watcher_delegate_aura.cc
+++ b/ash/pointer_watcher_delegate_aura.cc
@@ -5,8 +5,11 @@
 #include "ash/pointer_watcher_delegate_aura.h"
 
 #include "ash/shell.h"
+#include "ui/aura/client/screen_position_client.h"
+#include "ui/aura/window.h"
 #include "ui/events/event.h"
 #include "ui/events/event_constants.h"
+#include "ui/gfx/geometry/point.h"
 #include "ui/views/pointer_watcher.h"
 
 namespace ash {
@@ -32,13 +35,22 @@
 void PointerWatcherDelegateAura::OnMouseEvent(ui::MouseEvent* event) {
   if (event->type() == ui::ET_MOUSE_PRESSED)
     FOR_EACH_OBSERVER(views::PointerWatcher, pointer_watchers_,
-                      OnMousePressed(*event));
+                      OnMousePressed(*event, GetLocationInScreen(*event)));
 }
 
 void PointerWatcherDelegateAura::OnTouchEvent(ui::TouchEvent* event) {
   if (event->type() == ui::ET_TOUCH_PRESSED)
     FOR_EACH_OBSERVER(views::PointerWatcher, pointer_watchers_,
-                      OnTouchPressed(*event));
+                      OnTouchPressed(*event, GetLocationInScreen(*event)));
+}
+
+gfx::Point PointerWatcherDelegateAura::GetLocationInScreen(
+    const ui::LocatedEvent& event) const {
+  aura::Window* target = static_cast<aura::Window*>(event.target());
+  gfx::Point location_in_screen = event.location();
+  aura::client::GetScreenPositionClient(target->GetRootWindow())
+      ->ConvertPointToScreen(target, &location_in_screen);
+  return location_in_screen;
 }
 
 }  // namespace ash
diff --git a/ash/pointer_watcher_delegate_aura.h b/ash/pointer_watcher_delegate_aura.h
index b237163..8a7eb66 100644
--- a/ash/pointer_watcher_delegate_aura.h
+++ b/ash/pointer_watcher_delegate_aura.h
@@ -8,6 +8,14 @@
 #include "base/observer_list.h"
 #include "ui/events/event_handler.h"
 
+namespace gfx {
+class Point;
+}
+
+namespace ui {
+class LocatedEvent;
+}
+
 namespace ash {
 
 // Support for PointerWatchers in non-mus ash, implemented with a pre-target
@@ -27,6 +35,8 @@
   void OnTouchEvent(ui::TouchEvent* event) override;
 
  private:
+  gfx::Point GetLocationInScreen(const ui::LocatedEvent& event) const;
+
   // Must be empty on destruction.
   base::ObserverList<views::PointerWatcher, true> pointer_watchers_;
 
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc
index 7febc28..3f1c0055 100644
--- a/ash/root_window_controller.cc
+++ b/ash/root_window_controller.cc
@@ -37,13 +37,13 @@
 #include "ash/wm/common/always_on_top_controller.h"
 #include "ash/wm/common/dock/docked_window_layout_manager.h"
 #include "ash/wm/common/fullscreen_window_finder.h"
+#include "ash/wm/common/panels/panel_layout_manager.h"
 #include "ash/wm/common/switchable_windows.h"
 #include "ash/wm/common/window_state.h"
 #include "ash/wm/common/workspace/workspace_layout_manager.h"
 #include "ash/wm/common/workspace/workspace_layout_manager_delegate.h"
 #include "ash/wm/lock_layout_manager.h"
 #include "ash/wm/panels/attached_panel_window_targeter.h"
-#include "ash/wm/panels/panel_layout_manager.h"
 #include "ash/wm/panels/panel_window_event_handler.h"
 #include "ash/wm/root_window_layout_manager.h"
 #include "ash/wm/stacking_controller.h"
diff --git a/ash/shelf/overflow_bubble.cc b/ash/shelf/overflow_bubble.cc
index 19f460cf..c87f77a0 100644
--- a/ash/shelf/overflow_bubble.cc
+++ b/ash/shelf/overflow_bubble.cc
@@ -10,8 +10,6 @@
 #include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
 #include "ash/system/tray/tray_background_view.h"
-#include "ui/aura/client/screen_position_client.h"
-#include "ui/aura/window_event_dispatcher.h"
 #include "ui/events/event.h"
 #include "ui/views/widget/widget.h"
 
@@ -21,10 +19,12 @@
     : bubble_(NULL),
       anchor_(NULL),
       shelf_view_(NULL) {
+  Shell::GetInstance()->AddPointerWatcher(this);
 }
 
 OverflowBubble::~OverflowBubble() {
   Hide();
+  Shell::GetInstance()->RemovePointerWatcher(this);
 }
 
 void OverflowBubble::Show(views::View* anchor, ShelfView* shelf_view) {
@@ -35,9 +35,6 @@
   shelf_view_ = shelf_view;
   anchor_ = anchor;
 
-  // TODO(jamescook): Change this to a PointerWatcher.
-  Shell::GetInstance()->AddPreTargetHandler(this);
-
   TrayBackgroundView::InitializeBubbleAnimations(bubble_->GetWidget());
   bubble_->GetWidget()->AddObserver(this);
   bubble_->GetWidget()->Show();
@@ -47,7 +44,6 @@
   if (!IsShowing())
     return;
 
-  Shell::GetInstance()->RemovePreTargetHandler(this);
   bubble_->GetWidget()->RemoveObserver(this);
   bubble_->GetWidget()->Close();
   bubble_ = NULL;
@@ -66,26 +62,23 @@
   anchor->SchedulePaint();
 }
 
-void OverflowBubble::ProcessPressedEvent(ui::LocatedEvent* event) {
-  aura::Window* target = static_cast<aura::Window*>(event->target());
-  gfx::Point event_location_in_screen = event->location();
-  aura::client::GetScreenPositionClient(target->GetRootWindow())->
-      ConvertPointToScreen(target, &event_location_in_screen);
-  if (!shelf_view_->IsShowingMenu() &&
+void OverflowBubble::ProcessPressedEvent(
+    const gfx::Point& event_location_in_screen) {
+  if (IsShowing() && !shelf_view_->IsShowingMenu() &&
       !bubble_->GetBoundsInScreen().Contains(event_location_in_screen) &&
       !anchor_->GetBoundsInScreen().Contains(event_location_in_screen)) {
     HideBubbleAndRefreshButton();
   }
 }
 
-void OverflowBubble::OnMouseEvent(ui::MouseEvent* event) {
-  if (event->type() == ui::ET_MOUSE_PRESSED)
-    ProcessPressedEvent(event);
+void OverflowBubble::OnMousePressed(const ui::MouseEvent& event,
+                                    const gfx::Point& location_in_screen) {
+  ProcessPressedEvent(location_in_screen);
 }
 
-void OverflowBubble::OnTouchEvent(ui::TouchEvent* event) {
-  if (event->type() == ui::ET_TOUCH_PRESSED)
-    ProcessPressedEvent(event);
+void OverflowBubble::OnTouchPressed(const ui::TouchEvent& event,
+                                    const gfx::Point& location_in_screen) {
+  ProcessPressedEvent(location_in_screen);
 }
 
 void OverflowBubble::OnWidgetDestroying(views::Widget* widget) {
diff --git a/ash/shelf/overflow_bubble.h b/ash/shelf/overflow_bubble.h
index fc97101d..0a9985a 100644
--- a/ash/shelf/overflow_bubble.h
+++ b/ash/shelf/overflow_bubble.h
@@ -5,9 +5,8 @@
 #ifndef ASH_SHELF_OVERFLOW_BUBBLE_H_
 #define ASH_SHELF_OVERFLOW_BUBBLE_H_
 
-#include "base/compiler_specific.h"
 #include "base/macros.h"
-#include "ui/events/event_handler.h"
+#include "ui/views/pointer_watcher.h"
 #include "ui/views/widget/widget_observer.h"
 
 namespace ui {
@@ -24,7 +23,7 @@
 class ShelfView;
 
 // OverflowBubble displays the overflown launcher items in a bubble.
-class OverflowBubble : public ui::EventHandler,
+class OverflowBubble : public views::PointerWatcher,
                        public views::WidgetObserver {
  public:
   OverflowBubble();
@@ -44,11 +43,13 @@
   OverflowBubbleView* bubble_view() { return bubble_; }
 
  private:
-  void ProcessPressedEvent(ui::LocatedEvent* event);
+  void ProcessPressedEvent(const gfx::Point& event_location_in_screen);
 
-  // Overridden from ui::EventHandler:
-  void OnMouseEvent(ui::MouseEvent* event) override;
-  void OnTouchEvent(ui::TouchEvent* event) override;
+  // views::PointerWatcher:
+  void OnMousePressed(const ui::MouseEvent& event,
+                      const gfx::Point& location_in_screen) override;
+  void OnTouchPressed(const ui::TouchEvent& event,
+                      const gfx::Point& location_in_screen) override;
 
   // Overridden from views::WidgetObserver:
   void OnWidgetDestroying(views::Widget* widget) override;
diff --git a/ash/shell.cc b/ash/shell.cc
index 5218bbc..974fee27 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -165,6 +165,14 @@
 using aura::Window;
 using views::Widget;
 
+// Returns the display id corresponding to window, or |GetTargetDisplayId()|
+// if |window| is null.
+int64_t GetDisplayIdForWindow(aura::Window* window) {
+  if (!window)
+    return Shell::GetTargetDisplayId();
+  return gfx::Screen::GetScreen()->GetDisplayNearestWindow(window).id();
+}
+
 // A Corewm VisibilityController subclass that calls the Ash animation routine
 // so we can pick up our extended animations. See ash/wm/window_animations.h.
 class AshVisibilityController : public ::wm::VisibilityController {
@@ -255,6 +263,13 @@
 }
 
 // static
+int64_t Shell::GetTargetDisplayId() {
+  return gfx::Screen::GetScreen()
+      ->GetDisplayNearestWindow(GetTargetRootWindow())
+      .id();
+}
+
+// static
 aura::Window::Windows Shell::GetAllRootWindows() {
   CHECK(HasInstance());
   return Shell::GetInstance()->window_tree_host_manager()->GetAllRootWindows();
@@ -308,9 +323,7 @@
 
 void Shell::ShowAppList(aura::Window* window) {
   // If the context window is not given, show it on the target root window.
-  if (!window)
-    window = GetTargetRootWindow();
-  delegate_->GetAppListPresenter()->Show(window);
+  delegate_->GetAppListPresenter()->Show(GetDisplayIdForWindow(window));
 }
 
 void Shell::DismissAppList() {
@@ -318,12 +331,9 @@
 }
 
 void Shell::ToggleAppList(aura::Window* window) {
-  if (delegate_->GetAppListPresenter()->IsVisible()) {
-    DismissAppList();
-    return;
-  }
-
-  ShowAppList(window);
+  // If the context window is not given, show it on the target root window.
+  delegate_->GetAppListPresenter()->ToggleAppList(
+      GetDisplayIdForWindow(window));
 }
 
 bool Shell::GetAppListTargetVisibility() const {
diff --git a/ash/shell.h b/ash/shell.h
index 6a5894d..1db72a6 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -221,6 +221,10 @@
   // |wm::GetActiveWindow()->GetRootWindow()|.
   static aura::Window* GetTargetRootWindow();
 
+  // Returns the id of the gfx::Display corresponding to the window returned
+  // by |GetTargetRootWindow()|
+  static int64_t GetTargetDisplayId();
+
   // Returns all root windows.
   static aura::Window::Windows GetAllRootWindows();
 
diff --git a/ash/shell/shell_delegate_impl.cc b/ash/shell/shell_delegate_impl.cc
index 4fece22..47f8c52 100644
--- a/ash/shell/shell_delegate_impl.cc
+++ b/ash/shell/shell_delegate_impl.cc
@@ -6,7 +6,6 @@
 
 #include "ash/accessibility_delegate.h"
 #include "ash/app_list/app_list_presenter_delegate_factory.h"
-#include "ash/app_list/app_list_view_delegate_factory.h"
 #include "ash/default_accessibility_delegate.h"
 #include "ash/default_user_wallpaper_delegate.h"
 #include "ash/gpu_support_stub.h"
@@ -28,6 +27,7 @@
 #include "components/user_manager/user_info_impl.h"
 #include "ui/app_list/app_list_view_delegate.h"
 #include "ui/app_list/presenter/app_list_presenter_impl.h"
+#include "ui/app_list/presenter/app_list_view_delegate_factory.h"
 #include "ui/aura/window.h"
 #include "ui/gfx/image/image.h"
 #include "ui/gfx/image/image_skia.h"
@@ -139,7 +139,8 @@
   DISALLOW_COPY_AND_ASSIGN(SessionStateDelegateImpl);
 };
 
-class AppListViewDelegateFactoryImpl : public ash::AppListViewDelegateFactory {
+class AppListViewDelegateFactoryImpl
+    : public app_list::AppListViewDelegateFactory {
  public:
   AppListViewDelegateFactoryImpl() {}
   ~AppListViewDelegateFactoryImpl() override {}
diff --git a/ash/system/tray/tray_event_filter.cc b/ash/system/tray/tray_event_filter.cc
index dd18b803..8d2368d 100644
--- a/ash/system/tray/tray_event_filter.cc
+++ b/ash/system/tray/tray_event_filter.cc
@@ -39,15 +39,21 @@
     Shell::GetInstance()->RemovePointerWatcher(this);
 }
 
-void TrayEventFilter::OnMousePressed(const ui::MouseEvent& event) {
-  ProcessLocatedEvent(event);
+void TrayEventFilter::OnMousePressed(const ui::MouseEvent& event,
+                                     const gfx::Point& location_in_screen) {
+  ProcessLocatedEvent(event, location_in_screen);
 }
 
-void TrayEventFilter::OnTouchPressed(const ui::TouchEvent& event) {
-  ProcessLocatedEvent(event);
+void TrayEventFilter::OnTouchPressed(const ui::TouchEvent& event,
+                                     const gfx::Point& location_in_screen) {
+  ProcessLocatedEvent(event, location_in_screen);
 }
 
-void TrayEventFilter::ProcessLocatedEvent(const ui::LocatedEvent& event) {
+void TrayEventFilter::ProcessLocatedEvent(
+    const ui::LocatedEvent& event,
+    const gfx::Point& location_in_screen) {
+  // TODO(jamescook): Rewrite this to avoid using event.target() as that will
+  // always be null on mus. http://crbug.com/608570
   if (event.target()) {
     aura::Window* target = static_cast<aura::Window*>(event.target());
     // Don't process events that occurred inside an embedded menu.
@@ -78,19 +84,13 @@
 
     gfx::Rect bounds = bubble_widget->GetWindowBoundsInScreen();
     bounds.Inset(wrapper->bubble_view()->GetBorderInsets());
-    aura::Window* root = bubble_widget->GetNativeView()->GetRootWindow();
-    aura::client::ScreenPositionClient* screen_position_client =
-        aura::client::GetScreenPositionClient(root);
-    gfx::Point screen_point(event.root_location());
-    screen_position_client->ConvertPointToScreen(root, &screen_point);
-
-    if (bounds.Contains(screen_point))
+    if (bounds.Contains(location_in_screen))
       return;
     if (wrapper->tray()) {
       // If the user clicks on the parent tray, don't process the event here,
       // let the tray logic handle the event and determine show/hide behavior.
       bounds = wrapper->tray()->GetBoundsInScreen();
-      if (bounds.Contains(screen_point))
+      if (bounds.Contains(location_in_screen))
         return;
     }
   }
diff --git a/ash/system/tray/tray_event_filter.h b/ash/system/tray/tray_event_filter.h
index 9ab45d4f..c38dd2b2 100644
--- a/ash/system/tray/tray_event_filter.h
+++ b/ash/system/tray/tray_event_filter.h
@@ -10,6 +10,10 @@
 #include "base/macros.h"
 #include "ui/views/pointer_watcher.h"
 
+namespace gfx {
+class Point;
+}
+
 namespace ui {
 class LocatedEvent;
 }
@@ -28,11 +32,14 @@
   void RemoveWrapper(TrayBubbleWrapper* wrapper);
 
   // views::PointerWatcher:
-  void OnMousePressed(const ui::MouseEvent& event) override;
-  void OnTouchPressed(const ui::TouchEvent& event) override;
+  void OnMousePressed(const ui::MouseEvent& event,
+                      const gfx::Point& location_in_screen) override;
+  void OnTouchPressed(const ui::TouchEvent& event,
+                      const gfx::Point& location_in_screen) override;
 
  private:
-  void ProcessLocatedEvent(const ui::LocatedEvent& event);
+  void ProcessLocatedEvent(const ui::LocatedEvent& event,
+                           const gfx::Point& location_in_screen);
 
   std::set<TrayBubbleWrapper*> wrappers_;
 
diff --git a/ash/test/test_shell_delegate.cc b/ash/test/test_shell_delegate.cc
index 94f79a9..76c76c95 100644
--- a/ash/test/test_shell_delegate.cc
+++ b/ash/test/test_shell_delegate.cc
@@ -8,7 +8,6 @@
 
 #include "ash/app_list/app_list_presenter_delegate.h"
 #include "ash/app_list/app_list_presenter_delegate_factory.h"
-#include "ash/app_list/app_list_view_delegate_factory.h"
 #include "ash/default_accessibility_delegate.h"
 #include "ash/gpu_support_stub.h"
 #include "ash/media_delegate.h"
@@ -27,6 +26,7 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "ui/app_list/presenter/app_list_presenter_impl.h"
+#include "ui/app_list/presenter/app_list_view_delegate_factory.h"
 #include "ui/app_list/test/app_list_test_view_delegate.h"
 #include "ui/aura/window.h"
 #include "ui/gfx/image/image.h"
@@ -80,7 +80,8 @@
   DISALLOW_COPY_AND_ASSIGN(MediaDelegateImpl);
 };
 
-class AppListViewDelegateFactoryImpl : public ash::AppListViewDelegateFactory {
+class AppListViewDelegateFactoryImpl
+    : public app_list::AppListViewDelegateFactory {
  public:
   AppListViewDelegateFactoryImpl() {}
   ~AppListViewDelegateFactoryImpl() override {}
diff --git a/ash/wm/aura/wm_root_window_controller_aura.cc b/ash/wm/aura/wm_root_window_controller_aura.cc
index ed6f18c..976a3359 100644
--- a/ash/wm/aura/wm_root_window_controller_aura.cc
+++ b/ash/wm/aura/wm_root_window_controller_aura.cc
@@ -16,6 +16,8 @@
 #include "ash/wm/workspace_controller.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_property.h"
+#include "ui/events/event_targeter.h"
+#include "ui/events/event_utils.h"
 
 DECLARE_WINDOW_PROPERTY_TYPE(ash::wm::WmRootWindowControllerAura*);
 
@@ -101,6 +103,20 @@
       root_window_controller_->GetRootWindow(), shell_container_id);
 }
 
+WmWindow* WmRootWindowControllerAura::FindEventTarget(
+    const gfx::Point& location_in_screen) {
+  gfx::Point location_in_root =
+      GetWindow()->ConvertPointFromScreen(location_in_screen);
+  aura::Window* root = root_window_controller_->GetRootWindow();
+  ui::MouseEvent test_event(ui::ET_MOUSE_MOVED, location_in_root,
+                            location_in_root, ui::EventTimeForNow(),
+                            ui::EF_NONE, ui::EF_NONE);
+  ui::EventTarget* event_handler = static_cast<ui::EventTarget*>(root)
+                                       ->GetEventTargeter()
+                                       ->FindTargetForEvent(root, &test_event);
+  return WmWindowAura::Get(static_cast<aura::Window*>(event_handler));
+}
+
 void WmRootWindowControllerAura::AddObserver(
     WmRootWindowControllerObserver* observer) {
   observers_.AddObserver(observer);
diff --git a/ash/wm/aura/wm_root_window_controller_aura.h b/ash/wm/aura/wm_root_window_controller_aura.h
index 3f0aa942..60378106 100644
--- a/ash/wm/aura/wm_root_window_controller_aura.h
+++ b/ash/wm/aura/wm_root_window_controller_aura.h
@@ -45,6 +45,7 @@
       views::Widget* widget,
       int shell_container_id,
       views::Widget::InitParams* init_params) override;
+  WmWindow* FindEventTarget(const gfx::Point& location_in_screen) override;
   void AddObserver(WmRootWindowControllerObserver* observer) override;
   void RemoveObserver(WmRootWindowControllerObserver* observer) override;
 
diff --git a/ash/wm/aura/wm_window_aura.cc b/ash/wm/aura/wm_window_aura.cc
index 51a9ed1e..2037bddd 100644
--- a/ash/wm/aura/wm_window_aura.cc
+++ b/ash/wm/aura/wm_window_aura.cc
@@ -120,10 +120,6 @@
   return WmGlobalsAura::Get();
 }
 
-void WmWindowAura::SetName(const std::string& name) {
-  window_->SetName(name);
-}
-
 void WmWindowAura::SetShellWindowId(int id) {
   window_->set_id(id);
 }
diff --git a/ash/wm/aura/wm_window_aura.h b/ash/wm/aura/wm_window_aura.h
index b5ad2e7..8855eda 100644
--- a/ash/wm/aura/wm_window_aura.h
+++ b/ash/wm/aura/wm_window_aura.h
@@ -41,7 +41,6 @@
   const WmWindow* GetRootWindow() const override;
   WmRootWindowController* GetRootWindowController() override;
   WmGlobals* GetGlobals() const override;
-  void SetName(const std::string& name) override;
   void SetShellWindowId(int id) override;
   int GetShellWindowId() const override;
   WmWindow* GetChildByShellWindowId(int id) override;
diff --git a/ash/wm/dock/docked_window_resizer.cc b/ash/wm/common/dock/docked_window_resizer.cc
similarity index 94%
rename from ash/wm/dock/docked_window_resizer.cc
rename to ash/wm/common/dock/docked_window_resizer.cc
index bd5c87f..957025d9 100644
--- a/ash/wm/dock/docked_window_resizer.cc
+++ b/ash/wm/common/dock/docked_window_resizer.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 "ash/wm/dock/docked_window_resizer.h"
+#include "ash/wm/common/dock/docked_window_resizer.h"
 
 #include "ash/wm/common/dock/docked_window_layout_manager.h"
 #include "ash/wm/common/window_parenting_utils.h"
@@ -11,7 +11,7 @@
 #include "ash/wm/common/wm_root_window_controller.h"
 #include "ash/wm/common/wm_shell_window_ids.h"
 #include "ash/wm/common/wm_window.h"
-#include "ash/wm/workspace/magnetism_matcher.h"
+#include "ash/wm/common/workspace/magnetism_matcher.h"
 #include "ui/base/hit_test.h"
 #include "ui/base/ui_base_types.h"
 #include "ui/display/screen.h"
@@ -32,13 +32,12 @@
 
 }  // namespace
 
-DockedWindowResizer::~DockedWindowResizer() {
-}
+DockedWindowResizer::~DockedWindowResizer() {}
 
 // static
-DockedWindowResizer*
-DockedWindowResizer::Create(WindowResizer* next_window_resizer,
-                            wm::WindowState* window_state) {
+DockedWindowResizer* DockedWindowResizer::Create(
+    WindowResizer* next_window_resizer,
+    wm::WindowState* window_state) {
   return new DockedWindowResizer(next_window_resizer, window_state);
 }
 
@@ -77,8 +76,9 @@
     if (dock_layout_ != initial_dock_layout_)
       dock_layout_->FinishDragging(
           DOCKED_ACTION_NONE,
-          details().source == aura::client::WINDOW_MOVE_SOURCE_MOUSE ?
-              DOCKED_ACTION_SOURCE_MOUSE : DOCKED_ACTION_SOURCE_TOUCH);
+          details().source == aura::client::WINDOW_MOVE_SOURCE_MOUSE
+              ? DOCKED_ACTION_SOURCE_MOUSE
+              : DOCKED_ACTION_SOURCE_TOUCH);
     is_docked_ = false;
     dock_layout_ = new_dock_layout;
     // The window's initial layout manager already knows that the drag is
@@ -231,12 +231,13 @@
   }
 
   // Check if the window needs to be docked or returned to workspace.
-  DockedAction action = MaybeReparentWindowOnDragCompletion(is_resized,
-                                                            is_attached_panel);
+  DockedAction action =
+      MaybeReparentWindowOnDragCompletion(is_resized, is_attached_panel);
   dock_layout_->FinishDragging(
       move_result == aura::client::MOVE_CANCELED ? DOCKED_ACTION_NONE : action,
-      details().source == aura::client::WINDOW_MOVE_SOURCE_MOUSE ?
-          DOCKED_ACTION_SOURCE_MOUSE : DOCKED_ACTION_SOURCE_TOUCH);
+      details().source == aura::client::WINDOW_MOVE_SOURCE_MOUSE
+          ? DOCKED_ACTION_SOURCE_MOUSE
+          : DOCKED_ACTION_SOURCE_TOUCH);
 
   // If we started the drag in one root window and moved into another root
   // but then canceled the drag we may need to inform the original layout
@@ -244,13 +245,15 @@
   if (initial_dock_layout_ != dock_layout_)
     initial_dock_layout_->FinishDragging(
         DOCKED_ACTION_NONE,
-        details().source == aura::client::WINDOW_MOVE_SOURCE_MOUSE ?
-            DOCKED_ACTION_SOURCE_MOUSE : DOCKED_ACTION_SOURCE_TOUCH);
+        details().source == aura::client::WINDOW_MOVE_SOURCE_MOUSE
+            ? DOCKED_ACTION_SOURCE_MOUSE
+            : DOCKED_ACTION_SOURCE_TOUCH);
   is_docked_ = false;
 }
 
 DockedAction DockedWindowResizer::MaybeReparentWindowOnDragCompletion(
-    bool is_resized, bool is_attached_panel) {
+    bool is_resized,
+    bool is_attached_panel) {
   wm::WmWindow* window = GetTarget();
 
   // Check if the window needs to be docked or returned to workspace.
diff --git a/ash/wm/dock/docked_window_resizer.h b/ash/wm/common/dock/docked_window_resizer.h
similarity index 95%
rename from ash/wm/dock/docked_window_resizer.h
rename to ash/wm/common/dock/docked_window_resizer.h
index 6ca599df..be4bd8e 100644
--- a/ash/wm/dock/docked_window_resizer.h
+++ b/ash/wm/common/dock/docked_window_resizer.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 ASH_WM_DOCK_DOCK_WINDOW_RESIZER_H_
-#define ASH_WM_DOCK_DOCK_WINDOW_RESIZER_H_
+#ifndef ASH_WM_COMMON_DOCK_DOCKED_WINDOW_RESIZER_H_
+#define ASH_WM_COMMON_DOCK_DOCKED_WINDOW_RESIZER_H_
 
 #include <memory>
 
@@ -98,4 +98,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_WM_DOCK_DOCK_WINDOW_RESIZER_H_
+#endif  // ASH_WM_COMMON_DOCK_DOCKED_WINDOW_RESIZER_H_
diff --git a/ash/wm/common/panels/OWNERS b/ash/wm/common/panels/OWNERS
new file mode 100644
index 0000000..aa215c7
--- /dev/null
+++ b/ash/wm/common/panels/OWNERS
@@ -0,0 +1 @@
+stevenjb@chromium.org
diff --git a/ash/wm/panels/panel_layout_manager.cc b/ash/wm/common/panels/panel_layout_manager.cc
similarity index 91%
rename from ash/wm/panels/panel_layout_manager.cc
rename to ash/wm/common/panels/panel_layout_manager.cc
index 181fcdd..826d8b3 100644
--- a/ash/wm/panels/panel_layout_manager.cc
+++ b/ash/wm/common/panels/panel_layout_manager.cc
@@ -2,13 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/wm/panels/panel_layout_manager.h"
+#include "ash/wm/common/panels/panel_layout_manager.h"
 
 #include <algorithm>
 #include <map>
 #include <utility>
 
-#include "ash/shell.h"
 #include "ash/wm/common/shelf/wm_shelf.h"
 #include "ash/wm/common/shelf/wm_shelf_util.h"
 #include "ash/wm/common/window_animation_types.h"
@@ -119,8 +118,8 @@
                   std::vector<VisiblePanelPositionInfo>::iterator last) {
   int num_panels = last - first;
   if (num_panels == 1) {
-    (*first).major_pos = std::max((*first).min_major, std::min(
-        (*first).max_major, (*first).major_pos));
+    (*first).major_pos = std::max(
+        (*first).min_major, std::min((*first).max_major, (*first).major_pos));
   }
   if (num_panels <= 1)
     return;
@@ -132,14 +131,14 @@
     int separation = (*first).major_length / 2 + (*second).major_length / 2 +
                      kPanelIdealSpacing;
     int overlap = (*first).major_pos + separation - (*second).major_pos;
-    (*first).major_pos = std::max((*first).min_major,
-                                  (*first).major_pos - overlap / 2);
-    (*second).major_pos = std::min((*second).max_major,
-                                   (*first).major_pos + separation);
+    (*first).major_pos =
+        std::max((*first).min_major, (*first).major_pos - overlap / 2);
+    (*second).major_pos =
+        std::min((*second).max_major, (*first).major_pos + separation);
     // Recalculate the first panel position in case the second one was
     // constrained on the right.
-    (*first).major_pos = std::max((*first).min_major,
-                                  (*second).major_pos - separation);
+    (*first).major_pos =
+        std::max((*first).min_major, (*second).major_pos - separation);
     return;
   }
 
@@ -148,18 +147,16 @@
   int delta = ((*(last - 1)).max_major - (*first).min_major) / (num_panels - 1);
   int major_pos = (*first).min_major;
   for (std::vector<VisiblePanelPositionInfo>::iterator iter = first;
-      iter != last; ++iter) {
-    (*iter).major_pos = std::max((*iter).min_major,
-                                 std::min((*iter).max_major, major_pos));
+       iter != last; ++iter) {
+    (*iter).major_pos =
+        std::max((*iter).min_major, std::min((*iter).max_major, major_pos));
     major_pos += delta;
   }
 }
 
 bool BoundsAdjacent(const gfx::Rect& bounds1, const gfx::Rect& bounds2) {
-  return bounds1.x() == bounds2.right() ||
-         bounds1.y() == bounds2.bottom() ||
-         bounds1.right() == bounds2.x() ||
-         bounds1.bottom() == bounds2.y();
+  return bounds1.x() == bounds2.right() || bounds1.y() == bounds2.bottom() ||
+         bounds1.right() == bounds2.x() || bounds1.bottom() == bounds2.y();
 }
 
 gfx::Vector2d GetSlideInAnimationOffset(wm::ShelfAlignment alignment) {
@@ -409,12 +406,11 @@
   // Reposition dragged panel in the panel order.
   if (dragged_panel_ == child) {
     PanelList::iterator dragged_panel_iter =
-      std::find(panel_windows_.begin(), panel_windows_.end(), dragged_panel_);
+        std::find(panel_windows_.begin(), panel_windows_.end(), dragged_panel_);
     DCHECK(dragged_panel_iter != panel_windows_.end());
     PanelList::iterator new_position;
     for (new_position = panel_windows_.begin();
-         new_position != panel_windows_.end();
-         ++new_position) {
+         new_position != panel_windows_.end(); ++new_position) {
       const gfx::Rect& bounds = (*new_position).window->GetBounds();
       if (bounds.x() + bounds.width() / 2 <= requested_bounds.x())
         break;
@@ -437,7 +433,7 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-// PanelLayoutManager, ash::ShellObserver implementation:
+// PanelLayoutManager, wm::WmShellObserver implementation:
 
 void PanelLayoutManager::OnOverviewModeEnded() {
   Relayout();
@@ -644,16 +640,16 @@
     gfx::Point icon_origin = icon_bounds.origin();
     VisiblePanelPositionInfo position_info;
     int icon_start = horizontal ? icon_origin.x() : icon_origin.y();
-    int icon_end = icon_start + (horizontal ? icon_bounds.width() :
-                                 icon_bounds.height());
+    int icon_end =
+        icon_start + (horizontal ? icon_bounds.width() : icon_bounds.height());
     position_info.major_length =
         horizontal ? panel->GetBounds().width() : panel->GetBounds().height();
-    position_info.min_major = std::max(
-        panel_start_bounds + position_info.major_length / 2,
-        icon_end - position_info.major_length / 2);
-    position_info.max_major = std::min(
-        icon_start + position_info.major_length / 2,
-        panel_end_bounds - position_info.major_length / 2);
+    position_info.min_major =
+        std::max(panel_start_bounds + position_info.major_length / 2,
+                 icon_end - position_info.major_length / 2);
+    position_info.max_major =
+        std::min(icon_start + position_info.major_length / 2,
+                 panel_end_bounds - position_info.major_length / 2);
     position_info.major_pos = (icon_start + icon_end) / 2;
     position_info.window = panel;
     position_info.slide_in = iter->slide_in;
@@ -670,8 +666,8 @@
   size_t first_overlapping_panel = 0;
   for (size_t i = 1; i < visible_panels.size(); ++i) {
     if (visible_panels[i - 1].major_pos +
-        visible_panels[i - 1].major_length / 2 < visible_panels[i].major_pos -
-        visible_panels[i].major_length / 2) {
+            visible_panels[i - 1].major_length / 2 <
+        visible_panels[i].major_pos - visible_panels[i].major_length / 2) {
       FanOutPanels(visible_panels.begin() + first_overlapping_panel,
                    visible_panels.begin() + i);
       first_overlapping_panel = i;
@@ -756,10 +752,10 @@
   for (PanelList::const_iterator it = panel_windows_.begin();
        it != panel_windows_.end(); ++it) {
     gfx::Rect bounds = it->window->GetBounds();
-    window_ordering.insert(std::make_pair(horizontal ?
-                                              bounds.x() + bounds.width() / 2 :
-                                              bounds.y() + bounds.height() / 2,
-                                          it->window));
+    window_ordering.insert(
+        std::make_pair(horizontal ? bounds.x() + bounds.width() / 2
+                                  : bounds.y() + bounds.height() / 2,
+                       it->window));
   }
 
   wm::WmWindow* previous_panel = nullptr;
@@ -810,18 +806,18 @@
     int slide_distance = horizontal ? slide_vector.x() : slide_vector.y();
     int distance_until_over_panel = 0;
     if (horizontal) {
-      callout_bounds.set_x(
-          icon_bounds.x() + (icon_bounds.width() - callout_bounds.width()) / 2);
-      distance_until_over_panel = std::max(
-          current_bounds.x() - callout_bounds.x(),
-          callout_bounds.right() - current_bounds.right());
+      callout_bounds.set_x(icon_bounds.x() +
+                           (icon_bounds.width() - callout_bounds.width()) / 2);
+      distance_until_over_panel =
+          std::max(current_bounds.x() - callout_bounds.x(),
+                   callout_bounds.right() - current_bounds.right());
     } else {
-      callout_bounds.set_y(
-          icon_bounds.y() + (icon_bounds.height() -
-                             callout_bounds.height()) / 2);
-      distance_until_over_panel = std::max(
-          current_bounds.y() - callout_bounds.y(),
-          callout_bounds.bottom() - current_bounds.bottom());
+      callout_bounds.set_y(icon_bounds.y() +
+                           (icon_bounds.height() - callout_bounds.height()) /
+                               2);
+      distance_until_over_panel =
+          std::max(current_bounds.y() - callout_bounds.y(),
+                   callout_bounds.bottom() - current_bounds.bottom());
     }
     if (shelf_->GetAlignment() == wm::SHELF_ALIGNMENT_LEFT)
       callout_bounds.set_x(bounds.x() - callout_bounds.width());
@@ -844,7 +840,7 @@
         // If the panel is not yet over the callout, then delay fading in
         // the callout until after the panel should be over it.
         int delay = kPanelSlideDurationMilliseconds *
-            distance_until_over_panel / slide_distance;
+                    distance_until_over_panel / slide_distance;
         layer->SetOpacity(0);
         layer->GetAnimator()->StopAnimating();
         layer->GetAnimator()->SchedulePauseForProperties(
@@ -855,8 +851,7 @@
       callout_settings.SetPreemptionStrategy(
           ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS);
       callout_settings.SetTransitionDuration(
-          base::TimeDelta::FromMilliseconds(
-              kCalloutFadeDurationMilliseconds));
+          base::TimeDelta::FromMilliseconds(kCalloutFadeDurationMilliseconds));
       layer->SetOpacity(1);
     }
 
@@ -874,8 +869,7 @@
   gfx::Rect parent_bounds = panel_container_->GetBounds();
   int available_space = parent_bounds.height() - keyboard_bounds.height();
   for (PanelList::iterator iter = panel_windows_.begin();
-       iter != panel_windows_.end();
-       ++iter) {
+       iter != panel_windows_.end(); ++iter) {
     wm::WmWindow* panel = iter->window;
     wm::WindowState* panel_state = panel->GetWindowState();
     if (keyboard_bounds.height() > 0) {
diff --git a/ash/wm/panels/panel_layout_manager.h b/ash/wm/common/panels/panel_layout_manager.h
similarity index 96%
rename from ash/wm/panels/panel_layout_manager.h
rename to ash/wm/common/panels/panel_layout_manager.h
index 2f013aab..a19805a0 100644
--- a/ash/wm/panels/panel_layout_manager.h
+++ b/ash/wm/common/panels/panel_layout_manager.h
@@ -2,15 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ASH_WM_PANELS_PANEL_LAYOUT_MANAGER_H_
-#define ASH_WM_PANELS_PANEL_LAYOUT_MANAGER_H_
+#ifndef ASH_WM_COMMON_PANELS_PANEL_LAYOUT_MANAGER_H_
+#define ASH_WM_COMMON_PANELS_PANEL_LAYOUT_MANAGER_H_
 
 #include <list>
 #include <memory>
 
 #include "ash/ash_export.h"
-#include "ash/shelf/shelf_icon_observer.h"
-#include "ash/shell_observer.h"
 #include "ash/wm/common/shelf/wm_shelf_observer.h"
 #include "ash/wm/common/window_state_observer.h"
 #include "ash/wm/common/wm_activation_observer.h"
@@ -59,7 +57,6 @@
 
 class ASH_EXPORT PanelLayoutManager
     : public wm::WmLayoutManager,
-      public ShelfIconObserver,
       public wm::WindowStateObserver,
       public wm::WmActivationObserver,
       public wm::WmDisplayObserver,
@@ -214,4 +211,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_WM_PANELS_PANEL_LAYOUT_MANAGER_H_
+#endif  // ASH_WM_COMMON_PANELS_PANEL_LAYOUT_MANAGER_H_
diff --git a/ash/wm/panels/panel_window_resizer.cc b/ash/wm/common/panels/panel_window_resizer.cc
similarity index 91%
rename from ash/wm/panels/panel_window_resizer.cc
rename to ash/wm/common/panels/panel_window_resizer.cc
index 2a6ee3c..0cd43f1e 100644
--- a/ash/wm/panels/panel_window_resizer.cc
+++ b/ash/wm/common/panels/panel_window_resizer.cc
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/wm/panels/panel_window_resizer.h"
+#include "ash/wm/common/panels/panel_window_resizer.h"
 
+#include "ash/wm/common/panels/panel_layout_manager.h"
 #include "ash/wm/common/shelf/wm_shelf.h"
 #include "ash/wm/common/window_parenting_utils.h"
 #include "ash/wm/common/window_state.h"
 #include "ash/wm/common/wm_root_window_controller.h"
 #include "ash/wm/common/wm_shell_window_ids.h"
 #include "ash/wm/common/wm_window.h"
-#include "ash/wm/panels/panel_layout_manager.h"
 #include "ui/base/hit_test.h"
 #include "ui/base/ui_base_types.h"
 #include "ui/display/screen.h"
@@ -23,13 +23,12 @@
 
 }  // namespace
 
-PanelWindowResizer::~PanelWindowResizer() {
-}
+PanelWindowResizer::~PanelWindowResizer() {}
 
 // static
-PanelWindowResizer*
-PanelWindowResizer::Create(WindowResizer* next_window_resizer,
-                           wm::WindowState* window_state) {
+PanelWindowResizer* PanelWindowResizer::Create(
+    WindowResizer* next_window_resizer,
+    wm::WindowState* window_state) {
   return new PanelWindowResizer(next_window_resizer, window_state);
 }
 
@@ -122,22 +121,22 @@
     switch (panel_layout_manager->shelf()->GetAlignment()) {
       case wm::SHELF_ALIGNMENT_BOTTOM:
       case wm::SHELF_ALIGNMENT_BOTTOM_LOCKED:
-        if (bounds.bottom() >= (launcher_bounds.y() -
-                                kPanelSnapToLauncherDistance)) {
+        if (bounds.bottom() >=
+            (launcher_bounds.y() - kPanelSnapToLauncherDistance)) {
           should_attach = true;
           offset->set_y(launcher_bounds.y() - bounds.height() - bounds.y());
         }
         break;
       case wm::SHELF_ALIGNMENT_LEFT:
-        if (bounds.x() <= (launcher_bounds.right() +
-                           kPanelSnapToLauncherDistance)) {
+        if (bounds.x() <=
+            (launcher_bounds.right() + kPanelSnapToLauncherDistance)) {
           should_attach = true;
           offset->set_x(launcher_bounds.right() - bounds.x());
         }
         break;
       case wm::SHELF_ALIGNMENT_RIGHT:
-        if (bounds.right() >= (launcher_bounds.x() -
-                               kPanelSnapToLauncherDistance)) {
+        if (bounds.right() >=
+            (launcher_bounds.x() - kPanelSnapToLauncherDistance)) {
           should_attach = true;
           offset->set_x(launcher_bounds.x() - bounds.width() - bounds.x());
         }
diff --git a/ash/wm/panels/panel_window_resizer.h b/ash/wm/common/panels/panel_window_resizer.h
similarity index 94%
rename from ash/wm/panels/panel_window_resizer.h
rename to ash/wm/common/panels/panel_window_resizer.h
index 9a6b167..1afc69c 100644
--- a/ash/wm/panels/panel_window_resizer.h
+++ b/ash/wm/common/panels/panel_window_resizer.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 ASH_WM_PANELS_PANEL_WINDOW_RESIZER_H_
-#define ASH_WM_PANELS_PANEL_WINDOW_RESIZER_H_
+#ifndef ASH_WM_COMMON_PANELS_PANEL_WINDOW_RESIZER_H_
+#define ASH_WM_COMMON_PANELS_PANEL_WINDOW_RESIZER_H_
 
 #include <memory>
 
@@ -84,4 +84,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_WM_PANELS_PANEL_WINDOW_RESIZER_H_
+#endif  // ASH_WM_COMMON_PANELS_PANEL_WINDOW_RESIZER_H_
diff --git a/ash/wm/common/wm_root_window_controller.h b/ash/wm/common/wm_root_window_controller.h
index 4d5e023..3c7aa50 100644
--- a/ash/wm/common/wm_root_window_controller.h
+++ b/ash/wm/common/wm_root_window_controller.h
@@ -11,6 +11,10 @@
 #include "ash/wm/common/workspace/workspace_types.h"
 #include "ui/views/widget/widget.h"
 
+namespace gfx {
+class Point;
+}
+
 namespace ash {
 
 class AlwaysOnTopController;
@@ -49,6 +53,13 @@
       int shell_container_id,
       views::Widget::InitParams* init_params) = 0;
 
+  // Returns the window events will be targeted at for the specified location
+  // (in screen coordinates).
+  //
+  // NOTE: the returned window may not contain the location as resize handles
+  // may extend outside the bounds of the window.
+  virtual WmWindow* FindEventTarget(const gfx::Point& location_in_screen) = 0;
+
   virtual void AddObserver(WmRootWindowControllerObserver* observer) = 0;
   virtual void RemoveObserver(WmRootWindowControllerObserver* observer) = 0;
 };
diff --git a/ash/wm/common/wm_window.h b/ash/wm/common/wm_window.h
index 6d6fadc..cd94434e 100644
--- a/ash/wm/common/wm_window.h
+++ b/ash/wm/common/wm_window.h
@@ -61,9 +61,6 @@
   // TODO(sky): fix constness.
   virtual WmGlobals* GetGlobals() const = 0;
 
-  // Used for debugging.
-  virtual void SetName(const std::string& name) = 0;
-
   // See wm_shell_window_ids.h for list of known ids.
   virtual void SetShellWindowId(int id) = 0;
   virtual int GetShellWindowId() const = 0;
diff --git a/ash/wm/workspace/magnetism_matcher.cc b/ash/wm/common/workspace/magnetism_matcher.cc
similarity index 93%
rename from ash/wm/workspace/magnetism_matcher.cc
rename to ash/wm/common/workspace/magnetism_matcher.cc
index 18e20cbc..e46bc26 100644
--- a/ash/wm/workspace/magnetism_matcher.cc
+++ b/ash/wm/common/workspace/magnetism_matcher.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 "ash/wm/workspace/magnetism_matcher.h"
+#include "ash/wm/common/workspace/magnetism_matcher.h"
 
 #include <algorithm>
 #include <cmath>
@@ -52,13 +52,11 @@
 
 MagnetismEdgeMatcher::MagnetismEdgeMatcher(const gfx::Rect& bounds,
                                            MagnetismEdge edge)
-    : bounds_(bounds),
-      edge_(edge) {
+    : bounds_(bounds), edge_(edge) {
   ranges_.push_back(GetSecondaryRange(bounds_));
 }
 
-MagnetismEdgeMatcher::~MagnetismEdgeMatcher() {
-}
+MagnetismEdgeMatcher::~MagnetismEdgeMatcher() {}
 
 bool MagnetismEdgeMatcher::ShouldAttach(const gfx::Rect& bounds) {
   if (is_edge_obscured())
@@ -94,9 +92,8 @@
     return;
 
   for (size_t i = it - ranges_.begin();
-       i < ranges_.size() && RangesIntersect(ranges_[i], range); ) {
-    if (range.first <= ranges_[i].first &&
-        range.second >= ranges_[i].second) {
+       i < ranges_.size() && RangesIntersect(ranges_[i], range);) {
+    if (range.first <= ranges_[i].first && range.second >= ranges_[i].second) {
       ranges_.erase(ranges_.begin() + i);
     } else if (range.first < ranges_[i].first) {
       DCHECK_GT(range.second, ranges_[i].first);
@@ -127,15 +124,14 @@
   if (edges & MAGNETISM_EDGE_LEFT)
     matchers_.push_back(new MagnetismEdgeMatcher(bounds, MAGNETISM_EDGE_LEFT));
   if (edges & MAGNETISM_EDGE_BOTTOM) {
-    matchers_.push_back(new MagnetismEdgeMatcher(bounds,
-                                                 MAGNETISM_EDGE_BOTTOM));
+    matchers_.push_back(
+        new MagnetismEdgeMatcher(bounds, MAGNETISM_EDGE_BOTTOM));
   }
   if (edges & MAGNETISM_EDGE_RIGHT)
     matchers_.push_back(new MagnetismEdgeMatcher(bounds, MAGNETISM_EDGE_RIGHT));
 }
 
-MagnetismMatcher::~MagnetismMatcher() {
-}
+MagnetismMatcher::~MagnetismMatcher() {}
 
 bool MagnetismMatcher::ShouldAttach(const gfx::Rect& bounds,
                                     MatchedEdge* edge) {
diff --git a/ash/wm/workspace/magnetism_matcher.h b/ash/wm/common/workspace/magnetism_matcher.h
similarity index 94%
rename from ash/wm/workspace/magnetism_matcher.h
rename to ash/wm/common/workspace/magnetism_matcher.h
index b694eaa..5ec3eb9 100644
--- a/ash/wm/workspace/magnetism_matcher.h
+++ b/ash/wm/common/workspace/magnetism_matcher.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 ASH_WM_WORKSPACE_MAGNETISM_MATCHER_H_
-#define ASH_WM_WORKSPACE_MAGNETISM_MATCHER_H_
+#ifndef ASH_WM_COMMON_WORKSPACE_MAGNETISM_MATCHER_H_
+#define ASH_WM_COMMON_WORKSPACE_MAGNETISM_MATCHER_H_
 
 #include <stdint.h>
 
@@ -20,10 +20,10 @@
 namespace ash {
 
 enum MagnetismEdge {
-  MAGNETISM_EDGE_TOP    = 1 << 0,
-  MAGNETISM_EDGE_LEFT   = 1 << 1,
+  MAGNETISM_EDGE_TOP = 1 << 0,
+  MAGNETISM_EDGE_LEFT = 1 << 1,
   MAGNETISM_EDGE_BOTTOM = 1 << 2,
-  MAGNETISM_EDGE_RIGHT  = 1 << 3,
+  MAGNETISM_EDGE_RIGHT = 1 << 3,
 };
 
 const uint32_t kAllMagnetismEdges = MAGNETISM_EDGE_TOP | MAGNETISM_EDGE_LEFT |
@@ -51,7 +51,7 @@
   bool ShouldAttach(const gfx::Rect& bounds);
 
  private:
-  typedef std::pair<int,int> Range;
+  typedef std::pair<int, int> Range;
   typedef std::vector<Range> Ranges;
 
   // Removes |range| from |ranges_|.
@@ -189,4 +189,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_WM_WORKSPACE_MAGNETISM_MATCHER_H_
+#endif  // ASH_WM_COMMON_WORKSPACE_MAGNETISM_MATCHER_H_
diff --git a/ash/wm/workspace/multi_window_resize_controller.cc b/ash/wm/common/workspace/multi_window_resize_controller.cc
similarity index 62%
rename from ash/wm/workspace/multi_window_resize_controller.cc
rename to ash/wm/common/workspace/multi_window_resize_controller.cc
index 972aa12..f15c2ca 100644
--- a/ash/wm/workspace/multi_window_resize_controller.cc
+++ b/ash/wm/common/workspace/multi_window_resize_controller.cc
@@ -2,35 +2,23 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/wm/workspace/multi_window_resize_controller.h"
+#include "ash/wm/common/workspace/multi_window_resize_controller.h"
 
-#include "ash/screen_util.h"
-#include "ash/shell.h"
-#include "ash/shell_window_ids.h"
-#include "ash/wm/aura/wm_window_aura.h"
-#include "ash/wm/window_animations.h"
-#include "ash/wm/window_state_aura.h"
-#include "ash/wm/workspace/workspace_event_handler.h"
-#include "ash/wm/workspace/workspace_window_resizer.h"
+#include "ash/wm/common/wm_root_window_controller.h"
+#include "ash/wm/common/wm_shell_window_ids.h"
+#include "ash/wm/common/wm_window.h"
+#include "ash/wm/common/workspace/workspace_window_resizer.h"
 #include "grit/ash_resources.h"
-#include "ui/aura/client/screen_position_client.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_delegate.h"
-#include "ui/aura/window_event_dispatcher.h"
+#include "ui/base/cursor/cursor.h"
 #include "ui/base/hit_test.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/display/screen.h"
-#include "ui/events/event_targeter.h"
-#include "ui/events/event_utils.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/image/image.h"
 #include "ui/views/view.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_delegate.h"
 #include "ui/wm/core/compound_event_filter.h"
-#include "ui/wm/core/coordinate_conversion.h"
-
-using aura::Window;
 
 namespace ash {
 namespace {
@@ -44,23 +32,23 @@
 // Padding from the bottom/right edge the resize widget is shown at.
 const int kResizeWidgetPadding = 15;
 
-bool ContainsX(Window* window, int x) {
-  return x >= 0 && x <= window->bounds().width();
+bool ContainsX(wm::WmWindow* window, int x) {
+  return x >= 0 && x <= window->GetBounds().width();
 }
 
-bool ContainsScreenX(Window* window, int x_in_screen) {
-  gfx::Point window_loc(x_in_screen, 0);
-  ::wm::ConvertPointFromScreen(window, &window_loc);
+bool ContainsScreenX(wm::WmWindow* window, int x_in_screen) {
+  gfx::Point window_loc =
+      window->ConvertPointFromScreen(gfx::Point(x_in_screen, 0));
   return ContainsX(window, window_loc.x());
 }
 
-bool ContainsY(Window* window, int y) {
-  return y >= 0 && y <= window->bounds().height();
+bool ContainsY(wm::WmWindow* window, int y) {
+  return y >= 0 && y <= window->GetBounds().height();
 }
 
-bool ContainsScreenY(Window* window, int y_in_screen) {
-  gfx::Point window_loc(0, y_in_screen);
-  ::wm::ConvertPointFromScreen(window, &window_loc);
+bool ContainsScreenY(wm::WmWindow* window, int y_in_screen) {
+  gfx::Point window_loc =
+      window->ConvertPointFromScreen(gfx::Point(0, y_in_screen));
   return ContainsY(window, window_loc.y());
 }
 
@@ -76,13 +64,10 @@
  public:
   explicit ResizeView(MultiWindowResizeController* controller,
                       Direction direction)
-      : controller_(controller),
-        direction_(direction),
-        image_(NULL) {
+      : controller_(controller), direction_(direction), image_(NULL) {
     ResourceBundle& rb = ResourceBundle::GetSharedInstance();
-    int image_id =
-        direction == TOP_BOTTOM ? IDR_AURA_MULTI_WINDOW_RESIZE_H :
-                                  IDR_AURA_MULTI_WINDOW_RESIZE_V;
+    int image_id = direction == TOP_BOTTOM ? IDR_AURA_MULTI_WINDOW_RESIZE_H
+                                           : IDR_AURA_MULTI_WINDOW_RESIZE_V;
     image_ = rb.GetImageNamed(image_id).ToImageSkia();
   }
 
@@ -111,8 +96,7 @@
   void OnMouseCaptureLost() override { controller_->CancelResize(); }
   gfx::NativeCursor GetCursor(const ui::MouseEvent& event) override {
     int component = (direction_ == LEFT_RIGHT) ? HTRIGHT : HTBOTTOM;
-    return ::wm::CompoundEventFilter::CursorForWindowComponent(
-        component);
+    return ::wm::CompoundEventFilter::CursorForWindowComponent(component);
   }
 
  private:
@@ -125,17 +109,16 @@
 
 // MouseWatcherHost implementation for MultiWindowResizeController. Forwards
 // Contains() to MultiWindowResizeController.
-class MultiWindowResizeController::ResizeMouseWatcherHost :
-   public views::MouseWatcherHost {
+class MultiWindowResizeController::ResizeMouseWatcherHost
+    : public views::MouseWatcherHost {
  public:
   ResizeMouseWatcherHost(MultiWindowResizeController* host) : host_(host) {}
 
   // MouseWatcherHost overrides:
   bool Contains(const gfx::Point& point_in_screen,
                 MouseEventType type) override {
-    return (type == MOUSE_PRESS)
-        ? host_->IsOverResizeWidget(point_in_screen)
-        : host_->IsOverWindows(point_in_screen);
+    return (type == MOUSE_PRESS) ? host_->IsOverResizeWidget(point_in_screen)
+                                 : host_->IsOverWindows(point_in_screen);
   }
 
  private:
@@ -145,33 +128,27 @@
 };
 
 MultiWindowResizeController::ResizeWindows::ResizeWindows()
-    : window1(NULL),
-      window2(NULL),
-      direction(TOP_BOTTOM){
-}
+    : window1(nullptr), window2(nullptr), direction(TOP_BOTTOM) {}
 
 MultiWindowResizeController::ResizeWindows::ResizeWindows(
     const ResizeWindows& other) = default;
 
-MultiWindowResizeController::ResizeWindows::~ResizeWindows() {
-}
+MultiWindowResizeController::ResizeWindows::~ResizeWindows() {}
 
 bool MultiWindowResizeController::ResizeWindows::Equals(
     const ResizeWindows& other) const {
-  return window1 == other.window1 &&
-      window2 == other.window2 &&
-      direction == other.direction;
+  return window1 == other.window1 && window2 == other.window2 &&
+         direction == other.direction;
 }
 
-MultiWindowResizeController::MultiWindowResizeController() {
-}
+MultiWindowResizeController::MultiWindowResizeController() {}
 
 MultiWindowResizeController::~MultiWindowResizeController() {
   window_resizer_.reset();
   Hide();
 }
 
-void MultiWindowResizeController::Show(Window* window,
+void MultiWindowResizeController::Show(wm::WmWindow* window,
                                        int component,
                                        const gfx::Point& point_in_window) {
   // When the resize widget is showing we ignore Show() requests. Instead we
@@ -194,12 +171,11 @@
   windows_ = windows;
   windows_.window1->AddObserver(this);
   windows_.window2->AddObserver(this);
-  show_location_in_parent_ = point_in_window;
-  Window::ConvertPointToTarget(
-      window, window->parent(), &show_location_in_parent_);
-  show_timer_.Start(
-      FROM_HERE, base::TimeDelta::FromMilliseconds(kShowDelayMS),
-      this, &MultiWindowResizeController::ShowIfValidMouseLocation);
+  show_location_in_parent_ =
+      window->ConvertPointToTarget(window->GetParent(), point_in_window);
+  show_timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(kShowDelayMS),
+                    this,
+                    &MultiWindowResizeController::ShowIfValidMouseLocation);
 }
 
 void MultiWindowResizeController::Hide() {
@@ -231,8 +207,7 @@
   Hide();
 }
 
-void MultiWindowResizeController::OnWindowDestroying(
-    aura::Window* window) {
+void MultiWindowResizeController::OnWindowDestroying(wm::WmWindow* window) {
   // Have to explicitly reset the WindowResizer, otherwise Hide() does nothing.
   window_resizer_.reset();
   Hide();
@@ -240,55 +215,53 @@
 
 MultiWindowResizeController::ResizeWindows
 MultiWindowResizeController::DetermineWindowsFromScreenPoint(
-    aura::Window* window) const {
+    wm::WmWindow* window) const {
   gfx::Point mouse_location(
       display::Screen::GetScreen()->GetCursorScreenPoint());
-  ::wm::ConvertPointFromScreen(window, &mouse_location);
-  const int component =
-      window->delegate()->GetNonClientComponent(mouse_location);
+  mouse_location = window->ConvertPointFromScreen(mouse_location);
+  const int component = window->GetNonClientComponent(mouse_location);
   return DetermineWindows(window, component, mouse_location);
 }
 
 void MultiWindowResizeController::CreateMouseWatcher() {
-  mouse_watcher_.reset(new views::MouseWatcher(
-      new ResizeMouseWatcherHost(this), this));
+  mouse_watcher_.reset(
+      new views::MouseWatcher(new ResizeMouseWatcherHost(this), this));
   mouse_watcher_->set_notify_on_exit_time(
       base::TimeDelta::FromMilliseconds(kHideDelayMS));
   mouse_watcher_->Start();
 }
 
 MultiWindowResizeController::ResizeWindows
-MultiWindowResizeController::DetermineWindows(
-    Window* window,
-    int window_component,
-    const gfx::Point& point) const {
+MultiWindowResizeController::DetermineWindows(wm::WmWindow* window,
+                                              int window_component,
+                                              const gfx::Point& point) const {
   ResizeWindows result;
-  gfx::Point point_in_parent(point);
-  Window::ConvertPointToTarget(window, window->parent(), &point_in_parent);
+  gfx::Point point_in_parent =
+      window->ConvertPointToTarget(window->GetParent(), point);
   switch (window_component) {
     case HTRIGHT:
       result.direction = LEFT_RIGHT;
       result.window1 = window;
       result.window2 = FindWindowByEdge(
-          window, HTLEFT, window->bounds().right(), point_in_parent.y());
+          window, HTLEFT, window->GetBounds().right(), point_in_parent.y());
       break;
     case HTLEFT:
       result.direction = LEFT_RIGHT;
       result.window1 = FindWindowByEdge(
-          window, HTRIGHT, window->bounds().x(), point_in_parent.y());
+          window, HTRIGHT, window->GetBounds().x(), point_in_parent.y());
       result.window2 = window;
       break;
     case HTTOP:
       result.direction = TOP_BOTTOM;
-      result.window1 = FindWindowByEdge(
-          window, HTBOTTOM, point_in_parent.x(), window->bounds().y());
+      result.window1 = FindWindowByEdge(window, HTBOTTOM, point_in_parent.x(),
+                                        window->GetBounds().y());
       result.window2 = window;
       break;
     case HTBOTTOM:
       result.direction = TOP_BOTTOM;
       result.window1 = window;
-      result.window2 = FindWindowByEdge(
-          window, HTTOP, point_in_parent.x(), window->bounds().bottom());
+      result.window2 = FindWindowByEdge(window, HTTOP, point_in_parent.x(),
+                                        window->GetBounds().bottom());
       break;
     default:
       break;
@@ -296,33 +269,31 @@
   return result;
 }
 
-Window* MultiWindowResizeController::FindWindowByEdge(
-    Window* window_to_ignore,
+wm::WmWindow* MultiWindowResizeController::FindWindowByEdge(
+    wm::WmWindow* window_to_ignore,
     int edge_want,
     int x_in_parent,
     int y_in_parent) const {
-  Window* parent = window_to_ignore->parent();
-  const Window::Windows& windows(parent->children());
-  for (Window::Windows::const_reverse_iterator i = windows.rbegin();
-       i != windows.rend(); ++i) {
-    Window* window = *i;
+  wm::WmWindow* parent = window_to_ignore->GetParent();
+  std::vector<wm::WmWindow*> windows = parent->GetChildren();
+  for (auto i = windows.rbegin(); i != windows.rend(); ++i) {
+    wm::WmWindow* window = *i;
     if (window == window_to_ignore || !window->IsVisible())
       continue;
 
-    // Ignore windows without a delegate. A delegate is necessary to query the
-    // non-client component.
-    if (!window->delegate())
+    // Ignore windows without a non-client area.
+    if (!window->HasNonClientArea())
       continue;
 
-    gfx::Point p(x_in_parent, y_in_parent);
-    aura::Window::ConvertPointToTarget(parent, window, &p);
+    gfx::Point p = parent->ConvertPointToTarget(
+        window, gfx::Point(x_in_parent, y_in_parent));
     switch (edge_want) {
       case HTLEFT:
         if (ContainsY(window, p.y()) && p.x() == 0)
           return window;
         break;
       case HTRIGHT:
-        if (ContainsY(window, p.y()) && p.x() == window->bounds().width())
+        if (ContainsY(window, p.y()) && p.x() == window->GetBounds().width())
           return window;
         break;
       case HTTOP:
@@ -330,7 +301,7 @@
           return window;
         break;
       case HTBOTTOM:
-        if (ContainsX(window, p.x()) && p.y() == window->bounds().height())
+        if (ContainsX(window, p.x()) && p.y() == window->GetBounds().height())
           return window;
         break;
       default:
@@ -338,36 +309,35 @@
     }
     // Window doesn't contain the edge, but if window contains |point|
     // it's obscuring any other window that could be at the location.
-    if (window->bounds().Contains(x_in_parent, y_in_parent))
+    if (window->GetBounds().Contains(x_in_parent, y_in_parent))
       return NULL;
   }
   return NULL;
 }
 
-aura::Window* MultiWindowResizeController::FindWindowTouching(
-    aura::Window* window,
+wm::WmWindow* MultiWindowResizeController::FindWindowTouching(
+    wm::WmWindow* window,
     Direction direction) const {
-  int right = window->bounds().right();
-  int bottom = window->bounds().bottom();
-  Window* parent = window->parent();
-  const Window::Windows& windows(parent->children());
-  for (Window::Windows::const_reverse_iterator i = windows.rbegin();
-       i != windows.rend(); ++i) {
-    Window* other = *i;
+  int right = window->GetBounds().right();
+  int bottom = window->GetBounds().bottom();
+  wm::WmWindow* parent = window->GetParent();
+  std::vector<wm::WmWindow*> windows = parent->GetChildren();
+  for (auto i = windows.rbegin(); i != windows.rend(); ++i) {
+    wm::WmWindow* other = *i;
     if (other == window || !other->IsVisible())
       continue;
     switch (direction) {
       case TOP_BOTTOM:
-        if (other->bounds().y() == bottom &&
-            Intersects(other->bounds().x(), other->bounds().right(),
-                       window->bounds().x(), window->bounds().right())) {
+        if (other->GetBounds().y() == bottom &&
+            Intersects(other->GetBounds().x(), other->GetBounds().right(),
+                       window->GetBounds().x(), window->GetBounds().right())) {
           return other;
         }
         break;
       case LEFT_RIGHT:
-        if (other->bounds().x() == right &&
-            Intersects(other->bounds().y(), other->bounds().bottom(),
-                       window->bounds().y(), window->bounds().bottom())) {
+        if (other->GetBounds().x() == right &&
+            Intersects(other->GetBounds().y(), other->GetBounds().bottom(),
+                       window->GetBounds().y(), window->GetBounds().bottom())) {
           return other;
         }
         break;
@@ -379,9 +349,9 @@
 }
 
 void MultiWindowResizeController::FindWindowsTouching(
-    aura::Window* start,
+    wm::WmWindow* start,
     Direction direction,
-    std::vector<aura::Window*>* others) const {
+    std::vector<wm::WmWindow*>* others) const {
   while (start) {
     start = FindWindowTouching(start, direction);
     if (start)
@@ -404,20 +374,19 @@
   show_timer_.Stop();
   resize_widget_.reset(new views::Widget);
   views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
+  params.name = "MultiWindowResizeController";
   params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
   params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  params.parent = Shell::GetContainer(Shell::GetTargetRootWindow(),
-                                      kShellWindowId_AlwaysOnTopContainer);
+  windows_.window1->GetRootWindowController()
+      ->ConfigureWidgetInitParamsForContainer(
+          resize_widget_.get(), kShellWindowId_AlwaysOnTopContainer, &params);
   ResizeView* view = new ResizeView(this, windows_.direction);
   resize_widget_->set_focus_on_creation(false);
   resize_widget_->Init(params);
-  ::wm::SetWindowVisibilityAnimationType(
-      resize_widget_->GetNativeWindow(),
-      ::wm::WINDOW_VISIBILITY_ANIMATION_TYPE_FADE);
-  resize_widget_->GetNativeWindow()->SetName("MultiWindowResizeController");
+  wm::WmWindow::Get(resize_widget_.get())
+      ->SetVisibilityAnimationType(::wm::WINDOW_VISIBILITY_ANIMATION_TYPE_FADE);
   resize_widget_->SetContentsView(view);
-  show_bounds_in_screen_ = ScreenUtil::ConvertRectToScreen(
-      windows_.window1->parent(),
+  show_bounds_in_screen_ = windows_.window1->GetParent()->ConvertRectToScreen(
       CalculateResizeWidgetBounds(show_location_in_parent_));
   resize_widget_->SetBounds(show_bounds_in_screen_);
   resize_widget_->Show();
@@ -432,10 +401,9 @@
     const gfx::Point& location_in_screen) {
   DCHECK(!window_resizer_.get());
   DCHECK(windows_.is_valid());
-  gfx::Point location_in_parent(location_in_screen);
-  aura::client::GetScreenPositionClient(windows_.window2->GetRootWindow())->
-      ConvertPointFromScreen(windows_.window2->parent(), &location_in_parent);
-  std::vector<aura::Window*> windows;
+  gfx::Point location_in_parent =
+      windows_.window2->GetParent()->ConvertPointFromScreen(location_in_screen);
+  std::vector<wm::WmWindow*> windows;
   windows.push_back(windows_.window2);
   DCHECK(windows_.other_windows.empty());
   FindWindowsTouching(windows_.window2, windows_.direction,
@@ -445,11 +413,10 @@
     windows.push_back(windows_.other_windows[i]);
   }
   int component = windows_.direction == LEFT_RIGHT ? HTRIGHT : HTBOTTOM;
-  wm::WindowState* window_state = wm::GetWindowState(windows_.window1);
+  wm::WindowState* window_state = windows_.window1->GetWindowState();
   window_state->CreateDragDetails(location_in_parent, component,
                                   aura::client::WINDOW_MOVE_SOURCE_MOUSE);
-  window_resizer_.reset(WorkspaceWindowResizer::Create(
-      window_state, wm::WmWindowAura::FromAuraWindows(windows)));
+  window_resizer_.reset(WorkspaceWindowResizer::Create(window_state, windows));
 
   // Do not hide the resize widget while a drag is active.
   mouse_watcher_.reset();
@@ -457,12 +424,10 @@
 
 void MultiWindowResizeController::Resize(const gfx::Point& location_in_screen,
                                          int event_flags) {
-  gfx::Point location_in_parent(location_in_screen);
-  aura::client::GetScreenPositionClient(windows_.window1->GetRootWindow())->
-      ConvertPointFromScreen(windows_.window1->parent(), &location_in_parent);
+  gfx::Point location_in_parent =
+      windows_.window1->GetParent()->ConvertPointFromScreen(location_in_screen);
   window_resizer_->Drag(location_in_parent, event_flags);
-  gfx::Rect bounds = ScreenUtil::ConvertRectToScreen(
-      windows_.window1->parent(),
+  gfx::Rect bounds = windows_.window1->GetParent()->ConvertRectToScreen(
       CalculateResizeWidgetBounds(location_in_parent));
 
   if (windows_.direction == LEFT_RIGHT)
@@ -507,27 +472,26 @@
   gfx::Size pref = resize_widget_->GetContentsView()->GetPreferredSize();
   int x = 0, y = 0;
   if (windows_.direction == LEFT_RIGHT) {
-    x = windows_.window1->bounds().right() - pref.width() / 2;
+    x = windows_.window1->GetBounds().right() - pref.width() / 2;
     y = location_in_parent.y() + kResizeWidgetPadding;
-    if (y + pref.height() / 2 > windows_.window1->bounds().bottom() &&
-        y + pref.height() / 2 > windows_.window2->bounds().bottom()) {
+    if (y + pref.height() / 2 > windows_.window1->GetBounds().bottom() &&
+        y + pref.height() / 2 > windows_.window2->GetBounds().bottom()) {
       y = location_in_parent.y() - kResizeWidgetPadding - pref.height();
     }
   } else {
     x = location_in_parent.x() + kResizeWidgetPadding;
-    if (x + pref.height() / 2 > windows_.window1->bounds().right() &&
-        x + pref.height() / 2 > windows_.window2->bounds().right()) {
+    if (x + pref.height() / 2 > windows_.window1->GetBounds().right() &&
+        x + pref.height() / 2 > windows_.window2->GetBounds().right()) {
       x = location_in_parent.x() - kResizeWidgetPadding - pref.width();
     }
-    y = windows_.window1->bounds().bottom() - pref.height() / 2;
+    y = windows_.window1->GetBounds().bottom() - pref.height() / 2;
   }
   return gfx::Rect(x, y, pref.width(), pref.height());
 }
 
 bool MultiWindowResizeController::IsOverResizeWidget(
     const gfx::Point& location_in_screen) const {
-  return resize_widget_->GetWindowBoundsInScreen().Contains(
-      location_in_screen);
+  return resize_widget_->GetWindowBoundsInScreen().Contains(location_in_screen);
 }
 
 bool MultiWindowResizeController::IsOverWindows(
@@ -550,36 +514,27 @@
   // Check whether |location_in_screen| is in the event target's resize region.
   // This is tricky because a window's resize region can extend outside a
   // window's bounds.
-  gfx::Point location_in_root(location_in_screen);
-  aura::Window* root = windows_.window1->GetRootWindow();
-  ::wm::ConvertPointFromScreen(root, &location_in_root);
-  ui::MouseEvent test_event(ui::ET_MOUSE_MOVED, location_in_root,
-                            location_in_root, ui::EventTimeForNow(),
-                            ui::EF_NONE, ui::EF_NONE);
-  ui::EventTarget* event_handler = static_cast<ui::EventTarget*>(root)
-                                       ->GetEventTargeter()
-                                       ->FindTargetForEvent(root, &test_event);
-  if (event_handler == windows_.window1) {
+  wm::WmWindow* target =
+      windows_.window1->GetRootWindowController()->FindEventTarget(
+          location_in_screen);
+  if (target == windows_.window1) {
     return IsOverComponent(
-        windows_.window1,
-        location_in_screen,
+        windows_.window1, location_in_screen,
         windows_.direction == TOP_BOTTOM ? HTBOTTOM : HTRIGHT);
-  } else if (event_handler == windows_.window2) {
-    return IsOverComponent(
-        windows_.window2,
-        location_in_screen,
-        windows_.direction == TOP_BOTTOM ? HTTOP : HTLEFT);
+  }
+  if (target == windows_.window2) {
+    return IsOverComponent(windows_.window2, location_in_screen,
+                           windows_.direction == TOP_BOTTOM ? HTTOP : HTLEFT);
   }
   return false;
 }
 
 bool MultiWindowResizeController::IsOverComponent(
-    aura::Window* window,
+    wm::WmWindow* window,
     const gfx::Point& location_in_screen,
     int component) const {
-  gfx::Point window_loc(location_in_screen);
-  ::wm::ConvertPointFromScreen(window, &window_loc);
-  return window->delegate()->GetNonClientComponent(window_loc) == component;
+  gfx::Point window_loc = window->ConvertPointFromScreen(location_in_screen);
+  return window->GetNonClientComponent(window_loc) == component;
 }
 
 }  // namespace ash
diff --git a/ash/wm/workspace/multi_window_resize_controller.h b/ash/wm/common/workspace/multi_window_resize_controller.h
similarity index 82%
rename from ash/wm/workspace/multi_window_resize_controller.h
rename to ash/wm/common/workspace/multi_window_resize_controller.h
index efb0f68b..a0bab3f 100644
--- a/ash/wm/workspace/multi_window_resize_controller.h
+++ b/ash/wm/common/workspace/multi_window_resize_controller.h
@@ -2,23 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ASH_WM_WORKSPACE_MULTI_WINDOW_RESIZE_CONTROLLER_H_
-#define ASH_WM_WORKSPACE_MULTI_WINDOW_RESIZE_CONTROLLER_H_
+#ifndef ASH_WM_COMMON_WORKSPACE_MULTI_WINDOW_RESIZE_CONTROLLER_H_
+#define ASH_WM_COMMON_WORKSPACE_MULTI_WINDOW_RESIZE_CONTROLLER_H_
 
 #include <memory>
 #include <vector>
 
 #include "ash/ash_export.h"
+#include "ash/wm/common/wm_window_observer.h"
 #include "base/macros.h"
 #include "base/timer/timer.h"
-#include "ui/aura/window_observer.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/views/mouse_watcher.h"
 
-namespace aura {
-class Window;
-}
-
 namespace views {
 class Widget;
 }
@@ -36,15 +32,16 @@
 // MultiWindowResizeController is responsible for determining and showing a
 // widget that allows resizing multiple windows at the same time.
 // MultiWindowResizeController is driven by WorkspaceEventFilter.
-class ASH_EXPORT MultiWindowResizeController :
-    public views::MouseWatcherListener, public aura::WindowObserver {
+class ASH_EXPORT MultiWindowResizeController
+    : public views::MouseWatcherListener,
+      public wm::WmWindowObserver {
  public:
   MultiWindowResizeController();
   ~MultiWindowResizeController() override;
 
   // If necessary, shows the resize widget. |window| is the window the mouse
   // is over, |component| the edge and |point| the location of the mouse.
-  void Show(aura::Window* window, int component, const gfx::Point& point);
+  void Show(wm::WmWindow* window, int component, const gfx::Point& point);
 
   // Hides the resize widget.
   void Hide();
@@ -53,7 +50,7 @@
   void MouseMovedOutOfHost() override;
 
   // WindowObserver overrides:
-  void OnWindowDestroying(aura::Window* window) override;
+  void OnWindowDestroying(wm::WmWindow* window) override;
 
  private:
   friend class MultiWindowResizeControllerTest;
@@ -72,17 +69,17 @@
     bool is_valid() const { return window1 && window2; }
 
     // The left/top window to resize.
-    aura::Window* window1;
+    wm::WmWindow* window1;
 
     // Other window to resize.
-    aura::Window* window2;
+    wm::WmWindow* window2;
 
     // Direction
     Direction direction;
 
     // Windows after |window2| that are to be resized. Determined at the time
     // the resize starts.
-    std::vector<aura::Window*> other_windows;
+    std::vector<wm::WmWindow*> other_windows;
   };
 
   class ResizeMouseWatcherHost;
@@ -92,28 +89,28 @@
 
   // Returns a ResizeWindows based on the specified arguments. Use is_valid()
   // to test if the return value is a valid multi window resize location.
-  ResizeWindows DetermineWindows(aura::Window* window,
+  ResizeWindows DetermineWindows(wm::WmWindow* window,
                                  int window_component,
                                  const gfx::Point& point) const;
 
   // Variant of DetermineWindows() that uses the current location of the mouse
   // to determine the resize windows.
-  ResizeWindows DetermineWindowsFromScreenPoint(aura::Window* window) const;
+  ResizeWindows DetermineWindowsFromScreenPoint(wm::WmWindow* window) const;
 
   // Finds a window by edge (one of the constants HitTestCompat.
-  aura::Window* FindWindowByEdge(aura::Window* window_to_ignore,
+  wm::WmWindow* FindWindowByEdge(wm::WmWindow* window_to_ignore,
                                  int edge_want,
                                  int x_in_parent,
                                  int y_in_parent) const;
 
   // Returns the first window touching |window|.
-  aura::Window* FindWindowTouching(aura::Window* window,
+  wm::WmWindow* FindWindowTouching(wm::WmWindow* window,
                                    Direction direction) const;
 
   // Places any windows touching |start| into |others|.
-  void FindWindowsTouching(aura::Window* start,
+  void FindWindowsTouching(wm::WmWindow* start,
                            Direction direction,
-                           std::vector<aura::Window*>* others) const;
+                           std::vector<wm::WmWindow*>* others) const;
 
   // Shows the resizer if the mouse is still at a valid location. This is called
   // from the |show_timer_|.
@@ -149,7 +146,7 @@
   bool IsOverWindows(const gfx::Point& location_in_screen) const;
 
   // Returns true if |location_in_screen| is over |component| in |window|.
-  bool IsOverComponent(aura::Window* window,
+  bool IsOverComponent(wm::WmWindow* window,
                        const gfx::Point& location_in_screen,
                        int component) const;
 
@@ -180,4 +177,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_WM_WORKSPACE_MULTI_WINDOW_RESIZE_CONTROLLER_H_
+#endif  // ASH_WM_COMMON_WORKSPACE_MULTI_WINDOW_RESIZE_CONTROLLER_H_
diff --git a/ash/wm/workspace/phantom_window_controller.cc b/ash/wm/common/workspace/phantom_window_controller.cc
similarity index 97%
rename from ash/wm/workspace/phantom_window_controller.cc
rename to ash/wm/common/workspace/phantom_window_controller.cc
index 025ca11e..53cdcbb 100644
--- a/ash/wm/workspace/phantom_window_controller.cc
+++ b/ash/wm/common/workspace/phantom_window_controller.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 "ash/wm/workspace/phantom_window_controller.h"
+#include "ash/wm/common/workspace/phantom_window_controller.h"
 
 #include <math.h>
 
@@ -76,8 +76,7 @@
 PhantomWindowController::PhantomWindowController(wm::WmWindow* window)
     : window_(window) {}
 
-PhantomWindowController::~PhantomWindowController() {
-}
+PhantomWindowController::~PhantomWindowController() {}
 
 void PhantomWindowController::Show(const gfx::Rect& bounds_in_screen) {
   gfx::Rect adjusted_bounds_in_screen = GetAdjustedBounds(bounds_in_screen);
@@ -113,13 +112,13 @@
   // the phantom is visible.
   params.keep_on_top = true;
   params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+  params.name = "PhantomWindow";
   root_window->GetRootWindowController()->ConfigureWidgetInitParamsForContainer(
       phantom_widget.get(), kShellWindowId_ShelfContainer, &params);
   phantom_widget->set_focus_on_creation(false);
   phantom_widget->Init(params);
   phantom_widget->SetVisibilityChangedAnimationsEnabled(false);
   wm::WmWindow* phantom_widget_window = wm::WmWindow::Get(phantom_widget.get());
-  phantom_widget_window->SetName("PhantomWindow");
   phantom_widget_window->SetShellWindowId(kShellWindowId_PhantomWindow);
   phantom_widget->SetBounds(bounds_in_screen);
   // TODO(sky): I suspect this is never true, verify that.
diff --git a/ash/wm/workspace/phantom_window_controller.h b/ash/wm/common/workspace/phantom_window_controller.h
similarity index 88%
rename from ash/wm/workspace/phantom_window_controller.h
rename to ash/wm/common/workspace/phantom_window_controller.h
index 8e1983ba..c383c2db 100644
--- a/ash/wm/workspace/phantom_window_controller.h
+++ b/ash/wm/common/workspace/phantom_window_controller.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 ASH_WM_WORKSPACE_PHANTOM_WINDOW_CONTROLLER_H_
-#define ASH_WM_WORKSPACE_PHANTOM_WINDOW_CONTROLLER_H_
+#ifndef ASH_WM_COMMON_WORKSPACE_PHANTOM_WINDOW_CONTROLLER_H_
+#define ASH_WM_COMMON_WORKSPACE_PHANTOM_WINDOW_CONTROLLER_H_
 
 #include <memory>
 
@@ -55,4 +55,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_WM_WORKSPACE_PHANTOM_WINDOW_CONTROLLER_H_
+#endif  // ASH_WM_COMMON_WORKSPACE_PHANTOM_WINDOW_CONTROLLER_H_
diff --git a/ash/wm/workspace/two_step_edge_cycler.cc b/ash/wm/common/workspace/two_step_edge_cycler.cc
similarity index 93%
rename from ash/wm/workspace/two_step_edge_cycler.cc
rename to ash/wm/common/workspace/two_step_edge_cycler.cc
index 7f1ba474..1e3c815 100644
--- a/ash/wm/workspace/two_step_edge_cycler.cc
+++ b/ash/wm/common/workspace/two_step_edge_cycler.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 "ash/wm/workspace/two_step_edge_cycler.h"
+#include "ash/wm/common/workspace/two_step_edge_cycler.h"
 
 #include <cstdlib>
 
@@ -31,11 +31,9 @@
       start_x_(start.x()),
       paused_x_(start.x()),
       paused_(false),
-      direction_(direction) {
-}
+      direction_(direction) {}
 
-TwoStepEdgeCycler::~TwoStepEdgeCycler() {
-}
+TwoStepEdgeCycler::~TwoStepEdgeCycler() {}
 
 void TwoStepEdgeCycler::OnMove(const gfx::Point& location) {
   if (second_mode_)
diff --git a/ash/wm/workspace/two_step_edge_cycler.h b/ash/wm/common/workspace/two_step_edge_cycler.h
similarity index 90%
rename from ash/wm/workspace/two_step_edge_cycler.h
rename to ash/wm/common/workspace/two_step_edge_cycler.h
index d6aca87ee..f4c76d1 100644
--- a/ash/wm/workspace/two_step_edge_cycler.h
+++ b/ash/wm/common/workspace/two_step_edge_cycler.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 ASH_WM_WORKSPACE_TWO_STEP_EDGE_CYCLER_H_
-#define ASH_WM_WORKSPACE_TWO_STEP_EDGE_CYCLER_H_
+#ifndef ASH_WM_COMMON_WORKSPACE_TWO_STEP_EDGE_CYCLER_H_
+#define ASH_WM_COMMON_WORKSPACE_TWO_STEP_EDGE_CYCLER_H_
 
 #include "ash/ash_export.h"
 #include "base/macros.h"
@@ -58,4 +58,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_WM_WORKSPACE_TWO_STEP_EDGE_CYCLER_H_
+#endif  // ASH_WM_COMMON_WORKSPACE_TWO_STEP_EDGE_CYCLER_H_
diff --git a/ash/wm/workspace/workspace_window_resizer.cc b/ash/wm/common/workspace/workspace_window_resizer.cc
similarity index 92%
rename from ash/wm/workspace/workspace_window_resizer.cc
rename to ash/wm/common/workspace/workspace_window_resizer.cc
index 577ba24..1797b64d 100644
--- a/ash/wm/workspace/workspace_window_resizer.cc
+++ b/ash/wm/common/workspace/workspace_window_resizer.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 "ash/wm/workspace/workspace_window_resizer.h"
+#include "ash/wm/common/workspace/workspace_window_resizer.h"
 
 #include <algorithm>
 #include <cmath>
@@ -11,6 +11,8 @@
 
 #include "ash/wm/common/default_window_resizer.h"
 #include "ash/wm/common/dock/docked_window_layout_manager.h"
+#include "ash/wm/common/dock/docked_window_resizer.h"
+#include "ash/wm/common/panels/panel_window_resizer.h"
 #include "ash/wm/common/window_positioning_utils.h"
 #include "ash/wm/common/window_state.h"
 #include "ash/wm/common/wm_event.h"
@@ -20,10 +22,8 @@
 #include "ash/wm/common/wm_shell_window_ids.h"
 #include "ash/wm/common/wm_user_metrics_action.h"
 #include "ash/wm/common/wm_window.h"
-#include "ash/wm/dock/docked_window_resizer.h"
-#include "ash/wm/panels/panel_window_resizer.h"
-#include "ash/wm/workspace/phantom_window_controller.h"
-#include "ash/wm/workspace/two_step_edge_cycler.h"
+#include "ash/wm/common/workspace/phantom_window_controller.h"
+#include "ash/wm/common/workspace/two_step_edge_cycler.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/weak_ptr.h"
 #include "ui/base/hit_test.h"
@@ -67,8 +67,8 @@
   if (!window_state->IsNormalOrSnapped() && !window_state->IsDocked())
     return std::unique_ptr<WindowResizer>();
 
-  int bounds_change = WindowResizer::GetBoundsChangeForWindowComponent(
-      window_component);
+  int bounds_change =
+      WindowResizer::GetBoundsChangeForWindowComponent(window_component);
   if (bounds_change == WindowResizer::kBoundsChangeDirection_None)
     return std::unique_ptr<WindowResizer>();
 
@@ -154,15 +154,15 @@
   switch (edge.primary_edge) {
     case MAGNETISM_EDGE_TOP:
     case MAGNETISM_EDGE_BOTTOM:
-      x = CoordinateAlongSecondaryAxis(
-          edge.secondary_edge, attach_to.x(), attach_to.right() - src.width(),
-          src.x());
+      x = CoordinateAlongSecondaryAxis(edge.secondary_edge, attach_to.x(),
+                                       attach_to.right() - src.width(),
+                                       src.x());
       break;
     case MAGNETISM_EDGE_LEFT:
     case MAGNETISM_EDGE_RIGHT:
-      y = CoordinateAlongSecondaryAxis(
-          edge.secondary_edge, attach_to.y(), attach_to.bottom() - src.height(),
-          src.y());
+      y = CoordinateAlongSecondaryAxis(edge.secondary_edge, attach_to.y(),
+                                       attach_to.bottom() - src.height(),
+                                       src.y());
       break;
   }
   return gfx::Point(x, y);
@@ -262,10 +262,7 @@
 // and maximum size. 0 represents a lack of a constraint.
 class WindowSize {
  public:
-  WindowSize(int size, int min, int max)
-      : size_(size),
-        min_(min),
-        max_(max) {
+  WindowSize(int size, int min, int max) : size_(size), min_(min), max_(max) {
     // Grow the min/max bounds to include the starting size.
     if (is_underflowing())
       min_ = size_;
@@ -277,29 +274,17 @@
     return size_ == (shrinking ? min_ : max_);
   }
 
-  int size() const {
-    return size_;
-  }
+  int size() const { return size_; }
 
-  bool has_min() const {
-    return min_ != 0;
-  }
+  bool has_min() const { return min_ != 0; }
 
-  bool has_max() const {
-    return max_ != 0;
-  }
+  bool has_max() const { return max_ != 0; }
 
-  bool is_valid() const {
-    return !is_overflowing() && !is_underflowing();
-  }
+  bool is_valid() const { return !is_overflowing() && !is_underflowing(); }
 
-  bool is_overflowing() const {
-    return has_max() && size_ > max_;
-  }
+  bool is_overflowing() const { return has_max() && size_ > max_; }
 
-  bool is_underflowing() const {
-    return has_min() && size_ < min_;
-  }
+  bool is_underflowing() const { return has_min() && size_ < min_; }
 
   // Add |amount| to this WindowSize not exceeding min or max size constraints.
   // Returns by how much |size_| + |amount| exceeds the min/max constraints.
@@ -350,7 +335,7 @@
   if (event_flags & ui::EF_CONTROL_DOWN) {
     sticky_size = 0;
   } else if ((details().bounds_change & kBoundsChange_Resizes) &&
-      details().source == aura::client::WINDOW_MOVE_SOURCE_TOUCH) {
+             details().source == aura::client::WINDOW_MOVE_SOURCE_TOUCH) {
     sticky_size = kScreenEdgeInsetForTouchDrag;
   } else {
     sticky_size = kScreenEdgeInset;
@@ -423,15 +408,15 @@
       gfx::Rect initial_bounds = GetTarget()->GetParent()->ConvertRectToScreen(
           details().initial_bounds_in_parent);
       window_state()->SetRestoreBoundsInScreen(
-          details().restore_bounds.IsEmpty() ?
-          initial_bounds :
-          details().restore_bounds);
+          details().restore_bounds.IsEmpty() ? initial_bounds
+                                             : details().restore_bounds);
     }
     if (!dock_layout_->is_dragged_window_docked()) {
       // TODO(oshima): Add event source type to WMEvent and move
       // metrics recording inside WindowState::OnWMEvent.
-      const wm::WMEvent event(snap_type_ == SNAP_LEFT ?
-                              wm::WM_EVENT_SNAP_LEFT : wm::WM_EVENT_SNAP_RIGHT);
+      const wm::WMEvent event(snap_type_ == SNAP_LEFT
+                                  ? wm::WM_EVENT_SNAP_LEFT
+                                  : wm::WM_EVENT_SNAP_RIGHT);
       window_state()->OnWMEvent(&event);
       globals_->RecordUserMetricsAction(
           snap_type_ == SNAP_LEFT
@@ -529,9 +514,8 @@
   dock_layout_ = DockedWindowLayoutManager::Get(GetTarget());
 
   // Only support attaching to the right/bottom.
-  DCHECK(attached_windows_.empty() ||
-         (details().window_component == HTRIGHT ||
-          details().window_component == HTBOTTOM));
+  DCHECK(attached_windows_.empty() || (details().window_component == HTRIGHT ||
+                                       details().window_component == HTBOTTOM));
 
   // TODO: figure out how to deal with window going off the edge.
 
@@ -553,8 +537,7 @@
   instance = this;
 }
 
-void WorkspaceWindowResizer::LayoutAttachedWindows(
-    gfx::Rect* bounds) {
+void WorkspaceWindowResizer::LayoutAttachedWindows(gfx::Rect* bounds) {
   gfx::Rect work_area(wm::GetDisplayWorkAreaBoundsInParent(GetTarget()));
   int initial_size = PrimaryAxisSize(details().initial_bounds_in_parent.size());
   int current_size = PrimaryAxisSize(bounds->size());
@@ -676,8 +659,7 @@
     total_value += sizes[i]->size();
 
   for (size_t i = 0; i < sizes.size(); ++i)
-    out_ratios->push_back(
-        (static_cast<float>(sizes[i]->size())) / total_value);
+    out_ratios->push_back((static_cast<float>(sizes[i]->size())) / total_value);
 }
 
 void WorkspaceWindowResizer::CreateBucketsForAttached(
@@ -750,8 +732,8 @@
           !other_state->IsNormalOrSnapped() || !other_state->CanResize()) {
         continue;
       }
-      if (matcher.ShouldAttach(
-              other_state->window()->GetBoundsInScreen(), &magnetism_edge_)) {
+      if (matcher.ShouldAttach(other_state->window()->GetBoundsInScreen(),
+                               &magnetism_edge_)) {
         magnetism_window_ = other_state->window();
         window_tracker_.Add(magnetism_window_);
         return true;
@@ -761,9 +743,8 @@
   return false;
 }
 
-void WorkspaceWindowResizer::AdjustBoundsForMainWindow(
-    int sticky_size,
-    gfx::Rect* bounds) {
+void WorkspaceWindowResizer::AdjustBoundsForMainWindow(int sticky_size,
+                                                       gfx::Rect* bounds) {
   gfx::Point last_mouse_location_in_screen =
       GetTarget()->GetParent()->ConvertPointToScreen(last_mouse_location_);
   display::Display display =
@@ -775,8 +756,8 @@
     // Adjust the bounds to the work area where the mouse cursor is located.
     // Always keep kMinOnscreenHeight or the window height (whichever is less)
     // on the bottom.
-    int max_y = work_area.bottom() - std::min(kMinOnscreenHeight,
-                                              bounds->height());
+    int max_y =
+        work_area.bottom() - std::min(kMinOnscreenHeight, bounds->height());
     if (bounds->y() > max_y) {
       bounds->set_y(max_y);
     } else if (bounds->y() <= work_area.y()) {
@@ -811,10 +792,9 @@
   }
 }
 
-bool WorkspaceWindowResizer::StickToWorkAreaOnMove(
-    const gfx::Rect& work_area,
-    int sticky_size,
-    gfx::Rect* bounds) const {
+bool WorkspaceWindowResizer::StickToWorkAreaOnMove(const gfx::Rect& work_area,
+                                                   int sticky_size,
+                                                   gfx::Rect* bounds) const {
   const int left_edge = work_area.x();
   const int right_edge = work_area.right();
   const int top_edge = work_area.y();
@@ -841,10 +821,9 @@
   return updated;
 }
 
-void WorkspaceWindowResizer::StickToWorkAreaOnResize(
-    const gfx::Rect& work_area,
-    int sticky_size,
-    gfx::Rect* bounds) const {
+void WorkspaceWindowResizer::StickToWorkAreaOnResize(const gfx::Rect& work_area,
+                                                     int sticky_size,
+                                                     gfx::Rect* bounds) const {
   const uint32_t edges =
       WindowComponentToMagneticEdge(details().window_component);
   const int left_edge = work_area.x();
@@ -904,8 +883,9 @@
   }
 
   DCHECK(snap_type_ == SNAP_LEFT || snap_type_ == SNAP_RIGHT);
-  DockedAlignment desired_alignment = (snap_type_ == SNAP_LEFT) ?
-      DOCKED_ALIGNMENT_LEFT : DOCKED_ALIGNMENT_RIGHT;
+  DockedAlignment desired_alignment = (snap_type_ == SNAP_LEFT)
+                                          ? DOCKED_ALIGNMENT_LEFT
+                                          : DOCKED_ALIGNMENT_RIGHT;
   const bool can_dock =
       dock_layout_->CanDockWindow(GetTarget(), desired_alignment) &&
       dock_layout_->GetAlignmentOfWindow(GetTarget()) != DOCKED_ALIGNMENT_NONE;
diff --git a/ash/wm/workspace/workspace_window_resizer.h b/ash/wm/common/workspace/workspace_window_resizer.h
similarity index 95%
rename from ash/wm/workspace/workspace_window_resizer.h
rename to ash/wm/common/workspace/workspace_window_resizer.h
index 9f00344..dd32fc4d 100644
--- a/ash/wm/workspace/workspace_window_resizer.h
+++ b/ash/wm/common/workspace/workspace_window_resizer.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 ASH_WM_WORKSPACE_WORKSPACE_WINDOW_RESIZER_H_
-#define ASH_WM_WORKSPACE_WORKSPACE_WINDOW_RESIZER_H_
+#ifndef ASH_WM_COMMON_WORKSPACE_WORKSPACE_WINDOW_RESIZER_H_
+#define ASH_WM_COMMON_WORKSPACE_WORKSPACE_WINDOW_RESIZER_H_
 
 #include <stdint.h>
 
@@ -12,7 +12,7 @@
 
 #include "ash/wm/common/window_resizer.h"
 #include "ash/wm/common/wm_window_tracker.h"
-#include "ash/wm/workspace/magnetism_matcher.h"
+#include "ash/wm/common/workspace/magnetism_matcher.h"
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
@@ -86,10 +86,9 @@
   // Note the return value can be positive or negative, a negative value
   // indicating that that many pixels couldn't be removed from the attached
   // windows.
-  int CalculateAttachedSizes(
-      int delta,
-      int available_size,
-      std::vector<int>* sizes) const;
+  int CalculateAttachedSizes(int delta,
+                             int available_size,
+                             std::vector<int>* sizes) const;
 
   // Divides |amount| evenly between |sizes|. If |amount| is negative it
   // indicates how many pixels |sizes| should be shrunk by.
@@ -228,4 +227,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_WM_WORKSPACE_WORKSPACE_WINDOW_RESIZER_H_
+#endif  // ASH_WM_COMMON_WORKSPACE_WORKSPACE_WINDOW_RESIZER_H_
diff --git a/ash/wm/dock/docked_window_layout_manager_unittest.cc b/ash/wm/dock/docked_window_layout_manager_unittest.cc
index 338327d3..806c9ff7 100644
--- a/ash/wm/dock/docked_window_layout_manager_unittest.cc
+++ b/ash/wm/dock/docked_window_layout_manager_unittest.cc
@@ -21,9 +21,9 @@
 #include "ash/test/shell_test_api.h"
 #include "ash/test/test_shelf_delegate.h"
 #include "ash/wm/aura/wm_window_aura.h"
+#include "ash/wm/common/panels/panel_layout_manager.h"
 #include "ash/wm/common/window_resizer.h"
 #include "ash/wm/common/window_state.h"
-#include "ash/wm/panels/panel_layout_manager.h"
 #include "ash/wm/window_state_aura.h"
 #include "ash/wm/window_util.h"
 #include "base/command_line.h"
diff --git a/ash/wm/dock/docked_window_resizer_unittest.cc b/ash/wm/dock/docked_window_resizer_unittest.cc
index a1ca4524..d2cd4da 100644
--- a/ash/wm/dock/docked_window_resizer_unittest.cc
+++ b/ash/wm/dock/docked_window_resizer_unittest.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 "ash/wm/dock/docked_window_resizer.h"
+#include "ash/wm/common/dock/docked_window_resizer.h"
 
 #include "ash/ash_switches.h"
 #include "ash/display/window_tree_host_manager.h"
@@ -21,10 +21,10 @@
 #include "ash/test/test_shelf_delegate.h"
 #include "ash/wm/aura/wm_window_aura.h"
 #include "ash/wm/common/dock/docked_window_layout_manager.h"
+#include "ash/wm/common/panels/panel_layout_manager.h"
 #include "ash/wm/common/window_state.h"
 #include "ash/wm/common/wm_event.h"
 #include "ash/wm/drag_window_resizer.h"
-#include "ash/wm/panels/panel_layout_manager.h"
 #include "ash/wm/window_state_aura.h"
 #include "ash/wm/window_util.h"
 #include "base/command_line.h"
diff --git a/ash/wm/maximize_mode/maximize_mode_window_state.cc b/ash/wm/maximize_mode/maximize_mode_window_state.cc
index 74fcd2f..23b928a9 100644
--- a/ash/wm/maximize_mode/maximize_mode_window_state.cc
+++ b/ash/wm/maximize_mode/maximize_mode_window_state.cc
@@ -15,12 +15,12 @@
 #include "ash/wm/common/window_state_util.h"
 #include "ash/wm/common/wm_event.h"
 #include "ash/wm/common/wm_screen_util.h"
+#include "ash/wm/common/workspace/workspace_window_resizer.h"
 #include "ash/wm/maximize_mode/maximize_mode_window_manager.h"
 #include "ash/wm/window_animations.h"
 #include "ash/wm/window_properties.h"
 #include "ash/wm/window_state_aura.h"
 #include "ash/wm/window_util.h"
-#include "ash/wm/workspace/workspace_window_resizer.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_delegate.h"
diff --git a/ash/wm/overview/window_selector.cc b/ash/wm/overview/window_selector.cc
index 149699e..71bda01 100644
--- a/ash/wm/overview/window_selector.cc
+++ b/ash/wm/overview/window_selector.cc
@@ -17,13 +17,13 @@
 #include "ash/shell.h"
 #include "ash/shell_window_ids.h"
 #include "ash/wm/aura/wm_window_aura.h"
+#include "ash/wm/common/panels/panel_layout_manager.h"
 #include "ash/wm/common/switchable_windows.h"
 #include "ash/wm/common/window_state.h"
 #include "ash/wm/mru_window_tracker.h"
 #include "ash/wm/overview/window_grid.h"
 #include "ash/wm/overview/window_selector_delegate.h"
 #include "ash/wm/overview/window_selector_item.h"
-#include "ash/wm/panels/panel_layout_manager.h"
 #include "ash/wm/window_state_aura.h"
 #include "ash/wm/window_util.h"
 #include "base/auto_reset.h"
diff --git a/ash/wm/overview/window_selector_unittest.cc b/ash/wm/overview/window_selector_unittest.cc
index 3fcdad1e..58a533e 100644
--- a/ash/wm/overview/window_selector_unittest.cc
+++ b/ash/wm/overview/window_selector_unittest.cc
@@ -21,6 +21,7 @@
 #include "ash/test/shell_test_api.h"
 #include "ash/test/test_shelf_delegate.h"
 #include "ash/wm/aura/wm_window_aura.h"
+#include "ash/wm/common/panels/panel_layout_manager.h"
 #include "ash/wm/common/window_state.h"
 #include "ash/wm/common/wm_event.h"
 #include "ash/wm/maximize_mode/maximize_mode_controller.h"
@@ -29,7 +30,6 @@
 #include "ash/wm/overview/window_selector.h"
 #include "ash/wm/overview/window_selector_controller.h"
 #include "ash/wm/overview/window_selector_item.h"
-#include "ash/wm/panels/panel_layout_manager.h"
 #include "ash/wm/window_state_aura.h"
 #include "ash/wm/window_util.h"
 #include "base/command_line.h"
diff --git a/ash/wm/panels/attached_panel_window_targeter.cc b/ash/wm/panels/attached_panel_window_targeter.cc
index 9ccc0d9..db00849 100644
--- a/ash/wm/panels/attached_panel_window_targeter.cc
+++ b/ash/wm/panels/attached_panel_window_targeter.cc
@@ -7,7 +7,7 @@
 #include "ash/shelf/shelf.h"
 #include "ash/shell.h"
 #include "ash/wm/aura/wm_shelf_aura.h"
-#include "ash/wm/panels/panel_layout_manager.h"
+#include "ash/wm/common/panels/panel_layout_manager.h"
 
 namespace ash {
 
diff --git a/ash/wm/panels/panel_layout_manager_unittest.cc b/ash/wm/panels/panel_layout_manager_unittest.cc
index 5dabe4268..826d697 100644
--- a/ash/wm/panels/panel_layout_manager_unittest.cc
+++ b/ash/wm/panels/panel_layout_manager_unittest.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 "ash/wm/panels/panel_layout_manager.h"
+#include "ash/wm/common/panels/panel_layout_manager.h"
 
 #include "ash/ash_switches.h"
 #include "ash/screen_util.h"
diff --git a/ash/wm/panels/panel_window_resizer_unittest.cc b/ash/wm/panels/panel_window_resizer_unittest.cc
index d5d73912..9efbe47 100644
--- a/ash/wm/panels/panel_window_resizer_unittest.cc
+++ b/ash/wm/panels/panel_window_resizer_unittest.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 "ash/wm/panels/panel_window_resizer.h"
+#include "ash/wm/common/panels/panel_window_resizer.h"
 
 #include "ash/root_window_controller.h"
 #include "ash/shelf/shelf.h"
diff --git a/ash/wm/workspace/magnetism_matcher_unittest.cc b/ash/wm/workspace/magnetism_matcher_unittest.cc
index 6c7ea9b44..815bc33 100644
--- a/ash/wm/workspace/magnetism_matcher_unittest.cc
+++ b/ash/wm/workspace/magnetism_matcher_unittest.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 "ash/wm/workspace/magnetism_matcher.h"
+#include "ash/wm/common/workspace/magnetism_matcher.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/ash/wm/workspace/multi_window_resize_controller_unittest.cc b/ash/wm/workspace/multi_window_resize_controller_unittest.cc
index 3617d290..85110c9 100644
--- a/ash/wm/workspace/multi_window_resize_controller_unittest.cc
+++ b/ash/wm/workspace/multi_window_resize_controller_unittest.cc
@@ -2,17 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/wm/workspace/multi_window_resize_controller.h"
+#include "ash/wm/common/workspace/multi_window_resize_controller.h"
 
 #include "ash/ash_constants.h"
 #include "ash/frame/custom_frame_view_ash.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/test/shell_test_api.h"
+#include "ash/wm/aura/wm_window_aura.h"
 #include "ash/wm/window_util.h"
 #include "ash/wm/workspace/workspace_event_handler_test_helper.h"
 #include "ash/wm/workspace_controller.h"
 #include "ash/wm/workspace_controller_test_helper.h"
+#include "base/stl_util.h"
 #include "ui/aura/test/test_window_delegate.h"
 #include "ui/aura/window.h"
 #include "ui/base/hit_test.h"
@@ -93,15 +95,11 @@
   bool HasTarget(aura::Window* window) {
     if (!resize_controller_->windows_.is_valid())
       return false;
-    if ((resize_controller_->windows_.window1 == window ||
-         resize_controller_->windows_.window2 == window))
+    wm::WmWindow* wm_window = wm::WmWindowAura::Get(window);
+    if ((resize_controller_->windows_.window1 == wm_window ||
+         resize_controller_->windows_.window2 == wm_window))
       return true;
-    for (size_t i = 0;
-         i < resize_controller_->windows_.other_windows.size(); ++i) {
-      if (resize_controller_->windows_.other_windows[i] == window)
-        return true;
-    }
-    return false;
+    return ContainsValue(resize_controller_->windows_.other_windows, wm_window);
   }
 
   bool IsOverWindows(const gfx::Point& loc) {
diff --git a/ash/wm/workspace/workspace_event_handler.cc b/ash/wm/workspace/workspace_event_handler.cc
index 508801c..4b42d27 100644
--- a/ash/wm/workspace/workspace_event_handler.cc
+++ b/ash/wm/workspace/workspace_event_handler.cc
@@ -7,6 +7,7 @@
 #include "ash/metrics/user_metrics_recorder.h"
 #include "ash/shell.h"
 #include "ash/touch/touch_uma.h"
+#include "ash/wm/aura/wm_window_aura.h"
 #include "ash/wm/common/window_state.h"
 #include "ash/wm/common/wm_event.h"
 #include "ash/wm/common/wm_window.h"
@@ -41,8 +42,8 @@
     case ui::ET_MOUSE_MOVED: {
       int component =
           target->delegate()->GetNonClientComponent(event->location());
-      multi_window_resize_controller_.Show(target, component,
-                                           event->location());
+      multi_window_resize_controller_.Show(wm::WmWindowAura::Get(target),
+                                           component, event->location());
       break;
     }
     case ui::ET_MOUSE_ENTERED:
diff --git a/ash/wm/workspace/workspace_event_handler.h b/ash/wm/workspace/workspace_event_handler.h
index cc72aec..a83fd22 100644
--- a/ash/wm/workspace/workspace_event_handler.h
+++ b/ash/wm/workspace/workspace_event_handler.h
@@ -5,7 +5,7 @@
 #ifndef ASH_WM_WORKSPACE_WORKSPACE_EVENT_HANDLER_H_
 #define ASH_WM_WORKSPACE_WORKSPACE_EVENT_HANDLER_H_
 
-#include "ash/wm/workspace/multi_window_resize_controller.h"
+#include "ash/wm/common/workspace/multi_window_resize_controller.h"
 #include "base/macros.h"
 #include "ui/events/event_handler.h"
 
diff --git a/ash/wm/workspace/workspace_layout_manager_unittest.cc b/ash/wm/workspace/workspace_layout_manager_unittest.cc
index 48a1fb1..89603f0f 100644
--- a/ash/wm/workspace/workspace_layout_manager_unittest.cc
+++ b/ash/wm/workspace/workspace_layout_manager_unittest.cc
@@ -21,10 +21,10 @@
 #include "ash/wm/aura/wm_window_aura.h"
 #include "ash/wm/common/window_state.h"
 #include "ash/wm/common/wm_event.h"
+#include "ash/wm/common/workspace/workspace_window_resizer.h"
 #include "ash/wm/maximize_mode/workspace_backdrop_delegate.h"
 #include "ash/wm/window_state_aura.h"
 #include "ash/wm/window_util.h"
-#include "ash/wm/workspace/workspace_window_resizer.h"
 #include "base/compiler_specific.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/test/test_windows.h"
diff --git a/ash/wm/workspace/workspace_window_resizer_unittest.cc b/ash/wm/workspace/workspace_window_resizer_unittest.cc
index 7682ac8..c758f58f 100644
--- a/ash/wm/workspace/workspace_window_resizer_unittest.cc
+++ b/ash/wm/workspace/workspace_window_resizer_unittest.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 "ash/wm/workspace/workspace_window_resizer.h"
+#include "ash/wm/common/workspace/workspace_window_resizer.h"
 
 #include "ash/display/display_manager.h"
 #include "ash/root_window_controller.h"
@@ -16,9 +16,9 @@
 #include "ash/wm/common/window_positioning_utils.h"
 #include "ash/wm/common/window_state.h"
 #include "ash/wm/common/wm_event.h"
+#include "ash/wm/common/workspace/phantom_window_controller.h"
 #include "ash/wm/window_state_aura.h"
 #include "ash/wm/window_util.h"
-#include "ash/wm/workspace/phantom_window_controller.h"
 #include "ash/wm/workspace_controller.h"
 #include "base/command_line.h"
 #include "base/strings/string_number_conversions.h"
diff --git a/ash/wm/workspace_controller_unittest.cc b/ash/wm/workspace_controller_unittest.cc
index 2bd28404..79b138ae 100644
--- a/ash/wm/workspace_controller_unittest.cc
+++ b/ash/wm/workspace_controller_unittest.cc
@@ -17,11 +17,11 @@
 #include "ash/test/shell_test_api.h"
 #include "ash/test/test_shelf_delegate.h"
 #include "ash/wm/aura/wm_window_aura.h"
+#include "ash/wm/common/panels/panel_layout_manager.h"
 #include "ash/wm/common/window_state.h"
-#include "ash/wm/panels/panel_layout_manager.h"
+#include "ash/wm/common/workspace/workspace_window_resizer.h"
 #include "ash/wm/window_state_aura.h"
 #include "ash/wm/window_util.h"
-#include "ash/wm/workspace/workspace_window_resizer.h"
 #include "base/strings/string_number_conversions.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/test/test_window_delegate.h"
diff --git a/base/BUILD.gn b/base/BUILD.gn
index fc2c0f2..56266fe 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -778,6 +778,8 @@
     "task_scheduler/sequence_sort_key.h",
     "task_scheduler/task.cc",
     "task_scheduler/task.h",
+    "task_scheduler/task_scheduler.cc",
+    "task_scheduler/task_scheduler.h",
     "task_scheduler/task_tracker.cc",
     "task_scheduler/task_tracker.h",
     "task_scheduler/task_traits.cc",
@@ -1239,7 +1241,7 @@
         ]
       }
       if (is_asan) {
-        data += [ "//third_party/llvm-build/Release+Asserts/lib/clang/3.9.0/lib/windows/clang_rt.asan_dynamic-i386.dll" ]
+        data += [ "//third_party/llvm-build/Release+Asserts/lib/clang/$clang_version/lib/windows/clang_rt.asan_dynamic-i386.dll" ]
       }
     }
 
diff --git a/base/android/context_utils.cc b/base/android/context_utils.cc
index fd62c45f..e9ab723 100644
--- a/base/android/context_utils.cc
+++ b/base/android/context_utils.cc
@@ -38,11 +38,6 @@
   return g_application_context.Get().obj();
 }
 
-void InitApplicationContext(JNIEnv* env, const JavaRef<jobject>& context) {
-  SetNativeApplicationContext(env, context);
-  Java_ContextUtils_initJavaSideApplicationContext(env, context.obj());
-}
-
 static void InitNativeSideApplicationContext(
     JNIEnv* env,
     const JavaParamRef<jclass>& clazz,
diff --git a/base/android/context_utils.h b/base/android/context_utils.h
index 52895a9..f172d93 100644
--- a/base/android/context_utils.h
+++ b/base/android/context_utils.h
@@ -18,14 +18,6 @@
 // must NOT release it.
 BASE_EXPORT jobject GetApplicationContext();
 
-// Initialize the global application context object.
-// Either this or the Java equivalent ContextUtils.initApplicationContext must
-// be called once during startup. JNI bindings must have been initialized, as
-// the context is stored on both sides.
-BASE_EXPORT void InitApplicationContext(
-    JNIEnv* env,
-    const base::android::JavaRef<jobject>& context);
-
 bool RegisterContextUtils(JNIEnv* env);
 
 }  // namespace android
diff --git a/base/android/java/src/org/chromium/base/ContextUtils.java b/base/android/java/src/org/chromium/base/ContextUtils.java
index 51adcff..95cdc40 100644
--- a/base/android/java/src/org/chromium/base/ContextUtils.java
+++ b/base/android/java/src/org/chromium/base/ContextUtils.java
@@ -6,7 +6,6 @@
 
 import android.content.Context;
 
-import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 
 /**
@@ -14,6 +13,7 @@
  */
 @JNINamespace("base::android")
 public class ContextUtils {
+    private static final String TAG = "ContextUtils";
     private static Context sApplicationContext;
 
     /**
@@ -29,34 +29,52 @@
      * may make is that it is a Context whose lifetime is the same as the lifetime of the process.
      */
     public static Context getApplicationContext() {
-        assert sApplicationContext != null;
         return sApplicationContext;
     }
 
     /**
-     * Initialize the Android application context.
+     * Initializes the java application context.
      *
-     * Either this or the native equivalent base::android::InitApplicationContext must be called
-     * once during startup. JNI bindings must have been initialized, as the context is stored on
-     * both sides.
+     * This should be called exactly once early on during startup, before native is loaded and
+     * before any other clients make use of the application context through this class.
+     *
+     * @param appContext The application context.
      */
     public static void initApplicationContext(Context appContext) {
-        assert appContext != null;
-        assert sApplicationContext == null || sApplicationContext == appContext;
+        // Conceding that occasionally in tests, native is loaded before the browser process is
+        // started, in which case the browser process re-sets the application context.
+        if (sApplicationContext != null && sApplicationContext != appContext) {
+            throw new RuntimeException("Attempting to set multiple global application contexts.");
+        }
         initJavaSideApplicationContext(appContext);
-        nativeInitNativeSideApplicationContext(appContext);
     }
 
     /**
-     * JUnit Robolectric tests run without native code; allow them to set just the Java-side
-     * context. Do not use in configurations that actually run on Android!
+     * Initialize the native Android application context to be the same as the java counter-part.
      */
-    public static void initApplicationContextForJUnitTests(Context appContext) {
+    public static void initApplicationContextForNative() {
+        if (sApplicationContext == null) {
+            throw new RuntimeException("Cannot have native global application context be null.");
+        }
+        nativeInitNativeSideApplicationContext(sApplicationContext);
+    }
+
+    /**
+     * Occasionally tests cannot ensure the application context doesn't change between tests (junit)
+     * and sometimes specific tests has its own special needs, initApplicationContext should be used
+     * as much as possible, but this method can be used to override it.
+     *
+     * @param appContext The new application context.
+     */
+    @VisibleForTesting
+    public static void initApplicationContextForTests(Context appContext) {
         initJavaSideApplicationContext(appContext);
     }
 
-    @CalledByNative
     private static void initJavaSideApplicationContext(Context appContext) {
+        if (appContext == null) {
+            throw new RuntimeException("Global application context cannot be set to null.");
+        }
         sApplicationContext = appContext;
     }
 
diff --git a/base/android/java/src/org/chromium/base/PathUtils.java b/base/android/java/src/org/chromium/base/PathUtils.java
index 4fde1b9..c3d3e7e 100644
--- a/base/android/java/src/org/chromium/base/PathUtils.java
+++ b/base/android/java/src/org/chromium/base/PathUtils.java
@@ -17,6 +17,7 @@
 
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * This class provides the path related methods for the native library.
@@ -30,6 +31,7 @@
     private static final int DATABASE_DIRECTORY = 2;
     private static final int CACHE_DIRECTORY = 3;
     private static final int NUM_DIRECTORIES = 4;
+    private static final AtomicBoolean sInitializationStarted = new AtomicBoolean();
     private static AsyncTask<Void, Void, String[]> sDirPathFetchTask;
 
     // In setPrivateDataDirectorySuffix(), we store the app's context. If the AsyncTask started in
@@ -123,14 +125,18 @@
      * @see Context#getDir(String, int)
      */
     public static void setPrivateDataDirectorySuffix(String suffix, Context context) {
-        sDataDirectorySuffix = suffix;
-        sDataDirectoryAppContext = context.getApplicationContext();
-        sDirPathFetchTask = new AsyncTask<Void, Void, String[]>() {
-            @Override
-            protected String[] doInBackground(Void... unused) {
-                return PathUtils.setPrivateDataDirectorySuffixInternal();
-            }
-        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+        // This method should only be called once, but many tests end up calling it multiple times,
+        // so adding a guard here.
+        if (!sInitializationStarted.getAndSet(true)) {
+            sDataDirectorySuffix = suffix;
+            sDataDirectoryAppContext = context.getApplicationContext();
+            sDirPathFetchTask = new AsyncTask<Void, Void, String[]>() {
+                @Override
+                protected String[] doInBackground(Void... unused) {
+                    return PathUtils.setPrivateDataDirectorySuffixInternal();
+                }
+            }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+        }
     }
 
     /**
diff --git a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
index 6665ddfd..7858271 100644
--- a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
+++ b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
@@ -13,6 +13,7 @@
 import android.os.SystemClock;
 
 import org.chromium.base.CommandLine;
+import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
 import org.chromium.base.PackageUtils;
 import org.chromium.base.TraceEvent;
@@ -132,6 +133,8 @@
      *  @param context The context in which the method is called.
      */
     public void ensureInitialized(Context context) throws ProcessInitException {
+        // TODO(wnwen): Move this call appropriately down to the tests that need it.
+        ContextUtils.initApplicationContext(context.getApplicationContext());
         synchronized (sLock) {
             if (mInitialized) {
                 // Already initialized, nothing to do.
@@ -360,6 +363,10 @@
         nativeInitCommandLine(CommandLine.getJavaSwitchesOrNull());
         CommandLine.enableNativeProxy();
         mCommandLineSwitched = true;
+
+        // Ensure that native side application context is loaded and in sync with java side. Must do
+        // this here so webview also gets its application context set before fully initializing.
+        ContextUtils.initApplicationContextForNative();
     }
 
     // Invoke base::android::LibraryLoaded in library_loader_hooks.cc
@@ -368,23 +375,13 @@
             return;
         }
 
-        // Setup the native command line if necessary.
-        if (!mCommandLineSwitched) {
-            nativeInitCommandLine(CommandLine.getJavaSwitchesOrNull());
-        }
+        ensureCommandLineSwitchedAlreadyLocked();
 
         if (!nativeLibraryLoaded()) {
             Log.e(TAG, "error calling nativeLibraryLoaded");
             throw new ProcessInitException(LoaderErrors.LOADER_ERROR_FAILED_TO_REGISTER_JNI);
         }
 
-        // The Chrome JNI is registered by now so we can switch the Java
-        // command line over to delegating to native if it's necessary.
-        if (!mCommandLineSwitched) {
-            CommandLine.enableNativeProxy();
-            mCommandLineSwitched = true;
-        }
-
         // From now on, keep tracing in sync with native.
         TraceEvent.registerNativeEnabledObserver();
 
diff --git a/base/android/linker/config.gni b/base/android/linker/config.gni
index d07caa6..174c1ab 100644
--- a/base/android/linker/config.gni
+++ b/base/android/linker/config.gni
@@ -3,9 +3,10 @@
 # found in the LICENSE file.
 
 import("//build/config/android/config.gni")
+import("//build/config/compiler/compiler.gni")
 import("//build/config/sanitizers/sanitizers.gni")
 
 # Chromium linker crashes on component builds on Android 4.4. See b/11379966
 # Chromium linker causes instrumentation to return incorrect results.
 chromium_linker_supported =
-    !is_component_build && !use_order_profiling && !is_asan
+    !is_component_build && !enable_profiling && !use_order_profiling && !is_asan
diff --git a/base/base.gypi b/base/base.gypi
index 95aad6ea..96acf45 100644
--- a/base/base.gypi
+++ b/base/base.gypi
@@ -655,6 +655,8 @@
           'task_scheduler/sequence_sort_key.h',
           'task_scheduler/task.cc',
           'task_scheduler/task.h',
+          'task_scheduler/task_scheduler.cc',
+          'task_scheduler/task_scheduler.h',
           'task_scheduler/task_tracker.cc',
           'task_scheduler/task_tracker.h',
           'task_scheduler/task_traits.cc',
diff --git a/base/memory/aligned_memory.h b/base/memory/aligned_memory.h
index f6b8395..d8290115 100644
--- a/base/memory/aligned_memory.h
+++ b/base/memory/aligned_memory.h
@@ -26,7 +26,7 @@
 //   // ... later, to release the memory:
 //   AlignedFree(my_array);
 //
-// Or using scoped_ptr:
+// Or using unique_ptr:
 //
 //   std::unique_ptr<float, AlignedFreeDeleter> my_array(
 //       static_cast<float*>(AlignedAlloc(size, alignment)));
@@ -104,7 +104,7 @@
 #endif
 }
 
-// Deleter for use with scoped_ptr. E.g., use as
+// Deleter for use with unique_ptr. E.g., use as
 //   std::unique_ptr<Foo, base::AlignedFreeDeleter> foo;
 struct AlignedFreeDeleter {
   inline void operator()(void* ptr) const {
diff --git a/base/memory/memory_pressure_listener.cc b/base/memory/memory_pressure_listener.cc
index de63958b..11859ada 100644
--- a/base/memory/memory_pressure_listener.cc
+++ b/base/memory/memory_pressure_listener.cc
@@ -12,28 +12,48 @@
 
 namespace {
 
-// ObserverListThreadSafe is RefCountedThreadSafe, this traits is needed
-// to ensure the LazyInstance will hold a reference to it.
-struct LeakyLazyObserverListTraits :
-    base::internal::LeakyLazyInstanceTraits<
-        ObserverListThreadSafe<MemoryPressureListener> > {
-  static ObserverListThreadSafe<MemoryPressureListener>*
-      New(void* instance) {
-    ObserverListThreadSafe<MemoryPressureListener>* ret =
-        base::internal::LeakyLazyInstanceTraits<
-            ObserverListThreadSafe<MemoryPressureListener>>::New(instance);
-    // Leaky.
-    ret->AddRef();
-    return ret;
+class MemoryPressureObserver {
+ public:
+  MemoryPressureObserver()
+      : async_observers_(new ObserverListThreadSafe<MemoryPressureListener>),
+        sync_observers_(new ObserverList<MemoryPressureListener>) {
   }
+
+  void AddObserver(MemoryPressureListener* listener, bool sync) {
+    async_observers_->AddObserver(listener);
+    if (sync) {
+      AutoLock lock(sync_observers_lock_);
+      sync_observers_->AddObserver(listener);
+    }
+  }
+
+  void RemoveObserver(MemoryPressureListener* listener) {
+    async_observers_->RemoveObserver(listener);
+    AutoLock lock(sync_observers_lock_);
+    sync_observers_->RemoveObserver(listener);
+  }
+
+  void Notify(MemoryPressureListener::MemoryPressureLevel
+      memory_pressure_level) {
+    async_observers_->Notify(FROM_HERE,
+        &MemoryPressureListener::Notify, memory_pressure_level);
+    AutoLock lock(sync_observers_lock_);
+    FOR_EACH_OBSERVER(MemoryPressureListener, *sync_observers_,
+        MemoryPressureListener::SyncNotify(memory_pressure_level));
+  }
+
+ private:
+  scoped_refptr<ObserverListThreadSafe<MemoryPressureListener>>
+      async_observers_;
+  ObserverList<MemoryPressureListener>* sync_observers_;
+  Lock sync_observers_lock_;
+
+  DISALLOW_COPY_AND_ASSIGN(MemoryPressureObserver);
 };
 
-LazyInstance<
-    ObserverListThreadSafe<MemoryPressureListener>,
-    LeakyLazyObserverListTraits> g_observers = LAZY_INSTANCE_INITIALIZER;
+LazyInstance<MemoryPressureObserver>::Leaky g_observer =
+    LAZY_INSTANCE_INITIALIZER;
 
-// All memory pressure notifications within this process will be suppressed if
-// this variable is set to 1.
 subtle::Atomic32 g_notifications_suppressed = 0;
 
 }  // namespace
@@ -41,17 +61,33 @@
 MemoryPressureListener::MemoryPressureListener(
     const MemoryPressureListener::MemoryPressureCallback& callback)
     : callback_(callback) {
-  g_observers.Get().AddObserver(this);
+  g_observer.Get().AddObserver(this, false);
+}
+
+MemoryPressureListener::MemoryPressureListener(
+    const MemoryPressureListener::MemoryPressureCallback& callback,
+    const MemoryPressureListener::SyncMemoryPressureCallback&
+        sync_memory_pressure_callback)
+    : callback_(callback),
+      sync_memory_pressure_callback_(sync_memory_pressure_callback) {
+  g_observer.Get().AddObserver(this, true);
 }
 
 MemoryPressureListener::~MemoryPressureListener() {
-  g_observers.Get().RemoveObserver(this);
+  g_observer.Get().RemoveObserver(this);
 }
 
 void MemoryPressureListener::Notify(MemoryPressureLevel memory_pressure_level) {
   callback_.Run(memory_pressure_level);
 }
 
+void MemoryPressureListener::SyncNotify(
+    MemoryPressureLevel memory_pressure_level) {
+  if (!sync_memory_pressure_callback_.is_null()) {
+    sync_memory_pressure_callback_.Run(memory_pressure_level);
+  }
+}
+
 // static
 void MemoryPressureListener::NotifyMemoryPressure(
     MemoryPressureLevel memory_pressure_level) {
@@ -86,8 +122,8 @@
 void MemoryPressureListener::DoNotifyMemoryPressure(
     MemoryPressureLevel memory_pressure_level) {
   DCHECK_NE(memory_pressure_level, MEMORY_PRESSURE_LEVEL_NONE);
-  g_observers.Get().Notify(FROM_HERE, &MemoryPressureListener::Notify,
-                           memory_pressure_level);
+
+  g_observer.Get().Notify(memory_pressure_level);
 }
 
 }  // namespace base
diff --git a/base/memory/memory_pressure_listener.h b/base/memory/memory_pressure_listener.h
index a6ce702c..7e97010 100644
--- a/base/memory/memory_pressure_listener.h
+++ b/base/memory/memory_pressure_listener.h
@@ -51,22 +51,27 @@
     // No problems, there is enough memory to use. This event is not sent via
     // callback, but the enum is used in other places to find out the current
     // state of the system.
-    MEMORY_PRESSURE_LEVEL_NONE = -1,
+    MEMORY_PRESSURE_LEVEL_NONE,
 
     // Modules are advised to free buffers that are cheap to re-allocate and not
     // immediately needed.
-    MEMORY_PRESSURE_LEVEL_MODERATE = 0,
+    MEMORY_PRESSURE_LEVEL_MODERATE,
 
     // At this level, modules are advised to free all possible memory.  The
     // alternative is to be killed by the system, which means all memory will
     // have to be re-created, plus the cost of a cold start.
-    MEMORY_PRESSURE_LEVEL_CRITICAL = 2,
+    MEMORY_PRESSURE_LEVEL_CRITICAL,
   };
 
-  typedef base::Callback<void(MemoryPressureLevel)> MemoryPressureCallback;
+  typedef Callback<void(MemoryPressureLevel)> MemoryPressureCallback;
+  typedef Callback<void(MemoryPressureLevel)> SyncMemoryPressureCallback;
 
   explicit MemoryPressureListener(
       const MemoryPressureCallback& memory_pressure_callback);
+  MemoryPressureListener(
+      const MemoryPressureCallback& memory_pressure_callback,
+      const SyncMemoryPressureCallback& sync_memory_pressure_callback);
+
   ~MemoryPressureListener();
 
   // Intended for use by the platform specific implementation.
@@ -80,12 +85,14 @@
   static void SimulatePressureNotification(
       MemoryPressureLevel memory_pressure_level);
 
- private:
   void Notify(MemoryPressureLevel memory_pressure_level);
+  void SyncNotify(MemoryPressureLevel memory_pressure_level);
 
+ private:
   static void DoNotifyMemoryPressure(MemoryPressureLevel memory_pressure_level);
 
   MemoryPressureCallback callback_;
+  SyncMemoryPressureCallback sync_memory_pressure_callback_;
 
   DISALLOW_COPY_AND_ASSIGN(MemoryPressureListener);
 };
diff --git a/base/task_scheduler/scheduler_thread_pool_impl.cc b/base/task_scheduler/scheduler_thread_pool_impl.cc
index ab9bbf6..dc88a87 100644
--- a/base/task_scheduler/scheduler_thread_pool_impl.cc
+++ b/base/task_scheduler/scheduler_thread_pool_impl.cc
@@ -78,10 +78,12 @@
   bool PostDelayedTask(const tracked_objects::Location& from_here,
                        const Closure& closure,
                        TimeDelta delay) override {
+    std::unique_ptr<Task> task(new Task(from_here, closure, traits_, delay));
+    task->sequenced_task_runner_ref = this;
+
     // Post the task as part of |sequence_|.
-    return thread_pool_->PostTaskWithSequence(
-        WrapUnique(new Task(from_here, closure, traits_, delay)), sequence_,
-        nullptr);
+    return thread_pool_->PostTaskWithSequence(std::move(task), sequence_,
+                                              nullptr);
   }
 
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
@@ -125,10 +127,12 @@
   bool PostDelayedTask(const tracked_objects::Location& from_here,
                        const Closure& closure,
                        TimeDelta delay) override {
+    std::unique_ptr<Task> task(new Task(from_here, closure, traits_, delay));
+    task->single_thread_task_runner_ref = this;
+
     // Post the task to be executed by |worker_thread_| as part of |sequence_|.
-    return thread_pool_->PostTaskWithSequence(
-        WrapUnique(new Task(from_here, closure, traits_, delay)), sequence_,
-        worker_thread_);
+    return thread_pool_->PostTaskWithSequence(std::move(task), sequence_,
+                                              worker_thread_);
   }
 
   bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
diff --git a/base/task_scheduler/sequence.h b/base/task_scheduler/sequence.h
index b77576b4..37cb8d5b 100644
--- a/base/task_scheduler/sequence.h
+++ b/base/task_scheduler/sequence.h
@@ -22,6 +22,19 @@
 namespace internal {
 
 // A sequence holds tasks that must be executed in posting order.
+//
+// Note: there is a known refcounted-ownership cycle in the Scheduler
+// architecture: Sequence -> Task -> TaskRunner -> Sequence -> ...
+// This is okay so long as the other owners of Sequence (PriorityQueue and
+// SchedulerWorkerThread in alternance and
+// SchedulerThreadPoolImpl::SchedulerWorkerThreadDelegateImpl::GetWork()
+// temporarily) keep running it (and taking Tasks from it as a result). A
+// dangling reference cycle would only occur should they release their reference
+// to it while it's not empty. In other words, it is only correct for them to
+// release it after PopTask() returns false to indicate it was made empty by
+// that call (in which case the next PushTask() will return true to indicate to
+// the caller that the Sequence should be re-enqueued for execution).
+//
 // This class is thread-safe.
 class BASE_EXPORT Sequence : public RefCountedThreadSafe<Sequence> {
  public:
diff --git a/base/task_scheduler/task.h b/base/task_scheduler/task.h
index 010b29d..2b53c69 100644
--- a/base/task_scheduler/task.h
+++ b/base/task_scheduler/task.h
@@ -8,7 +8,11 @@
 #include "base/base_export.h"
 #include "base/callback_forward.h"
 #include "base/location.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
 #include "base/pending_task.h"
+#include "base/sequenced_task_runner.h"
+#include "base/single_thread_task_runner.h"
 #include "base/task_scheduler/task_traits.h"
 #include "base/time/time.h"
 
@@ -35,6 +39,23 @@
   // time after the task's delay has expired. If the task hasn't been inserted
   // in a sequence yet, this defaults to a null TimeTicks.
   TimeTicks sequenced_time;
+
+  // A reference to the SequencedTaskRunner or SingleThreadTaskRunner that
+  // posted this task, if any. Used to set ThreadTaskRunnerHandle and/or
+  // SequencedTaskRunnerHandle while the task is running.
+  // Note: this creates an ownership cycle
+  //   Sequence -> Task -> TaskRunner -> Sequence -> ...
+  // but that's okay as it's broken when the Task is popped from its Sequence
+  // after being executed which means this cycle forces the TaskRunner to stick
+  // around until all its tasks have been executed which is a requirement to
+  // support TaskRunnerHandles.
+  scoped_refptr<SequencedTaskRunner> sequenced_task_runner_ref;
+  scoped_refptr<SingleThreadTaskRunner> single_thread_task_runner_ref;
+
+ private:
+  // Disallow copies to make sure no unnecessary ref-bumps are incurred. Making
+  // it move-only would be an option, but isn't necessary for now.
+  DISALLOW_COPY_AND_ASSIGN(Task);
 };
 
 }  // namespace internal
diff --git a/base/task_scheduler/task_scheduler.cc b/base/task_scheduler/task_scheduler.cc
new file mode 100644
index 0000000..9104917e
--- /dev/null
+++ b/base/task_scheduler/task_scheduler.cc
@@ -0,0 +1,34 @@
+// Copyright 2016 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/task_scheduler/task_scheduler.h"
+
+#include "base/logging.h"
+
+namespace base {
+
+namespace {
+
+// |g_task_scheduler| is intentionally leaked on shutdown.
+TaskScheduler* g_task_scheduler = nullptr;
+
+}  // namespace
+
+// static
+void TaskScheduler::SetInstance(std::unique_ptr<TaskScheduler> task_scheduler) {
+  delete g_task_scheduler;
+  g_task_scheduler = task_scheduler.release();
+}
+
+// static
+void TaskScheduler::InitializeDefaultTaskScheduler() {
+  NOTIMPLEMENTED();
+}
+
+// static
+TaskScheduler* TaskScheduler::GetInstance() {
+  return g_task_scheduler;
+}
+
+}  // namespace base
diff --git a/base/task_scheduler/task_scheduler.h b/base/task_scheduler/task_scheduler.h
new file mode 100644
index 0000000..b8da64b
--- /dev/null
+++ b/base/task_scheduler/task_scheduler.h
@@ -0,0 +1,74 @@
+// Copyright 2016 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_TASK_SCHEDULER_TASK_SCHEDULER_H_
+#define BASE_TASK_SCHEDULER_TASK_SCHEDULER_H_
+
+#include <memory>
+
+#include "base/base_export.h"
+#include "base/callback_forward.h"
+#include "base/memory/ref_counted.h"
+#include "base/task_runner.h"
+#include "base/task_scheduler/task_traits.h"
+
+namespace tracked_objects {
+class Location;
+}
+
+namespace base {
+
+// Interface for a task scheduler and static methods to manage the instance used
+// by the post_task.h API.
+class BASE_EXPORT TaskScheduler {
+ public:
+  virtual ~TaskScheduler() = default;
+
+  // Posts |task| with specific |traits|.
+  // For one off tasks that don't require a TaskRunner.
+  virtual void PostTaskWithTraits(const tracked_objects::Location& from_here,
+                                  const TaskTraits& traits,
+                                  const Closure& task) = 0;
+
+  // Returns a TaskRunner whose PostTask invocations will result in scheduling
+  // Tasks with |traits| which will be executed according to |execution_mode|.
+  virtual scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits(
+      const TaskTraits& traits,
+      ExecutionMode execution_mode) = 0;
+
+  // Synchronously shuts down the scheduler. Once this is called, only tasks
+  // posted with the BLOCK_SHUTDOWN behavior will be run. When this returns:
+  // - All SKIP_ON_SHUTDOWN tasks that were already running have completed their
+  //   execution.
+  // - All posted BLOCK_SHUTDOWN tasks have completed their execution.
+  // - CONTINUE_ON_SHUTDOWN tasks might still be running.
+  // Note that an implementation can keep threads and other resources alive to
+  // support running CONTINUE_ON_SHUTDOWN after this returns. This can only be
+  // called once.
+  virtual void Shutdown() = 0;
+
+  // SetInstance() and InitializeDefaultTaskScheduler() register a TaskScheduler
+  // to handle tasks posted through the post_task.h API for this process. The
+  // registered TaskScheduler will only be deleted when a new TaskScheduler is
+  // registered (i.e. otherwise leaked on shutdown). The methods must not be
+  // called when TaskRunners created by the previous TaskScheduler are still
+  // alive. The methods are not thread-safe; proper synchronization is required
+  // to use the post_task.h API after registering a new TaskScheduler.
+
+  // Registers |task_scheduler| to handle tasks posted through the post_task.h
+  // API for this process.
+  static void SetInstance(std::unique_ptr<TaskScheduler> task_scheduler);
+
+  // Initializes the default task scheduler for this process.
+  static void InitializeDefaultTaskScheduler();
+
+  // Retrieve the TaskScheduler set via SetInstance() or
+  // InitializeDefaultTaskScheduler(). This should be used very rarely; most
+  // users of TaskScheduler should use the post_task.h API.
+  static TaskScheduler* GetInstance();
+};
+
+}  // namespace base
+
+#endif  // BASE_TASK_SCHEDULER_TASK_SCHEDULER_H_
diff --git a/base/task_scheduler/task_tracker.cc b/base/task_scheduler/task_tracker.cc
index 29951a6..f38ec061 100644
--- a/base/task_scheduler/task_tracker.cc
+++ b/base/task_scheduler/task_tracker.cc
@@ -7,6 +7,8 @@
 #include "base/callback.h"
 #include "base/debug/task_annotator.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/thread_task_runner_handle.h"
+#include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_restrictions.h"
 
 namespace base {
@@ -86,8 +88,23 @@
       task->traits.shutdown_behavior() !=
       TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN);
 
-  debug::TaskAnnotator task_annotator;
-  task_annotator.RunTask(kQueueFunctionName, *task);
+  {
+    // Set up TaskRunnerHandle as expected for the scope of the task.
+    std::unique_ptr<SequencedTaskRunnerHandle> sequenced_task_runner_handle;
+    std::unique_ptr<ThreadTaskRunnerHandle> single_thread_task_runner_handle;
+    DCHECK(!task->sequenced_task_runner_ref ||
+           !task->single_thread_task_runner_ref);
+    if (task->sequenced_task_runner_ref) {
+      sequenced_task_runner_handle.reset(
+          new SequencedTaskRunnerHandle(task->sequenced_task_runner_ref));
+    } else if (task->single_thread_task_runner_ref) {
+      single_thread_task_runner_handle.reset(
+          new ThreadTaskRunnerHandle(task->single_thread_task_runner_ref));
+    }
+
+    debug::TaskAnnotator task_annotator;
+    task_annotator.RunTask(kQueueFunctionName, *task);
+  }
 
   AfterRunTask(shutdown_behavior);
 }
diff --git a/base/task_scheduler/task_tracker.h b/base/task_scheduler/task_tracker.h
index 5bada90..795ae493 100644
--- a/base/task_scheduler/task_tracker.h
+++ b/base/task_scheduler/task_tracker.h
@@ -32,7 +32,8 @@
   // - All SKIP_ON_SHUTDOWN tasks that were already running have completed their
   //   execution.
   // - All posted BLOCK_SHUTDOWN tasks have completed their execution.
-  // This must only be called once.
+  // CONTINUE_ON_SHUTDOWN tasks still may be running after Shutdown returns.
+  // This can only be called once.
   void Shutdown();
 
   // Informs this TaskTracker that |task| is about to be posted. Returns true if
diff --git a/base/task_scheduler/task_tracker_unittest.cc b/base/task_scheduler/task_tracker_unittest.cc
index f3a8183f..ba5fd88e 100644
--- a/base/task_scheduler/task_tracker_unittest.cc
+++ b/base/task_scheduler/task_tracker_unittest.cc
@@ -10,11 +10,17 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
+#include "base/memory/ref_counted.h"
+#include "base/sequenced_task_runner.h"
+#include "base/single_thread_task_runner.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/task_scheduler/task.h"
 #include "base/task_scheduler/task_traits.h"
 #include "base/task_scheduler/test_utils.h"
+#include "base/test/test_simple_task_runner.h"
+#include "base/thread_task_runner_handle.h"
 #include "base/threading/platform_thread.h"
+#include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/simple_thread.h"
 #include "base/threading/thread_restrictions.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -50,7 +56,7 @@
 // Runs a task asynchronously.
 class ThreadRunningTask : public SimpleThread {
  public:
-  explicit ThreadRunningTask(TaskTracker* tracker, const Task* task)
+  ThreadRunningTask(TaskTracker* tracker, const Task* task)
       : SimpleThread("ThreadRunningTask"), tracker_(tracker), task_(task) {}
 
  private:
@@ -321,6 +327,86 @@
   }
 }
 
+static void RunTaskRunnerHandleVerificationTask(TaskTracker* tracker,
+                                         const Task* verify_task) {
+  // Pretend |verify_task| is posted to respect TaskTracker's contract.
+  EXPECT_TRUE(tracker->WillPostTask(verify_task));
+
+  // Confirm that the test conditions are right (no TaskRunnerHandles set
+  // already).
+  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
+  EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
+
+  tracker->RunTask(verify_task);
+
+  // TaskRunnerHandle state is reset outside of task's scope.
+  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
+  EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
+}
+
+static void VerifyNoTaskRunnerHandle() {
+  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
+  EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
+}
+
+TEST_P(TaskSchedulerTaskTrackerTest, TaskRunnerHandleIsNotSetOnParallel) {
+  // Create a task that will verify that TaskRunnerHandles are not set in its
+  // scope per no TaskRunner ref being set to it.
+  std::unique_ptr<Task> verify_task(
+      new Task(FROM_HERE, Bind(&VerifyNoTaskRunnerHandle),
+               TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta()));
+
+  RunTaskRunnerHandleVerificationTask(&tracker_, verify_task.get());
+}
+
+static void VerifySequencedTaskRunnerHandle(
+    const SequencedTaskRunner* expected_task_runner) {
+  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
+  EXPECT_TRUE(SequencedTaskRunnerHandle::IsSet());
+  EXPECT_EQ(expected_task_runner, SequencedTaskRunnerHandle::Get());
+}
+
+TEST_P(TaskSchedulerTaskTrackerTest,
+       SequencedTaskRunnerHandleIsSetOnSequenced) {
+  scoped_refptr<SequencedTaskRunner> test_task_runner(new TestSimpleTaskRunner);
+
+  // Create a task that will verify that SequencedTaskRunnerHandle is properly
+  // set to |test_task_runner| in its scope per |sequenced_task_runner_ref|
+  // being set to it.
+  std::unique_ptr<Task> verify_task(
+      new Task(FROM_HERE, Bind(&VerifySequencedTaskRunnerHandle,
+                               base::Unretained(test_task_runner.get())),
+               TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta()));
+  verify_task->sequenced_task_runner_ref = test_task_runner;
+
+  RunTaskRunnerHandleVerificationTask(&tracker_, verify_task.get());
+}
+
+static void VerifyThreadTaskRunnerHandle(
+    const SingleThreadTaskRunner* expected_task_runner) {
+  EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
+  // SequencedTaskRunnerHandle inherits ThreadTaskRunnerHandle for thread.
+  EXPECT_TRUE(SequencedTaskRunnerHandle::IsSet());
+  EXPECT_EQ(expected_task_runner, ThreadTaskRunnerHandle::Get());
+}
+
+TEST_P(TaskSchedulerTaskTrackerTest,
+       ThreadTaskRunnerHandleIsSetOnSingleThreaded) {
+  scoped_refptr<SingleThreadTaskRunner> test_task_runner(
+      new TestSimpleTaskRunner);
+
+  // Create a task that will verify that ThreadTaskRunnerHandle is properly set
+  // to |test_task_runner| in its scope per |single_thread_task_runner_ref|
+  // being set on it.
+  std::unique_ptr<Task> verify_task(
+      new Task(FROM_HERE, Bind(&VerifyThreadTaskRunnerHandle,
+                               base::Unretained(test_task_runner.get())),
+               TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta()));
+  verify_task->single_thread_task_runner_ref = test_task_runner;
+
+  RunTaskRunnerHandleVerificationTask(&tracker_, verify_task.get());
+}
+
 INSTANTIATE_TEST_CASE_P(
     ContinueOnShutdown,
     TaskSchedulerTaskTrackerTest,
diff --git a/base/task_scheduler/test_task_factory.cc b/base/task_scheduler/test_task_factory.cc
index 541caac..f6dab737 100644
--- a/base/task_scheduler/test_task_factory.cc
+++ b/base/task_scheduler/test_task_factory.cc
@@ -10,6 +10,8 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/thread_task_runner_handle.h"
+#include "base/threading/sequenced_task_runner_handle.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace base {
@@ -53,6 +55,27 @@
 
   EXPECT_TRUE(task_runner_->RunsTasksOnCurrentThread());
 
+  // Verify TaskRunnerHandles are set as expected in the task's scope.
+  switch (execution_mode_) {
+    case ExecutionMode::PARALLEL:
+      EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
+      EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
+      break;
+    case ExecutionMode::SEQUENCED:
+      EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
+      EXPECT_TRUE(SequencedTaskRunnerHandle::IsSet());
+      EXPECT_EQ(task_runner_, SequencedTaskRunnerHandle::Get());
+      break;
+    case ExecutionMode::SINGLE_THREADED:
+      // SequencedTaskRunnerHandle inherits from ThreadTaskRunnerHandle so
+      // both are expected to be "set" in the SINGLE_THREADED case.
+      EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
+      EXPECT_TRUE(SequencedTaskRunnerHandle::IsSet());
+      EXPECT_EQ(task_runner_, ThreadTaskRunnerHandle::Get());
+      EXPECT_EQ(task_runner_, SequencedTaskRunnerHandle::Get());
+      break;
+  }
+
   {
     AutoLock auto_lock(lock_);
 
diff --git a/base/task_scheduler/test_task_factory.h b/base/task_scheduler/test_task_factory.h
index 9102c7c5..9ed15a1 100644
--- a/base/task_scheduler/test_task_factory.h
+++ b/base/task_scheduler/test_task_factory.h
@@ -29,10 +29,12 @@
 // expected. Generates a test failure when:
 // - The RunsTasksOnCurrentThread() method of the TaskRunner returns false on a
 //   thread on which a Task is run.
+// - The TaskRunnerHandles set in the context of the task don't match what's
+//   expected for the tested ExecutionMode.
 // - The ExecutionMode of the TaskRunner is SEQUENCED or SINGLE_THREADED and
 //   Tasks don't run in posting order.
-// - The ExecutionMode of the TaskRunner is SINGLE_THREADED and Tasks don't
-//   run on the same thread.
+// - The ExecutionMode of the TaskRunner is SINGLE_THREADED and Tasks don't run
+//   on the same thread.
 // - A Task runs more than once.
 class TestTaskFactory {
  public:
diff --git a/base/test/multiprocess_test.h b/base/test/multiprocess_test.h
index ab1d0ca4..21e8951 100644
--- a/base/test/multiprocess_test.h
+++ b/base/test/multiprocess_test.h
@@ -66,6 +66,22 @@
 // may add any flags needed for your child process.
 CommandLine GetMultiProcessTestChildBaseCommandLine();
 
+#if defined(OS_ANDROID)
+
+// Enable the alternate test child implementation which support spawning a child
+// after threads have been created. If used, this MUST be the first line of
+// main(). The main function is passed in to avoid a link-time dependency in
+// component builds.
+void InitAndroidMultiProcessTestHelper(int (*main)(int, char**));
+
+// Wait for a test child to exit if the alternate test child implementation is
+// being used.
+bool AndroidWaitForChildExitWithTimeout(
+    const Process& process, TimeDelta timeout, int* exit_code)
+    WARN_UNUSED_RESULT;
+
+#endif  // defined(OS_ANDROID)
+
 // MultiProcessTest ------------------------------------------------------------
 
 // A MultiProcessTest is a test class which makes it easier to
diff --git a/base/test/multiprocess_test_android.cc b/base/test/multiprocess_test_android.cc
index dc489d1..52dc01fe 100644
--- a/base/test/multiprocess_test_android.cc
+++ b/base/test/multiprocess_test_android.cc
@@ -4,17 +4,379 @@
 
 #include "base/test/multiprocess_test.h"
 
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
 #include <unistd.h>
 
+#include <memory>
+#include <utility>
+#include <vector>
+
 #include "base/base_switches.h"
 #include "base/command_line.h"
 #include "base/containers/hash_tables.h"
+#include "base/lazy_instance.h"
 #include "base/logging.h"
+#include "base/macros.h"
+#include "base/pickle.h"
 #include "base/posix/global_descriptors.h"
+#include "base/posix/unix_domain_socket_linux.h"
 #include "testing/multiprocess_func_list.h"
 
 namespace base {
 
+namespace {
+
+const int kMaxMessageSize = 1024 * 1024;
+const int kFragmentSize = 4096;
+
+// Message sent between parent process and helper child process.
+enum class MessageType : uint32_t {
+  START_REQUEST,
+  START_RESPONSE,
+  WAIT_REQUEST,
+  WAIT_RESPONSE,
+};
+
+struct MessageHeader {
+  uint32_t size;
+  MessageType type;
+};
+
+struct StartProcessRequest {
+  MessageHeader header =
+      {sizeof(StartProcessRequest), MessageType::START_REQUEST};
+
+  uint32_t num_args = 0;
+  uint32_t num_fds = 0;
+};
+
+struct StartProcessResponse {
+  MessageHeader header =
+      {sizeof(StartProcessResponse), MessageType::START_RESPONSE};
+
+  pid_t child_pid;
+};
+
+struct WaitProcessRequest {
+  MessageHeader header =
+      {sizeof(WaitProcessRequest), MessageType::WAIT_REQUEST};
+
+  pid_t pid;
+  uint64_t timeout_ms;
+};
+
+struct WaitProcessResponse {
+  MessageHeader header =
+      {sizeof(WaitProcessResponse), MessageType::WAIT_RESPONSE};
+
+  bool success = false;
+  int32_t exit_code = 0;
+};
+
+// Helper class that implements an alternate test child launcher for
+// multi-process tests. The default implementation doesn't work if the child is
+// launched after starting threads. However, for some tests (i.e. Mojo), this
+// is necessary. This implementation works around that issue by forking a helper
+// process very early in main(), before any real work is done. Then, when a
+// child needs to be spawned, a message is sent to that helper process, which
+// then forks and returns the result to the parent. The forked child then calls
+// main() and things look as though a brand new process has been fork/exec'd.
+class LaunchHelper {
+ public:
+  using MainFunction = int (*)(int, char**);
+
+  LaunchHelper() {}
+
+  // Initialise the alternate test child implementation.
+  void Init(MainFunction main);
+
+  // Starts a child test helper process.
+  Process StartChildTestHelper(const std::string& procname,
+                               const CommandLine& base_command_line,
+                               const LaunchOptions& options);
+
+  // Waits for a child test helper process.
+  bool WaitForChildExitWithTimeout(const Process& process, TimeDelta timeout,
+                                   int* exit_code);
+
+  bool IsReady() const { return child_fd_ != -1; }
+  bool IsChild() const { return parent_fd_ != -1; }
+
+ private:
+  // Wrappers around sendmsg/recvmsg that supports message fragmentation.
+  void Send(int fd, const MessageHeader* msg, const std::vector<int>& fds);
+  ssize_t Recv(int fd, void* buf, std::vector<ScopedFD>* fds);
+
+  // Parent process implementation.
+  void DoParent(int fd);
+  // Helper process implementation.
+  void DoHelper(int fd);
+
+  void StartProcessInHelper(const StartProcessRequest* request,
+                           std::vector<ScopedFD> fds);
+  void WaitForChildInHelper(const WaitProcessRequest* request);
+
+  // Parent vars.
+  int child_fd_ = -1;
+
+  // Helper vars.
+  int parent_fd_ = -1;
+  MainFunction main_ = nullptr;
+
+  DISALLOW_COPY_AND_ASSIGN(LaunchHelper);
+};
+
+void LaunchHelper::Init(MainFunction main) {
+  main_ = main;
+
+  // Create a communication channel between the parent and child launch helper.
+  // fd[0] belongs to the parent, fd[1] belongs to the child.
+  int fds[2] = {-1, -1};
+  int rv = socketpair(AF_UNIX, SOCK_SEQPACKET, 0, fds);
+  PCHECK(rv == 0);
+  CHECK_NE(-1, fds[0]);
+  CHECK_NE(-1, fds[1]);
+
+  pid_t pid = fork();
+  PCHECK(pid >= 0) << "Fork failed";
+  if (pid) {
+    // Parent.
+    rv = close(fds[1]);
+    PCHECK(rv == 0);
+    DoParent(fds[0]);
+  } else {
+    // Helper.
+    rv = close(fds[0]);
+    PCHECK(rv == 0);
+    DoHelper(fds[1]);
+    NOTREACHED();
+    _exit(0);
+  }
+}
+
+void LaunchHelper::Send(
+    int fd, const MessageHeader* msg, const std::vector<int>& fds) {
+  uint32_t bytes_remaining = msg->size;
+  const char* buf = reinterpret_cast<const char*>(msg);
+  while (bytes_remaining) {
+    size_t send_size =
+        (bytes_remaining > kFragmentSize) ? kFragmentSize : bytes_remaining;
+    bool success = UnixDomainSocket::SendMsg(
+        fd, buf, send_size,
+        (bytes_remaining == msg->size) ? fds : std::vector<int>());
+    CHECK(success);
+    bytes_remaining -= send_size;
+    buf += send_size;
+  }
+}
+
+ssize_t LaunchHelper::Recv(int fd, void* buf, std::vector<ScopedFD>* fds) {
+  ssize_t size = UnixDomainSocket::RecvMsg(fd, buf, kFragmentSize, fds);
+  if (size <= 0)
+    return size;
+
+  const MessageHeader* header = reinterpret_cast<const MessageHeader*>(buf);
+  CHECK(header->size < kMaxMessageSize);
+  uint32_t bytes_remaining = header->size - size;
+  char* buffer = reinterpret_cast<char*>(buf);
+  buffer += size;
+  while (bytes_remaining) {
+    std::vector<ScopedFD> dummy_fds;
+    size = UnixDomainSocket::RecvMsg(fd, buffer, kFragmentSize, &dummy_fds);
+    if (size <= 0)
+      return size;
+
+    CHECK(dummy_fds.empty());
+    CHECK(size == kFragmentSize ||
+          static_cast<size_t>(size) == bytes_remaining);
+    bytes_remaining -= size;
+    buffer += size;
+  }
+  return header->size;
+}
+
+void LaunchHelper::DoParent(int fd) {
+  child_fd_ = fd;
+}
+
+void LaunchHelper::DoHelper(int fd) {
+  parent_fd_ = fd;
+  std::unique_ptr<char[]> buf(new char[kMaxMessageSize]);
+  while (true) {
+    // Wait for a message from the parent.
+    std::vector<ScopedFD> fds;
+    ssize_t size = Recv(parent_fd_, buf.get(), &fds);
+    if (size == 0 || (size < 0 && errno == ECONNRESET)) {
+      _exit(0);
+    }
+    PCHECK(size > 0);
+
+    const MessageHeader* header =
+        reinterpret_cast<const MessageHeader*>(buf.get());
+    CHECK_EQ(static_cast<ssize_t>(header->size), size);
+    switch (header->type) {
+      case MessageType::START_REQUEST:
+        StartProcessInHelper(
+            reinterpret_cast<const StartProcessRequest*>(buf.get()),
+            std::move(fds));
+        break;
+      case MessageType::WAIT_REQUEST:
+        WaitForChildInHelper(
+            reinterpret_cast<const WaitProcessRequest*>(buf.get()));
+        break;
+      default:
+        LOG(FATAL) << "Unsupported message type: "
+                   << static_cast<uint32_t>(header->type);
+    }
+  }
+}
+
+void LaunchHelper::StartProcessInHelper(const StartProcessRequest* request,
+                                        std::vector<ScopedFD> fds) {
+  pid_t pid = fork();
+  PCHECK(pid >= 0) << "Fork failed";
+  if (pid) {
+    // Helper.
+    StartProcessResponse resp;
+    resp.child_pid = pid;
+    Send(parent_fd_, reinterpret_cast<const MessageHeader*>(&resp),
+         std::vector<int>());
+  } else {
+    // Child.
+    PCHECK(close(parent_fd_) == 0);
+    CommandLine::Reset();
+
+    Pickle serialised_extra(reinterpret_cast<const char*>(request + 1),
+                            request->header.size - sizeof(StartProcessRequest));
+    PickleIterator iter(serialised_extra);
+    std::vector<std::string> args;
+    for (size_t i = 0; i < request->num_args; i++) {
+      std::string arg;
+      CHECK(iter.ReadString(&arg));
+      args.push_back(std::move(arg));
+    }
+
+    CHECK_EQ(request->num_fds, fds.size());
+    for (size_t i = 0; i < request->num_fds; i++) {
+      int new_fd;
+      CHECK(iter.ReadInt(&new_fd));
+      int old_fd = fds[i].release();
+      if (dup2(old_fd, new_fd) < 0) {
+        PLOG(FATAL) << "dup2";
+      }
+      PCHECK(close(old_fd) == 0);
+    }
+
+    std::unique_ptr<char*[]> argv(new char*[args.size()]);
+    for (size_t i = 0; i < args.size(); i++) {
+      argv[i] = const_cast<char*>(args[i].c_str());
+    }
+    _exit(main_(args.size(), argv.get()));
+    NOTREACHED();
+  }
+}
+
+void LaunchHelper::WaitForChildInHelper(const WaitProcessRequest* request) {
+  Process process(request->pid);
+  TimeDelta timeout = TimeDelta::FromMilliseconds(request->timeout_ms);
+  int exit_code = -1;
+  bool success = process.WaitForExitWithTimeout(timeout, &exit_code);
+
+  WaitProcessResponse resp;
+  resp.exit_code = exit_code;
+  resp.success = success;
+  Send(parent_fd_, reinterpret_cast<const MessageHeader*>(&resp),
+       std::vector<int>());
+}
+
+Process LaunchHelper::StartChildTestHelper(const std::string& procname,
+                                           const CommandLine& base_command_line,
+                                           const LaunchOptions& options) {
+
+  CommandLine command_line(base_command_line);
+  if (!command_line.HasSwitch(switches::kTestChildProcess))
+    command_line.AppendSwitchASCII(switches::kTestChildProcess, procname);
+
+  StartProcessRequest request;
+  Pickle serialised_extra;
+  const CommandLine::StringVector& argv = command_line.argv();
+  for (const auto& arg : argv)
+    CHECK(serialised_extra.WriteString(arg));
+  request.num_args = argv.size();
+
+  std::vector<int> fds_to_send;
+  if (options.fds_to_remap) {
+    for (auto p : *options.fds_to_remap) {
+      CHECK(serialised_extra.WriteInt(p.second));
+      fds_to_send.push_back(p.first);
+    }
+    request.num_fds = options.fds_to_remap->size();
+  }
+
+  size_t buf_size = sizeof(StartProcessRequest) + serialised_extra.size();
+  request.header.size = buf_size;
+  std::unique_ptr<char[]> buffer(new char[buf_size]);
+  memcpy(buffer.get(), &request, sizeof(StartProcessRequest));
+  memcpy(buffer.get() + sizeof(StartProcessRequest), serialised_extra.data(),
+         serialised_extra.size());
+
+  // Send start message.
+  Send(child_fd_, reinterpret_cast<const MessageHeader*>(buffer.get()),
+       fds_to_send);
+
+  // Synchronously get response.
+  StartProcessResponse response;
+  std::vector<ScopedFD> recv_fds;
+  ssize_t resp_size = Recv(child_fd_, &response, &recv_fds);
+  PCHECK(resp_size == sizeof(StartProcessResponse));
+
+  return Process(response.child_pid);
+}
+
+bool LaunchHelper::WaitForChildExitWithTimeout(
+    const Process& process, TimeDelta timeout, int* exit_code) {
+
+  WaitProcessRequest request;
+  request.pid = process.Handle();
+  request.timeout_ms = timeout.InMilliseconds();
+
+  Send(child_fd_, reinterpret_cast<const MessageHeader*>(&request),
+       std::vector<int>());
+
+  WaitProcessResponse response;
+  std::vector<ScopedFD> recv_fds;
+  ssize_t resp_size = Recv(child_fd_, &response, &recv_fds);
+  PCHECK(resp_size == sizeof(WaitProcessResponse));
+
+  if (!response.success)
+    return false;
+
+  *exit_code = response.exit_code;
+  return true;
+}
+
+LazyInstance<LaunchHelper>::Leaky g_launch_helper;
+
+}  // namespace
+
+void InitAndroidMultiProcessTestHelper(int (*main)(int, char**)) {
+  DCHECK(main);
+  // Don't allow child processes to themselves create new child processes.
+  if (g_launch_helper.Get().IsChild())
+    return;
+  g_launch_helper.Get().Init(main);
+}
+
+bool AndroidWaitForChildExitWithTimeout(
+    const Process& process, TimeDelta timeout, int* exit_code) {
+  CHECK(g_launch_helper.Get().IsReady());
+  return g_launch_helper.Get().WaitForChildExitWithTimeout(
+      process, timeout, exit_code);
+}
+
 // A very basic implementation for Android. On Android tests can run in an APK
 // and we don't have an executable to exec*. This implementation does the bare
 // minimum to execute the method specified by procname (in the child process).
@@ -22,6 +384,11 @@
 Process SpawnMultiProcessTestChild(const std::string& procname,
                                    const CommandLine& base_command_line,
                                    const LaunchOptions& options) {
+  if (g_launch_helper.Get().IsReady()) {
+    return g_launch_helper.Get().StartChildTestHelper(
+        procname, base_command_line, options);
+  }
+
   // TODO(viettrungluu): The FD-remapping done below is wrong in the presence of
   // cycles (e.g., fd1 -> fd2, fd2 -> fd1). crbug.com/326576
   FileHandleMappingVector empty;
diff --git a/base/thread_task_runner_handle.cc b/base/thread_task_runner_handle.cc
index 911e90c..3a3f14b 100644
--- a/base/thread_task_runner_handle.cc
+++ b/base/thread_task_runner_handle.cc
@@ -4,15 +4,19 @@
 
 #include "base/thread_task_runner_handle.h"
 
+#include <utility>
+
 #include "base/lazy_instance.h"
+#include "base/logging.h"
 #include "base/single_thread_task_runner.h"
+#include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_local.h"
 
 namespace base {
 
 namespace {
 
-base::LazyInstance<base::ThreadLocalPointer<ThreadTaskRunnerHandle> >::Leaky
+base::LazyInstance<base::ThreadLocalPointer<ThreadTaskRunnerHandle>>::Leaky
     lazy_tls_ptr = LAZY_INSTANCE_INITIALIZER;
 
 }  // namespace
@@ -26,21 +30,23 @@
 
 // static
 bool ThreadTaskRunnerHandle::IsSet() {
-  return lazy_tls_ptr.Pointer()->Get() != NULL;
+  return !!lazy_tls_ptr.Pointer()->Get();
 }
 
 ThreadTaskRunnerHandle::ThreadTaskRunnerHandle(
     scoped_refptr<SingleThreadTaskRunner> task_runner)
     : task_runner_(std::move(task_runner)) {
   DCHECK(task_runner_->BelongsToCurrentThread());
-  DCHECK(!lazy_tls_ptr.Pointer()->Get());
+  // No SequencedTaskRunnerHandle (which includes ThreadTaskRunnerHandles)
+  // should already be set for this thread.
+  DCHECK(!SequencedTaskRunnerHandle::IsSet());
   lazy_tls_ptr.Pointer()->Set(this);
 }
 
 ThreadTaskRunnerHandle::~ThreadTaskRunnerHandle() {
   DCHECK(task_runner_->BelongsToCurrentThread());
   DCHECK_EQ(lazy_tls_ptr.Pointer()->Get(), this);
-  lazy_tls_ptr.Pointer()->Set(NULL);
+  lazy_tls_ptr.Pointer()->Set(nullptr);
 }
 
 }  // namespace base
diff --git a/base/thread_task_runner_handle.h b/base/thread_task_runner_handle.h
index 2a6282bf..d00f61a 100644
--- a/base/thread_task_runner_handle.h
+++ b/base/thread_task_runner_handle.h
@@ -6,6 +6,7 @@
 #define BASE_THREAD_TASK_RUNNER_HANDLE_H_
 
 #include "base/base_export.h"
+#include "base/macros.h"
 #include "base/memory/ref_counted.h"
 
 namespace base {
@@ -34,6 +35,8 @@
 
  private:
   scoped_refptr<SingleThreadTaskRunner> task_runner_;
+
+  DISALLOW_COPY_AND_ASSIGN(ThreadTaskRunnerHandle);
 };
 
 }  // namespace base
diff --git a/base/threading/sequenced_task_runner_handle.cc b/base/threading/sequenced_task_runner_handle.cc
index 081f11f7..6bc75fa 100644
--- a/base/threading/sequenced_task_runner_handle.cc
+++ b/base/threading/sequenced_task_runner_handle.cc
@@ -4,28 +4,66 @@
 
 #include "base/threading/sequenced_task_runner_handle.h"
 
+#include <utility>
+
+#include "base/lazy_instance.h"
+#include "base/logging.h"
 #include "base/sequenced_task_runner.h"
 #include "base/thread_task_runner_handle.h"
 #include "base/threading/sequenced_worker_pool.h"
+#include "base/threading/thread_local.h"
 
 namespace base {
 
+namespace {
+
+base::LazyInstance<base::ThreadLocalPointer<SequencedTaskRunnerHandle>>::Leaky
+    lazy_tls_ptr = LAZY_INSTANCE_INITIALIZER;
+
+}  // namespace
+
 // static
 scoped_refptr<SequencedTaskRunner> SequencedTaskRunnerHandle::Get() {
-  // Return the SequencedTaskRunner if found or the SingleThreadedTaskRunner for
-  // the current thread otherwise.
+  // Return the registered SequencedTaskRunner, if any.
+  const SequencedTaskRunnerHandle* handle = lazy_tls_ptr.Pointer()->Get();
+  if (handle) {
+    // Various modes of setting SequencedTaskRunnerHandle don't combine.
+    DCHECK(!base::ThreadTaskRunnerHandle::IsSet());
+    DCHECK(!SequencedWorkerPool::GetSequencedTaskRunnerForCurrentThread());
+    return handle->task_runner_;
+  }
+
+  // Return the SequencedTaskRunner obtained from SequencedWorkerPool, if any.
   scoped_refptr<base::SequencedTaskRunner> task_runner =
       SequencedWorkerPool::GetSequencedTaskRunnerForCurrentThread();
-  if (task_runner)
+  if (task_runner) {
+    DCHECK(!base::ThreadTaskRunnerHandle::IsSet());
     return task_runner;
+  }
 
+  // Return the SingleThreadTaskRunner for the current thread otherwise.
   return base::ThreadTaskRunnerHandle::Get();
 }
 
 // static
 bool SequencedTaskRunnerHandle::IsSet() {
-  return SequencedWorkerPool::GetWorkerPoolForCurrentThread() ||
+  return lazy_tls_ptr.Pointer()->Get() ||
+         SequencedWorkerPool::GetWorkerPoolForCurrentThread() ||
          base::ThreadTaskRunnerHandle::IsSet();
 }
 
+SequencedTaskRunnerHandle::SequencedTaskRunnerHandle(
+    scoped_refptr<SequencedTaskRunner> task_runner)
+    : task_runner_(std::move(task_runner)) {
+  DCHECK(task_runner_->RunsTasksOnCurrentThread());
+  DCHECK(!SequencedTaskRunnerHandle::IsSet());
+  lazy_tls_ptr.Pointer()->Set(this);
+}
+
+SequencedTaskRunnerHandle::~SequencedTaskRunnerHandle() {
+  DCHECK(task_runner_->RunsTasksOnCurrentThread());
+  DCHECK_EQ(lazy_tls_ptr.Pointer()->Get(), this);
+  lazy_tls_ptr.Pointer()->Set(nullptr);
+}
+
 }  // namespace base
diff --git a/base/threading/sequenced_task_runner_handle.h b/base/threading/sequenced_task_runner_handle.h
index 7084ec4b..e6da18d2 100644
--- a/base/threading/sequenced_task_runner_handle.h
+++ b/base/threading/sequenced_task_runner_handle.h
@@ -22,14 +22,23 @@
   static scoped_refptr<SequencedTaskRunner> Get();
 
   // Returns true if one of the following conditions is fulfilled:
-  // a) The current thread has a ThreadTaskRunnerHandle (which includes any
+  // a) A SequencedTaskRunner has been assigned to the current thread by
+  //    instantiating a SequencedTaskRunnerHandle.
+  // b) The current thread has a ThreadTaskRunnerHandle (which includes any
   //    thread that has a MessageLoop associated with it), or
-  // b) The current thread is a worker thread belonging to a
+  // c) The current thread is a worker thread belonging to a
   //    SequencedWorkerPool.
   static bool IsSet();
 
+  // Binds |task_runner| to the current thread.
+  explicit SequencedTaskRunnerHandle(
+      scoped_refptr<SequencedTaskRunner> task_runner);
+  ~SequencedTaskRunnerHandle();
+
  private:
-  DISALLOW_IMPLICIT_CONSTRUCTORS(SequencedTaskRunnerHandle);
+  scoped_refptr<SequencedTaskRunner> task_runner_;
+
+  DISALLOW_COPY_AND_ASSIGN(SequencedTaskRunnerHandle);
 };
 
 }  // namespace base
diff --git a/base/threading/sequenced_task_runner_handle_unittest.cc b/base/threading/sequenced_task_runner_handle_unittest.cc
index ad7d70c..1ec21696 100644
--- a/base/threading/sequenced_task_runner_handle_unittest.cc
+++ b/base/threading/sequenced_task_runner_handle_unittest.cc
@@ -16,6 +16,8 @@
 #include "base/sequenced_task_runner.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/test/sequenced_worker_pool_owner.h"
+#include "base/test/test_simple_task_runner.h"
+#include "base/thread_task_runner_handle.h"
 #include "base/threading/sequenced_worker_pool.h"
 #include "base/threading/simple_thread.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -84,21 +86,18 @@
   event.Wait();
 }
 
-class ThreadRunner : public DelegateSimpleThread::Delegate {
- public:
-  void Run() override {
-    ASSERT_FALSE(SequencedTaskRunnerHandle::IsSet());
+TEST(SequencedTaskRunnerHandleTestWithoutMessageLoop, FromHandleInScope) {
+  scoped_refptr<SequencedTaskRunner> test_task_runner(new TestSimpleTaskRunner);
+  EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
+  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
+  {
+    SequencedTaskRunnerHandle handle(test_task_runner);
+    EXPECT_TRUE(SequencedTaskRunnerHandle::IsSet());
+    EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
+    EXPECT_EQ(test_task_runner, SequencedTaskRunnerHandle::Get());
   }
-
- private:
-  Closure callback_;
-};
-
-TEST_F(SequencedTaskRunnerHandleTest, FromSimpleThread) {
-  ThreadRunner thread_runner;
-  DelegateSimpleThread thread(&thread_runner, "Background thread");
-  thread.Start();
-  thread.Join();
+  EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
+  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
 }
 
 }  // namespace
diff --git a/blimp/client/BUILD.gn b/blimp/client/BUILD.gn
index 9f59d259..1bc9217a 100644
--- a/blimp/client/BUILD.gn
+++ b/blimp/client/BUILD.gn
@@ -306,7 +306,7 @@
       "values-uk/android_blimp_strings.xml",
       "values-vi/android_blimp_strings.xml",
       "values-zh-rCN/android_blimp_strings.xml",
-      "values-zh-rTW/android_blimp_strings.xml",
+      "values-zh/android_blimp_strings.xml",
     ]
   }
 
diff --git a/blimp/client/app/android/java/src/org/chromium/blimp/BlimpLibraryLoader.java b/blimp/client/app/android/java/src/org/chromium/blimp/BlimpLibraryLoader.java
index 3463887..290c4dbb 100644
--- a/blimp/client/app/android/java/src/org/chromium/blimp/BlimpLibraryLoader.java
+++ b/blimp/client/app/android/java/src/org/chromium/blimp/BlimpLibraryLoader.java
@@ -7,7 +7,6 @@
 import android.content.Context;
 import android.os.Handler;
 
-import org.chromium.base.ContextUtils;
 import org.chromium.base.ObserverList;
 import org.chromium.base.ResourceExtractor;
 import org.chromium.base.ThreadUtils;
@@ -91,7 +90,6 @@
         extractor.addCompletionCallback(new Runnable() {
             @Override
             public void run() {
-                ContextUtils.initApplicationContext(context.getApplicationContext());
                 new Handler().post(new Runnable() {
                     @Override
                     public void run() {
diff --git a/blimp/client/app/android/java/strings/android_blimp_strings.grd b/blimp/client/app/android/java/strings/android_blimp_strings.grd
index 6ff4210e..c6a32a0a 100644
--- a/blimp/client/app/android/java/strings/android_blimp_strings.grd
+++ b/blimp/client/app/android/java/strings/android_blimp_strings.grd
@@ -44,7 +44,7 @@
     <output filename="values-uk/android_blimp_strings.xml" lang="uk" type="android" />
     <output filename="values-vi/android_blimp_strings.xml" lang="vi" type="android" />
     <output filename="values-zh-rCN/android_blimp_strings.xml" lang="zh-CN" type="android" />
-    <output filename="values-zh-rTW/android_blimp_strings.xml" lang="zh-TW" type="android" />
+    <output filename="values-zh/android_blimp_strings.xml" lang="zh-TW" type="android" />
   </outputs>
   <translations>
     <file lang="am" path="translations/android_blimp_strings_am.xtb" />
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_am.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_am.xtb
index 10777ed..b94c164 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_am.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_am.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">የስሪት መረጃ</translation>
 <translation id="2117453604279487107">የመዳቢ ዩአርኤል</translation>
 <translation id="2353984724370197742">ምደባ አልተሳካም። የአውታረ መረብ ጥያቄ አልተሳካም።</translation>
+<translation id="2789927415041640472">አዲሱን የመዳቢ ውቅረትን ለመጠቀም እባክዎ መተግበሪያውን ዳግም ያስጀምሩት።</translation>
 <translation id="3046825211487065480">ምደባ አልተሳካም። ሁለተኛው ጥያቄ ከመጀመሪያው ጥያቄ መልስ ከመስጠቱ በፊት ተልኳል።</translation>
 <translation id="3286538390144397061">አሁን ዳግም አስጀምር</translation>
 <translation id="3346106862344060497">ሞተር ተገናኝቷል።</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">ምደባ አልተሳካም። መለያ መዳረሻ የለውም።</translation>
 <translation id="6232798399907177395">ስለBlimp</translation>
 <translation id="704835510384979817">ምደባ አልተሳካም። ምንም ተዛማጅ የፕሮግራም ስሪት የለም።</translation>
+<translation id="7145680970336344212">Blimpን ዳግም ያስጀምሩት</translation>
 <translation id="7536363920335771251">የሞተር ግንኙነት ተቋርጧል፣ ምክንያት፦ %1$s</translation>
 <translation id="7596558890252710462">ስርዓተ ክወና</translation>
 <translation id="7608553142876436780">የፕሮግራም አይፒ</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ar.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ar.xtb
index 0b84288..30b4c61 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ar.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ar.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">معلومات الإصدار</translation>
 <translation id="2117453604279487107">‏عنوان URL للمعيّن</translation>
 <translation id="2353984724370197742">أخفق التعيين.  أخفق طلب الشبكة.</translation>
+<translation id="2789927415041640472">يُرجى إعادة تشغيل التطبيق لاستخدام تهيئة المعيّن الجديدة.</translation>
 <translation id="3046825211487065480">أخفق التعيين. تم إرسال الطلب الثاني قبل استجابة الطلب الأول.</translation>
 <translation id="3286538390144397061">إعادة التشغيل الآن</translation>
 <translation id="3346106862344060497">المحرك متصل.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">أخفق التعيين. لا تتوفر إمكانية الدخول إلى الحساب.</translation>
 <translation id="6232798399907177395">‏حول Blimp</translation>
 <translation id="704835510384979817">أخفق التعيين. لا يوجد إصدار محرك مطابق.</translation>
+<translation id="7145680970336344212">‏إعادة تشغيل Blimp</translation>
 <translation id="7536363920335771251">‏المحرك غير متصل، والسبب: %1$s</translation>
 <translation id="7596558890252710462">نظام التشغيل</translation>
 <translation id="7608553142876436780">‏عنوان IP للمحرك</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_bg.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_bg.xtb
index 7700071a..e9aa68a 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_bg.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_bg.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Информация за версията</translation>
 <translation id="2117453604279487107">URL адрес на възложителя</translation>
 <translation id="2353984724370197742">Получаването на заданието не бе успешно поради проблем с мрежовата заявка.</translation>
+<translation id="2789927415041640472">Моля, рестартирайте приложението, за да използвате новата конфигурация за възложител.</translation>
 <translation id="3046825211487065480">Получаването на заданието не бе успешно. Изпратена е втора заявка, преди да е постъпил отговор за първата.</translation>
 <translation id="3286538390144397061">Рестартиране сега</translation>
 <translation id="3346106862344060497">Установена е връзка с машината.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Получаването на заданието не бе успешно. Профилът няма достъп.</translation>
 <translation id="6232798399907177395">Всичко за Blimp</translation>
 <translation id="704835510384979817">Получаването на заданието не бе успешно. Няма съответстваща версия на машина.</translation>
+<translation id="7145680970336344212">Рестартиране на Blimp</translation>
 <translation id="7536363920335771251">Връзката с машината е прекратена поради следната причина: %1$s</translation>
 <translation id="7596558890252710462">Операционна система</translation>
 <translation id="7608553142876436780">IP адрес на машината</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ca.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ca.xtb
index 53b8a57..3d4d3e0 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ca.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ca.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Informació de la versió</translation>
 <translation id="2117453604279487107">URL de l'eina d'assignació</translation>
 <translation id="2353984724370197742">No s'ha pogut obtenir l'assignació. S'ha produït un error a la sol·licitud de xarxa.</translation>
+<translation id="2789927415041640472">Reinicieu l'aplicació per poder utilitzar la nova configuració de l'eina d'assignació.</translation>
 <translation id="3046825211487065480">No s'ha pogut obtenir l'assignació. La segona sol·licitud s'ha enviat abans de rebre resposta per a la primera.</translation>
 <translation id="3286538390144397061">Reinicia ara</translation>
 <translation id="3346106862344060497">El motor s'ha connectat.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">No s'ha pogut obtenir l'assignació. El compte no hi té accés.</translation>
 <translation id="6232798399907177395">Sobre Blimp</translation>
 <translation id="704835510384979817">No s'ha pogut obtenir l'assignació. La versió del motor no és correcta.</translation>
+<translation id="7145680970336344212">Reinicieu Blimp</translation>
 <translation id="7536363920335771251">El motor s'ha desconnectat pel motiu següent: %1$s</translation>
 <translation id="7596558890252710462">Sistema operatiu</translation>
 <translation id="7608553142876436780">IP del motor</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_cs.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_cs.xtb
index a39f048c..0d6a0e0 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_cs.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_cs.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Informace o verzi</translation>
 <translation id="2117453604279487107">URL zadavatele</translation>
 <translation id="2353984724370197742">Přidružení se nezdařilo. Síťový požadavek se nezdařil.</translation>
+<translation id="2789927415041640472">Chcete-li používat novou konfiguraci přiřazovače, restartujte aplikaci.</translation>
 <translation id="3046825211487065480">Přidružení se nezdařilo. Druhý požadavek byl odeslán ještě před přijetím odpovědi na první požadavek.</translation>
 <translation id="3286538390144397061">Restartovat</translation>
 <translation id="3346106862344060497">Vyhledávač byl připojen.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Přidružení se nezdařilo. Účet nemá přístup.</translation>
 <translation id="6232798399907177395">O projektu Blimp</translation>
 <translation id="704835510384979817">Přidružení se nezdařilo. Není k dispozici odpovídající verze modulu.</translation>
+<translation id="7145680970336344212">Restartovat Blimp</translation>
 <translation id="7536363920335771251">Vyhledávač byl odpojen. Důvod: %1$s</translation>
 <translation id="7596558890252710462">Operační systém</translation>
 <translation id="7608553142876436780">IP adresa jádra</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_da.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_da.xtb
index d4a57e1..f6eb60a 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_da.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_da.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Oplysninger om version</translation>
 <translation id="2117453604279487107">Tildelerwebadresse</translation>
 <translation id="2353984724370197742">Tildelingen mislykkedes. Netværksanmodningen mislykkedes.</translation>
+<translation id="2789927415041640472">Genstart applikationen for at bruge den nye tildelerkonfiguration.</translation>
 <translation id="3046825211487065480">Tildelingen mislykkedes. Anden anmodning blev sendt, før første anmodning reagerede.</translation>
 <translation id="3286538390144397061">Genstart nu</translation>
 <translation id="3346106862344060497">Maskinen er tilsluttet.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Tildelingen mislykkedes. Kontoen har ikke adgang.</translation>
 <translation id="6232798399907177395">Om Blimp</translation>
 <translation id="704835510384979817">Tildelingen mislykkedes. Ingen matchende maskinversion.</translation>
+<translation id="7145680970336344212">Genstart Blimp</translation>
 <translation id="7536363920335771251">Forbindelsen til maskinen blev afbrudt. Årsag: %1$s</translation>
 <translation id="7596558890252710462">Operativsystem</translation>
 <translation id="7608553142876436780">IP-adresse for maskinen</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_de.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_de.xtb
index 06cdac3..f8f3385 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_de.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_de.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Versionsinformationen</translation>
 <translation id="2117453604279487107">Übertragenden-URL</translation>
 <translation id="2353984724370197742">Zuweisung fehlgeschlagen. Netzwerkanfrage fehlgeschlagen.</translation>
+<translation id="2789927415041640472">Bitte starten Sie die App neu, um die neue Übertragendenkonfiguration zu verwenden.</translation>
 <translation id="3046825211487065480">Zuweisung fehlgeschlagen. Zweite Anfrage wurde vor Antwort auf erste Anfrage gesendet.</translation>
 <translation id="3286538390144397061">Jetzt neu starten</translation>
 <translation id="3346106862344060497">Modul verbunden.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Zuweisung fehlgeschlagen. Konto hat keinen Zugriff.</translation>
 <translation id="6232798399907177395">Infos zu Blimp</translation>
 <translation id="704835510384979817">Zuweisung fehlgeschlagen. Keine übereinstimmende Modulversion.</translation>
+<translation id="7145680970336344212">Starten Sie Blimp neu</translation>
 <translation id="7536363920335771251">Modul getrennt, Grund: %1$s</translation>
 <translation id="7596558890252710462">Betriebssystem</translation>
 <translation id="7608553142876436780">Modul-IP</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_el.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_el.xtb
index 2231e38..6c69e97f 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_el.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_el.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Πληροφορίες έκδοσης</translation>
 <translation id="2117453604279487107">URL εφαρμογής αντιστοίχισης</translation>
 <translation id="2353984724370197742">Η ανάθεση απέτυχε. Το αίτημα δικτύου απέτυχε.</translation>
+<translation id="2789927415041640472">Επανεκκινήστε την εφαρμογή για να χρησιμοποιήσετε τη νέα διαμόρφωση εκχώρησης.</translation>
 <translation id="3046825211487065480">Η ανάθεση απέτυχε. Εστάλη δεύτερο αίτημα πριν από την απόκριση στο πρώτο αίτημα.</translation>
 <translation id="3286538390144397061">Άμεση επανεκκίνηση</translation>
 <translation id="3346106862344060497">Η μηχανή συνδέθηκε.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Η ανάθεση απέτυχε. Ο λογαριασμός δεν έχει πρόσβαση.</translation>
 <translation id="6232798399907177395">Σχετικά με το Blimp</translation>
 <translation id="704835510384979817">Η ανάθεση απέτυχε. Η έκδοση μηχανής δεν αντιστοιχεί.</translation>
+<translation id="7145680970336344212">Επανεκκίνηση Blimp</translation>
 <translation id="7536363920335771251">Η μηχανή αποσυνδέθηκε. Αιτία: %1$s</translation>
 <translation id="7596558890252710462">Λειτουργικό σύστημα</translation>
 <translation id="7608553142876436780">Διεύθυνση IP μηχανής</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_en-GB.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_en-GB.xtb
index 4dc5e75..e2309ed 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_en-GB.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_en-GB.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Version Info</translation>
 <translation id="2117453604279487107">Assigner URL</translation>
 <translation id="2353984724370197742">Assignment failed. Network request failed.</translation>
+<translation id="2789927415041640472">Please restart the application to use the new assigner configuration.</translation>
 <translation id="3046825211487065480">Assignment failed. Second request sent before first request responded.</translation>
 <translation id="3286538390144397061">Restart Now</translation>
 <translation id="3346106862344060497">Engine connected.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Assignment failed. Account does not have access.</translation>
 <translation id="6232798399907177395">About Blimp</translation>
 <translation id="704835510384979817">Assignment failed. No matching engine version.</translation>
+<translation id="7145680970336344212">Restart Blimp</translation>
 <translation id="7536363920335771251">Engine disconnected, reason: %1$s</translation>
 <translation id="7596558890252710462">Operating system</translation>
 <translation id="7608553142876436780">Engine IP</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_es.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_es.xtb
index 4f546d18..c9303fb 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_es.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_es.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Información sobre la versión</translation>
 <translation id="2117453604279487107">URL del asignador</translation>
 <translation id="2353984724370197742">Ha fallado la asignación. Error en la solicitud de red.</translation>
+<translation id="2789927415041640472">Reinicia la aplicación para utilizar la configuración del nuevo asignador.</translation>
 <translation id="3046825211487065480">Ha fallado la asignación. Se ha enviado la segunda petición antes de que se respondiera la primera.</translation>
 <translation id="3286538390144397061">Reiniciar ahora</translation>
 <translation id="3346106862344060497">El motor está conectado.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Ha fallado la asignación. La cuenta no dispone de acceso.</translation>
 <translation id="6232798399907177395">Información sobre Blimp</translation>
 <translation id="704835510384979817">Ha fallado la asignación. La versión del motor no coincide.</translation>
+<translation id="7145680970336344212">Reiniciar Blimp</translation>
 <translation id="7536363920335771251">Motivo por el que el motor está desconectado: %1$s</translation>
 <translation id="7596558890252710462">Sistema operativo</translation>
 <translation id="7608553142876436780">IP del motor</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_fa.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_fa.xtb
index 01ced9b..723901a 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_fa.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_fa.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">اطلاعات نسخه</translation>
 <translation id="2117453604279487107">نشانی‌وب اختصاص‌دهنده</translation>
 <translation id="2353984724370197742">واگذاری ناموفق بود. درخواست شبکه انجام نشد.</translation>
+<translation id="2789927415041640472">لطفاً برای استفاده از پیکربندی اختصاص‌دهنده جدید راه‌اندازی مجدد کنید.</translation>
 <translation id="3046825211487065480">واگذاری ناموفق بود. قبل از اینکه به درخواست اول پاسخ داده شود، درخواست دوم ارسال شد.</translation>
 <translation id="3286538390144397061">راه‌اندازی مجدد اکنون</translation>
 <translation id="3346106862344060497">موتور متصل شد.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">واگذاری ناموفق بود.  حساب دسترسی ندارد.</translation>
 <translation id="6232798399907177395">‏درباره Blimp</translation>
 <translation id="704835510384979817">واگذاری ناموفق بود.  نسخه موتور مطابقی وجود ندارد.</translation>
+<translation id="7145680970336344212">‏راه‌اندازی مجدد Blimp</translation>
 <translation id="7536363920335771251">‏ارتباط موتور قطع شد، دلیل: %1$s</translation>
 <translation id="7596558890252710462">سیستم عامل</translation>
 <translation id="7608553142876436780">‏IP موتور</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_fi.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_fi.xtb
index f1d29276..4422e727 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_fi.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_fi.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Versiotiedot</translation>
 <translation id="2117453604279487107">Määrittäjän URL-osoite</translation>
 <translation id="2353984724370197742">Tehtävä epäonnistui. Verkon pyyntö epäonnistui.</translation>
+<translation id="2789927415041640472">Ota määrittäjän uudet asetukset käyttöön käynnistämällä sovellus uudelleen.</translation>
 <translation id="3046825211487065480">Tehtävä epäonnistui. Toinen pyyntö lähetettiin ennen kuin ensimmäiseen pyyntöön vastattiin.</translation>
 <translation id="3286538390144397061">Käynnistä uudelleen</translation>
 <translation id="3346106862344060497">Yhteys muodostettiin.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Tehtävä epäonnistui. Tilillä ei ole käyttöoikeutta.</translation>
 <translation id="6232798399907177395">Tietoja Blimpistä</translation>
 <translation id="704835510384979817">Tehtävä epäonnistui. Koneiden versiot eivät täsmää.</translation>
+<translation id="7145680970336344212">Käynnistä Blimp uudelleen</translation>
 <translation id="7536363920335771251">Yhteys katkaistiin. Syy: %1$s.</translation>
 <translation id="7596558890252710462">Käyttöjärjestelmä</translation>
 <translation id="7608553142876436780">Moottorin IP-osoite</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_fil.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_fil.xtb
index 43e3e0f..e874cfd 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_fil.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_fil.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Impormasyon ng bersyon</translation>
 <translation id="2117453604279487107">Assigner URL</translation>
 <translation id="2353984724370197742">Hindi naitalaga.  Hindi naisagawa ang kahilingan sa network.</translation>
+<translation id="2789927415041640472">Paki-restart ang application upang gamitin ang bagong assigner configuration.</translation>
 <translation id="3046825211487065480">Hindi naitalaga.  Nagpadala ng pangalawang kahilingan bago pa natugunan ang unang kahilingan.</translation>
 <translation id="3286538390144397061">I-restart Ngayon</translation>
 <translation id="3346106862344060497">Nakakonekta na ang engine.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Hindi naitalaga.  Walang access ang account.</translation>
 <translation id="6232798399907177395">Tungkol sa Blimp</translation>
 <translation id="704835510384979817">Hindi naitalaga.  Walang tumutugmang bersyon ng engine.</translation>
+<translation id="7145680970336344212">I-restart ang Blimp</translation>
 <translation id="7536363920335771251">Nadiskonekta ang engine, dahilan: %1$s</translation>
 <translation id="7596558890252710462">Operating system</translation>
 <translation id="7608553142876436780">Engine IP</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_fr.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_fr.xtb
index e368e868..e36fbed 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_fr.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_fr.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Informations sur la version</translation>
 <translation id="2117453604279487107">URL de l'autorité d'attribution</translation>
 <translation id="2353984724370197742">Échec de l'attribution. Échec de la demande réseau.</translation>
+<translation id="2789927415041640472">Veuillez relancer l'application pour utiliser la nouvelle configuration de l'autorité d'attribution.</translation>
 <translation id="3046825211487065480">Échec de l'attribution. Deuxième demande envoyée avant la réponse de la première demande.</translation>
 <translation id="3286538390144397061">Redémarrer maintenant</translation>
 <translation id="3346106862344060497">Moteur connecté.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Échec de l'attribution. Le compte ne dispose pas de l'accès.</translation>
 <translation id="6232798399907177395">À propos de Blimp</translation>
 <translation id="704835510384979817">Échec de l'attribution. Aucune version de moteur correspondante.</translation>
+<translation id="7145680970336344212">Relancer Blimp</translation>
 <translation id="7536363920335771251">Moteur déconnecté. Motif : %1$s</translation>
 <translation id="7596558890252710462">Système d'exploitation</translation>
 <translation id="7608553142876436780">Adresse IP du moteur</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_hi.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_hi.xtb
index 387e5d3..5245a376 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_hi.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_hi.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">वर्शन की जानकारी</translation>
 <translation id="2117453604279487107">असाइन करने वाला URL</translation>
 <translation id="2353984724370197742">असाइनमेंट विफल रहा.  नेटवर्क अनुरोध विफल रहा.</translation>
+<translation id="2789927415041640472">नए असाइन करने वाले कॉन्फ़िगरेशन का उपयोग करने के लिए कृपया ऐप्लिकेशन पुनः प्रारंभ करें.</translation>
 <translation id="3046825211487065480">असाइनमेंट विफल रहा.  पहले अनुरोध की प्रतिक्रिया से पूर्व दूसरा अनुरोध भेजा गया.</translation>
 <translation id="3286538390144397061">अभी फिर से प्रारंभ करें</translation>
 <translation id="3346106862344060497">इंजन कनेक्ट किया गया.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">असाइनमेंट विफल रहा.  खाते के पास एक्सेस नहीं है.</translation>
 <translation id="6232798399907177395">Blimp के बारे में</translation>
 <translation id="704835510384979817">असाइनमेंट विफल रहा.  मिलान वाला कोई इंजन वर्शन नहीं है.</translation>
+<translation id="7145680970336344212">Blimp को पुनः प्रारंभ करें</translation>
 <translation id="7536363920335771251">इंजन इस कारण डिस्कनेक्ट किया गया: %1$s</translation>
 <translation id="7596558890252710462">ऑपरेटिंग सिस्टम</translation>
 <translation id="7608553142876436780">इंजन IP</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_hr.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_hr.xtb
index 2d9b3a6..eae8a60 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_hr.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_hr.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Informacije o verziji</translation>
 <translation id="2117453604279487107">URL dodjelitelja</translation>
 <translation id="2353984724370197742">Dodjeljivanje nije uspjelo. Mrežni zahtjev nije uspio.</translation>
+<translation id="2789927415041640472">Ponovo pokrenite aplikaciju da biste upotrebljavali novu konfiguraciju dodjeljivanja.</translation>
 <translation id="3046825211487065480">Dodjeljivanje nije uspjelo. Drugi zahtjev poslan je prije odgovora na prvi zahtjev.</translation>
 <translation id="3286538390144397061">Ponovo pokreni sad</translation>
 <translation id="3346106862344060497">Uređaj je povezan.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Dodjeljivanje nije uspjelo. Račun nema pristup.</translation>
 <translation id="6232798399907177395">O Blimpu</translation>
 <translation id="704835510384979817">Dodjeljivanje nije uspjelo. Nema podudarne verzije tražilice.</translation>
+<translation id="7145680970336344212">Ponovo pokreni Blimp</translation>
 <translation id="7536363920335771251">Prekinuta je veza s uređajem, razlog: %1$s</translation>
 <translation id="7596558890252710462">Operativni sustav</translation>
 <translation id="7608553142876436780">IP tražilice</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_hu.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_hu.xtb
index 1f59e672..7e9b3fc 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_hu.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_hu.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Verzióinformáció</translation>
 <translation id="2117453604279487107">Hozzárendelő URL-je</translation>
 <translation id="2353984724370197742">A hozzárendelés nem sikerült. Sikertelen hálózati kérés.</translation>
+<translation id="2789927415041640472">Kérjük, indítsa újra az alkalmazást az új hozzárendelői konfiguráció használatához.</translation>
 <translation id="3046825211487065480">A hozzárendelés nem sikerült. Második kérést küldtek az első kérés megválaszolása előtt.</translation>
 <translation id="3286538390144397061">Újraindítás most</translation>
 <translation id="3346106862344060497">Motor csatlakoztatva.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">A hozzárendelés nem sikerült. A fióknak nincs hozzáférése.</translation>
 <translation id="6232798399907177395">A Blimp névjegye</translation>
 <translation id="704835510384979817">A hozzárendelés nem sikerült. Nincs egyező motorverzió.</translation>
+<translation id="7145680970336344212">A Blimp újraindítása</translation>
 <translation id="7536363920335771251">Motor leválasztva, ok: %1$s</translation>
 <translation id="7596558890252710462">Operációs rendszer</translation>
 <translation id="7608553142876436780">Motor IP-címe</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_id.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_id.xtb
index e40de94..a59d7ed6 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_id.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_id.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Info Versi</translation>
 <translation id="2117453604279487107">URL Pemberi Tugas</translation>
 <translation id="2353984724370197742">Penugasan gagal.  Permintaan jaringan gagal.</translation>
+<translation id="2789927415041640472">Mulai ulang aplikasi untuk menggunakan konfigurasi pemberi tugas yang baru.</translation>
 <translation id="3046825211487065480">Penugasan gagal.  Permintaan kedua dikirim sebelum permintaan pertama ditanggapi.</translation>
 <translation id="3286538390144397061">Mulai Ulang Sekarang</translation>
 <translation id="3346106862344060497">Perangkat tersambung.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Penugasan gagal.  Akun tidak memiliki akses.</translation>
 <translation id="6232798399907177395">Tentang Blimp</translation>
 <translation id="704835510384979817">Penugasan gagal.  Tidak ada versi mesin yang sesuai.</translation>
+<translation id="7145680970336344212">Mulai ulang Blimp</translation>
 <translation id="7536363920335771251">Sambungan perangkat terputus, alasan: %1$s</translation>
 <translation id="7596558890252710462">Sistem operasi</translation>
 <translation id="7608553142876436780">IP Mesin</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_it.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_it.xtb
index 82813a9..68930634 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_it.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_it.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Info versione</translation>
 <translation id="2117453604279487107">URL assegnatore</translation>
 <translation id="2353984724370197742">Assegnazione non riuscita. Richiesta di rete non riuscita.</translation>
+<translation id="2789927415041640472">Riavvia l'applicazione per utilizzare la nuova configurazione dell'assegnatore.</translation>
 <translation id="3046825211487065480">Assegnazione non riuscita. Seconda richiesta inviata prima che la precedente sia stata ricevuta.</translation>
 <translation id="3286538390144397061">Riavvia adesso</translation>
 <translation id="3346106862344060497">Motore connesso.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Assegnazione non riuscita. All'account non è consentito l'accesso.</translation>
 <translation id="6232798399907177395">Informazioni su Blimp</translation>
 <translation id="704835510384979817">Assegnazione non riuscita. Nessuna versione del motore corrispondente.</translation>
+<translation id="7145680970336344212">Riavvia Blimp</translation>
 <translation id="7536363920335771251">Motore disconnesso. Motivo: %1$s</translation>
 <translation id="7596558890252710462">Sistema operativo</translation>
 <translation id="7608553142876436780">IP del motore</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_iw.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_iw.xtb
index 6184781..7bd2f91 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_iw.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_iw.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">פרטי גירסה</translation>
 <translation id="2117453604279487107">כתובת אתר של המקצה</translation>
 <translation id="2353984724370197742">ההקצאה נכשלה. בקשת הרשת נכשלה.</translation>
+<translation id="2789927415041640472">הפעל מחדש את האפליקציה כדי להשתמש בהגדרות המקצה החדשות.</translation>
 <translation id="3046825211487065480">ההקצאה נכשלה. הבקשה השנייה נשלחה לפני התגובה לבקשה הראשונה.</translation>
 <translation id="3286538390144397061">הפעל מחדש כעת</translation>
 <translation id="3346106862344060497">המנוע מחובר.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">ההקצאה נכשלה. אין לחשבון הרשאת גישה.</translation>
 <translation id="6232798399907177395">‏מידע על Blimp</translation>
 <translation id="704835510384979817">ההקצאה נכשלה. לא נמצאה גירסת מנוע תואמת.</translation>
+<translation id="7145680970336344212">‏הפעל מחדש את Blimp</translation>
 <translation id="7536363920335771251">‏המנוע מנותק. הסיבה: %1$s</translation>
 <translation id="7596558890252710462">מערכת הפעלה</translation>
 <translation id="7608553142876436780">‏כתובת IP של המנוע</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ja.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ja.xtb
index abe383b..d74c2784 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ja.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ja.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">バージョン情報</translation>
 <translation id="2117453604279487107">割り当て元 URL</translation>
 <translation id="2353984724370197742">割り当てが失敗しました。ネットワーク リクエストが失敗しました。</translation>
+<translation id="2789927415041640472">新しい割り当て元の設定を使用するには、アプリケーションを再起動してください。</translation>
 <translation id="3046825211487065480">割り当てが失敗しました。最初のリクエストの応答がある前に、2 番目のリクエストが送信されました。</translation>
 <translation id="3286538390144397061">今すぐ再起動</translation>
 <translation id="3346106862344060497">エンジンに接続しました。</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">割り当てが失敗しました。アカウントにアクセス権がありません。</translation>
 <translation id="6232798399907177395">Blimp について</translation>
 <translation id="704835510384979817">割り当てが失敗しました。一致するエンジン バージョンがありません。</translation>
+<translation id="7145680970336344212">Blimp を再起動します</translation>
 <translation id="7536363920335771251">エンジンが切断されました。原因: %1$s</translation>
 <translation id="7596558890252710462">オペレーティング システム</translation>
 <translation id="7608553142876436780">エンジン IP</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ko.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ko.xtb
index ce3549b..c5059471 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ko.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ko.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">버전 정보</translation>
 <translation id="2117453604279487107">할당자 URL</translation>
 <translation id="2353984724370197742">할당하지 못했습니다. 네트워크 요청에 실패했습니다.</translation>
+<translation id="2789927415041640472">새로운 할당자 구성을 사용하려면 애플리케이션을 다시 시작하세요.</translation>
 <translation id="3046825211487065480">할당하지 못했습니다. 첫 번째 요청이 응답되기 전에 두 번째 요청이 전송되었습니다.</translation>
 <translation id="3286538390144397061">지금 다시 시작</translation>
 <translation id="3346106862344060497">엔진이 연결되었습니다.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">할당하지 못했습니다. 계정에 액세스 권한이 없습니다.</translation>
 <translation id="6232798399907177395">Blimp 정보</translation>
 <translation id="704835510384979817">할당하지 못했습니다. 일치하는 엔진 버전이 없습니다.</translation>
+<translation id="7145680970336344212">Blimp 다시 시작</translation>
 <translation id="7536363920335771251">다음 이유로 엔진 연결이 해제되었습니다. %1$s</translation>
 <translation id="7596558890252710462">운영체제</translation>
 <translation id="7608553142876436780">엔진 IP</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_lt.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_lt.xtb
index 8a95c93..a3e4e7b8 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_lt.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_lt.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Versijos informacija</translation>
 <translation id="2117453604279487107">Priskyrimo priemonės URL</translation>
 <translation id="2353984724370197742">Priskirti nepavyko. Nepavyko tinklo užklausa.</translation>
+<translation id="2789927415041640472">Norėdami naudoti naują priskyrimo priemonės konfigūraciją, paleiskite programą iš naujo.</translation>
 <translation id="3046825211487065480">Priskirti nepavyko. Antra užklausa išsiųsta prieš pateikiant atsaką į pirmą užklausą.</translation>
 <translation id="3286538390144397061">Paleisti iš naujo dabar</translation>
 <translation id="3346106862344060497">Variklis prijungtas.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Priskirti nepavyko. Naudojant paskyrą negalima pasiekti duomenų.</translation>
 <translation id="6232798399907177395">Apie „Blimp“</translation>
 <translation id="704835510384979817">Priskirti nepavyko. Nėra atitinkamos versijos variklio.</translation>
+<translation id="7145680970336344212">Iš naujo paleisti „Blimp“</translation>
 <translation id="7536363920335771251">Variklis atjungtas, priežastis: %1$s</translation>
 <translation id="7596558890252710462">Operacinė sistema</translation>
 <translation id="7608553142876436780">Variklio IP protokolas</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_lv.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_lv.xtb
index 4f7cb76..aff038f 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_lv.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_lv.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Informācija par versiju</translation>
 <translation id="2117453604279487107">Piešķīrēja URL</translation>
 <translation id="2353984724370197742">Piešķires kļūme. Tīkla pieprasījuma kļūme.</translation>
+<translation id="2789927415041640472">Lūdzu, restartējiet lietojumprogrammu, lai izmantotu jaunā piešķīrēja konfigurāciju.</translation>
 <translation id="3046825211487065480">Piešķires kļūme. Otrs pieprasījums nosūtīts, pirms tika saņemta atbilde uz pirmo pieprasījumu.</translation>
 <translation id="3286538390144397061">Restartēt tūlīt</translation>
 <translation id="3346106862344060497">Programma ir pievienota.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Piešķires kļūme. Kontam nav piekļuves.</translation>
 <translation id="6232798399907177395">Par Blimp</translation>
 <translation id="704835510384979817">Piešķires kļūme. Nav atbilstošas programmas versijas.</translation>
+<translation id="7145680970336344212">Restartēt Blimp</translation>
 <translation id="7536363920335771251">Programma ir atvienota, iemesls: %1$s</translation>
 <translation id="7596558890252710462">Operētājsistēma</translation>
 <translation id="7608553142876436780">Programmas IP</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_nl.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_nl.xtb
index ff23c83..327bf5e 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_nl.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_nl.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Versie-info</translation>
 <translation id="2117453604279487107">URL van toewijzer</translation>
 <translation id="2353984724370197742">Toewijzing mislukt. Netwerkverzoek mislukt.</translation>
+<translation id="2789927415041640472">Start de app opnieuw om de nieuwe toewijzerconfiguratie te gebruiken.</translation>
 <translation id="3046825211487065480">Toewijzing mislukt. Het tweede verzoek is verzonden voordat er op het eerste verzoek is gereageerd.</translation>
 <translation id="3286538390144397061">Nu herstarten</translation>
 <translation id="3346106862344060497">Engine verbonden.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Toewijzing mislukt. Account heeft geen toegang.</translation>
 <translation id="6232798399907177395">Over Blimp</translation>
 <translation id="704835510384979817">Toewijzing mislukt. Geen overeenkomende engine-versie.</translation>
+<translation id="7145680970336344212">Blimp opnieuw starten</translation>
 <translation id="7536363920335771251">Verbinding met engine verbroken, reden: %1$s</translation>
 <translation id="7596558890252710462">Besturingssysteem</translation>
 <translation id="7608553142876436780">Engine-IP</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_no.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_no.xtb
index d240c56..6d275764 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_no.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_no.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Versjonsinformasjon</translation>
 <translation id="2117453604279487107">Nettadresse for tildeleren</translation>
 <translation id="2353984724370197742">Oppgaven kunne ikke utføres. Nettverksforespørselen mislyktes.</translation>
+<translation id="2789927415041640472">Start appen på nytt for å bruke den nye tildelerkonfigurasjonen.</translation>
 <translation id="3046825211487065480">Oppgaven kunne ikke utføres. Den andre forespørselen ble sendt før den første forespørselen svarte.</translation>
 <translation id="3286538390144397061">Start på nytt nå</translation>
 <translation id="3346106862344060497">Motoren er koblet til.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Oppgaven kunne ikke utføres. Kontoen har ikke tilgang.</translation>
 <translation id="6232798399907177395">Om Blimp</translation>
 <translation id="704835510384979817">Oppgaven kunne ikke utføres. Ingen samsvarende motorversjon.</translation>
+<translation id="7145680970336344212">Start Blimp på nytt</translation>
 <translation id="7536363920335771251">Motoren er koblet fra. Årsak: %1$s</translation>
 <translation id="7596558890252710462">Operativsystem</translation>
 <translation id="7608553142876436780">Motor-IP</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_pl.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_pl.xtb
index 4cfa8a64..4d4795cf 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_pl.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_pl.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Informacje o wersji</translation>
 <translation id="2117453604279487107">URL przypisujący</translation>
 <translation id="2353984724370197742">Przypisanie się nie udało. Błąd żądania sieciowego.</translation>
+<translation id="2789927415041640472">Uruchom ponownie aplikację, by korzystać z nowej konfiguracji przypisującego.</translation>
 <translation id="3046825211487065480">Przypisanie się nie udało. Drugie żądanie zostało wysłane przed otrzymaniem odpowiedzi na pierwsze.</translation>
 <translation id="3286538390144397061">Uruchom ponownie teraz</translation>
 <translation id="3346106862344060497">Połączono z mechanizmem.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Przypisanie się nie udało. Konto nie ma dostępu.</translation>
 <translation id="6232798399907177395">Blimp – informacje</translation>
 <translation id="704835510384979817">Przypisanie się nie udało. Brak pasującej wersji przeglądarki.</translation>
+<translation id="7145680970336344212">Uruchom ponownie Blimp</translation>
 <translation id="7536363920335771251">Rozłączono z mechanizmem, powód: %1$s</translation>
 <translation id="7596558890252710462">System operacyjny</translation>
 <translation id="7608553142876436780">Adres IP mechanizmu</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_pt-PT.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_pt-PT.xtb
index 6647909..05ce9793c 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_pt-PT.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_pt-PT.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Informações da versão</translation>
 <translation id="2117453604279487107">URL do atribuidor</translation>
 <translation id="2353984724370197742">A atribuição falhou. Falha no pedido de rede.</translation>
+<translation id="2789927415041640472">Reinicie a aplicação para utilizar a nova configuração do atribuidor.</translation>
 <translation id="3046825211487065480">A atribuição falhou. O segundo pedido foi enviado antes de o primeiro pedido responder.</translation>
 <translation id="3286538390144397061">Reiniciar agora</translation>
 <translation id="3346106862344060497">Motor ligado.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">A atribuição falhou. A conta não tem acesso.</translation>
 <translation id="6232798399907177395">Acerca do Blimp</translation>
 <translation id="704835510384979817">A atribuição falhou. Não há uma versão do motor correspondente.</translation>
+<translation id="7145680970336344212">Reiniciar o Blimp</translation>
 <translation id="7536363920335771251">Motor desligado, motivo: %1$s</translation>
 <translation id="7596558890252710462">Sistema operativo</translation>
 <translation id="7608553142876436780">IP do motor</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ro.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ro.xtb
index 76e85d86..309c4d0f3 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ro.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ro.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Informații privind versiunea</translation>
 <translation id="2117453604279487107">Adresa URL a instrumentului de atribuire</translation>
 <translation id="2353984724370197742">Atribuirea nu a reușit. Solicitarea din rețea nu a reușit.</translation>
+<translation id="2789927415041640472">Repornește aplicația pentru a folosi noua configurație a instrumentului de atribuire.</translation>
 <translation id="3046825211487065480">Atribuirea nu a reușit. A fost trimisă o a doua solicitare înainte ca prima solicitare să primească răspuns.</translation>
 <translation id="3286538390144397061">Repornește acum</translation>
 <translation id="3346106862344060497">Motor conectat.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Atribuirea nu a reușit. Contul nu are acces.</translation>
 <translation id="6232798399907177395">Despre Blimp</translation>
 <translation id="704835510384979817">Atribuirea nu a reușit. Nicio versiune a motorului potrivită.</translation>
+<translation id="7145680970336344212">Repornește Blimp</translation>
 <translation id="7536363920335771251">Motor deconectat, motiv: %1$s</translation>
 <translation id="7596558890252710462">Sistem de operare</translation>
 <translation id="7608553142876436780">Adresa IP a motorului</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ru.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ru.xtb
index 4e659a3..3677e97 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_ru.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_ru.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Версия</translation>
 <translation id="2117453604279487107">URL указателя</translation>
 <translation id="2353984724370197742">Ошибка. Не удалось обработать запрос.</translation>
+<translation id="2789927415041640472">Чтобы использовать новую конфигурацию, перезапустите приложение.</translation>
 <translation id="3046825211487065480">Ошибка. Второй запрос был отправлен раньше, чем пришел ответ на первый.</translation>
 <translation id="3286538390144397061">Перезапустить сейчас</translation>
 <translation id="3346106862344060497">Соединение установлено.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Ошибка. У аккаунта нет права доступа.</translation>
 <translation id="6232798399907177395">О Blimp</translation>
 <translation id="704835510384979817">Ошибка. Совместимая версия поисковой системы отсутствует.</translation>
+<translation id="7145680970336344212">Перезапустите Blimp</translation>
 <translation id="7536363920335771251">Соединение прервано. Причина: %1$s.</translation>
 <translation id="7596558890252710462">Операционная система</translation>
 <translation id="7608553142876436780">IP-адрес поисковой системы</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_sk.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_sk.xtb
index e925bb3..8cf1ebd 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_sk.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_sk.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Informácie o verzii</translation>
 <translation id="2117453604279487107">Webová adresa postupiteľa</translation>
 <translation id="2353984724370197742">Priradenie zlyhalo. Zlyhala žiadosť do siete.</translation>
+<translation id="2789927415041640472">Ak chcete použiť novú konfiguráciu postupiteľa, reštartujte aplikáciu.</translation>
 <translation id="3046825211487065480">Priradenie zlyhalo. Druhá žiadosť bola odoslaná ešte pred odpoveďou na prvú žiadosť.</translation>
 <translation id="3286538390144397061">Reštartovať</translation>
 <translation id="3346106862344060497">Nástroj bol pripojený.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Priradenie zlyhalo. Účet nemá prístup.</translation>
 <translation id="6232798399907177395">Informácie o nástroji Blimp</translation>
 <translation id="704835510384979817">Priradenie zlyhalo. Žiadna zodpovedajúca verzia nástroja.</translation>
+<translation id="7145680970336344212">Reštartovať Blimp</translation>
 <translation id="7536363920335771251">Nástroj bol odpojený. Dôvod: %1$s</translation>
 <translation id="7596558890252710462">Operačný systém</translation>
 <translation id="7608553142876436780">Adresa IP nástroja</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_sl.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_sl.xtb
index 9843e48..12c8989 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_sl.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_sl.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Podatki o različici</translation>
 <translation id="2117453604279487107">URL dodeljevalnika</translation>
 <translation id="2353984724370197742">Dodelitev ni uspela. Omrežna zahteva ni uspela.</translation>
+<translation id="2789927415041640472">Če želite uporabljati novo konfiguracijo dodeljevalnika, znova zaženite aplikacijo.</translation>
 <translation id="3046825211487065480">Dodelitev ni uspela. Pred odgovorom na prvo zahtevo je bila poslana druga zahteva.</translation>
 <translation id="3286538390144397061">Znova zaženi</translation>
 <translation id="3346106862344060497">Povezava z mehanizmom je vzpostavljena.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Dodelitev ni uspela. Račun nima dostopa.</translation>
 <translation id="6232798399907177395">O mehanizmu Blimp</translation>
 <translation id="704835510384979817">Dodelitev ni uspela. Ni ujemajoče se različice iskalnika.</translation>
+<translation id="7145680970336344212">Znova zaženite Blimp</translation>
 <translation id="7536363920335771251">Povezava z mehanizmom je prekinjena; razlog: %1$s</translation>
 <translation id="7596558890252710462">Operacijski sistem</translation>
 <translation id="7608553142876436780">IP mehanizma</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_sr.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_sr.xtb
index 01875715..bff18e7 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_sr.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_sr.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Информације о верзији</translation>
 <translation id="2117453604279487107">URL додељивача</translation>
 <translation id="2353984724370197742">Пренос права није успео. Захтев мреже није успео.</translation>
+<translation id="2789927415041640472">Рестартујте апликацију да би користила нову конфигурацију додељивача.</translation>
 <translation id="3046825211487065480">Пренос права није успео. Други захтев је послат пре одговора на први захтев.</translation>
 <translation id="3286538390144397061">Поново покрени одмах</translation>
 <translation id="3346106862344060497">Механизам је повезан.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Пренос права није успео. Налог нема приступ.</translation>
 <translation id="6232798399907177395">О Blimp-у</translation>
 <translation id="704835510384979817">Пренос права није успео. Нема одговарајуће верзије механизма.</translation>
+<translation id="7145680970336344212">Рестартујте Blimp</translation>
 <translation id="7536363920335771251">Прекинута је веза са механизмом, разлог: %1$s</translation>
 <translation id="7596558890252710462">Оперативни систем</translation>
 <translation id="7608553142876436780">IP механизма</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_sv.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_sv.xtb
index 66a3e39..eae8216 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_sv.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_sv.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Versionsinformation</translation>
 <translation id="2117453604279487107">Tilldelaradress</translation>
 <translation id="2353984724370197742">Tilldelningen misslyckades. Nätverksbegäran misslyckades.</translation>
+<translation id="2789927415041640472">Starta om programmet så att den nya tilldelningskonfigurationen träder i kraft.</translation>
 <translation id="3046825211487065480">Tilldelningen misslyckades. Den andra begäran skickades innan den första begäran hade besvarats.</translation>
 <translation id="3286538390144397061">Starta om nu</translation>
 <translation id="3346106862344060497">Motorn är ansluten.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Tilldelningen misslyckades. Kontot har ingen åtkomst.</translation>
 <translation id="6232798399907177395">Om Blimp</translation>
 <translation id="704835510384979817">Tilldelningen misslyckades. Det finns ingen matchande motorversion.</translation>
+<translation id="7145680970336344212">Starta om Blimp</translation>
 <translation id="7536363920335771251">Motorn är frånkopplad. Anledning: %1$s</translation>
 <translation id="7596558890252710462">Operativsystem</translation>
 <translation id="7608553142876436780">Motor-IP</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_sw.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_sw.xtb
index 2212a25..249cc2db 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_sw.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_sw.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Maelezo ya Toleo</translation>
 <translation id="2117453604279487107">URL ya anayehawilisha</translation>
 <translation id="2353984724370197742">Haijafaulu kuhawilisha. Ombi la mtandao halijafaulu.</translation>
+<translation id="2789927415041640472">Tafadhali zima halafu uwashe programu ili utumie uwekaji mipangilio ya kihawilishaji kipya.</translation>
 <translation id="3046825211487065480">Haijafaulu kuhawilisha. Ombi la pili limetumwa kabla ya ombi la kwanza kujibu.</translation>
 <translation id="3286538390144397061">Zima na uwashe sasa</translation>
 <translation id="3346106862344060497">Mtambo umeunganishwa.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Haijafaulu kuhawilisha. Akaunti haina idhini ya kufikia.</translation>
 <translation id="6232798399907177395">Kuhusu Blimp</translation>
 <translation id="704835510384979817">Haijafaulu kuhawilisha. Hakuna toleo la mtambo linalolingana.</translation>
+<translation id="7145680970336344212">Zima halafu uwashe Blimp</translation>
 <translation id="7536363920335771251">Mtambo umeondolewa, sababu: %1$s</translation>
 <translation id="7596558890252710462">Mfumo wa uendeshaji</translation>
 <translation id="7608553142876436780">IP ya Mtambo</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_th.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_th.xtb
index 6afa796..96cdae86 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_th.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_th.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">ข้อมูลเวอร์ชัน</translation>
 <translation id="2117453604279487107">URL ผู้กำหนด</translation>
 <translation id="2353984724370197742">การมอบหมายล้มเหลว คำขอเครือข่ายล้มเหลว</translation>
+<translation id="2789927415041640472">โปรดรีสตาร์ทแอปพลิเคชันเพื่อใช้การกำหนดค่าใหม่ของผู้กำหนด</translation>
 <translation id="3046825211487065480">การมอบหมายล้มเหลว คำขอที่ 2 ถูกส่งออกไปก่อนที่จะมีการตอบกลับคำขอแรก</translation>
 <translation id="3286538390144397061">รีสตาร์ทเดี๋ยวนี้</translation>
 <translation id="3346106862344060497">เชื่อมต่อเครื่องมือแล้ว</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">การมอบหมายล้มเหลว บัญชีไม่มีสิทธิ์เข้าถึง</translation>
 <translation id="6232798399907177395">เกี่ยวกับ Blimp</translation>
 <translation id="704835510384979817">การมอบหมายล้มเหลว เวอร์ชันของเครื่องไม่ตรงกัน</translation>
+<translation id="7145680970336344212">รีสตาร์ท Blimp</translation>
 <translation id="7536363920335771251">ยกเลิกการเชื่อมต่อเครื่องมือแล้ว เหตุผลคือ %1$s</translation>
 <translation id="7596558890252710462">ระบบปฏิบัติการ</translation>
 <translation id="7608553142876436780">IP ของเครื่องมือ</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_tr.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_tr.xtb
index a889e7a..3980446 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_tr.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_tr.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Sürüm Bilgisi</translation>
 <translation id="2117453604279487107">Atayan URL'si</translation>
 <translation id="2353984724370197742">Atama başarısız oldu. Ağ isteği başarısız oldu.</translation>
+<translation id="2789927415041640472">Yeni atayan yapılandırmasını kullanmak için lütfen uygulamayı yeniden başlatın.</translation>
 <translation id="3046825211487065480">Atama başarısız oldu. Birinci isteğe yanıt verilmeden ikinci istek gönderildi.</translation>
 <translation id="3286538390144397061">Şimdi yeniden başlat</translation>
 <translation id="3346106862344060497">Motora bağlanıldı.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Atama başarısız oldu. Hesabın erişimi yok.</translation>
 <translation id="6232798399907177395">Blimp hakkında</translation>
 <translation id="704835510384979817">Atama başarısız oldu. Eşleşen motor sürümü yok.</translation>
+<translation id="7145680970336344212">Blimp'i yeniden başlatın</translation>
 <translation id="7536363920335771251">Motor bağlantısı kesildi, neden: %1$s</translation>
 <translation id="7596558890252710462">İşletim sistemi</translation>
 <translation id="7608553142876436780">Motor IP'si</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_uk.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_uk.xtb
index 62eafd1..8f2d516 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_uk.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_uk.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Інформація про версію</translation>
 <translation id="2117453604279487107">URL-адреса призначення</translation>
 <translation id="2353984724370197742">Не вдалось отримати завдання. Помилка мережі.</translation>
+<translation id="2789927415041640472">Перезапустіть додаток, щоб застосувати нову конфігурацію визначника.</translation>
 <translation id="3046825211487065480">Не вдалось отримати завдання. Другий запит надіслано до того, як надійшла відповідь на перший.</translation>
 <translation id="3286538390144397061">Перезапустити зараз</translation>
 <translation id="3346106862344060497">Систему під’єднано.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Не вдалось отримати завдання. Обліковий запис не має доступу.</translation>
 <translation id="6232798399907177395">Про Blimp</translation>
 <translation id="704835510384979817">Не вдалось отримати завдання. Немає відповідної версії ресурсу.</translation>
+<translation id="7145680970336344212">Перезапустіть Blimp</translation>
 <translation id="7536363920335771251">Систему від’єднано. Причина: %1$s</translation>
 <translation id="7596558890252710462">Операційна система</translation>
 <translation id="7608553142876436780">IP-адреса системи</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_vi.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_vi.xtb
index 32978c0..df7231aa 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_vi.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_vi.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">Thông tin phiên bản</translation>
 <translation id="2117453604279487107">URL trình gán</translation>
 <translation id="2353984724370197742">Gán không thành công.  Yêu cầu mạng không thành công.</translation>
+<translation id="2789927415041640472">Vui lòng khởi động lại ứng dụng để sử dụng cấu hình trình gán mới.</translation>
 <translation id="3046825211487065480">Gán không thành công.  Yêu cầu thứ hai đã được gửi trước khi yêu cầu thứ nhất được phản hồi.</translation>
 <translation id="3286538390144397061">Khởi động lại Ngay bây giờ</translation>
 <translation id="3346106862344060497">Đã kết nối công cụ.</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">Gán không thành công.  Tài khoản không có quyền truy cập.</translation>
 <translation id="6232798399907177395">Giới thiệu về Blimp</translation>
 <translation id="704835510384979817">Gán không thành công.  Không có phiên bản công cụ phù hợp.</translation>
+<translation id="7145680970336344212">Khởi động lại Blimp</translation>
 <translation id="7536363920335771251">Đã ngắt kết nối công cụ, lí do: %1$s</translation>
 <translation id="7596558890252710462">Hệ điều hành</translation>
 <translation id="7608553142876436780">IP công cụ</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_zh-CN.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_zh-CN.xtb
index ad4e428..d926b229 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_zh-CN.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_zh-CN.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">版本信息</translation>
 <translation id="2117453604279487107">分配器网址</translation>
 <translation id="2353984724370197742">无法获取任务,因为网络请求失败。</translation>
+<translation id="2789927415041640472">请重新启动该应用,以使用新的分配器配置。</translation>
 <translation id="3046825211487065480">无法获取任务,因为您在系统响应第一个请求之前就发送了第二个请求。</translation>
 <translation id="3286538390144397061">立即重新启动</translation>
 <translation id="3346106862344060497">已连接到引擎。</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">无法获取任务,因为相关帐户无访问权限。</translation>
 <translation id="6232798399907177395">Blimp 简介</translation>
 <translation id="704835510384979817">无法获取任务,因为没有相符的引擎版本。</translation>
+<translation id="7145680970336344212">重新启动 Blimp</translation>
 <translation id="7536363920335771251">引擎已断开,原因:%1$s</translation>
 <translation id="7596558890252710462">操作系统</translation>
 <translation id="7608553142876436780">引擎 IP</translation>
diff --git a/blimp/client/app/android/java/strings/translations/android_blimp_strings_zh-TW.xtb b/blimp/client/app/android/java/strings/translations/android_blimp_strings_zh-TW.xtb
index d3b9a88e..4fadad9 100644
--- a/blimp/client/app/android/java/strings/translations/android_blimp_strings_zh-TW.xtb
+++ b/blimp/client/app/android/java/strings/translations/android_blimp_strings_zh-TW.xtb
@@ -8,6 +8,7 @@
 <translation id="2078561879028077171">版本資訊</translation>
 <translation id="2117453604279487107">指派者網址</translation>
 <translation id="2353984724370197742">指派失敗。網路要求失敗。</translation>
+<translation id="2789927415041640472">請重新啟動應用程式,以使用新的指派器設定。</translation>
 <translation id="3046825211487065480">指派失敗。第一個要求尚未回應即送出第二個要求。</translation>
 <translation id="3286538390144397061">立即重新啟動</translation>
 <translation id="3346106862344060497">已連上引擎</translation>
@@ -22,6 +23,7 @@
 <translation id="5860346505531085166">指派失敗。帳戶沒有存取權。</translation>
 <translation id="6232798399907177395">關於 Blimp</translation>
 <translation id="704835510384979817">指派失敗。沒有相符的引擎版本。</translation>
+<translation id="7145680970336344212">重新啟動 Blimp</translation>
 <translation id="7536363920335771251">引擎連線已中斷 (原因:%1$s)</translation>
 <translation id="7596558890252710462">作業系統</translation>
 <translation id="7608553142876436780">引擎 IP</translation>
diff --git a/blimp/client/feature/compositor/blimp_context_provider.cc b/blimp/client/feature/compositor/blimp_context_provider.cc
index 9beeb9f..07a8f9a7 100644
--- a/blimp/client/feature/compositor/blimp_context_provider.cc
+++ b/blimp/client/feature/compositor/blimp_context_provider.cc
@@ -97,12 +97,10 @@
     gr_context_->ResetContext(state);
 }
 
-void BlimpContextProvider::SetupLock() {
-  context_->SetLock(&context_lock_);
-}
-
 base::Lock* BlimpContextProvider::GetLock() {
-  return &context_lock_;
+  // This context provider is not used on multiple threads.
+  NOTREACHED();
+  return nullptr;
 }
 
 void BlimpContextProvider::DeleteCachedResources() {
diff --git a/blimp/client/feature/compositor/blimp_context_provider.h b/blimp/client/feature/compositor/blimp_context_provider.h
index 7758bdbb..93e6654 100644
--- a/blimp/client/feature/compositor/blimp_context_provider.h
+++ b/blimp/client/feature/compositor/blimp_context_provider.h
@@ -39,7 +39,6 @@
   gpu::ContextSupport* ContextSupport() override;
   class GrContext* GrContext() override;
   void InvalidateGrContext(uint32_t state) override;
-  void SetupLock() override;
   base::Lock* GetLock() override;
   void DeleteCachedResources() override;
   void SetLostContextCallback(
@@ -57,7 +56,6 @@
   base::ThreadChecker main_thread_checker_;
   base::ThreadChecker context_thread_checker_;
 
-  base::Lock context_lock_;
   std::unique_ptr<gpu::GLInProcessContext> context_;
   std::unique_ptr<skia_bindings::GrContextForGLES2Interface> gr_context_;
 
diff --git a/blimp/common/BUILD.gn b/blimp/common/BUILD.gn
index 122697d..8be32cd 100644
--- a/blimp/common/BUILD.gn
+++ b/blimp/common/BUILD.gn
@@ -40,6 +40,22 @@
   ]
 }
 
+source_set("test_support") {
+  testonly = true
+
+  sources = [
+    "blob_cache/mock_blob_cache.cc",
+    "blob_cache/mock_blob_cache.h",
+  ]
+
+  deps = [
+    ":common",
+    "//blimp/common/proto",
+    "//testing/gmock",
+    "//testing/gtest",
+  ]
+}
+
 source_set("unit_tests") {
   testonly = true
 
diff --git a/blimp/common/blob_cache/mock_blob_cache.cc b/blimp/common/blob_cache/mock_blob_cache.cc
new file mode 100644
index 0000000..4cf10522
--- /dev/null
+++ b/blimp/common/blob_cache/mock_blob_cache.cc
@@ -0,0 +1,13 @@
+// Copyright 2016 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 "blimp/common/blob_cache/mock_blob_cache.h"
+
+namespace blimp {
+
+MockBlobCache::MockBlobCache() {}
+
+MockBlobCache::~MockBlobCache() {}
+
+}  // namespace blimp
diff --git a/blimp/common/blob_cache/mock_blob_cache.h b/blimp/common/blob_cache/mock_blob_cache.h
new file mode 100644
index 0000000..b152ad1
--- /dev/null
+++ b/blimp/common/blob_cache/mock_blob_cache.h
@@ -0,0 +1,28 @@
+// Copyright 2016 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 BLIMP_COMMON_BLOB_CACHE_MOCK_BLOB_CACHE_H_
+#define BLIMP_COMMON_BLOB_CACHE_MOCK_BLOB_CACHE_H_
+
+#include "blimp/common/blob_cache/blob_cache.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace blimp {
+
+class MockBlobCache : public BlobCache {
+ public:
+  MockBlobCache();
+  ~MockBlobCache() override;
+
+  MOCK_CONST_METHOD1(Contains, bool(const BlobId&));
+  MOCK_METHOD2(Put, void(const BlobId&, BlobDataPtr));
+  MOCK_CONST_METHOD1(Get, BlobDataPtr(const BlobId&));
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MockBlobCache);
+};
+
+}  // namespace blimp
+
+#endif  // BLIMP_COMMON_BLOB_CACHE_MOCK_BLOB_CACHE_H_
diff --git a/blimp/engine/BUILD.gn b/blimp/engine/BUILD.gn
index 3c9d0d79..f88a2ed 100644
--- a/blimp/engine/BUILD.gn
+++ b/blimp/engine/BUILD.gn
@@ -55,6 +55,10 @@
     "app/blimp_content_main_delegate.h",
   ]
 
+  public_deps = [
+    ":app_metrics",
+  ]
+
   deps = [
     ":app_config",
     ":app_net",
@@ -71,6 +75,14 @@
     "//blimp/common/proto",
     "//blimp/engine:blob_channel_mojo_cpp_sources",
     "//blimp/net",
+    "//components/metrics",
+    "//components/metrics:gpu",
+    "//components/metrics:net",
+    "//components/metrics:profiler",
+    "//components/metrics:ui",
+    "//components/prefs",
+    "//components/web_cache/renderer",
+    "//content",
     "//content/public/app:both",
     "//content/public/browser",
     "//content/public/common",
@@ -91,6 +103,30 @@
   ]
 }
 
+source_set("app_metrics") {
+  sources = [
+    "app/blimp_metrics_service_client.cc",
+    "app/blimp_metrics_service_client.h",
+  ]
+
+  public_deps = [
+    "//components/metrics",
+    "//content/public/browser",
+  ]
+
+  deps = [
+    "//base",
+    "//base:i18n",
+    "//components/metrics:gpu",
+    "//components/metrics:net",
+    "//components/metrics:profiler",
+    "//components/metrics:ui",
+    "//components/prefs",
+    "//components/version_info",
+    "//net",
+  ]
+}
+
 source_set("app_net") {
   sources = [
     "app/blimp_network_delegate.cc",
@@ -175,11 +211,15 @@
   ]
 
   deps = [
+    ":app_metrics",
     ":app_net",
     ":app_permissions",
     ":common_user_agent",
     "//base",
-    "//content/public/browser",
+    "//components/metrics",
+    "//components/pref_registry",
+    "//components/prefs",
+    "//components/version_info",
     "//content/public/common",
     "//net",
     "//ui/base",
@@ -294,6 +334,7 @@
 
   sources = [
     "app/blimp_engine_config_unittest.cc",
+    "app/blimp_metrics_service_client_unittest.cc",
     "app/settings_manager_unittest.cc",
     "app/ui/blimp_screen_unittest.cc",
   ]
@@ -301,12 +342,16 @@
   deps = [
     ":app",
     ":app_config",
+    ":app_metrics",
     ":app_settings",
     ":app_switches",
     "//base",
     "//base/test:run_all_unittests",
     "//base/test:test_support",
     "//blimp/engine:app_ui",
+    "//components/pref_registry:pref_registry",
+    "//components/prefs:prefs",
+    "//net:test_support",
     "//testing/gmock",
     "//testing/gtest",
     "//ui/display",
diff --git a/blimp/engine/DEPS b/blimp/engine/DEPS
index 9e550b1..85690f0 100644
--- a/blimp/engine/DEPS
+++ b/blimp/engine/DEPS
@@ -2,6 +2,9 @@
   "+base",
   "+cc",
   "-chrome",
+  "+components/metrics",
+  "+components/pref_registry",
+  "+components/prefs",
   "+components/version_info",
   "+components/web_cache/renderer",
   "+content/public",
diff --git a/blimp/engine/app/blimp_metrics_service_client.cc b/blimp/engine/app/blimp_metrics_service_client.cc
new file mode 100644
index 0000000..018a9236
--- /dev/null
+++ b/blimp/engine/app/blimp_metrics_service_client.cc
@@ -0,0 +1,234 @@
+// Copyright 2016 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 "blimp/engine/app/blimp_metrics_service_client.h"
+
+#include "base/bind.h"
+#include "base/i18n/rtl.h"
+#include "base/lazy_instance.h"
+#include "base/memory/ptr_util.h"
+#include "base/memory/ref_counted.h"
+#include "components/metrics/call_stack_profile_metrics_provider.h"
+#include "components/metrics/gpu/gpu_metrics_provider.h"
+#include "components/metrics/metrics_service.h"
+#include "components/metrics/metrics_service_client.h"
+#include "components/metrics/metrics_state_manager.h"
+#include "components/metrics/net/net_metrics_log_uploader.h"
+#include "components/metrics/profiler/profiler_metrics_provider.h"
+#include "components/metrics/ui/screen_info_metrics_provider.h"
+#include "components/metrics/url_constants.h"
+#include "components/prefs/pref_service.h"
+#include "components/version_info/version_info.h"
+#include "content/public/browser/browser_thread.h"
+#include "net/url_request/url_request_context_getter.h"
+
+namespace blimp {
+namespace engine {
+namespace {
+
+// BlimpMetricsServiceClient provides an implementation of MetricsServiceClient
+// tailored for the Blimp engine.
+// The class is used as a singleton and metrics are always turned on.
+class BlimpMetricsServiceClient : public metrics::MetricsServiceClient {
+ public:
+  BlimpMetricsServiceClient();
+  ~BlimpMetricsServiceClient() override;
+
+  // The request_context_getter is a system request context that must remain
+  // valid for the client lifetime.
+  void Initialize(
+      std::unique_ptr<PrefService> pref_service,
+      scoped_refptr<net::URLRequestContextGetter> request_context_getter);
+  void Finalize();
+
+  // metrics::MetricsServiceClient implementation.
+  metrics::MetricsService* GetMetricsService() override;
+  void SetMetricsClientId(const std::string& client_id) override;
+  void OnRecordingDisabled() override;
+  bool IsOffTheRecordSessionActive() override;
+  int32_t GetProduct() override;
+  std::string GetApplicationLocale() override;
+  bool GetBrand(std::string* brand_code) override;
+  metrics::SystemProfileProto::Channel GetChannel() override;
+  std::string GetVersionString() override;
+  void OnLogUploadComplete() override;
+  void InitializeSystemProfileMetrics(
+      const base::Closure& done_callback) override;
+  void CollectFinalMetricsForLog(const base::Closure& done_callback) override;
+  std::unique_ptr<metrics::MetricsLogUploader> CreateUploader(
+      const base::Callback<void(int)>& on_upload_complete) override;
+  base::TimeDelta GetStandardUploadInterval() override;
+  metrics::MetricsServiceClient::EnableMetricsDefault GetDefaultOptIn()
+      override;
+
+ private:
+  // Used by NetMetricsLogUploader to create log-upload requests.
+  scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
+  std::unique_ptr<metrics::MetricsStateManager> metrics_state_manager_;
+  std::unique_ptr<metrics::MetricsService> metrics_service_;
+
+  DISALLOW_COPY_AND_ASSIGN(BlimpMetricsServiceClient);
+};
+
+// How often after initial logging metrics results should be uploaded to the
+// metrics service.
+const int kStandardUploadIntervalMinutes = 30;
+
+base::LazyInstance<BlimpMetricsServiceClient>::Leaky g_lazy_instance_ =
+    LAZY_INSTANCE_INITIALIZER;
+
+// Returns if the MetricsService should be recording metrics information for
+// the client.
+// This callback is required by MetricsStateManager::Create.
+bool IsReportingEnabled() {
+  return true;
+}
+
+// Store/LoadClientInfo allows Windows Chrome to back up ClientInfo.
+// Both are no-ops for Blimp.
+// These callbacks are required by MetricsStateManager::Create.
+void StoreClientInfo(const metrics::ClientInfo& client_info) {}
+
+std::unique_ptr<metrics::ClientInfo> LoadClientInfo() {
+  return nullptr;
+}
+
+}  // namespace
+
+void BlimpMetricsServiceClient::Initialize(
+    std::unique_ptr<PrefService> pref_service,
+    scoped_refptr<net::URLRequestContextGetter> request_context_getter) {
+  request_context_getter_ = request_context_getter;
+
+  metrics_state_manager_ = metrics::MetricsStateManager::Create(
+      pref_service.get(), base::Bind(&IsReportingEnabled),
+      base::Bind(&StoreClientInfo), base::Bind(&LoadClientInfo));
+
+  metrics_service_.reset(new metrics::MetricsService(
+      metrics_state_manager_.get(), this, pref_service.get()));
+
+  metrics_service_->RegisterMetricsProvider(
+      base::WrapUnique<metrics::MetricsProvider>(
+          new metrics::NetworkMetricsProvider(
+              content::BrowserThread::GetBlockingPool())));
+  metrics_service_->RegisterMetricsProvider(
+      base::WrapUnique<metrics::MetricsProvider>(
+          new metrics::GPUMetricsProvider));
+  metrics_service_->RegisterMetricsProvider(
+      base::WrapUnique<metrics::MetricsProvider>(
+          new metrics::ScreenInfoMetricsProvider));
+  metrics_service_->RegisterMetricsProvider(
+      base::WrapUnique<metrics::MetricsProvider>(
+          new metrics::ProfilerMetricsProvider()));
+  metrics_service_->RegisterMetricsProvider(
+      base::WrapUnique<metrics::MetricsProvider>(
+          new metrics::CallStackProfileMetricsProvider));
+
+  metrics_service_->InitializeMetricsRecordingState();
+
+  if (IsReportingEnabled())
+    metrics_service_->Start();
+}
+
+void BlimpMetricsServiceClient::Finalize() {
+  metrics_service_->Stop();
+}
+
+metrics::MetricsService* BlimpMetricsServiceClient::GetMetricsService() {
+  return metrics_service_.get();
+}
+
+// In Chrome, UMA and Breakpad are enabled/disabled together by the same
+// checkbox and they share the same client ID (a.k.a. GUID).
+// This is not required by Blimp, so these are no-ops.
+void BlimpMetricsServiceClient::SetMetricsClientId(
+    const std::string& client_id) {}
+
+// Recording can not be disabled in Blimp, so this function is a no-op.
+void BlimpMetricsServiceClient::OnRecordingDisabled() {}
+
+bool BlimpMetricsServiceClient::IsOffTheRecordSessionActive() {
+  // Blimp does not have incognito mode.
+  return false;
+}
+
+int32_t BlimpMetricsServiceClient::GetProduct() {
+  // Indicates product family (e.g. Chrome v Android Webview), not reported
+  // platform (e.g. Chrome_Linux, Chrome_Mac).
+  return metrics::ChromeUserMetricsExtension::CHROME;
+}
+
+std::string BlimpMetricsServiceClient::GetApplicationLocale() {
+  return base::i18n::GetConfiguredLocale();
+}
+
+bool BlimpMetricsServiceClient::GetBrand(std::string* brand_code) {
+  // Blimp doesn't use brand codes.
+  return false;
+}
+
+metrics::SystemProfileProto::Channel BlimpMetricsServiceClient::GetChannel() {
+  // Blimp engine does not have channel info yet.
+  return metrics::SystemProfileProto::CHANNEL_UNKNOWN;
+}
+
+std::string BlimpMetricsServiceClient::GetVersionString() {
+  return version_info::GetVersionNumber();
+}
+
+void BlimpMetricsServiceClient::OnLogUploadComplete() {}
+
+void BlimpMetricsServiceClient::InitializeSystemProfileMetrics(
+    const base::Closure& done_callback) {
+  // Blimp requires no additional work to InitializeSystemProfileMetrics
+  // and should proceed to the next call in the chain.
+  done_callback.Run();
+}
+
+void BlimpMetricsServiceClient::CollectFinalMetricsForLog(
+    const base::Closure& done_callback) {
+  // Blimp requires no additional work to CollectFinalMetricsForLog
+  // and should proceed to the next call in the chain
+  done_callback.Run();
+}
+
+std::unique_ptr<metrics::MetricsLogUploader>
+BlimpMetricsServiceClient::CreateUploader(
+    const base::Callback<void(int)>& on_upload_complete) {
+  return base::WrapUnique<metrics::MetricsLogUploader>(
+      new metrics::NetMetricsLogUploader(
+          request_context_getter_.get(), metrics::kDefaultMetricsServerUrl,
+          metrics::kDefaultMetricsMimeType, on_upload_complete));
+}
+
+base::TimeDelta BlimpMetricsServiceClient::GetStandardUploadInterval() {
+  return base::TimeDelta::FromMinutes(kStandardUploadIntervalMinutes);
+}
+
+metrics::MetricsServiceClient::EnableMetricsDefault
+BlimpMetricsServiceClient::GetDefaultOptIn() {
+  return OPT_IN;
+}
+
+BlimpMetricsServiceClient::BlimpMetricsServiceClient() {}
+
+BlimpMetricsServiceClient::~BlimpMetricsServiceClient() {}
+
+BlimpMetricsServiceClient* GetBlimpMetricsServiceClientInstance() {
+  return g_lazy_instance_.Pointer();
+}
+
+void InitializeBlimpMetrics(
+    std::unique_ptr<PrefService> pref_service,
+    scoped_refptr<net::URLRequestContextGetter> request_context_getter) {
+  GetBlimpMetricsServiceClientInstance()->Initialize(std::move(pref_service),
+                                                     request_context_getter);
+}
+
+void FinalizeBlimpMetrics() {
+  GetBlimpMetricsServiceClientInstance()->Finalize();
+}
+
+}  // namespace engine
+}  // namespace blimp
diff --git a/blimp/engine/app/blimp_metrics_service_client.h b/blimp/engine/app/blimp_metrics_service_client.h
new file mode 100644
index 0000000..11f6afa
--- /dev/null
+++ b/blimp/engine/app/blimp_metrics_service_client.h
@@ -0,0 +1,36 @@
+// Copyright 2016 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 BLIMP_ENGINE_APP_BLIMP_METRICS_SERVICE_CLIENT_H_
+#define BLIMP_ENGINE_APP_BLIMP_METRICS_SERVICE_CLIENT_H_
+
+#include <stdint.h>
+
+#include <string>
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+
+class PrefService;
+
+namespace net {
+class URLRequestContextGetter;
+}  // namespace net
+
+namespace blimp {
+namespace engine {
+
+// Initializes metrics reporting for Blimp including initializing metrics
+// providers and reporting state.
+void InitializeBlimpMetrics(
+    std::unique_ptr<PrefService> pref_service,
+    scoped_refptr<net::URLRequestContextGetter> request_context_getter);
+
+// Graceful and expected metrics reporting shutdown for Blimp.
+void FinalizeBlimpMetrics();
+
+}  // namespace engine
+}  // namespace blimp
+
+#endif  // BLIMP_ENGINE_APP_BLIMP_METRICS_SERVICE_CLIENT_H_
diff --git a/blimp/engine/app/blimp_metrics_service_client_unittest.cc b/blimp/engine/app/blimp_metrics_service_client_unittest.cc
new file mode 100644
index 0000000..956e4ab
--- /dev/null
+++ b/blimp/engine/app/blimp_metrics_service_client_unittest.cc
@@ -0,0 +1,94 @@
+// Copyright 2016 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 "blimp/engine/app/blimp_metrics_service_client.h"
+
+#include <list>
+#include <string>
+
+#include "base/memory/ref_counted.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "base/test/test_simple_task_runner.h"
+#include "base/thread_task_runner_handle.h"
+#include "components/metrics/metrics_service.h"
+#include "components/pref_registry/pref_registry_syncable.h"
+#include "components/prefs/in_memory_pref_store.h"
+#include "components/prefs/pref_service.h"
+#include "components/prefs/pref_service_factory.h"
+#include "net/url_request/url_request_context_getter.h"
+#include "net/url_request/url_request_test_util.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blimp {
+namespace engine {
+// Shows notifications which correspond to PersistentPrefStore's reading errors.
+void HandleReadError(PersistentPrefStore::PrefReadError error) {
+}
+
+class BlimpMetricsServiceClientTest : public testing::Test {
+ protected:
+  void SetUp() override;
+  void TearDown() override;
+
+  void SetUpPrefRegistry();
+  void SetUpPrefService();
+  void SetUpRequestContextGetter();
+
+  base::MessageLoop message_loop_;
+  scoped_refptr<user_prefs::PrefRegistrySyncable> pref_registry_;
+  std::unique_ptr<PrefService> pref_service_;
+  scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
+};
+
+void BlimpMetricsServiceClientTest::SetUp() {
+  // Set up all deps and then InitializeBlimpMetrics.
+  SetUpPrefRegistry();
+  SetUpPrefService();
+  SetUpRequestContextGetter();
+  base::SetRecordActionTaskRunner(message_loop_.task_runner());
+  InitializeBlimpMetrics(std::move(pref_service_), request_context_getter_);
+  base::RunLoop().RunUntilIdle();
+
+  // Checks of InitializeBlimpMetrics.
+  // TODO(jessicag): Check request_context_getter_ set.
+  // PrefService unique pointer moved to BlimpMetricsServiceClient.
+  EXPECT_EQ(nullptr, pref_service_.get());
+
+  // TODO(jessicag): Confirm registration of metrics providers.
+  // TODO(jessicag): MetricsService initializes recording state.
+  // TODO(jessicag): Confirm MetricsService::Start() is called.
+}
+
+void BlimpMetricsServiceClientTest::TearDown() {
+  FinalizeBlimpMetrics();
+  base::RunLoop().RunUntilIdle();
+  // TODO(jessicag): Ensure MetricsService::Stop() is called.
+}
+
+void BlimpMetricsServiceClientTest::SetUpPrefRegistry() {
+  pref_registry_ = new user_prefs::PrefRegistrySyncable();
+  metrics::MetricsService::RegisterPrefs(pref_registry_.get());
+}
+
+void BlimpMetricsServiceClientTest::SetUpPrefService() {
+  PrefServiceFactory pref_service_factory;
+  pref_service_factory.set_user_prefs(new InMemoryPrefStore());
+  pref_service_factory.set_read_error_callback(base::Bind(&HandleReadError));
+  pref_service_ = pref_service_factory.Create(pref_registry_.get());
+  ASSERT_NE(nullptr, pref_service_.get());
+}
+
+void BlimpMetricsServiceClientTest::SetUpRequestContextGetter() {
+  request_context_getter_ =
+      new net::TestURLRequestContextGetter(base::ThreadTaskRunnerHandle::Get());
+}
+
+TEST_F(BlimpMetricsServiceClientTest, InitializeFinalize) {
+  // SetUp and TearDown handle initialization and finalization checks.
+}
+
+}  // namespace engine
+}  // namespace blimp
diff --git a/blimp/engine/app/ui/blimp_screen.cc b/blimp/engine/app/ui/blimp_screen.cc
index b7d18b8..c10396af 100644
--- a/blimp/engine/app/ui/blimp_screen.cc
+++ b/blimp/engine/app/ui/blimp_screen.cc
@@ -47,9 +47,9 @@
   return gfx::Point();
 }
 
-gfx::NativeWindow BlimpScreen::GetWindowUnderCursor() {
+bool BlimpScreen::IsWindowUnderCursor(gfx::NativeWindow window) {
   NOTIMPLEMENTED();
-  return gfx::NativeWindow(nullptr);
+  return false;
 }
 
 gfx::NativeWindow BlimpScreen::GetWindowAtScreenPoint(const gfx::Point& point) {
diff --git a/blimp/engine/app/ui/blimp_screen.h b/blimp/engine/app/ui/blimp_screen.h
index adf884b..79cb0d6 100644
--- a/blimp/engine/app/ui/blimp_screen.h
+++ b/blimp/engine/app/ui/blimp_screen.h
@@ -34,7 +34,7 @@
 
   // display::Screen implementation.
   gfx::Point GetCursorScreenPoint() override;
-  gfx::NativeWindow GetWindowUnderCursor() override;
+  bool IsWindowUnderCursor(gfx::NativeWindow window) override;
   gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override;
   int GetNumDisplays() const override;
   std::vector<display::Display> GetAllDisplays() const override;
diff --git a/blimp/engine/common/blimp_browser_context.cc b/blimp/engine/common/blimp_browser_context.cc
index 6a2a7ec0..b5c8294 100644
--- a/blimp/engine/common/blimp_browser_context.cc
+++ b/blimp/engine/common/blimp_browser_context.cc
@@ -7,14 +7,27 @@
 #include "base/bind.h"
 #include "base/environment.h"
 #include "base/files/file_util.h"
+#include "base/memory/ptr_util.h"
 #include "base/nix/xdg_util.h"
 #include "base/path_service.h"
 #include "blimp/engine/app/blimp_permission_manager.h"
+#include "components/metrics/metrics_service.h"
+#include "components/pref_registry/pref_registry_syncable.h"
+#include "components/prefs/in_memory_pref_store.h"
+#include "components/prefs/pref_service.h"
+#include "components/prefs/pref_service_factory.h"
 #include "content/public/browser/background_sync_controller.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/common/content_switches.h"
 
+namespace {
+// Function for optionally handling read errors. Is a no-op for Blimp.
+// While the PersistentPrefStore's interface is supported, it is an in-memory
+// store only.
+void IgnoreReadError(PersistentPrefStore::PrefReadError error) {}
+}  // namespace
+
 namespace blimp {
 namespace engine {
 
@@ -59,9 +72,11 @@
       off_the_record_(off_the_record),
       net_log_(net_log) {
   InitWhileIOAllowed();
+  InitializeBlimpMetrics(GetPrefService(), GetSystemRequestContextGetter());
 }
 
 BlimpBrowserContext::~BlimpBrowserContext() {
+  FinalizeBlimpMetrics();
   if (resource_context_) {
     content::BrowserThread::DeleteSoon(content::BrowserThread::IO, FROM_HERE,
                                        resource_context_.release());
@@ -79,6 +94,22 @@
   BrowserContext::Initialize(this, path_);
 }
 
+std::unique_ptr<PrefService> BlimpBrowserContext::GetPrefService() {
+  // Create PrefRegistry and register metrics services preferences with it.
+  scoped_refptr<user_prefs::PrefRegistrySyncable> pref_registry(
+      new user_prefs::PrefRegistrySyncable());
+  metrics::MetricsService::RegisterPrefs(pref_registry.get());
+  PrefServiceFactory pref_service_factory;
+
+  // Create an in memory preferences store to hold metrics logs.
+  pref_service_factory.set_user_prefs(new InMemoryPrefStore());
+  pref_service_factory.set_read_error_callback(base::Bind(&IgnoreReadError));
+
+  // Create a PrefService binding the PrefRegistry to the InMemoryPrefStore.
+  // The PrefService ends up owning the PrefRegistry and the InMemoryPrefStore.
+  return pref_service_factory.Create(pref_registry.get());
+}
+
 std::unique_ptr<content::ZoomLevelDelegate>
 BlimpBrowserContext::CreateZoomLevelDelegate(const base::FilePath&) {
   return nullptr;
diff --git a/blimp/engine/common/blimp_browser_context.h b/blimp/engine/common/blimp_browser_context.h
index e02f831..b3b9f63 100644
--- a/blimp/engine/common/blimp_browser_context.h
+++ b/blimp/engine/common/blimp_browser_context.h
@@ -9,6 +9,7 @@
 
 #include "base/files/file_path.h"
 #include "base/macros.h"
+#include "blimp/engine/app/blimp_metrics_service_client.h"
 #include "blimp/engine/app/blimp_system_url_request_context_getter.h"
 #include "blimp/engine/app/blimp_url_request_context_getter.h"
 #include "content/public/browser/browser_context.h"
@@ -67,6 +68,10 @@
   // allowed on the current thread.
   void InitWhileIOAllowed();
 
+  // Used in metrics initialization to get a PrefService to store logs
+  // temporarily.
+  std::unique_ptr<PrefService> GetPrefService();
+
   std::unique_ptr<BlimpResourceContext> resource_context_;
   scoped_refptr<BlimpSystemURLRequestContextGetter> system_context_getter_;
   bool ignore_certificate_errors_;
diff --git a/blimp/net/BUILD.gn b/blimp/net/BUILD.gn
index 0b722be..f55a31f 100644
--- a/blimp/net/BUILD.gn
+++ b/blimp/net/BUILD.gn
@@ -23,6 +23,8 @@
     "blimp_message_thread_pipe.h",
     "blimp_net_export.h",
     "blimp_transport.h",
+    "blob_channel/blob_channel_receiver.cc",
+    "blob_channel/blob_channel_receiver.h",
     "browser_connection_handler.cc",
     "browser_connection_handler.h",
     "client_connection_manager.cc",
@@ -103,6 +105,7 @@
     "blimp_message_output_buffer_unittest.cc",
     "blimp_message_pump_unittest.cc",
     "blimp_message_thread_pipe_unittest.cc",
+    "blob_channel/blob_channel_receiver_unittest.cc",
     "browser_connection_handler_unittest.cc",
     "client_connection_manager_unittest.cc",
     "compressed_packet_unittest.cc",
@@ -123,6 +126,7 @@
     "//base/test:run_all_unittests",
     "//base/test:test_support",
     "//blimp/common",
+    "//blimp/common:test_support",
     "//blimp/common/proto",
     "//net:test_support",
     "//testing/gmock",
diff --git a/blimp/net/blob_channel/blob_channel_receiver.cc b/blimp/net/blob_channel/blob_channel_receiver.cc
new file mode 100644
index 0000000..7200dd3
--- /dev/null
+++ b/blimp/net/blob_channel/blob_channel_receiver.cc
@@ -0,0 +1,55 @@
+// Copyright 2016 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 "blimp/net/blob_channel/blob_channel_receiver.h"
+
+#include "base/logging.h"
+#include "base/macros.h"
+#include "blimp/common/blob_cache/blob_cache.h"
+
+namespace blimp {
+
+BlobChannelReceiver::Delegate::Delegate() {}
+
+BlobChannelReceiver::Delegate::~Delegate() {
+  DCHECK(!receiver_);
+}
+
+void BlobChannelReceiver::Delegate::SetReceiver(BlobChannelReceiver* receiver) {
+  receiver_ = receiver;
+}
+
+void BlobChannelReceiver::Delegate::OnBlobReceived(const BlobId& id,
+                                                   BlobDataPtr data) {
+  if (receiver_) {
+    receiver_->OnBlobReceived(id, data);
+  }
+}
+
+BlobChannelReceiver::BlobChannelReceiver(std::unique_ptr<BlobCache> cache,
+                                         std::unique_ptr<Delegate> delegate)
+    : cache_(std::move(cache)), delegate_(std::move(delegate)) {
+  DCHECK(cache_);
+  delegate_->SetReceiver(this);
+}
+
+BlobChannelReceiver::~BlobChannelReceiver() {
+  delegate_->SetReceiver(nullptr);
+}
+
+BlobDataPtr BlobChannelReceiver::Get(const BlobId& id) {
+  DVLOG(2) << "Get blob: " << id;
+
+  base::AutoLock lock(cache_lock_);
+  return cache_->Get(id);
+}
+
+void BlobChannelReceiver::OnBlobReceived(const BlobId& id, BlobDataPtr data) {
+  DVLOG(2) << "Blob received: " << id;
+
+  base::AutoLock lock(cache_lock_);
+  cache_->Put(id, data);
+}
+
+}  // namespace blimp
diff --git a/blimp/net/blob_channel/blob_channel_receiver.h b/blimp/net/blob_channel/blob_channel_receiver.h
new file mode 100644
index 0000000..bdfcd236
--- /dev/null
+++ b/blimp/net/blob_channel/blob_channel_receiver.h
@@ -0,0 +1,69 @@
+// Copyright 2016 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 BLIMP_NET_BLOB_CHANNEL_BLOB_CHANNEL_RECEIVER_H_
+#define BLIMP_NET_BLOB_CHANNEL_BLOB_CHANNEL_RECEIVER_H_
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/synchronization/lock.h"
+#include "blimp/common/blob_cache/blob_cache.h"
+#include "blimp/net/blimp_message_processor.h"
+#include "blimp/net/blimp_net_export.h"
+
+namespace blimp {
+
+class BlobCache;
+
+// Receives blobs from a remote sender.
+class BLIMP_NET_EXPORT BlobChannelReceiver {
+ public:
+  class Delegate {
+   public:
+    Delegate();
+    virtual ~Delegate();
+
+   protected:
+    // Forwards incoming blob data to |receiver_|.
+    void OnBlobReceived(const BlobId& id, BlobDataPtr data);
+
+   private:
+    friend class BlobChannelReceiver;
+
+    // Sets the Receiver object which will take incoming blobs.
+    void SetReceiver(BlobChannelReceiver* receiver);
+
+    BlobChannelReceiver* receiver_ = nullptr;
+
+    DISALLOW_COPY_AND_ASSIGN(Delegate);
+  };
+
+  BlobChannelReceiver(std::unique_ptr<BlobCache> cache,
+                      std::unique_ptr<Delegate> delegate);
+  ~BlobChannelReceiver();
+
+  // Gets a blob from the BlobChannel.
+  // Returns nullptr if the blob is not available in the channel.
+  // Can be accessed concurrently from any thread. Calling code must ensure that
+  // the object instance outlives all calls to Get().
+  BlobDataPtr Get(const BlobId& id);
+
+ private:
+  friend class Delegate;
+
+  // Called by Delegate::OnBlobReceived() when a blob arrives over the channel.
+  void OnBlobReceived(const BlobId& id, BlobDataPtr data);
+
+  std::unique_ptr<BlobCache> cache_;
+  std::unique_ptr<Delegate> delegate_;
+
+  // Guards against concurrent access to |cache_|.
+  base::Lock cache_lock_;
+
+  DISALLOW_COPY_AND_ASSIGN(BlobChannelReceiver);
+};
+
+}  // namespace blimp
+
+#endif  // BLIMP_NET_BLOB_CHANNEL_BLOB_CHANNEL_RECEIVER_H_
diff --git a/blimp/net/blob_channel/blob_channel_receiver_unittest.cc b/blimp/net/blob_channel/blob_channel_receiver_unittest.cc
new file mode 100644
index 0000000..3a42ffe
--- /dev/null
+++ b/blimp/net/blob_channel/blob_channel_receiver_unittest.cc
@@ -0,0 +1,88 @@
+// Copyright 2016 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 <memory>
+#include <string>
+
+#include "base/memory/ptr_util.h"
+#include "base/memory/ref_counted.h"
+#include "blimp/common/blob_cache/mock_blob_cache.h"
+#include "blimp/net/blob_channel/blob_channel_receiver.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blimp {
+namespace {
+
+using testing::_;
+using testing::Return;
+
+const char kBlobId[] = "blob-1";
+const char kBlobPayload[] = "blob-1-payload";
+
+// Helper function for creating a cache payload vector from a string.
+BlobDataPtr CreatePayload(const std::string& input) {
+  return BlobDataPtr(new BlobData(input));
+}
+
+MATCHER_P(BlobDataEqual, expected, "") {
+  return expected->data == arg->data;
+}
+
+class NullBlobReceiverDelegate : public BlobChannelReceiver::Delegate {
+ public:
+  using BlobChannelReceiver::Delegate::OnBlobReceived;
+};
+
+class BlobChannelReceiverTest : public testing::Test {
+ public:
+  BlobChannelReceiverTest()
+      : delegate_(new NullBlobReceiverDelegate),
+        cache_(new testing::StrictMock<MockBlobCache>),
+        blob_receiver_(new BlobChannelReceiver(base::WrapUnique(cache_),
+                                               base::WrapUnique(delegate_)))
+
+  {}
+
+  ~BlobChannelReceiverTest() override {}
+
+  NullBlobReceiverDelegate* delegate_;
+  testing::StrictMock<MockBlobCache>* cache_;
+  std::unique_ptr<BlobChannelReceiver> blob_receiver_;
+};
+
+TEST_F(BlobChannelReceiverTest, GetKnownBlob) {
+  auto payload = CreatePayload(kBlobPayload);
+  EXPECT_CALL(*cache_, Get(kBlobId)).WillOnce(Return(payload));
+
+  auto result = blob_receiver_->Get(kBlobId);
+
+  ASSERT_NE(nullptr, result.get());
+  EXPECT_EQ(result->data, payload->data);
+}
+
+TEST_F(BlobChannelReceiverTest, GetFromDelegateReceiveMethod) {
+  auto payload = CreatePayload(kBlobPayload);
+
+  EXPECT_CALL(*cache_, Put(kBlobId, BlobDataEqual(payload)));
+  EXPECT_CALL(*cache_, Get(kBlobId)).WillOnce(Return(payload));
+
+  delegate_->OnBlobReceived(kBlobId, payload);
+
+  auto result = blob_receiver_->Get(kBlobId);
+
+  ASSERT_NE(nullptr, result.get());
+  EXPECT_EQ(payload->data, result->data);
+}
+
+TEST_F(BlobChannelReceiverTest, GetUnknownBlob) {
+  EXPECT_CALL(*cache_, Get(kBlobId)).WillOnce(Return(nullptr));
+  auto result = blob_receiver_->Get(kBlobId);
+
+  ASSERT_EQ(nullptr, result.get());
+}
+
+}  // namespace
+}  // namespace blimp
diff --git a/build/android/incremental_install/BUILD.gn b/build/android/incremental_install/BUILD.gn
index 1724884..3bb4696e 100644
--- a/build/android/incremental_install/BUILD.gn
+++ b/build/android/incremental_install/BUILD.gn
@@ -15,5 +15,5 @@
     "java/org/chromium/incrementalinstall/Reflect.java",
   ]
   emma_never_instrument = true
-  run_findbugs = false
+  run_findbugs_override = false
 }
diff --git a/build/android/method_count.py b/build/android/method_count.py
index c816f10b..6569f0e 100755
--- a/build/android/method_count.py
+++ b/build/android/method_count.py
@@ -23,13 +23,14 @@
 _METHOD_IDS_SIZE_RE = re.compile(r'^method_ids_size +: +(\d+)$')
 
 def ExtractIfZip(dexfile, tmpdir):
-  if not dexfile.endswith('.zip'):
+  if not os.path.splitext(dexfile)[1] in ('.zip', '.apk', '.jar'):
     return [dexfile]
 
   with zipfile.ZipFile(dexfile, 'r') as z:
-    z.extractall(tmpdir)
+    dex_files = [n for n in z.namelist() if n.endswith('.dex')]
+    z.extractall(tmpdir, dex_files)
 
-  return [os.path.join(tmpdir, f) for f in os.listdir(tmpdir)]
+  return [os.path.join(tmpdir, f) for f in dex_files]
 
 def SingleMethodCount(dexfile):
   for line in dexdump.DexDump(dexfile, file_summary=True):
diff --git a/build/args/headless.gn b/build/args/headless.gn
index 8054d39e..f013e83 100644
--- a/build/args/headless.gn
+++ b/build/args/headless.gn
@@ -22,5 +22,6 @@
 use_gconf = false
 use_gio = false
 use_kerberos = false
+use_libpci = false
 use_pulseaudio = false
 use_udev = false
diff --git a/build/common.gypi b/build/common.gypi
index 641cc709f..132b4da 100644
--- a/build/common.gypi
+++ b/build/common.gypi
@@ -2234,7 +2234,7 @@
               # no need to load it dynamically.
               'clang_dynlib_flags%': '',
             }],
-            ['(OS=="android" or OS=="linux") and chromecast==0 and chromeos==0', {
+            ['(OS=="android" or OS=="linux") and chromecast==0', {
               'clang_plugin_check_ipc_arg': '-Xclang -plugin-arg-find-bad-constructs -Xclang check-ipc',
             }, {
               'clang_plugin_check_ipc_arg': '',
diff --git a/build/compiled_action.gni b/build/compiled_action.gni
index 855df7a..c7fb8c65 100644
--- a/build/compiled_action.gni
+++ b/build/compiled_action.gni
@@ -81,8 +81,6 @@
          "compiled_action doesn't take a sources arg. Use inputs instead.")
 
   action(target_name) {
-    deps = []
-    inputs = []
     forward_variables_from(invoker,
                            [
                              "deps",
@@ -91,6 +89,12 @@
                              "testonly",
                              "visibility",
                            ])
+    if (!defined(deps)) {
+      deps = []
+    }
+    if (!defined(inputs)) {
+      inputs = []
+    }
 
     script = "//build/gn_run_binary.py"
 
@@ -124,8 +128,6 @@
   assert(defined(invoker.args), "args must be defined for $target_name")
 
   action_foreach(target_name) {
-    deps = []
-    inputs = []
     forward_variables_from(invoker,
                            [
                              "deps",
@@ -135,6 +137,12 @@
                              "testonly",
                              "visibility",
                            ])
+    if (!defined(deps)) {
+      deps = []
+    }
+    if (!defined(inputs)) {
+      inputs = []
+    }
 
     script = "//build/gn_run_binary.py"
 
diff --git a/build/config/android/BUILD.gn b/build/config/android/BUILD.gn
index ec3b531..b44a8550 100644
--- a/build/config/android/BUILD.gn
+++ b/build/config/android/BUILD.gn
@@ -8,6 +8,8 @@
 
 assert(is_android)
 
+use_gold = current_cpu == "x86" || current_cpu == "x64" || current_cpu == "arm"
+
 # This is included by reference in the //build/config/compiler config that
 # is applied to all targets. It is here to separate out the logic that is
 # Android-only.
@@ -43,7 +45,7 @@
   }
 
   # Use gold for Android for most CPU architectures.
-  if (current_cpu == "x86" || current_cpu == "x64" || current_cpu == "arm") {
+  if (use_gold) {
     ldflags += [ "-fuse-ld=gold" ]
     if (is_clang) {
       # Let clang find the ld.gold in the NDK.
@@ -179,6 +181,12 @@
   cflags = [ "-fPIE" ]
   asmflags = [ "-fPIE" ]
   ldflags = [ "-pie" ]
+
+  if (!use_gold) {
+    # ld needs help finding libraries when linking.
+    _rebased_sysroot = rebase_path(sysroot, root_build_dir)
+    ldflags += [ "-Wl,-rpath-link=.:$_rebased_sysroot/usr/lib" ]
+  }
 }
 
 config("hide_native_jni_exports") {
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 2c5586c..f94caac 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -25,7 +25,6 @@
 
 template("android_lint") {
   action(target_name) {
-    deps = []
     forward_variables_from(invoker,
                            [
                              "deps",
@@ -33,6 +32,9 @@
                              "public_deps",
                              "testonly",
                            ])
+    if (!defined(deps)) {
+      deps = []
+    }
     _cache_dir = "$root_build_dir/android_lint_cache"
     _result_path = "$target_gen_dir/$target_name/result.xml"
     _config_path = "$target_gen_dir/$target_name/config.xml"
@@ -386,13 +388,15 @@
            type == "android_assets" || type == "resource_rewriter" ||
            type == "java_binary" || type == "group")
 
-    deps = []
     forward_variables_from(invoker,
                            [
                              "deps",
                              "testonly",
                              "visibility",
                            ])
+    if (!defined(deps)) {
+      deps = []
+    }
 
     script = "//build/android/gyp/write_build_config.py"
     depfile = "$target_gen_dir/$target_name.d"
@@ -1346,7 +1350,6 @@
   if (defined(invoker.main_class)) {
     _binary_script_target_name = "${_template_name}__java_binary_script"
     java_binary_script(_binary_script_target_name) {
-      deps = []
       forward_variables_from(invoker,
                              [
                                "bootclasspath",
@@ -1354,6 +1357,9 @@
                                "main_class",
                                "wrapper_script_args",
                              ])
+      if (!defined(deps)) {
+        deps = []
+      }
       build_config = _build_config
       jar_path = _jar_path
       script_name = _template_name
@@ -1436,9 +1442,12 @@
     _enable_errorprone = invoker.enable_errorprone
   }
 
-  _enable_incremental_javac = enable_incremental_javac
-  if (defined(invoker.enable_incremental_javac)) {
-    _enable_incremental_javac = invoker.enable_incremental_javac
+  if (defined(invoker.enable_incremental_javac_override)) {
+    # Use invoker-specified override.
+    _enable_incremental_javac = invoker.enable_incremental_javac_override
+  } else {
+    # Default to build arg if not overridden.
+    _enable_incremental_javac = enable_incremental_javac
   }
 
   _manifest_entries = []
@@ -1615,7 +1624,12 @@
     _android_manifest = invoker.android_manifest
   }
   assert(_android_manifest != "")  # Mark as used.
-  _run_findbugs = defined(invoker.run_findbugs) && invoker.run_findbugs
+
+  if (defined(invoker.run_findbugs_override)) {
+    _run_findbugs = invoker.run_findbugs_override
+  } else {
+    _run_findbugs = run_findbugs  # Default to build arg if not overridden.
+  }
   assert(_run_findbugs || true)  # Mark as used.
 
   # Don't enable coverage, lint, findbugs unless the target has some
@@ -1701,7 +1715,7 @@
                              "alternative_android_sdk_ijar_dep",
                              "dist_jar_path",
                              "enable_errorprone",
-                             "enable_incremental_javac",
+                             "enable_incremental_javac_override",
                              "jar_excluded_patterns",
                              "manifest_entries",
                              "proguard_config",
@@ -1788,12 +1802,14 @@
   }
 
   group(target_name) {
-    data_deps = []
     forward_variables_from(invoker,
                            [
                              "data_deps",
                              "visibility",
                            ])
+    if (!defined(data_deps)) {
+      data_deps = []
+    }
     public_deps = _final_deps
     if (_has_lint_target) {
       data_deps += [ ":${_template_name}__analysis" ]
@@ -1952,8 +1968,6 @@
 template("copy_ex") {
   set_sources_assignment_filter([])
   action(target_name) {
-    inputs = []
-    sources = []
     forward_variables_from(invoker,
                            [
                              "data",
@@ -1963,6 +1977,9 @@
                              "testonly",
                              "visibility",
                            ])
+    if (!defined(sources)) {
+      sources = []
+    }
     script = "//build/android/gyp/copy_ex.py"
 
     depfile = "$target_gen_dir/$target_name.d"
@@ -2099,13 +2116,17 @@
       defined(invoker.incremental_install) && invoker.incremental_install
 
   action(target_name) {
-    data_deps = []
-    deps = []
     forward_variables_from(invoker,
                            [
                              "data_deps",
                              "deps",
                            ])
+    if (!defined(deps)) {
+      deps = []
+    }
+    if (!defined(data_deps)) {
+      data_deps = []
+    }
 
     script = "//build/android/gyp/create_test_runner_script.py"
     depfile = "$target_gen_dir/$target_name.d"
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index cf958ef..1796ac35 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -85,13 +85,15 @@
   }
 
   group(target_name) {
-    public_deps = []
     forward_variables_from(invoker,
                            [
                              "deps",
                              "public_deps",
                              "visibility",
                            ])
+    if (!defined(public_deps)) {
+      public_deps = []
+    }
     public_deps += [ ":$foreach_target_name" ]
     public_configs = [ ":jni_includes_${target_name}" ]
   }
@@ -637,7 +639,6 @@
 
   process_resources(process_resources_target_name) {
     visibility = [ ":$final_target_name" ]
-    deps = []
     forward_variables_from(invoker,
                            [
                              "app_as_shared_lib",
@@ -650,6 +651,9 @@
                              "shared_resources",
                              "v14_skip",
                            ])
+    if (!defined(deps)) {
+      deps = []
+    }
     deps += [ ":$build_config_target_name" ]
 
     # Always generate R.onResourcesLoaded() method, it is required for
@@ -908,7 +912,8 @@
 #     android_library target, for example.
 #   chromium_code: If true, extra analysis warning/errors will be enabled.
 #   enable_errorprone: If true, enables the errorprone compiler.
-#   enable_incremental_javac: Overrides the global enable_incremental_javac.
+#   enable_incremental_javac_override: Overrides the
+#     global enable_incremental_javac.
 #   main_class: When specified, a wrapper script is created within
 #     $root_build_dir/bin to launch the binary with the given class as the
 #     entrypoint.
@@ -1007,7 +1012,8 @@
 #
 #   chromium_code: If true, extra analysis warning/errors will be enabled.
 #   enable_errorprone: If true, enables the errorprone compiler.
-#   enable_incremental_javac: Overrides the global enable_incremental_javac.
+#   enable_incremental_javac_override: Overrides the global
+#     enable_incremental_javac.
 #
 #   jar_excluded_patterns: List of patterns of .class files to exclude from the
 #     final jar.
@@ -1096,7 +1102,8 @@
 #
 #   chromium_code: If true, extra analysis warning/errors will be enabled.
 #   enable_errorprone: If true, enables the errorprone compiler.
-#   enable_incremental_javac: Overrides the global enable_incremental_javac.
+#   enable_incremental_javac_override: Overrides the global
+#     enable_incremental_javac.
 #
 #   jar_excluded_patterns: List of patterns of .class files to exclude from the
 #     final jar.
@@ -1269,6 +1276,8 @@
 #     installation only on Android M or later. In these releases the system
 #     linker does relocation unpacking, so we can enable it unconditionally.
 #   secondary_native_libs: the path of native libraries for secondary app abi.
+#   run_findbugs_override: Forces run_findbugs on or off. If undefined, the
+#     default will use the build arg run_findbugs.
 #
 # Example
 #   android_apk("foo_apk") {
@@ -1556,7 +1565,7 @@
                            [
                              "chromium_code",
                              "java_files",
-                             "run_findbugs",
+                             "run_findbugs_override",
                            ])
     supports_android = true
     requires_android = true
@@ -1659,7 +1668,6 @@
   }
 
   dex("$final_dex_target_name") {
-    forward_variables_from(invoker, [ "enable_multidex" ])
     deps = _dex_deps + [ ":$build_config_target" ]
     inputs = [
       _build_config,
@@ -1750,7 +1758,6 @@
 
   _final_deps += [ ":${_template_name}__create" ]
   create_apk("${_template_name}__create") {
-    deps = []
     forward_variables_from(invoker,
                            [
                              "alternative_android_sdk_jar",
@@ -1766,6 +1773,9 @@
                              "uncompress_shared_libraries",
                              "write_asset_list",
                            ])
+    if (!defined(deps)) {
+      deps = []
+    }
     apk_path = _final_apk_path
     android_manifest = _android_manifest
     assets_build_config = _build_config
@@ -1929,12 +1939,14 @@
     public_deps = _final_deps
   }
   group("${target_name}_incremental") {
-    data_deps = []
     forward_variables_from(invoker,
                            [
                              "data",
                              "data_deps",
                            ])
+    if (!defined(data_deps)) {
+      data_deps = []
+    }
 
     # device/commands is used by the installer script to push files via .zip.
     data_deps += [ "//build/android/pylib/device/commands" ] +
@@ -2037,8 +2049,11 @@
     }
 
     create_dist_ijar = true
-    run_findbugs = defined(invoker.run_findbugs) && invoker.run_findbugs &&
-                   defined(invoker.java_files)
+    if (defined(invoker.run_findbugs_override)) {
+      # Only allow findbugs when there are java files.
+      run_findbugs_override =
+          invoker.run_findbugs_override && defined(invoker.java_files)
+    }
   }
 
   group(target_name) {
diff --git a/build/config/clang/BUILD.gn b/build/config/clang/BUILD.gn
index 8f20a89..dbff398 100644
--- a/build/config/clang/BUILD.gn
+++ b/build/config/clang/BUILD.gn
@@ -51,7 +51,7 @@
       "check-implicit-copy-ctors",
     ]
 
-    if ((is_linux || is_android) && !is_chromeos && !is_chromecast) {
+    if ((is_linux || is_android) && !is_chromecast) {
       cflags += [
         "-Xclang",
         "-plugin-arg-find-bad-constructs",
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 73d1942..229e394a 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -298,7 +298,7 @@
 
   # Linux-specific compiler flags setup.
   # ------------------------------------
-  if (is_posix && use_lld) {
+  if (is_posix && use_lld && !is_nacl) {
     ldflags += [ "-fuse-ld=lld" ]
   } else if (use_gold) {
     ldflags += [
@@ -336,7 +336,7 @@
     ldflags += [ "-fuse-ld=bfd" ]
   }
 
-  if (is_posix && (use_gold || use_lld) && !using_sanitizer &&
+  if (is_posix && (use_gold || (use_lld && !is_nacl)) && !using_sanitizer &&
       !(is_android && use_order_profiling)) {
     ldflags += [ "-Wl,--icf=all" ]
   }
@@ -355,7 +355,7 @@
   # clang-cl (used if is_win) doesn't expose this flag.
   # Currently disabled for nacl since its toolchain lacks this flag (too old).
   # TODO(zforman): Once nacl's toolchain is updated, remove check.
-  if (is_clang && !is_win && !is_nacl) {
+  if (is_clang && is_linux) {
     absolute_path = rebase_path("//.")
     cflags += [ "-fdebug-prefix-map=$absolute_path=." ]
   }
diff --git a/build/config/ios/rules.gni b/build/config/ios/rules.gni
index 8ef083c..ebcd774 100644
--- a/build/config/ios/rules.gni
+++ b/build/config/ios/rules.gni
@@ -167,10 +167,14 @@
       data_deps += [ "//testing/iossim" ]
     }
 
+    product_type = "com.apple.product-type.application"
     bundle_root_dir = "$root_out_dir/$_output_name.app"
     bundle_resources_dir = bundle_root_dir
     bundle_executable_dir = bundle_root_dir
     bundle_plugins_dir = "$bundle_root_dir/Plugins"
+    assert(
+        product_type != "",
+        "workaround to allow generation with version of gn that don't support product_type property for create_bundle target => remove once gn has rolled this change")
   }
 
   # TODO(crbug.com/297668):
diff --git a/build/config/mac/base_rules.gni b/build/config/mac/base_rules.gni
index b74dbdf..4da6ea2 100644
--- a/build/config/mac/base_rules.gni
+++ b/build/config/mac/base_rules.gni
@@ -64,6 +64,11 @@
           "-f=" + invoker.format,
         ] + rebase_path(sources, root_build_dir)
     args = [ "@{{response_file_name}}" ]
+    forward_variables_from(invoker,
+                           [
+                             "testonly",
+                             "deps",
+                           ])
   }
 }
 
diff --git a/build/config/mac/rules.gni b/build/config/mac/rules.gni
index 2105afa7..193070f 100644
--- a/build/config/mac/rules.gni
+++ b/build/config/mac/rules.gni
@@ -20,6 +20,17 @@
 #         (optional) string array, 'key=value' pairs for extra fields which are
 #         specified in a source Info.plist template.
 template("mac_info_plist") {
+  assert(defined(invoker.info_plist) != defined(invoker.info_plist_target),
+         "Only one of info_plist or info_plist_target may be specified in " +
+             target_name)
+
+  if (defined(invoker.info_plist)) {
+    _info_plist = invoker.info_plist
+  } else {
+    _info_plist_target_output = get_target_outputs(invoker.info_plist_target)
+    _info_plist = _info_plist_target_output[0]
+  }
+
   info_plist(target_name) {
     format = "xml1"
     extra_substitutions = []
@@ -32,9 +43,18 @@
     ]
     plist_templates = [
       "//build/config/mac/BuildInfo.plist",
-      invoker.info_plist,
+      _info_plist,
     ]
-    forward_variables_from(invoker, [ "executable_name" ])
+    if (defined(invoker.info_plist_target)) {
+      deps = [
+        invoker.info_plist_target,
+      ]
+    }
+    forward_variables_from(invoker,
+                           [
+                             "testonly",
+                             "executable_name",
+                           ])
   }
 }
 
@@ -101,7 +121,13 @@
 # Arguments
 #
 #     info_plist:
-#         string, path to the Info.plist file that will be used for the bundle.
+#         (optional) string, path to the Info.plist file that will be used for
+#         the bundle.
+#
+#     info_plist_target:
+#         (optional) string, if the info_plist is generated from an action,
+#         rather than a regular source file, specify the target name in lieu
+#         of info_plist. The two arguments are mutually exclusive.
 #
 #     output_name:
 #         (optional) string, name of the generated framework without the
@@ -118,8 +144,6 @@
 template("mac_framework_bundle") {
   assert(defined(invoker.deps),
          "Dependencies must be specified for $target_name")
-  assert(defined(invoker.info_plist),
-         "The Info.plist file must be specified for $target_name")
 
   _info_plist_target = target_name + "_info_plist"
 
@@ -128,7 +152,12 @@
     if (defined(invoker.output_name)) {
       executable_name = invoker.output_name
     }
-    forward_variables_from(invoker, [ "info_plist" ])
+    forward_variables_from(invoker,
+                           [
+                             "testonly",
+                             "info_plist",
+                             "info_plist_target",
+                           ])
   }
 
   _info_plist_bundle_data = _info_plist_target + "_bundle_data"
@@ -137,7 +166,7 @@
     forward_variables_from(invoker, [ "testonly" ])
     sources = get_target_outputs(":$_info_plist_target")
     outputs = [
-      "{{bundle_root_dir}}/Info.plist",
+      "{{bundle_resources_dir}}/Info.plist",
     ]
     public_deps = [
       ":$_info_plist_target",
@@ -159,15 +188,22 @@
 # Arguments
 #
 #     info_plist:
-#         string, path to the Info.plist file that will be used for the bundle.
+#         (optional) string, path to the Info.plist file that will be used for
+#         the bundle.
+#
+#     info_plist_target:
+#         (optional) string, if the info_plist is generated from an action,
+#         rather than a regular source file, specify the target name in lieu
+#         of info_plist. The two arguments are mutually exclusive.
 #
 #     output_name:
 #         (optional) string, name of the generated app without the
 #         .app suffix. If omitted, defaults to target_name.
+#
+#     extra_configs:
+#         (optional) list of label, additional configs to apply to the
+#         executable target.
 template("mac_app_bundle") {
-  assert(defined(invoker.info_plist),
-         "The Info.plist file must be specified for $target_name")
-
   _target_name = target_name
   _output_name = target_name
   if (defined(invoker.output_name)) {
@@ -177,6 +213,18 @@
   _executable_target = target_name + "_executable"
   _executable_bundle_data = _executable_target + "_bundle_data"
 
+  _info_plist_target = target_name + "_info_plist"
+
+  mac_info_plist(_info_plist_target) {
+    executable_name = _output_name
+    forward_variables_from(invoker,
+                           [
+                             "testonly",
+                             "info_plist",
+                             "info_plist_target",
+                           ])
+  }
+
   executable(_executable_target) {
     visibility = [ ":$_executable_bundle_data" ]
     forward_variables_from(invoker,
@@ -188,6 +236,9 @@
                              "output_name",
                              "visibility",
                            ])
+    if (defined(extra_configs)) {
+      configs += extra_configs
+    }
     output_name = _output_name
     output_dir = "$target_out_dir/$_executable_target"
   }
@@ -206,13 +257,6 @@
     ]
   }
 
-  _info_plist_target = target_name + "_info_plist"
-
-  mac_info_plist(_info_plist_target) {
-    executable_name = _output_name
-    forward_variables_from(invoker, [ "info_plist" ])
-  }
-
   _info_plist_bundle_data = _info_plist_target + "_bundle_data"
 
   bundle_data(_info_plist_bundle_data) {
diff --git a/build/config/nacl/rules.gni b/build/config/nacl/rules.gni
index 4ae7c53..bfc3ec3b 100644
--- a/build/config/nacl/rules.gni
+++ b/build/config/nacl/rules.gni
@@ -21,8 +21,6 @@
   assert(defined(invoker.nmf), "Must define nmf")
 
   action(target_name) {
-    nmfflags = []
-
     forward_variables_from(invoker,
                            [
                              "deps",
@@ -36,6 +34,9 @@
                              "testonly",
                              "visibility",
                            ])
+    if (!defined(nmfflags)) {
+      nmfflags = []
+    }
 
     # TODO(phosek): Remove this conditional once
     # https://bugs.chromium.org/p/nativeclient/issues/detail?id=4339 is
@@ -119,15 +120,12 @@
   assert(defined(invoker.nmf), "Must define nmf")
 
   action(target_name) {
-    nmfflags = []
-
     forward_variables_from(invoker,
                            [
                              "deps",
                              "data_deps",
                              "executable",
                              "nmf",
-                             "nmfflags",
                              "testonly",
                              "public_deps",
                              "visibility",
@@ -152,9 +150,12 @@
       arch = target_cpu
     }
     args = [
-             "--program=" + rebase_path(executable, root_build_dir),
-             "--arch=${arch}",
-             "--output=" + rebase_path(nmf, root_build_dir),
-           ] + nmfflags
+      "--program=" + rebase_path(executable, root_build_dir),
+      "--arch=${arch}",
+      "--output=" + rebase_path(nmf, root_build_dir),
+    ]
+    if (defined(invoker.nmfflags)) {
+      args += invoker.nmfflags
+    }
   }
 }
diff --git a/build/config/win/BUILD.gn b/build/config/win/BUILD.gn
index 8b40bd45..cdf6a73a2 100644
--- a/build/config/win/BUILD.gn
+++ b/build/config/win/BUILD.gn
@@ -5,6 +5,7 @@
 import("//build/config/compiler/compiler.gni")
 import("//build/config/sanitizers/sanitizers.gni")
 import("//build/config/win/visual_studio_version.gni")
+import("//build/toolchain/toolchain.gni")
 
 assert(is_win)
 
@@ -95,7 +96,7 @@
     }
 
     # Clang runtime libraries, such as the sanitizer runtimes, live here.
-    lib_dirs = [ "//third_party/llvm-build/Release+Asserts/lib/clang/3.9.0/lib/windows" ]
+    lib_dirs = [ "//third_party/llvm-build/Release+Asserts/lib/clang/$clang_version/lib/windows" ]
   }
 
   if (is_syzyasan) {
diff --git a/build/config/win/manifest.gni b/build/config/win/manifest.gni
index 285cf258..3dcaddf 100644
--- a/build/config/win/manifest.gni
+++ b/build/config/win/manifest.gni
@@ -93,7 +93,10 @@
 
     # Make the final .manifest file.
     action(manifest_action_name) {
-      visibility = [ ":$source_set_name" ]
+      visibility = [
+        ":$source_set_name",
+        ":$rc_action_name",
+      ]
 
       script = "$root_build_dir/gyp-win-tool"
 
@@ -120,9 +123,7 @@
       forward_variables_from(invoker, [ "deps" ])
     }
 
-    # Make the .rc file that references the final manifest file. The manifest
-    # generation doesn't need to be a dependency because it's not actually
-    # needed until the .rc is compiled.
+    # Make the .rc file that references the final manifest file.
     #
     # This could easily be combined into one step, but this current separation
     # of .manifest and .rc matches GYP and allows us to re-use gyp-win-tool.
@@ -153,6 +154,14 @@
         rebase_path(rcfile, root_build_dir),
         manifest_resource_id,
       ]
+
+      # Although generating this file doesn't technically depend on the
+      # generated manifest, this dependency causes the .rc timestamp to be
+      # updated every time the manifest is updated. Otherwise, updating the
+      # manifest will not cause a recompilation of the .rc file.
+      deps = [
+        ":$manifest_action_name",
+      ]
     }
 
     # This source set only exists to compile and link the resource file.
diff --git a/build/landmines.py b/build/landmines.py
index e9da6ba..031c309c 100755
--- a/build/landmines.py
+++ b/build/landmines.py
@@ -73,6 +73,7 @@
           fromfiledate=old_date, tofiledate=time.ctime(), n=0)
       sys.stdout.write('Clobbering due to:\n')
       sys.stdout.writelines(diff)
+      sys.stdout.flush()
 
       clobber.clobber(out_dir)
 
diff --git a/build/linux/pkg-config-wrapper b/build/linux/pkg-config-wrapper
index 2512b38..c4935d7b 100755
--- a/build/linux/pkg-config-wrapper
+++ b/build/linux/pkg-config-wrapper
@@ -11,9 +11,6 @@
 # This assumption is valid for a range of sysroots, in particular: a
 # LSB-compliant root filesystem mounted at the sysroot, and a board build
 # directory of a Chromium OS chroot.
-# Additional directories containing .pc files may be specified by setting
-# the PKG_CONFIG_PATH environment variable- these will be prepended to the
-# generated paths.
 
 set -o nounset
 set -o errexit
diff --git a/build/linux/system.gyp b/build/linux/system.gyp
index 553a5a7..084c6a4 100644
--- a/build/linux/system.gyp
+++ b/build/linux/system.gyp
@@ -1242,45 +1242,38 @@
       ],
     },
     {
-      'target_name': 'ssl',
+      'target_name': 'nss',
       'type': 'none',
       'conditions': [
-        ['_toolset=="target"', {
-          'dependencies': [
-            '../../third_party/boringssl/boringssl.gyp:boringssl',
-          ],
+        # Link in the system NSS if it is used for the platform certificate
+        # library (use_nss_certs==1).
+        ['_toolset=="target" and use_nss_certs==1', {
+          'direct_dependent_settings': {
+            'cflags': [
+              '<!@(<(pkg-config) --cflags nss)',
+            ],
+          },
+          'link_settings': {
+            'ldflags': [
+              '<!@(<(pkg-config) --libs-only-L --libs-only-other nss)',
+            ],
+            'libraries': [
+              '<!@(<(pkg-config) --libs-only-l nss | sed -e "s/-lssl3//")',
+            ],
+          },
           'conditions': [
-            # Link in the system NSS if it is used for the platform certificate
-            # library (use_nss_certs==1).
-            ['use_nss_certs==1', {
+            ['clang==1', {
               'direct_dependent_settings': {
                 'cflags': [
-                  '<!@(<(pkg-config) --cflags nss)',
+                  # There is a broken header guard in /usr/include/nss/secmod.h:
+                  # https://bugzilla.mozilla.org/show_bug.cgi?id=884072
+                  '-Wno-header-guard',
                 ],
               },
-              'link_settings': {
-                'ldflags': [
-                  '<!@(<(pkg-config) --libs-only-L --libs-only-other nss)',
-                ],
-                'libraries': [
-                  '<!@(<(pkg-config) --libs-only-l nss | sed -e "s/-lssl3//")',
-                ],
-              },
-              'conditions': [
-                ['clang==1', {
-                  'direct_dependent_settings': {
-                    'cflags': [
-                      # There is a broken header guard in /usr/include/nss/secmod.h:
-                      # https://bugzilla.mozilla.org/show_bug.cgi?id=884072
-                      '-Wno-header-guard',
-                    ],
-                  },
-                }],
-              ],
             }],
-          ]
+          ],
         }],
-      ],
+      ]
     },
     {
       'target_name': 'libffi',
diff --git a/build/mac/tweak_info_plist.gni b/build/mac/tweak_info_plist.gni
new file mode 100644
index 0000000..d24a95d2
--- /dev/null
+++ b/build/mac/tweak_info_plist.gni
@@ -0,0 +1,46 @@
+# Copyright 2016 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.
+
+# Template to run the tweak_info_plist.py script on a plist.
+#
+# Arguments:
+#
+#     info_plist:
+#         string, the plist to tweak.
+#
+#     args:
+#         list of string, the arguments to pass to the tweak_info_plist.py
+#         script.
+#
+# Callers should use get_target_outputs() to get the output name.
+template("tweak_info_plist") {
+  assert(defined(invoker.info_plist),
+         "The info_plist must be specified in $target_name")
+  assert(defined(invoker.args),
+         "The args to tweak_info_plist.py must be specified in $target_name")
+
+  action(target_name) {
+    forward_variables_from(invoker, [ "testonly" ])
+    script = "//build/mac/tweak_info_plist.py"
+    inputs = [
+      script,
+      "//build/util/version.py",
+      "//build/util/LASTCHANGE",
+      "//chrome/VERSION",
+    ]
+    sources = [
+      invoker.info_plist,
+    ]
+    _output_name = "$target_gen_dir/${target_name}_tweaked.plist"
+    outputs = [
+      _output_name,
+    ]
+    args = invoker.args + [
+             "--plist",
+             rebase_path(invoker.info_plist, root_build_dir),
+             "--output",
+             rebase_path(_output_name, root_build_dir),
+           ]
+  }
+}
diff --git a/build/mac/tweak_info_plist.py b/build/mac/tweak_info_plist.py
index c1b829d..4c3fade6 100755
--- a/build/mac/tweak_info_plist.py
+++ b/build/mac/tweak_info_plist.py
@@ -203,6 +203,9 @@
   parser = optparse.OptionParser('%prog [options]')
   parser.add_option('--plist', dest='plist_path', action='store',
       type='string', default=None, help='The path of the plist to tweak.')
+  parser.add_option('--output', dest='plist_output', action='store',
+      type='string', default=None, help='If specified, the path to output ' + \
+      'the tweaked plist, rather than overwriting the input.')
   parser.add_option('--breakpad', dest='use_breakpad', action='store',
       type='int', default=False, help='Enable Breakpad [1 or 0]')
   parser.add_option('--breakpad_uploads', dest='breakpad_uploads',
@@ -274,8 +277,11 @@
 
   # Info.plist will work perfectly well in any plist format, but traditionally
   # applications use xml1 for this, so convert it to ensure that it's valid.
+  output_path = options.plist_path
+  if options.plist_output is not None:
+    output_path = options.plist_output
   proc = subprocess.Popen(['plutil', '-convert', 'xml1',
-                           '-o', options.plist_path,
+                           '-o', output_path,
                            temp_info_plist.name])
   proc.wait()
   return proc.returncode
diff --git a/build/secondary/testing/gtest/BUILD.gn b/build/secondary/testing/gtest/BUILD.gn
index 79b6bd5..a03ff7c3 100644
--- a/build/secondary/testing/gtest/BUILD.gn
+++ b/build/secondary/testing/gtest/BUILD.gn
@@ -114,7 +114,7 @@
     sources += [ "../platform_test.h" ]
   }
 
-  if (is_mac || is_ios) {
+  if ((is_mac || is_ios) && gtest_include_objc_support) {
     if (is_ios) {
       set_sources_assignment_filter([])
     }
@@ -128,7 +128,7 @@
     set_sources_assignment_filter(sources_assignment_filter)
   }
 
-  if (is_ios) {
+  if (is_ios && gtest_include_ios_coverage) {
     sources += [
       "../coverage_util_ios.cc",
       "../coverage_util_ios.h",
diff --git a/build/secondary/third_party/nss/BUILD.gn b/build/secondary/third_party/nss/BUILD.gn
index 2222840..5788f3e5 100644
--- a/build/secondary/third_party/nss/BUILD.gn
+++ b/build/secondary/third_party/nss/BUILD.gn
@@ -19,926 +19,4 @@
       "-lssl3",
     ]
   }
-} else if (is_ios) {
-  config("nspr_config") {
-    defines = [ "NO_NSPR_10_SUPPORT" ]
-    include_dirs = [
-      "nspr/pr/include",
-      "nspr/lib/ds",
-      "nspr/lib/libc/include",
-    ]
-
-    if (!is_component_build) {
-      defines += [ "NSPR_STATIC" ]
-    }
-  }
-
-  component("nspr") {
-    output_name = "crnspr"
-    sources = [
-      "nspr/lib/ds/plarena.c",
-      "nspr/lib/ds/plarena.h",
-      "nspr/lib/ds/plarenas.h",
-      "nspr/lib/ds/plhash.c",
-      "nspr/lib/ds/plhash.h",
-      "nspr/lib/libc/include/plbase64.h",
-      "nspr/lib/libc/include/plerror.h",
-      "nspr/lib/libc/include/plgetopt.h",
-      "nspr/lib/libc/include/plstr.h",
-      "nspr/lib/libc/src/base64.c",
-      "nspr/lib/libc/src/plerror.c",
-      "nspr/lib/libc/src/plgetopt.c",
-      "nspr/lib/libc/src/strcase.c",
-      "nspr/lib/libc/src/strcat.c",
-      "nspr/lib/libc/src/strchr.c",
-      "nspr/lib/libc/src/strcmp.c",
-      "nspr/lib/libc/src/strcpy.c",
-      "nspr/lib/libc/src/strdup.c",
-      "nspr/lib/libc/src/strlen.c",
-      "nspr/lib/libc/src/strpbrk.c",
-      "nspr/lib/libc/src/strstr.c",
-      "nspr/lib/libc/src/strtok.c",
-      "nspr/pr/include/md/_darwin.cfg",
-      "nspr/pr/include/md/_darwin.h",
-      "nspr/pr/include/md/_pcos.h",
-      "nspr/pr/include/md/_pth.h",
-      "nspr/pr/include/md/_unix_errors.h",
-      "nspr/pr/include/md/_unixos.h",
-      "nspr/pr/include/md/_win32_errors.h",
-      "nspr/pr/include/md/_win95.cfg",
-      "nspr/pr/include/md/_win95.h",
-      "nspr/pr/include/md/prosdep.h",
-      "nspr/pr/include/nspr.h",
-      "nspr/pr/include/obsolete/pralarm.h",
-      "nspr/pr/include/obsolete/probslet.h",
-      "nspr/pr/include/obsolete/protypes.h",
-      "nspr/pr/include/obsolete/prsem.h",
-      "nspr/pr/include/pratom.h",
-      "nspr/pr/include/prbit.h",
-      "nspr/pr/include/prclist.h",
-      "nspr/pr/include/prcmon.h",
-      "nspr/pr/include/prcountr.h",
-      "nspr/pr/include/prcpucfg.h",
-      "nspr/pr/include/prcvar.h",
-      "nspr/pr/include/prdtoa.h",
-      "nspr/pr/include/prenv.h",
-      "nspr/pr/include/prerr.h",
-      "nspr/pr/include/prerror.h",
-      "nspr/pr/include/prinet.h",
-      "nspr/pr/include/prinit.h",
-      "nspr/pr/include/prinrval.h",
-      "nspr/pr/include/prio.h",
-      "nspr/pr/include/pripcsem.h",
-      "nspr/pr/include/private/pprio.h",
-      "nspr/pr/include/private/pprmwait.h",
-      "nspr/pr/include/private/pprthred.h",
-      "nspr/pr/include/private/primpl.h",
-      "nspr/pr/include/private/prpriv.h",
-      "nspr/pr/include/prlink.h",
-      "nspr/pr/include/prlock.h",
-      "nspr/pr/include/prlog.h",
-      "nspr/pr/include/prlong.h",
-      "nspr/pr/include/prmem.h",
-      "nspr/pr/include/prmon.h",
-      "nspr/pr/include/prmwait.h",
-      "nspr/pr/include/prnetdb.h",
-      "nspr/pr/include/prolock.h",
-      "nspr/pr/include/prpdce.h",
-      "nspr/pr/include/prprf.h",
-      "nspr/pr/include/prproces.h",
-      "nspr/pr/include/prrng.h",
-      "nspr/pr/include/prrwlock.h",
-      "nspr/pr/include/prshm.h",
-      "nspr/pr/include/prshma.h",
-      "nspr/pr/include/prsystem.h",
-      "nspr/pr/include/prthread.h",
-      "nspr/pr/include/prtime.h",
-      "nspr/pr/include/prtpool.h",
-      "nspr/pr/include/prtrace.h",
-      "nspr/pr/include/prtypes.h",
-      "nspr/pr/include/prvrsion.h",
-      "nspr/pr/include/prwin16.h",
-      "nspr/pr/src/io/prfdcach.c",
-      "nspr/pr/src/io/priometh.c",
-      "nspr/pr/src/io/pripv6.c",
-      "nspr/pr/src/io/prlayer.c",
-      "nspr/pr/src/io/prlog.c",
-      "nspr/pr/src/io/prmapopt.c",
-      "nspr/pr/src/io/prmmap.c",
-      "nspr/pr/src/io/prmwait.c",
-      "nspr/pr/src/io/prpolevt.c",
-      "nspr/pr/src/io/prprf.c",
-      "nspr/pr/src/io/prscanf.c",
-      "nspr/pr/src/io/prstdio.c",
-      "nspr/pr/src/linking/prlink.c",
-      "nspr/pr/src/malloc/prmalloc.c",
-      "nspr/pr/src/malloc/prmem.c",
-      "nspr/pr/src/md/prosdep.c",
-      "nspr/pr/src/md/unix/darwin.c",
-      "nspr/pr/src/md/unix/os_Darwin.s",
-      "nspr/pr/src/md/unix/unix.c",
-      "nspr/pr/src/md/unix/unix_errors.c",
-      "nspr/pr/src/md/unix/uxproces.c",
-      "nspr/pr/src/md/unix/uxrng.c",
-      "nspr/pr/src/md/unix/uxshm.c",
-      "nspr/pr/src/md/unix/uxwrap.c",
-      "nspr/pr/src/memory/prseg.c",
-      "nspr/pr/src/memory/prshm.c",
-      "nspr/pr/src/memory/prshma.c",
-      "nspr/pr/src/misc/pralarm.c",
-      "nspr/pr/src/misc/pratom.c",
-      "nspr/pr/src/misc/praton.c",
-      "nspr/pr/src/misc/prcountr.c",
-      "nspr/pr/src/misc/prdtoa.c",
-      "nspr/pr/src/misc/prenv.c",
-      "nspr/pr/src/misc/prerr.c",
-      "nspr/pr/src/misc/prerror.c",
-      "nspr/pr/src/misc/prerrortable.c",
-      "nspr/pr/src/misc/prinit.c",
-      "nspr/pr/src/misc/prinrval.c",
-      "nspr/pr/src/misc/pripc.c",
-      "nspr/pr/src/misc/prlog2.c",
-      "nspr/pr/src/misc/prlong.c",
-      "nspr/pr/src/misc/prnetdb.c",
-      "nspr/pr/src/misc/prolock.c",
-      "nspr/pr/src/misc/prrng.c",
-      "nspr/pr/src/misc/prsystem.c",
-      "nspr/pr/src/misc/prthinfo.c",
-      "nspr/pr/src/misc/prtime.c",
-      "nspr/pr/src/misc/prtpool.c",
-      "nspr/pr/src/misc/prtrace.c",
-      "nspr/pr/src/pthreads/ptio.c",
-      "nspr/pr/src/pthreads/ptmisc.c",
-      "nspr/pr/src/pthreads/ptsynch.c",
-      "nspr/pr/src/pthreads/ptthread.c",
-      "nspr/pr/src/threads/prcmon.c",
-      "nspr/pr/src/threads/prrwlock.c",
-      "nspr/pr/src/threads/prtpd.c",
-    ]
-
-    public_configs = [ ":nspr_config" ]
-
-    configs -= [ "//build/config/compiler:chromium_code" ]
-    configs += [
-      "//build/config/compiler:no_chromium_code",
-      "//build/config/compiler:no_size_t_to_int_warning",
-
-      # nspr passes "const char*" through "void*".
-      "//build/config/compiler:no_incompatible_pointer_warnings",
-    ]
-
-    cflags = []
-    defines = [
-      "_NSPR_BUILD_",
-      "FORCE_PR_LOG",
-      "XP_UNIX",
-      "DARWIN",
-      "XP_MACOSX",
-      "_PR_PTHREADS",
-      "HAVE_BSD_FLOCK",
-      "HAVE_DLADDR",
-      "HAVE_LCHOWN",
-      "HAVE_SOCKLEN_T",
-      "HAVE_STRERROR",
-    ]
-
-    include_dirs = [ "nspr/pr/include/private" ]
-
-    if (current_cpu == "x86") {
-      defines += [ "_X86_" ]
-    } else if (current_cpu == "x64") {
-      defines += [ "_AMD64_" ]
-    }
-
-    if (is_clang) {
-      cflags += [
-        # nspr uses a bunch of deprecated functions (NSLinkModule etc) in
-        # prlink.c on mac.
-        "-Wno-deprecated-declarations",
-
-        # nspr passes "int*" through "unsigned int*".
-        "-Wno-pointer-sign",
-      ]
-
-      # nspr uses assert(!"foo") instead of assert(false && "foo").
-      configs -= [ "//build/config/clang:extra_warnings" ]
-    }
-  }
-
-  component("nss") {
-    output_name = "crnss"
-    sources = [
-      # Ensure at least one object file is produced, so that MSVC does not
-      # warn when creating the static/shared library. See the note for
-      # the "nssckbi" target for why the "nss" target was split as such.
-      "nss/lib/nss/nssver.c",
-    ]
-
-    public_deps = [
-      ":nss_static",
-      ":nssckbi",
-    ]
-  }
-
-  config("nssckbi_config") {
-    include_dirs = [ "nss/lib/ckfw/builtins" ]
-  }
-
-  # This is really more of a pseudo-target to work around the fact that
-  # a single static_library target cannot contain two object files of the
-  # same name (hash.o / hash.obj). Logically, this is part of the
-  # "nss_static" target. By separating it out, it creates a possible
-  # circular dependency between "nss_static" and "nssckbi" when
-  # "exclude_nss_root_certs" is not specified, as "nss_static" depends on
-  # the "builtinsC_GetFunctionList" exported by this target. This is an
-  # artifact of how NSS is being statically built, which is not an
-  # officially supported configuration - normally, "nssckbi.dll/so" would
-  # depend on libnss3.dll/so, and the higher layer caller would instruct
-  # libnss3.dll to dynamically load nssckbi.dll, breaking the circle.
-  #
-  # TODO(rsleevi): http://crbug.com/128134 - Break the circular dependency
-  # without requiring nssckbi to be built as a shared library.
-  source_set("nssckbi") {
-    visibility = [ ":nss" ]  # This target is internal implementation detail.
-
-    sources = [
-      "nss/lib/ckfw/builtins/anchor.c",
-      "nss/lib/ckfw/builtins/bfind.c",
-      "nss/lib/ckfw/builtins/binst.c",
-      "nss/lib/ckfw/builtins/bobject.c",
-      "nss/lib/ckfw/builtins/bsession.c",
-      "nss/lib/ckfw/builtins/bslot.c",
-      "nss/lib/ckfw/builtins/btoken.c",
-      "nss/lib/ckfw/builtins/builtins.h",
-      "nss/lib/ckfw/builtins/certdata.c",
-      "nss/lib/ckfw/builtins/ckbiver.c",
-      "nss/lib/ckfw/builtins/constants.c",
-      "nss/lib/ckfw/builtins/nssckbi.h",
-      "nss/lib/ckfw/ck.h",
-      "nss/lib/ckfw/ckfw.h",
-      "nss/lib/ckfw/ckfwm.h",
-      "nss/lib/ckfw/ckfwtm.h",
-      "nss/lib/ckfw/ckmd.h",
-      "nss/lib/ckfw/ckt.h",
-      "nss/lib/ckfw/crypto.c",
-      "nss/lib/ckfw/find.c",
-      "nss/lib/ckfw/hash.c",
-      "nss/lib/ckfw/instance.c",
-      "nss/lib/ckfw/mechanism.c",
-      "nss/lib/ckfw/mutex.c",
-      "nss/lib/ckfw/nssck.api",
-      "nss/lib/ckfw/nssckepv.h",
-      "nss/lib/ckfw/nssckft.h",
-      "nss/lib/ckfw/nssckfw.h",
-      "nss/lib/ckfw/nssckfwc.h",
-      "nss/lib/ckfw/nssckfwt.h",
-      "nss/lib/ckfw/nssckg.h",
-      "nss/lib/ckfw/nssckmdt.h",
-      "nss/lib/ckfw/nssckt.h",
-      "nss/lib/ckfw/object.c",
-      "nss/lib/ckfw/session.c",
-      "nss/lib/ckfw/sessobj.c",
-      "nss/lib/ckfw/slot.c",
-      "nss/lib/ckfw/token.c",
-      "nss/lib/ckfw/wrap.c",
-    ]
-
-    configs -= [ "//build/config/compiler:chromium_code" ]
-    configs += [ "//build/config/compiler:no_chromium_code" ]
-
-    include_dirs = [ "nss/lib/ckfw" ]
-    public_configs = [ ":nssckbi_config" ]
-
-    public_deps = [
-      ":nss_static",
-    ]
-  }
-
-  config("nss_static_config") {
-    defines = [
-      "NSS_STATIC",
-      "NSS_USE_STATIC_LIBS",
-      "USE_UTIL_DIRECTLY",
-    ]
-    include_dirs = [
-      "nspr/pr/include",
-      "nspr/lib/ds",
-      "nspr/lib/libc/include",
-      "nss/lib/base",
-      "nss/lib/certdb",
-      "nss/lib/certhigh",
-      "nss/lib/cryptohi",
-      "nss/lib/dev",
-      "nss/lib/freebl",
-      "nss/lib/freebl/ecl",
-      "nss/lib/nss",
-      "nss/lib/pk11wrap",
-      "nss/lib/pkcs7",
-      "nss/lib/pki",
-      "nss/lib/smime",
-      "nss/lib/softoken",
-      "nss/lib/util",
-    ]
-  }
-
-  config("nss_static_config_private") {
-    if (is_clang) {
-      cflags = [
-        # nss doesn"t explicitly cast between different enum types.
-        "-Wno-conversion",
-
-        # nss passes "const char*" through "void*".
-        "-Wno-incompatible-pointer-types",
-
-        # nss prefers `a && b || c` over `(a && b) || c`.
-        "-Wno-logical-op-parentheses",
-
-        # nss doesn"t use exhaustive switches on enums
-        "-Wno-switch",
-
-        # nss has some `unsigned < 0` checks.
-        "-Wno-tautological-compare",
-
-        # nss-urandom-abort.patch removed the only call to rng_systemFromNoise
-        "-Wno-unused-function",
-      ]
-    }
-  }
-
-  source_set("nss_static") {
-    visibility = [ ":*" ]  # Internal implementation detail.
-
-    sources = [
-      "nss/lib/base/arena.c",
-      "nss/lib/base/base.h",
-      "nss/lib/base/baset.h",
-      "nss/lib/base/error.c",
-      "nss/lib/base/errorval.c",
-      "nss/lib/base/hash.c",
-      "nss/lib/base/hashops.c",
-      "nss/lib/base/item.c",
-      "nss/lib/base/libc.c",
-      "nss/lib/base/list.c",
-      "nss/lib/base/nssbase.h",
-      "nss/lib/base/nssbaset.h",
-      "nss/lib/base/nssutf8.c",
-      "nss/lib/base/tracker.c",
-      "nss/lib/certdb/alg1485.c",
-      "nss/lib/certdb/cert.h",
-      "nss/lib/certdb/certdb.c",
-      "nss/lib/certdb/certdb.h",
-      "nss/lib/certdb/certi.h",
-      "nss/lib/certdb/certt.h",
-      "nss/lib/certdb/certv3.c",
-      "nss/lib/certdb/certxutl.c",
-      "nss/lib/certdb/certxutl.h",
-      "nss/lib/certdb/crl.c",
-      "nss/lib/certdb/genname.c",
-      "nss/lib/certdb/genname.h",
-      "nss/lib/certdb/polcyxtn.c",
-      "nss/lib/certdb/secname.c",
-      "nss/lib/certdb/stanpcertdb.c",
-      "nss/lib/certdb/xauthkid.c",
-      "nss/lib/certdb/xbsconst.c",
-      "nss/lib/certdb/xconst.c",
-      "nss/lib/certdb/xconst.h",
-      "nss/lib/certhigh/certhigh.c",
-      "nss/lib/certhigh/certhtml.c",
-      "nss/lib/certhigh/certreq.c",
-      "nss/lib/certhigh/certvfy.c",
-      "nss/lib/certhigh/certvfypkix.c",
-      "nss/lib/certhigh/crlv2.c",
-      "nss/lib/certhigh/ocsp.c",
-      "nss/lib/certhigh/ocsp.h",
-      "nss/lib/certhigh/ocspi.h",
-      "nss/lib/certhigh/ocspsig.c",
-      "nss/lib/certhigh/ocspt.h",
-      "nss/lib/certhigh/ocspti.h",
-      "nss/lib/certhigh/xcrldist.c",
-      "nss/lib/cryptohi/cryptohi.h",
-      "nss/lib/cryptohi/cryptoht.h",
-      "nss/lib/cryptohi/dsautil.c",
-      "nss/lib/cryptohi/key.h",
-      "nss/lib/cryptohi/keyhi.h",
-      "nss/lib/cryptohi/keyi.h",
-      "nss/lib/cryptohi/keyt.h",
-      "nss/lib/cryptohi/keythi.h",
-      "nss/lib/cryptohi/sechash.c",
-      "nss/lib/cryptohi/sechash.h",
-      "nss/lib/cryptohi/seckey.c",
-      "nss/lib/cryptohi/secsign.c",
-      "nss/lib/cryptohi/secvfy.c",
-      "nss/lib/dev/ckhelper.c",
-      "nss/lib/dev/ckhelper.h",
-      "nss/lib/dev/dev.h",
-      "nss/lib/dev/devm.h",
-      "nss/lib/dev/devslot.c",
-      "nss/lib/dev/devt.h",
-      "nss/lib/dev/devtm.h",
-      "nss/lib/dev/devtoken.c",
-      "nss/lib/dev/devutil.c",
-      "nss/lib/dev/nssdev.h",
-      "nss/lib/dev/nssdevt.h",
-      "nss/lib/freebl/aeskeywrap.c",
-      "nss/lib/freebl/alg2268.c",
-      "nss/lib/freebl/alghmac.c",
-      "nss/lib/freebl/alghmac.h",
-      "nss/lib/freebl/arcfive.c",
-      "nss/lib/freebl/arcfour.c",
-      "nss/lib/freebl/blapi.h",
-      "nss/lib/freebl/blapii.h",
-      "nss/lib/freebl/blapit.h",
-      "nss/lib/freebl/camellia.c",
-      "nss/lib/freebl/camellia.h",
-      "nss/lib/freebl/chacha20.c",
-      "nss/lib/freebl/chacha20.h",
-      "nss/lib/freebl/chacha20poly1305.c",
-      "nss/lib/freebl/chacha20poly1305.h",
-      "nss/lib/freebl/ctr.c",
-      "nss/lib/freebl/ctr.h",
-      "nss/lib/freebl/cts.c",
-      "nss/lib/freebl/cts.h",
-      "nss/lib/freebl/des.c",
-      "nss/lib/freebl/des.h",
-      "nss/lib/freebl/desblapi.c",
-      "nss/lib/freebl/dh.c",
-      "nss/lib/freebl/drbg.c",
-      "nss/lib/freebl/dsa.c",
-      "nss/lib/freebl/ec.c",
-      "nss/lib/freebl/ec.h",
-      "nss/lib/freebl/ecdecode.c",
-      "nss/lib/freebl/ecl/ec2.h",
-      "nss/lib/freebl/ecl/ec_naf.c",
-      "nss/lib/freebl/ecl/ecl-curve.h",
-      "nss/lib/freebl/ecl/ecl-exp.h",
-      "nss/lib/freebl/ecl/ecl-priv.h",
-      "nss/lib/freebl/ecl/ecl.c",
-      "nss/lib/freebl/ecl/ecl.h",
-      "nss/lib/freebl/ecl/ecl_curve.c",
-      "nss/lib/freebl/ecl/ecl_gf.c",
-      "nss/lib/freebl/ecl/ecl_mult.c",
-      "nss/lib/freebl/ecl/ecp.h",
-      "nss/lib/freebl/ecl/ecp_256.c",
-      "nss/lib/freebl/ecl/ecp_256_32.c",
-      "nss/lib/freebl/ecl/ecp_384.c",
-      "nss/lib/freebl/ecl/ecp_521.c",
-      "nss/lib/freebl/ecl/ecp_aff.c",
-      "nss/lib/freebl/ecl/ecp_jac.c",
-      "nss/lib/freebl/ecl/ecp_jm.c",
-      "nss/lib/freebl/ecl/ecp_mont.c",
-      "nss/lib/freebl/gcm.c",
-      "nss/lib/freebl/gcm.h",
-      "nss/lib/freebl/hmacct.c",
-      "nss/lib/freebl/hmacct.h",
-      "nss/lib/freebl/intel-aes.h",
-      "nss/lib/freebl/jpake.c",
-      "nss/lib/freebl/md2.c",
-      "nss/lib/freebl/md5.c",
-      "nss/lib/freebl/mpi/logtab.h",
-      "nss/lib/freebl/mpi/mp_gf2m-priv.h",
-      "nss/lib/freebl/mpi/mp_gf2m.c",
-      "nss/lib/freebl/mpi/mp_gf2m.h",
-      "nss/lib/freebl/mpi/mpcpucache.c",
-      "nss/lib/freebl/mpi/mpi-config.h",
-      "nss/lib/freebl/mpi/mpi-priv.h",
-      "nss/lib/freebl/mpi/mpi.c",
-      "nss/lib/freebl/mpi/mpi.h",
-      "nss/lib/freebl/mpi/mpi_arm.c",
-      "nss/lib/freebl/mpi/mpi_arm_mac.c",
-      "nss/lib/freebl/mpi/mplogic.c",
-      "nss/lib/freebl/mpi/mplogic.h",
-      "nss/lib/freebl/mpi/mpmontg.c",
-      "nss/lib/freebl/mpi/mpprime.c",
-      "nss/lib/freebl/mpi/mpprime.h",
-      "nss/lib/freebl/mpi/primes.c",
-      "nss/lib/freebl/nss_build_config_mac.h",
-      "nss/lib/freebl/poly1305.c",
-      "nss/lib/freebl/poly1305.h",
-      "nss/lib/freebl/pqg.c",
-      "nss/lib/freebl/pqg.h",
-      "nss/lib/freebl/rawhash.c",
-      "nss/lib/freebl/rijndael.c",
-      "nss/lib/freebl/rijndael.h",
-      "nss/lib/freebl/rijndael32.tab",
-      "nss/lib/freebl/rsa.c",
-      "nss/lib/freebl/rsapkcs.c",
-      "nss/lib/freebl/secmpi.h",
-      "nss/lib/freebl/secrng.h",
-      "nss/lib/freebl/seed.c",
-      "nss/lib/freebl/seed.h",
-      "nss/lib/freebl/sha256.h",
-      "nss/lib/freebl/sha512.c",
-      "nss/lib/freebl/sha_fast.c",
-      "nss/lib/freebl/sha_fast.h",
-      "nss/lib/freebl/shsign.h",
-      "nss/lib/freebl/shvfy.c",
-      "nss/lib/freebl/sysrand.c",
-      "nss/lib/freebl/tlsprfalg.c",
-      "nss/lib/freebl/unix_rand.c",
-      "nss/lib/freebl/win_rand.c",
-      "nss/lib/libpkix/include/pkix.h",
-      "nss/lib/libpkix/include/pkix_certsel.h",
-      "nss/lib/libpkix/include/pkix_certstore.h",
-      "nss/lib/libpkix/include/pkix_checker.h",
-      "nss/lib/libpkix/include/pkix_crlsel.h",
-      "nss/lib/libpkix/include/pkix_errorstrings.h",
-      "nss/lib/libpkix/include/pkix_params.h",
-      "nss/lib/libpkix/include/pkix_pl_pki.h",
-      "nss/lib/libpkix/include/pkix_pl_system.h",
-      "nss/lib/libpkix/include/pkix_results.h",
-      "nss/lib/libpkix/include/pkix_revchecker.h",
-      "nss/lib/libpkix/include/pkix_sample_modules.h",
-      "nss/lib/libpkix/include/pkix_util.h",
-      "nss/lib/libpkix/include/pkixt.h",
-      "nss/lib/libpkix/pkix/certsel/pkix_certselector.c",
-      "nss/lib/libpkix/pkix/certsel/pkix_certselector.h",
-      "nss/lib/libpkix/pkix/certsel/pkix_comcertselparams.c",
-      "nss/lib/libpkix/pkix/certsel/pkix_comcertselparams.h",
-      "nss/lib/libpkix/pkix/checker/pkix_basicconstraintschecker.c",
-      "nss/lib/libpkix/pkix/checker/pkix_basicconstraintschecker.h",
-      "nss/lib/libpkix/pkix/checker/pkix_certchainchecker.c",
-      "nss/lib/libpkix/pkix/checker/pkix_certchainchecker.h",
-      "nss/lib/libpkix/pkix/checker/pkix_crlchecker.c",
-      "nss/lib/libpkix/pkix/checker/pkix_crlchecker.h",
-      "nss/lib/libpkix/pkix/checker/pkix_ekuchecker.c",
-      "nss/lib/libpkix/pkix/checker/pkix_ekuchecker.h",
-      "nss/lib/libpkix/pkix/checker/pkix_expirationchecker.c",
-      "nss/lib/libpkix/pkix/checker/pkix_expirationchecker.h",
-      "nss/lib/libpkix/pkix/checker/pkix_namechainingchecker.c",
-      "nss/lib/libpkix/pkix/checker/pkix_namechainingchecker.h",
-      "nss/lib/libpkix/pkix/checker/pkix_nameconstraintschecker.c",
-      "nss/lib/libpkix/pkix/checker/pkix_nameconstraintschecker.h",
-      "nss/lib/libpkix/pkix/checker/pkix_ocspchecker.c",
-      "nss/lib/libpkix/pkix/checker/pkix_ocspchecker.h",
-      "nss/lib/libpkix/pkix/checker/pkix_policychecker.c",
-      "nss/lib/libpkix/pkix/checker/pkix_policychecker.h",
-      "nss/lib/libpkix/pkix/checker/pkix_revocationchecker.c",
-      "nss/lib/libpkix/pkix/checker/pkix_revocationchecker.h",
-      "nss/lib/libpkix/pkix/checker/pkix_revocationmethod.c",
-      "nss/lib/libpkix/pkix/checker/pkix_revocationmethod.h",
-      "nss/lib/libpkix/pkix/checker/pkix_signaturechecker.c",
-      "nss/lib/libpkix/pkix/checker/pkix_signaturechecker.h",
-      "nss/lib/libpkix/pkix/checker/pkix_targetcertchecker.c",
-      "nss/lib/libpkix/pkix/checker/pkix_targetcertchecker.h",
-      "nss/lib/libpkix/pkix/crlsel/pkix_comcrlselparams.c",
-      "nss/lib/libpkix/pkix/crlsel/pkix_comcrlselparams.h",
-      "nss/lib/libpkix/pkix/crlsel/pkix_crlselector.c",
-      "nss/lib/libpkix/pkix/crlsel/pkix_crlselector.h",
-      "nss/lib/libpkix/pkix/params/pkix_procparams.c",
-      "nss/lib/libpkix/pkix/params/pkix_procparams.h",
-      "nss/lib/libpkix/pkix/params/pkix_resourcelimits.c",
-      "nss/lib/libpkix/pkix/params/pkix_resourcelimits.h",
-      "nss/lib/libpkix/pkix/params/pkix_trustanchor.c",
-      "nss/lib/libpkix/pkix/params/pkix_trustanchor.h",
-      "nss/lib/libpkix/pkix/params/pkix_valparams.c",
-      "nss/lib/libpkix/pkix/params/pkix_valparams.h",
-      "nss/lib/libpkix/pkix/results/pkix_buildresult.c",
-      "nss/lib/libpkix/pkix/results/pkix_buildresult.h",
-      "nss/lib/libpkix/pkix/results/pkix_policynode.c",
-      "nss/lib/libpkix/pkix/results/pkix_policynode.h",
-      "nss/lib/libpkix/pkix/results/pkix_valresult.c",
-      "nss/lib/libpkix/pkix/results/pkix_valresult.h",
-      "nss/lib/libpkix/pkix/results/pkix_verifynode.c",
-      "nss/lib/libpkix/pkix/results/pkix_verifynode.h",
-      "nss/lib/libpkix/pkix/store/pkix_store.c",
-      "nss/lib/libpkix/pkix/store/pkix_store.h",
-      "nss/lib/libpkix/pkix/top/pkix_build.c",
-      "nss/lib/libpkix/pkix/top/pkix_build.h",
-      "nss/lib/libpkix/pkix/top/pkix_lifecycle.c",
-      "nss/lib/libpkix/pkix/top/pkix_lifecycle.h",
-      "nss/lib/libpkix/pkix/top/pkix_validate.c",
-      "nss/lib/libpkix/pkix/top/pkix_validate.h",
-      "nss/lib/libpkix/pkix/util/pkix_error.c",
-      "nss/lib/libpkix/pkix/util/pkix_error.h",
-      "nss/lib/libpkix/pkix/util/pkix_errpaths.c",
-      "nss/lib/libpkix/pkix/util/pkix_list.c",
-      "nss/lib/libpkix/pkix/util/pkix_list.h",
-      "nss/lib/libpkix/pkix/util/pkix_logger.c",
-      "nss/lib/libpkix/pkix/util/pkix_logger.h",
-      "nss/lib/libpkix/pkix/util/pkix_tools.c",
-      "nss/lib/libpkix/pkix/util/pkix_tools.h",
-      "nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_aiamgr.c",
-      "nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_aiamgr.h",
-      "nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_colcertstore.c",
-      "nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_colcertstore.h",
-      "nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_httpcertstore.c",
-      "nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_httpcertstore.h",
-      "nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_httpdefaultclient.c",
-      "nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_httpdefaultclient.h",
-      "nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_nsscontext.c",
-      "nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_nsscontext.h",
-      "nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_pk11certstore.c",
-      "nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_pk11certstore.h",
-      "nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_socket.c",
-      "nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_socket.h",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_basicconstraints.c",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_basicconstraints.h",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_cert.c",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_cert.h",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicyinfo.c",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicyinfo.h",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicymap.c",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicymap.h",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicyqualifier.c",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_certpolicyqualifier.h",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crl.c",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crl.h",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crldp.c",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crldp.h",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crlentry.c",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crlentry.h",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_date.c",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_date.h",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_generalname.c",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_generalname.h",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_infoaccess.c",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_infoaccess.h",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_nameconstraints.c",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_nameconstraints.h",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocspcertid.c",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocspcertid.h",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocsprequest.c",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocsprequest.h",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocspresponse.c",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_ocspresponse.h",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_publickey.c",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_publickey.h",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_x500name.c",
-      "nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_x500name.h",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_bigint.c",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_bigint.h",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_bytearray.c",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_bytearray.h",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_common.c",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_common.h",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_error.c",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_hashtable.c",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_hashtable.h",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_lifecycle.c",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_lifecycle.h",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_mem.c",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_mem.h",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_monitorlock.c",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_monitorlock.h",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_mutex.c",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_mutex.h",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_object.c",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_object.h",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_oid.c",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_oid.h",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_primhash.c",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_primhash.h",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_rwlock.c",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_rwlock.h",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_string.c",
-      "nss/lib/libpkix/pkix_pl_nss/system/pkix_pl_string.h",
-      "nss/lib/nss/nss.h",
-      "nss/lib/nss/nssinit.c",
-      "nss/lib/nss/nssoptions.c",
-      "nss/lib/nss/nssoptions.h",
-      "nss/lib/nss/nssrenam.h",
-      "nss/lib/nss/utilwrap.c",
-      "nss/lib/pk11wrap/debug_module.c",
-      "nss/lib/pk11wrap/dev3hack.c",
-      "nss/lib/pk11wrap/dev3hack.h",
-      "nss/lib/pk11wrap/pk11akey.c",
-      "nss/lib/pk11wrap/pk11auth.c",
-      "nss/lib/pk11wrap/pk11cert.c",
-      "nss/lib/pk11wrap/pk11cxt.c",
-      "nss/lib/pk11wrap/pk11err.c",
-      "nss/lib/pk11wrap/pk11func.h",
-      "nss/lib/pk11wrap/pk11kea.c",
-      "nss/lib/pk11wrap/pk11list.c",
-      "nss/lib/pk11wrap/pk11load.c",
-      "nss/lib/pk11wrap/pk11mech.c",
-      "nss/lib/pk11wrap/pk11merge.c",
-      "nss/lib/pk11wrap/pk11nobj.c",
-      "nss/lib/pk11wrap/pk11obj.c",
-      "nss/lib/pk11wrap/pk11pars.c",
-      "nss/lib/pk11wrap/pk11pbe.c",
-      "nss/lib/pk11wrap/pk11pk12.c",
-      "nss/lib/pk11wrap/pk11pqg.c",
-      "nss/lib/pk11wrap/pk11pqg.h",
-      "nss/lib/pk11wrap/pk11priv.h",
-      "nss/lib/pk11wrap/pk11pub.h",
-      "nss/lib/pk11wrap/pk11sdr.c",
-      "nss/lib/pk11wrap/pk11sdr.h",
-      "nss/lib/pk11wrap/pk11skey.c",
-      "nss/lib/pk11wrap/pk11slot.c",
-      "nss/lib/pk11wrap/pk11util.c",
-      "nss/lib/pk11wrap/secmod.h",
-      "nss/lib/pk11wrap/secmodi.h",
-      "nss/lib/pk11wrap/secmodt.h",
-      "nss/lib/pk11wrap/secmodti.h",
-      "nss/lib/pk11wrap/secpkcs5.h",
-      "nss/lib/pkcs7/certread.c",
-      "nss/lib/pkcs7/p7common.c",
-      "nss/lib/pkcs7/p7create.c",
-      "nss/lib/pkcs7/p7decode.c",
-      "nss/lib/pkcs7/p7encode.c",
-      "nss/lib/pkcs7/p7local.c",
-      "nss/lib/pkcs7/p7local.h",
-      "nss/lib/pkcs7/pkcs7t.h",
-      "nss/lib/pkcs7/secmime.c",
-      "nss/lib/pkcs7/secmime.h",
-      "nss/lib/pkcs7/secpkcs7.h",
-      "nss/lib/pki/asymmkey.c",
-      "nss/lib/pki/certdecode.c",
-      "nss/lib/pki/certificate.c",
-      "nss/lib/pki/cryptocontext.c",
-      "nss/lib/pki/nsspki.h",
-      "nss/lib/pki/nsspkit.h",
-      "nss/lib/pki/pki.h",
-      "nss/lib/pki/pki3hack.c",
-      "nss/lib/pki/pki3hack.h",
-      "nss/lib/pki/pkibase.c",
-      "nss/lib/pki/pkim.h",
-      "nss/lib/pki/pkistore.c",
-      "nss/lib/pki/pkistore.h",
-      "nss/lib/pki/pkit.h",
-      "nss/lib/pki/pkitm.h",
-      "nss/lib/pki/symmkey.c",
-      "nss/lib/pki/tdcache.c",
-      "nss/lib/pki/trustdomain.c",
-      "nss/lib/smime/cms.h",
-      "nss/lib/smime/cmslocal.h",
-      "nss/lib/smime/cmsreclist.h",
-      "nss/lib/smime/cmst.h",
-      "nss/lib/smime/smime.h",
-      "nss/lib/softoken/fipsaudt.c",
-      "nss/lib/softoken/fipstest.c",
-      "nss/lib/softoken/fipstokn.c",
-      "nss/lib/softoken/jpakesftk.c",
-      "nss/lib/softoken/lgglue.c",
-      "nss/lib/softoken/lgglue.h",
-      "nss/lib/softoken/lowkey.c",
-      "nss/lib/softoken/lowkeyi.h",
-      "nss/lib/softoken/lowkeyti.h",
-      "nss/lib/softoken/lowpbe.c",
-      "nss/lib/softoken/lowpbe.h",
-      "nss/lib/softoken/padbuf.c",
-      "nss/lib/softoken/pkcs11.c",
-      "nss/lib/softoken/pkcs11c.c",
-      "nss/lib/softoken/pkcs11i.h",
-      "nss/lib/softoken/pkcs11ni.h",
-      "nss/lib/softoken/pkcs11u.c",
-      "nss/lib/softoken/sdb.c",
-      "nss/lib/softoken/sdb.h",
-      "nss/lib/softoken/sftkdb.c",
-      "nss/lib/softoken/sftkdb.h",
-      "nss/lib/softoken/sftkdbt.h",
-      "nss/lib/softoken/sftkdbti.h",
-      "nss/lib/softoken/sftkhmac.c",
-      "nss/lib/softoken/sftkpars.c",
-      "nss/lib/softoken/sftkpars.h",
-      "nss/lib/softoken/sftkpwd.c",
-      "nss/lib/softoken/softkver.c",
-      "nss/lib/softoken/softkver.h",
-      "nss/lib/softoken/softoken.h",
-      "nss/lib/softoken/softoknt.h",
-      "nss/lib/softoken/tlsprf.c",
-      "nss/lib/ssl/sslerr.h",
-      "nss/lib/util/SECerrs.h",
-      "nss/lib/util/base64.h",
-      "nss/lib/util/ciferfam.h",
-      "nss/lib/util/derdec.c",
-      "nss/lib/util/derenc.c",
-      "nss/lib/util/dersubr.c",
-      "nss/lib/util/dertime.c",
-      "nss/lib/util/errstrs.c",
-      "nss/lib/util/hasht.h",
-      "nss/lib/util/nssb64.h",
-      "nss/lib/util/nssb64d.c",
-      "nss/lib/util/nssb64e.c",
-      "nss/lib/util/nssb64t.h",
-      "nss/lib/util/nssilckt.h",
-      "nss/lib/util/nssilock.c",
-      "nss/lib/util/nssilock.h",
-      "nss/lib/util/nsslocks.h",
-      "nss/lib/util/nssrwlk.c",
-      "nss/lib/util/nssrwlk.h",
-      "nss/lib/util/nssrwlkt.h",
-      "nss/lib/util/nssutil.h",
-      "nss/lib/util/oidstring.c",
-      "nss/lib/util/pkcs11.h",
-      "nss/lib/util/pkcs11f.h",
-      "nss/lib/util/pkcs11n.h",
-      "nss/lib/util/pkcs11p.h",
-      "nss/lib/util/pkcs11t.h",
-      "nss/lib/util/pkcs11u.h",
-      "nss/lib/util/pkcs1sig.c",
-      "nss/lib/util/pkcs1sig.h",
-      "nss/lib/util/portreg.c",
-      "nss/lib/util/portreg.h",
-      "nss/lib/util/quickder.c",
-      "nss/lib/util/secalgid.c",
-      "nss/lib/util/secasn1.h",
-      "nss/lib/util/secasn1d.c",
-      "nss/lib/util/secasn1e.c",
-      "nss/lib/util/secasn1t.h",
-      "nss/lib/util/secasn1u.c",
-      "nss/lib/util/seccomon.h",
-      "nss/lib/util/secder.h",
-      "nss/lib/util/secdert.h",
-      "nss/lib/util/secdig.c",
-      "nss/lib/util/secdig.h",
-      "nss/lib/util/secdigt.h",
-      "nss/lib/util/secerr.h",
-      "nss/lib/util/secitem.c",
-      "nss/lib/util/secitem.h",
-      "nss/lib/util/secoid.c",
-      "nss/lib/util/secoid.h",
-      "nss/lib/util/secoidt.h",
-      "nss/lib/util/secport.c",
-      "nss/lib/util/secport.h",
-      "nss/lib/util/sectime.c",
-      "nss/lib/util/templates.c",
-      "nss/lib/util/utf8.c",
-      "nss/lib/util/utilmod.c",
-      "nss/lib/util/utilmodt.h",
-      "nss/lib/util/utilpars.c",
-      "nss/lib/util/utilpars.h",
-      "nss/lib/util/utilparst.h",
-      "nss/lib/util/utilrename.h",
-      "nss/lib/util/verref.h",
-    ]
-
-    sources -= [
-      # mpi_arm.c is included by mpi_arm_mac.c.
-      "nss/lib/freebl/mpi/mpi_arm.c",
-
-      # primes.c is included by mpprime.c.
-      "nss/lib/freebl/mpi/primes.c",
-
-      # unix_rand.c and win_rand.c are included by sysrand.c.
-      "nss/lib/freebl/unix_rand.c",
-      "nss/lib/freebl/win_rand.c",
-
-      # debug_module.c is included by pk11load.c.
-      "nss/lib/pk11wrap/debug_module.c",
-    ]
-
-    configs -= [
-      "//build/config/compiler:chromium_code",
-      "//build/config/gcc:symbol_visibility_hidden",
-    ]
-
-    configs += [
-      "//build/config/compiler:no_chromium_code",
-      "//build/config/compiler:no_size_t_to_int_warning",
-      "//build/config/gcc:symbol_visibility_default",
-
-      # nss passes "const char*" through "void*".
-      "//build/config/compiler:no_incompatible_pointer_warnings",
-      ":nss_static_config_private",
-    ]
-    public_configs = [ ":nss_static_config" ]
-
-    cflags = [
-      "-include",
-      rebase_path("//third_party/nss/nss/lib/freebl/nss_build_config_mac.h",
-                  root_build_dir),
-    ]
-
-    # Only need the defines and includes not in nss_static_config.
-    defines = [
-      "MP_API_COMPATIBLE",
-      "NSS_DISABLE_DBM",
-      "NSS_PKIX_NO_LDAP",
-      "RIJNDAEL_INCLUDE_TABLES",
-      "SHLIB_VERSION=\"3\"",
-      "SOFTOKEN_SHLIB_VERSION=\"3\"",
-      "XP_UNIX",
-      "DARWIN",
-      "HAVE_STRERROR",
-      "HAVE_BSD_FLOCK",
-      "SHLIB_SUFFIX=\"dylib\"",
-      "SHLIB_PREFIX=\"lib\"",
-      "SOFTOKEN_LIB_NAME=\"libsoftokn3.dylib\"",
-    ]
-    include_dirs = [
-      "nss/lib/freebl/mpi",
-      "nss/lib/libpkix/include",
-      "nss/lib/libpkix/pkix/certsel",
-      "nss/lib/libpkix/pkix/checker",
-      "nss/lib/libpkix/pkix/crlsel",
-      "nss/lib/libpkix/pkix/params",
-      "nss/lib/libpkix/pkix/results",
-      "nss/lib/libpkix/pkix/store",
-      "nss/lib/libpkix/pkix/top",
-      "nss/lib/libpkix/pkix/util",
-      "nss/lib/libpkix/pkix_pl_nss/module",
-      "nss/lib/libpkix/pkix_pl_nss/pki",
-      "nss/lib/libpkix/pkix_pl_nss/system",
-      "nss/lib/ssl",
-    ]
-
-    public_deps = [
-      ":nspr",
-    ]
-    deps = [
-      ":nspr",
-      "//third_party/sqlite",
-    ]
-  }
-}  # iOS.
+}
diff --git a/build/temp_gyp/README.chromium b/build/temp_gyp/README.chromium
deleted file mode 100644
index 8045d61..0000000
--- a/build/temp_gyp/README.chromium
+++ /dev/null
@@ -1,3 +0,0 @@
-This directory will be removed once the files in it are committed upstream and
-Chromium imports an upstream revision with these files.  Contact mark for
-details.
diff --git a/build/temp_gyp/pdfsqueeze.gyp b/build/temp_gyp/pdfsqueeze.gyp
deleted file mode 100644
index 2b3b1ff8..0000000
--- a/build/temp_gyp/pdfsqueeze.gyp
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright (c) 2009 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.
-
-{
-  'targets': [
-    {
-      'target_name': 'pdfsqueeze',
-      'type': 'executable',
-      'sources': [
-        '../../third_party/pdfsqueeze/pdfsqueeze.m',
-      ],
-      'defines': [
-        # Use defines to map the full path names that will be used for
-        # the vars into the short forms expected by pdfsqueeze.m.
-        '______third_party_pdfsqueeze_ApplyGenericRGB_qfilter=ApplyGenericRGB_qfilter',
-        '______third_party_pdfsqueeze_ApplyGenericRGB_qfilter_len=ApplyGenericRGB_qfilter_len',
-      ],
-      'include_dirs': [
-        '<(INTERMEDIATE_DIR)',
-      ],
-      'libraries': [
-        '$(SDKROOT)/System/Library/Frameworks/Foundation.framework',
-        '$(SDKROOT)/System/Library/Frameworks/Quartz.framework',
-      ],
-      'actions': [
-        {
-          'action_name': 'Generate inline filter data',
-          'inputs': [
-            '../../third_party/pdfsqueeze/ApplyGenericRGB.qfilter',
-          ],
-          'outputs': [
-            '<(INTERMEDIATE_DIR)/ApplyGenericRGB.h',
-          ],
-          'action': ['xxd', '-i', '<@(_inputs)', '<@(_outputs)'],
-        },
-      ],
-    },
-  ],
-}
diff --git a/build/toolchain/gcc_toolchain.gni b/build/toolchain/gcc_toolchain.gni
index 2840ae0a..4ef118b7 100644
--- a/build/toolchain/gcc_toolchain.gni
+++ b/build/toolchain/gcc_toolchain.gni
@@ -412,14 +412,21 @@
 
       forward_variables_from(invoker,
                              [
-                               "is_clang",
-                               "is_component_build",
-                               "is_nacl_glibc",
                                "use_allocator",
                                "use_gold",
                                "symbol_level",
                              ])
 
+      if (defined(invoker.is_clang)) {
+        is_clang = invoker.is_clang
+      }
+      if (defined(invoker.is_component_build)) {
+        is_component_build = invoker.is_component_build
+      }
+      if (defined(invoker.is_nacl_glibc)) {
+        is_nacl_glibc = invoker.is_nacl_glibc
+      }
+
       if (defined(invoker.clear_sanitizers) && invoker.clear_sanitizers) {
         is_asan = false
         is_cfi = false
diff --git a/build/toolchain/mac/setup_toolchain.py b/build/toolchain/mac/setup_toolchain.py
index 431078f..98b50be 100644
--- a/build/toolchain/mac/setup_toolchain.py
+++ b/build/toolchain/mac/setup_toolchain.py
@@ -13,14 +13,27 @@
     tool_source = source_file.readlines()
 
   # Add header and write it out to the current directory (which should be the
-  # root build dir).
+  # root build dir). Don't write the file if a matching file already exists
+  # because that causes a cascade of unnecessary rebuilds.
+  match = False
+  contents = ''.join([tool_source[0],
+                      '# Generated by setup_toolchain.py do not edit.\n']
+                     + tool_source[1:])
   out_path = 'gyp-mac-tool'
-  with open(out_path, 'w') as tool_file:
-    tool_file.write(''.join([tool_source[0],
-                             '# Generated by setup_toolchain.py do not edit.\n']
-                            + tool_source[1:]))
+  try:
+    with open(out_path, 'rb') as read_tool_file:
+      existing_contents = read_tool_file.read()
+    if existing_contents == contents:
+      match = True
+  except:
+    pass
+  if not match:
+    with open(out_path, 'wb') as write_tool_file:
+      write_tool_file.write(contents)
   st = os.stat(out_path)
-  os.chmod(out_path, st.st_mode | stat.S_IEXEC)
+  if (st.st_mode & stat.S_IEXEC) == 0:
+    # Only chmod when necessary.
+    os.chmod(out_path, st.st_mode | stat.S_IEXEC)
 
 # Find the tool source, it's the first argument, and copy it.
 if len(sys.argv) != 2:
diff --git a/build/toolchain/nacl_toolchain.gni b/build/toolchain/nacl_toolchain.gni
index 1593666..96722cb3 100644
--- a/build/toolchain/nacl_toolchain.gni
+++ b/build/toolchain/nacl_toolchain.gni
@@ -38,8 +38,6 @@
                              "cc",
                              "cxx",
                              "deps",
-                             "is_clang",
-                             "is_nacl_glibc",
                              "ld",
                              "link_outputs",
                              "nm",
@@ -49,6 +47,13 @@
                              "toolchain_cpu",
                            ])
 
+    if (defined(invoker.is_clang)) {
+      is_clang = invoker.is_clang
+    }
+    if (defined(invoker.is_nacl_glibc)) {
+      is_nacl_glibc = invoker.is_nacl_glibc
+    }
+
     # We do not support component builds or sanitizers with the NaCl toolchains.
     is_component_build = false
     clear_sanitizers = true
diff --git a/build/toolchain/toolchain.gni b/build/toolchain/toolchain.gni
index dac6163..4ab0270f 100644
--- a/build/toolchain/toolchain.gni
+++ b/build/toolchain/toolchain.gni
@@ -17,6 +17,11 @@
   # LLVM toolchain (see llvm_force_head_revision in
   # build/config/compiler/BUILD.gn).
   use_lld = false
+
+  if (is_clang) {
+    # Clang compiler version. Clang files are placed at version-dependent paths.
+    clang_version = "3.9.0"
+  }
 }
 
 # Subdirectory within root_out_dir for shared library files.
diff --git a/build/toolchain/win/BUILD.gn b/build/toolchain/win/BUILD.gn
index beee0781..dfd1e84 100644
--- a/build/toolchain/win/BUILD.gn
+++ b/build/toolchain/win/BUILD.gn
@@ -238,11 +238,15 @@
         current_os = invoker.toolchain_os
       }
 
-      forward_variables_from(invoker,
-                             [
-                               "is_clang",
-                               "is_component_build",
-                             ])
+      # These share a name with global variables that are already defined, and
+      # forward_variables_from won't clobber the existing value, so we need to
+      # set it explicitly.
+      if (defined(invoker.is_clang)) {
+        is_clang = invoker.is_clang
+      }
+      if (defined(invoker.is_component_build)) {
+        is_component_build = invoker.is_component_build
+      }
 
       # This value needs to be passed through unchanged.
       host_toolchain = host_toolchain
@@ -313,7 +317,11 @@
     cl = "${goma_prefix}\"${x64_toolchain_data.vc_bin_dir}/cl.exe\""
     is_clang = false
 
-    forward_variables_from(invoker, [ "is_component_build" ])
+    # This shares a name with a global and forward_variables_from won't clobber
+    # the existing value, so we need to set it explicitly.
+    if (defined(invoker.is_component_build)) {
+      is_component_build = invoker.is_component_build
+    }
   }
 
   msvc_toolchain("clang_" + target_name) {
@@ -325,7 +333,11 @@
     toolchain_os = "win"
     is_clang = true
 
-    forward_variables_from(invoker, [ "is_component_build" ])
+    # This shares a name with a global and forward_variables_from won't clobber
+    # the existing value, so we need to set it explicitly.
+    if (defined(invoker.is_component_build)) {
+      is_component_build = invoker.is_component_build
+    }
   }
 }
 
diff --git a/build/util/branding.gni b/build/util/branding.gni
new file mode 100644
index 0000000..b234b817
--- /dev/null
+++ b/build/util/branding.gni
@@ -0,0 +1,28 @@
+# Copyright 2016 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 exposes the Chrome branding as GN variables for use in build files.
+#
+# PREFER NOT TO USE THESE. The GYP build uses this kind of thing extensively.
+# However, it is far better to write an action to generate a file at
+# build-time with the information you need. This allows better dependency
+# checking and GN will run faster.
+#
+# These values should only be used if you REALLY need to depend on them at
+# build-time, for example, in the computation of output file names.
+
+import("//build/config/chrome_build.gni")
+
+_branding_file = "//chrome/app/theme/$branding_path_component/BRANDING"
+_result = exec_script("version.py",
+                      [
+                        "-f",
+                        rebase_path(_branding_file, root_build_dir),
+                        "-t",
+                        "@PRODUCT_FULLNAME@",
+                      ],
+                      "trim string",
+                      [ _branding_file ])
+
+chrome_product_full_name = _result
diff --git a/build/util/version.gni b/build/util/version.gni
index fba8d25..6542341 100644
--- a/build/util/version.gni
+++ b/build/util/version.gni
@@ -45,3 +45,20 @@
 chrome_version_build = _result.build
 chrome_version_patch = _result.patch
 remoting_version_patch = _result.remoting
+
+if (is_mac) {
+  _result = exec_script("version.py",
+                        [
+                          "-f",
+                          rebase_path(chrome_version_file, root_build_dir),
+                          "-t",
+                          "@BUILD@.@PATCH_HI@.@PATCH_LO@",
+                          "-e",
+                          "PATCH_HI=int(PATCH)/256",
+                          "-e",
+                          "PATCH_LO=int(PATCH)%256",
+                        ],
+                        "trim string",
+                        [ chrome_version_file ])
+  chrome_dylib_version = _result
+}
diff --git a/build_overrides/gtest.gni b/build_overrides/gtest.gni
index d7ce189..254bef3 100644
--- a/build_overrides/gtest.gni
+++ b/build_overrides/gtest.gni
@@ -7,3 +7,9 @@
 
 # Exclude support for platform-specific operations across unit tests.
 gtest_include_platform_test = true
+
+# Exclude support for testing Objective C code on OS X and iOS.
+gtest_include_objc_support = true
+
+# Exclude support for flushing coverage files on iOS.
+gtest_include_ios_coverage = true
diff --git a/build_overrides/pdfium.gni b/build_overrides/pdfium.gni
new file mode 100644
index 0000000..b05a8dd
--- /dev/null
+++ b/build_overrides/pdfium.gni
@@ -0,0 +1,12 @@
+# Copyright 2016 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.
+
+# Enable use of Javascript in PDFs.
+pdf_enable_v8_override = true
+
+# Disable XFA forms in Chromium builds.
+pdf_enable_xfa_override = false
+
+# Disable use of Skia backend.
+pdf_use_skia_override = false
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc
index eeb7731..88f2036 100644
--- a/cc/layers/layer.cc
+++ b/cc/layers/layer.cc
@@ -78,7 +78,6 @@
       use_local_transform_for_backface_visibility_(false),
       should_check_backface_visibility_(false),
       force_render_surface_for_testing_(false),
-      transform_is_invertible_(true),
       has_render_surface_(false),
       subtree_property_changed_(false),
       background_color_(0),
@@ -593,19 +592,19 @@
   return is_container_for_fixed_position_layers_;
 }
 
-bool Are2dAxisAligned(const gfx::Transform& a,
-                      const gfx::Transform& b,
-                      bool* is_invertible) {
+bool Are2dAxisAligned(const gfx::Transform& a, const gfx::Transform& b) {
   if (a.IsScaleOrTranslation() && b.IsScaleOrTranslation()) {
-    *is_invertible = b.IsInvertible();
     return true;
   }
 
   gfx::Transform inverse(gfx::Transform::kSkipInitialization);
-  *is_invertible = b.GetInverse(&inverse);
-
-  inverse *= a;
-  return inverse.Preserves2dAxisAlignment();
+  if (b.GetInverse(&inverse)) {
+    inverse *= a;
+    return inverse.Preserves2dAxisAlignment();
+  } else {
+    // TODO(weiliangc): Should return false because b is not invertible.
+    return a.Preserves2dAxisAlignment();
+  }
 }
 
 void Layer::SetTransform(const gfx::Transform& transform) {
@@ -622,9 +621,8 @@
         // We need to trigger a rebuild if we could have affected 2d axis
         // alignment. We'll check to see if transform and transform_ are axis
         // align with respect to one another.
-        bool invertible = false;
         bool preserves_2d_axis_alignment =
-            Are2dAxisAligned(transform_, transform, &invertible);
+            Are2dAxisAligned(transform_, transform);
         transform_node->data.local = transform;
         transform_node->data.needs_local_transform_update = true;
         transform_node->data.transform_changed = true;
@@ -635,14 +633,12 @@
         else
           SetNeedsCommit();
         transform_ = transform;
-        transform_is_invertible_ = invertible;
         return;
       }
     }
   }
 
   transform_ = transform;
-  transform_is_invertible_ = transform.IsInvertible();
 
   SetNeedsCommit();
 }
@@ -1381,7 +1377,6 @@
   base->set_draw_blend_mode(SkXfermodeModeToProto(draw_blend_mode_));
   base->set_use_parent_backface_visibility(use_parent_backface_visibility_);
   TransformToProto(transform_, base->mutable_transform());
-  base->set_transform_is_invertible(transform_is_invertible_);
   base->set_sorting_context_id(sorting_context_id_);
   base->set_num_descendants_that_draw_content(
       num_descendants_that_draw_content_);
@@ -1461,7 +1456,6 @@
   draw_blend_mode_ = SkXfermodeModeFromProto(base.draw_blend_mode());
   use_parent_backface_visibility_ = base.use_parent_backface_visibility();
   transform_ = ProtoToTransform(base.transform());
-  transform_is_invertible_ = base.transform_is_invertible();
   sorting_context_id_ = base.sorting_context_id();
   num_descendants_that_draw_content_ = base.num_descendants_that_draw_content();
 
@@ -1616,7 +1610,6 @@
   if (transform_ == transform)
     return;
   transform_ = transform;
-  transform_is_invertible_ = transform.IsInvertible();
   // Changing the transform may change the visible part of this layer, so a new
   // recording may be needed.
   SetNeedsUpdate();
diff --git a/cc/layers/layer.h b/cc/layers/layer.h
index 6150f0c..97e83c3 100644
--- a/cc/layers/layer.h
+++ b/cc/layers/layer.h
@@ -199,7 +199,6 @@
   bool HasPotentiallyRunningTransformAnimation() const;
   bool HasOnlyTranslationTransforms() const;
   bool AnimationsPreserveAxisAlignment() const;
-  bool transform_is_invertible() const { return transform_is_invertible_; }
 
   bool MaximumTargetScale(float* max_scale) const;
   bool AnimationStartScale(float* start_scale) const;
@@ -642,7 +641,6 @@
   bool use_local_transform_for_backface_visibility_ : 1;
   bool should_check_backface_visibility_ : 1;
   bool force_render_surface_for_testing_ : 1;
-  bool transform_is_invertible_ : 1;
   bool has_render_surface_ : 1;
   bool subtree_property_changed_ : 1;
   Region non_fast_scrollable_region_;
diff --git a/cc/layers/layer_unittest.cc b/cc/layers/layer_unittest.cc
index 2fd0837..dd5bc15 100644
--- a/cc/layers/layer_unittest.cc
+++ b/cc/layers/layer_unittest.cc
@@ -180,7 +180,6 @@
     EXPECT_EQ(src->use_parent_backface_visibility_,
               dest->use_parent_backface_visibility_);
     EXPECT_EQ(src->transform_, dest->transform_);
-    EXPECT_EQ(src->transform_is_invertible_, dest->transform_is_invertible_);
     EXPECT_EQ(src->sorting_context_id_, dest->sorting_context_id_);
     EXPECT_EQ(src->num_descendants_that_draw_content_,
               dest->num_descendants_that_draw_content_);
@@ -287,7 +286,6 @@
     gfx::Transform transform;
     transform.Rotate(90);
     layer->transform_ = transform;
-    layer->transform_is_invertible_ = true;
     layer->sorting_context_id_ = 0;
     layer->num_descendants_that_draw_content_ = 5;
     layer->scroll_clip_layer_id_ = Layer::INVALID_ID;
@@ -336,7 +334,6 @@
     gfx::Transform transform;
     transform.Rotate(90);
     layer->transform_ = transform;
-    layer->transform_is_invertible_ = !layer->transform_is_invertible_;
     layer->sorting_context_id_ = 42;
     layer->num_descendants_that_draw_content_ = 5;
     layer->scroll_clip_layer_id_ = 17;
@@ -1812,69 +1809,6 @@
   EXPECT_EQ(replica.get(), replica->mask_layer()->parent());
 }
 
-TEST_F(LayerTest, CheckTransformIsInvertible) {
-  scoped_refptr<Layer> layer = Layer::Create();
-  std::unique_ptr<LayerImpl> impl_layer =
-      LayerImpl::Create(host_impl_.active_tree(), 1);
-  EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(1);
-  EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber());
-  layer_tree_host_->SetRootLayer(layer);
-
-  EXPECT_TRUE(layer->transform_is_invertible());
-
-  gfx::Transform singular_transform;
-  singular_transform.Scale3d(
-      SkDoubleToMScalar(1.0), SkDoubleToMScalar(1.0), SkDoubleToMScalar(0.0));
-
-  layer->SetTransform(singular_transform);
-  layer->PushPropertiesTo(impl_layer.get());
-
-  EXPECT_FALSE(layer->transform_is_invertible());
-  EXPECT_FALSE(impl_layer->transform().IsInvertible());
-
-  gfx::Transform rotation_transform;
-  rotation_transform.RotateAboutZAxis(-45.0);
-
-  layer->SetTransform(rotation_transform);
-  layer->PushPropertiesTo(impl_layer.get());
-  EXPECT_TRUE(layer->transform_is_invertible());
-  EXPECT_TRUE(impl_layer->transform().IsInvertible());
-
-  Mock::VerifyAndClearExpectations(layer_tree_host_.get());
-}
-
-TEST_F(LayerTest, TransformIsInvertibleAnimation) {
-  scoped_refptr<Layer> layer = Layer::Create();
-  std::unique_ptr<LayerImpl> impl_layer =
-      LayerImpl::Create(host_impl_.active_tree(), 1);
-  EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(1);
-  EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber());
-  layer_tree_host_->SetRootLayer(layer);
-
-  EXPECT_TRUE(layer->transform_is_invertible());
-
-  gfx::Transform singular_transform;
-  singular_transform.Scale3d(
-      SkDoubleToMScalar(1.0), SkDoubleToMScalar(1.0), SkDoubleToMScalar(0.0));
-
-  layer->SetTransform(singular_transform);
-  layer->PushPropertiesTo(impl_layer.get());
-
-  EXPECT_FALSE(layer->transform_is_invertible());
-  EXPECT_FALSE(impl_layer->transform().IsInvertible());
-
-  gfx::Transform identity_transform;
-
-  EXPECT_CALL(*layer_tree_host_, SetNeedsUpdateLayers()).Times(1);
-  layer->SetTransform(identity_transform);
-  layer->OnTransformAnimated(singular_transform);
-  layer->PushPropertiesTo(impl_layer.get());
-  EXPECT_FALSE(layer->transform_is_invertible());
-  EXPECT_FALSE(impl_layer->transform().IsInvertible());
-
-  Mock::VerifyAndClearExpectations(layer_tree_host_.get());
-}
-
 class LayerTreeHostFactory {
  public:
   LayerTreeHostFactory() : client_(FakeLayerTreeHostClient::DIRECT_3D) {}
diff --git a/cc/layers/render_surface_impl.cc b/cc/layers/render_surface_impl.cc
index bac8f243..ed036f39 100644
--- a/cc/layers/render_surface_impl.cc
+++ b/cc/layers/render_surface_impl.cc
@@ -70,16 +70,23 @@
 RenderSurfaceImpl::DrawProperties::~DrawProperties() {}
 
 gfx::RectF RenderSurfaceImpl::DrawableContentRect() const {
-  gfx::RectF drawable_content_rect =
-      MathUtil::MapClippedRect(draw_transform(), gfx::RectF(content_rect()));
-  if (owning_layer_->has_replica()) {
-    drawable_content_rect.Union(MathUtil::MapClippedRect(
-        replica_draw_transform(), gfx::RectF(content_rect())));
-  }
+  if (content_rect().IsEmpty())
+    return gfx::RectF();
+
+  gfx::Rect surface_content_rect = content_rect();
   if (!owning_layer_->filters().IsEmpty()) {
     int left, top, right, bottom;
     owning_layer_->filters().GetOutsets(&top, &right, &bottom, &left);
-    drawable_content_rect.Inset(-left, -top, -right, -bottom);
+    surface_content_rect.Inset(-left, -top, -right, -bottom);
+  }
+  gfx::RectF drawable_content_rect = MathUtil::MapClippedRect(
+      draw_transform(), gfx::RectF(surface_content_rect));
+  if (owning_layer_->has_replica()) {
+    drawable_content_rect.Union(MathUtil::MapClippedRect(
+        replica_draw_transform(), gfx::RectF(surface_content_rect)));
+  } else if (!owning_layer_->filters().IsEmpty() && is_clipped()) {
+    // Filter could move pixels around, but still need to be clipped.
+    drawable_content_rect.Intersect(gfx::RectF(clip_rect()));
   }
 
   // If the rect has a NaN coordinate, we return empty rect to avoid crashes in
diff --git a/cc/layers/texture_layer.cc b/cc/layers/texture_layer.cc
index eab540e..b5b3173 100644
--- a/cc/layers/texture_layer.cc
+++ b/cc/layers/texture_layer.cc
@@ -154,6 +154,26 @@
                             requires_commit, allow_mailbox_reuse);
 }
 
+static void IgnoreReleaseCallback(const gpu::SyncToken& sync_token, bool lost) {
+}
+
+void TextureLayer::SetTextureMailboxWithoutReleaseCallback(
+    const TextureMailbox& mailbox) {
+  // We allow reuse of the mailbox if there is a new sync point signalling new
+  // content, and the release callback goes nowhere since we'll be calling it
+  // multiple times for the same mailbox.
+  DCHECK(!mailbox.IsValid() || !holder_ref_ ||
+         !mailbox.Equals(holder_ref_->holder()->mailbox()) ||
+         mailbox.sync_token() != holder_ref_->holder()->mailbox().sync_token());
+  std::unique_ptr<SingleReleaseCallback> release;
+  bool requires_commit = true;
+  bool allow_mailbox_reuse = true;
+  if (mailbox.IsValid())
+    release = SingleReleaseCallback::Create(base::Bind(&IgnoreReleaseCallback));
+  SetTextureMailboxInternal(mailbox, std::move(release), requires_commit,
+                            allow_mailbox_reuse);
+}
+
 void TextureLayer::SetNeedsDisplayRect(const gfx::Rect& dirty_rect) {
   Layer::SetNeedsDisplayRect(dirty_rect);
 }
diff --git a/cc/layers/texture_layer.h b/cc/layers/texture_layer.h
index 2d5b6bb..4fa239f83 100644
--- a/cc/layers/texture_layer.h
+++ b/cc/layers/texture_layer.h
@@ -133,6 +133,12 @@
       const TextureMailbox& mailbox,
       std::unique_ptr<SingleReleaseCallback> release_callback);
 
+  // Use this for special cases where the same texture is used to back the
+  // TextureLayer across all frames.
+  // WARNING: DON'T ACTUALLY USE THIS WHAT YOU ARE DOING IS WRONG.
+  // TODO(danakj): Remove this when pepper doesn't need it. crbug.com/350204
+  void SetTextureMailboxWithoutReleaseCallback(const TextureMailbox& mailbox);
+
   void SetNeedsDisplayRect(const gfx::Rect& dirty_rect) override;
 
   void SetLayerTreeHost(LayerTreeHost* layer_tree_host) override;
diff --git a/cc/layers/texture_layer_unittest.cc b/cc/layers/texture_layer_unittest.cc
index bc139cd..3f35427 100644
--- a/cc/layers/texture_layer_unittest.cc
+++ b/cc/layers/texture_layer_unittest.cc
@@ -332,6 +332,33 @@
       SingleReleaseCallback::Create(test_data_.release_mailbox1_));
 }
 
+TEST_F(TextureLayerTest, SetTextureMailboxWithoutReleaseCallback) {
+  scoped_refptr<TextureLayer> test_layer =
+      TextureLayer::CreateForMailbox(nullptr);
+  ASSERT_TRUE(test_layer.get());
+
+  // These use the same gpu::Mailbox, but different sync points.
+  TextureMailbox mailbox1(MailboxFromChar('a'), SyncTokenFromUInt(1),
+                          GL_TEXTURE_2D);
+  TextureMailbox mailbox2(MailboxFromChar('a'), SyncTokenFromUInt(2),
+                          GL_TEXTURE_2D);
+
+  EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber());
+  layer_tree_host_->SetRootLayer(test_layer);
+  Mock::VerifyAndClearExpectations(layer_tree_host_.get());
+
+  // Set the mailbox the first time. It should cause a commit.
+  EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1));
+  test_layer->SetTextureMailboxWithoutReleaseCallback(mailbox1);
+  Mock::VerifyAndClearExpectations(layer_tree_host_.get());
+
+  // Set the mailbox again with a new sync point, as the backing texture has
+  // been updated. It should cause a new commit.
+  EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1));
+  test_layer->SetTextureMailboxWithoutReleaseCallback(mailbox2);
+  Mock::VerifyAndClearExpectations(layer_tree_host_.get());
+}
+
 class TextureLayerMailboxHolderTest : public TextureLayerTest {
  public:
   TextureLayerMailboxHolderTest()
diff --git a/cc/output/context_provider.h b/cc/output/context_provider.h
index 7fe7dbe..ecaa4ea 100644
--- a/cc/output/context_provider.h
+++ b/cc/output/context_provider.h
@@ -68,11 +68,6 @@
   // See skia GrContext::resetContext for details.
   virtual void InvalidateGrContext(uint32_t state) = 0;
 
-  // Sets up a lock so this context can be used from multiple threads. After
-  // calling this, all functions without explicit thread usage constraints can
-  // be used on any thread while the lock returned by GetLock() is acquired.
-  virtual void SetupLock() = 0;
-
   // Returns the lock that should be held if using this context from multiple
   // threads. This can be called on any thread.
   virtual base::Lock* GetLock() = 0;
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index 5c5f331..6a75674 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -1010,6 +1010,14 @@
             filter->filterBounds(gfx::RectToSkIRect(quad->rect), scale_matrix,
                                  SkImageFilter::kForward_MapDirection);
         gfx::RectF dst_rect = gfx::SkRectToRectF(SkRect::Make(result_rect));
+        // If the destination rect is not the same as the source rect, the edges
+        // previously computed for AA will be wrong. Rather than recompute them
+        // here, disable antialiasing and use a 1-pixel transparent
+        // border to achieve a similar effect.
+        if (use_aa && dst_rect != rect) {
+          dst_rect.Inset(-1.0f, -1.0f);
+          use_aa = false;
+        }
         gfx::Rect clip_rect = quad->shared_quad_state->clip_rect;
         if (clip_rect.IsEmpty()) {
           clip_rect = current_draw_rect_;
@@ -1052,6 +1060,8 @@
   if (filter_image_id) {
     DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_));
     gl_->BindTexture(GL_TEXTURE_2D, filter_image_id);
+    gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+    gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   } else {
     contents_resource_lock =
         base::WrapUnique(new ResourceProvider::ScopedSamplerGL(
diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc
index 4753f54..673f58c 100644
--- a/cc/output/software_renderer.cc
+++ b/cc/output/software_renderer.cc
@@ -492,21 +492,33 @@
                                       gfx::RectF(quad->visible_rect)));
   SkRect content_rect = SkRect::MakeWH(quad->rect.width(), quad->rect.height());
 
-  SkMatrix content_mat;
-  content_mat.setRectToRect(content_rect, dest_rect,
-                            SkMatrix::kFill_ScaleToFit);
-
   const SkBitmap* content = lock.sk_bitmap();
 
   sk_sp<SkImage> filter_image;
   if (!quad->filters.IsEmpty()) {
     sk_sp<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter(
         quad->filters, gfx::SizeF(content_texture->size()));
+    SkMatrix localM;
+    localM.setScale(quad->filters_scale.x(), quad->filters_scale.y());
+    SkIRect result_rect =
+        filter->filterBounds(gfx::RectToSkIRect(quad->rect), localM,
+                             SkImageFilter::kForward_MapDirection);
     // TODO(ajuma): Apply the filter in the same pass as the content where
     // possible (e.g. when there's no origin offset). See crbug.com/308201.
-    filter_image = ApplyImageFilter(filter.get(), quad, content);
+    filter_image = ApplyImageFilter(filter.get(), quad, result_rect, content);
+    if (filter_image) {
+      gfx::RectF rect = gfx::SkRectToRectF(SkRect::Make(result_rect));
+      dest_rect = dest_visible_rect =
+          gfx::RectFToSkRect(MathUtil::ScaleRectProportional(
+              QuadVertexRect(), gfx::RectF(quad->rect), rect));
+      content_rect = SkRect::MakeWH(result_rect.width(), result_rect.height());
+    }
   }
 
+  SkMatrix content_mat;
+  content_mat.setRectToRect(content_rect, dest_rect,
+                            SkMatrix::kFill_ScaleToFit);
+
   sk_sp<SkShader> shader;
   if (!filter_image) {
     shader =
@@ -631,22 +643,23 @@
 sk_sp<SkImage> SoftwareRenderer::ApplyImageFilter(
     SkImageFilter* filter,
     const RenderPassDrawQuad* quad,
+    const SkIRect& dst_rect,
     const SkBitmap* to_filter) const {
   if (!filter)
     return nullptr;
 
   SkImageInfo dst_info =
-      SkImageInfo::MakeN32Premul(to_filter->width(), to_filter->height());
+      SkImageInfo::MakeN32Premul(dst_rect.width(), dst_rect.height());
   sk_sp<SkSurface> surface = SkSurface::MakeRaster(dst_info);
 
-  SkMatrix localM;
-  localM.setTranslate(SkIntToScalar(-quad->rect.origin().x()),
-                      SkIntToScalar(-quad->rect.origin().y()));
-  localM.preScale(quad->filters_scale.x(), quad->filters_scale.y());
+  SkMatrix local_matrix;
+  local_matrix.setScale(quad->filters_scale.x(), quad->filters_scale.y());
 
   SkPaint paint;
-  paint.setImageFilter(filter->makeWithLocalMatrix(localM));
-  surface->getCanvas()->drawBitmap(*to_filter, 0, 0, &paint);
+  paint.setImageFilter(filter->makeWithLocalMatrix(local_matrix));
+  surface->getCanvas()->translate(-dst_rect.x(), -dst_rect.y());
+  surface->getCanvas()->drawBitmap(*to_filter, quad->rect.x(), quad->rect.y(),
+                                   &paint);
 
   return surface->makeImageSnapshot();
 }
@@ -711,8 +724,8 @@
   sk_sp<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter(
       quad->background_filters,
       gfx::SizeF(backdrop_bitmap.width(), backdrop_bitmap.height()));
-  sk_sp<SkImage> filter_backdrop_image =
-      ApplyImageFilter(filter.get(), quad, &backdrop_bitmap);
+  sk_sp<SkImage> filter_backdrop_image = ApplyImageFilter(
+      filter.get(), quad, backdrop_bitmap.bounds(), &backdrop_bitmap);
 
   if (!filter_backdrop_image)
     return nullptr;
diff --git a/cc/output/software_renderer.h b/cc/output/software_renderer.h
index e892b1c6..331db7a 100644
--- a/cc/output/software_renderer.h
+++ b/cc/output/software_renderer.h
@@ -90,6 +90,7 @@
   bool ShouldApplyBackgroundFilters(const RenderPassDrawQuad* quad) const;
   sk_sp<SkImage> ApplyImageFilter(SkImageFilter* filter,
                                   const RenderPassDrawQuad* quad,
+                                  const SkIRect& dst_rect,
                                   const SkBitmap* to_filter) const;
   gfx::Rect GetBackdropBoundingBoxForRenderPassQuad(
       const DrawingFrame* frame,
diff --git a/cc/proto/skia_conversions.cc b/cc/proto/skia_conversions.cc
index 84acdd4c..545dc491 100644
--- a/cc/proto/skia_conversions.cc
+++ b/cc/proto/skia_conversions.cc
@@ -27,17 +27,17 @@
 
 SkRegion::Op SkRegionOpFromProto(proto::SkRegion::Op op) {
   switch (op) {
-    case proto::SkRegion::Op_Difference:
+    case proto::SkRegion::DIFFERENCE_:
       return SkRegion::Op::kDifference_Op;
-    case proto::SkRegion::Op_Intersect:
+    case proto::SkRegion::INTERSECT:
       return SkRegion::Op::kIntersect_Op;
-    case proto::SkRegion::Op_Union:
+    case proto::SkRegion::UNION:
       return SkRegion::Op::kUnion_Op;
-    case proto::SkRegion::Op_XOR:
+    case proto::SkRegion::XOR:
       return SkRegion::Op::kXOR_Op;
-    case proto::SkRegion::Op_ReverseDifference:
+    case proto::SkRegion::REVERSE_DIFFERENCE:
       return SkRegion::Op::kReverseDifference_Op;
-    case proto::SkRegion::Op_Replace:
+    case proto::SkRegion::REPLACE:
       return SkRegion::Op::kReplace_Op;
   }
   return SkRegion::Op::kDifference_Op;
@@ -46,80 +46,80 @@
 proto::SkRegion::Op SkRegionOpToProto(SkRegion::Op op) {
   switch (op) {
     case SkRegion::Op::kDifference_Op:
-      return proto::SkRegion::Op_Difference;
+      return proto::SkRegion::DIFFERENCE_;
     case SkRegion::Op::kIntersect_Op:
-      return proto::SkRegion::Op_Intersect;
+      return proto::SkRegion::INTERSECT;
     case SkRegion::Op::kUnion_Op:
-      return proto::SkRegion::Op_Union;
+      return proto::SkRegion::UNION;
     case SkRegion::Op::kXOR_Op:
-      return proto::SkRegion::Op_XOR;
+      return proto::SkRegion::XOR;
     case SkRegion::Op::kReverseDifference_Op:
-      return proto::SkRegion::Op_ReverseDifference;
+      return proto::SkRegion::REVERSE_DIFFERENCE;
     case SkRegion::Op::kReplace_Op:
-      return proto::SkRegion::Op_Replace;
+      return proto::SkRegion::REPLACE;
   }
-  return proto::SkRegion::Op_Difference;
+  return proto::SkRegion::DIFFERENCE_;
 }
 
 SkXfermode::Mode SkXfermodeModeFromProto(proto::SkXfermode::Mode mode) {
   switch (mode) {
-    case proto::SkXfermode::Mode_Clear:
+    case proto::SkXfermode::CLEAR_:
       return SkXfermode::Mode::kClear_Mode;
-    case proto::SkXfermode::Mode_Src:
+    case proto::SkXfermode::SRC:
       return SkXfermode::Mode::kSrc_Mode;
-    case proto::SkXfermode::Mode_Dst:
+    case proto::SkXfermode::DST:
       return SkXfermode::Mode::kDst_Mode;
-    case proto::SkXfermode::Mode_SrcOver:
+    case proto::SkXfermode::SRC_OVER:
       return SkXfermode::Mode::kSrcOver_Mode;
-    case proto::SkXfermode::Mode_DstOver:
+    case proto::SkXfermode::DST_OVER:
       return SkXfermode::Mode::kDstOver_Mode;
-    case proto::SkXfermode::Mode_SrcIn:
+    case proto::SkXfermode::SRC_IN:
       return SkXfermode::Mode::kSrcIn_Mode;
-    case proto::SkXfermode::Mode_DstIn:
+    case proto::SkXfermode::DST_IN:
       return SkXfermode::Mode::kDstIn_Mode;
-    case proto::SkXfermode::Mode_SrcOut:
+    case proto::SkXfermode::SRC_OUT:
       return SkXfermode::Mode::kSrcOut_Mode;
-    case proto::SkXfermode::Mode_DstOut:
+    case proto::SkXfermode::DST_OUT:
       return SkXfermode::Mode::kDstOut_Mode;
-    case proto::SkXfermode::Mode_SrcATop:
+    case proto::SkXfermode::SRC_A_TOP:
       return SkXfermode::Mode::kSrcATop_Mode;
-    case proto::SkXfermode::Mode_DstATop:
+    case proto::SkXfermode::DST_A_TOP:
       return SkXfermode::Mode::kDstATop_Mode;
-    case proto::SkXfermode::Mode_XOR:
+    case proto::SkXfermode::XOR:
       return SkXfermode::Mode::kXor_Mode;
-    case proto::SkXfermode::Mode_Plus:
+    case proto::SkXfermode::PLUS:
       return SkXfermode::Mode::kPlus_Mode;
-    case proto::SkXfermode::Mode_Modulate:
+    case proto::SkXfermode::MODULATE:
       return SkXfermode::Mode::kModulate_Mode;
-    case proto::SkXfermode::Mode_Screen:
+    case proto::SkXfermode::SCREEN:
       return SkXfermode::Mode::kScreen_Mode;
-    case proto::SkXfermode::Mode_Overlay:
+    case proto::SkXfermode::OVERLAY:
       return SkXfermode::Mode::kOverlay_Mode;
-    case proto::SkXfermode::Mode_Darken:
+    case proto::SkXfermode::DARKEN:
       return SkXfermode::Mode::kDarken_Mode;
-    case proto::SkXfermode::Mode_Lighten:
+    case proto::SkXfermode::LIGHTEN:
       return SkXfermode::Mode::kLighten_Mode;
-    case proto::SkXfermode::Mode_ColorDodge:
+    case proto::SkXfermode::COLOR_DODGE:
       return SkXfermode::Mode::kColorDodge_Mode;
-    case proto::SkXfermode::Mode_ColorBurn:
+    case proto::SkXfermode::COLOR_BURN:
       return SkXfermode::Mode::kColorBurn_Mode;
-    case proto::SkXfermode::Mode_HardLight:
+    case proto::SkXfermode::HARD_LIGHT:
       return SkXfermode::Mode::kHardLight_Mode;
-    case proto::SkXfermode::Mode_SoftLight:
+    case proto::SkXfermode::SOFT_LIGHT:
       return SkXfermode::Mode::kSoftLight_Mode;
-    case proto::SkXfermode::Mode_Difference:
+    case proto::SkXfermode::DIFFERENCE_:
       return SkXfermode::Mode::kDifference_Mode;
-    case proto::SkXfermode::Mode_Exclusion:
+    case proto::SkXfermode::EXCLUSION:
       return SkXfermode::Mode::kExclusion_Mode;
-    case proto::SkXfermode::Mode_Multiply:
+    case proto::SkXfermode::MULTIPLY:
       return SkXfermode::Mode::kMultiply_Mode;
-    case proto::SkXfermode::Mode_Hue:
+    case proto::SkXfermode::HUE:
       return SkXfermode::Mode::kHue_Mode;
-    case proto::SkXfermode::Mode_Saturation:
+    case proto::SkXfermode::SATURATION:
       return SkXfermode::Mode::kSaturation_Mode;
-    case proto::SkXfermode::Mode_Color:
+    case proto::SkXfermode::COLOR:
       return SkXfermode::Mode::kColor_Mode;
-    case proto::SkXfermode::Mode_Luminosity:
+    case proto::SkXfermode::LUMINOSITY:
       return SkXfermode::Mode::kLuminosity_Mode;
   }
   return SkXfermode::Mode::kClear_Mode;
@@ -128,65 +128,65 @@
 proto::SkXfermode::Mode SkXfermodeModeToProto(SkXfermode::Mode mode) {
   switch (mode) {
     case SkXfermode::Mode::kClear_Mode:
-      return proto::SkXfermode::Mode_Clear;
+      return proto::SkXfermode::CLEAR_;
     case SkXfermode::Mode::kSrc_Mode:
-      return proto::SkXfermode::Mode_Src;
+      return proto::SkXfermode::SRC;
     case SkXfermode::Mode::kDst_Mode:
-      return proto::SkXfermode::Mode_Dst;
+      return proto::SkXfermode::DST;
     case SkXfermode::Mode::kSrcOver_Mode:
-      return proto::SkXfermode::Mode_SrcOver;
+      return proto::SkXfermode::SRC_OVER;
     case SkXfermode::Mode::kDstOver_Mode:
-      return proto::SkXfermode::Mode_DstOver;
+      return proto::SkXfermode::DST_OVER;
     case SkXfermode::Mode::kSrcIn_Mode:
-      return proto::SkXfermode::Mode_SrcIn;
+      return proto::SkXfermode::SRC_IN;
     case SkXfermode::Mode::kDstIn_Mode:
-      return proto::SkXfermode::Mode_DstIn;
+      return proto::SkXfermode::DST_IN;
     case SkXfermode::Mode::kSrcOut_Mode:
-      return proto::SkXfermode::Mode_SrcOut;
+      return proto::SkXfermode::SRC_OUT;
     case SkXfermode::Mode::kDstOut_Mode:
-      return proto::SkXfermode::Mode_DstOut;
+      return proto::SkXfermode::DST_OUT;
     case SkXfermode::Mode::kSrcATop_Mode:
-      return proto::SkXfermode::Mode_SrcATop;
+      return proto::SkXfermode::SRC_A_TOP;
     case SkXfermode::Mode::kDstATop_Mode:
-      return proto::SkXfermode::Mode_DstATop;
+      return proto::SkXfermode::DST_A_TOP;
     case SkXfermode::Mode::kXor_Mode:
-      return proto::SkXfermode::Mode_XOR;
+      return proto::SkXfermode::XOR;
     case SkXfermode::Mode::kPlus_Mode:
-      return proto::SkXfermode::Mode_Plus;
+      return proto::SkXfermode::PLUS;
     case SkXfermode::Mode::kModulate_Mode:
-      return proto::SkXfermode::Mode_Modulate;
+      return proto::SkXfermode::MODULATE;
     case SkXfermode::Mode::kScreen_Mode:
-      return proto::SkXfermode::Mode_Screen;
+      return proto::SkXfermode::SCREEN;
     case SkXfermode::Mode::kOverlay_Mode:
-      return proto::SkXfermode::Mode_Overlay;
+      return proto::SkXfermode::OVERLAY;
     case SkXfermode::Mode::kDarken_Mode:
-      return proto::SkXfermode::Mode_Darken;
+      return proto::SkXfermode::DARKEN;
     case SkXfermode::Mode::kLighten_Mode:
-      return proto::SkXfermode::Mode_Lighten;
+      return proto::SkXfermode::LIGHTEN;
     case SkXfermode::Mode::kColorDodge_Mode:
-      return proto::SkXfermode::Mode_ColorDodge;
+      return proto::SkXfermode::COLOR_DODGE;
     case SkXfermode::Mode::kColorBurn_Mode:
-      return proto::SkXfermode::Mode_ColorBurn;
+      return proto::SkXfermode::COLOR_BURN;
     case SkXfermode::Mode::kHardLight_Mode:
-      return proto::SkXfermode::Mode_HardLight;
+      return proto::SkXfermode::HARD_LIGHT;
     case SkXfermode::Mode::kSoftLight_Mode:
-      return proto::SkXfermode::Mode_SoftLight;
+      return proto::SkXfermode::SOFT_LIGHT;
     case SkXfermode::Mode::kDifference_Mode:
-      return proto::SkXfermode::Mode_Difference;
+      return proto::SkXfermode::DIFFERENCE_;
     case SkXfermode::Mode::kExclusion_Mode:
-      return proto::SkXfermode::Mode_Exclusion;
+      return proto::SkXfermode::EXCLUSION;
     case SkXfermode::Mode::kMultiply_Mode:
-      return proto::SkXfermode::Mode_Multiply;
+      return proto::SkXfermode::MULTIPLY;
     case SkXfermode::Mode::kHue_Mode:
-      return proto::SkXfermode::Mode_Hue;
+      return proto::SkXfermode::HUE;
     case SkXfermode::Mode::kSaturation_Mode:
-      return proto::SkXfermode::Mode_Saturation;
+      return proto::SkXfermode::SATURATION;
     case SkXfermode::Mode::kColor_Mode:
-      return proto::SkXfermode::Mode_Color;
+      return proto::SkXfermode::COLOR;
     case SkXfermode::Mode::kLuminosity_Mode:
-      return proto::SkXfermode::Mode_Luminosity;
+      return proto::SkXfermode::LUMINOSITY;
   }
-  return proto::SkXfermode::Mode_Clear;
+  return proto::SkXfermode::CLEAR_;
 }
 
 void SkRRectToProto(const SkRRect& rect, proto::SkRRect* proto) {
diff --git a/cc/proto/skregion.proto b/cc/proto/skregion.proto
index 1f6b337..d45fedd 100644
--- a/cc/proto/skregion.proto
+++ b/cc/proto/skregion.proto
@@ -10,11 +10,11 @@
 
 message SkRegion {
   enum Op {
-    Op_Difference = 0;
-    Op_Intersect = 1;
-    Op_Union = 2;
-    Op_XOR = 3;
-    Op_ReverseDifference = 4;
-    Op_Replace = 5;
+    DIFFERENCE_ = 0;  // On Windows, winuser.h defines DIFFERENCE.
+    INTERSECT = 1;
+    UNION = 2;
+    XOR = 3;
+    REVERSE_DIFFERENCE = 4;
+    REPLACE = 5;
   }
-}
\ No newline at end of file
+}
diff --git a/cc/proto/skxfermode.proto b/cc/proto/skxfermode.proto
index b0b39630..349aa8b9e 100644
--- a/cc/proto/skxfermode.proto
+++ b/cc/proto/skxfermode.proto
@@ -10,37 +10,37 @@
 
 message SkXfermode {
   enum Mode {
-    Mode_Clear = 0;
-    Mode_Src = 1;
-    Mode_Dst = 2;
-    Mode_SrcOver = 3;
-    Mode_DstOver = 4;
-    Mode_SrcIn = 5;
-    Mode_DstIn = 6;
-    Mode_SrcOut = 7;
-    Mode_DstOut = 8;
-    Mode_SrcATop = 9;
-    Mode_DstATop = 10;
-    Mode_XOR = 11;
-    Mode_Plus = 12;
-    Mode_Modulate = 13;
+    CLEAR_ = 0;  // Clear() is a method for protos.
+    SRC = 1;
+    DST = 2;
+    SRC_OVER = 3;
+    DST_OVER = 4;
+    SRC_IN = 5;
+    DST_IN = 6;
+    SRC_OUT = 7;
+    DST_OUT = 8;
+    SRC_A_TOP = 9;
+    DST_A_TOP = 10;
+    XOR = 11;
+    PLUS = 12;
+    MODULATE = 13;
 
-    Mode_Screen = 14;
+    SCREEN = 14;
 
-    Mode_Overlay = 15;
-    Mode_Darken = 16;
-    Mode_Lighten = 17;
-    Mode_ColorDodge = 18;
-    Mode_ColorBurn = 19;
-    Mode_HardLight = 20;
-    Mode_SoftLight = 21;
-    Mode_Difference = 22;
-    Mode_Exclusion = 23;
-    Mode_Multiply = 24;
+    OVERLAY = 15;
+    DARKEN = 16;
+    LIGHTEN = 17;
+    COLOR_DODGE = 18;
+    COLOR_BURN = 19;
+    HARD_LIGHT = 20;
+    SOFT_LIGHT = 21;
+    DIFFERENCE_ = 22;
+    EXCLUSION = 23;
+    MULTIPLY = 24;
 
-    Mode_Hue = 25;
-    Mode_Saturation = 26;
-    Mode_Color = 27;
-    Mode_Luminosity = 28;
+    HUE = 25;
+    SATURATION = 26;
+    COLOR = 27;
+    LUMINOSITY = 28;
   }
-}
\ No newline at end of file
+}
diff --git a/cc/raster/raster_buffer_provider_perftest.cc b/cc/raster/raster_buffer_provider_perftest.cc
index c031b4c..662a24a5 100644
--- a/cc/raster/raster_buffer_provider_perftest.cc
+++ b/cc/raster/raster_buffer_provider_perftest.cc
@@ -97,7 +97,6 @@
     if (gr_context_)
       gr_context_.get()->resetContext(state);
   }
-  void SetupLock() override {}
   base::Lock* GetLock() override { return &context_lock_; }
   void DeleteCachedResources() override {}
   void SetLostContextCallback(const LostContextCallback& cb) override {}
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
index 13778ec..0a3f242 100644
--- a/cc/resources/resource_provider.cc
+++ b/cc/resources/resource_provider.cc
@@ -996,7 +996,7 @@
   resource_provider_->LazyAllocate(resource_);
   texture_id_ = resource_->gl_id;
   DCHECK(texture_id_);
-  if (resource_->dirty_image)
+  if (resource_->image_id && resource_->dirty_image)
     resource_provider_->BindImageForSampling(resource_);
 }
 
@@ -1091,9 +1091,8 @@
       set_sync_token_(false) {
   DCHECK(thread_checker_.CalledOnValidThread());
   resource_provider_->LazyAllocate(resource_);
-  if (resource_->dirty_image) {
+  if (resource_->image_id && resource_->dirty_image)
     resource_provider_->BindImageForSampling(resource_);
-  }
 }
 
 ResourceProvider::ScopedWriteLockGr::~ScopedWriteLockGr() {
@@ -1822,6 +1821,8 @@
     resource->image_id = gl->CreateImageCHROMIUM(
         resource->gpu_memory_buffer->AsClientBuffer(), resource->size.width(),
         resource->size.height(), GLInternalFormat(resource->format));
+    DCHECK(resource->image_id || IsGLContextLost());
+
     resource->SetLocallyUsed();
   }
 }
@@ -1885,6 +1886,10 @@
   return context_provider ? context_provider->GrContext() : nullptr;
 }
 
+bool ResourceProvider::IsGLContextLost() const {
+  return ContextGL()->GetGraphicsResetStatusKHR() != GL_NO_ERROR;
+}
+
 bool ResourceProvider::OnMemoryDump(
     const base::trace_event::MemoryDumpArgs& args,
     base::trace_event::ProcessMemoryDump* pmd) {
diff --git a/cc/resources/resource_provider.h b/cc/resources/resource_provider.h
index 5b5e5be..471f773 100644
--- a/cc/resources/resource_provider.h
+++ b/cc/resources/resource_provider.h
@@ -642,6 +642,7 @@
   // Returns NULL if the output_surface_ does not have a ContextProvider.
   gpu::gles2::GLES2Interface* ContextGL() const;
   class GrContext* GrContext(bool worker_context) const;
+  bool IsGLContextLost() const;
 
   OutputSurface* output_surface_;
   SharedBitmapManager* shared_bitmap_manager_;
diff --git a/cc/test/data/rotated_drop_shadow_filter_gl.png b/cc/test/data/rotated_drop_shadow_filter_gl.png
new file mode 100644
index 0000000..c51b720
--- /dev/null
+++ b/cc/test/data/rotated_drop_shadow_filter_gl.png
Binary files differ
diff --git a/cc/test/data/rotated_drop_shadow_filter_sw.png b/cc/test/data/rotated_drop_shadow_filter_sw.png
new file mode 100644
index 0000000..3f7daec
--- /dev/null
+++ b/cc/test/data/rotated_drop_shadow_filter_sw.png
Binary files differ
diff --git a/cc/test/data/rotated_filter_gl.png b/cc/test/data/rotated_filter_gl.png
new file mode 100644
index 0000000..5c2439f
--- /dev/null
+++ b/cc/test/data/rotated_filter_gl.png
Binary files differ
diff --git a/cc/test/data/rotated_filter_sw.png b/cc/test/data/rotated_filter_sw.png
new file mode 100644
index 0000000..761776ec
--- /dev/null
+++ b/cc/test/data/rotated_filter_sw.png
Binary files differ
diff --git a/cc/test/test_context_provider.cc b/cc/test/test_context_provider.cc
index e01f77e..b2683ae 100644
--- a/cc/test/test_context_provider.cc
+++ b/cc/test/test_context_provider.cc
@@ -29,12 +29,9 @@
 scoped_refptr<TestContextProvider> TestContextProvider::CreateWorker() {
   scoped_refptr<TestContextProvider> worker_context_provider =
       Create(TestWebGraphicsContext3D::Create());
-  if (!worker_context_provider)
-    return nullptr;
   // Worker contexts are bound to the thread they are created on.
   if (!worker_context_provider->BindToCurrentThread())
     return nullptr;
-  worker_context_provider->SetupLock();
   return worker_context_provider;
 }
 
@@ -131,9 +128,6 @@
     gr_context_.get()->resetContext(state);
 }
 
-void TestContextProvider::SetupLock() {
-}
-
 base::Lock* TestContextProvider::GetLock() {
   return &context_lock_;
 }
diff --git a/cc/test/test_context_provider.h b/cc/test/test_context_provider.h
index ea0803f6..f294eb7 100644
--- a/cc/test/test_context_provider.h
+++ b/cc/test/test_context_provider.h
@@ -31,7 +31,7 @@
 
   static scoped_refptr<TestContextProvider> Create();
   // Creates a worker context provider that can be used on any thread. This is
-  // equivalent to: Create(); BindToCurrentThread(); SetupLock().
+  // equivalent to: Create(); BindToCurrentThread().
   static scoped_refptr<TestContextProvider> CreateWorker();
   static scoped_refptr<TestContextProvider> Create(
       std::unique_ptr<TestWebGraphicsContext3D> context);
@@ -43,7 +43,6 @@
   gpu::ContextSupport* ContextSupport() override;
   class GrContext* GrContext() override;
   void InvalidateGrContext(uint32_t state) override;
-  void SetupLock() override;
   base::Lock* GetLock() override;
   void DeleteCachedResources() override;
   void SetLostContextCallback(const LostContextCallback& cb) override;
diff --git a/cc/test/test_in_process_context_provider.cc b/cc/test/test_in_process_context_provider.cc
index 7a1d2d81..c66e6ca09 100644
--- a/cc/test/test_in_process_context_provider.cc
+++ b/cc/test/test_in_process_context_provider.cc
@@ -93,9 +93,6 @@
     gr_context_->ResetContext(state);
 }
 
-void TestInProcessContextProvider::SetupLock() {
-}
-
 base::Lock* TestInProcessContextProvider::GetLock() {
   return &context_lock_;
 }
diff --git a/cc/test/test_in_process_context_provider.h b/cc/test/test_in_process_context_provider.h
index d001c18..351e41e 100644
--- a/cc/test/test_in_process_context_provider.h
+++ b/cc/test/test_in_process_context_provider.h
@@ -42,7 +42,6 @@
   gpu::ContextSupport* ContextSupport() override;
   class GrContext* GrContext() override;
   void InvalidateGrContext(uint32_t state) override;
-  void SetupLock() override;
   base::Lock* GetLock() override;
   gpu::Capabilities ContextCapabilities() override;
   void DeleteCachedResources() override;
diff --git a/cc/tiles/gpu_image_decode_controller.cc b/cc/tiles/gpu_image_decode_controller.cc
index 17f66d54..b7dbd55 100644
--- a/cc/tiles/gpu_image_decode_controller.cc
+++ b/cc/tiles/gpu_image_decode_controller.cc
@@ -821,4 +821,13 @@
       ResourceFormatToClosestSkColorType(format_), kPremul_SkAlphaType);
 }
 
+void GpuImageDecodeController::SetImageDecodingFailedForTesting(
+    const DrawImage& image) {
+  base::AutoLock lock(lock_);
+  auto found = image_data_.Peek(image.image()->uniqueID());
+  DCHECK(found != image_data_.end());
+  ImageData* image_data = found->second.get();
+  image_data->decode.decode_failure = true;
+}
+
 }  // namespace cc
diff --git a/cc/tiles/gpu_image_decode_controller.h b/cc/tiles/gpu_image_decode_controller.h
index 9b82c52..673dfc9 100644
--- a/cc/tiles/gpu_image_decode_controller.h
+++ b/cc/tiles/gpu_image_decode_controller.h
@@ -90,6 +90,7 @@
     cached_bytes_limit_ = limit;
   }
   size_t GetBytesUsedForTesting() const { return bytes_used_; }
+  void SetImageDecodingFailedForTesting(const DrawImage& image);
 
  private:
   enum class DecodedDataMode { GPU, CPU };
diff --git a/cc/tiles/gpu_image_decode_controller_unittest.cc b/cc/tiles/gpu_image_decode_controller_unittest.cc
index 39a02f7..1891f2e5 100644
--- a/cc/tiles/gpu_image_decode_controller_unittest.cc
+++ b/cc/tiles/gpu_image_decode_controller_unittest.cc
@@ -357,6 +357,40 @@
   controller.UnrefImage(draw_image);
 }
 
+TEST(GpuImageDecodeControllerTest, NoTaskForImageAlreadyFailedDecoding) {
+  auto context_provider = TestContextProvider::Create();
+  context_provider->BindToCurrentThread();
+  GpuImageDecodeController controller(context_provider.get(),
+                                      ResourceFormat::RGBA_8888);
+  bool is_decomposable = true;
+  SkFilterQuality quality = kHigh_SkFilterQuality;
+
+  sk_sp<SkImage> image = CreateImage(100, 100);
+  DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
+                       quality,
+                       CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
+  scoped_refptr<TileTask> task;
+  bool need_unref = controller.GetTaskForImageAndRef(
+      draw_image, ImageDecodeController::TracingInfo(), &task);
+  EXPECT_TRUE(need_unref);
+  EXPECT_TRUE(task);
+
+  ProcessTask(task->dependencies()[0].get());
+  ScheduleTask(task.get());
+  // Didn't run the task, complete it (it was canceled).
+  CompleteTask(task.get());
+
+  controller.SetImageDecodingFailedForTesting(draw_image);
+
+  scoped_refptr<TileTask> another_task;
+  need_unref = controller.GetTaskForImageAndRef(
+      draw_image, ImageDecodeController::TracingInfo(), &another_task);
+  EXPECT_FALSE(need_unref);
+  EXPECT_EQ(another_task.get(), nullptr);
+
+  controller.UnrefImage(draw_image);
+}
+
 TEST(GpuImageDecodeControllerTest, GetDecodedImageForDraw) {
   auto context_provider = TestContextProvider::Create();
   context_provider->BindToCurrentThread();
diff --git a/cc/tiles/software_image_decode_controller.cc b/cc/tiles/software_image_decode_controller.cc
index 86d1bb2..95c2d7b1 100644
--- a/cc/tiles/software_image_decode_controller.cc
+++ b/cc/tiles/software_image_decode_controller.cc
@@ -6,6 +6,7 @@
 
 #include <stdint.h>
 
+#include <algorithm>
 #include <functional>
 
 #include "base/format_macros.h"
@@ -96,17 +97,62 @@
   DISALLOW_COPY_AND_ASSIGN(ImageDecodeTaskImpl);
 };
 
+// Most images are scaled from the source image's size to the target size.
+// But in the case of mipmaps, we are scaling from the mip level which is
+// larger than we need.
+// This function gets the scale of the mip level which will be used.
+SkSize GetMipMapScaleAdjustment(const gfx::Size& src_size,
+                                const gfx::Size& target_size) {
+  int src_height = src_size.height();
+  int src_width = src_size.width();
+  int target_height = target_size.height();
+  int target_width = target_size.width();
+  if (target_height == 0 || target_width == 0)
+    return SkSize::Make(-1.f, -1.f);
+
+  int next_mip_height = src_height;
+  int next_mip_width = src_width;
+  for (int current_mip_level = 0;; current_mip_level++) {
+    int mip_height = next_mip_height;
+    int mip_width = next_mip_width;
+
+    next_mip_height = std::max(1, src_height / (1 << (current_mip_level + 1)));
+    next_mip_width = std::max(1, src_width / (1 << (current_mip_level + 1)));
+
+    // Check if an axis on the next mip level would be smaller than the target.
+    // If so, use the current mip level.
+    // This effectively always uses the larger image and always scales down.
+    if (next_mip_height < target_height || next_mip_width < target_width) {
+      SkScalar y_scale = static_cast<float>(mip_height) / src_height;
+      SkScalar x_scale = static_cast<float>(mip_width) / src_width;
+
+      return SkSize::Make(x_scale, y_scale);
+    }
+
+    if (mip_height == 1 && mip_width == 1) {
+      // We have reached the final mip level
+      SkScalar y_scale = static_cast<float>(mip_height) / src_height;
+      SkScalar x_scale = static_cast<float>(mip_width) / src_width;
+
+      return SkSize::Make(x_scale, y_scale);
+    }
+  }
+}
+
 SkSize GetScaleAdjustment(const ImageDecodeControllerKey& key) {
   // If the requested filter quality did not require scale, then the adjustment
   // is identity.
-  if (key.can_use_original_decode())
+  if (key.can_use_original_decode()) {
     return SkSize::Make(1.f, 1.f);
-
-  float x_scale =
-      key.target_size().width() / static_cast<float>(key.src_rect().width());
-  float y_scale =
-      key.target_size().height() / static_cast<float>(key.src_rect().height());
-  return SkSize::Make(x_scale, y_scale);
+  } else if (key.filter_quality() == kMedium_SkFilterQuality) {
+    return GetMipMapScaleAdjustment(key.src_rect().size(), key.target_size());
+  } else {
+    float x_scale =
+        key.target_size().width() / static_cast<float>(key.src_rect().width());
+    float y_scale = key.target_size().height() /
+                    static_cast<float>(key.src_rect().height());
+    return SkSize::Make(x_scale, y_scale);
+  }
 }
 
 SkFilterQuality GetDecodedFilterQuality(const ImageDecodeControllerKey& key) {
@@ -188,25 +234,6 @@
     return false;
   }
 
-  // If we're not going to do a scale, we will just create a task to preroll the
-  // image the first time we see it. This doesn't need to account for memory.
-  // TODO(vmpstr): We can also lock the original sized image, in which case it
-  // does require memory bookkeeping.
-  if (!CanHandleImage(key)) {
-    base::AutoLock lock(lock_);
-    if (prerolled_images_.count(key.image_id()) == 0) {
-      scoped_refptr<TileTask>& existing_task = pending_image_tasks_[key];
-      if (!existing_task) {
-        existing_task = make_scoped_refptr(
-            new ImageDecodeTaskImpl(this, key, image, tracing_info));
-      }
-      *task = existing_task;
-    } else {
-      *task = nullptr;
-    }
-    return false;
-  }
-
   base::AutoLock lock(lock_);
 
   // If we already have the image in cache, then we can return it.
@@ -289,7 +316,6 @@
   //       it yet (or failed to decode it).
   //   2b. Unlock the image but keep it in list.
   const ImageKey& key = ImageKey::FromDrawImage(image);
-  DCHECK(CanHandleImage(key)) << key.ToString();
   TRACE_EVENT1("disabled-by-default-cc.debug",
                "SoftwareImageDecodeController::UnrefImage", "key",
                key.ToString());
@@ -320,20 +346,6 @@
                                                 const DrawImage& image) {
   TRACE_EVENT1("cc", "SoftwareImageDecodeController::DecodeImage", "key",
                key.ToString());
-  if (!CanHandleImage(key)) {
-    image.image()->preroll();
-
-    base::AutoLock lock(lock_);
-    prerolled_images_.insert(key.image_id());
-    // Erase the pending task from the queue, since the task won't be doing
-    // anything useful after this function terminates. Since we don't preroll
-    // images twice, this is actually not necessary but it behaves similar to
-    // the other code path: when this function finishes, the task isn't in the
-    // pending_image_tasks_ list.
-    pending_image_tasks_.erase(key);
-    return;
-  }
-
   base::AutoLock lock(lock_);
   AutoRemoveKeyFromTaskMap remove_key_from_task_map(&pending_image_tasks_, key);
 
@@ -405,8 +417,6 @@
     case kLow_SkFilterQuality:
       return GetOriginalImageDecode(key, std::move(image));
     case kMedium_SkFilterQuality:
-      NOTIMPLEMENTED();
-      return nullptr;
     case kHigh_SkFilterQuality:
       return GetScaledImageDecode(key, std::move(image));
     default:
@@ -425,9 +435,6 @@
   if (key.target_size().IsEmpty())
     return DecodedDrawImage(nullptr, kNone_SkFilterQuality);
 
-  if (!CanHandleImage(key))
-    return DecodedDrawImage(draw_image.image(), draw_image.filter_quality());
-
   return GetDecodedImageForDrawInternal(key, draw_image);
 }
 
@@ -605,8 +612,8 @@
   }
   SkPixmap scaled_pixmap(scaled_info, scaled_pixels->data(),
                          scaled_info.minRowBytes());
-  // TODO(vmpstr): Start handling more than just high filter quality.
-  DCHECK_EQ(kHigh_SkFilterQuality, key.filter_quality());
+  DCHECK(key.filter_quality() == kHigh_SkFilterQuality ||
+         key.filter_quality() == kMedium_SkFilterQuality);
   {
     TRACE_EVENT0("disabled-by-default-cc.debug",
                  "SoftwareImageDecodeController::ScaleImage - scale pixels");
@@ -633,7 +640,7 @@
                "SoftwareImageDecodeController::DrawWithImageFinished", "key",
                ImageKey::FromDrawImage(image).ToString());
   ImageKey key = ImageKey::FromDrawImage(image);
-  if (!decoded_image.image() || !CanHandleImage(key))
+  if (!decoded_image.image())
     return;
 
   if (decoded_image.is_at_raster_decode())
@@ -700,11 +707,6 @@
   }
 }
 
-bool SoftwareImageDecodeController::CanHandleImage(const ImageKey& key) {
-  // TODO(vmpstr): Start handling medium filter quality as well.
-  return key.filter_quality() != kMedium_SkFilterQuality;
-}
-
 void SoftwareImageDecodeController::ReduceCacheUsage() {
   TRACE_EVENT0("cc", "SoftwareImageDecodeController::ReduceCacheUsage");
   base::AutoLock lock(lock_);
@@ -856,6 +858,14 @@
   if (can_use_original_decode && !target_size.IsEmpty())
     target_size = gfx::Size(image.image()->width(), image.image()->height());
 
+  if (quality == kMedium_SkFilterQuality && !target_size.IsEmpty()) {
+    SkSize mip_target_size =
+        GetMipMapScaleAdjustment(src_rect.size(), target_size);
+    DCHECK(mip_target_size.width() != -1.f && mip_target_size.height() != -1.f);
+    target_size.set_width(src_rect.width() * mip_target_size.width());
+    target_size.set_height(src_rect.height() * mip_target_size.height());
+  }
+
   return ImageDecodeControllerKey(image.image()->uniqueID(), src_rect,
                                   target_size, quality,
                                   can_use_original_decode);
diff --git a/cc/tiles/software_image_decode_controller.h b/cc/tiles/software_image_decode_controller.h
index 01a73e6..14632aa 100644
--- a/cc/tiles/software_image_decode_controller.h
+++ b/cc/tiles/software_image_decode_controller.h
@@ -231,13 +231,6 @@
   void RefAtRasterImage(const ImageKey& key);
   void UnrefAtRasterImage(const ImageKey& key);
 
-  // These functions indicate whether the images can be handled and cached by
-  // ImageDecodeController or whether they will fall through to Skia (with
-  // exception of possibly prerolling them). Over time these should return
-  // "false" in less cases, as the ImageDecodeController should start handling
-  // more of them.
-  bool CanHandleImage(const ImageKey& key);
-
   // Helper function which dumps all images in a specific ImageMRUCache.
   void DumpImageMemoryForCache(const ImageMRUCache& cache,
                                const char* cache_name,
@@ -261,11 +254,6 @@
 
   MemoryBudget locked_images_budget_;
 
-  // Note that this is used for cases where the only thing we do is preroll the
-  // image the first time we see it. This mimics the previous behavior and
-  // should over time change as the compositor starts to handle more cases.
-  std::unordered_set<uint32_t> prerolled_images_;
-
   ResourceFormat format_;
 
   // Used to uniquely identify DecodedImages for memory traces.
diff --git a/cc/tiles/software_image_decode_controller_unittest.cc b/cc/tiles/software_image_decode_controller_unittest.cc
index 68a5a4f..6a5d550 100644
--- a/cc/tiles/software_image_decode_controller_unittest.cc
+++ b/cc/tiles/software_image_decode_controller_unittest.cc
@@ -63,10 +63,10 @@
   auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(quality, key.filter_quality());
-  EXPECT_EQ(50, key.target_size().width());
-  EXPECT_EQ(150, key.target_size().height());
+  EXPECT_EQ(100, key.target_size().width());
+  EXPECT_EQ(100, key.target_size().height());
   EXPECT_FALSE(key.can_use_original_decode());
-  EXPECT_EQ(50u * 150u * 4u, key.locked_bytes());
+  EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
 }
 
 TEST(SoftwareImageDecodeControllerTest,
@@ -164,6 +164,132 @@
   EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
 }
 
+TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityAt1_5Scale) {
+  sk_sp<SkImage> image = CreateImage(500, 200);
+  bool is_decomposable = true;
+  SkFilterQuality quality = kMedium_SkFilterQuality;
+
+  DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
+                       quality,
+                       CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable));
+
+  auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
+  EXPECT_EQ(image->uniqueID(), key.image_id());
+  EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
+  EXPECT_EQ(500, key.target_size().width());
+  EXPECT_EQ(200, key.target_size().height());
+  EXPECT_TRUE(key.can_use_original_decode());
+  EXPECT_EQ(500u * 200u * 4u, key.locked_bytes());
+}
+
+TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityAt1_0cale) {
+  sk_sp<SkImage> image = CreateImage(500, 200);
+  bool is_decomposable = true;
+  SkFilterQuality quality = kMedium_SkFilterQuality;
+
+  DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
+                       quality,
+                       CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable));
+
+  auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
+  EXPECT_EQ(image->uniqueID(), key.image_id());
+  EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
+  EXPECT_EQ(500, key.target_size().width());
+  EXPECT_EQ(200, key.target_size().height());
+  EXPECT_TRUE(key.can_use_original_decode());
+  EXPECT_EQ(500u * 200u * 4u, key.locked_bytes());
+}
+
+TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityAt0_75Scale) {
+  sk_sp<SkImage> image = CreateImage(500, 200);
+  bool is_decomposable = true;
+  SkFilterQuality quality = kMedium_SkFilterQuality;
+
+  DrawImage draw_image(
+      image, SkIRect::MakeWH(image->width(), image->height()), quality,
+      CreateMatrix(SkSize::Make(0.75f, 0.75f), is_decomposable));
+
+  auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
+  EXPECT_EQ(image->uniqueID(), key.image_id());
+  EXPECT_EQ(quality, key.filter_quality());
+  EXPECT_EQ(500, key.target_size().width());
+  EXPECT_EQ(200, key.target_size().height());
+  EXPECT_FALSE(key.can_use_original_decode());
+  EXPECT_EQ(500u * 200u * 4u, key.locked_bytes());
+}
+
+TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityAt0_5Scale) {
+  sk_sp<SkImage> image = CreateImage(500, 200);
+  bool is_decomposable = true;
+  SkFilterQuality quality = kMedium_SkFilterQuality;
+
+  DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
+                       quality,
+                       CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
+
+  auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
+  EXPECT_EQ(image->uniqueID(), key.image_id());
+  EXPECT_EQ(quality, key.filter_quality());
+  EXPECT_EQ(250, key.target_size().width());
+  EXPECT_EQ(100, key.target_size().height());
+  EXPECT_FALSE(key.can_use_original_decode());
+  EXPECT_EQ(250u * 100u * 4u, key.locked_bytes());
+}
+
+TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityAt0_49Scale) {
+  sk_sp<SkImage> image = CreateImage(500, 200);
+  bool is_decomposable = true;
+  SkFilterQuality quality = kMedium_SkFilterQuality;
+
+  DrawImage draw_image(
+      image, SkIRect::MakeWH(image->width(), image->height()), quality,
+      CreateMatrix(SkSize::Make(0.49f, 0.49f), is_decomposable));
+
+  auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
+  EXPECT_EQ(image->uniqueID(), key.image_id());
+  EXPECT_EQ(quality, key.filter_quality());
+  EXPECT_EQ(250, key.target_size().width());
+  EXPECT_EQ(100, key.target_size().height());
+  EXPECT_FALSE(key.can_use_original_decode());
+  EXPECT_EQ(250u * 100u * 4u, key.locked_bytes());
+}
+
+TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityAt0_1Scale) {
+  sk_sp<SkImage> image = CreateImage(500, 200);
+  bool is_decomposable = true;
+  SkFilterQuality quality = kMedium_SkFilterQuality;
+
+  DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
+                       quality,
+                       CreateMatrix(SkSize::Make(0.1f, 0.1f), is_decomposable));
+
+  auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
+  EXPECT_EQ(image->uniqueID(), key.image_id());
+  EXPECT_EQ(quality, key.filter_quality());
+  EXPECT_EQ(62, key.target_size().width());
+  EXPECT_EQ(25, key.target_size().height());
+  EXPECT_FALSE(key.can_use_original_decode());
+  EXPECT_EQ(62u * 25u * 4u, key.locked_bytes());
+}
+
+TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityAt0_01Scale) {
+  sk_sp<SkImage> image = CreateImage(500, 200);
+  bool is_decomposable = true;
+  SkFilterQuality quality = kMedium_SkFilterQuality;
+
+  DrawImage draw_image(
+      image, SkIRect::MakeWH(image->width(), image->height()), quality,
+      CreateMatrix(SkSize::Make(0.01f, 0.01f), is_decomposable));
+
+  auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
+  EXPECT_EQ(image->uniqueID(), key.image_id());
+  EXPECT_EQ(quality, key.filter_quality());
+  EXPECT_EQ(7, key.target_size().width());
+  EXPECT_EQ(3, key.target_size().height());
+  EXPECT_FALSE(key.can_use_original_decode());
+  EXPECT_EQ(7u * 3u * 4u, key.locked_bytes());
+}
+
 TEST(SoftwareImageDecodeControllerTest, ImageKeyHighQuality) {
   sk_sp<SkImage> image = CreateImage(100, 100);
   bool is_decomposable = true;
@@ -198,10 +324,10 @@
   auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
   EXPECT_EQ(image->uniqueID(), key.image_id());
   EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality());
-  EXPECT_EQ(4100, key.target_size().width());
-  EXPECT_EQ(4096, key.target_size().height());
+  EXPECT_EQ(4555, key.target_size().width());
+  EXPECT_EQ(2048, key.target_size().height());
   EXPECT_FALSE(key.can_use_original_decode());
-  EXPECT_EQ(4100u * 4096u * 4u, key.locked_bytes());
+  EXPECT_EQ(4555u * 2048u * 4u, key.locked_bytes());
 }
 
 TEST(SoftwareImageDecodeControllerTest,
@@ -403,10 +529,7 @@
   need_unref = controller.GetTaskForImageAndRef(
       medium_quality_draw_image, ImageDecodeController::TracingInfo(),
       &medium_quality_task);
-  // Medium quality isn't handled by the controller, so it won't ref it. Note
-  // that this will change when medium quality is handled and will need to be
-  // updated.
-  EXPECT_FALSE(need_unref);
+  EXPECT_TRUE(need_unref);
   EXPECT_TRUE(medium_quality_task);
   EXPECT_TRUE(high_quality_task.get() != medium_quality_task.get());
 
@@ -424,6 +547,7 @@
   EXPECT_TRUE(medium_quality_task.get() != low_quality_task.get());
 
   controller.UnrefImage(high_quality_draw_image);
+  controller.UnrefImage(medium_quality_draw_image);
   controller.UnrefImage(low_quality_draw_image);
 }
 
@@ -1026,5 +1150,289 @@
   controller.DrawWithImageFinished(draw_image, decoded_draw_image);
   controller.UnrefImage(draw_image);
 }
+
+TEST(SoftwareImageDecodeControllerTest, MediumQualityAt01_5ScaleIsHandled) {
+  SoftwareImageDecodeController controller;
+  bool is_decomposable = true;
+  SkFilterQuality quality = kMedium_SkFilterQuality;
+
+  sk_sp<SkImage> image = CreateImage(500, 200);
+  DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
+                       quality,
+                       CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable));
+
+  scoped_refptr<TileTask> task;
+  bool need_unref = controller.GetTaskForImageAndRef(
+      draw_image, ImageDecodeController::TracingInfo(), &task);
+  EXPECT_TRUE(task);
+  EXPECT_TRUE(need_unref);
+
+  DecodedDrawImage decoded_draw_image =
+      controller.GetDecodedImageForDraw(draw_image);
+  EXPECT_TRUE(decoded_draw_image.image());
+  // If we decoded the image and cached it, it would be stored in a different
+  // SkImageObject.
+  EXPECT_TRUE(decoded_draw_image.image() != image);
+  EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
+  EXPECT_EQ(500, decoded_draw_image.image()->width());
+  EXPECT_EQ(200, decoded_draw_image.image()->height());
+
+  controller.DrawWithImageFinished(draw_image, decoded_draw_image);
+  controller.UnrefImage(draw_image);
+}
+
+TEST(SoftwareImageDecodeControllerTest, MediumQualityAt1_0ScaleIsHandled) {
+  SoftwareImageDecodeController controller;
+  bool is_decomposable = true;
+  SkFilterQuality quality = kMedium_SkFilterQuality;
+
+  sk_sp<SkImage> image = CreateImage(500, 200);
+  DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
+                       quality,
+                       CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable));
+
+  scoped_refptr<TileTask> task;
+  bool need_unref = controller.GetTaskForImageAndRef(
+      draw_image, ImageDecodeController::TracingInfo(), &task);
+  EXPECT_TRUE(task);
+  EXPECT_TRUE(need_unref);
+
+  DecodedDrawImage decoded_draw_image =
+      controller.GetDecodedImageForDraw(draw_image);
+  EXPECT_TRUE(decoded_draw_image.image());
+  // If we decoded the image and cached it, it would be stored in a different
+  // SkImageObject.
+  EXPECT_TRUE(decoded_draw_image.image() != image);
+  EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
+  EXPECT_EQ(500, decoded_draw_image.image()->width());
+  EXPECT_EQ(200, decoded_draw_image.image()->height());
+
+  controller.DrawWithImageFinished(draw_image, decoded_draw_image);
+  controller.UnrefImage(draw_image);
+}
+
+TEST(SoftwareImageDecodeControllerTest, MediumQualityAt0_75ScaleIsHandled) {
+  SoftwareImageDecodeController controller;
+  bool is_decomposable = true;
+  SkFilterQuality quality = kMedium_SkFilterQuality;
+
+  sk_sp<SkImage> image = CreateImage(500, 200);
+  DrawImage draw_image(
+      image, SkIRect::MakeWH(image->width(), image->height()), quality,
+      CreateMatrix(SkSize::Make(0.75f, 0.75f), is_decomposable));
+
+  scoped_refptr<TileTask> task;
+  bool need_unref = controller.GetTaskForImageAndRef(
+      draw_image, ImageDecodeController::TracingInfo(), &task);
+  EXPECT_TRUE(task);
+  EXPECT_TRUE(need_unref);
+
+  DecodedDrawImage decoded_draw_image =
+      controller.GetDecodedImageForDraw(draw_image);
+  EXPECT_TRUE(decoded_draw_image.image());
+  // If we decoded the image and cached it, it would be stored in a different
+  // SkImageObject.
+  EXPECT_TRUE(decoded_draw_image.image() != image);
+  EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
+  EXPECT_EQ(500, decoded_draw_image.image()->width());
+  EXPECT_EQ(200, decoded_draw_image.image()->height());
+
+  controller.DrawWithImageFinished(draw_image, decoded_draw_image);
+  controller.UnrefImage(draw_image);
+}
+
+TEST(SoftwareImageDecodeControllerTest, MediumQualityAt0_5ScaleIsHandled) {
+  SoftwareImageDecodeController controller;
+  bool is_decomposable = true;
+  SkFilterQuality quality = kMedium_SkFilterQuality;
+
+  sk_sp<SkImage> image = CreateImage(500, 200);
+  DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
+                       quality,
+                       CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
+
+  scoped_refptr<TileTask> task;
+  bool need_unref = controller.GetTaskForImageAndRef(
+      draw_image, ImageDecodeController::TracingInfo(), &task);
+  EXPECT_TRUE(task);
+  EXPECT_TRUE(need_unref);
+
+  DecodedDrawImage decoded_draw_image =
+      controller.GetDecodedImageForDraw(draw_image);
+  EXPECT_TRUE(decoded_draw_image.image());
+  // If we decoded the image and cached it, it would be stored in a different
+  // SkImageObject.
+  EXPECT_TRUE(decoded_draw_image.image() != image);
+  EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
+  EXPECT_EQ(250, decoded_draw_image.image()->width());
+  EXPECT_EQ(100, decoded_draw_image.image()->height());
+
+  controller.DrawWithImageFinished(draw_image, decoded_draw_image);
+  controller.UnrefImage(draw_image);
+}
+
+TEST(SoftwareImageDecodeControllerTest, MediumQualityAt0_49ScaleIsHandled) {
+  SoftwareImageDecodeController controller;
+  bool is_decomposable = true;
+  SkFilterQuality quality = kMedium_SkFilterQuality;
+
+  sk_sp<SkImage> image = CreateImage(500, 200);
+  DrawImage draw_image(
+      image, SkIRect::MakeWH(image->width(), image->height()), quality,
+      CreateMatrix(SkSize::Make(0.49f, 0.49f), is_decomposable));
+
+  scoped_refptr<TileTask> task;
+  bool need_unref = controller.GetTaskForImageAndRef(
+      draw_image, ImageDecodeController::TracingInfo(), &task);
+  EXPECT_TRUE(task);
+  EXPECT_TRUE(need_unref);
+
+  DecodedDrawImage decoded_draw_image =
+      controller.GetDecodedImageForDraw(draw_image);
+  EXPECT_TRUE(decoded_draw_image.image());
+  // If we decoded the image and cached it, it would be stored in a different
+  // SkImageObject.
+  EXPECT_TRUE(decoded_draw_image.image() != image);
+  EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
+  EXPECT_EQ(250, decoded_draw_image.image()->width());
+  EXPECT_EQ(100, decoded_draw_image.image()->height());
+
+  controller.DrawWithImageFinished(draw_image, decoded_draw_image);
+  controller.UnrefImage(draw_image);
+}
+
+TEST(SoftwareImageDecodeControllerTest, MediumQualityAt0_1ScaleIsHandled) {
+  SoftwareImageDecodeController controller;
+  bool is_decomposable = true;
+  SkFilterQuality quality = kMedium_SkFilterQuality;
+
+  sk_sp<SkImage> image = CreateImage(500, 200);
+  DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
+                       quality,
+                       CreateMatrix(SkSize::Make(0.1f, 0.1f), is_decomposable));
+
+  scoped_refptr<TileTask> task;
+  bool need_unref = controller.GetTaskForImageAndRef(
+      draw_image, ImageDecodeController::TracingInfo(), &task);
+  EXPECT_TRUE(task);
+  EXPECT_TRUE(need_unref);
+
+  DecodedDrawImage decoded_draw_image =
+      controller.GetDecodedImageForDraw(draw_image);
+  EXPECT_TRUE(decoded_draw_image.image());
+  // If we decoded the image and cached it, it would be stored in a different
+  // SkImageObject.
+  EXPECT_TRUE(decoded_draw_image.image() != image);
+  EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
+  EXPECT_EQ(62, decoded_draw_image.image()->width());
+  EXPECT_EQ(25, decoded_draw_image.image()->height());
+
+  controller.DrawWithImageFinished(draw_image, decoded_draw_image);
+  controller.UnrefImage(draw_image);
+}
+
+TEST(SoftwareImageDecodeControllerTest, MediumQualityAt0_01ScaleIsHandled) {
+  SoftwareImageDecodeController controller;
+  bool is_decomposable = true;
+  SkFilterQuality quality = kMedium_SkFilterQuality;
+
+  sk_sp<SkImage> image = CreateImage(500, 200);
+  DrawImage draw_image(
+      image, SkIRect::MakeWH(image->width(), image->height()), quality,
+      CreateMatrix(SkSize::Make(0.01f, 0.01f), is_decomposable));
+
+  scoped_refptr<TileTask> task;
+  bool need_unref = controller.GetTaskForImageAndRef(
+      draw_image, ImageDecodeController::TracingInfo(), &task);
+  EXPECT_TRUE(task);
+  EXPECT_TRUE(need_unref);
+
+  DecodedDrawImage decoded_draw_image =
+      controller.GetDecodedImageForDraw(draw_image);
+  EXPECT_TRUE(decoded_draw_image.image());
+  // If we decoded the image and cached it, it would be stored in a different
+  // SkImageObject.
+  EXPECT_TRUE(decoded_draw_image.image() != image);
+  EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
+  EXPECT_EQ(7, decoded_draw_image.image()->width());
+  EXPECT_EQ(3, decoded_draw_image.image()->height());
+
+  controller.DrawWithImageFinished(draw_image, decoded_draw_image);
+  controller.UnrefImage(draw_image);
+}
+
+TEST(SoftwareImageDecodeControllerTest, MediumQualityAt0_001ScaleIsHandled) {
+  SoftwareImageDecodeController controller;
+  bool is_decomposable = true;
+  SkFilterQuality quality = kMedium_SkFilterQuality;
+
+  sk_sp<SkImage> image = CreateImage(500, 200);
+  DrawImage draw_image(
+      image, SkIRect::MakeWH(image->width(), image->height()), quality,
+      CreateMatrix(SkSize::Make(0.001f, 0.001f), is_decomposable));
+
+  scoped_refptr<TileTask> task;
+  bool need_unref = controller.GetTaskForImageAndRef(
+      draw_image, ImageDecodeController::TracingInfo(), &task);
+  EXPECT_FALSE(task);
+  EXPECT_FALSE(need_unref);
+
+  DecodedDrawImage decoded_draw_image =
+      controller.GetDecodedImageForDraw(draw_image);
+  EXPECT_FALSE(decoded_draw_image.image());
+
+  controller.DrawWithImageFinished(draw_image, decoded_draw_image);
+}
+
+TEST(SoftwareImageDecodeControllerTest,
+     MediumQualityImagesAreTheSameAt0_5And0_49Scale) {
+  SoftwareImageDecodeController controller;
+  bool is_decomposable = true;
+  SkFilterQuality quality = kMedium_SkFilterQuality;
+
+  sk_sp<SkImage> image = CreateImage(500, 200);
+  DrawImage draw_image_50(
+      image, SkIRect::MakeWH(image->width(), image->height()), quality,
+      CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
+  DrawImage draw_image_49(
+      image, SkIRect::MakeWH(image->width(), image->height()), quality,
+      CreateMatrix(SkSize::Make(0.49f, 0.49f), is_decomposable));
+
+  scoped_refptr<TileTask> task_50;
+  bool need_unref_50 = controller.GetTaskForImageAndRef(
+      draw_image_50, ImageDecodeController::TracingInfo(), &task_50);
+  EXPECT_TRUE(task_50);
+  EXPECT_TRUE(need_unref_50);
+  scoped_refptr<TileTask> task_49;
+  bool need_unref_49 = controller.GetTaskForImageAndRef(
+      draw_image_49, ImageDecodeController::TracingInfo(), &task_49);
+  EXPECT_TRUE(task_49);
+  EXPECT_TRUE(need_unref_49);
+
+  DecodedDrawImage decoded_draw_image_50 =
+      controller.GetDecodedImageForDraw(draw_image_50);
+  EXPECT_TRUE(decoded_draw_image_50.image());
+  DecodedDrawImage decoded_draw_image_49 =
+      controller.GetDecodedImageForDraw(draw_image_49);
+  EXPECT_TRUE(decoded_draw_image_49.image());
+  // If we decoded the image and cached it, it would be stored in a different
+  // SkImageObject.
+  EXPECT_TRUE(decoded_draw_image_50.image() != image);
+  EXPECT_TRUE(decoded_draw_image_49.image() != image);
+  EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image_50.filter_quality());
+  EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image_49.filter_quality());
+  EXPECT_EQ(250, decoded_draw_image_50.image()->width());
+  EXPECT_EQ(250, decoded_draw_image_49.image()->width());
+  EXPECT_EQ(100, decoded_draw_image_50.image()->height());
+  EXPECT_EQ(100, decoded_draw_image_49.image()->height());
+
+  EXPECT_EQ(decoded_draw_image_50.image(), decoded_draw_image_49.image());
+
+  controller.DrawWithImageFinished(draw_image_50, decoded_draw_image_50);
+  controller.UnrefImage(draw_image_50);
+  controller.DrawWithImageFinished(draw_image_49, decoded_draw_image_49);
+  controller.UnrefImage(draw_image_49);
+}
+
 }  // namespace
 }  // namespace cc
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
index 3ce24d90..58fc640 100644
--- a/cc/tiles/tile_manager.cc
+++ b/cc/tiles/tile_manager.cc
@@ -58,8 +58,9 @@
                  uint64_t resource_content_id,
                  int source_frame_number,
                  const base::Callback<void(bool)>& reply,
-                 TileTask::Vector* dependencies)
-      : TileTask(true, dependencies),
+                 TileTask::Vector* dependencies,
+                 bool supports_concurrent_execution)
+      : TileTask(supports_concurrent_execution, dependencies),
         resource_(resource),
         raster_source_(std::move(raster_source)),
         content_rect_(content_rect),
@@ -131,6 +132,31 @@
   DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl);
 };
 
+TaskCategory TaskCategoryForTileTask(TileTask* task,
+                                     bool use_foreground_category) {
+  if (!task->supports_concurrent_execution())
+    return TASK_CATEGORY_NONCONCURRENT_FOREGROUND;
+
+  if (use_foreground_category)
+    return TASK_CATEGORY_FOREGROUND;
+
+  return TASK_CATEGORY_BACKGROUND;
+}
+
+bool IsForegroundCategory(uint16_t category) {
+  TaskCategory enum_category = static_cast<TaskCategory>(category);
+  switch (enum_category) {
+    case TASK_CATEGORY_NONCONCURRENT_FOREGROUND:
+    case TASK_CATEGORY_FOREGROUND:
+      return true;
+    case TASK_CATEGORY_BACKGROUND:
+      return false;
+  }
+
+  DCHECK(false);
+  return false;
+}
+
 // Task priorities that make sure that the task set done tasks run before any
 // other remaining tasks.
 const size_t kRequiredForActivationDoneTaskPriority = 1u;
@@ -156,21 +182,21 @@
 
 void InsertNodeForDecodeTask(TaskGraph* graph,
                              TileTask* task,
-                             uint16_t category,
+                             bool use_foreground_category,
                              uint16_t priority) {
   uint32_t dependency_count = 0u;
   if (task->dependencies().size()) {
     DCHECK_EQ(task->dependencies().size(), 1u);
     auto* dependency = task->dependencies()[0].get();
     if (!dependency->HasCompleted()) {
-      InsertNodeForDecodeTask(graph, dependency, category, priority);
+      InsertNodeForDecodeTask(graph, dependency, use_foreground_category,
+                              priority);
       graph->edges.push_back(TaskGraph::Edge(dependency, task));
       dependency_count = 1u;
     }
   }
-  InsertNodeForTask(graph, task, task->supports_concurrent_execution()
-                                     ? category
-                                     : TASK_CATEGORY_NONCONCURRENT_FOREGROUND,
+  InsertNodeForTask(graph, task,
+                    TaskCategoryForTileTask(task, use_foreground_category),
                     priority, dependency_count);
 }
 
@@ -178,27 +204,9 @@
                               TileTask* raster_task,
                               const TileTask::Vector& decode_tasks,
                               size_t priority,
-                              bool use_gpu_rasterization,
-                              bool high_priority) {
+                              bool use_foreground_category) {
   size_t dependencies = 0u;
 
-  // Determine the TaskCategory for raster tasks - if a task uses GPU, it
-  // cannot run concurrently and is assigned
-  // TASK_CATEGORY_NONCONCURRENT_FOREGROUND, regardless of its priority.
-  // Otherwise its category is based on its priority.
-  TaskCategory raster_task_category;
-  if (use_gpu_rasterization) {
-    raster_task_category = TASK_CATEGORY_NONCONCURRENT_FOREGROUND;
-  } else {
-    raster_task_category =
-        high_priority ? TASK_CATEGORY_FOREGROUND : TASK_CATEGORY_BACKGROUND;
-  }
-
-  // Determine the TaskCategory for decode tasks. This category is based on
-  // the priority of the raster task which depends on it.
-  TaskCategory decode_task_category =
-      high_priority ? TASK_CATEGORY_FOREGROUND : TASK_CATEGORY_BACKGROUND;
-
   // Insert image decode tasks.
   for (TileTask::Vector::const_iterator it = decode_tasks.begin();
        it != decode_tasks.end(); ++it) {
@@ -217,26 +225,30 @@
                        return node.task == decode_task;
                      });
 
-    // In rare circumstances, a low priority task may come in before a high
-    // priority task. In these cases, upgrade any low-priority dependencies of
-    // the current task.
+    // In rare circumstances, a background category task may come in before a
+    // foreground category task. In these cases, upgrade any background category
+    // dependencies of the current task.
     // TODO(ericrk): Task iterators should be updated to avoid this.
     // crbug.com/594851
-    if (decode_it != graph->nodes.end() && high_priority &&
-        decode_it->category != decode_task_category) {
-      decode_it->category = decode_task_category;
+    // TODO(ericrk): This should handle dependencies recursively.
+    // crbug.com/605234
+    if (decode_it != graph->nodes.end() && use_foreground_category &&
+        !IsForegroundCategory(decode_it->category)) {
+      decode_it->category = TASK_CATEGORY_FOREGROUND;
     }
 
     if (decode_it == graph->nodes.end()) {
-      InsertNodeForDecodeTask(graph, decode_task, decode_task_category,
+      InsertNodeForDecodeTask(graph, decode_task, use_foreground_category,
                               priority);
     }
 
     graph->edges.push_back(TaskGraph::Edge(decode_task, raster_task));
   }
 
-  InsertNodeForTask(graph, raster_task, raster_task_category, priority,
-                    dependencies);
+  InsertNodeForTask(
+      graph, raster_task,
+      TaskCategoryForTileTask(raster_task, use_foreground_category), priority,
+      dependencies);
 }
 
 class TaskSetFinishedTaskImpl : public TileTask {
@@ -798,19 +810,19 @@
     all_count++;
     graph_.edges.push_back(TaskGraph::Edge(task, all_done_task.get()));
 
-    // A tile is high priority if it is either blocking future compositing
-    // (required for draw or required for activation), or if it has a priority
-    // bin of NOW for another reason (low resolution tiles).
-    bool high_priority =
+    // A tile should use a foreground task cateogry if it is either blocking
+    // future compositing (required for draw or required for activation), or if
+    // it has a priority bin of NOW for another reason (low resolution tiles).
+    bool use_foreground_category =
         tile->required_for_draw() || tile->required_for_activation() ||
         prioritized_tile.priority().priority_bin == TilePriority::NOW;
     InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++,
-                             use_gpu_rasterization_, high_priority);
+                             use_foreground_category);
   }
 
   // Insert nodes for our task completion tasks. We enqueue these using
-  // NONCONCURRENT_FOREGROUND priority as this is the highest prioirty and we'd
-  // like to run these tasks as soon as possible.
+  // NONCONCURRENT_FOREGROUND category this is the highest prioirty category and
+  // we'd like to run these tasks as soon as possible.
   InsertNodeForTask(&graph_, required_for_activation_done_task.get(),
                     TASK_CATEGORY_NONCONCURRENT_FOREGROUND,
                     kRequiredForActivationDoneTaskPriority,
@@ -902,6 +914,7 @@
       it = images.erase(it);
   }
 
+  bool supports_concurrent_execution = !use_gpu_rasterization_;
   return make_scoped_refptr(new RasterTaskImpl(
       resource, prioritized_tile.raster_source(), tile->content_rect(),
       tile->invalidated_content_rect(), tile->contents_scale(),
@@ -911,7 +924,7 @@
       tile->source_frame_number(),
       base::Bind(&TileManager::OnRasterTaskCompleted, base::Unretained(this),
                  tile->id(), resource),
-      &decode_tasks));
+      &decode_tasks, supports_concurrent_execution));
 }
 
 void TileManager::OnRasterTaskCompleted(
diff --git a/cc/trees/damage_tracker.cc b/cc/trees/damage_tracker.cc
index 7b14d18..6a8891bf 100644
--- a/cc/trees/damage_tracker.cc
+++ b/cc/trees/damage_tracker.cc
@@ -335,32 +335,31 @@
       gfx::ToEnclosingRect(render_surface->DrawableContentRect());
   data.Update(surface_rect_in_target_space, mailboxId_);
 
-  gfx::Rect damage_rect_in_local_space;
   if (surface_is_new || render_surface->SurfacePropertyChanged()) {
     // The entire surface contributes damage.
-    damage_rect_in_local_space = render_surface->content_rect();
+    target_damage_rect->Union(surface_rect_in_target_space);
 
     // The surface's old region is now exposed on the target surface, too.
     target_damage_rect->Union(old_surface_rect);
   } else {
     // Only the surface's damage_rect will damage the target surface.
-    damage_rect_in_local_space =
+    gfx::Rect damage_rect_in_local_space =
         render_surface->damage_tracker()->current_damage_rect();
-  }
 
-  // If there was damage, transform it to target space, and possibly contribute
-  // its reflection if needed.
-  if (!damage_rect_in_local_space.IsEmpty()) {
-    const gfx::Transform& draw_transform = render_surface->draw_transform();
-    gfx::Rect damage_rect_in_target_space = MathUtil::MapEnclosingClippedRect(
-        draw_transform, damage_rect_in_local_space);
-    target_damage_rect->Union(damage_rect_in_target_space);
+    // If there was damage, transform it to target space, and possibly
+    // contribute its reflection if needed.
+    if (!damage_rect_in_local_space.IsEmpty()) {
+      const gfx::Transform& draw_transform = render_surface->draw_transform();
+      gfx::Rect damage_rect_in_target_space = MathUtil::MapEnclosingClippedRect(
+          draw_transform, damage_rect_in_local_space);
+      target_damage_rect->Union(damage_rect_in_target_space);
 
-    if (layer->replica_layer()) {
-      const gfx::Transform& replica_draw_transform =
-          render_surface->replica_draw_transform();
-      target_damage_rect->Union(MathUtil::MapEnclosingClippedRect(
-          replica_draw_transform, damage_rect_in_local_space));
+      if (layer->replica_layer()) {
+        const gfx::Transform& replica_draw_transform =
+            render_surface->replica_draw_transform();
+        target_damage_rect->Union(MathUtil::MapEnclosingClippedRect(
+            replica_draw_transform, damage_rect_in_local_space));
+      }
     }
   }
 
diff --git a/cc/trees/damage_tracker_unittest.cc b/cc/trees/damage_tracker_unittest.cc
index d9f58158..f907bb7 100644
--- a/cc/trees/damage_tracker_unittest.cc
+++ b/cc/trees/damage_tracker_unittest.cc
@@ -576,13 +576,14 @@
           root->render_surface()->damage_tracker()->current_damage_rect();
   child_damage_rect =
           child->render_surface()->damage_tracker()->current_damage_rect();
-  EXPECT_EQ(gfx::Rect(100, 100, 30, 30).ToString(),
-            root_damage_rect.ToString());
+  EXPECT_EQ(gfx::Rect(100 - outset_left, 100 - outset_top,
+                      30 + outset_left + outset_right,
+                      30 + outset_top + outset_bottom),
+            root_damage_rect);
   EXPECT_EQ(
       gfx::Rect(-outset_left, -outset_top, 30 + (outset_left + outset_right),
-                30 + (outset_top + outset_bottom))
-          .ToString(),
-      child_damage_rect.ToString());
+                30 + (outset_top + outset_bottom)),
+      child_damage_rect);
 
   // CASE 1: Setting the update rect should damage the whole surface (for now)
   ClearDamageForAllSurfaces(root);
@@ -598,12 +599,70 @@
   int expect_width = 1 + outset_left + outset_right;
   int expect_height = 1 + outset_top + outset_bottom;
   EXPECT_EQ(gfx::Rect(100 - outset_left, 100 - outset_top, expect_width,
-                      expect_height)
-                .ToString(),
-            root_damage_rect.ToString());
-  EXPECT_EQ(gfx::Rect(-outset_left, -outset_top, expect_width, expect_height)
-                .ToString(),
-            child_damage_rect.ToString());
+                      expect_height),
+            root_damage_rect);
+  EXPECT_EQ(gfx::Rect(-outset_left, -outset_top, expect_width, expect_height),
+            child_damage_rect);
+}
+
+TEST_F(DamageTrackerTest, VerifyDamageForTransformedImageFilter) {
+  LayerImpl* root = CreateAndSetUpTestTreeWithOneSurface();
+  LayerImpl* child = root->children()[0];
+  gfx::Rect root_damage_rect, child_damage_rect;
+
+  // Allow us to set damage on child too.
+  child->SetDrawsContent(true);
+
+  FilterOperations filters;
+  filters.Append(FilterOperation::CreateReferenceFilter(
+      SkBlurImageFilter::Make(2, 2, nullptr)));
+  int outset_top, outset_right, outset_bottom, outset_left;
+  filters.GetOutsets(&outset_top, &outset_right, &outset_bottom, &outset_left);
+
+  // Setting the filter will damage the whole surface.
+  gfx::Transform transform;
+  transform.RotateAboutYAxis(60);
+  ClearDamageForAllSurfaces(root);
+  child->test_properties()->force_render_surface = true;
+  child->SetTransform(transform);
+  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  EmulateDrawingOneFrame(root);
+  child->OnFilterAnimated(filters);
+  EmulateDrawingOneFrame(root);
+  root_damage_rect =
+      root->render_surface()->damage_tracker()->current_damage_rect();
+  child_damage_rect =
+      child->render_surface()->damage_tracker()->current_damage_rect();
+  int rotated_outset_left = outset_left / 2;
+  int expected_rotated_width = (30 + outset_left + outset_right) / 2;
+  gfx::Rect expected_root_damage(100 - rotated_outset_left, 100 - outset_top,
+                                 expected_rotated_width,
+                                 30 + outset_top + outset_bottom);
+  expected_root_damage.Union(gfx::Rect(100, 100, 30, 30));
+  EXPECT_EQ(expected_root_damage, root_damage_rect);
+  EXPECT_EQ(
+      gfx::Rect(-outset_left, -outset_top, 30 + (outset_left + outset_right),
+                30 + (outset_top + outset_bottom)),
+      child_damage_rect);
+
+  // Setting the update rect should damage the whole surface (for now)
+  ClearDamageForAllSurfaces(root);
+  child->SetUpdateRect(gfx::Rect(30, 30));
+  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  EmulateDrawingOneFrame(root);
+
+  root_damage_rect =
+      root->render_surface()->damage_tracker()->current_damage_rect();
+  child_damage_rect =
+      child->render_surface()->damage_tracker()->current_damage_rect();
+
+  int expect_width = 30 + outset_left + outset_right;
+  int expect_height = 30 + outset_top + outset_bottom;
+  EXPECT_EQ(gfx::Rect(100 - outset_left / 2, 100 - outset_top, expect_width / 2,
+                      expect_height),
+            root_damage_rect);
+  EXPECT_EQ(gfx::Rect(-outset_left, -outset_top, expect_width, expect_height),
+            child_damage_rect);
 }
 
 TEST_F(DamageTrackerTest, VerifyDamageForBackgroundBlurredChild) {
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc
index 55c2f45..5a682de 100644
--- a/cc/trees/layer_tree_host_common.cc
+++ b/cc/trees/layer_tree_host_common.cc
@@ -188,7 +188,6 @@
   top_controls_delta = proto.top_controls_delta();
 }
 
-
 static inline void SetMaskLayersAreDrawnRenderSurfaceLayerListMembers(
     LayerImpl* layer) {
   if (layer->mask_layer())
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 27d28a3..17a3e61 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -2273,6 +2273,10 @@
     output_surface_->DetachFromClient();
     output_surface_ = nullptr;
   }
+
+  // We don't know if the next OutputSurface will support GPU rasterization.
+  // Make sure to clear the flag so that we force a re-computation.
+  use_gpu_rasterization_ = false;
 }
 
 bool LayerTreeHostImpl::InitializeRenderer(OutputSurface* output_surface) {
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index d96a01c..4acad4d 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -10684,5 +10684,31 @@
   }
 }
 
+// Checks that if we lose a GPU raster enabled OutputSurface and replace it
+// with a software OutputSurface, LayerTreeHostImpl correctly re-computes GPU
+// rasterization status.
+TEST_F(LayerTreeHostImplTest, RecomputeGpuRasterOnOutputSurfaceChange) {
+  LayerTreeSettings settings = DefaultSettings();
+  settings.gpu_rasterization_forced = true;
+
+  host_impl_ = LayerTreeHostImpl::Create(
+      settings, this, &task_runner_provider_, &stats_instrumentation_,
+      &shared_bitmap_manager_, &gpu_memory_buffer_manager_, &task_graph_runner_,
+      0);
+  host_impl_->SetVisible(true);
+
+  // InitializeRenderer with a gpu-raster enabled output surface.
+  auto gpu_raster_output_surface =
+      FakeOutputSurface::Create3d(TestWebGraphicsContext3D::Create());
+  host_impl_->InitializeRenderer(gpu_raster_output_surface.get());
+  EXPECT_TRUE(host_impl_->use_gpu_rasterization());
+
+  // Re-initialize with a software output surface.
+  output_surface_ = FakeOutputSurface::CreateSoftware(
+      base::WrapUnique(new SoftwareOutputDevice));
+  host_impl_->InitializeRenderer(output_surface_.get());
+  EXPECT_FALSE(host_impl_->use_gpu_rasterization());
+}
+
 }  // namespace
 }  // namespace cc
diff --git a/cc/trees/layer_tree_host_pixeltest_filters.cc b/cc/trees/layer_tree_host_pixeltest_filters.cc
index 135c4fd..14ba6adc 100644
--- a/cc/trees/layer_tree_host_pixeltest_filters.cc
+++ b/cc/trees/layer_tree_host_pixeltest_filters.cc
@@ -477,6 +477,97 @@
       base::FilePath(FILE_PATH_LITERAL("scaled_render_surface_layer_sw.png")));
 }
 
+class RotatedFilterTest : public LayerTreeHostFiltersPixelTest {
+ protected:
+  void RunPixelTestType(PixelTestType test_type, base::FilePath image_name) {
+    scoped_refptr<SolidColorLayer> background =
+        CreateSolidColorLayer(gfx::Rect(300, 300), SK_ColorWHITE);
+
+    gfx::Rect rect(50, 50, 100, 100);
+
+    scoped_refptr<SolidColorLayer> child =
+        CreateSolidColorLayer(rect, SK_ColorBLUE);
+
+    gfx::Transform transform;
+    transform.Translate(50.0f, 50.0f);
+    transform.RotateAboutZAxis(1.0);
+    transform.Translate(-50.0f, -50.0f);
+    child->SetTransform(transform);
+    FilterOperations filters;
+    // We need a clamping brightness filter here to force the Skia filter path.
+    filters.Append(FilterOperation::CreateBrightnessFilter(1.1f));
+    filters.Append(FilterOperation::CreateGrayscaleFilter(1.0f));
+    child->SetFilters(filters);
+
+    background->AddChild(child);
+
+#if defined(OS_WIN)
+    // Windows has 1 pixel off by 1: crbug.com/259915
+    float percentage_pixels_large_error = 0.00111112f;  // 1px / (300*300)
+    float percentage_pixels_small_error = 0.0f;
+    float average_error_allowed_in_bad_pixels = 1.f;
+    int large_error_allowed = 1;
+    int small_error_allowed = 0;
+    pixel_comparator_.reset(new FuzzyPixelComparator(
+        true,  // discard_alpha
+        percentage_pixels_large_error, percentage_pixels_small_error,
+        average_error_allowed_in_bad_pixels, large_error_allowed,
+        small_error_allowed));
+#endif
+
+    RunPixelTest(test_type, background, image_name);
+  }
+};
+
+TEST_F(RotatedFilterTest, RotatedFilterTest_GL) {
+  RunPixelTestType(PIXEL_TEST_GL,
+                   base::FilePath(FILE_PATH_LITERAL("rotated_filter_gl.png")));
+}
+
+TEST_F(RotatedFilterTest, RotatedFilterTest_Software) {
+  RunPixelTestType(PIXEL_TEST_SOFTWARE,
+                   base::FilePath(FILE_PATH_LITERAL("rotated_filter_sw.png")));
+}
+
+class RotatedDropShadowFilterTest : public LayerTreeHostFiltersPixelTest {
+ protected:
+  void RunPixelTestType(PixelTestType test_type, base::FilePath image_name) {
+    scoped_refptr<SolidColorLayer> background =
+        CreateSolidColorLayer(gfx::Rect(300, 300), SK_ColorWHITE);
+
+    gfx::Rect rect(50, 50, 100, 100);
+
+    scoped_refptr<SolidColorLayer> child =
+        CreateSolidColorLayer(rect, SK_ColorBLUE);
+
+    gfx::Transform transform;
+    transform.Translate(50.0f, 50.0f);
+    transform.RotateAboutZAxis(1.0);
+    transform.Translate(-50.0f, -50.0f);
+    child->SetTransform(transform);
+    FilterOperations filters;
+    filters.Append(FilterOperation::CreateDropShadowFilter(
+        gfx::Point(10.0f, 10.0f), 0.0f, SK_ColorBLACK));
+    child->SetFilters(filters);
+
+    background->AddChild(child);
+
+    RunPixelTest(test_type, background, image_name);
+  }
+};
+
+TEST_F(RotatedDropShadowFilterTest, RotatedDropShadowFilterTest_GL) {
+  RunPixelTestType(
+      PIXEL_TEST_GL,
+      base::FilePath(FILE_PATH_LITERAL("rotated_drop_shadow_filter_gl.png")));
+}
+
+TEST_F(RotatedDropShadowFilterTest, RotatedDropShadowFilterTest_Software) {
+  RunPixelTestType(
+      PIXEL_TEST_SOFTWARE,
+      base::FilePath(FILE_PATH_LITERAL("rotated_drop_shadow_filter_sw.png")));
+}
+
 class EnlargedTextureWithAlphaThresholdFilter
     : public LayerTreeHostFiltersPixelTest {
  protected:
diff --git a/cc/trees/property_tree.h b/cc/trees/property_tree.h
index 072e6ec7..8b94fe9 100644
--- a/cc/trees/property_tree.h
+++ b/cc/trees/property_tree.h
@@ -323,7 +323,7 @@
 class CC_EXPORT PropertyTree {
  public:
   PropertyTree();
-  virtual ~PropertyTree();
+  ~PropertyTree();
 
   bool operator==(const PropertyTree<T>& other) const;
 
@@ -348,7 +348,7 @@
     return size() ? &nodes_[nodes_.size() - 1] : nullptr;
   }
 
-  virtual void clear();
+  void clear();
   size_t size() const { return nodes_.size(); }
 
   void set_needs_update(bool needs_update) { needs_update_ = needs_update; }
@@ -379,11 +379,11 @@
  public:
   TransformTree();
   TransformTree(const TransformTree& other);
-  ~TransformTree() override;
+  ~TransformTree();
 
   bool operator==(const TransformTree& other) const;
 
-  void clear() override;
+  void clear();
 
   // Computes the change of basis transform from node |source_id| to |dest_id|.
   // The function returns false iff the inverse of a singular transform was
@@ -571,7 +571,7 @@
  public:
   ScrollTree();
   ScrollTree(const ScrollTree& other);
-  ~ScrollTree() override;
+  ~ScrollTree();
 
   ScrollTree& operator=(const ScrollTree& from);
   bool operator==(const ScrollTree& other) const;
@@ -579,7 +579,7 @@
   void ToProtobuf(proto::PropertyTree* proto) const;
   void FromProtobuf(const proto::PropertyTree& proto);
 
-  void clear() override;
+  void clear();
 
   typedef std::unordered_map<int, scoped_refptr<SyncedScrollOffset>>
       ScrollOffsetMap;
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc
index 1c4c772..4027cff 100644
--- a/cc/trees/property_tree_builder.cc
+++ b/cc/trees/property_tree_builder.cc
@@ -106,16 +106,6 @@
   return !layer->parent();
 }
 
-static bool HasInvertibleOrAnimatedTransform(Layer* layer) {
-  return layer->transform_is_invertible() ||
-         layer->HasPotentiallyRunningTransformAnimation();
-}
-
-static bool HasInvertibleOrAnimatedTransformForTesting(LayerImpl* layer) {
-  return layer->transform().IsInvertible() ||
-         layer->HasPotentiallyRunningTransformAnimation();
-}
-
 static bool IsMetaInformationRecomputationNeeded(Layer* layer) {
   return layer->layer_tree_host()->needs_meta_info_recomputation();
 }
@@ -133,12 +123,6 @@
   if (layer->clip_parent())
     recursive_data->num_unclipped_descendants++;
 
-  if (!HasInvertibleOrAnimatedTransform(layer)) {
-    // Layers with singular transforms should not be drawn, the whole subtree
-    // can be skipped.
-    return;
-  }
-
   for (size_t i = 0; i < layer->children().size(); ++i) {
     Layer* child_layer = layer->child_at(i);
 
@@ -172,12 +156,6 @@
   if (layer->test_properties()->clip_parent)
     recursive_data->num_unclipped_descendants++;
 
-  if (!HasInvertibleOrAnimatedTransformForTesting(layer)) {
-    // Layers with singular transforms should not be drawn, the whole subtree
-    // can be skipped.
-    return;
-  }
-
   for (size_t i = 0; i < layer->children().size(); ++i) {
     LayerImpl* child_layer = layer->child_at(i);
 
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
index 3109d77..17d6ca84 100644
--- a/chrome/BUILD.gn
+++ b/chrome/BUILD.gn
@@ -29,6 +29,12 @@
 
 if (is_android) {
   import("//build/config/android/rules.gni")
+} else if (is_mac) {
+  import("//build/compiled_action.gni")
+  import("//build/config/mac/rules.gni")
+  import("//build/util/branding.gni")
+  import("//build/util/version.gni")
+  import("//build_overrides/v8.gni")
 }
 
 if (is_win) {
@@ -58,7 +64,7 @@
   }
 }
 
-if (!is_android) {
+if (!is_android && !is_mac) {
   group("chrome") {
     public_deps = [
       ":chrome_initial",
@@ -217,34 +223,27 @@
       }
     }
 
-    if (is_mac) {
-      sources += [ "app/chrome_exe_main_mac.c" ]
-      deps += [ ":chrome_dll" ]
+    # These files are used by the installer so we need a public dep.
+    public_deps += [
+      ":packed_extra_resources",
+      ":packed_resources",
+    ]
+    deps += [
+      "//components/startup_metric_utils/browser:lib",
 
-      # TODO(GYP) lots more stuff in the is_mac block.
-    } else {  # Non-Mac.
-      # These files are used by the installer so we need a public dep.
-      public_deps += [
-        ":packed_extra_resources",
-        ":packed_resources",
-      ]
-      deps += [
-        "//components/startup_metric_utils/browser:lib",
-
-        # Precompiled plugins that need to get copied to the output directory.
-        # On Mac, internal plugins go inside the framework, so these
-        # dependencies are on chrome.dll.
-        "//third_party/adobe/flash:flapper_binaries",
-        "//third_party/widevine/cdm:widevinecdmadapter",
-      ]
-    }
+      # Precompiled plugins that need to get copied to the output directory.
+      # On Mac, internal plugins go inside the framework, so these
+      # dependencies are on chrome.dll.
+      "//third_party/adobe/flash:flapper_binaries",
+      "//third_party/widevine/cdm:widevinecdmadapter",
+    ]
 
     if (is_multi_dll_chrome) {
       defines += [ "CHROME_MULTIPLE_DLL" ]
       data_deps += [ ":chrome_child" ]
     }
   }
-}  # !is_android
+}  # !is_android && !is_mac
 
 if (is_mac) {
   if (is_component_build) {
@@ -259,7 +258,7 @@
     # On Mac non-component builds, this is a no-op forwarding target.
     group("chrome_dll") {
       public_deps = [
-        ":main_dll",
+        ":chrome_framework",
       ]
     }
   }
@@ -279,9 +278,7 @@
       data_deps += [ ":chrome_child" ]
     }
   }
-}
 
-if (is_mac || is_win) {
   shared_library("main_dll") {
     configs += [ "//build/config/compiler:wexit_time_destructors" ]
     defines = []
@@ -329,12 +326,10 @@
         #deps += [ 'chrome_user32_delay_imports' ]  TODO(GYP)
       }
 
-      if (!is_component_build) {
-        # This is a large module that can't do incremental linking in some cases.
-        configs -= [ "//build/config/win:default_incremental_linking" ]
-        configs +=
-            [ "//build/config/win:default_large_module_incremental_linking" ]
-      }
+      # This is a large module that can't do incremental linking in some cases.
+      configs -= [ "//build/config/win:default_incremental_linking" ]
+      configs +=
+          [ "//build/config/win:default_large_module_incremental_linking" ]
     }
 
     if (use_aura) {
@@ -351,28 +346,6 @@
       ]
     }
 
-    if (is_mac) {
-      #['OS=="mac" and component!="shared_library"', {  TODO(GYP)
-      #  'includes': [ 'chrome_dll_bundle.gypi' ],
-      #}],
-      # TODO(GYP) Lots of other stuff in the OS=="mac" block.
-      sources += [
-        "app/chrome_crash_reporter_client.cc",
-        "app/chrome_crash_reporter_client.h",
-        "app/chrome_crash_reporter_client_mac.mm",
-      ]
-      deps += [
-        "//components/crash/content/app",
-        "//components/policy",
-      ]
-
-      # Define the order of symbols within the framework.
-      ldflags += [
-        "-Wl,-order_file",
-        "-Wl," + rebase_path("app/framework.order", root_build_dir),
-      ]
-    }
-
     if (enable_plugins && enable_pdf && !is_multi_dll_chrome) {
       deps += [ "//pdf" ]
     }
@@ -448,6 +421,287 @@
       }
     }
   }
+} else if (is_mac) {
+  chrome_helper_name = chrome_product_full_name + " Helper"
+  chrome_framework_name = chrome_product_full_name + " Framework"
+
+  group("chrome") {
+    deps = [
+      ":chrome_initial",
+    ]
+  }
+
+  group("chrome_initial") {
+    deps = [
+      ":chrome_app",
+    ]
+  }
+
+  mac_app_bundle("chrome_app") {
+    output_name = chrome_product_full_name
+
+    info_plist = "app/app-Info.plist"
+
+    sources = [
+      "app/chrome_exe_main_mac.c",
+    ]
+
+    deps = [
+      ":chrome_app_strings_bundle_data",
+      ":chrome_resources",
+      ":chrome_versioned_bundle_data",
+      "//chrome/common:version_header",
+    ]
+  }
+
+  compiled_action("chrome_app_strings") {
+    tool = "//chrome/tools/mac_helpers:infoplist_strings_tool"
+
+    inputs = [
+      chrome_version_file,
+    ]
+
+    outputs = []
+
+    foreach(locale, locales) {
+      if (is_chrome_branded) {
+        _strings_file = "google_chrome_strings"
+      } else {
+        _strings_file = "chromium_strings"
+      }
+
+      inputs += [ "$root_gen_dir/chrome/${_strings_file}_${locale}.pak" ]
+    }
+
+    foreach(locale, locales_as_mac_outputs) {
+      outputs += [ "$target_gen_dir/app_infoplist_strings/$locale.lproj/InfoPlist.strings" ]
+    }
+
+    args =
+        [
+          "-b",
+          "${branding_path_component}_strings",
+          "-v",
+          rebase_path(chrome_version_file, root_build_dir),
+          "-g",
+          rebase_path("$root_gen_dir/chrome", root_build_dir),
+          "-o",
+          rebase_path("$target_gen_dir/app_infoplist_strings", root_build_dir),
+          "-t",
+          "main",
+        ] + locales
+
+    if (is_chrome_branded) {
+      deps = [
+        "//chrome/app:google_chrome_strings",
+      ]
+    } else {
+      deps = [
+        "//chrome/app:chromium_strings",
+      ]
+    }
+  }
+
+  foreach(locale, locales_as_mac_outputs) {
+    bundle_data("chrome_app_strings_${locale}_bundle_data") {
+      sources = [
+        "$target_gen_dir/app_infoplist_strings/$locale.lproj/InfoPlist.strings",
+      ]
+      outputs = [
+        "{{bundle_resources_dir}}/$locale.lproj/{{source_file_part}}",
+      ]
+      public_deps = [
+        ":chrome_app_strings",
+      ]
+    }
+  }
+  group("chrome_app_strings_bundle_data") {
+    public_deps = []
+    foreach(locale, locales_as_mac_outputs) {
+      public_deps += [ ":chrome_app_strings_${locale}_bundle_data" ]
+    }
+  }
+
+  bundle_data("chrome_resources") {
+    sources = [
+      "app/theme/$branding_path_component/mac/app.icns",
+      "app/theme/$branding_path_component/mac/document.icns",
+      "browser/ui/cocoa/applescript/scripting.sdef",
+
+      # TODO(rsesek): mac_bundle_id.manifest
+    ]
+
+    outputs = [
+      "{{bundle_resources_dir}}/{{source_file_part}}",
+    ]
+
+    deps = [
+      ":chrome_app_strings",
+    ]
+  }
+
+  bundle_data("chrome_versioned_bundle_data") {
+    sources = [
+      "$root_out_dir/$chrome_framework_name.framework",
+      "$root_out_dir/$chrome_helper_name.app",
+    ]
+    outputs = [
+      "{{bundle_root_dir}}/Versions/$chrome_version_full/{{source_file_part}}",
+    ]
+    public_deps = [
+      ":chrome_framework",
+      ":chrome_helper_app",
+    ]
+  }
+
+  mac_app_bundle("chrome_helper_app") {
+    output_name = chrome_helper_name
+
+    info_plist = "app/helper-Info.plist"
+
+    sources = [
+      "app/chrome_exe_main_mac.c",
+    ]
+
+    defines = [ "HELPER_EXECUTABLE" ]
+
+    deps = [
+      "//chrome/common:version_header",
+    ]
+  }
+
+  bundle_data("chrome_framework_locales") {
+    sources = []
+    public_deps = [
+      ":repack_locales_pack",
+    ]
+
+    foreach(locale, locales_as_mac_outputs) {
+      sources += [ "$root_gen_dir/repack/locales/$locale.pak" ]
+    }
+
+    outputs = [
+      "{{bundle_resources_dir}}/{{source_name_part}}.lproj/locale.pak",
+    ]
+  }
+
+  bundle_data("chrome_framework_helpers") {
+    sources = [
+      "$root_out_dir/crashpad_handler",
+    ]
+
+    outputs = [
+      "{{bundle_root_dir}}/Helpers/{{source_file_part}}",
+    ]
+
+    public_deps = [
+      "//third_party/crashpad/crashpad/handler:crashpad_handler",
+    ]
+  }
+
+  bundle_data("chrome_framework_resources") {
+    sources = [
+      # This image is used to badge the lock icon in the
+      # authentication dialogs, such as those used for installation
+      # from disk image and Keystone promotion (if so enabled).  It
+      # needs to exist as a file on disk and not just something in a
+      # resource bundle because that's the interface that
+      # Authorization Services uses.  Also, Authorization Services
+      # can't deal with .icns files.
+      "$root_gen_dir/repack/resources.pak",
+      "$root_out_dir/app_mode_loader.app",
+      "$root_out_dir/chrome_100_percent.pak",
+      "$root_out_dir/icudtl.dat",
+      "app/theme/default_100_percent/$branding_path_component/product_logo_32.png",
+      "browser/mac/install.sh",
+    ]
+
+    outputs = [
+      "{{bundle_resources_dir}}/{{source_file_part}}",
+    ]
+
+    public_deps = [
+      ":packed_extra_resources",
+      ":packed_resources",
+      "//chrome/app_shim:app_mode_loader",
+      "//third_party/icu:icudata",
+    ]
+
+    if (enable_hidpi) {
+      sources += [ "$root_out_dir/chrome_200_percent.pak" ]
+    }
+
+    if (enable_topchrome_md) {
+      sources += [ "$root_out_dir/chrome_material_100_percent.pak" ]
+
+      if (enable_hidpi) {
+        sources += [ "$root_out_dir/chrome_material_200_percent.pak" ]
+      }
+    }
+
+    if (v8_use_external_startup_data) {
+      sources += [
+        "$root_out_dir/natives_blob.bin",
+        "$root_out_dir/snapshot_blob.bin",
+      ]
+      public_deps += [ "//v8" ]
+    }
+  }
+
+  mac_framework_bundle("chrome_framework") {
+    output_name = chrome_framework_name
+
+    configs += [ "//build/config/compiler:wexit_time_destructors" ]
+
+    sources = [
+      "app/chrome_command_ids.h",
+      "app/chrome_crash_reporter_client.cc",
+      "app/chrome_crash_reporter_client.h",
+      "app/chrome_crash_reporter_client_mac.mm",
+      "app/chrome_dll_resource.h",
+      "app/chrome_main.cc",
+      "app/chrome_main_delegate.cc",
+      "app/chrome_main_delegate.h",
+      "app/chrome_main_mac.h",
+      "app/chrome_main_mac.mm",
+    ]
+
+    info_plist = "app/framework-Info.plist"
+
+    deps = [
+      ":browser_dependencies",
+      ":child_dependencies",
+      ":chrome_framework_helpers",
+      ":chrome_framework_locales",
+      ":chrome_framework_resources",
+      "//build/config/sanitizers:deps",
+      "//chrome/app/nibs:chrome_xibs",
+      "//chrome/common:features",
+      "//components/crash/content/app",
+      "//components/policy",
+      "//content/public/app:both",
+      "//third_party/cld_2",
+    ]
+
+    ldflags = [
+      "-Wl,-order_file",
+      "-Wl," + rebase_path("app/framework.order", root_build_dir),
+      "-install_name",
+      "@executable_path/../Versions/$chrome_version_full/$chrome_framework_name.framework/$chrome_framework_name",
+      "-compatibility_version",
+      chrome_dylib_version,
+      "-current_version",
+      chrome_dylib_version,
+    ]
+
+    if (enable_plugins && enable_pdf) {
+      deps += [ "//pdf" ]
+    }
+
+    if (enable_package_mash_services) {
+      deps += [ "//chrome/app/mash" ]
+    }
+  }
 }
 
 # GYP version: chromium_browser_dependencies variable in chrome.gyp
@@ -474,7 +728,9 @@
       # build this is OK because all of content is linked into one library.
       # Note that the blink_headers target is OK, so we can't do a wildcard for
       # all blink targets.
-      "//third_party/WebKit/public:blink",
+      # TODO(brettw) bug 582206: Blink should not be linked into the browser
+      # process, and then we can enable this.
+      #"//third_party/WebKit/public:blink",
       # TODO(brettw) bug 581766: V8 should not be linked into the browser
       # process, and then we can enable this.
       #"//v8/*",
diff --git a/chrome/VERSION b/chrome/VERSION
index 70b5b08e..ef922f2 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=52
 MINOR=0
-BUILD=2723
+BUILD=2724
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 52c207c..d9d20cab 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -111,7 +111,7 @@
     "values-uk/android_chrome_strings.xml",
     "values-vi/android_chrome_strings.xml",
     "values-zh-rCN/android_chrome_strings.xml",
-    "values-zh-rTW/android_chrome_strings.xml",
+    "values-zh/android_chrome_strings.xml",
   ]
 }
 
diff --git a/chrome/android/java/res/drawable-hdpi/ic_music_video.png b/chrome/android/java/res/drawable-hdpi/ic_music_video.png
new file mode 100644
index 0000000..e61a8aca
--- /dev/null
+++ b/chrome/android/java/res/drawable-hdpi/ic_music_video.png
Binary files differ
diff --git a/chrome/android/java/res/drawable-hdpi/settings_autoplay.png b/chrome/android/java/res/drawable-hdpi/settings_autoplay.png
new file mode 100644
index 0000000..a8a9265
--- /dev/null
+++ b/chrome/android/java/res/drawable-hdpi/settings_autoplay.png
Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/ic_music_video.png b/chrome/android/java/res/drawable-mdpi/ic_music_video.png
new file mode 100644
index 0000000..39a3bd2
--- /dev/null
+++ b/chrome/android/java/res/drawable-mdpi/ic_music_video.png
Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/settings_autoplay.png b/chrome/android/java/res/drawable-mdpi/settings_autoplay.png
new file mode 100644
index 0000000..49fa10d
--- /dev/null
+++ b/chrome/android/java/res/drawable-mdpi/settings_autoplay.png
Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/ic_music_video.png b/chrome/android/java/res/drawable-xhdpi/ic_music_video.png
new file mode 100644
index 0000000..34065a3fb
--- /dev/null
+++ b/chrome/android/java/res/drawable-xhdpi/ic_music_video.png
Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/settings_autoplay.png b/chrome/android/java/res/drawable-xhdpi/settings_autoplay.png
new file mode 100644
index 0000000..5a4128a5
--- /dev/null
+++ b/chrome/android/java/res/drawable-xhdpi/settings_autoplay.png
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/ic_music_video.png b/chrome/android/java/res/drawable-xxhdpi/ic_music_video.png
new file mode 100644
index 0000000..4735d94
--- /dev/null
+++ b/chrome/android/java/res/drawable-xxhdpi/ic_music_video.png
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/settings_autoplay.png b/chrome/android/java/res/drawable-xxhdpi/settings_autoplay.png
new file mode 100644
index 0000000..7fceb8c
--- /dev/null
+++ b/chrome/android/java/res/drawable-xxhdpi/settings_autoplay.png
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/ic_music_video.png b/chrome/android/java/res/drawable-xxxhdpi/ic_music_video.png
new file mode 100644
index 0000000..35b3d63
--- /dev/null
+++ b/chrome/android/java/res/drawable-xxxhdpi/ic_music_video.png
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/settings_autoplay.png b/chrome/android/java/res/drawable-xxxhdpi/settings_autoplay.png
new file mode 100644
index 0000000..92a315b
--- /dev/null
+++ b/chrome/android/java/res/drawable-xxxhdpi/settings_autoplay.png
Binary files differ
diff --git a/chrome/android/java/res/layout/fre_data_reduction_proxy.xml b/chrome/android/java/res/layout/fre_data_reduction_proxy.xml
index fb04088..5aaaef5 100644
--- a/chrome/android/java/res/layout/fre_data_reduction_proxy.xml
+++ b/chrome/android/java/res/layout/fre_data_reduction_proxy.xml
@@ -6,7 +6,6 @@
 -->
 <org.chromium.chrome.browser.firstrun.FirstRunView
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:chrome="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
@@ -81,18 +80,26 @@
         </LinearLayout>
     </ScrollView>
 
-    <!-- fre_button_bar_height = 52dp = layout_height + layout_marginBottom -->
-    <org.chromium.ui.widget.ButtonCompat
-        android:id="@+id/next_button"
-        android:layout_width="wrap_content"
-        android:layout_height="36dp"
-        android:layout_marginBottom="16dp"
-        android:layout_gravity="bottom|center_horizontal"
-        android:paddingStart="@dimen/fre_button_padding"
-        android:paddingEnd="@dimen/fre_button_padding"
-        android:text="@string/next"
-        android:textAllCaps="true"
-        android:textColor="@android:color/white"
-        android:textSize="@dimen/fre_button_text_size"
-        chrome:buttonColor="@color/light_active_color"/>
+    <LinearLayout
+        android:id="@+id/button_bar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/fre_button_bar_height"
+        android:layout_gravity="bottom"
+        android:orientation="vertical">
+
+        <View style="@style/ButtonBarTopDivider" />
+
+        <Button
+            android:id="@+id/next_button"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/fre_button_bar_height"
+            android:layout_gravity="bottom"
+            android:background="?attr/listChoiceBackgroundIndicator"
+            android:padding="16dp"
+            android:text="@string/next"
+            android:textAllCaps="true"
+            android:textColor="@color/light_active_color"
+            android:textSize="@dimen/fre_button_text_size"
+            style="@style/ButtonCompatBorderless" />
+    </LinearLayout>
 </org.chromium.chrome.browser.firstrun.FirstRunView>
\ No newline at end of file
diff --git a/chrome/android/java/res/layout/fre_tosanduma.xml b/chrome/android/java/res/layout/fre_tosanduma.xml
index 0b59d586..76d558b 100644
--- a/chrome/android/java/res/layout/fre_tosanduma.xml
+++ b/chrome/android/java/res/layout/fre_tosanduma.xml
@@ -6,7 +6,6 @@
 -->
 <org.chromium.chrome.browser.firstrun.FirstRunView
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:chrome="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
@@ -78,18 +77,26 @@
         </LinearLayout>
     </ScrollView>
 
-    <!-- fre_button_bar_height = 52dp = layout_height + layout_marginBottom -->
-    <org.chromium.ui.widget.ButtonCompat
-        android:id="@+id/terms_accept"
-        android:layout_width="wrap_content"
-        android:layout_height="36dp"
-        android:layout_marginBottom="16dp"
-        android:layout_gravity="bottom|center_horizontal"
-        android:paddingStart="@dimen/fre_button_padding"
-        android:paddingEnd="@dimen/fre_button_padding"
-        android:text="@string/fre_accept_continue"
-        android:textAllCaps="true"
-        android:textColor="@android:color/white"
-        android:textSize="@dimen/fre_button_text_size"
-        chrome:buttonColor="@color/light_active_color"/>
+    <LinearLayout
+        android:id="@+id/button_bar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/fre_button_bar_height"
+        android:layout_gravity="bottom"
+        android:orientation="vertical">
+
+        <View style="@style/ButtonBarTopDivider" />
+
+        <Button
+            android:id="@+id/terms_accept"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/fre_button_bar_height"
+            android:layout_gravity="bottom"
+            android:background="?attr/listChoiceBackgroundIndicator"
+            android:padding="16dp"
+            android:text="@string/fre_accept_continue"
+            android:textAllCaps="true"
+            android:textColor="@color/light_active_color"
+            android:textSize="@dimen/fre_button_text_size"
+            style="@style/ButtonCompatBorderless" />
+    </LinearLayout>
 </org.chromium.chrome.browser.firstrun.FirstRunView>
\ No newline at end of file
diff --git a/chrome/android/java/res/layout/infobar_control_icon_with_description.xml b/chrome/android/java/res/layout/infobar_control_icon_with_description.xml
index 4f53d83..2d72ddf 100644
--- a/chrome/android/java/res/layout/infobar_control_icon_with_description.xml
+++ b/chrome/android/java/res/layout/infobar_control_icon_with_description.xml
@@ -18,8 +18,7 @@
         android:scaleType="centerInside"
         android:contentDescription="@null" />
 
-    <org.chromium.chrome.browser.infobar.InfoBarDualControlLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
+    <org.chromium.chrome.browser.widget.DualControlLayout
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_weight="1" >
@@ -38,6 +37,6 @@
             android:textSize="@dimen/infobar_text_size"
             android:textColor="@color/infobar_descriptive_text_color" />
 
-    </org.chromium.chrome.browser.infobar.InfoBarDualControlLayout>
+    </org.chromium.chrome.browser.widget.DualControlLayout>
 
 </LinearLayout>
\ No newline at end of file
diff --git a/chrome/android/java/res/layout/infobar_control_spinner_view.xml b/chrome/android/java/res/layout/infobar_control_spinner_view.xml
index f49875e..cd79d8b6 100644
--- a/chrome/android/java/res/layout/infobar_control_spinner_view.xml
+++ b/chrome/android/java/res/layout/infobar_control_spinner_view.xml
@@ -5,7 +5,7 @@
      found in the LICENSE file.
 -->
 
-<org.chromium.chrome.browser.infobar.InfoBarDualControlLayout
+<org.chromium.chrome.browser.widget.DualControlLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" >
@@ -24,4 +24,4 @@
         android:textColor="@color/default_text_color"
         android:textSize="@dimen/infobar_text_size" />
 
-</org.chromium.chrome.browser.infobar.InfoBarDualControlLayout>
\ No newline at end of file
+</org.chromium.chrome.browser.widget.DualControlLayout>
\ No newline at end of file
diff --git a/chrome/android/java/res/layout/new_tab_page_snippets_card.xml b/chrome/android/java/res/layout/new_tab_page_snippets_card.xml
index 703bfec..d117905e 100644
--- a/chrome/android/java/res/layout/new_tab_page_snippets_card.xml
+++ b/chrome/android/java/res/layout/new_tab_page_snippets_card.xml
@@ -44,7 +44,7 @@
         android:layout_marginTop="16dp"
         android:maxLines="1"
         android:ellipsize="end"
-        android:textSize="14sp"
+        android:textSize="12sp"
         android:textColor="@color/snippets_publisher_name_color" />
 
     <ImageView
diff --git a/chrome/android/java/res/layout/payment_line_item.xml b/chrome/android/java/res/layout/payment_line_item.xml
deleted file mode 100644
index 285f46d6..0000000
--- a/chrome/android/java/res/layout/payment_line_item.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-   Copyright 2016 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.
--->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_height="wrap_content"
-    android:layout_width="wrap_content">
-
-    <TextView
-        android:id="@+id/lineItemPrice"
-        android:layout_alignParentEnd="true"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:textStyle="bold" />
-
-    <TextView
-        android:id="@+id/lineItemCurrencyCode"
-        android:layout_height="wrap_content"
-        android:layout_marginEnd="6dp"
-        android:layout_toStartOf="@id/lineItemPrice"
-        android:layout_width="wrap_content" />
-
-    <TextView
-        android:id="@+id/lineItemLabel"
-        android:layout_alignParentStart="true"
-        android:layout_height="wrap_content"
-        android:layout_toStartOf="@id/lineItemCurrencyCode"
-        android:layout_width="wrap_content" />
-
-</RelativeLayout>
diff --git a/chrome/android/java/res/layout/payment_option_line.xml b/chrome/android/java/res/layout/payment_option_line.xml
deleted file mode 100644
index 4a3a8cb..0000000
--- a/chrome/android/java/res/layout/payment_option_line.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-   Copyright 2016 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.
--->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_height="wrap_content"
-    android:layout_width="match_parent">
-
-    <RadioButton
-        android:id="@+id/optionRadioButton"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:clickable="false"
-        android:importantForAccessibility="no"
-        android:paddingEnd="8dp"
-        android:visibility="gone" />
-
-    <ImageView
-        android:id="@+id/optionIcon"
-        android:layout_alignParentEnd="true"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:importantForAccessibility="no" />
-
-    <TextView
-        android:id="@+id/optionLabel"
-        android:layout_height="wrap_content"
-        android:layout_toEndOf="@id/optionRadioButton"
-        android:layout_toStartOf="@id/optionIcon"
-        android:layout_width="match_parent"
-        android:singleLine="false"
-        android:textColor="#000000" />
-
-    <TextView
-        android:id="@+id/optionSubLabel"
-        android:layout_below="@id/optionLabel"
-        android:layout_height="wrap_content"
-        android:layout_toEndOf="@id/optionRadioButton"
-        android:layout_toStartOf="@id/optionIcon"
-        android:layout_width="match_parent"
-        android:singleLine="false" />
-
-</RelativeLayout>
diff --git a/chrome/android/java/res/layout/payment_request.xml b/chrome/android/java/res/layout/payment_request.xml
index 84814ccd..25b8d403 100644
--- a/chrome/android/java/res/layout/payment_request.xml
+++ b/chrome/android/java/res/layout/payment_request.xml
@@ -74,198 +74,22 @@
         android:fadingEdgeLength="9dp">
 
         <LinearLayout
+            android:id="@+id/paymentContainerLayout"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:orientation="vertical">
-
-            <TextView
-                android:id="@+id/orderSummaryLabel"
-                android:layout_height="wrap_content"
-                android:layout_width="match_parent"
-                android:textColor="#0000ff"
-                android:text="@string/payments_order_summary_label"
-                android:padding="16dp" />
-
-            <LinearLayout
-                android:id="@+id/lineItems"
-                android:layout_height="wrap_content"
-                android:layout_width="match_parent"
-                android:orientation="vertical"
-                android:padding="16dp">
-
-            </LinearLayout>
-
-            <View
-                android:layout_height="1dp"
-                android:layout_width="match_parent"
-                android:background="#cccccc"
-                android:padding="16dp">
-            </View>
-
-            <TextView
-                android:id="@+id/shippingSummaryLabel"
-                android:layout_height="wrap_content"
-                android:layout_width="match_parent"
-                android:textColor="#0000ff"
-                android:text="@string/payments_shipping_summary_label"
-                android:padding="16dp" />
-
-            <RelativeLayout
-                android:id="@+id/shippingSummary"
-                android:layout_height="wrap_content"
-                android:layout_width="match_parent"
-                android:padding="16dp">
-
-                <TextView
-                    android:id="@+id/shippingSummaryOption"
-                    android:layout_alignParentEnd="true"
-                    android:layout_height="wrap_content"
-                    android:layout_width="wrap_content"
-                    android:singleLine="false"
-                    android:textColor="#000000" />
-
-                <TextView
-                    android:id="@+id/shippingSummaryAddress"
-                    android:layout_height="wrap_content"
-                    android:layout_toStartOf="@id/shippingSummaryOption"
-                    android:layout_width="match_parent"
-                    android:singleLine="false"
-                    android:textColor="#000000" />
-
-            </RelativeLayout>
-
-            <View
-                android:id="@+id/shippingSummarySeparator"
-                android:layout_height="1dp"
-                android:layout_width="match_parent"
-                android:background="#cccccc"
-                android:padding="16dp">
-            </View>
-
-            <TextView
-                android:id="@+id/shippingAddressesLabel"
-                android:layout_height="wrap_content"
-                android:layout_width="match_parent"
-                android:textColor="#0000ff"
-                android:text="@string/payments_shipping_address_label"
-                android:padding="16dp"
-                android:visibility="gone" />
-
-            <TextView
-                android:id="@+id/selectShippingAddressPrompt"
-                android:layout_height="wrap_content"
-                android:layout_width="match_parent"
-                android:text="@string/payments_select_shipping_address_prompt"
-                android:padding="16dp"
-                android:visibility="gone" />
-
-            <RadioGroup
-                android:id="@+id/shippingAddresses"
-                android:layout_height="wrap_content"
-                android:layout_width="match_parent"
-                android:orientation="vertical"
-                android:padding="16dp"
-                android:visibility="gone">
-
-            </RadioGroup>
-
-            <View
-                android:id="@+id/shippingAddressesSeparator"
-                android:layout_height="1dp"
-                android:layout_width="match_parent"
-                android:background="#cccccc"
-                android:padding="16dp"
-                android:visibility="gone">
-            </View>
-
-            <TextView
-                android:id="@+id/shippingOptionsLabel"
-                android:layout_height="wrap_content"
-                android:layout_width="match_parent"
-                android:textColor="#0000ff"
-                android:text="@string/payments_shipping_option_label"
-                android:padding="16dp"
-                android:visibility="gone" />
-
-            <TextView
-                android:id="@+id/selectShippingOptionPrompt"
-                android:layout_height="wrap_content"
-                android:layout_width="match_parent"
-                android:text="@string/payments_select_shipping_option_prompt"
-                android:padding="16dp"
-                android:visibility="gone" />
-
-            <RadioGroup
-                android:id="@+id/shippingOptions"
-                android:layout_height="wrap_content"
-                android:layout_width="match_parent"
-                android:orientation="vertical"
-                android:padding="16dp"
-                android:visibility="gone">
-
-            </RadioGroup>
-
-            <View
-                android:id="@+id/shippingOptionsSeparator"
-                android:layout_height="1dp"
-                android:layout_width="match_parent"
-                android:background="#cccccc"
-                android:padding="16dp"
-                android:visibility="gone">
-            </View>
-
-            <TextView
-                android:id="@+id/paymentsListLabel"
-                android:layout_height="wrap_content"
-                android:layout_width="match_parent"
-                android:textColor="#0000ff"
-                android:text="@string/payments_method_of_payment_label"
-                android:padding="16dp" />
-
-            <RadioGroup
-                android:id="@+id/paymentsList"
-                android:layout_height="wrap_content"
-                android:layout_width="match_parent"
-                android:orientation="vertical"
-                android:padding="16dp">
-
-            </RadioGroup>
         </LinearLayout>
     </org.chromium.chrome.browser.payments.ui.FadingEdgeScrollView>
 
-    <LinearLayout
-        style="?android:attr/buttonBarStyle"
+    <org.chromium.chrome.browser.widget.DualControlLayout
         android:id="@+id/buttonBar"
-        android:layout_gravity="end"
         android:layout_height="wrap_content"
         android:layout_width="match_parent"
-        android:orientation="horizontal"
-        android:padding="16dp">
-
-        <Button
-            android:id="@+id/editButton"
-            android:layout_gravity="bottom"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:layout_width="0dp"
-            android:text="@string/payments_edit_button"
-            android:layout_marginEnd="8dp"
-            android:textColor="#0000ff"
-            android:background="#ffffff"
-            style="?android:attr/buttonBarButtonStyle" />
-
-        <Button
-            android:id="@+id/payButton"
-            android:layout_gravity="bottom"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:layout_width="0dp"
-            android:enabled="false"
-            android:text="@string/payments_pay_button"
-            android:textColor="#ffffff"
-            android:background="#0000ff"
-            style="?android:attr/buttonBarButtonStyle" />
-    </LinearLayout>
+        android:layout_marginStart="@dimen/payments_section_large_spacing"
+        android:layout_marginEnd="@dimen/payments_section_large_spacing"
+        android:layout_marginTop="@dimen/payments_section_large_spacing"
+        android:layout_marginBottom="@dimen/payments_section_large_spacing" >
+    </org.chromium.chrome.browser.widget.DualControlLayout>
 
     <LinearLayout
         android:id="@+id/waitingOverlay"
diff --git a/chrome/android/java/res/values-v17/styles.xml b/chrome/android/java/res/values-v17/styles.xml
index 99e168c..9e5ce94 100644
--- a/chrome/android/java/res/values-v17/styles.xml
+++ b/chrome/android/java/res/values-v17/styles.xml
@@ -446,6 +446,21 @@
         <item name="android:windowContentOverlay">@null</item>
     </style>
 
+    <!-- Payments UI -->
+    <style name="PaymentsUiSectionHeader">
+        <item name="android:textColor">@color/google_blue_700</item>
+        <item name="android:textSize">14sp</item>
+    </style>
+    <style name="PaymentsUiSectionDefaultText">
+        <item name="android:textColor">@color/default_text_color</item>
+        <item name="android:textSize">16sp</item>
+    </style>
+    <style name="PaymentsUiSectionDescriptiveText">
+        <item name="android:textColor">@color/descriptive_text_color</item>
+        <item name="android:textSize">14sp</item>
+        <item name="android:textAlignment">viewEnd</item>
+    </style>
+
     <!-- Misc styles -->
     <style name="LocationBarButton">
         <item name="android:background">@null</item>
diff --git a/chrome/android/java/res/values/colors.xml b/chrome/android/java/res/values/colors.xml
index 83a0f15e..2fb9f1ab 100644
--- a/chrome/android/java/res/values/colors.xml
+++ b/chrome/android/java/res/values/colors.xml
@@ -15,6 +15,7 @@
     <color name="text_highlight_color">#C6DAFC</color>
     <color name="dark_action_bar_color">#263238</color>
     <color name="descriptive_text_color">#646464</color>
+    <color name="google_blue_700">#3367d6</color>
 
     <!-- Infobar colors -->
     <color name="infobar_accent_blue">#4285f4</color>
@@ -163,9 +164,6 @@
     <!-- Bookmark widget colors -->
     <color name="bookmark_widget_pressed_highlight">#1D000000</color>
 
-    <!-- Media UI Colors -->
-    <color name="media_session_icon_color">#14181C</color>
-
     <!-- Physical Web colors -->
     <color name="physical_web_header_color">#333</color>
     <color name="physical_web_url_color">#969696</color>
@@ -180,4 +178,9 @@
     <!-- Bottom bar colors -->
     <color name="bottom_bar_shadow_color">#1d000000</color>
 
+    <!-- Payments UI colors -->
+    <color name="payments_section_edit_background">#f5f5f5</color>
+    <color name="payments_section_chevron">#b2b2b2</color>
+    <color name="payments_section_separator">#e0e0e0</color>
+
 </resources>
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
index 6bde79e..08f0b87 100644
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
@@ -153,7 +153,7 @@
     <!-- First Run Experience dimensions -->
     <dimen name="fre_content_margin">24dp</dimen>
     <dimen name="fre_vertical_spacing">32dp</dimen>
-    <dimen name="fre_button_bar_height">52dp</dimen>
+    <dimen name="fre_button_bar_height">56dp</dimen>
     <dimen name="fre_button_padding">12dp</dimen>
     <dimen name="fre_margin">24dp</dimen>
     <dimen name="fre_title_text_size">24sp</dimen>
@@ -168,7 +168,7 @@
     <dimen name="signin_image_carousel_width">240dp</dimen>
     <dimen name="signin_chooser_padding">16dp</dimen>
     <dimen name="signin_screen_top_padding">50dp</dimen>
-    
+
     <!-- Autofill card unmasking prompt dimensions -->
     <dimen name="autofill_card_unmask_tooltip_horizontal_padding">16dp</dimen>
     <dimen name="autofill_card_unmask_tooltip_vertical_padding">4dp</dimen>
@@ -259,7 +259,6 @@
     <dimen name="ntp_list_item_text_size">16sp</dimen>
     <dimen name="ntp_shadow_height">9dp</dimen>
     <dimen name="snippets_thumbnail_size">72dp</dimen>
-    <dimen name="snippets_vertical_space">2dp</dimen>
 
     <!-- Interests page -->
     <dimen name="ntp_interest_item_text_size">20sp</dimen>
@@ -301,11 +300,6 @@
     <!-- Favicon dimensions -->
     <dimen name="default_favicon_size">16dp</dimen>
 
-    <!-- Media UI dimensions -->
-    <!-- The media_session_icon_size is just big enough to make sure Android doesn't discard the
-         icon but otherwise, the icon is meant to be a flat color so it doesn't really matter. -->
-    <dimen name="media_session_icon_size">48dp</dimen>
-
     <!-- Account chooser dialog dimensions -->
     <dimen name="account_chooser_dialog_margin">24dp</dimen>
     <dimen name="account_chooser_dialog_item_margin">20dp</dimen>
@@ -314,4 +308,11 @@
 
     <!-- Clear browsing data preferences dimensions -->
     <dimen name="clear_browsing_data_checkbox_height">56dp</dimen>
+
+    <!-- Payments UI -->
+    <dimen name="payments_section_vertical_spacing">10dp</dimen>
+    <dimen name="payments_section_small_spacing">8dp</dimen>
+    <dimen name="payments_section_large_spacing">16dp</dimen>
+    <dimen name="payments_section_descriptive_item_spacing">40dp</dimen>
+    <dimen name="payments_section_separator_height">1dp</dimen>
 </resources>
diff --git a/chrome/android/java/res/xml/single_website_preferences.xml b/chrome/android/java/res/xml/single_website_preferences.xml
index a47292d..f3aea75 100644
--- a/chrome/android/java/res/xml/single_website_preferences.xml
+++ b/chrome/android/java/res/xml/single_website_preferences.xml
@@ -48,6 +48,8 @@
     <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="push_notifications_list" />
     <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
+        android:key="autoplay_permission_list" />
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="protected_media_identifier_permission_list" />
     <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="background_sync_permission_list" />
diff --git a/chrome/android/java/res/xml/site_settings_preferences.xml b/chrome/android/java/res/xml/site_settings_preferences.xml
index 8d43535..b6ad942e 100644
--- a/chrome/android/java/res/xml/site_settings_preferences.xml
+++ b/chrome/android/java/res/xml/site_settings_preferences.xml
@@ -44,6 +44,10 @@
     <Preference
         android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
         android:key="notifications" />
+    <!-- Autoplay -->
+    <Preference
+        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+        android:key="autoplay" />
     <!-- Protected content -->
     <Preference
         android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeStrictMode.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeStrictMode.java
index d00b5cf..de157e7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeStrictMode.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeStrictMode.java
@@ -139,23 +139,25 @@
                 || BuildConfig.sIsDebug
                 || ChromeVersionInfo.isLocalBuild()
                 || commandLine.hasSwitch(ChromeSwitches.STRICT_MODE)) {
-            StrictMode.enableDefaults();
-            StrictMode.ThreadPolicy.Builder threadPolicy =
-                    new StrictMode.ThreadPolicy.Builder(StrictMode.getThreadPolicy());
+            StrictMode.ThreadPolicy.Builder threadPolicy = new StrictMode.ThreadPolicy.Builder();
+            StrictMode.VmPolicy.Builder vmPolicy = new StrictMode.VmPolicy.Builder();
+
             threadPolicy = threadPolicy.detectAll()
                     .penaltyFlashScreen()
                     .penaltyDeathOnNetwork();
-            /*
-             * Explicitly enable detection of all violations except file URI leaks, as that results
-             * in false positives when file URI intents are passed between Chrome activities in
-             * separate processes. See http://crbug.com/508282#c11.
-             */
-            StrictMode.VmPolicy.Builder vmPolicy = new StrictMode.VmPolicy.Builder();
-            vmPolicy = vmPolicy.detectActivityLeaks()
-                    .detectLeakedClosableObjects()
-                    .detectLeakedRegistrationObjects()
-                    .detectLeakedSqlLiteObjects()
-                    .penaltyLog();
+            if (Build.VERSION.CODENAME.equals("N")) {
+                vmPolicy = vmPolicy.detectAll();
+            } else {
+                // Explicitly enable detection of all violations except file URI leaks, as that
+                // results in false positives when file URI intents are passed between Chrome
+                // activities in separate processes. See http://crbug.com/508282#c11.
+                vmPolicy = vmPolicy.detectActivityLeaks()
+                        .detectLeakedClosableObjects()
+                        .detectLeakedRegistrationObjects()
+                        .detectLeakedSqlLiteObjects();
+            }
+            vmPolicy.penaltyLog();
+
             if ("death".equals(commandLine.getSwitchValue(ChromeSwitches.STRICT_MODE))) {
                 threadPolicy = threadPolicy.penaltyDeath();
                 vmPolicy = vmPolicy.penaltyDeath();
@@ -167,9 +169,14 @@
             StrictMode.setVmPolicy(vmPolicy.build());
         }
 
-        // Currently testing with local release builds only.
-        // TODO(wnwen): Replace with finch experiment on dev.
-        if (ChromeVersionInfo.isLocalBuild() && !BuildConfig.sIsDebug) {
+        // Enroll 1% of dev sessions into StrictMode watch. This is done client-side rather than
+        // through finch because this decision is as early as possible in the browser initialization
+        // process. We need to detect early start-up StrictMode violations before loading native and
+        // before warming the SharedPreferences (that is a violation in an of itself). We will
+        // closely monitor this on dev channel.
+        boolean enableStrictModeWatch =
+                (ChromeVersionInfo.isDevBuild() && Math.random() < UPLOAD_PROBABILITY);
+        if ((ChromeVersionInfo.isLocalBuild() && !BuildConfig.sIsDebug) || enableStrictModeWatch) {
             initializeStrictModeWatch();
         }
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java
index 52490f4..a4072a5c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java
@@ -340,7 +340,7 @@
                         if (TabModelUtils.getTabById(modelSelector.getModel(false), id) == null
                                 && TabModelUtils.getTabById(modelSelector.getModel(true), id)
                                         == null) {
-                            nativeRemoveTabThumbnail(mNativeTabContentManager, id);
+                            removeTabThumbnail(id);
                         }
                     } catch (NumberFormatException expected) {
                         // This is an unknown file name, we'll leave it there.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/datausage/ExternalDataUseObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/datausage/ExternalDataUseObserver.java
index 26f8dd07..479d061c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/datausage/ExternalDataUseObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/datausage/ExternalDataUseObserver.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.datausage;
 
 import android.content.Context;
+import android.text.TextUtils;
 
 import org.chromium.base.ApplicationState;
 import org.chromium.base.ApplicationStatus;
@@ -56,16 +57,17 @@
             if (mNativeExternalDataUseObserverBridge == 0) {
                 return;
             }
-            if (mControlAppPackageName != null && !mControlAppPackageName.isEmpty()) {
-                boolean isControlAppInstalled =
-                        PackageUtils.getPackageVersion(
-                                ApplicationStatus.getApplicationContext(), mControlAppPackageName)
-                        != -1;
-                if (isControlAppInstalled != mInstalled) {
-                    mInstalled = isControlAppInstalled;
-                    nativeOnControlAppInstallStateChange(
-                            mNativeExternalDataUseObserverBridge, mInstalled);
-                }
+            if (TextUtils.isEmpty(mControlAppPackageName)) {
+                return;
+            }
+            boolean isControlAppInstalled =
+                    PackageUtils.getPackageVersion(
+                            ApplicationStatus.getApplicationContext(), mControlAppPackageName)
+                    != -1;
+            if (isControlAppInstalled != mInstalled) {
+                mInstalled = isControlAppInstalled;
+                nativeOnControlAppInstallStateChange(
+                        mNativeExternalDataUseObserverBridge, mInstalled);
             }
         }
     }
@@ -95,11 +97,22 @@
     }
 
     /**
-     * Sets the package name of the control app.
-     * @param controlAppPackageName package name of the control app.
+     * @return the default control app package name.
+     */
+    protected String getDefaultControlAppPackageName() {
+        return "";
+    }
+
+    /**
+     * Initializes the control app manager with package name of the control app.
+     * @param controlAppPackageName package name of the control app. If this is empty the default
+     * control app package name from {@link getDefaultControlAppPackageName} will be used.
      */
     @CalledByNative
-    protected void setControlAppPackageName(String controlAppPackageName) {
+    protected void initControlAppManager(String controlAppPackageName) {
+        if (TextUtils.isEmpty(controlAppPackageName)) {
+            controlAppPackageName = getDefaultControlAppPackageName();
+        }
         mControlAppManager = new ControlAppManager(controlAppPackageName);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
index 22624395..1b3cf5d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
@@ -141,9 +141,9 @@
             String percentText = formatter.format(percentage / 100.0);
             String duration = getDurationString(timeRemainingInMillis);
             builder.setContentText(duration).setContentInfo(percentText);
-            addOrReplaceSharedPreferenceEntry(new DownloadSharedPreferenceEntry(
-                    notificationId, isResumable, canDownloadWhileMetered, downloadGuid, fileName));
         }
+        addOrReplaceSharedPreferenceEntry(new DownloadSharedPreferenceEntry(
+                notificationId, isResumable, canDownloadWhileMetered, downloadGuid, fileName));
         if (startTime > 0) builder.setWhen(startTime);
         builder.addAction(R.drawable.bookmark_cancel_active,
                 mContext.getResources().getString(R.string.download_notification_cancel_button),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/DataReductionProxyFirstRunFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/DataReductionProxyFirstRunFragment.java
index 66a1a5ce..09fe40d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/DataReductionProxyFirstRunFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/DataReductionProxyFirstRunFragment.java
@@ -10,11 +10,11 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
+import android.widget.Button;
 
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
 import org.chromium.chrome.browser.preferences.datareduction.DataReductionPromoScreen;
-import org.chromium.ui.widget.ButtonCompat;
 
 /**
  * The First Run Experience fragment that allows the user to opt in to Data Saver.
@@ -33,7 +33,7 @@
 
         final SwitchCompat enableDataSaverSwitch = (SwitchCompat) view
                 .findViewById(R.id.enable_data_saver_switch);
-        ButtonCompat nextButton = (ButtonCompat) view.findViewById(R.id.next_button);
+        Button nextButton = (Button) view.findViewById(R.id.next_button);
 
         enableDataSaverSwitch.setOnClickListener(new OnClickListener() {
             @Override
@@ -48,7 +48,6 @@
             }
         });
 
-        nextButton.setRaised(false);
         nextButton.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ToSAndUMAFirstRunFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ToSAndUMAFirstRunFragment.java
index 3f9a590..31b8e65 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ToSAndUMAFirstRunFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ToSAndUMAFirstRunFragment.java
@@ -11,6 +11,7 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
+import android.widget.Button;
 import android.widget.CheckBox;
 import android.widget.TextView;
 
@@ -21,7 +22,6 @@
 import org.chromium.ui.text.NoUnderlineClickableSpan;
 import org.chromium.ui.text.SpanApplier;
 import org.chromium.ui.text.SpanApplier.SpanInfo;
-import org.chromium.ui.widget.ButtonCompat;
 
 /**
  * The First Run Experience fragment that allows the user to accept Terms of Service ("ToS") and
@@ -29,7 +29,7 @@
  * User Metrics Analysis) as defined in the Chrome Privacy Notice.
  */
 public class ToSAndUMAFirstRunFragment extends FirstRunPage {
-    private ButtonCompat mAcceptButton;
+    private Button mAcceptButton;
     private CheckBox mSendReportCheckBox;
     private TextView mTosAndPrivacy;
 
@@ -43,11 +43,10 @@
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
 
-        mAcceptButton = (ButtonCompat) view.findViewById(R.id.terms_accept);
+        mAcceptButton = (Button) view.findViewById(R.id.terms_accept);
         mSendReportCheckBox = (CheckBox) view.findViewById(R.id.send_report_checkbox);
         mTosAndPrivacy = (TextView) view.findViewById(R.id.tos_and_privacy);
 
-        mAcceptButton.setRaised(false);
         mAcceptButton.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/AppBannerInfoBarAndroid.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/AppBannerInfoBarAndroid.java
index 2f9f40f..a5f9629 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/AppBannerInfoBarAndroid.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/AppBannerInfoBarAndroid.java
@@ -16,6 +16,7 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.banners.AppData;
+import org.chromium.chrome.browser.widget.DualControlLayout;
 
 /**
  * Infobar informing the user about an app related to this page.
@@ -113,7 +114,7 @@
             assert secondaryText == null;
             ImageView playLogo = new ImageView(layout.getContext());
             playLogo.setImageResource(R.drawable.google_play);
-            layout.setBottomViews(primaryText, playLogo, InfoBarDualControlLayout.ALIGN_APART);
+            layout.setBottomViews(primaryText, playLogo, DualControlLayout.ALIGN_APART);
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarControlLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarControlLayout.java
index a82736e..d3c3165 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarControlLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarControlLayout.java
@@ -23,6 +23,7 @@
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.widget.DualControlLayout;
 
 /**
  * Lays out a group of controls (e.g. switches, spinners, or additional text) for InfoBars that need
@@ -70,12 +71,12 @@
         }
 
         @Override
-        public InfoBarDualControlLayout getView(int position, View convertView, ViewGroup parent) {
-            InfoBarDualControlLayout view;
-            if (convertView instanceof InfoBarDualControlLayout) {
-                view = (InfoBarDualControlLayout) convertView;
+        public DualControlLayout getView(int position, View convertView, ViewGroup parent) {
+            DualControlLayout view;
+            if (convertView instanceof DualControlLayout) {
+                view = (DualControlLayout) convertView;
             } else {
-                view = (InfoBarDualControlLayout) LayoutInflater.from(getContext())
+                view = (DualControlLayout) LayoutInflater.from(getContext())
                         .inflate(R.layout.infobar_control_spinner_view, parent, false);
             }
 
@@ -98,7 +99,7 @@
          * causing another layout pass when switching values.
          */
         int computeMinWidthRequiredForValues() {
-            InfoBarDualControlLayout layout = getView(0, null, null);
+            DualControlLayout layout = getView(0, null, null);
             TextView container = (TextView) layout.getChildAt(1);
 
             Paint textPaint = container.getPaint();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarLayout.java
index c84ed0c..accd947 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarLayout.java
@@ -8,7 +8,6 @@
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.graphics.Bitmap;
-import android.graphics.Color;
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.text.SpannableStringBuilder;
@@ -25,6 +24,7 @@
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.widget.DualControlLayout;
 import org.chromium.ui.widget.ButtonCompat;
 
 import java.util.ArrayList;
@@ -86,7 +86,7 @@
 
     private TextView mMessageTextView;
     private ImageView mIconView;
-    private InfoBarDualControlLayout mButtonRowLayout;
+    private DualControlLayout mButtonRowLayout;
 
     private CharSequence mMessageMainText;
     private String mMessageLinkText;
@@ -216,14 +216,11 @@
 
         Button secondaryButton = null;
         if (!TextUtils.isEmpty(secondaryText)) {
-            secondaryButton = ButtonCompat.createBorderlessButton(getContext());
-            secondaryButton.setId(R.id.button_secondary);
-            secondaryButton.setOnClickListener(this);
-            secondaryButton.setText(secondaryText);
-            secondaryButton.setTextColor(mAccentColor);
+            secondaryButton = DualControlLayout.createButtonForLayout(
+                    getContext(), false, secondaryText, this);
         }
 
-        setBottomViews(primaryText, secondaryButton, InfoBarDualControlLayout.ALIGN_END);
+        setBottomViews(primaryText, secondaryButton, DualControlLayout.ALIGN_END);
     }
 
     /**
@@ -235,19 +232,15 @@
      *                    created.
      * @param secondaryView View that is aligned with the primary button.  May be null.
      * @param alignment One of ALIGN_START, ALIGN_APART, or ALIGN_END from
-     *                  {@link InfoBarDualControlLayout}.
+     *                  {@link DualControlLayout}.
      */
     public void setBottomViews(String primaryText, View secondaryView, int alignment) {
         assert !TextUtils.isEmpty(primaryText);
-        ButtonCompat primaryButton = new ButtonCompat(getContext(), mAccentColor);
-        primaryButton.setId(R.id.button_primary);
-        primaryButton.setOnClickListener(this);
-        primaryButton.setText(primaryText);
-        primaryButton.setTextColor(Color.WHITE);
-        primaryButton.setRaised(false);
+        Button primaryButton = DualControlLayout.createButtonForLayout(
+                getContext(), true, primaryText, this);
 
         assert mButtonRowLayout == null;
-        mButtonRowLayout = new InfoBarDualControlLayout(getContext(), null);
+        mButtonRowLayout = new DualControlLayout(getContext(), null);
         mButtonRowLayout.setAlignment(alignment);
         mButtonRowLayout.setStackedMargin(getResources().getDimensionPixelSize(
                 R.dimen.infobar_margin_between_stacked_buttons));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
index 6991058..f18328a1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
@@ -23,6 +23,7 @@
 import org.chromium.base.BaseSwitches;
 import org.chromium.base.CommandLine;
 import org.chromium.base.ContentUriUtils;
+import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
 import org.chromium.base.PathUtils;
 import org.chromium.base.ResourceExtractor;
@@ -133,8 +134,6 @@
     public void handlePreNativeStartup(final BrowserParts parts) {
         assert ThreadUtils.runningOnUiThread() : "Tried to start the browser on the wrong thread";
 
-        PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX, mApplication);
-
         preInflationStartup();
         parts.preInflationStartup();
         if (parts.isActivityFinishing()) return;
@@ -184,6 +183,9 @@
         ThreadUtils.assertOnUiThread();
         if (mPreInflationStartupComplete) return;
 
+        ContextUtils.initApplicationContext(mApplication);
+        PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX, mApplication);
+
         // Ensure critical files are available, so they aren't blocked on the file-system
         // behind long-running accesses in next phase.
         // Don't do any large file access here!
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaUrlResolver.java b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaUrlResolver.java
index c4746c5..f2d4f5e5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaUrlResolver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaUrlResolver.java
@@ -123,7 +123,7 @@
 
     // We don't want to necessarily fetch the whole video but we don't want to miss the CORS header.
     // Assume that 64k should be more than enough to keep all the headers.
-    private static final String RANGE_HEADER_VALUE = "bytes: 0-65536";
+    private static final String RANGE_HEADER_VALUE = "bytes=0-65536";
 
     private final Delegate mDelegate;
     private final boolean mDebug;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java
index 4fc045f0..5fb9cf7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java
@@ -13,6 +13,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.media.AudioManager;
@@ -386,7 +387,7 @@
 
     private Bitmap mNotificationIcon;
 
-    private final Bitmap mDefaultMediaSessionImage;
+    private final Bitmap mDefaultLargeIcon;
 
     // |mMediaNotificationInfo| should be not null if and only if the notification is showing.
     private MediaNotificationInfo mMediaNotificationInfo;
@@ -414,11 +415,8 @@
         mPauseDescription = context.getResources().getString(R.string.accessibility_pause);
         mStopDescription = context.getResources().getString(R.string.accessibility_stop);
 
-        // The MediaSession icon is a plain color.
-        int size = context.getResources().getDimensionPixelSize(R.dimen.media_session_icon_size);
-        mDefaultMediaSessionImage = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
-        mDefaultMediaSessionImage.eraseColor(ApiCompatibilityUtils.getColor(
-                context.getResources(), R.color.media_session_icon_color));
+        mDefaultLargeIcon = BitmapFactory.decodeResource(
+                context.getResources(), R.drawable.ic_music_video);
     }
 
     /**
@@ -491,30 +489,20 @@
     private MediaMetadataCompat createMetadata() {
         MediaMetadataCompat.Builder metadataBuilder = new MediaMetadataCompat.Builder();
 
-        // Choose the image to use as the icon.
-        Bitmap mediaSessionImage = mMediaNotificationInfo.largeIcon == null
-                ? mDefaultMediaSessionImage
-                : mMediaNotificationInfo.largeIcon;
-
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             metadataBuilder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE,
                     mMediaNotificationInfo.metadata.getTitle());
             metadataBuilder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE,
                     mMediaNotificationInfo.origin);
-            metadataBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON,
-                    scaleBitmapForWearable(mediaSessionImage));
-            // METADATA_KEY_ART is optional and should only be used if we can provide something
-            // better than the default image.
-            if (mMediaNotificationInfo.largeIcon != null) {
-                metadataBuilder.putBitmap(
-                        MediaMetadataCompat.METADATA_KEY_ART, mMediaNotificationInfo.largeIcon);
-            }
         } else {
             metadataBuilder.putString(MediaMetadataCompat.METADATA_KEY_TITLE,
                     mMediaNotificationInfo.metadata.getTitle());
             metadataBuilder.putString(MediaMetadataCompat.METADATA_KEY_ARTIST,
                     mMediaNotificationInfo.origin);
-            metadataBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, mediaSessionImage);
+        }
+        if (mMediaNotificationInfo.largeIcon != null) {
+            metadataBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART,
+                    scaleBitmapForWearable(mMediaNotificationInfo.largeIcon));
         }
 
         if (!TextUtils.isEmpty(mMediaNotificationInfo.metadata.getArtist())) {
@@ -641,12 +629,11 @@
 
     private void setMediaStyleLayoutForNotificationBuilder(NotificationCompat.Builder builder) {
         setMediaStyleNotificationText(builder);
-        // TODO(zqzhang): Update the default icon when a new one in provided.
-        // See http://crbug.com/600396.
         if (mMediaNotificationInfo.largeIcon != null) {
             builder.setLargeIcon(mMediaNotificationInfo.largeIcon);
-        } else {
-            builder.setLargeIcon(mDefaultMediaSessionImage);
+        } else if (!TextUtils.equals(Build.VERSION.CODENAME, "N")
+                && mMediaNotificationInfo.supportsPlayPause()) {
+            builder.setLargeIcon(mDefaultLargeIcon);
         }
         // TODO(zqzhang): It's weird that setShowWhen() don't work on K. Calling setWhen() to force
         // removing the time.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java
index bb726325..5cdc745 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java
@@ -407,7 +407,7 @@
                 }
             });
             initializeSearchBoxRecyclerViewScrollHandling();
-            mRecyclerView.addItemDecoration(new SnippetItemDecoration(getContext()));
+            mRecyclerView.addItemDecoration(new SnippetItemDecoration());
         } else {
             initializeSearchBoxScrollHandling();
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetItemDecoration.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetItemDecoration.java
index a5ea6d1..b80bb706 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetItemDecoration.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetItemDecoration.java
@@ -4,30 +4,22 @@
 
 package org.chromium.chrome.browser.ntp.snippets;
 
-import android.content.Context;
 import android.graphics.Rect;
 import android.support.v7.widget.RecyclerView;
 import android.view.View;
 
-import org.chromium.chrome.R;
-
 /**
  * A class that decorates the RecyclerView elements.
  */
 public class SnippetItemDecoration extends RecyclerView.ItemDecoration {
-    private final int mVerticalSpace;
-
-    public SnippetItemDecoration(Context context) {
-        this.mVerticalSpace =
-                context.getResources().getDimensionPixelSize(R.dimen.snippets_vertical_space);
-    }
+    private static final int VERTICAL_SPACE = 1;
 
     @Override
     public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
             RecyclerView.State state) {
         outRect.setEmpty();
         if (parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1) {
-            outRect.bottom = mVerticalSpace;
+            outRect.bottom = VERTICAL_SPACE;
         }
     }
 }
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
index 0664569..85247d2a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
@@ -75,6 +75,7 @@
     private PaymentRequestUI mUI;
     private Callback<PaymentInformation> mPaymentInformationCallback;
     private Pattern mRegionCodePattern;
+    private boolean mMerchantNeedsShippingAddress;
 
     /**
      * Builds the dialog.
@@ -167,6 +168,11 @@
             return;
         }
 
+        // If the merchant requests shipping and does not provide shipping options here, then the
+        // merchant needs the shipping address to calculate shipping price and availability.
+        boolean requestShipping = options != null && options.requestShipping;
+        mMerchantNeedsShippingAddress = requestShipping && mShippingOptions.isEmpty();
+
         mData = getValidatedData(mSupportedMethods, stringifiedData);
         if (mData == null) {
             disconnectFromClientWithDebugMessage("Invalid payment method specific data");
@@ -211,7 +217,6 @@
 
         if (!isGettingInstruments) mPaymentMethods = new SectionInformation();
 
-        boolean requestShipping = options != null && options.requestShipping;
         mUI = new PaymentRequestUI(mContext, this, requestShipping, mMerchantName, mOrigin);
         if (mFavicon != null) mUI.setTitleBitmap(mFavicon);
         mFavicon = null;
@@ -394,8 +399,10 @@
     public void onShippingAddressChanged(PaymentOption selectedShippingAddress) {
         assert selectedShippingAddress instanceof AutofillAddress;
         mShippingAddresses.setSelectedItem(selectedShippingAddress);
-        mClient.onShippingAddressChange(
-                ((AutofillAddress) selectedShippingAddress).toShippingAddress());
+        if (mMerchantNeedsShippingAddress) {
+            mClient.onShippingAddressChange(
+                    ((AutofillAddress) selectedShippingAddress).toShippingAddress());
+        }
     }
 
     @Override
@@ -498,6 +505,21 @@
         PaymentResponse response = new PaymentResponse();
         response.methodName = methodName;
         response.stringifiedDetails = stringifiedDetails;
+
+        PaymentOption selectedShippingAddress = mShippingAddresses.getSelectedItem();
+        if (selectedShippingAddress != null) {
+            // Shipping addresses are created in show(). The should all be instances of
+            // AutofillAddress.
+            assert selectedShippingAddress instanceof AutofillAddress;
+            response.shippingAddress =
+                    ((AutofillAddress) selectedShippingAddress).toShippingAddress();
+        }
+
+        PaymentOption selectedShippingOption = mShippingOptions.getSelectedItem();
+        if (selectedShippingOption != null && selectedShippingOption.getIdentifier() != null) {
+            response.shippingOptionId = selectedShippingOption.getIdentifier();
+        }
+
         mClient.onPaymentResponse(response);
     }
 
@@ -506,7 +528,7 @@
      */
     @Override
     public void onInstrumentDetailsError() {
-        disconnectFromClientWithDebugMessage("Fialed to retrieve payment instrument details");
+        disconnectFromClientWithDebugMessage("Failed to retrieve payment instrument details");
         closeUI(false);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentInformation.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentInformation.java
index 67864ab..08e1320 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentInformation.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentInformation.java
@@ -61,6 +61,16 @@
     }
 
     /**
+     * Returns the sublabel for the selected shipping address.
+     *
+     * @return The sublabel for the selected shipping address or null.
+     */
+    public String getSelectedShippingAddressSublabel() {
+        PaymentOption address = mShippingAddresses.getSelectedItem();
+        return address != null ? address.getSublabel() : null;
+    }
+
+    /**
      * Returns the shipping options.
      *
      * @return The shipping options.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestSection.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestSection.java
new file mode 100644
index 0000000..3fc3875
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestSection.java
@@ -0,0 +1,682 @@
+// Copyright 2016 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.chrome.browser.payments.ui;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.text.SpannableStringBuilder;
+import android.text.TextUtils;
+import android.text.TextUtils.TruncateAt;
+import android.text.style.StyleSpan;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.GridLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+
+import org.chromium.base.ApiCompatibilityUtils;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.widget.TintedDrawable;
+
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+/**
+ * Represents a single section in the {@link PaymentRequestUI} that flips between multiple states.
+ *
+ * The row is broken up into three major, vertically-centered sections:
+ * .............................................................................................
+ * . TITLE                                                          |                |         .
+ * .................................................................|                |         .
+ * . LEFT SUMMARY TEXT                        |  RIGHT SUMMARY TEXT |    ADD or LOGO | CHEVRON .
+ * .................................................................|                |         .
+ * . MAIN SECTION CONTENT                                           |                |         .
+ * .............................................................................................
+ *
+ * 1) MAIN CONTENT
+ *    The main content is on the left side of the UI.  This includes the title of the section and
+ *    two bits of optional summary text.  Subclasses may extend this class to append more controls
+ *    via the {@link #createMainSectionContent} function.
+ *
+ * 2) ADD or LOGO
+ *    Displays an optional logo (e.g. a credit card image) that floats to the right of the main
+ *    content.  May eventually be used to show an "ADD" button.
+ *
+ * 3) CHEVRON
+ *    Drawn to indicate that the current section may be expanded.  Displayed only when the view is
+ *    in the {@link #DISPLAY_MODE_EXPANDABLE} state.
+ *
+ * There are three states that the UI may flip between; see {@link #DISPLAY_MODE_NORMAL},
+ * {@link #DISPLAY_MODE_EXPANDABLE}, and {@link #DISPLAY_MODE_FOCUSED} for details.
+ *
+ * TODO(dfalcantara): Replace this with a RelativeLayout once mocks are finalized.
+ */
+public abstract class PaymentRequestSection extends LinearLayout {
+    public static final String TAG = "PaymentRequestUI";
+
+    /** Listens for clicks on the widgets. */
+    public static interface PaymentsSectionListener extends View.OnClickListener {
+        /**
+         * Called when the user selects a radio button option from an {@link OptionSection}.
+         *
+         * @param section Section that was changed.
+         * @param option  {@link PaymentOption} that was selected.
+         */
+        void onPaymentOptionChanged(OptionSection section, PaymentOption option);
+    }
+
+    /** Normal mode: White background, displays the item assuming the user accepts it as is. */
+    static final int DISPLAY_MODE_NORMAL = 0;
+
+    /** Editable mode: White background, displays the item with an edit chevron. */
+    static final int DISPLAY_MODE_EXPANDABLE = 1;
+
+    /** Focused mode: Gray background, more padding, no edit chevron. */
+    static final int DISPLAY_MODE_FOCUSED = 2;
+
+    protected final PaymentsSectionListener mListener;
+    protected final int mLargeSpacing;
+
+    private final int mVerticalSpacing;
+    private final int mFocusedBackgroundColor;
+    private final LinearLayout mMainSection;
+    private final ImageView mLogoView;
+    private final ImageView mChevronView;
+
+    private TextView mTitleView;
+    private LinearLayout mSummaryLayout;
+    private TextView mSummaryLeftTextView;
+    private TextView mSummaryRightTextView;
+
+    private int mLogoResourceId;
+    private int mDisplayMode;
+    private boolean mIsSummaryAllowed = true;
+
+    /**
+     * Constructs an PaymentRequestSection.
+     *
+     * @param context     Context to pull resources from.
+     * @param sectionName Title of the section to display.
+     * @param listener    Listener to alert when something changes in the dialog.
+     */
+    private PaymentRequestSection(
+            Context context, String sectionName, PaymentsSectionListener listener) {
+        super(context);
+        mListener = listener;
+        setOnClickListener(listener);
+        setOrientation(HORIZONTAL);
+        setGravity(Gravity.CENTER_VERTICAL);
+
+        // Set the styling of the view.
+        mFocusedBackgroundColor = ApiCompatibilityUtils.getColor(
+                getResources(), R.color.payments_section_edit_background);
+        mLargeSpacing =
+                getResources().getDimensionPixelSize(R.dimen.payments_section_large_spacing);
+        mVerticalSpacing =
+                getResources().getDimensionPixelSize(R.dimen.payments_section_vertical_spacing);
+        setPadding(0, mVerticalSpacing, 0, mVerticalSpacing);
+
+        TintedDrawable chevron =
+                TintedDrawable.constructTintedDrawable(getResources(), R.drawable.ic_expanded);
+        chevron.setTint(ApiCompatibilityUtils.getColorStateList(
+                getResources(), R.color.payments_section_chevron));
+
+        // Create the main content.
+        mMainSection = prepareMainSection(sectionName);
+        mLogoView = isLogoNecessary() ? createAndAddImageView(null) : null;
+        mChevronView = createAndAddImageView(chevron);
+        setDisplayMode(DISPLAY_MODE_NORMAL);
+    }
+
+    /**
+     * Sets what logo should be displayed.
+     *
+     * @param resourceId ID of the logo to display.
+     */
+    protected void setLogoResource(int resourceId) {
+        assert isLogoNecessary();
+        mLogoResourceId = resourceId;
+        mLogoView.setImageResource(resourceId);
+        updateLogoVisibility();
+    }
+
+    /**
+     * Updates what Views are displayed and how they look.
+     *
+     * @param displayMode What mode the widget is being displayed in.
+     */
+    public void setDisplayMode(int displayMode) {
+        mDisplayMode = displayMode;
+        setBackgroundColor(
+                displayMode == DISPLAY_MODE_FOCUSED ? mFocusedBackgroundColor : Color.WHITE);
+        updateLogoVisibility();
+        mChevronView.setVisibility(displayMode == DISPLAY_MODE_EXPANDABLE ? VISIBLE : GONE);
+
+        // The title gains extra spacing when there is another visible view in the main section.
+        int numVisibleMainViews = 0;
+        for (int i = 0; i < mMainSection.getChildCount(); i++) {
+            if (mMainSection.getChildAt(i).getVisibility() == VISIBLE) numVisibleMainViews += 1;
+        }
+        boolean isTitleMarginNecessary =
+                numVisibleMainViews > 1 && displayMode == DISPLAY_MODE_FOCUSED;
+        ((ViewGroup.MarginLayoutParams) mTitleView.getLayoutParams()).bottomMargin =
+                isTitleMarginNecessary ? mVerticalSpacing : 0;
+    }
+
+    /**
+     * Changes what is being displayed in the summary.
+     *
+     * @param leftText  Text to display on the left side.  If null, the whole row hides.
+     * @param rightText Text to display on the right side.  If null, only the right View hides.
+     */
+    public void setSummaryText(
+            @Nullable CharSequence leftText, @Nullable CharSequence rightText) {
+        mSummaryLeftTextView.setText(leftText);
+        mSummaryRightTextView.setText(rightText);
+        mSummaryRightTextView.setVisibility(TextUtils.isEmpty(rightText) ? GONE : VISIBLE);
+        updateSummaryVisibility();
+    }
+
+    /**
+     * Sets how the summary text should be displayed.
+     *
+     * @param leftTruncate How to truncate the left summary text.  Set to null to clear.
+     * @param rightTruncate How to truncate the right summary text.  Set to null to clear.
+     */
+    public void setSummaryProperties(@Nullable TruncateAt leftTruncate, boolean leftIsSingleLine,
+            @Nullable TruncateAt rightTruncate, boolean rightIsSingleLine) {
+        mSummaryLeftTextView.setEllipsize(leftTruncate);
+        mSummaryLeftTextView.setSingleLine(leftIsSingleLine);
+
+        mSummaryRightTextView.setEllipsize(rightTruncate);
+        mSummaryRightTextView.setSingleLine(rightIsSingleLine);
+    }
+
+    /**
+     * Subclasses may override this method to add additional controls to the layout.
+     *
+     * @param mainSectionLayout Layout containing all of the main content of the section.
+     */
+    protected abstract void createMainSectionContent(LinearLayout mainSectionLayout);
+
+    /**
+     * Sets whether or not the summary text can be displayed.
+     *
+     * @param isAllowed Whether or not do display the summary text.
+     */
+    protected void setIsSummaryAllowed(boolean isAllowed) {
+        mIsSummaryAllowed = isAllowed;
+        updateSummaryVisibility();
+    }
+
+    /** @return Whether or not the logo should be displayed. */
+    protected boolean isLogoNecessary() {
+        return false;
+    }
+
+    /**
+     * Creates the main section.  Subclasses must call super#createMainSection() immediately to
+     * guarantee that Views are added in the correct order.
+     *
+     * @param sectionName Title to display for the section.
+     */
+    private final LinearLayout prepareMainSection(String sectionName) {
+        // The main section is a vertical linear layout that subclasses can append to.
+        LinearLayout mainSectionLayout = new LinearLayout(getContext());
+        mainSectionLayout.setOrientation(VERTICAL);
+        LinearLayout.LayoutParams mainParams = new LayoutParams(0, LayoutParams.WRAP_CONTENT);
+        mainParams.weight = 1;
+        ApiCompatibilityUtils.setMarginStart(mainParams, mLargeSpacing);
+        ApiCompatibilityUtils.setMarginEnd(mainParams, mLargeSpacing);
+        addView(mainSectionLayout, mainParams);
+
+        // The title is always displayed for the row at the top of the main section.
+        mTitleView = new TextView(getContext());
+        mTitleView.setText(sectionName);
+        ApiCompatibilityUtils.setTextAppearance(
+                mTitleView, R.style.PaymentsUiSectionHeader);
+        mainSectionLayout.addView(
+                mTitleView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
+
+        // Create the two TextViews for showing the summary text.
+        mSummaryLeftTextView = new TextView(getContext());
+        ApiCompatibilityUtils.setTextAppearance(
+                mSummaryLeftTextView, R.style.PaymentsUiSectionDefaultText);
+
+        mSummaryRightTextView = new TextView(getContext());
+        ApiCompatibilityUtils.setTextAppearance(
+                mSummaryRightTextView, R.style.PaymentsUiSectionDefaultText);
+        ApiCompatibilityUtils.setTextAlignment(mSummaryRightTextView, TEXT_ALIGNMENT_TEXT_END);
+
+        // The main TextView sucks up all the available space.
+        LinearLayout.LayoutParams leftLayoutParams = new LinearLayout.LayoutParams(
+                0, LayoutParams.WRAP_CONTENT);
+        leftLayoutParams.weight = 1;
+
+        LinearLayout.LayoutParams rightLayoutParams = new LinearLayout.LayoutParams(
+                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+        ApiCompatibilityUtils.setMarginStart(
+                rightLayoutParams,
+                getContext().getResources().getDimensionPixelSize(
+                        R.dimen.payments_section_small_spacing));
+
+        // The summary section displays up to two TextViews side by side.
+        mSummaryLayout = new LinearLayout(getContext());
+        mSummaryLayout.addView(mSummaryLeftTextView, leftLayoutParams);
+        mSummaryLayout.addView(mSummaryRightTextView, rightLayoutParams);
+        mainSectionLayout.addView(mSummaryLayout, new LinearLayout.LayoutParams(
+                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
+        setSummaryText(null, null);
+
+        createMainSectionContent(mainSectionLayout);
+        return mainSectionLayout;
+    }
+
+    private ImageView createAndAddImageView(@Nullable Drawable drawable) {
+        ImageView view = new ImageView(getContext());
+        view.setImageDrawable(drawable);
+        LayoutParams params =
+                new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+        ApiCompatibilityUtils.setMarginEnd(params, mLargeSpacing);
+        addView(view, params);
+        return view;
+    }
+
+    private void updateSummaryVisibility() {
+        boolean show = mIsSummaryAllowed && !TextUtils.isEmpty(mSummaryLeftTextView.getText());
+        mSummaryLayout.setVisibility(show ? VISIBLE : GONE);
+    }
+
+    private void updateLogoVisibility() {
+        if (mLogoView == null) return;
+        boolean show = mLogoResourceId != 0 && mDisplayMode != DISPLAY_MODE_FOCUSED;
+        mLogoView.setVisibility(show ? VISIBLE : GONE);
+    }
+
+    /**
+     * Section with a secondary TextView beneath the summary to show additional details.
+     *
+     * ............................................................................
+     * . TITLE                                                          |         .
+     * .................................................................|         .
+     * . LEFT SUMMARY TEXT                        |  RIGHT SUMMARY TEXT | CHEVRON .
+     * .................................................................|         .
+     * . EXTRA TEXT                                                     |         .
+     * ............................................................................
+     */
+    public static class ExtraTextSection extends PaymentRequestSection {
+        private TextView mExtraTextView;
+
+        public ExtraTextSection(
+                Context context, String sectionName, PaymentsSectionListener listener) {
+            super(context, sectionName, listener);
+            setExtraText(null);
+        }
+
+        @Override
+        protected void createMainSectionContent(LinearLayout mainSectionLayout) {
+            Context context = mainSectionLayout.getContext();
+
+            mExtraTextView = new TextView(context);
+            ApiCompatibilityUtils.setTextAppearance(
+                    mExtraTextView, R.style.PaymentsUiSectionDescriptiveText);
+            mainSectionLayout.addView(mExtraTextView, new LinearLayout.LayoutParams(
+                    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
+        }
+
+        /**
+         * Sets the CharSequence that is displayed in the secondary TextView.
+         *
+         * @param text Text to display.
+         */
+        public void setExtraText(CharSequence text) {
+            mExtraTextView.setText(text);
+            mExtraTextView.setVisibility(TextUtils.isEmpty(text) ? GONE : VISIBLE);
+        }
+    }
+
+    /**
+     * Section with an additional Layout for showing a total and how it is broken down.
+     *
+     * Normal mode:     Just the summary is displayed.
+     *                  If no option is selected, the "empty label" is displayed in its place.
+     * Expandable mode: Same as Normal, but shows the chevron.
+     * Focused mode:    Hides the summary and chevron, then displays the full set of options.
+     *
+     * ............................................................................
+     * . TITLE                                                          |         .
+     * .................................................................|         .
+     * . LEFT SUMMARY TEXT                        |  RIGHT SUMMARY TEXT |         .
+     * .................................................................| CHEVRON .
+     * .                                      | Line item 1 |    $13.99 |         .
+     * .                                      | Line item 2 |      $.99 |         .
+     * .                                      | Line item 3 |     $2.99 |         .
+     * ............................................................................
+     */
+    public static class LineItemBreakdownSection extends PaymentRequestSection {
+        private GridLayout mBreakdownLayout;
+
+        public LineItemBreakdownSection(
+                Context context, String sectionName, PaymentsSectionListener listener) {
+            super(context, sectionName, listener);
+        }
+
+        @Override
+        protected void createMainSectionContent(LinearLayout mainSectionLayout) {
+            Context context = mainSectionLayout.getContext();
+
+            // The breakdown is represented by an end-aligned GridLayout that takes up only as much
+            // space as it needs.  The GridLayout ensures a consistent margin between the columns.
+            mBreakdownLayout = new GridLayout(context);
+            mBreakdownLayout.setColumnCount(2);
+            LayoutParams breakdownParams =
+                    new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+            breakdownParams.gravity = Gravity.END;
+            mainSectionLayout.addView(mBreakdownLayout, breakdownParams);
+        }
+
+        /**
+         * Updates the breakdown, with the last item representing the full total.
+         *
+         * @param lineItems List of {@link LineItem}s.  The last item is assumed to be the total,
+         *                  while the others show how the total is broken down.
+         */
+        public void update(List<LineItem> lineItems) {
+            Context context = mBreakdownLayout.getContext();
+
+            // Update the summary to display information about the total.
+            CharSequence totalLabel = null;
+            CharSequence totalValue = null;
+            if (lineItems.size() != 0) {
+                LineItem totalItem = lineItems.get(lineItems.size() - 1);
+                totalLabel = totalItem.getLabel();
+                totalValue = createValueString(totalItem.getCurrency(), totalItem.getPrice(), true);
+            }
+            setSummaryText(totalLabel, totalValue);
+
+            // Update the breakdown, using one row per {@link LineItem}.
+            int numItems = lineItems.size() - 1;
+            mBreakdownLayout.removeAllViews();
+            mBreakdownLayout.setRowCount(numItems);
+            for (int i = 0; i < numItems; i++) {
+                LineItem item = lineItems.get(i);
+
+                TextView description = new TextView(context);
+                ApiCompatibilityUtils.setTextAppearance(
+                        description, R.style.PaymentsUiSectionDescriptiveText);
+                description.setText(item.getLabel());
+
+                TextView amount = new TextView(context);
+                ApiCompatibilityUtils.setTextAppearance(
+                        amount, R.style.PaymentsUiSectionDescriptiveText);
+                amount.setText(createValueString(item.getCurrency(), item.getPrice(), false));
+
+                // Each item is represented by a row in the GridLayout.
+                GridLayout.LayoutParams descriptionParams = new GridLayout.LayoutParams(
+                        GridLayout.spec(i, 1, GridLayout.END),
+                        GridLayout.spec(0, 1, GridLayout.END));
+                GridLayout.LayoutParams amountParams = new GridLayout.LayoutParams(
+                        GridLayout.spec(i, 1, GridLayout.END),
+                        GridLayout.spec(1, 1, GridLayout.END));
+                ApiCompatibilityUtils.setMarginStart(amountParams,
+                        context.getResources().getDimensionPixelSize(
+                                R.dimen.payments_section_descriptive_item_spacing));
+
+                mBreakdownLayout.addView(description, descriptionParams);
+                mBreakdownLayout.addView(amount, amountParams);
+            }
+        }
+
+        /**
+         * Builds a CharSequence that displays a value in a particular currency.
+         *
+         * @param currency    Currency of the value being displayed.
+         * @param value       Value to display.
+         * @param isValueBold Whether or not to bold the item.
+         * @return CharSequence that represents the whole value.
+         */
+        private CharSequence createValueString(String currency, String value, boolean isValueBold) {
+            SpannableStringBuilder valueBuilder = new SpannableStringBuilder();
+            valueBuilder.append(currency);
+            valueBuilder.append(" ");
+
+            int boldStartIndex = valueBuilder.length();
+            valueBuilder.append(value);
+
+            if (isValueBold) {
+                valueBuilder.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), boldStartIndex,
+                        boldStartIndex + value.length(), 0);
+            }
+
+            return valueBuilder;
+        }
+
+        @Override
+        public void setDisplayMode(int displayMode) {
+            super.setDisplayMode(displayMode);
+            mBreakdownLayout.setVisibility(displayMode == DISPLAY_MODE_FOCUSED ? VISIBLE : GONE);
+        }
+    }
+
+    /**
+     * Section that allows selecting one thing from a set of mutually-exclusive options.
+     *
+     * Normal mode:     The summary text displays the selected option, and the icon for the option
+     *                  is displayed in the logo section (if it exists).
+     *                  If no option is selected, the "empty label" is displayed in its place.
+     *                  This is important for shipping options (e.g.) because there will be no
+     *                  option selected by default and a prompt can be displayed.
+     * Expandable mode: Same as Normal, but shows the chevron.
+     * Focused mode:    Hides the summary and chevron, then displays the full set of options.
+     *
+     * .............................................................................................
+     * . TITLE                                                          |                |         .
+     * .................................................................|                |         .
+     * . LEFT SUMMARY TEXT                        |  RIGHT SUMMARY TEXT |                |         .
+     * .................................................................|    ADD or LOGO | CHEVRON .
+     * . O Option 1                                              ICON 1 |                |         .
+     * . O Option 2                                              ICON 2 |                |         .
+     * . O Option 3                                              ICON 3 |                |         .
+     * .............................................................................................
+     */
+    public static class OptionSection extends PaymentRequestSection implements OnClickListener {
+        /** Displays a row representing a selectable option. */
+        private class OptionRow extends LinearLayout {
+            private final PaymentOption mOption;
+            private final RadioButton mRadioButton;
+
+            public OptionRow(Context context, PaymentOption item, boolean isSelected) {
+                super(context);
+                setGravity(Gravity.CENTER_VERTICAL);
+                mOption = item;
+
+                // The radio button hugs left.
+                mRadioButton = new RadioButton(context);
+                mRadioButton.setChecked(isSelected);
+                LinearLayout.LayoutParams radioParams = new LinearLayout.LayoutParams(
+                        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+                ApiCompatibilityUtils.setMarginEnd(radioParams, mLargeSpacing);
+                addView(mRadioButton, radioParams);
+
+                // The description takes up all leftover space.
+                TextView descriptionView = new TextView(context);
+                descriptionView.setText(convertOptionToString(item));
+                ApiCompatibilityUtils.setTextAppearance(
+                        descriptionView, R.style.PaymentsUiSectionDefaultText);
+                LinearLayout.LayoutParams descriptionParams =
+                        new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT);
+                descriptionParams.weight = 1;
+                addView(descriptionView, descriptionParams);
+
+                // If there's an icon to display, it floats to the right of everything.
+                int resourceId = item.getDrawableIconId();
+                if (resourceId != 0) {
+                    ImageView iconView = new ImageView(context);
+                    iconView.setImageResource(resourceId);
+                    LinearLayout.LayoutParams logoParams = new LinearLayout.LayoutParams(
+                            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+                    ApiCompatibilityUtils.setMarginStart(logoParams, mLargeSpacing);
+                    addView(iconView, logoParams);
+                }
+
+                // Clicking on either the radio button or the row itself should toggle its option.
+                mRadioButton.setOnClickListener(OptionSection.this);
+                setOnClickListener(OptionSection.this);
+            }
+
+            /** Sets the selected state of this item, alerting the listener if selected. */
+            public void setChecked(boolean isChecked) {
+                mRadioButton.setChecked(isChecked);
+
+                if (isChecked) {
+                    updateSelectedItem(mOption);
+                    mListener.onPaymentOptionChanged(OptionSection.this, mOption);
+                }
+            }
+        }
+
+        /** Text to display in the summary when there is no selected option. */
+        private final CharSequence mEmptyLabel;
+
+        /** How much space is between each option. */
+        private final int mTopMargin;
+
+        /** Layout containing all the {@link OptionRow}s. */
+        private RadioGroup mOptionLayout;
+
+        /**
+         * Constructs an OptionSection.
+         *
+         * @param context     Context to pull resources from.
+         * @param sectionName Title of the section to display.
+         * @param emptyLabel  An optional string to display when no item is selected.
+         * @param listener    Listener to alert when something changes in the dialog.
+         */
+        public OptionSection(Context context, String sectionName, @Nullable CharSequence emptyLabel,
+                PaymentsSectionListener listener) {
+            super(context, sectionName, listener);
+            mTopMargin = context.getResources().getDimensionPixelSize(
+                    R.dimen.payments_section_small_spacing);
+            mEmptyLabel = emptyLabel;
+            setSummaryText(emptyLabel, null);
+        }
+
+        @Override
+        public void onClick(View v) {
+            for (int i = 0; i < mOptionLayout.getChildCount(); i++) {
+                OptionRow row = (OptionRow) mOptionLayout.getChildAt(i);
+                row.setChecked(v == row || v == row.mRadioButton);
+            }
+        }
+
+        @Override
+        protected boolean isLogoNecessary() {
+            return true;
+        }
+
+        @Override
+        protected void createMainSectionContent(LinearLayout mainSectionLayout) {
+            Context context = mainSectionLayout.getContext();
+
+            mOptionLayout = new RadioGroup(context);
+            mOptionLayout.setOrientation(VERTICAL);
+            mainSectionLayout.addView(mOptionLayout, new LinearLayout.LayoutParams(
+                    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
+        }
+
+        /** Updates the View to account for the new {@link SectionInformation} being passed in. */
+        public void update(SectionInformation information) {
+            PaymentOption selectedItem = information.getSelectedItem();
+            updateSelectedItem(selectedItem);
+            updateOptionList(information, selectedItem);
+        }
+
+        @Override
+        public void setDisplayMode(int displayMode) {
+            super.setDisplayMode(displayMode);
+
+            if (displayMode == DISPLAY_MODE_FOCUSED) {
+                setIsSummaryAllowed(false);
+                mOptionLayout.setVisibility(VISIBLE);
+            } else {
+                setIsSummaryAllowed(true);
+                mOptionLayout.setVisibility(GONE);
+            }
+        }
+
+        private void updateSelectedItem(PaymentOption selectedItem) {
+            if (selectedItem == null) {
+                setLogoResource(0);
+                if (TextUtils.isEmpty(mEmptyLabel)) {
+                    setIsSummaryAllowed(false);
+                } else {
+                    setSummaryText(mEmptyLabel, null);
+                }
+            } else {
+                setLogoResource(selectedItem.getDrawableIconId());
+                setSummaryText(convertOptionToString(selectedItem), null);
+            }
+        }
+
+        private void updateOptionList(SectionInformation information, PaymentOption selectedItem) {
+            mOptionLayout.removeAllViews();
+            if (information.isEmpty()) return;
+
+            for (int i = 0; i < information.getSize(); i++) {
+                PaymentOption item = information.getItem(i);
+                OptionRow row = new OptionRow(getContext(), item, item == selectedItem);
+                LinearLayout.LayoutParams rowParams = new LinearLayout.LayoutParams(
+                        LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
+                rowParams.topMargin = mTopMargin;
+                mOptionLayout.addView(row, rowParams);
+            }
+        }
+
+        private CharSequence convertOptionToString(PaymentOption item) {
+            return new StringBuilder(item.getLabel()).append("\n").append(item.getSublabel());
+        }
+    }
+
+    /**
+     * Drawn as a 1dp separator.  Initially drawn without being expanded to the full width of the
+     * UI, but can be expanded to separate sections fully.
+     */
+    public static class SectionSeparator extends View {
+        /** Creates the View and adds it to the parent. */
+        public SectionSeparator(ViewGroup parent) {
+            this(parent, -1);
+        }
+
+        /** Creates the View and adds it to the parent at the given index. */
+        public SectionSeparator(ViewGroup parent, int index) {
+            super(parent.getContext());
+            Resources resources = parent.getContext().getResources();
+            setBackgroundColor(ApiCompatibilityUtils.getColor(
+                    resources, R.color.payments_section_separator));
+            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
+                    LayoutParams.MATCH_PARENT,
+                    resources.getDimensionPixelSize(R.dimen.payments_section_separator_height));
+
+            int margin = resources.getDimensionPixelSize(R.dimen.payments_section_large_spacing);
+            ApiCompatibilityUtils.setMarginStart(params, margin);
+            ApiCompatibilityUtils.setMarginEnd(params, margin);
+            parent.addView(this, index, params);
+        }
+
+        /** Expand the separator to be the full width of the dialog. */
+        public void expand() {
+            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) getLayoutParams();
+            ApiCompatibilityUtils.setMarginStart(params, 0);
+            ApiCompatibilityUtils.setMarginEnd(params, 0);
+        }
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
index ba38f757..2fcc520 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
@@ -9,30 +9,37 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.graphics.Bitmap;
-import android.graphics.Color;
 import android.os.Handler;
-import android.support.v4.content.ContextCompat;
+import android.text.TextUtils.TruncateAt;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
 import android.view.Window;
 import android.view.WindowManager;
 import android.widget.Button;
 import android.widget.ImageView;
-import android.widget.RadioButton;
+import android.widget.LinearLayout;
 import android.widget.TextView;
 
 import org.chromium.base.Callback;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.payments.ui.PaymentRequestSection.ExtraTextSection;
+import org.chromium.chrome.browser.payments.ui.PaymentRequestSection.LineItemBreakdownSection;
+import org.chromium.chrome.browser.payments.ui.PaymentRequestSection.OptionSection;
+import org.chromium.chrome.browser.payments.ui.PaymentRequestSection.SectionSeparator;
 import org.chromium.chrome.browser.widget.AlwaysDismissedDialog;
+import org.chromium.chrome.browser.widget.DualControlLayout;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
  * The PaymentRequest UI.
  */
-public class PaymentRequestUI implements DialogInterface.OnDismissListener, View.OnClickListener {
+public class PaymentRequestUI implements DialogInterface.OnDismissListener, View.OnClickListener,
+        PaymentRequestSection.PaymentsSectionListener {
     /**
      * The interface to be implemented by the consumer of the PaymentRequest UI.
      */
@@ -105,7 +112,8 @@
     private final Dialog mDialog;
     private final ViewGroup mContainer;
     private final View mPaymentContainer;
-    private final View mButtonBar;
+    private final ViewGroup mPaymentContainerLayout;
+    private final DualControlLayout mButtonBar;
     private final View mWaitingOverlay;
     private final View mWaitingProgressBar;
     private final View mWaitingSuccess;
@@ -114,34 +122,20 @@
     private final Button mPayButton;
     private final View mCloseButton;
 
-    private final View mOrderSummaryLabel;
-    private final ViewGroup mOrderSummary;
+    private final LineItemBreakdownSection mOrderSummarySection;
+    private final ExtraTextSection mShippingSummarySection;
+    private final OptionSection mShippingAddressSection;
+    private final OptionSection mShippingOptionSection;
+    private final OptionSection mPaymentMethodSection;
+    private final List<SectionSeparator> mSectionSeparators;
 
-    private final View mShippingSummaryLabel;
-    private final View mShippingSummary;
-    private final TextView mShippingSummaryAddress;
-    private final TextView mShippingSummaryOption;
-    private final View mShippingSummarySeparator;
-
-    private final View mShippingAddressesLabel;
-    private final ViewGroup mShippingAddresses;
-    private final View mShippingAddressesSeparator;
-
-    private final View mShippingOptionsLabel;
-    private final View mSelectShippingOptionPrompt;
-    private final ViewGroup mShippingOptions;
-    private final View mShippingOptionsSeparator;
-
-    private final View mPaymentMethodsLabel;
-    private final ViewGroup mPaymentMethods;
-
-    private View mSelectedSectionLabel;
     private ViewGroup mSelectedSection;
+    private boolean mIsShowingEditDialog;
 
     private List<LineItem> mLineItems;
-    private SectionInformation mPaymentMethodsSection;
-    private SectionInformation mShippingAddressesSection;
-    private SectionInformation mShippingOptionsSection;
+    private SectionInformation mPaymentMethodSectionInformation;
+    private SectionInformation mShippingAddressSectionInformation;
+    private SectionInformation mShippingOptionsSectionInformation;
 
     /**
      * Builds and shows the UI for PaymentRequest.
@@ -169,61 +163,56 @@
         ((TextView) mContainer.findViewById(R.id.hostname)).setText(origin);
 
         mPaymentContainer = mContainer.findViewById(R.id.paymentContainer);
-        mButtonBar = mContainer.findViewById(R.id.buttonBar);
         mWaitingOverlay = mContainer.findViewById(R.id.waitingOverlay);
         mWaitingProgressBar = mContainer.findViewById(R.id.waitingProgressBar);
         mWaitingSuccess = mContainer.findViewById(R.id.waitingSuccess);
         mWaitingMessage = (TextView) mContainer.findViewById(R.id.waitingMessage);
 
-        mEditButton = (Button) mContainer.findViewById(R.id.editButton);
-        mEditButton.setOnClickListener(this);
-
-        mPayButton = (Button) mContainer.findViewById(R.id.payButton);
-        mPayButton.setOnClickListener(this);
-
         mCloseButton = mContainer.findViewById(R.id.close_button);
         mCloseButton.setOnClickListener(this);
 
-        mOrderSummaryLabel = mContainer.findViewById(R.id.orderSummaryLabel);
-        mOrderSummary = (ViewGroup) mContainer.findViewById(R.id.lineItems);
-        mOrderSummaryLabel.setOnClickListener(this);
-        mOrderSummary.setOnClickListener(this);
+        // Set up the buttons.
+        mPayButton = DualControlLayout.createButtonForLayout(
+                activity, true, activity.getString(R.string.payments_pay_button), this);
+        mEditButton = DualControlLayout.createButtonForLayout(
+                activity, false, activity.getString(R.string.payments_edit_button), this);
+        mButtonBar = (DualControlLayout) mContainer.findViewById(R.id.buttonBar);
+        mButtonBar.setAlignment(DualControlLayout.ALIGN_END);
+        mButtonBar.setStackedMargin(activity.getResources().getDimensionPixelSize(
+                R.dimen.infobar_margin_between_stacked_buttons));
+        mButtonBar.addView(mPayButton);
+        mButtonBar.addView(mEditButton);
 
-        mShippingSummaryLabel = mContainer.findViewById(R.id.shippingSummaryLabel);
-        mShippingSummary = mContainer.findViewById(R.id.shippingSummary);
-        mShippingSummaryAddress = (TextView) mContainer.findViewById(R.id.shippingSummaryAddress);
-        mShippingSummaryOption = (TextView) mContainer.findViewById(R.id.shippingSummaryOption);
-        mShippingSummarySeparator = mContainer.findViewById(R.id.shippingSummarySeparator);
+        // Create all the possible sections.
+        mSectionSeparators = new ArrayList<SectionSeparator>();
+        mPaymentContainerLayout = (ViewGroup) mContainer.findViewById(R.id.paymentContainerLayout);
+        mOrderSummarySection = new LineItemBreakdownSection(activity,
+                activity.getString(R.string.payments_order_summary_label), this);
+        mShippingSummarySection = new ExtraTextSection(activity,
+                activity.getString(R.string.payments_shipping_summary_label), this);
+        mShippingAddressSection = new OptionSection(activity,
+                activity.getString(R.string.payments_shipping_address_label),
+                activity.getString(R.string.payments_select_shipping_address_prompt), this);
+        mShippingOptionSection = new OptionSection(activity,
+                activity.getString(R.string.payments_shipping_option_label),
+                activity.getString(R.string.payments_select_shipping_option_prompt), this);
+        mPaymentMethodSection = new OptionSection(activity,
+                activity.getString(R.string.payments_method_of_payment_label), null, this);
 
-        mShippingAddressesLabel = mContainer.findViewById(R.id.shippingAddressesLabel);
-        mShippingAddresses = (ViewGroup) mContainer.findViewById(R.id.shippingAddresses);
-        mShippingAddressesSeparator = mContainer.findViewById(R.id.shippingAddressesSeparator);
-
-        mShippingOptionsLabel = mContainer.findViewById(R.id.shippingOptionsLabel);
-        mSelectShippingOptionPrompt = mContainer.findViewById(R.id.selectShippingOptionPrompt);
-        mShippingOptions = (ViewGroup) mContainer.findViewById(R.id.shippingOptions);
-        mShippingOptionsSeparator = mContainer.findViewById(R.id.shippingOptionsSeparator);
-
+        // Add the necessary sections to the layout.
+        mPaymentContainerLayout.addView(mOrderSummarySection, new LinearLayout.LayoutParams(
+                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
+        mSectionSeparators.add(new SectionSeparator(mPaymentContainerLayout));
         if (mRequestShipping) {
-            mShippingSummaryLabel.setOnClickListener(this);
-            mShippingSummaryAddress.setOnClickListener(this);
-            mShippingAddressesLabel.setOnClickListener(this);
-            mShippingAddresses.setOnClickListener(this);
-            mShippingSummaryOption.setOnClickListener(this);
-            mShippingOptionsLabel.setOnClickListener(this);
-            mSelectShippingOptionPrompt.setOnClickListener(this);
-            mShippingOptions.setOnClickListener(this);
-        } else {
-            mShippingSummaryLabel.setVisibility(View.GONE);
-            mShippingSummary.setVisibility(View.GONE);
-            mShippingSummarySeparator.setVisibility(View.GONE);
+            // The shipping breakout sections are only added if they are needed.
+            mPaymentContainerLayout.addView(mShippingSummarySection, new LinearLayout.LayoutParams(
+                    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
+            mSectionSeparators.add(new SectionSeparator(mPaymentContainerLayout));
         }
+        mPaymentContainerLayout.addView(mPaymentMethodSection, new LinearLayout.LayoutParams(
+                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
 
-        mPaymentMethodsLabel = mContainer.findViewById(R.id.paymentsListLabel);
-        mPaymentMethods = (ViewGroup) mContainer.findViewById(R.id.paymentsList);
-        mPaymentMethodsLabel.setOnClickListener(this);
-        mPaymentMethods.setOnClickListener(this);
-
+        // Set up the dialog.
         mDialog = new AlwaysDismissedDialog(activity, R.style.DialogWhenLarge);
         mDialog.setOnDismissListener(this);
         mDialog.addContentView(
@@ -240,37 +229,37 @@
         mClient.getDefaultPaymentInformation(new Callback<PaymentInformation>() {
             @Override
             public void onResult(PaymentInformation result) {
-                updateLineItems(result.getLineItems());
+                updateOrderSummarySection(result.getLineItems());
 
                 if (mRequestShipping) {
-                    mShippingAddressesSection = result.getShippingAddresses();
-                    mShippingOptionsSection = result.getShippingOptions();
+                    updateShippingAddressSection(result.getShippingAddresses());
+                    updateShippingOptionsSection(result.getShippingOptions());
 
-                    String selectedAddressLabel = result.getSelectedShippingAddressLabel();
+                    String selectedShippingAddress = result.getSelectedShippingAddressLabel();
+                    String selectedShippingName = result.getSelectedShippingAddressSublabel();
                     String selectedShippingOptionLabel = result.getSelectedShippingOptionLabel();
-                    if (selectedAddressLabel == null && selectedShippingOptionLabel == null) {
-                        mShippingSummaryAddress.setText(mContext.getString(
-                                R.string.payments_select_shipping_prompt));
+                    if (selectedShippingAddress == null && selectedShippingOptionLabel == null) {
+                        mShippingSummarySection.setSummaryText(mContext.getString(
+                                R.string.payments_select_shipping_prompt), null);
+                        mShippingSummarySection.setSummaryProperties(null, false, null, false);
                     } else {
-                        if (selectedAddressLabel == null) {
-                            mShippingSummaryAddress.setText(mContext.getString(
-                                    R.string.payments_select_shipping_address_prompt));
-                        } else {
-                            mShippingSummaryAddress.setText(selectedAddressLabel);
-                        }
+                        // Show the shipping address and the name in the summary section.
+                        mShippingSummarySection.setSummaryText(selectedShippingAddress == null
+                                ? mContext.getString(
+                                        R.string.payments_select_shipping_address_prompt)
+                                : selectedShippingAddress, selectedShippingName);
+                        mShippingSummarySection.setSummaryProperties(
+                                TruncateAt.MIDDLE, true, null, true);
 
-                        if (selectedShippingOptionLabel == null) {
-                            mShippingSummaryOption.setText(mContext.getString(
-                                    R.string.payments_select_shipping_option_prompt));
-                        } else {
-                            mShippingSummaryOption.setText(selectedShippingOptionLabel);
-                        }
+                        // Indicate the shipping option below the address.
+                        mShippingSummarySection.setExtraText(selectedShippingOptionLabel == null
+                                ? mContext.getString(
+                                        R.string.payments_select_shipping_option_prompt)
+                                : selectedShippingOptionLabel);
                     }
                 }
 
-                mPaymentMethodsSection = result.getPaymentMethods();
-                updateSection(mPaymentMethods, mPaymentMethodsSection, null);
-
+                updatePaymentMethodSection(result.getPaymentMethods());
                 updatePayButtonEnabled();
             }
         });
@@ -335,34 +324,20 @@
      *
      * @param lineItems The full bill. The last line item is the total.
      */
-    public void updateLineItems(List<LineItem> lineItems) {
+    public void updateOrderSummarySection(List<LineItem> lineItems) {
         mLineItems = lineItems;
-        mOrderSummary.removeAllViews();
 
         if (mLineItems == null || mLineItems.isEmpty()) {
-            mOrderSummary.setVisibility(View.GONE);
-            return;
-        }
-
-        mOrderSummary.setVisibility(View.VISIBLE);
-
-        LineItem total = lineItems.get(lineItems.size() - 1);
-        mOrderSummary.addView(buildLineItem(total));
-
-        if (mSelectedSection != mOrderSummary) return;
-
-        for (int i = 0; i < lineItems.size() - 1; i++) {
-            mOrderSummary.addView(buildLineItem(lineItems.get(i)));
+            mOrderSummarySection.setVisibility(View.GONE);
+        } else {
+            mOrderSummarySection.setVisibility(View.VISIBLE);
+            mOrderSummarySection.update(lineItems);
         }
     }
 
-    private ViewGroup buildLineItem(LineItem item) {
-        ViewGroup line =
-                (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.payment_line_item, null);
-        ((TextView) line.findViewById(R.id.lineItemLabel)).setText(item.getLabel());
-        ((TextView) line.findViewById(R.id.lineItemCurrencyCode)).setText(item.getCurrency());
-        ((TextView) line.findViewById(R.id.lineItemPrice)).setText(item.getPrice());
-        return line;
+    public void updateShippingAddressSection(SectionInformation section) {
+        mShippingAddressSectionInformation = section;
+        mShippingAddressSection.update(section);
     }
 
     /**
@@ -370,109 +345,30 @@
      *
      * @param shipping The shipping options.
      */
-    public void updateShippingOptions(SectionInformation section) {
-        mShippingOptionsSection = section;
-        updateSection(mShippingOptions, mShippingOptionsSection, mSelectShippingOptionPrompt);
+    public void updateShippingOptionsSection(SectionInformation section) {
+        mShippingOptionsSectionInformation = section;
+        mShippingOptionSection.update(section);
     }
 
-    /**
-     * Selects or deselects the given section. Possible sections are: shipping address, shipping
-     * options, and payment methods.
-     *
-     * A selected section lists out all options as radio buttons.
-     *
-     * A deselected section shows the currently selected option without radio buttons. If there's no
-     * currently selected option, then selectOptionPrompt is displayed instead. This is important
-     * for shipping options. If the merchant provides multiple shipping options, then there will be
-     * no shipping option selected by default.
-     *
-     * @param sectionContainer The container for all UI elements of this section.
-     * @param section The model that contains all options and specifies the currently selected
-     *                option.
-     *  @param selectOptionPrompt The view to show if no option is selected. If null, then nothing
-     *                            is shown.
-     */
-    private void updateSection(
-            ViewGroup sectionContainer, final SectionInformation section, View selectOptionPrompt) {
-        sectionContainer.removeAllViews();
-        if (section == null) {
-            sectionContainer.setVisibility(View.GONE);
-            return;
-        }
-
-        sectionContainer.setVisibility(View.VISIBLE);
-
-        PaymentOption selectedItem = section.getSelectedItem();
-        if (mSelectedSection != sectionContainer && selectedItem == null) {
-            if (selectOptionPrompt != null) selectOptionPrompt.setVisibility(View.VISIBLE);
-            return;
-        }
-
-        if (selectOptionPrompt != null) selectOptionPrompt.setVisibility(View.GONE);
-
-        if (mSelectedSection != sectionContainer && selectedItem != null) {
-            OptionLine line = new OptionLine(mContext, selectedItem);
-            sectionContainer.addView(line.container);
-            return;
-        }
-
-        if (section.isEmpty()) return;
-
-        final OptionLine[] lines = new OptionLine[section.getSize()];
-        for (int i = 0; i < lines.length; i++) {
-            lines[i] = new OptionLine(mContext, section.getItem(i));
-            lines[i].radioButton.setVisibility(mSelectedSection == sectionContainer
-                    ? View.VISIBLE : View.GONE);
-            lines[i].radioButton.setChecked(i == section.getSelectedItemIndex());
-            lines[i].container.setClickable(true);
-            lines[i].container.setTag(new OptionLineTag(section, lines, i));
-            lines[i].container.setOnClickListener(this);
-            sectionContainer.addView(lines[i].container);
-        }
+    private void updatePaymentMethodSection(SectionInformation section) {
+        mPaymentMethodSectionInformation = section;
+        mPaymentMethodSection.update(section);
     }
 
-    private static class OptionLine {
-        public ViewGroup container;
-        public RadioButton radioButton;
-
-        public OptionLine(Context context, PaymentOption option) {
-            container = (ViewGroup) LayoutInflater.from(context).inflate(
-                    R.layout.payment_option_line, null);
-            radioButton = (RadioButton) container.findViewById(R.id.optionRadioButton);
-
-            ((TextView) container.findViewById(R.id.optionLabel)).setText(option.getLabel());
-            ((TextView) container.findViewById(R.id.optionSubLabel)).setText(option.getSublabel());
-
-            if (option.getDrawableIconId() != PaymentOption.NO_ICON) {
-                ((ImageView) container.findViewById(R.id.optionIcon))
-                        .setImageResource(option.getDrawableIconId());
-            }
-        }
-    }
-
-    private static class OptionLineTag {
-        private final SectionInformation mSection;
-        private final OptionLine[] mOptionLines;
-        private final int mThisLineIndex;
-
-        public OptionLineTag(SectionInformation section, OptionLine[] lines, int index) {
-            mSection = section;
-            mOptionLines = lines;
-            mThisLineIndex = index;
+    @Override
+    public void onPaymentOptionChanged(OptionSection section, PaymentOption option) {
+        if (section == mShippingAddressSection) {
+            mShippingAddressSectionInformation.setSelectedItem(option);
+            mClient.onShippingAddressChanged(option);
+        } else if (section == mShippingOptionSection) {
+            mShippingOptionsSectionInformation.setSelectedItem(option);
+            mClient.onShippingOptionChanged(option);
+        } else if (section == mPaymentMethodSection) {
+            mPaymentMethodSectionInformation.setSelectedItem(option);
+            mClient.onPaymentMethodChanged(option);
         }
 
-        public void selectOptionLine() {
-            mSection.setSelectedItemIndex(mThisLineIndex);
-            mOptionLines[mThisLineIndex].radioButton.setChecked(true);
-            for (int i = 0; i < mOptionLines.length; i++) {
-                if (i == mThisLineIndex) continue;
-                mOptionLines[i].radioButton.setChecked(false);
-            }
-        }
-
-        public SectionInformation getSection() {
-            return mSection;
-        }
+        updatePayButtonEnabled();
     }
 
     /**
@@ -480,16 +376,14 @@
      */
     @Override
     public void onClick(View v) {
-        if (v == mOrderSummaryLabel || v == mOrderSummary) {
-            expand(mOrderSummaryLabel, mOrderSummary);
-        } else if (v == mShippingSummaryLabel || v == mShippingSummaryAddress
-                || v == mShippingAddressesLabel || v == mShippingAddresses) {
-            expand(mShippingAddressesLabel, mShippingAddresses);
-        } else if (v == mShippingSummaryOption || v == mShippingOptionsLabel
-                || v == mShippingOptions || v == mSelectShippingOptionPrompt) {
-            expand(mShippingOptionsLabel, mShippingOptions);
-        } else if (v == mPaymentMethodsLabel || v == mPaymentMethods) {
-            expand(mPaymentMethodsLabel, mPaymentMethods);
+        if (v == mOrderSummarySection) {
+            expand(mOrderSummarySection);
+        } else if (v == mShippingSummarySection || v == mShippingAddressSection) {
+            expand(mShippingAddressSection);
+        } else if (v == mShippingOptionSection) {
+            expand(mShippingOptionSection);
+        } else if (v == mPaymentMethodSection) {
+            expand(mPaymentMethodSection);
         } else if (v == mPayButton) {
             mPaymentContainer.setVisibility(View.GONE);
             mButtonBar.setVisibility(View.GONE);
@@ -500,31 +394,20 @@
                     ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
 
             mClient.onPayClicked(
-                    mShippingAddressesSection == null
-                            ? null : mShippingAddressesSection.getSelectedItem(),
-                    mShippingOptionsSection == null
-                            ? null : mShippingOptionsSection.getSelectedItem(),
-                    mPaymentMethodsSection.getSelectedItem());
+                    mShippingAddressSectionInformation == null
+                            ? null : mShippingAddressSectionInformation.getSelectedItem(),
+                    mShippingOptionsSectionInformation == null
+                            ? null : mShippingOptionsSectionInformation.getSelectedItem(),
+                    mPaymentMethodSectionInformation.getSelectedItem());
         } else if (v == mEditButton) {
             if (mSelectedSection == null) {
-                expand(mOrderSummaryLabel, mOrderSummary);
+                expand(mOrderSummarySection);
             } else {
                 mDialog.dismiss();
             }
         } else if (v == mCloseButton) {
             mDialog.dismiss();
             return;
-        } else if (v.getTag() != null && v.getTag() instanceof OptionLineTag) {
-            OptionLineTag tag = (OptionLineTag) v.getTag();
-            tag.selectOptionLine();
-
-            if (tag.getSection() == mShippingAddressesSection) {
-                mClient.onShippingAddressChanged(tag.getSection().getSelectedItem());
-            } else if (tag.getSection() == mShippingOptionsSection) {
-                mClient.onShippingOptionChanged(tag.getSection().getSelectedItem());
-            } else if (tag.getSection() == mPaymentMethodsSection) {
-                mClient.onPaymentMethodChanged(tag.getSection().getSelectedItem());
-            }
         }
 
         updatePayButtonEnabled();
@@ -532,107 +415,91 @@
 
     private void updatePayButtonEnabled() {
         if (mRequestShipping) {
-            mPayButton.setEnabled(mShippingAddressesSection != null
-                    && mShippingAddressesSection.getSelectedItem() != null
-                    && mShippingOptionsSection != null
-                    && mShippingOptionsSection.getSelectedItem() != null
-                    && mPaymentMethodsSection != null
-                    && mPaymentMethodsSection.getSelectedItem() != null);
+            mPayButton.setEnabled(mShippingAddressSectionInformation != null
+                    && mShippingAddressSectionInformation.getSelectedItem() != null
+                    && mShippingOptionsSectionInformation != null
+                    && mShippingOptionsSectionInformation.getSelectedItem() != null
+                    && mPaymentMethodSectionInformation != null
+                    && mPaymentMethodSectionInformation.getSelectedItem() != null);
         } else {
-            mPayButton.setEnabled(mPaymentMethodsSection != null
-                    && mPaymentMethodsSection.getSelectedItem() != null);
+            mPayButton.setEnabled(mPaymentMethodSectionInformation != null
+                    && mPaymentMethodSectionInformation.getSelectedItem() != null);
         }
     }
 
-    private void expand(View sectionLabel, ViewGroup section) {
-        mEditButton.setText(mContext.getString(R.string.payments_cancel_button));
-        mDialog.getWindow().setLayout(
-                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
+    private void expand(ViewGroup section) {
+        if (!mIsShowingEditDialog) {
+            // Swap out Views that combine multiple fields with individual fields.
+            if (mRequestShipping && mShippingSummarySection.getParent() != null) {
+                int summaryIndex = mPaymentContainerLayout.indexOfChild(mShippingSummarySection);
+                mPaymentContainerLayout.removeView(mShippingSummarySection);
 
-        boolean isFirstExpansionWithShipping =
-                mRequestShipping && mShippingSummaryLabel.getVisibility() != View.GONE;
-        if (isFirstExpansionWithShipping) {
-            mShippingSummaryLabel.setVisibility(View.GONE);
-            mShippingSummary.setVisibility(View.GONE);
-            mShippingSummarySeparator.setVisibility(View.GONE);
+                mPaymentContainerLayout.addView(mShippingAddressSection, summaryIndex,
+                        new LinearLayout.LayoutParams(
+                                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
+                mSectionSeparators.add(
+                        new SectionSeparator(mPaymentContainerLayout, summaryIndex + 1));
+                mPaymentContainerLayout.addView(mShippingOptionSection, summaryIndex + 2,
+                        new LinearLayout.LayoutParams(
+                                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
+            }
 
-            mShippingAddressesLabel.setVisibility(View.VISIBLE);
-            mShippingAddresses.setVisibility(View.VISIBLE);
-            mShippingAddressesSeparator.setVisibility(View.VISIBLE);
+            // Expand all the dividers.
+            for (int i = 0; i < mSectionSeparators.size(); i++) mSectionSeparators.get(i).expand();
+            mPaymentContainerLayout.requestLayout();
 
-            mShippingOptionsLabel.setVisibility(View.VISIBLE);
-            mSelectShippingOptionPrompt.setVisibility(View.VISIBLE);
-            mShippingOptions.setVisibility(View.VISIBLE);
-            mShippingOptionsSeparator.setVisibility(View.VISIBLE);
+            // Switch the 'edit' button to a 'cancel' button.
+            mEditButton.setText(mContext.getString(R.string.payments_cancel_button));
+
+            // Make the dialog take the whole screen.
+            mDialog.getWindow().setLayout(
+                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
+            mIsShowingEditDialog = true;
         }
 
-        if (mSelectedSectionLabel != null) {
-            mSelectedSectionLabel.setBackgroundColor(Color.WHITE);
-            mSelectedSectionLabel.setClickable(true);
-        }
+        // Update the display status of each expandable section.
+        mOrderSummarySection.setDisplayMode(section == mOrderSummarySection
+                ? PaymentRequestSection.DISPLAY_MODE_FOCUSED
+                : PaymentRequestSection.DISPLAY_MODE_EXPANDABLE);
+        mShippingAddressSection.setDisplayMode(section == mShippingAddressSection
+                ? PaymentRequestSection.DISPLAY_MODE_FOCUSED
+                : PaymentRequestSection.DISPLAY_MODE_EXPANDABLE);
+        mShippingOptionSection.setDisplayMode(section == mShippingOptionSection
+                ? PaymentRequestSection.DISPLAY_MODE_FOCUSED
+                : PaymentRequestSection.DISPLAY_MODE_EXPANDABLE);
+        mPaymentMethodSection.setDisplayMode(section == mPaymentMethodSection
+                ? PaymentRequestSection.DISPLAY_MODE_FOCUSED
+                : PaymentRequestSection.DISPLAY_MODE_EXPANDABLE);
 
-        if (mSelectedSection != null) {
-            mSelectedSection.setBackgroundColor(Color.WHITE);
-            mSelectedSection.setClickable(true);
-        }
-
-        int defaultPrimaryColor = ContextCompat.getColor(mContext, R.color.default_primary_color);
-
-        sectionLabel.setBackgroundColor(defaultPrimaryColor);
-        sectionLabel.setClickable(false);
-
-        section.setBackgroundColor(defaultPrimaryColor);
-        section.setClickable(false);
-
-        ViewGroup noLongerSelectedSection = mSelectedSection;
-        mSelectedSectionLabel = sectionLabel;
+        // Update the section contents when they're selected.
         mSelectedSection = section;
-
-        if (noLongerSelectedSection == mOrderSummary) {
-            updateLineItems(mLineItems);
-        }
-        if (noLongerSelectedSection == mShippingAddresses
-                || (isFirstExpansionWithShipping && mSelectedSection != mShippingAddresses)) {
-            updateSection(mShippingAddresses, mShippingAddressesSection, null);
-        }
-        if (noLongerSelectedSection == mShippingOptions
-                || (isFirstExpansionWithShipping && mSelectedSection != mShippingOptions)) {
-            updateSection(mShippingOptions, mShippingOptionsSection, mSelectShippingOptionPrompt);
-        }
-        if (noLongerSelectedSection == mPaymentMethods) {
-            updateSection(mPaymentMethods, mPaymentMethodsSection, null);
-        }
-
-        if (mSelectedSection == mOrderSummary) {
+        assert mSelectedSection != mShippingSummarySection;
+        if (mSelectedSection == mOrderSummarySection) {
             mClient.getLineItems(new Callback<List<LineItem>>() {
                 @Override
                 public void onResult(List<LineItem> result) {
-                    updateLineItems(result);
+                    updateOrderSummarySection(result);
                 }
             });
-        } else if (mSelectedSection == mShippingAddresses) {
+        } else if (mSelectedSection == mShippingAddressSection) {
             mClient.getShippingAddresses(new Callback<SectionInformation>() {
                 @Override
                 public void onResult(SectionInformation result) {
-                    mShippingAddressesSection = result;
-                    updateSection(mShippingAddresses, mShippingAddressesSection, null);
+                    updateShippingAddressSection(result);
                 }
             });
-        } else if (mSelectedSection == mShippingOptions) {
+        } else if (mSelectedSection == mShippingOptionSection) {
             mClient.getShippingOptions(new Callback<SectionInformation>() {
                 @Override
                 public void onResult(SectionInformation result) {
-                    mShippingOptionsSection = result;
-                    updateSection(
-                            mShippingOptions, mShippingOptionsSection, mSelectShippingOptionPrompt);
+                    updateShippingOptionsSection(result);
                 }
             });
-        } else if (mSelectedSection == mPaymentMethods) {
+        } else if (mSelectedSection == mPaymentMethodSection) {
             mClient.getPaymentMethods(new Callback<SectionInformation>() {
                 @Override
                 public void onResult(SectionInformation result) {
-                    mPaymentMethodsSection = result;
-                    updateSection(mPaymentMethods, mPaymentMethodsSection, null);
+                    updatePaymentMethodSection(result);
                 }
             });
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
index faff43e..407addf1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
@@ -257,6 +257,13 @@
         return null;
     }
 
+    /**
+     * @return whether autoplay is enabled.
+     */
+    public boolean isAutoplayEnabled() {
+        return nativeGetAutoplayEnabled();
+    }
+
     public boolean isAcceptCookiesEnabled() {
         return nativeGetAcceptCookiesEnabled();
     }
@@ -808,6 +815,10 @@
         nativeSetAllowCookiesEnabled(allow);
     }
 
+    public void setAutoplayEnabled(boolean allow) {
+        nativeSetAutoplayEnabled(allow);
+    }
+
     public void setBlockThirdPartyCookiesEnabled(boolean enabled) {
         nativeSetBlockThirdPartyCookiesEnabled(enabled);
     }
@@ -1051,6 +1062,7 @@
 
     private native boolean nativeGetAcceptCookiesEnabled();
     private native boolean nativeGetAcceptCookiesManaged();
+    private native boolean nativeGetAutoplayEnabled();
     private native boolean nativeGetBackgroundSyncEnabled();
     private native boolean nativeGetBlockThirdPartyCookiesEnabled();
     private native boolean nativeGetBlockThirdPartyCookiesManaged();
@@ -1100,6 +1112,7 @@
             OtherFormsOfBrowsingHistoryListener listener);
     private native boolean nativeCanDeleteBrowsingHistory();
     private static native void nativeFetchImportantSites(ImportantSitesCallback callback);
+    private native void nativeSetAutoplayEnabled(boolean allow);
     private native void nativeSetAllowCookiesEnabled(boolean allow);
     private native void nativeSetBackgroundSyncEnabled(boolean allow);
     private native void nativeSetBlockThirdPartyCookiesEnabled(boolean enabled);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingsResources.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingsResources.java
index f25a59c2..e3100c13 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingsResources.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingsResources.java
@@ -87,6 +87,17 @@
         ThreadUtils.assertOnUiThread();
         if (sResourceInfo == null) {
             Map<Integer, ResourceItem> localMap = new HashMap<Integer, ResourceItem>();
+            localMap.put(ContentSettingsType.CONTENT_SETTINGS_TYPE_AUTOPLAY,
+                    new ResourceItem(R.drawable.settings_autoplay, R.string.autoplay_title,
+                                 R.string.autoplay_title, ContentSetting.ALLOW,
+                                 ContentSetting.BLOCK,
+                                 R.string.website_settings_category_autoplay_allowed, 0));
+            localMap.put(ContentSettingsType.CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC,
+                    new ResourceItem(R.drawable.permission_background_sync,
+                                 R.string.background_sync_permission_title,
+                                 R.string.background_sync_permission_title, ContentSetting.ALLOW,
+                                 ContentSetting.BLOCK,
+                                 R.string.website_settings_category_allowed_recommended, 0));
             localMap.put(ContentSettingsType.CONTENT_SETTINGS_TYPE_COOKIES,
                     new ResourceItem(R.drawable.permission_cookie, R.string.cookies_title,
                                  R.string.cookies_title, ContentSetting.ALLOW, ContentSetting.BLOCK,
@@ -109,6 +120,12 @@
                                  R.string.javascript_permission_title, ContentSetting.ALLOW,
                                  ContentSetting.BLOCK,
                                  R.string.website_settings_category_allowed_recommended, 0));
+            localMap.put(ContentSettingsType.CONTENT_SETTINGS_TYPE_KEYGEN,
+                    new ResourceItem(R.drawable.permission_keygen,
+                                 R.string.keygen_permission_title,
+                                 R.string.keygen_permission_title, ContentSetting.ALLOW,
+                                 ContentSetting.BLOCK,
+                                 0, R.string.website_settings_category_blocked_recommended));
             localMap.put(
                     ContentSettingsType.CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
                     new ResourceItem(R.drawable.permission_camera,
@@ -139,18 +156,6 @@
                                  org.chromium.chrome.R.string.protected_content,
                                  org.chromium.chrome.R.string.protected_content,
                                  ContentSetting.ASK, ContentSetting.BLOCK, 0, 0));
-            localMap.put(ContentSettingsType.CONTENT_SETTINGS_TYPE_KEYGEN,
-                    new ResourceItem(R.drawable.permission_keygen,
-                                 R.string.keygen_permission_title,
-                                 R.string.keygen_permission_title, ContentSetting.ALLOW,
-                                 ContentSetting.BLOCK,
-                                 0, R.string.website_settings_category_blocked_recommended));
-            localMap.put(ContentSettingsType.CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC,
-                    new ResourceItem(R.drawable.permission_background_sync,
-                                 R.string.background_sync_permission_title,
-                                 R.string.background_sync_permission_title, ContentSetting.ALLOW,
-                                 ContentSetting.BLOCK,
-                                 R.string.website_settings_category_allowed_recommended, 0));
             sResourceInfo = localMap;
         }
         return sResourceInfo;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java
index 3d9092f..d5dc057e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java
@@ -207,7 +207,9 @@
      */
     private boolean isOnBlockList(WebsitePreference website) {
         // This list is ordered alphabetically by permission.
-        if (mCategory.showBackgroundSyncSites()) {
+        if (mCategory.showAutoplaySites()) {
+            return website.site().getAutoplayPermission() == ContentSetting.BLOCK;
+        } else if (mCategory.showBackgroundSyncSites()) {
             return website.site().getBackgroundSyncPermission() == ContentSetting.BLOCK;
         } else if (mCategory.showCameraSites()) {
             return website.site().getCameraPermission() == ContentSetting.BLOCK;
@@ -396,7 +398,9 @@
         if (READ_WRITE_TOGGLE_KEY.equals(preference.getKey())) {
             if (mCategory.isManaged()) return false;
 
-            if (mCategory.showBackgroundSyncSites()) {
+            if (mCategory.showAutoplaySites()) {
+                PrefServiceBridge.getInstance().setAutoplayEnabled((boolean) newValue);
+            } else if (mCategory.showBackgroundSyncSites()) {
                 PrefServiceBridge.getInstance().setBackgroundSyncEnabled((boolean) newValue);
             } else if (mCategory.showCameraSites()) {
                 PrefServiceBridge.getInstance().setCameraEnabled((boolean) newValue);
@@ -421,7 +425,8 @@
             }
 
             // Categories that support adding exceptions also manage the 'Add site' preference.
-            if (mCategory.showJavaScriptSites() || mCategory.showBackgroundSyncSites()) {
+            if (mCategory.showAutoplaySites() || mCategory.showBackgroundSyncSites()
+                    || mCategory.showJavaScriptSites()) {
                 if ((boolean) newValue) {
                     Preference addException = getPreferenceScreen().findPreference(
                             ADD_EXCEPTION_KEY);
@@ -448,10 +453,12 @@
 
     private String getAddExceptionDialogMessage() {
         int resource = 0;
-        if (mCategory.showJavaScriptSites()) {
-            resource = R.string.website_settings_add_site_description_javascript;
+        if (mCategory.showAutoplaySites()) {
+            resource = R.string.website_settings_add_site_description_autoplay;
         } else if (mCategory.showBackgroundSyncSites()) {
             resource = R.string.website_settings_add_site_description_background_sync;
+        } else if (mCategory.showJavaScriptSites()) {
+            resource = R.string.website_settings_add_site_description_javascript;
         }
         assert resource > 0;
         return getResources().getString(resource);
@@ -503,7 +510,9 @@
 
         configureGlobalToggles();
 
-        if ((mCategory.showJavaScriptSites()
+        if ((mCategory.showAutoplaySites()
+                    && !PrefServiceBridge.getInstance().isAutoplayEnabled())
+                || (mCategory.showJavaScriptSites()
                     && !PrefServiceBridge.getInstance().javaScriptEnabled())
                 || (mCategory.showBackgroundSyncSites()
                            && !PrefServiceBridge.getInstance().isBackgroundSyncAllowed())) {
@@ -592,7 +601,10 @@
                 if (mCategory.isManaged() && !mCategory.isManagedByCustodian()) {
                     globalToggle.setIcon(R.drawable.controlled_setting_mandatory);
                 }
-                if (mCategory.showBackgroundSyncSites()) {
+                if (mCategory.showAutoplaySites()) {
+                    globalToggle.setChecked(
+                            PrefServiceBridge.getInstance().isAutoplayEnabled());
+                } else if (mCategory.showBackgroundSyncSites()) {
                     globalToggle.setChecked(
                             PrefServiceBridge.getInstance().isBackgroundSyncAllowed());
                 } else if (mCategory.showCameraSites()) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java
index f8f0b4a..a95e25b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java
@@ -70,6 +70,7 @@
     // Buttons:
     public static final String PREF_RESET_SITE = "reset_site_button";
     // Website permissions (if adding new, see hasPermissionsPreferences and resetSite below):
+    public static final String PREF_AUTOPLAY_PERMISSION = "autoplay_permission_list";
     public static final String PREF_BACKGROUND_SYNC_PERMISSION = "background_sync_permission_list";
     public static final String PREF_CAMERA_CAPTURE_PERMISSION = "camera_permission_list";
     public static final String PREF_COOKIES_PERMISSION = "cookies_permission_list";
@@ -87,6 +88,7 @@
     // All permissions from the permissions preference category must be listed here.
     // TODO(mvanouwerkerk): Use this array in more places to reduce verbosity.
     private static final String[] PERMISSION_PREFERENCE_KEYS = {
+            PREF_AUTOPLAY_PERMISSION,
             PREF_BACKGROUND_SYNC_PERMISSION,
             PREF_CAMERA_CAPTURE_PERMISSION,
             PREF_COOKIES_PERMISSION,
@@ -300,6 +302,8 @@
                 }
             } else if (PREF_RESET_SITE.equals(preference.getKey())) {
                 preference.setOnPreferenceClickListener(this);
+            } else if (PREF_AUTOPLAY_PERMISSION.equals(preference.getKey())) {
+                setUpListPreference(preference, mSite.getAutoplayPermission());
             } else if (PREF_BACKGROUND_SYNC_PERMISSION.equals(preference.getKey())) {
                 setUpListPreference(preference, mSite.getBackgroundSyncPermission());
             } else if (PREF_CAMERA_CAPTURE_PERMISSION.equals(preference.getKey())) {
@@ -529,6 +533,8 @@
 
     private int getContentSettingsTypeFromPreferenceKey(String preferenceKey) {
         switch (preferenceKey) {
+            case PREF_AUTOPLAY_PERMISSION:
+                return ContentSettingsType.CONTENT_SETTINGS_TYPE_AUTOPLAY;
             case PREF_BACKGROUND_SYNC_PERMISSION:
                 return ContentSettingsType.CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC;
             case PREF_CAMERA_CAPTURE_PERMISSION:
@@ -591,7 +597,9 @@
     @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         ContentSetting permission = ContentSetting.fromString((String) newValue);
-        if (PREF_BACKGROUND_SYNC_PERMISSION.equals(preference.getKey())) {
+        if (PREF_AUTOPLAY_PERMISSION.equals(preference.getKey())) {
+            mSite.setAutoplayPermission(permission);
+        } else if (PREF_BACKGROUND_SYNC_PERMISSION.equals(preference.getKey())) {
             mSite.setBackgroundSyncPermission(permission);
         } else if (PREF_CAMERA_CAPTURE_PERMISSION.equals(preference.getKey())) {
             mSite.setCameraPermission(permission);
@@ -654,6 +662,7 @@
         }
 
         // Clear the permissions.
+        mSite.setAutoplayPermission(ContentSetting.DEFAULT);
         mSite.setBackgroundSyncPermission(ContentSetting.DEFAULT);
         mSite.setCameraPermission(ContentSetting.DEFAULT);
         mSite.setCookiePermission(ContentSetting.DEFAULT);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsCategory.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsCategory.java
index 09aa543a..8f880eb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsCategory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsCategory.java
@@ -33,6 +33,7 @@
 public class SiteSettingsCategory {
     // Valid values for passing to fromString() in this class.
     public static final String CATEGORY_ALL_SITES = "all_sites";
+    public static final String CATEGORY_AUTOPLAY = "autoplay";
     public static final String CATEGORY_BACKGROUND_SYNC = "background_sync";
     public static final String CATEGORY_CAMERA = "camera";
     public static final String CATEGORY_COOKIES = "cookies";
@@ -80,6 +81,10 @@
         if (CATEGORY_ALL_SITES.equals(category)) {
             return new SiteSettingsCategory(CATEGORY_ALL_SITES, "", -1);
         }
+        if (CATEGORY_AUTOPLAY.equals(category)) {
+            return new SiteSettingsCategory(CATEGORY_AUTOPLAY, "",
+                    ContentSettingsType.CONTENT_SETTINGS_TYPE_AUTOPLAY);
+        }
         if (CATEGORY_BACKGROUND_SYNC.equals(category)) {
             return new SiteSettingsCategory(CATEGORY_BACKGROUND_SYNC, "",
                     ContentSettingsType.CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC);
@@ -136,6 +141,9 @@
      * fromString().
      */
     public static SiteSettingsCategory fromContentSettingsType(int contentSettingsType) {
+        if (contentSettingsType == ContentSettingsType.CONTENT_SETTINGS_TYPE_AUTOPLAY) {
+            return fromString(CATEGORY_AUTOPLAY);
+        }
         if (contentSettingsType == ContentSettingsType.CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC) {
             return fromString(CATEGORY_BACKGROUND_SYNC);
         }
@@ -186,6 +194,13 @@
     }
 
     /**
+     * Returns whether this category is the Autoplay category.
+     */
+    public boolean showAutoplaySites() {
+        return mContentSettingsType == ContentSettingsType.CONTENT_SETTINGS_TYPE_AUTOPLAY;
+    }
+
+    /**
      * Returns whether this category is the Background Sync category.
      */
     public boolean showBackgroundSyncSites() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
index 83f7f03..251d00c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
@@ -10,6 +10,7 @@
 import android.preference.Preference.OnPreferenceClickListener;
 import android.preference.PreferenceFragment;
 
+import org.chromium.base.FieldTrialList;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.preferences.LocationSettings;
@@ -28,6 +29,7 @@
         implements OnPreferenceClickListener {
     // The keys for each category shown on the Site Settings page.
     static final String ALL_SITES_KEY = "all_sites";
+    static final String AUTOPLAY_KEY = "autoplay";
     static final String BACKGROUND_SYNC_KEY = "background_sync";
     static final String CAMERA_KEY = "camera";
     static final String COOKIES_KEY = "cookies";
@@ -40,6 +42,8 @@
     static final String PROTECTED_CONTENT_KEY = "protected_content";
     static final String STORAGE_KEY = "use_storage";
 
+    boolean mAutoplayExperimentEnabled = false;
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -50,11 +54,20 @@
             getPreferenceScreen().removePreference(findPreference(PROTECTED_CONTENT_KEY));
         }
 
+        String autoplayTrialGroupName =
+                FieldTrialList.findFullName("MediaElementGestureOverrideExperiment");
+        mAutoplayExperimentEnabled = autoplayTrialGroupName.startsWith("Enabled");
+        if (!mAutoplayExperimentEnabled) {
+            getPreferenceScreen().removePreference(findPreference(AUTOPLAY_KEY));
+        }
+
         updatePreferenceStates();
     }
 
     private int keyToContentSettingsType(String key) {
-        if (BACKGROUND_SYNC_KEY.equals(key)) {
+        if (AUTOPLAY_KEY.equals(key)) {
+            return ContentSettingsType.CONTENT_SETTINGS_TYPE_AUTOPLAY;
+        } else if (BACKGROUND_SYNC_KEY.equals(key)) {
             return ContentSettingsType.CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC;
         } else if (CAMERA_KEY.equals(key)) {
             return ContentSettingsType.CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA;
@@ -87,6 +100,9 @@
         if (Build.VERSION.SDK_INT >= 19) {
             websitePrefs.add(PROTECTED_CONTENT_KEY);
         }
+        if (mAutoplayExperimentEnabled) {
+            websitePrefs.add(AUTOPLAY_KEY);
+        }
         websitePrefs.add(BACKGROUND_SYNC_KEY);
         websitePrefs.add(CAMERA_KEY);
         websitePrefs.add(COOKIES_KEY);
@@ -100,7 +116,9 @@
         for (String prefName : websitePrefs) {
             Preference p = findPreference(prefName);
             boolean checked = false;
-            if (BACKGROUND_SYNC_KEY.equals(prefName)) {
+            if (AUTOPLAY_KEY.equals(prefName)) {
+                checked = PrefServiceBridge.getInstance().isAutoplayEnabled();
+            } else if (BACKGROUND_SYNC_KEY.equals(prefName)) {
                 checked = PrefServiceBridge.getInstance().isBackgroundSyncAllowed();
             } else if (CAMERA_KEY.equals(prefName)) {
                 checked = PrefServiceBridge.getInstance().isCameraEnabled();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/Website.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/Website.java
index 09644bf..f871601 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/Website.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/Website.java
@@ -27,6 +27,7 @@
     private final String mTitle;
     private String mSummary;
 
+    private ContentSettingException mAutoplayExceptionInfo;
     private ContentSettingException mBackgroundSyncExceptionInfo;
     private CameraInfo mCameraInfo;
     private ContentSettingException mCookieException;
@@ -74,6 +75,29 @@
     }
 
     /**
+     * Returns what permission governs Autoplay access.
+     */
+    public ContentSetting getAutoplayPermission() {
+        return mAutoplayExceptionInfo != null ? mAutoplayExceptionInfo.getContentSetting() : null;
+    }
+
+    /**
+     * Configure Autoplay permission access setting for this site.
+     */
+    public void setAutoplayPermission(ContentSetting value) {
+        if (mAutoplayExceptionInfo != null) {
+            mAutoplayExceptionInfo.setContentSetting(value);
+        }
+    }
+
+    /**
+     * Sets the Autoplay exception info for this Website.
+     */
+    public void setAutoplayException(ContentSettingException exception) {
+        mAutoplayExceptionInfo = exception;
+    }
+
+    /**
      * Sets the background sync setting exception info for this website.
      */
     public void setBackgroundSyncException(ContentSettingException exception) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcher.java
index bbe3824..a465272 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcher.java
@@ -84,6 +84,8 @@
         queue.add(new MicrophoneCaptureInfoFetcher());
         // Background sync permission is per-origin.
         queue.add(new BackgroundSyncExceptionInfoFetcher());
+        // Autoplay permission is per-origin.
+        queue.add(new AutoplayInfoFetcher());
 
         queue.add(new PermissionsAvailableCallbackRunner());
 
@@ -139,6 +141,9 @@
         } else if (category.showProtectedMediaSites()) {
             // Protected media identifier permission is per-origin and per-embedder.
             queue.add(new ProtectedMediaIdentifierInfoFetcher());
+        } else if (category.showAutoplaySites()) {
+            // Autoplay permission is per-origin.
+            queue.add(new AutoplayInfoFetcher());
         }
         queue.add(new PermissionsAvailableCallbackRunner());
         queue.next();
@@ -198,6 +203,24 @@
         }
     }
 
+    private class AutoplayInfoFetcher extends Task {
+        @Override
+        public void run() {
+            for (ContentSettingException exception
+                    : WebsitePreferenceBridge.getContentSettingsExceptions(
+                            ContentSettingsType.CONTENT_SETTINGS_TYPE_AUTOPLAY)) {
+                // The pattern "*" represents the default setting, not a specific website.
+                if (exception.getPattern().equals("*")) continue;
+                WebsiteAddress address = WebsiteAddress.create(exception.getPattern());
+                if (address == null) continue;
+                Set<Website> sites = findOrCreateSitesByHost(address);
+                for (Website site : sites) {
+                    site.setAutoplayException(exception);
+                }
+            }
+        }
+    }
+
     private class GeolocationInfoFetcher extends Task {
         @Override
         public void run() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingApiBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingApiBridge.java
new file mode 100644
index 0000000..cd4668a
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingApiBridge.java
@@ -0,0 +1,67 @@
+// Copyright 2016 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.chrome.browser.safe_browsing;
+
+import android.content.Context;
+
+import org.chromium.base.Log;
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
+
+/**
+ * Helper for calling GMSCore Safe Browsing API from native code.
+ */
+@JNINamespace("safe_browsing")
+public final class SafeBrowsingApiBridge {
+    private static final String TAG = "SafeBrowsingApi";
+
+    private static Class<? extends SafeBrowsingApiHandler> sHandler;
+
+    private SafeBrowsingApiBridge() {
+        // Util class, do not instantiate.
+    }
+
+    /**
+     * Set the class-file for the implementation of SafeBrowsingApiHandler to use when the safe
+     * browsing api is invoked.
+     */
+    public static void setSafeBrowingHandlerType(Class<? extends SafeBrowsingApiHandler> handler) {
+        sHandler = handler;
+    }
+
+    /**
+     * Create a SafeBrowsingApiHandler obj and initialize its client, if supported.
+     * Should be called on IO thread.
+     *
+     * @return the handler if it's usable, or null if the API is not supported.
+     */
+    @CalledByNative
+    private static SafeBrowsingApiHandler create(Context context) {
+        SafeBrowsingApiHandler handler;
+        try {
+            handler = sHandler.newInstance();
+        } catch (NullPointerException | InstantiationException | IllegalAccessException e) {
+            Log.e(TAG, "Failed to init handler: " + e.getMessage());
+            return null;
+        }
+        boolean initSuccesssful = handler.init(context, new SafeBrowsingApiHandler.Observer() {
+            @Override
+            public void onUrlCheckDone(long callbackId, int resultStatus, String metadata) {
+                nativeOnUrlCheckDone(callbackId, resultStatus, metadata);
+            }
+        });
+        return initSuccesssful ? handler : null;
+    }
+
+    @CalledByNative
+    private static void startUriLookup(SafeBrowsingApiHandler handler, long callbackId,
+            String uri, int[] threatsOfInterest) {
+        handler.startUriLookup(callbackId, uri, threatsOfInterest);
+        Log.d(TAG, "Done starting request");
+    }
+
+    private static native void nativeOnUrlCheckDone(
+            long callbackId, int resultStatus, String metadata);
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingApiHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingApiHandler.java
new file mode 100644
index 0000000..6909946
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingApiHandler.java
@@ -0,0 +1,53 @@
+// Copyright 2016 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.chrome.browser.safe_browsing;
+
+import android.content.Context;
+import android.support.annotation.IntDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Java interface that a SafeBrowsingApiHander must implement when used with
+ * {@code SafeBrowsignApiBridge}
+ */
+public interface SafeBrowsingApiHandler {
+    // Implementors must provide a no-arg constructor to be instantiated via reflection.
+
+    /**
+     * Observer to be notified when the SafeBrowsingApiHandler determines the verdict for a url.
+     */
+    public interface Observer {
+        void onUrlCheckDone(long callbackId, @SafeBrowsingResult int resultStatus, String metadata);
+    }
+
+    // Possible values for resultStatus. Native side has the same definitions.
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({
+            STATUS_INTERNAL_ERROR,
+            STATUS_SUCCESS,
+            STATUS_TIMEOUT
+    })
+    @interface SafeBrowsingResult {}
+    static final int STATUS_INTERNAL_ERROR = -1;
+    static final int STATUS_SUCCESS = 0;
+    static final int STATUS_TIMEOUT = 1;
+
+
+    /**
+     * Verifies that SafeBrowsingApiHandler can operate and initializes if feasible.
+     * Should be called on IO thread.
+     *
+     * @return the handler if it's usable, or null if the API is not supported.
+     */
+    public boolean init(Context context, Observer result);
+
+    /**
+     * Start a URI-lookup to determine if it matches one of the specified threats.
+     * This is called on every URL resource Chrome loads, on the IO thread.
+     */
+    public void startUriLookup(long callbackId, String uri, int[] threatsOfInterest);
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninChooseView.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninChooseView.java
index dc6f53f..d789d537 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninChooseView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninChooseView.java
@@ -114,12 +114,14 @@
             view.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
-                    v.findViewById(R.id.account_selection_mark).setVisibility(View.VISIBLE);
+                    int indexOfClickedAccount =
+                            mRootChildView.indexOfChild(v) - mAccountViewStartIndex;
+                    if (indexOfClickedAccount == mSelectedAccountPosition) return;
                     mRootChildView.getChildAt(mSelectedAccountPosition + mAccountViewStartIndex)
                             .findViewById(R.id.account_selection_mark)
                             .setVisibility(View.GONE);
-                    mSelectedAccountPosition =
-                            mRootChildView.indexOfChild(v) - mAccountViewStartIndex;
+                    v.findViewById(R.id.account_selection_mark).setVisibility(View.VISIBLE);
+                    mSelectedAccountPosition = indexOfClickedAccount;
                 }
             });
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
index a7f51d09..31b362f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
@@ -366,11 +366,9 @@
         mTitleBar.setTextColor(titleTextColor);
 
         if (getProgressBar() != null) {
-            if (!mUseDarkColors) {
-                getProgressBar().setBackgroundColor(ColorUtils
-                        .getLightProgressbarBackground(getToolbarDataProvider().getPrimaryColor()));
-                getProgressBar().setForegroundColor(ApiCompatibilityUtils.getColor(resources,
-                        R.color.progress_bar_foreground_white));
+            if (!ColorUtils.isUsingDefaultToolbarColor(getResources(),
+                    getBackground().getColor())) {
+                getProgressBar().setThemeColor(getBackground().getColor(), false);
             } else {
                 getProgressBar().setBackgroundColor(ApiCompatibilityUtils.getColor(resources,
                         R.color.progress_bar_background));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java
index c5f81d5..9bab767 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java
@@ -1346,11 +1346,7 @@
         enterAnimation.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator animation) {
-                // The Android framework calls onAnimationEnd() on listeners before
-                // Animator#isRunning() returns false (see crbug.com/606419). In order for
-                // ToolbarPhone#isTabSwitcherAnimationRunning() to return the correct value,
-                // set mTabSwitcherModeAnimation = null here.
-                mTabSwitcherModeAnimation = null;
+                onTabSwitcherModeAnimationEnd();
                 // This is to deal with the view going invisible when resuming the activity and
                 // running this animation.  The view is still there and clickable but does not
                 // render and only a layout triggers a refresh.  See crbug.com/306890.
@@ -1372,11 +1368,7 @@
         exitAnimation.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator animation) {
-                // The Android framework calls onAnimationEnd() on listeners before
-                // Animator#isRunning() returns false (see crbug.com/606419). In order for
-                // ToolbarPhone#isTabSwitcherAnimationRunning() to return the correct value,
-                // set mTabSwitcherModeAnimation = null here.
-                mTabSwitcherModeAnimation = null;
+                onTabSwitcherModeAnimationEnd();
                 updateViewsForTabSwitcherMode(mIsInTabSwitcherMode);
             }
         });
@@ -1384,6 +1376,20 @@
         return exitAnimation;
     }
 
+    private void onTabSwitcherModeAnimationEnd() {
+        // The Android framework calls onAnimationEnd() on listeners before
+        // Animator#isRunning() returns false (see crbug.com/606419). In order for
+        // ToolbarPhone#isTabSwitcherAnimationRunning() to return the correct value,
+        // set mTabSwitcherModeAnimation = null here.
+        mTabSwitcherModeAnimation = null;
+
+        // Set the alpha to the final tab switcher mode percent and clear the clip rect. This is
+        // necessary so that the NTP toolbar gets drawn correctly when exiting the tab switcher.
+        // See crbug.com/606419.
+        setAlpha(mTabSwitcherModePercent);
+        mClipRect = null;
+    }
+
     private ObjectAnimator createPostExitTabSwitcherAnimation() {
         ObjectAnimator exitAnimation = ObjectAnimator.ofFloat(
                 this, View.TRANSLATION_Y, -getHeight(), 0.f);
@@ -2005,8 +2011,7 @@
                 visualStateChanged = true;
             } else {
                 updateToolbarBackground(VisualState.BRAND_COLOR);
-                getProgressBar().setBackgroundColor(
-                        ColorUtils.getLightProgressbarBackground(currentPrimaryColor));
+                getProgressBar().setThemeColor(currentPrimaryColor, isIncognito());
             }
         }
 
@@ -2025,16 +2030,17 @@
         mUseLightToolbarDrawables = false;
         mUnfocusedLocationBarUsesTransparentBg = false;
         mUrlBackgroundAlpha = 255;
-        int progressBarBackgroundColor = mProgressBackBackgroundColor;
         updateToolbarBackground(mVisualState);
         if (isInTabSwitcherMode) {
             mUseLightToolbarDrawables = true;
             mUrlBackgroundAlpha = LOCATION_BAR_TRANSPARENT_BACKGROUND_ALPHA;
-            progressBarBackgroundColor = mProgressBackBackgroundColorWhite;
+            getProgressBar().setBackgroundColor(mProgressBackBackgroundColorWhite);
+            getProgressBar().setForegroundColor(ApiCompatibilityUtils.getColor(getResources(),
+                    R.color.progress_bar_foreground_white));
         } else if (isIncognito()) {
             mUseLightToolbarDrawables = true;
             mUrlBackgroundAlpha = LOCATION_BAR_TRANSPARENT_BACKGROUND_ALPHA;
-            progressBarBackgroundColor = mProgressBackBackgroundColorWhite;
+            getProgressBar().setThemeColor(currentPrimaryColor, true);
         } else if (mVisualState == VisualState.BRAND_COLOR) {
             mUseLightToolbarDrawables =
                     ColorUtils.shoudUseLightForegroundOnBackground(currentPrimaryColor);
@@ -2042,17 +2048,13 @@
                     !ColorUtils.shouldUseOpaqueTextboxBackground(currentPrimaryColor);
             mUrlBackgroundAlpha = mUnfocusedLocationBarUsesTransparentBg
                     ? LOCATION_BAR_TRANSPARENT_BACKGROUND_ALPHA : 255;
-            progressBarBackgroundColor =
-                    ColorUtils.getLightProgressbarBackground(currentPrimaryColor);
+            getProgressBar().setThemeColor(currentPrimaryColor, false);
+        } else {
+            getProgressBar().setBackgroundColor(mProgressBackBackgroundColor);
+            getProgressBar().setForegroundColor(ApiCompatibilityUtils.getColor(getResources(),
+                    R.color.progress_bar_foreground));
         }
 
-        getProgressBar().setBackgroundColor(progressBarBackgroundColor);
-        int progressBarForegroundColor = ApiCompatibilityUtils.getColor(getResources(),
-                mUseLightToolbarDrawables
-                ? R.color.progress_bar_foreground_white
-                : R.color.progress_bar_foreground);
-        getProgressBar().setForegroundColor(progressBarForegroundColor);
-
         if (mToggleTabStackButton != null) {
             mToggleTabStackButton.setImageDrawable(mUseLightToolbarDrawables
                     ? mTabSwitcherButtonDrawableLight : mTabSwitcherButtonDrawable);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/ColorUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/util/ColorUtils.java
index 194b947c..f56c487 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/util/ColorUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/util/ColorUtils.java
@@ -4,8 +4,11 @@
 
 package org.chromium.chrome.browser.util;
 
+import android.content.res.Resources;
 import android.graphics.Color;
 
+import org.chromium.base.ApiCompatibilityUtils;
+import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ntp.NewTabPage;
 import org.chromium.chrome.browser.tab.Tab;
 
@@ -16,8 +19,6 @@
     private static final float CONTRAST_LIGHT_ITEM_THRESHOLD = 3f;
     private static final float LIGHTNESS_OPAQUE_BOX_THRESHOLD = 0.82f;
     private static final float LOCATION_BAR_TRANSPARENT_BACKGROUND_ALPHA = 0.2f;
-    private static final float LIGHT_PROGRESSBAR_BACKGROUND_ALPHA = 0.5f;
-    private static final float PROGRESS_BAR_ANIMATION_ALPHA = 0.3f;
 
     /** Percentage to darken a color by when setting the status bar color. */
     private static final float DARKEN_COLOR_FRACTION = 0.6f;
@@ -25,7 +26,7 @@
     /**
      * Computes the lightness value in HSL standard for the given color.
      */
-    private static float getLightnessForColor(int color) {
+    public static float getLightnessForColor(int color) {
         int red = Color.red(color);
         int green = Color.green(color);
         int blue = Color.blue(color);
@@ -58,13 +59,6 @@
     }
 
     /**
-     * @return The color of the progress bar animation based on the current progress bar foreground.
-     */
-    public static int getProgressBarAnimationColor(int color) {
-        return getColorWithOverlay(Color.WHITE, color, PROGRESS_BAR_ANIMATION_ALPHA);
-    }
-
-    /**
      * @return Alpha for the textbox given a Tab.
      */
     public static float getTextBoxAlphaForToolbarBackground(Tab tab) {
@@ -77,15 +71,12 @@
     }
 
     /**
-     * Gets the background color for light theme progress bar.
-     * @param toolbarColor The color of the toolbar.
-     * @return The color of the progress bar in light theme, given the toolbar color.
+     * Get a color when overlayed with a different color.
+     * @param baseColor The base Android color.
+     * @param overlayColor The overlay Android color.
+     * @param overlayAlpha The alpha |overlayColor| should have on the base color.
      */
-    public static int getLightProgressbarBackground(int toolbarColor) {
-        return getColorWithOverlay(Color.WHITE, toolbarColor, LIGHT_PROGRESSBAR_BACKGROUND_ALPHA);
-    }
-
-    private static int getColorWithOverlay(int baseColor, int overlayColor, float overlayAlpha) {
+    public static int getColorWithOverlay(int baseColor, int overlayColor, float overlayAlpha) {
         return Color.rgb(
             (int) (overlayAlpha * Color.red(baseColor)
                     + (1f - overlayAlpha) * Color.red(overlayColor)),
@@ -101,9 +92,19 @@
      * @return Color that should be used for Android status bar.
      */
     public static int getDarkenedColorForStatusBar(int color) {
+        return getDarkenedColor(color, DARKEN_COLOR_FRACTION);
+    }
+
+    /**
+     * Darken a color to a fraction of its current brightness.
+     * @param color The input color.
+     * @param darkenFraction The fraction of the current brightness the color should be.
+     * @return The new darkened color.
+     */
+    public static int getDarkenedColor(int color, float darkenFraction) {
         float[] hsv = new float[3];
         Color.colorToHSV(color, hsv);
-        hsv[2] *= DARKEN_COLOR_FRACTION;
+        hsv[2] *= darkenFraction;
         return Color.HSVToColor(hsv);
     }
 
@@ -135,4 +136,38 @@
     public static int getOpaqueColor(int color) {
         return Color.rgb(Color.red(color), Color.green(color), Color.blue(color));
     }
+
+    /**
+     * Test if the toolbar is using the default color.
+     * @param resources The resources to get the toolbar primary color.
+     * @param color The color that the toolbar is using.
+     * @return If the color is the default toolbar color.
+     */
+    public static boolean isUsingDefaultToolbarColor(Resources resources, int color) {
+        return color == ApiCompatibilityUtils.getColor(resources, R.color.default_primary_color);
+    }
+
+    /**
+     * Find a darker color based on the base color and target contrast. This is a pretty naive
+     * approach that tries to get an approximate color quickly; it starts by multiplying the
+     * base lightness by a number less than 1 and incrementally decreases the lightness if the
+     * desired contrast is not met.
+     * @param color The base color.
+     * @param minContrast The target contrast.
+     * @return A draker color.
+     */
+    public static int findDarkerColorWithMinContrast(int color, float minContrast) {
+        float[] hsl = new float[3];
+        android.support.v4.graphics.ColorUtils.colorToHSL(color, hsl);
+
+        hsl[2] *= 0.6;
+        int newColor = android.support.v4.graphics.ColorUtils.HSLToColor(hsl);
+        double contrast = android.support.v4.graphics.ColorUtils.calculateContrast(newColor, color);
+        for (int maxAttempt = 5; maxAttempt >= 0 && contrast < minContrast; maxAttempt--) {
+            hsl[2] *= 0.7f;
+            newColor = android.support.v4.graphics.ColorUtils.HSLToColor(hsl);
+            contrast = android.support.v4.graphics.ColorUtils.calculateContrast(color, newColor);
+        }
+        return newColor;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarDualControlLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/DualControlLayout.java
similarity index 80%
rename from chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarDualControlLayout.java
rename to chrome/android/java/src/org/chromium/chrome/browser/widget/DualControlLayout.java
index f00aea3e..9fd5e8ae 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarDualControlLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/DualControlLayout.java
@@ -2,16 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.infobar;
+package org.chromium.chrome.browser.widget;
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.graphics.Color;
 import android.util.AttributeSet;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.Button;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
+import org.chromium.ui.widget.ButtonCompat;
 
 /**
  * Automatically lays out one or two Views for an infobar, placing them on the same row if possible
@@ -35,11 +38,41 @@
  * | SECONDARY---------------- |
  * -----------------------------
  */
-public final class InfoBarDualControlLayout extends ViewGroup {
+public final class DualControlLayout extends ViewGroup {
     public static final int ALIGN_START = 0;
     public static final int ALIGN_END = 1;
     public static final int ALIGN_APART = 2;
 
+    /**
+     * Creates a standardized Button that can be used for DualControlLayouts showing buttons.
+     *
+     * @param isPrimary Whether or not the button is meant to act as a "Confirm" button.
+     * @param text      Text to display on the button.
+     * @param listener  Listener to alert when the button has been clicked.
+     * @return Button that can be used in the view.
+     */
+    public static Button createButtonForLayout(
+            Context context, boolean isPrimary, String text, OnClickListener listener) {
+        int lightActiveColor = context.getResources().getColor(R.color.light_active_color);
+
+        if (isPrimary) {
+            ButtonCompat primaryButton = new ButtonCompat(context, lightActiveColor);
+            primaryButton.setId(R.id.button_primary);
+            primaryButton.setOnClickListener(listener);
+            primaryButton.setText(text);
+            primaryButton.setTextColor(Color.WHITE);
+            primaryButton.setRaised(false);
+            return primaryButton;
+        } else {
+            Button secondaryButton = ButtonCompat.createBorderlessButton(context);
+            secondaryButton.setId(R.id.button_secondary);
+            secondaryButton.setOnClickListener(listener);
+            secondaryButton.setText(text);
+            secondaryButton.setTextColor(lightActiveColor);
+            return secondaryButton;
+        }
+    }
+
     private final int mHorizontalMarginBetweenViews;
 
     private int mAlignment = ALIGN_START;
@@ -50,11 +83,11 @@
     private View mSecondaryView;
 
     /**
-     * Construct a new InfoBarDualControlLayout.
+     * Construct a new DualControlLayout.
      *
      * See {@link ViewGroup} for parameter details.  attrs may be null if constructed dynamically.
      */
-    public InfoBarDualControlLayout(Context context, AttributeSet attrs) {
+    public DualControlLayout(Context context, AttributeSet attrs) {
         super(context, attrs);
 
         // Cache dimensions.
@@ -68,14 +101,14 @@
      *
      * @param alignment One of ALIGN_START, ALIGN_APART, ALIGN_END.
      */
-    void setAlignment(int alignment) {
+    public void setAlignment(int alignment) {
         mAlignment = alignment;
     }
 
     /**
      * Sets the margin between the controls when they're stacked.  By default, there is no margin.
      */
-    void setStackedMargin(int stackedMargin) {
+    public void setStackedMargin(int stackedMargin) {
         mStackedMargin = stackedMargin;
     }
 
@@ -88,7 +121,7 @@
         } else if (mSecondaryView == null) {
             mSecondaryView = child;
         } else {
-            throw new IllegalStateException("Too many children added to InfoBarDualControlLayout");
+            throw new IllegalStateException("Too many children added to DualControlLayout");
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBar.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBar.java
index 8e60258..a2004c8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBar.java
@@ -7,14 +7,17 @@
 import android.animation.TimeAnimator;
 import android.animation.TimeAnimator.TimeListener;
 import android.content.Context;
+import android.graphics.Color;
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.ViewGroup;
 import android.widget.FrameLayout.LayoutParams;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.CommandLine;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.util.ColorUtils;
 import org.chromium.components.variations.VariationsAssociatedData;
@@ -54,6 +57,10 @@
     // The amount of time in ms that the progress bar has to be stopped before the indeterminate
     // animation starts.
     private static final long ANIMATION_START_THRESHOLD = 1000;
+    private static final float THEMED_BACKGROUND_ALPHA = 0.2f;
+    private static final float THEMED_DARKEN_FRACTION = 0.6f;
+    private static final float THEMED_COLOR_ALPHA = 0.4f;
+    private static final float MIN_COLOR_CONTRAST = 3.0f;
 
     private static final long PROGRESS_FRAME_TIME_CAP_MS = 50;
     private long mAlphaAnimationDurationMs = 140;
@@ -179,7 +186,8 @@
             animationParams.topMargin = mMarginTop;
 
             mAnimatingView = new ToolbarProgressBarAnimatingView(getContext(), animationParams);
-            mAnimatingView.setColor(ColorUtils.getProgressBarAnimationColor(getForegroundColor()));
+            mAnimatingView.setColor(
+                    ColorUtils.getColorWithOverlay(getForegroundColor(), Color.WHITE, 0.4f));
             UiUtils.insertAfter(mControlContainer, mAnimatingView, this);
         } else if (TextUtils.equals(animation, "fast-start")) {
             mAnimationLogic = new ProgressAnimationFastStart();
@@ -299,12 +307,41 @@
         if (mAnimatingView != null) mAnimatingView.setVisibility(visibility);
     }
 
+    /**
+     * Color the progress bar based on the toolbar theme color.
+     * @param color The Android color the toolbar is using.
+     */
+    public void setThemeColor(int color, boolean isIncognito) {
+        int animationColor;
+        int foregroundColor;
+
+        int foregroundWhite = ApiCompatibilityUtils.getColor(getResources(),
+                R.color.progress_bar_foreground_white);
+
+        if (!ColorUtils.shoudUseLightForegroundOnBackground(color) && !isIncognito) {
+            // Light theme.
+            foregroundColor = ColorUtils.findDarkerColorWithMinContrast(color, MIN_COLOR_CONTRAST);
+            animationColor = ColorUtils.getColorWithOverlay(foregroundColor, foregroundWhite,
+                    THEMED_COLOR_ALPHA);
+        } else {
+            // Dark theme.
+            foregroundColor = foregroundWhite;
+            animationColor = ColorUtils.getColorWithOverlay(color, foregroundWhite,
+                    1.0f - THEMED_COLOR_ALPHA);
+        }
+
+        setForegroundColor(foregroundColor);
+        setBackgroundColor(
+                ColorUtils.getColorWithOverlay(foregroundWhite, color, THEMED_BACKGROUND_ALPHA));
+
+        if (mAnimatingView != null) mAnimatingView.setColor(animationColor);
+    }
+
     @Override
     public void setForegroundColor(int color) {
         super.setForegroundColor(color);
-        // Set the animation color to a faded version of the input color.
         if (mAnimatingView != null) {
-            mAnimatingView.setColor(ColorUtils.getProgressBarAnimationColor(color));
+            mAnimatingView.setColor(ColorUtils.getColorWithOverlay(color, Color.WHITE, 0.4f));
         }
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBarAnimatingView.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBarAnimatingView.java
index a149801..7b26b7f9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBarAnimatingView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBarAnimatingView.java
@@ -7,8 +7,8 @@
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.AnimatorSet;
-import android.animation.TimeAnimator;
-import android.animation.TimeAnimator.TimeListener;
+import android.animation.ValueAnimator;
+import android.animation.ValueAnimator.AnimatorUpdateListener;
 import android.content.Context;
 import android.graphics.Color;
 import android.graphics.drawable.ColorDrawable;
@@ -39,6 +39,9 @@
     /** The width of the animating bar relative to the current width of the progress bar. */
     private static final float ANIMATING_BAR_SCALE = 0.5f;
 
+    /** Interpolator for enter and exit animation. */
+    private final BakedBezierInterpolator mBezier = BakedBezierInterpolator.TRANSFORM_CURVE;
+
     /** The current width of the progress bar. */
     private float mProgressWidth = 0;
 
@@ -51,46 +54,20 @@
     /** If the layout is RTL. */
     private boolean mIsRtl;
 
+    /** The update listener for the animation. */
+    private ProgressBarUpdateListener mListener;
+
+    /** The last fraction of the animation that was drawn. */
+    private float mLastAnimatedFraction;
+
     /**
-     * A time listener that moves an ImageView across the progress bar.
+     * An animation update listener that moves an ImageView across the progress bar.
      */
-    private class ProgressBarTimeListener implements TimeListener {
-        private final BakedBezierInterpolator mBezier =
-                BakedBezierInterpolator.TRANSFORM_CURVE;
-
+    private class ProgressBarUpdateListener implements AnimatorUpdateListener {
         @Override
-        public void onTimeUpdate(TimeAnimator animation, long totalTimeMs, long deltaTimeMs) {
-            if (totalTimeMs >= animation.getDuration()) animation.end();
-
-            float bezierProgress = mBezier.getInterpolation(
-                    (float) (totalTimeMs % animation.getDuration()) / animation.getDuration());
-
-            // Left and right bound change based on if the layout is RTL.
-            float leftBound = mIsRtl ? -mProgressWidth : 0.0f;
-            float rightBound = mIsRtl ? 0.0f : mProgressWidth;
-
-            // Include the width of the animating bar in this computation so it comes from
-            // off-screen.
-            float animatingWidth = mProgressWidth * ANIMATING_BAR_SCALE;
-            float animatorCenter =
-                    ((mProgressWidth + animatingWidth) * bezierProgress) - animatingWidth / 2.0f;
-            if (mIsRtl) animatorCenter *= -1.0f;
-
-            // The left and right x-coordinate of the animating view.
-            float animatorRight = animatorCenter + (animatingWidth / 2.0f);
-            float animatorLeft = animatorCenter - (animatingWidth / 2.0f);
-
-            // "Clip" the view so it doesn't go past where the progress bar starts or ends.
-            if (animatorRight > rightBound) {
-                animatingWidth -= Math.abs(animatorRight - rightBound);
-                animatorCenter -= Math.abs(animatorRight - rightBound) / 2.0f;
-            } else if (animatorLeft < leftBound) {
-                animatingWidth -= Math.abs(animatorLeft - leftBound);
-                animatorCenter += Math.abs(animatorLeft - leftBound) / 2.0f;
-            }
-
-            setScaleX(animatingWidth);
-            setTranslationX(animatorCenter);
+        public void onAnimationUpdate(ValueAnimator animation) {
+            mLastAnimatedFraction = animation.getAnimatedFraction();
+            updateAnimation(mLastAnimatedFraction);
         }
     }
 
@@ -108,16 +85,18 @@
 
         setImageDrawable(mAnimationDrawable);
 
-        ProgressBarTimeListener listener = new ProgressBarTimeListener();
+        mListener = new ProgressBarUpdateListener();
         mAnimatorSet = new AnimatorSet();
 
-        TimeAnimator fastAnimation = new TimeAnimator();
+        ValueAnimator fastAnimation = new ValueAnimator();
+        fastAnimation.setFloatValues(0.0f, 1.0f);
         fastAnimation.setDuration(FAST_ANIMATION_DURATION_MS);
-        fastAnimation.setTimeListener(listener);
+        fastAnimation.addUpdateListener(mListener);
 
-        TimeAnimator slowAnimation = new TimeAnimator();
+        ValueAnimator slowAnimation = new ValueAnimator();
+        slowAnimation.setFloatValues(0.0f, 1.0f);
         slowAnimation.setDuration(SLOW_ANIMATION_DURATION_MS);
-        slowAnimation.setTimeListener(listener);
+        slowAnimation.addUpdateListener(mListener);
 
         mAnimatorSet.playSequentially(fastAnimation, slowAnimation);
         mAnimatorSet.setStartDelay(ANIMATION_DELAY_MS);
@@ -150,6 +129,41 @@
     }
 
     /**
+     * Update the animating view.
+     * @param animatedFraction The current fraction of completion for the animation.
+     */
+    private void updateAnimation(float animatedFraction) {
+        float bezierProgress = mBezier.getInterpolation(animatedFraction);
+
+        // Left and right bound change based on if the layout is RTL.
+        float leftBound = mIsRtl ? -mProgressWidth : 0.0f;
+        float rightBound = mIsRtl ? 0.0f : mProgressWidth;
+
+        // Include the width of the animating bar in this computation so it comes from
+        // off-screen.
+        float animatingWidth = mProgressWidth * ANIMATING_BAR_SCALE;
+        float animatorCenter =
+                ((mProgressWidth + animatingWidth) * bezierProgress) - animatingWidth / 2.0f;
+        if (mIsRtl) animatorCenter *= -1.0f;
+
+        // The left and right x-coordinate of the animating view.
+        float animatorRight = animatorCenter + (animatingWidth / 2.0f);
+        float animatorLeft = animatorCenter - (animatingWidth / 2.0f);
+
+        // "Clip" the view so it doesn't go past where the progress bar starts or ends.
+        if (animatorRight > rightBound) {
+            animatingWidth -= Math.abs(animatorRight - rightBound);
+            animatorCenter -= Math.abs(animatorRight - rightBound) / 2.0f;
+        } else if (animatorLeft < leftBound) {
+            animatingWidth -= Math.abs(animatorLeft - leftBound);
+            animatorCenter += Math.abs(animatorLeft - leftBound) / 2.0f;
+        }
+
+        setScaleX(animatingWidth);
+        setTranslationX(animatorCenter);
+    }
+
+    /**
      * @return True if the animation is running.
      */
     public boolean isRunning() {
@@ -167,6 +181,7 @@
         setTranslationX(0.0f);
         animate().cancel();
         setAlpha(0.0f);
+        mLastAnimatedFraction = 0.0f;
     }
 
     /**
@@ -175,6 +190,7 @@
      */
     public void update(float progressWidth) {
         mProgressWidth = progressWidth;
+        updateAnimation(mLastAnimatedFraction);
     }
 
     /**
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
index 66047736..8f1e0f43d 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -75,7 +75,8 @@
     <output filename="values-uk/android_chrome_strings.xml" lang="uk" type="android" />
     <output filename="values-vi/android_chrome_strings.xml" lang="vi" type="android" />
     <output filename="values-zh-rCN/android_chrome_strings.xml" lang="zh-CN" type="android" />
-    <output filename="values-zh-rTW/android_chrome_strings.xml" lang="zh-TW" type="android" />
+    <!-- Use zh instead of zh-rTW so that Android will let zh-HK fall back to zh-TW. -->
+    <output filename="values-zh/android_chrome_strings.xml" lang="zh-TW" type="android" />
   </outputs>
   <translations>
     <file lang="am" path="translations/android_chrome_strings_am.xtb" />
@@ -530,6 +531,9 @@
       <message name="IDS_ALL_SITES" desc='Title of the "All sites" settings screen that allows the user to see permissions for all websites. [CHAR-LIMIT=32]'>
         All sites
       </message>
+      <message name="IDS_AUTOPLAY_TITLE" desc='Title for the Autoplay settings screen [CHAR-LIMIT=32]'>
+        Autoplay
+      </message>
       <message name="IDS_COOKIES_TITLE" desc="Title for the Cookies settings screen [CHAR-LIMIT=32]">
         Cookies
       </message>
@@ -569,6 +573,9 @@
       <message name="IDS_WEBSITE_SETTINGS_ADD_SITE_TOAST" desc="The toast shown when a new site has been added to the whitelist.">
         Site <ph name="SITE_NAME">%1$s<ex>google.com</ex></ph> added
       </message>
+      <message name="IDS_WEBSITE_SETTINGS_ADD_SITE_DESCRIPTION_AUTOPLAY" desc="The description for the allow autoplay for website dialog.">
+        Detect and playback important media for a specific site.
+      </message>
       <message name="IDS_WEBSITE_SETTINGS_ADD_SITE_DESCRIPTION_JAVASCRIPT" desc="The description for the allow Javascript for website dialog.">
         Allow JavaScript on the following site.
       </message>
@@ -636,6 +643,9 @@
       <message name="IDS_WEBSITE_SETTINGS_CATEGORY_COOKIE_ALLOWED" desc="Summary text explaining that sites are allowed to use cookies and that it is the recommended setting.">
         Allow sites to save and read cookie data (recommended)
       </message>
+      <message name="IDS_WEBSITE_SETTINGS_CATEGORY_AUTOPLAY_ALLOWED" desc="Summary text explaining that sites are allowed to  autoplay videos and that it is the recommended setting.">
+        Allow sites to autoplay important media (recommended)
+      </message>
       <message name="IDS_WEBSITE_SETTINGS_PERMISSIONS_ALLOW" desc="Summary text explaining that Chrome will allow a website to access some permission, e.g. JavaScript: allow.">
         Allow
       </message>
@@ -995,10 +1005,10 @@
         Sync your bookmarks
       </message>
       <message name="IDS_BOOKMARK_SIGN_IN_PROMO_DESCRIPTION" desc="Description for bookmark UI sign-in promotion.">
-        To get your bookmarks on all your devices, sign in to Chrome
+        To get your bookmarks your other devices, sign in to Chrome.
       </message>
       <message name="IDS_RECENT_TABS_SIGN_IN_PROMO_DESCRIPTION" desc="Description for recent tabs UI sign-in promotion.">
-        To get your tabs from all your devices, sign in to Chrome
+        To get your tabs from your other devices, sign in to Chrome.
       </message>
       <message name="IDS_ENABLE_SYNC_BUTTON" desc="Text that displayed or button that allows the user to open Chrome settings to enable sync.">
         Open settings
@@ -1007,16 +1017,16 @@
         Open settings
       </message>
       <message name="IDS_BOOKMARKS_SYNC_PROMO_ENABLE_SYNC" desc="Text that displayed in a textview encouraging the user to enable sync.">
-        Bookmarks saved on your other devices will appear here
+        Bookmarks saved on your other devices will appear here.
       </message>
       <message name="IDS_RECENT_TABS_SYNC_PROMO_ENABLE_CHROME_SYNC" desc="Text that displayed in a textview encouraging the user to enable sync.">
-        To get your tabs from all your devices, turn on sync
+        To get your tabs from your other devices, turn on sync.
       </message>
       <message name="IDS_RECENT_TABS_SYNC_PROMO_ENABLE_ANDROID_SYNC" desc="Text that displayed in a textview encouraging the user to enable sync in the android settings.">
-        To get your tabs from all your devices, turn on "Auto-sync data" in Android account setting
+        To get your tabs from your other devices, turn on "Auto-sync data" in Android account setting.
       </message>
       <message name="IDS_NTP_RECENT_TABS_SYNC_PROMO_INSTRUCTIONS" desc="Information about sync displayed on the NTP when the user has signed in on mobile but not on desktop">
-        Tabs that you've opened in Chrome on your other devices will appear here
+        Tabs that you've opened in Chrome on your other devices will appear here.
       </message>
 
       <message name="IDS_SIGN_IN_SYNC" desc="Sync preference title in signed-in prefs and prefix for notification related to sync [CHAR-LIMIT=32]">
@@ -1714,7 +1724,7 @@
         Continue
       </message>
       <message name="IDS_SIGNIN_ACCOUNT_CHOICE_DESCRIPTION" desc="Text for account chooser page">
-        Sign in with your Google Account to get your bookmarks, history, passwords, and other settings on all your devices.
+        Sign in to get your bookmarks, history, passwords, and other settings on all your devices.
       </message>
       <message name="IDS_SIGNIN_ACCEPT" desc="Text for button to accept being signed in">
         OK, got it
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
index 0d411bf6..bbabe94f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">ወደ <ph name="TARGET_LANGUAGE" /> ተተርጉሟል።</translation>
 <translation id="1749561566933687563">የእርስዎን ዕልባቶች ያስምሩ</translation>
 <translation id="17513872634828108">ትሮችን ክፈት</translation>
+<translation id="1756600373018374892">ፈጣን የትሮችዎን መዳረሻ ለማግኘት ይህን አዝራር ነካ ያድርጉ።</translation>
 <translation id="1807246157184219062">ብርሃን</translation>
 <translation id="1825719650605518411">የመጀመሪያ የማሄድ ተሞክሮ</translation>
 <translation id="1829244130665387512">በዚህ ገጽ ውስጥ የተገኘ</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">በ<ph name="BEGIN_LINK" />Android ቅንብሮች<ph name="END_LINK" /> ውስጥ ፍቃዶችን ለChrome ያብሩ።</translation>
 <translation id="1943432128510653496">የይለፍ ቃላትን አስቀምጥ</translation>
 <translation id="1944384637046898011">ከ<ph name="TIME" /> ጀምሮ በGoogle ይለፍ ቃል አመስጥር</translation>
+<translation id="1946005195648379376">Google ፍለጋን እና ሌሎች የGoogle አገልግሎቶችን ግላዊነት ለማላበስ ብሎ የአሰሳ ታሪክዎን እንዴት እንደሚጠቀምበት ይቆጣጠሩት።</translation>
 <translation id="1959930595721737608">ጃቫስክሪፕት በሚከተለው ጣቢያ ላይ ፍቀድ።</translation>
 <translation id="1966710179511230534">እባክዎ የመግቢያ ዝርዝሮችዎን ያዘምኑ።</translation>
 <translation id="1974060860693918893">የላቀ</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />፣ የድር መተግበሪያ። <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">አጽዳ</translation>
 <translation id="2315043854645842844">የደንበኛ ወገን ዕውቅና ማረጋገጫ ምርጫ በስርዓተ-ክወናው አይደገፍም።</translation>
-<translation id="2316129865977710310">አይ፣ አመሰግናለሁ</translation>
 <translation id="2321958826496381788">ይህን በሚመች ሁኔታ ማንበብ እስኪችሉ ድረስ ተንሸራታቹን ይጎትቱት። በአንድ አንቀጽ ላይ ሁለቴ መታ ካደረጉ በኋላ ጽሑፍ ቢያንስ የዚህ ያህል ትልቀት ሊኖረው ይገባል።</translation>
-<translation id="2329597144923131178">የእርስዎን ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች በሁሉም መሣሪያዎችዎ ላይ ለማግኘት ወደ መለያ ይግቡ።</translation>
 <translation id="2343328333327081434">በመጫን ላይ…</translation>
 <translation id="2351097562818989364">የትርጉም ቅንብሮችዎ ዳግም እንዲጀምሩ ተደርገዋል።</translation>
 <translation id="2359808026110333948">ቀጥል</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">ወላጅ አቃፊ</translation>
 <translation id="2870560284913253234">ጣቢያ</translation>
 <translation id="2888126860611144412">ስለChrome</translation>
+<translation id="2889768325388591707">ትሮችን በፍጥነት ይቀያይሩ</translation>
 <translation id="2891154217021530873">ገጹን መጫን አቁም</translation>
 <translation id="2902702728133930130">Chrome ባልተጠበቀ ስህተት ምክንያት ሊጀምር አልቻለም።</translation>
 <translation id="2903493209154104877">አድራሻዎች</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">ማንነትን በማያሳውቅ ትር ክፈት</translation>
 <translation id="3090193911106258841">የኦዲዮ እና የቪዲዮ ግብዓትን በመድረስ ላይ</translation>
 <translation id="3137521801621304719">ከማንነት የማያሳውቅ ሁነታ ይውጡ</translation>
+<translation id="3149891296864842641">የመላኪያ አማራጭ</translation>
+<translation id="3162882791484435636">የመላኪያ አማራጭ ምረጥ</translation>
+<translation id="3173438333156928404">ክፍያን መስራት ላይ ስህተት</translation>
 <translation id="3177909033752230686">የገጽ ቋንቋ፦</translation>
 <translation id="3190152372525844641">በ<ph name="BEGIN_LINK" />Android ቅንብሮች<ph name="END_LINK" /> ውስጥ ፍቃዶችን ለChrome ያብሩ።</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> የተከማቸ ውሂብ</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">ለዚህ ድር ጣቢያ የይለፍ ቃልዎን <ph name="PASSWORD_MANAGER_BRAND" /> ማዘመን ይፈልጋሉ?</translation>
 <translation id="4881695831933465202">ክፈት</translation>
 <translation id="4885273946141277891">የማይደገፍ የChrome አብነቶች ብዛት።</translation>
+<translation id="4923459931733593730">ክፍያ</translation>
 <translation id="4943872375798546930">ውጤቶች የሉም</translation>
-<translation id="4970484396410298643">በኮምፒውተርዎ ላይ የከፈቷቸውን ትሮችን እዚህ ይድረሱባቸው።
-
-በቀላሉ በኮምፒውተርዎ ላይ Chromeን ይክፈቱ፣ ወደ ምናሌ ይሂዱ፣ ከዚያ «Chrome ውስጥ ግባ…»ን ይምረጡ</translation>
 <translation id="497421865427891073">ወደ ፊት ሂድ</translation>
 <translation id="4996978546172906250">ያጋሩ በ</translation>
 <translation id="5000922062037820727">ታግዷል (የሚመከር)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">በChrome ውስጥ ክፈት</translation>
 <translation id="5199929503336119739">የሥራ መገለጫ</translation>
 <translation id="5210365745912300556">ትር ዝጋ</translation>
-<translation id="5210714456814679336">በሌሎች መሣሪያዎችዎ ላይ ባለ Chrome ላይ የከፈቷቸው ትሮች እዚህ ይመጣሉ።</translation>
 <translation id="5222676887888702881">ዘግተህ ውጣ</translation>
-<translation id="5228579091201413441">ማመሳሰልን አንቃ</translation>
 <translation id="5233638681132016545">አዲስ ትር</translation>
 <translation id="5271967389191913893">መሣሪያ የሚወርደውን ይዘት መክፈት አይችልም።</translation>
 <translation id="5275558766013849309">ትሮች ከቅርብ ጊዜ መተግበሪያዎች ጋር አብረው ይኖራሉ።</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">ታግዷል</translation>
 <translation id="5684874026226664614">ውይ። ይህ ገጽ ሊተረጎም አይችልም።</translation>
 <translation id="5708031556037168012">ነባር ውሂብ በመሣሪያዎ ላይ እንዳለ ያቆዩትና ውሂብዉን እስከመጨረሻው ወደ <ph name="TO_ACCOUNT" /> ያስመጡት።</translation>
-<translation id="5712189971979076230">ስንክል በሚያጋጥመዎት ማንኛውም ጊዜ ላይ ስለፋይሎች፣ መተግበሪያዎች እና እየሰሩ ስላሉ አገልግሎቶች ወደ Google መረጃ በመላክ ቅድሚያ ሰጥተን ልንሰራባቸው የሚገቡ ነገሮችን እንድንለይ እና ማሻሻያዎችን እንድናደርግ ያግዙን።
-
-የአጠቃቀም ስታትስቲክስ እንደ ምርጫዎች፣ የአዝራር ጠቅታዎች እና የማህደትውስታ ያሉ መረጃዎችን ያካትታል። የድረ-ገጽ ዩአርኤሎችን ወይም ማንኛውም የግል መረጃን አያካትቱም። የስንክል ሪፖርቶች በስንክሉ ጊዜ ያለውን የስርዓት መረጃ ይይዛሉ፣ እና በብልሽቱ ወቅት ሲደረግ በነበረው ነገር የሚወሰን ሆኖ የድረ-ገጽ ዩአርኤሎችን ወይም የግል መረጃን ሊይዙ ይችላሉ።</translation>
 <translation id="5719837394786370183">ማንነት በማያሳውቁ ትሮች ላይ የሚያዩዋቸው ገጾች ሁሉንም ማንነት የማያሳውቁ ትሮችዎን ከዘጉ በኋላ በእርስዎ የአሳሽ ታሪክ፣ የኩኪ ማከማቻ ወይም የፍለጋ ታሪክ ውስጥ አይቆዩም። የሚያወርዷቸው ማንኛቸውም ፋይሎች ወይም ዕልባቶች ይቀመጣሉ።
 
 ይሁንና እርስዎ ስውር አይደሉም። ማንነት በማያሳውቅ ሁነታ ላይ መሆን የእርስዎን አሰሳ ከአሰሪዎ፣ ከበይነመረብ አገልጋይዎ ወይም ከሚጎበኟቸው ድር ጣቢያዎች አይደብቁዎውም።</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">አድስ</translation>
 <translation id="7191430249889272776">ትር ጀርባ ላይ ተከፍቷል።</translation>
 <translation id="7208788139759694678">ውሂብ ቆጣቢ ተሰናክሏል</translation>
+<translation id="7220786058474068424">በማስሄድ ላይ</translation>
 <translation id="7243308994586599757">አማራጮች ከማያ ገጹ ግርጌ አጠገብ ይገኛሉ</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> አካባቢያዊ የፍለጋ ውጤቶችን ለማሳየት የእርስዎን አካባቢ ይጠቀማል</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />እገዛ<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">ምርጫ ሰርዝ</translation>
 <translation id="7851858861565204677">ሌሎች መሣሪያዎች</translation>
 <translation id="7876243839304621966">ሁሉንም አስወግድ</translation>
+<translation id="7902333740914687335">ክፍያ ተሰርቷል</translation>
 <translation id="7947953824732555851">ተቀበል እና ግባ</translation>
 <translation id="7949961459945740081">የቅርብ ጊዜዎቹን ባሕሪዎች ያግኙ</translation>
 <translation id="7963646190083259054">አቅራቢ፦</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">ይዘት</translation>
 <translation id="8173098127580644436">የጊዜ መጀመሪያ</translation>
 <translation id="8200772114523450471">ከቆመበት ቀጥል</translation>
+<translation id="8202097416529803614">የትዕዛዝ ማጠቃለያ</translation>
 <translation id="8209050860603202033">ምስል ክፈት</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> ከዚህ ጋር መገናኘት ይፈልጋል፦</translation>
 <translation id="8218346974737627104">በመለያ መግባትን ያረጋግጡ</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">በሌላ መስኮት ውስጥ ክፈት</translation>
 <translation id="8959122750345127698">ዳሰሳ ሊደረስበት አይችልም፦ <ph name="URL" /></translation>
 <translation id="8979340629087822094">ያለፈው ቀን</translation>
+<translation id="8981454092730389528">የGoogle እንቅስቃሴ መቆጣጠሪያዎች</translation>
+<translation id="8986494364107987395">የአጠቃቀም ስታስቲክስ እና የብልሽት ሪፖርቶች በራስ ሰር ወደ Google ይላኩ።</translation>
 <translation id="8987061207681586800">Chromeን የራስዎ ያድርጉት</translation>
 <translation id="9019902583201351841">በእርስዎ ወላጆች የሚቀናበር</translation>
 <translation id="9020607083536754075">የአሁኑን ትር ይዝጉና ወደ ቀዳሚው መተግበሪያ ይመለሱ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
index 124a449..b355dce 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">تمت الترجمة إلى <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">مزامنة الإشارات المرجعية</translation>
 <translation id="17513872634828108">علامات التبويب المفتوحة</translation>
+<translation id="1756600373018374892">انقر على هذا الزر للوصول السريع إلى علامات التبويب.</translation>
 <translation id="1807246157184219062">فاتح</translation>
 <translation id="1825719650605518411">تجربة التشغيل لأول مرة</translation>
 <translation id="1829244130665387512">البحث في الصفحة</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">‏تشغيل الإذن لـ Chrome في <ph name="BEGIN_LINK" />إعدادات Android<ph name="END_LINK" /></translation>
 <translation id="1943432128510653496">حفظ كلمات المرور</translation>
 <translation id="1944384637046898011">‏ترميز الكل باستخدام كلمة مرور Google بدءًا من <ph name="TIME" /></translation>
+<translation id="1946005195648379376">‏يمكنك التحكم في الطريقة التي تتبعها Google عند استخدام سجل التصفح لتخصيص البحث وخدمات Google الأخرى.</translation>
 <translation id="1959930595721737608">السماح بتشغيل جافا سكريبت في الموقع التالي.</translation>
 <translation id="1966710179511230534">الرجاء تحديث تفاصيل تسجيل الدخول.</translation>
 <translation id="1974060860693918893">إعدادات متقدمة</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />، تطبيق ويب. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">تحسين</translation>
 <translation id="2315043854645842844">لا يدعم نظام التشغيل تحديد الشهادة من جانب العميل.</translation>
-<translation id="2316129865977710310">لا، شكرًا</translation>
 <translation id="2321958826496381788">يمكنك سحب شريط التمرير حتى تتمكن من قراءة هذا النص بسهولة. يجب أن يظهر النص بهذا الحجم على الأقل بعد النقر مرتين على إحدى الفقرات.</translation>
-<translation id="2329597144923131178">سجّل الدخول للحصول على الإشارات المرجعية، والسجل، وكلمات المرور، والإعدادات الأخرى على كل أجهزتك.</translation>
 <translation id="2343328333327081434">جارٍ التثبيت...</translation>
 <translation id="2351097562818989364">تم إعادة ضبط إعداداتك للترجمة.</translation>
 <translation id="2359808026110333948">المتابعة</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">المجلد الرئيسي</translation>
 <translation id="2870560284913253234">الموقع</translation>
 <translation id="2888126860611144412">‏حول Chrome</translation>
+<translation id="2889768325388591707">التبديل السريع لعلامات التبويب</translation>
 <translation id="2891154217021530873">إيقاف تحميل الصفحة</translation>
 <translation id="2902702728133930130">‏أخفق Chrome أثناء بدء التشغيل بسبب خطأ غير متوقع.</translation>
 <translation id="2903493209154104877">العناوين</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">فتح في علامة تبويب تصفح متخفي</translation>
 <translation id="3090193911106258841">جارٍ الوصول إلى إدخال الصوت والفيديو</translation>
 <translation id="3137521801621304719">مغادرة وضع التصفح المتخفي</translation>
+<translation id="3149891296864842641">خيار الشحن</translation>
+<translation id="3162882791484435636">حدد خيار الشحن</translation>
+<translation id="3173438333156928404">حدث خطأ أثناء معالجة عملية الدفع</translation>
 <translation id="3177909033752230686">لغة الصفحة:</translation>
 <translation id="3190152372525844641">‏تشغيل الأذونات لـ Chrome في <ph name="BEGIN_LINK" />إعدادات Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> من البيانات المخزنة</translation>
@@ -268,10 +272,8 @@
 <translation id="4875622588773761625">هل تريد تحديث كلمة مرورك لهذا الموقع من خلال <ph name="PASSWORD_MANAGER_BRAND" />؟</translation>
 <translation id="4881695831933465202">فتح</translation>
 <translation id="4885273946141277891">‏عدد نسخ Chrome غير متوافق.</translation>
+<translation id="4923459931733593730">الدفع</translation>
 <translation id="4943872375798546930">لا نتائج</translation>
-<translation id="4970484396410298643">‏يمكنك الدخول إلى علامات التبويب التي فتحتها على جهاز الكمبيوتر، مباشرةً من هنا.
-
-افتح متصفح Chrome على جهاز الكمبيوتر وانتقل إلى القائمة، ثم حدد "تسجيل الدخول إلى Chrome…".</translation>
 <translation id="497421865427891073">انتقال للأمام</translation>
 <translation id="4996978546172906250">مشاركة عن طريق</translation>
 <translation id="5000922062037820727">محظور (موصى به)</translation>
@@ -295,9 +297,7 @@
 <translation id="5184329579814168207">‏فتح في Chrome</translation>
 <translation id="5199929503336119739">الملف الشخصي للعمل</translation>
 <translation id="5210365745912300556">إغلاق علامة التبويب</translation>
-<translation id="5210714456814679336">‏ستظهر هنا علامات التبويب التي فتحتها في Chrome من أجهزتك الأخرى.</translation>
 <translation id="5222676887888702881">الخروج</translation>
-<translation id="5228579091201413441">تمكين المزامنة</translation>
 <translation id="5233638681132016545">علامة تبويب جديدة</translation>
 <translation id="5271967389191913893">لا يمكن للجهاز فتح المحتوى لتنزيله</translation>
 <translation id="5275558766013849309">ستوجد علامات التبويب مع التطبيقات الحديثة.</translation>
@@ -341,9 +341,6 @@
 <translation id="5677928146339483299">تم المنع</translation>
 <translation id="5684874026226664614">عفوًا. تعذرت ترجمة هذه الصفحة.</translation>
 <translation id="5708031556037168012">يمكنك الحفاظ على البيانات الحالية على جهازك واستيراد البيانات نهائيًا إلى <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">‏ساعدنا على تحديد أولوية الميزات والتحسينات التي يجب علينا العمل عليها من خلال إرسال معلومات إلى Google حول الملفات، والتطبيقات، والخدمات التي تعمل عندما تواجه عطلاً.
-
-يتضمن استخدام الإحصاءات معلومات، مثل التفضيلات، وعدد النقرات على الزر، واستخدام الذاكرة. ولا تتضمن عناوين URL لصفحات الويب أو أي معلومات شخصية. تحتوي تقارير الأعطال على معلومات النظام في وقت العطل، وقد تحتوي على عناوين URL لصفحات ويب أو معلومات شخصية، بناءً على ما كان يجري وقت حدوث العطل.</translation>
 <translation id="5719837394786370183">لن تظهر الصفحات التي تشاهدها في علامات تبويب التصفح المتخفي في سجل متصفحك ولا في وحدة تخزين ملفات تعريف الارتباط ولا في سجل البحث بعد إغلاق جميع علامات تبويب التصفح المتخفي. وستُحفظ أي ملفات تنزلها وأي علامات مرجعية تنشئها.
           
           لكنك لن تكون غير مرئي، فاستخدام وضع التصفح المتخفي لا يخفي تصفحك عن صاحب العمل أو مزود خدمة الإنترنت أو مواقع الويب التي تزورها.</translation>
@@ -462,6 +459,7 @@
 <translation id="7180611975245234373">تحديث</translation>
 <translation id="7191430249889272776">تم فتح علامة التبويب في الخلفية.</translation>
 <translation id="7208788139759694678">تعطيل توفير البيانات</translation>
+<translation id="7220786058474068424">جارٍ المعالجة</translation>
 <translation id="7243308994586599757">الخيارات المتاحة بالقرب من الجزء السفلي من الشاشة</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> يستخدم موقعك لعرض نتائج البحث المحلي</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />مساعدة<ph name="END_LINK" /></translation>
@@ -515,6 +513,7 @@
 <translation id="7846076177841592234">إلغاء التحديد</translation>
 <translation id="7851858861565204677">أجهزة أخرى</translation>
 <translation id="7876243839304621966">إزالة الكل</translation>
+<translation id="7902333740914687335">تمت معالجة عملية الدفع</translation>
 <translation id="7947953824732555851">قبول وتسجيل الدخول</translation>
 <translation id="7949961459945740081">الحصول على أحدث الميزات</translation>
 <translation id="7963646190083259054">المورّد:</translation>
@@ -538,6 +537,7 @@
 <translation id="8168435359814927499">المحتوى</translation>
 <translation id="8173098127580644436">بدايةَ الوقت</translation>
 <translation id="8200772114523450471">استئناف</translation>
+<translation id="8202097416529803614">ملخص الطلب</translation>
 <translation id="8209050860603202033">فتح الصورة</translation>
 <translation id="8215250379351058554">يريد <ph name="SITE" /> الاتصال بـ:</translation>
 <translation id="8218346974737627104">تأكيد تسجيل الدخول</translation>
@@ -594,6 +594,8 @@
 <translation id="8942627711005830162">فتح في نافذة أخرى</translation>
 <translation id="8959122750345127698">التنقل غير قابل للوصول: <ph name="URL" /></translation>
 <translation id="8979340629087822094">اليوم السابق</translation>
+<translation id="8981454092730389528">‏عناصر التحكم في النشاط على Google</translation>
+<translation id="8986494364107987395">‏إرسال إحصائيات الاستخدام وتقارير الأعطال إلى Google تلقائيًا</translation>
 <translation id="8987061207681586800">‏تخصيص Chrome كما تريد</translation>
 <translation id="9019902583201351841">يديره والداك</translation>
 <translation id="9020607083536754075">إغلاق علامة التبويب الحالية والرجوع إلى التطبيق السابق</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
index 2f82e95..2c3045030 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Преведено на <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Синхронизирайте отметките си</translation>
 <translation id="17513872634828108">Отворени раздели</translation>
+<translation id="1756600373018374892">Докоснете този бутон, за да стигнете бързо до разделите си.</translation>
 <translation id="1807246157184219062">Светло</translation>
 <translation id="1825719650605518411">Представяне при първо изпълнение</translation>
 <translation id="1829244130665387512">Търсене в страницата</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Включете разрешението за Chrome от <ph name="BEGIN_LINK" />настройките на Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Запазени пароли</translation>
 <translation id="1944384637046898011">Шифроване на всичко с паролата за Google от <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Контролирайте начина, по който използваме историята ви на сърфиране, за да персонализираме търсенето и други услуги на Google.</translation>
 <translation id="1959930595721737608">Разрешаване на JavaScript за следващия сайт.</translation>
 <translation id="1966710179511230534">Моля, актуализирайте данните си за вход.</translation>
 <translation id="1974060860693918893">Разширени</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, уеб приложение. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Прецизиране</translation>
 <translation id="2315043854645842844">Избраният сертификат от страната на клиента не се поддържа от операционната система.</translation>
-<translation id="2316129865977710310">Не, благодаря</translation>
 <translation id="2321958826496381788">Преместете плъзгача, докато можете да четете удобно това. Текстът трябва да изглежда поне толкова голям след двукратно докосване на абзац.</translation>
-<translation id="2329597144923131178">Влезте в профила си и получете своите отметки, история, пароли и др. настройки на всички у-ва.</translation>
 <translation id="2343328333327081434">Инсталира се…</translation>
 <translation id="2351097562818989364">Настройките ви за превод са нулирани.</translation>
 <translation id="2359808026110333948">Напред</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Основна папка</translation>
 <translation id="2870560284913253234">Сайт</translation>
 <translation id="2888126860611144412">Всичко за Chrome</translation>
+<translation id="2889768325388591707">Бързо превключване на раздели</translation>
 <translation id="2891154217021530873">Спиране на зареждането на страницата</translation>
 <translation id="2902702728133930130">Стартирането на Chrome не бе успешно поради неочаквана грешка.</translation>
 <translation id="2903493209154104877">Адреси</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Отваряне в раздел „инкогнито“</translation>
 <translation id="3090193911106258841">Осъществява се достъп до аудио- и видеовхода</translation>
 <translation id="3137521801621304719">Напускане на режима „инкогнито“</translation>
+<translation id="3149891296864842641">Опция за доставка</translation>
+<translation id="3162882791484435636">Избиране на опция за доставка</translation>
+<translation id="3173438333156928404">Грешка при обработването на плащането</translation>
 <translation id="3177909033752230686">Език на страницата:</translation>
 <translation id="3190152372525844641">Включете разрешенията за Chrome от <ph name="BEGIN_LINK" />настройките на Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905">Съхранявани данни: <ph name="STORAGE_AMOUNT" /></translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Искате ли <ph name="PASSWORD_MANAGER_BRAND" /> да актуализира паролата ви за този сайт?</translation>
 <translation id="4881695831933465202">Отваряне</translation>
 <translation id="4885273946141277891">Неподдържан брой екземпляри на Chrome.</translation>
+<translation id="4923459931733593730">Плащане</translation>
 <translation id="4943872375798546930">Няма резултати</translation>
-<translation id="4970484396410298643">Осъществявайте оттук достъп до разделите, които сте отворили на компютъра си.
-
-Трябва само да отворите Chrome на компютъра си и да изберете „Вход в Chrome…“ от менюто.</translation>
 <translation id="497421865427891073">Преминаване напред</translation>
 <translation id="4996978546172906250">Споделяне чрез</translation>
 <translation id="5000922062037820727">Блокирано (препоръчително)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Отваряне в Chrome</translation>
 <translation id="5199929503336119739">Служебен потребителски профил</translation>
 <translation id="5210365745912300556">Затваряне на раздела</translation>
-<translation id="5210714456814679336">Тук ще се показват разделите, които сте отворили в Chrome на другите си устройства.</translation>
 <translation id="5222676887888702881">Изход</translation>
-<translation id="5228579091201413441">Активиране на синхронизирането</translation>
 <translation id="5233638681132016545">Нов раздел</translation>
 <translation id="5271967389191913893">Устройството не може да отвори съдържанието за изтегляне.</translation>
 <translation id="5275558766013849309">Разделите и скорошните приложения ще са на едно място.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Блокирано</translation>
 <translation id="5684874026226664614">Ами сега! Тази страница не можа да се преведе.</translation>
 <translation id="5708031556037168012">Съществуващите данни ще се съхраняват на устройството ви и ще се импортират за постоянно в профила <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Помогнете ни да разберем над кои функции и подобрения да работим първо, като изпращате до Google информация за файловете, приложенията и услугите, които се изпълняват при настъпване на срив.
-
-Статистическите данни за употребата съдържат информация като предпочитания, кликвания върху бутони и използвана памет. Те не включват URL адреси на уеб страници, нито каквато и да е лична информация. Сигналите за сривове съдържат системни данни от момента на срива и може да включват URL адреси на уеб страници или лична информация в зависимост от това, какво се е случвало по време на срива.</translation>
 <translation id="5719837394786370183">След като затворите всички раздели в режим „инкогнито“, преглежданите в тях страници няма да останат в историята или хранилището за „бисквитки“ на браузъра ви, нито в историята на търсенето. Ще се запазят всички файлове, които изтеглите, или отметки, които създадете.
 
 Сърфирането ви обаче не е невидимо. При преминаване в режим „инкогнито“ то не се скрива от работодателя ви и от доставчика ви на интернет услуги, нито от уебсайтовете, които посещавате.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Опресняване</translation>
 <translation id="7191430249889272776">Разделът е отворен на заден план.</translation>
 <translation id="7208788139759694678">Деактивирахте Икономия на данни</translation>
+<translation id="7220786058474068424">Обработва се</translation>
 <translation id="7243308994586599757">Опциите са в долната част на екрана</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> използва местоположението ви, за да показва резултати от местното търсене</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Помощ<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Анулиране на избора</translation>
 <translation id="7851858861565204677">Други устройства</translation>
 <translation id="7876243839304621966">Премахване на всички</translation>
+<translation id="7902333740914687335">Плащането е обработено</translation>
 <translation id="7947953824732555851">Приемам и влизам</translation>
 <translation id="7949961459945740081">Получете най-новите функции</translation>
 <translation id="7963646190083259054">Доставчик:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Съдържание</translation>
 <translation id="8173098127580644436">самото начало</translation>
 <translation id="8200772114523450471">Възобновяване</translation>
+<translation id="8202097416529803614">Обобщена информация за поръчката</translation>
 <translation id="8209050860603202033">Отваряне на изображението</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> иска да установи връзка със:</translation>
 <translation id="8218346974737627104">Потвърждаване на влизането в профила</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Отваряне в другия прозорец</translation>
 <translation id="8959122750345127698">Навигирането не е възможно: <ph name="URL" /></translation>
 <translation id="8979340629087822094">последния ден</translation>
+<translation id="8981454092730389528">Контроли за активността в Google</translation>
+<translation id="8986494364107987395">Автоматично изпращане до Google на статистически данни за използването на Chrome и сигнали за сривове</translation>
 <translation id="8987061207681586800">Персонализирайте Chrome</translation>
 <translation id="9019902583201351841">Управлява се от родителите ви</translation>
 <translation id="9020607083536754075">Затваряне на текущия раздел и връщане към предишното приложение</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
index a7a05e21..a133d915 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">S'ha traduït a <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Sincronitzeu les adreces d'interès</translation>
 <translation id="17513872634828108">Pestanyes obertes</translation>
+<translation id="1756600373018374892">Toqueu aquest botó per accedir ràpidament a les vostres pestanyes.</translation>
 <translation id="1807246157184219062">Clar</translation>
 <translation id="1825719650605518411">Experiència de primera execució</translation>
 <translation id="1829244130665387512">Cerca a la pàgina</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Activeu el permís per a Chrome a la <ph name="BEGIN_LINK" />configuració d'Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Desa les contrasenyes</translation>
 <translation id="1944384637046898011">Encripta totes les dades amb la contrasenya de Google del dia <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Especifiqueu com Google utilitza el vostre historial de navegació per personalitzar la Cerca i altres serveis de Google.</translation>
 <translation id="1959930595721737608">Permet JavaScript al lloc següent.</translation>
 <translation id="1966710179511230534">Actualitzeu les dades d'inici de sessió.</translation>
 <translation id="1974060860693918893">Configuració avançada</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, aplicació web. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Restringeix</translation>
 <translation id="2315043854645842844">El sistema operatiu no permet seleccionar el certificat del client.</translation>
-<translation id="2316129865977710310">No, gràcies</translation>
 <translation id="2321958826496381788">Arrossegueu el control lliscant fins que ho pugueu llegir còmodament. El text ha de ser almenys així de gran després de tocar dos cops un paràgraf.</translation>
-<translation id="2329597144923131178">Inicieu la sessió per tenir adreces d'interès, historial, contrasenyes i altres opcions de configuració en tots els dispositius.</translation>
 <translation id="2343328333327081434">Instal·lant…</translation>
 <translation id="2351097562818989364">S'ha restablert la configuració de traducció.</translation>
 <translation id="2359808026110333948">Continua</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Carpeta principal</translation>
 <translation id="2870560284913253234">Lloc</translation>
 <translation id="2888126860611144412">Quant a Chrome </translation>
+<translation id="2889768325388591707">Canvieu de pestanya ràpidament</translation>
 <translation id="2891154217021530873">Atura la càrrega de la pàgina</translation>
 <translation id="2902702728133930130">S'ha produït un error inesperat amb Chrome durant l'arrencada.</translation>
 <translation id="2903493209154104877">Adreces</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Obre en una pestanya d'incògnit</translation>
 <translation id="3090193911106258841">S'està accedint a l'entrada d'àudio i de vídeo</translation>
 <translation id="3137521801621304719">Surt del mode d'incògnit</translation>
+<translation id="3149891296864842641">Opció d'enviament</translation>
+<translation id="3162882791484435636">Seleccioneu l'opció d'enviament</translation>
+<translation id="3173438333156928404">S'ha produït un error en processar el pagament</translation>
 <translation id="3177909033752230686">Idioma de la pàgina:</translation>
 <translation id="3190152372525844641">Activeu els permisos per a Chrome a la <ph name="BEGIN_LINK" />configuració d'Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> de dades desades</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Voleu que <ph name="PASSWORD_MANAGER_BRAND" /> actualitzi la vostra contrasenya per a aquest lloc?</translation>
 <translation id="4881695831933465202">Obre</translation>
 <translation id="4885273946141277891">No s'admet aquest nombre d'instàncies de Chrome.</translation>
+<translation id="4923459931733593730">Pagament</translation>
 <translation id="4943872375798546930">No hi ha resultats</translation>
-<translation id="4970484396410298643">Accediu a les pestanyes que teniu obertes a l'ordinador des d'aquí mateix.
-
-Per fer-ho, obriu Chrome a l'ordinador, aneu al menú i seleccioneu Inicia la sessió a Chrome...</translation>
 <translation id="497421865427891073">Vés endavant</translation>
 <translation id="4996978546172906250">Compartir mitjançant</translation>
 <translation id="5000922062037820727">Bloquejat (recomanat)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Obre a Chrome</translation>
 <translation id="5199929503336119739">Perfil professional</translation>
 <translation id="5210365745912300556">Tanca la pestanya</translation>
-<translation id="5210714456814679336">Les pestanyes que teniu obertes a Chrome als altres dispositius es mostraran aquí.</translation>
 <translation id="5222676887888702881">Tanca la sessió</translation>
-<translation id="5228579091201413441">Activa la sincronització</translation>
 <translation id="5233638681132016545">Pestanya nova</translation>
 <translation id="5271967389191913893">El dispositiu no pot obrir el contingut que s'ha de baixar.</translation>
 <translation id="5275558766013849309">Les pestanyes conviuran amb les aplicacions recents.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Bloquejat</translation>
 <translation id="5684874026226664614">Aquesta pàgina no s'ha pogut traduir.</translation>
 <translation id="5708031556037168012">Mantenir les dades actuals al dispositiu i importar-les permanentment a <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Ajudeu-nos a prioritzar les funcions i les millores en les quals hem de treballar enviant a Google informació sobre els fitxers, les aplicacions i els serveis que s'executaven en el moment de l'error.
-
-Les estadístiques d'ús inclouen dades com ara les preferències, els clics en botons i l'ús de la memòria. No inclouen els URL de les pàgines web ni cap informació personal. Els informes d'error contenen informació del sistema en el moment de l'error i poden incloure els URL de pàgines web o informació personal, en funció de l'activitat registrada en el moment de l'error.</translation>
 <translation id="5719837394786370183">Les pàgines que visualitzeu a les pestanyes d'incògnit no quedaran registrades a l'historial del navegador, al magatzem de galetes ni a l'historial de cerca un cop tanqueu totes les pestanyes d'incògnit. Tots els fitxers que baixeu o les adreces d'interès que creeu es conservaran.
 
 Tanmateix, no sou invisible. El vostre cap, el vostre proveïdor de serveis d'Internet i els llocs web que visiteu poden veure la vostra navegació d'incògnit.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Actualitza</translation>
 <translation id="7191430249889272776">Pestanya oberta en segon pla</translation>
 <translation id="7208788139759694678">Economitzador de dades està desactivat</translation>
+<translation id="7220786058474068424">S'està processant</translation>
 <translation id="7243308994586599757">Opcions disponibles a la part inferior de la pantalla</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> utilitza la vostra ubicació per mostrar resultats de cerca locals</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Ajuda<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Cancel·la la selecció</translation>
 <translation id="7851858861565204677">Altres dispositius</translation>
 <translation id="7876243839304621966">Suprimeix-ho tot</translation>
+<translation id="7902333740914687335">El pagament s'ha processat</translation>
 <translation id="7947953824732555851">Acc. i inicia sessió</translation>
 <translation id="7949961459945740081">Baixa les funcions més recents</translation>
 <translation id="7963646190083259054">Proveïdor:</translation>
@@ -539,12 +538,13 @@
 <translation id="8168435359814927499">Contingut</translation>
 <translation id="8173098127580644436">des de l'inici (totes)</translation>
 <translation id="8200772114523450471">Reempren</translation>
+<translation id="8202097416529803614">Resum de la comanda</translation>
 <translation id="8209050860603202033">Obre la imatge</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> vol connectar amb:</translation>
 <translation id="8218346974737627104">Confirmació de l'inici de sessió</translation>
 <translation id="8218934717680664417">Ara podeu fer cerques amb un sol toc</translation>
 <translation id="8223946939421658889">Esborra les dades</translation>
-<translation id="8261506727792406068">Elimina</translation>
+<translation id="8261506727792406068">Suprimeix</translation>
 <translation id="8275818695183729150">Permet (per a les cerques a la barra d'adreces)</translation>
 <translation id="8283853025636624853">Se sincronitza amb <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
 <translation id="8310344678080805313">Pestanyes estàndard</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Obre en una altra finestra</translation>
 <translation id="8959122750345127698">No es pot accedir a la navegació: <ph name="URL" /></translation>
 <translation id="8979340629087822094">d'ahir</translation>
+<translation id="8981454092730389528">Controls d'activitat de Google</translation>
+<translation id="8986494364107987395">Envia automàticament estadístiques d'ús i informes d'error a Google</translation>
 <translation id="8987061207681586800">Personalitzar Chrome</translation>
 <translation id="9019902583201351841">Gestionat pels pares</translation>
 <translation id="9020607083536754075">Tanca la pestanya actual i torna a l'aplicació anterior</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
index cf828d1..f2932270 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Přeloženo do jazyka <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Synchronizace záložek</translation>
 <translation id="17513872634828108">Otevřené karty</translation>
+<translation id="1756600373018374892">Klepnutím na toto tlačítko získáte rychle přístup ke svým kartám.</translation>
 <translation id="1807246157184219062">Světlé</translation>
 <translation id="1825719650605518411">Zkušenosti při prvním spuštění</translation>
 <translation id="1829244130665387512">Najít na stránce</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Oprávnění pro Chrome zapnete v <ph name="BEGIN_LINK" />Nastavení pro Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Ukládání hesel</translation>
 <translation id="1944384637046898011">Zašifrovat vše pomocí hesla Google z <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Nastavte, jak má Google využívat vaši historii procházení k personalizaci Vyhledávání a dalších služeb Google.</translation>
 <translation id="1959930595721737608">Na následujícím webu povolit JavaScript.</translation>
 <translation id="1966710179511230534">Aktualizujte prosím své přihlašovací údaje.</translation>
 <translation id="1974060860693918893">Rozšířená nastavení</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, webová aplikace <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Upřesnit</translation>
 <translation id="2315043854645842844">Volbu certifikátu na straně klienta operační systém nepodporuje.</translation>
-<translation id="2316129865977710310">Ne, děkuji</translation>
 <translation id="2321958826496381788">Přetahujte posuvník tak dlouho, dokud nebudete moci pohodlně přečíst tento text. Po dvojitém klepnutí na odstavec by měl být text alespoň takto velký.</translation>
-<translation id="2329597144923131178">Přihlaste se a synchronizujte záložky, historii, hesla a další nastavení do všech svých zařízení.</translation>
 <translation id="2343328333327081434">Instalace…</translation>
 <translation id="2351097562818989364">Nastavení překladů bylo resetováno.</translation>
 <translation id="2359808026110333948">Pokračovat</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Nadřazená složka</translation>
 <translation id="2870560284913253234">Stránky</translation>
 <translation id="2888126860611144412">O aplikaci Chrome</translation>
+<translation id="2889768325388591707">Rychlé přepínání karet</translation>
 <translation id="2891154217021530873">Zastavit načítání stránky</translation>
 <translation id="2902702728133930130">Spuštění Chromu se nezdařilo kvůli neočekávané chybě.</translation>
 <translation id="2903493209154104877">Adresy</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Otevřít na anonymní kartě</translation>
 <translation id="3090193911106258841">Přístup ke vstupu zvuku a videa</translation>
 <translation id="3137521801621304719">Ukončit anonymní režim</translation>
+<translation id="3149891296864842641">Způsob dopravy</translation>
+<translation id="3162882791484435636">Vyberte způsob dopravy</translation>
+<translation id="3173438333156928404">Chyba při zpracovávání platby</translation>
 <translation id="3177909033752230686">Jazyk stránky:</translation>
 <translation id="3190152372525844641">Oprávnění pro Chrome zapnete v <ph name="BEGIN_LINK" />Nastavení pro Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905">Uložená data: <ph name="STORAGE_AMOUNT" /></translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Chcete, aby aplikace <ph name="PASSWORD_MANAGER_BRAND" /> aktualizovala vaše heslo pro tento web?</translation>
 <translation id="4881695831933465202">Otevřít</translation>
 <translation id="4885273946141277891">Nepodporovaný počet instancí Chromu.</translation>
+<translation id="4923459931733593730">Platba</translation>
 <translation id="4943872375798546930">Žádné výsledky</translation>
-<translation id="4970484396410298643">Přímo zde můžete přistupovat ke kartám, které máte otevřené na počítači.
-
-Stačí otevřít Chrome v počítači, přejít do nabídky a zvolit možnost Přihlásit se do prohlížeče Chrome…</translation>
 <translation id="497421865427891073">Vpřed</translation>
 <translation id="4996978546172906250">Sdílet prostřednictvím</translation>
 <translation id="5000922062037820727">Blokováno (doporučeno)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Otevřít v Chromu</translation>
 <translation id="5199929503336119739">Pracovní profil</translation>
 <translation id="5210365745912300556">Zavřít kartu</translation>
-<translation id="5210714456814679336">Zde se objeví karty, které máte otevřené v Chromu v ostatních zařízeních.</translation>
 <translation id="5222676887888702881">Odhlásit se</translation>
-<translation id="5228579091201413441">Aktivace synchronizace</translation>
 <translation id="5233638681132016545">Nová karta</translation>
 <translation id="5271967389191913893">Zařízení obsah ke stažení nemůže otevřít.</translation>
 <translation id="5275558766013849309">Karty se budou zobrazovat vedle nedávných aplikací.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Zablokováno</translation>
 <translation id="5684874026226664614">Jejda. Tuto stránku se nepodařilo přeložit.</translation>
 <translation id="5708031556037168012">Uchovat existující data v zařízení a trvale je importovat do účtu <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Pomozte nám upřednostnit funkce a vylepšení, na kterých bychom měli pracovat. Odesílejte do Googlu informace o souborech, aplikacích a službách spuštěných při selhání.
-
-Statistiky využití obsahují informace, jako jsou předvolby, kliknutí na tlačítka a využití paměti. Neobsahují adresy URL webových stránek ani žádné osobní údaje. Zprávy o selhání obsahují informace o systému v době selhání a mohou obsahovat adresy URL webových stránek nebo osobní údaje (v závislosti na činnosti, kterou jste v době selhání právě prováděli).</translation>
 <translation id="5719837394786370183">Stránky, které otevřete na anonymních kartách, po zavření všech anonymních karet nezanechají žádné stopy v historii prohlížeče, v úložišti souborů cookie ani v historii vyhledávání. Všechny stažené soubory a vytvořené záložky však zůstanou zachovány.
 
 Nejste však neviditelní. Anonymní režim neskryje vaši aktivitu před zaměstnavatelem, poskytovatelem internetových služeb ani webovými stránkami, které navštívíte.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Obnovit</translation>
 <translation id="7191430249889272776">Karta je otevřena na pozadí.</translation>
 <translation id="7208788139759694678">Spořič dat není aktivní</translation>
+<translation id="7220786058474068424">Zpracovávání</translation>
 <translation id="7243308994586599757">Možnosti jsou k dispozici ve spodní části obrazovky</translation>
 <translation id="7244362611678346589">Stránky <ph name="SEARCH_ENGINE_URL" /> zobrazují lokální výsledky vyhledávání na základě vaší polohy</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Nápověda<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Zrušit výběr</translation>
 <translation id="7851858861565204677">Jiná zařízení</translation>
 <translation id="7876243839304621966">Odstranit vše</translation>
+<translation id="7902333740914687335">Platba byla zpracována</translation>
 <translation id="7947953824732555851">Přijmout a přihlásit</translation>
 <translation id="7949961459945740081">Získejte nejnovější funkce</translation>
 <translation id="7963646190083259054">Dodavatel:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Obsah</translation>
 <translation id="8173098127580644436">od počátku věků</translation>
 <translation id="8200772114523450471">Pokračovat</translation>
+<translation id="8202097416529803614">Shrnutí objednávky</translation>
 <translation id="8209050860603202033">Otevřít obrázek</translation>
 <translation id="8215250379351058554">Web <ph name="SITE" /> se chce připojit k:</translation>
 <translation id="8218346974737627104">Potvrzení přihlášení</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Otevřít v jiném okně</translation>
 <translation id="8959122750345127698">Navigace není dosažitelná: <ph name="URL" /></translation>
 <translation id="8979340629087822094">z uplynulého dne</translation>
+<translation id="8981454092730389528">Ovládací prvky aktivity Google</translation>
+<translation id="8986494364107987395">Automaticky posílat společnosti Google statistiky používání a zprávy o selhání</translation>
 <translation id="8987061207681586800">Přizpůsobte si Chrome</translation>
 <translation id="9019902583201351841">Spravováno vašimi rodiči</translation>
 <translation id="9020607083536754075">Zavřít aktuální kartu a vrátit se do předchozí aplikace</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
index de8cbaf1..eb2a1c8a8 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Oversat til <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Synkroniser dine bogmærker</translation>
 <translation id="17513872634828108">Åbne faner</translation>
+<translation id="1756600373018374892">Tryk på denne knap for hurtig at få adgang til dine faner.</translation>
 <translation id="1807246157184219062">Lys</translation>
 <translation id="1825719650605518411">Førstegangsoplevelse</translation>
 <translation id="1829244130665387512">Find på side</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Aktivér tilladelse for Chrome i <ph name="BEGIN_LINK" />indstillingerne for Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Gem adgangskoder</translation>
 <translation id="1944384637046898011">Kryptér alle med Google-adgangskoden fra <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Kontrollér, hvordan Google bruger din browserhistorik til at personliggøre Søgning og andre Google-tjenester.</translation>
 <translation id="1959930595721737608">Tillad JavaScript på følgende website.</translation>
 <translation id="1966710179511230534">Opdater dine loginoplysninger.</translation>
 <translation id="1974060860693918893">Avanceret</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, webapp. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Juster</translation>
 <translation id="2315043854645842844">Klientens certifikatvalg understøttes ikke af operativsystemet.</translation>
-<translation id="2316129865977710310">Nej tak</translation>
 <translation id="2321958826496381788">Træk i skyderen, indtil du kan læse dette uden problemer. Når du trykker to gange på et afsnit, skal teksten som minimum være på denne størrelse.</translation>
-<translation id="2329597144923131178">Log ind for at hente bogmærker, historik, adgangskoder og andre indstillinger på alle dine enheder.</translation>
 <translation id="2343328333327081434">Installerer…</translation>
 <translation id="2351097562818989364">Dine oversættelsesindstillinger er nulstillet.</translation>
 <translation id="2359808026110333948">Fortsæt</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Overordnet mappe</translation>
 <translation id="2870560284913253234">Website</translation>
 <translation id="2888126860611144412">Om Chrome</translation>
+<translation id="2889768325388591707">Skift hurtigt mellem faner</translation>
 <translation id="2891154217021530873">Stop sideindlæsning</translation>
 <translation id="2902702728133930130">Der opstod en uventet fejl under start af Chrome.</translation>
 <translation id="2903493209154104877">Adresser</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Åbn i inkognitofane</translation>
 <translation id="3090193911106258841">Åbner lyd- og videoinput</translation>
 <translation id="3137521801621304719">Slå inkognitotilstand fra</translation>
+<translation id="3149891296864842641">Forsendelsesmuligheder</translation>
+<translation id="3162882791484435636">Vælg forsendelsesmulighed</translation>
+<translation id="3173438333156928404">Der opstod fejl under behandlingen af betalingen</translation>
 <translation id="3177909033752230686">Sidens sprog:</translation>
 <translation id="3190152372525844641">Aktivér tilladelse for Chrome i <ph name="BEGIN_LINK" />Indstillinger for Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> gemte data</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Skal <ph name="PASSWORD_MANAGER_BRAND" /> opdatere din adgangskode til dette website?</translation>
 <translation id="4881695831933465202">Åbn</translation>
 <translation id="4885273946141277891">Der er flere forekomster af Chrome, end der understøttes.</translation>
+<translation id="4923459931733593730">Betaling</translation>
 <translation id="4943872375798546930">Ingen resultater</translation>
-<translation id="4970484396410298643">Få adgang til de faner, der er åbne på din computer, lige her.
-
-Du skal bare åbne Chrome på din computer, gå til menuen og vælge "Log ind i Chrome..."</translation>
 <translation id="497421865427891073">Gå fremad</translation>
 <translation id="4996978546172906250">Del via</translation>
 <translation id="5000922062037820727">Blokeret (anbefales)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Åbn i Chrome</translation>
 <translation id="5199929503336119739">Arbejdsprofil</translation>
 <translation id="5210365745912300556">Luk fanen</translation>
-<translation id="5210714456814679336">Her vises faner, som du har åbnet i Chrome på dine andre enheder.</translation>
 <translation id="5222676887888702881">Log ud</translation>
-<translation id="5228579091201413441">Aktivér synkronisering</translation>
 <translation id="5233638681132016545">Ny fane</translation>
 <translation id="5271967389191913893">Enheden kan ikke åbne det indhold, der skal downloades.</translation>
 <translation id="5275558766013849309">Faner findes sammen med de seneste apps.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Blokeret</translation>
 <translation id="5684874026226664614">Ups! Denne side kunne ikke oversættes.</translation>
 <translation id="5708031556037168012">Behold eksisterende data på din enhed, og importér dem permanent til <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Hjælp os med at prioritere de funktioner og forbedringer, vi bør arbejde på, ved at sende oplysninger til Google om, hvilke filer, applikationer og tjenester, der kører, når du oplever nedbrud.
-
-Brugsstatistik indeholder oplysninger, såsom præferencer, antal klik på en knap og hukommelsesforbrug. De omfatter ikke webadresser eller personlige oplysninger. Nedbrudsrapporter indeholder systemoplysninger på tidspunktet for nedbruddet og kan indeholde webadresser eller personlige oplysninger, afhængigt af hvad der skete på tidspunktet for nedbruddet.</translation>
 <translation id="5719837394786370183">De sider, du ser på inkognitofaner, gemmes ikke i browserhistorikken, cookielageret eller søgehistorikken, når du har lukket alle dine inkognitofaner. Alle de filer, du downloader, eller bogmærker, du opretter, vil blive gemt.
 
 Du er dog ikke usynlig. Inkognitotilstanden skjuler ikke dine søgninger fra din arbejdsgiver, din internetudbyder eller de websites, du besøger.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Opdater</translation>
 <translation id="7191430249889272776">Fanen blev åbnet i baggrunden.</translation>
 <translation id="7208788139759694678">Datasparefunktionen er deaktiveret</translation>
+<translation id="7220786058474068424">Behandler</translation>
 <translation id="7243308994586599757">Du finder indstillingerne nederst på skærmen</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> anvender din placering til at vise lokale søgeresultater</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Hjælp<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Annuller valg</translation>
 <translation id="7851858861565204677">Andre enheder</translation>
 <translation id="7876243839304621966">Fjern alt</translation>
+<translation id="7902333740914687335">Betalingen er behandlet</translation>
 <translation id="7947953824732555851">Acceptér og log ind</translation>
 <translation id="7949961459945740081">Hent de nyeste funktioner</translation>
 <translation id="7963646190083259054">Leverandør:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Indhold</translation>
 <translation id="8173098127580644436">altid</translation>
 <translation id="8200772114523450471">Genoptag</translation>
+<translation id="8202097416529803614">Ordreoversigt</translation>
 <translation id="8209050860603202033">Åbn billede</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> vil oprette forbindelse til:</translation>
 <translation id="8218346974737627104">Bekræft login</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Åbn i et andet vindue</translation>
 <translation id="8959122750345127698">Navigationen er ikke mulig: <ph name="URL" /></translation>
 <translation id="8979340629087822094">det seneste døgn</translation>
+<translation id="8981454092730389528">Administration af aktivitet på Google</translation>
+<translation id="8986494364107987395">Send automatisk brugsstatistikker og nedbrudsrapporter til Google</translation>
 <translation id="8987061207681586800">Gør Chrome til dit eget</translation>
 <translation id="9019902583201351841">Administreret af dine forældre</translation>
 <translation id="9020607083536754075">Luk den aktuelle fane, og vend tilbage til forrige app</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
index c356df8..aed0af6 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">In folgende Sprache übersetzt: <ph name="TARGET_LANGUAGE" /></translation>
 <translation id="1749561566933687563">Lesezeichen synchronisieren</translation>
 <translation id="17513872634828108">Geöffnete Tabs</translation>
+<translation id="1756600373018374892">Tippen Sie auf diese Schaltfläche, um schnell auf Ihre Tabs zuzugreifen.</translation>
 <translation id="1807246157184219062">Hell</translation>
 <translation id="1825719650605518411">First Run Experience</translation>
 <translation id="1829244130665387512">Seite durchsuchen</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Berechtigung für Chrome in den <ph name="BEGIN_LINK" />Android-Einstellungen<ph name="END_LINK" /> aktivieren</translation>
 <translation id="1943432128510653496">Passwörter speichern</translation>
 <translation id="1944384637046898011">Ab <ph name="TIME" /> alle Daten mit Google-Passwort verschlüsseln</translation>
+<translation id="1946005195648379376">Legen Sie fest, wie Google anhand des Browserverlaufs die Suche und andere Google-Dienste für Sie personalisieren soll.</translation>
 <translation id="1959930595721737608">JavaScript auf der folgenden Website zulassen.</translation>
 <translation id="1966710179511230534">Bitte aktualisieren Sie Ihre Anmeldeinformationen.</translation>
 <translation id="1974060860693918893">Erweitert</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, Web-App. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Verfeinern</translation>
 <translation id="2315043854645842844">Die clientseitige Zertifikatauswahl wird vom Betriebssystem nicht unterstützt.</translation>
-<translation id="2316129865977710310">Kein Interesse</translation>
 <translation id="2321958826496381788">Ziehen Sie den Schieberegler, bis Sie diesen Text problemlos lesen können. Nach dem Doppeltippen auf einen Abschnitt sollte der Text mindestens so groß sein.</translation>
-<translation id="2329597144923131178">Melden Sie sich an, um Ihre Lesezeichen, Ihren Verlauf, Ihre Passwörter und andere Einstellungen auf allen Ihren Geräten aufzurufen.</translation>
 <translation id="2343328333327081434">Wird installiert…</translation>
 <translation id="2351097562818989364">Übersetzungseinstellungen zurückgesetzt</translation>
 <translation id="2359808026110333948">Weiter</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Übergeordneter Ordner</translation>
 <translation id="2870560284913253234">Website</translation>
 <translation id="2888126860611144412">Info zu Chrome</translation>
+<translation id="2889768325388591707">Schnell zwischen Tabs wechseln</translation>
 <translation id="2891154217021530873">Laden der Seite anhalten</translation>
 <translation id="2902702728133930130">Während des Startvorgangs ist in Chrome ein unerwarteter Fehler aufgetreten.</translation>
 <translation id="2903493209154104877">Adressen</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">In Inkognito-Tab öffnen</translation>
 <translation id="3090193911106258841">Zugriff auf Audio- und Video-Eingang</translation>
 <translation id="3137521801621304719">Inkognitomodus deaktivieren</translation>
+<translation id="3149891296864842641">Versandoption</translation>
+<translation id="3162882791484435636">Versandoption auswählen</translation>
+<translation id="3173438333156928404">Fehler bei der Zahlungsverarbeitung</translation>
 <translation id="3177909033752230686">Sprache der Seite:</translation>
 <translation id="3190152372525844641">Berechtigungen für Chrome in den <ph name="BEGIN_LINK" />Android-Einstellungen<ph name="END_LINK" /> aktivieren</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> gespeicherte Daten</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Soll <ph name="PASSWORD_MANAGER_BRAND" /> Ihr Passwort für diese Website aktualisieren?</translation>
 <translation id="4881695831933465202">Öffnen</translation>
 <translation id="4885273946141277891">Nicht unterstützte Anzahl von Chrome-Instanzen</translation>
+<translation id="4923459931733593730">Zahlung</translation>
 <translation id="4943872375798546930">Keine Ergebnisse</translation>
-<translation id="4970484396410298643">Greifen Sie hier auf die Tabs zu, die Sie auf Ihrem Computer geöffnet haben.
-
-Öffnen Sie dazu Chrome auf Ihrem Computer und wählen Sie im Menü "In Chrome anmelden..." aus.</translation>
 <translation id="497421865427891073">Weiter</translation>
 <translation id="4996978546172906250">Teilen über</translation>
 <translation id="5000922062037820727">Blockiert (empfohlen)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">In Chrome öffnen</translation>
 <translation id="5199929503336119739">Arbeitsprofil</translation>
 <translation id="5210365745912300556">Tab schließen</translation>
-<translation id="5210714456814679336">Hier werden Tabs angezeigt, die Sie auf Ihren anderen Geräten in Chrome geöffnet haben.</translation>
 <translation id="5222676887888702881">Abmelden</translation>
-<translation id="5228579091201413441">Synchronisierung aktivieren</translation>
 <translation id="5233638681132016545">Neuer Tab</translation>
 <translation id="5271967389191913893">Das Gerät kann den Inhalt, der heruntergeladen werden soll, nicht öffnen.</translation>
 <translation id="5275558766013849309">Tabs und letzte Apps werden zusammengefasst.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Blockiert</translation>
 <translation id="5684874026226664614">Hoppla! Diese Seite konnte nicht übersetzt werden.</translation>
 <translation id="5708031556037168012">Vorhandene Daten bleiben auf dem Gerät erhalten und Daten werden dauerhaft in <ph name="TO_ACCOUNT" /> importiert.</translation>
-<translation id="5712189971979076230">Helfen Sie uns dabei, den Funktionen und Verbesserungen Priorität einzuräumen, die Ihnen wichtig sind, indem Sie Informationen über die Dateien, Anwendungen und Dienste, die zum Zeitpunkt eines Absturzes ausgeführt wurden, an Google senden.
-
-Nutzungsstatistiken enthalten Informationen wie Einstellungen, Klicks auf Schaltflächen und Speicherauslastung. URLs von Webseiten oder personenbezogene Daten sind darin nicht enthalten. Absturzberichte enthalten Systeminformationen zum Zeitpunkt des Absturzes. Je nachdem, was zu diesem Zeitpunkt gerade geschah, können auch URLs von Webseiten oder personenbezogene Daten erfasst werden.</translation>
 <translation id="5719837394786370183">Seiten, die Sie sich auf Inkognito-Tabs ansehen, werden nach dem Schließen aller Inkognito-Tabs nicht in Ihrem Browserverlauf, Cookie-Speicher oder Suchverlauf gespeichert. Ihre Lesezeichen und Ihre heruntergeladenen Dateien bleiben erhalten.
 
 Sie sind jedoch nicht unsichtbar. Der Inkognitomodus verhindert nicht, dass Informationen zu Ihren Webaktivitäten von Ihrem Arbeitgeber oder Ihrem Internetanbieter erfasst werden. Zudem verzeichnen auch die Websites, die Sie im Inkognitomodus aufrufen, weiterhin Ihren Besuch.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Aktualisieren</translation>
 <translation id="7191430249889272776">Tab im Hintergrund geöffnet</translation>
 <translation id="7208788139759694678">Datensparmodus deaktiviert</translation>
+<translation id="7220786058474068424">Verarbeitung läuft</translation>
 <translation id="7243308994586599757">Optionen unten auf dem Bildschirm verfügbar</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> zeigt Ihnen lokale Suchergebnisse basierend auf Ihrem Standort.</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Hilfe<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Auswahl aufheben</translation>
 <translation id="7851858861565204677">Andere Geräte</translation>
 <translation id="7876243839304621966">Alle entfernen</translation>
+<translation id="7902333740914687335">Zahlung verarbeitet</translation>
 <translation id="7947953824732555851">Akzeptieren und anmelden</translation>
 <translation id="7949961459945740081">Neue Funktionen herunterladen</translation>
 <translation id="7963646190083259054">Anbieter:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Inhalte</translation>
 <translation id="8173098127580644436">für den gesamten Zeitraum</translation>
 <translation id="8200772114523450471">Fortsetzen</translation>
+<translation id="8202097416529803614">Zusammenfassung der Bestellung</translation>
 <translation id="8209050860603202033">Bild öffnen</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> möchte eine Verbindung herstellen mit:</translation>
 <translation id="8218346974737627104">Anmeldung bestätigen</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">In anderem Fenster öffnen</translation>
 <translation id="8959122750345127698">Navigation nicht möglich: <ph name="URL" /> ist nicht erreichbar.</translation>
 <translation id="8979340629087822094">für den letzten Tag</translation>
+<translation id="8981454092730389528">Google-Aktivitätseinstellungen</translation>
+<translation id="8986494364107987395">Nutzungsstatistiken und Absturzberichte automatisch an Google senden</translation>
 <translation id="8987061207681586800">Chrome personalisieren</translation>
 <translation id="9019902583201351841">Von deinen Eltern verwaltet</translation>
 <translation id="9020607083536754075">Aktuellen Tab schließen und zur zuvor genutzten App wechseln</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
index e014f27..32a256b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Έγινε μετάφραση σε <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Συγχρονίστε τους σελιδοδείκτες σας</translation>
 <translation id="17513872634828108">Ανοικτές καρτέλες</translation>
+<translation id="1756600373018374892">Πατήστε αυτό το κουμπί για γρήγορη πρόσβαση στις καρτέλες σας.</translation>
 <translation id="1807246157184219062">Ανοιχτόχρωμο</translation>
 <translation id="1825719650605518411">Εμπειρία πρώτης εκτέλεσης</translation>
 <translation id="1829244130665387512">Εύρεση στη σελίδα</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Ενεργοποίηση των αδειών για το Chrome στις <ph name="BEGIN_LINK" />Ρυθμίσεις Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Αποθήκευση κωδικών πρόσβασης</translation>
 <translation id="1944384637046898011">Κρυπτογράφηση όλων με κωδικό πρόσβασης Google στις <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Ελέγξτε τον τρόπο με τον οποίο η Google χρησιμοποιεί το ιστορικό περιήγησής σας για να εξατομικεύει την Αναζήτηση και άλλες υπηρεσίες Google.</translation>
 <translation id="1959930595721737608">Να επιτρέπεται η JavaScript στον παρακάτω ιστότοπο.</translation>
 <translation id="1966710179511230534">Ενημερώστε τα στοιχεία σύνδεσής σας.</translation>
 <translation id="1974060860693918893">Σύνθετες</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, εφαρμογή ιστού. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Περιορισμός</translation>
 <translation id="2315043854645842844">Η επιλογή πιστοποιητικού από τον πελάτη δεν υποστηρίζεται από το λειτουργικό σύστημα.</translation>
-<translation id="2316129865977710310">Όχι, ευχαριστώ</translation>
 <translation id="2321958826496381788">Σύρετε το ρυθμιστικό έως ότου να διαβάσετε αυτό το μήνυμα άνετα. Το κείμενο θα πρέπει να είναι τουλάχιστον τόσο μεγάλο αφού πατήσετε δύο φορές σε μια παράγραφο.</translation>
-<translation id="2329597144923131178">Συνδεθείτε για χρήση σελιδοδεικτών, ιστορικού, κωδ.πρόσβ. κ.λπ. σε όλες τις συσκευές.</translation>
 <translation id="2343328333327081434">Εγκατάσταση…</translation>
 <translation id="2351097562818989364">Έγινε επαναφορά ρυθμίσεων μετάφρασης.</translation>
 <translation id="2359808026110333948">Συνέχεια</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Γονικός φάκελος</translation>
 <translation id="2870560284913253234">Ιστότοπος</translation>
 <translation id="2888126860611144412">Σχετικά με το Chrome</translation>
+<translation id="2889768325388591707">Γρήγορη εναλλαγή καρτελών</translation>
 <translation id="2891154217021530873">Διακοπή φόρτωσης σελίδας</translation>
 <translation id="2902702728133930130">Η εκκίνηση του Chrome απέτυχε λόγω ενός μη αναμενόμενου σφάλματος.</translation>
 <translation id="2903493209154104877">Διευθύνσεις</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Άνοιγμα σε καρτέλα ανώνυμης περιήγησης</translation>
 <translation id="3090193911106258841">Πρόσβαση στην είσοδο ήχου και βίντεο</translation>
 <translation id="3137521801621304719">Έξοδος από την κατάσταση ανώνυμης περιήγησης</translation>
+<translation id="3149891296864842641">Επιλογή αποστολής</translation>
+<translation id="3162882791484435636">Ορίστε επιλογή αποστολής</translation>
+<translation id="3173438333156928404">Σφάλμα κατά την επεξεργασία της πληρωμής</translation>
 <translation id="3177909033752230686">Γλώσσα σελίδας:</translation>
 <translation id="3190152372525844641">Ενεργοποίηση των αδειών για το Chrome στις <ph name="BEGIN_LINK" />Ρυθμίσεις Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> αποθηκευμένα δεδομένα</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Θέλετε το <ph name="PASSWORD_MANAGER_BRAND" /> να ενημερώσει τον κωδικό πρόσβασής σας για αυτόν τον ιστότοπο;</translation>
 <translation id="4881695831933465202">Άνοιγμα</translation>
 <translation id="4885273946141277891">Μη υποστηριζόμενος αριθμός παρουσιών Chrome.</translation>
+<translation id="4923459931733593730">Πληρωμή</translation>
 <translation id="4943872375798546930">Δεν υπάρχουν αποτελέσματα</translation>
-<translation id="4970484396410298643">Αποκτήστε πρόσβαση στις καρτέλες που έχετε ανοίξει στον υπολογιστή σας, από εδώ.
-
-Ανοίξτε απλώς το Chrome στον υπολογιστή σας, μεταβείτε στο μενού και επιλέξτε "Σύνδεση στο Chrome…"</translation>
 <translation id="497421865427891073">Μετάβαση προς τα εμπρός</translation>
 <translation id="4996978546172906250">Κοινή χρήση μέσω</translation>
 <translation id="5000922062037820727">Αποκλείεται (συνιστάται)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Άνοιγμα στο Chrome</translation>
 <translation id="5199929503336119739">Προφίλ εργασίας</translation>
 <translation id="5210365745912300556">Κλείσιμο καρτέλας</translation>
-<translation id="5210714456814679336">Οι καρτέλες που έχετε ανοίξει στο Chrome σε άλλες συσκευές θα εμφανίζονται εδώ.</translation>
 <translation id="5222676887888702881">Έξοδος</translation>
-<translation id="5228579091201413441">Ενεργοποίηση συγχρονισμού</translation>
 <translation id="5233638681132016545">Νέα καρτέλα</translation>
 <translation id="5271967389191913893">Η συσκευή δεν μπορεί να ανοίξει το περιεχόμενο προς λήψη.</translation>
 <translation id="5275558766013849309">Οι καρτέλες θα συνυπάρχουν με τις πρόσφατες εφαρμογές.</translation>
@@ -343,9 +343,6 @@
 <translation id="5677928146339483299">Αποκλεισμένος</translation>
 <translation id="5684874026226664614">Ωχ. Δεν ήταν δυνατή η μετάφραση αυτής της σελίδας.</translation>
 <translation id="5708031556037168012">Να διατηρηθούν τα υπάρχοντα δεδομένα στη συσκευή σας και να γίνει οριστική εισαγωγή των δεδομένων στο λογαριασμό <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Βοηθήστε μας να ορίσουμε προτεραιότητες στις λειτουργίες και τις βελτιώσεις, πάνω στις οποίες πρέπει να εργαστούμε, αποστέλλοντας στην Google πληροφορίες σχετικά με τα αρχεία, τις εφαρμογές και τις υπηρεσίες που εκτελούνται κάθε φορά που προκύπτει κάποιο σφάλμα.
-
-Τα στατιστικά χρήσης περιλαμβάνουν πληροφορίες όπως οι προτιμήσεις, τα κλικ κουμπιών και η χρήση της μνήμης. Αυτές δεν περιλαμβάνουν διευθύνσεις URL ιστοσελίδων ή προσωπικές πληροφορίες. Οι αναφορές σφαλμάτων περιέχουν πληροφορίες συστήματος για τη χρονική στιγμή που παρουσιάστηκε το σφάλμα και ενδέχεται να περιλαμβάνουν διευθύνσεις URL ιστοσελίδων ή προσωπικές πληροφορίες, ανάλογα με το τι συνέβαινε στον υπολογιστή τη χρονική στιγμή που παρουσιάστηκε το σφάλμα.</translation>
 <translation id="5719837394786370183">Οι σελίδες που προβάλετε στις καρτέλες της ανώνυμης περιήγησης δεν διατηρούνται στο ιστορικό του προγράμματος περιήγησής σας, στα cookie ή στο ιστορικό αναζήτησης, αφού κλείσετε όλες τις καρτέλες της ανώνυμης περιήγησης. Τα αρχεία που κατεβάζετε ή οι σελιδοδείκτες που δημιουργείτε θα διατηρηθούν.
 
 Ωστόσο, δεν είστε αόρατοι. Με την ανώνυμη περιήγηση δεν γίνεται απόκρυψη της περιήγησής σας από τον εργοδότη σας, τον παροχέα υπηρεσιών διαδικτύου ή τους ιστότοπους που επισκέπτεστε.</translation>
@@ -464,6 +461,7 @@
 <translation id="7180611975245234373">Ανανέωση</translation>
 <translation id="7191430249889272776">Η καρτέλα άνοιξε στο παρασκήνιο.</translation>
 <translation id="7208788139759694678">Η Εξοικονόμηση δεδομένων είναι απενεργοποιημένη</translation>
+<translation id="7220786058474068424">Επεξεργασία</translation>
 <translation id="7243308994586599757">Διαθέσιμες επιλογές κοντά κάτω μέρος της οθόνης</translation>
 <translation id="7244362611678346589">Το <ph name="SEARCH_ENGINE_URL" /> χρησιμοποιεί την τοποθεσία σας για την εμφάνιση τοπικών αποτελεσμάτων αναζήτησης</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Βοήθεια<ph name="END_LINK" /></translation>
@@ -517,6 +515,7 @@
 <translation id="7846076177841592234">Ακύρωση επιλογής</translation>
 <translation id="7851858861565204677">Άλλες συσκευές</translation>
 <translation id="7876243839304621966">Κατάργηση όλων</translation>
+<translation id="7902333740914687335">Έγινε επεξεργασία της πληρωμής</translation>
 <translation id="7947953824732555851">Αποδοχή και σύνδεση</translation>
 <translation id="7949961459945740081">Λήψη τελευταίων λειτουργιών</translation>
 <translation id="7963646190083259054">Προμηθευτής:</translation>
@@ -540,6 +539,7 @@
 <translation id="8168435359814927499">Περιεχόμενο</translation>
 <translation id="8173098127580644436">από την αρχή</translation>
 <translation id="8200772114523450471">Συνέχιση</translation>
+<translation id="8202097416529803614">Σύνοψη παραγγελίας</translation>
 <translation id="8209050860603202033">Άνοιγμα εικόνας</translation>
 <translation id="8215250379351058554">Ο ιστότοπος <ph name="SITE" /> θέλει να συνδεθεί στο:</translation>
 <translation id="8218346974737627104">Επιβεβαίωση σύνδεσης</translation>
@@ -596,6 +596,8 @@
 <translation id="8942627711005830162">Άνοιγμα σε άλλο παράθυρο</translation>
 <translation id="8959122750345127698">Δεν είναι δυνατή η μετάβαση στη διεύθυνση: <ph name="URL" /></translation>
 <translation id="8979340629087822094">τελευταία ημέρα</translation>
+<translation id="8981454092730389528">Στοιχεία ελέγχου δραστηριότητας Google</translation>
+<translation id="8986494364107987395">Αυτόματη αποστολή στατιστικών στοιχείων χρήσης και αναφορών σφαλμάτων στην Google</translation>
 <translation id="8987061207681586800">Εξατομικεύστε το Chrome</translation>
 <translation id="9019902583201351841">Διαχειρίζεται από τους γονείς σου</translation>
 <translation id="9020607083536754075">Κλείσιμο της τρέχουσας καρτέλας και επιστροφή στην προηγούμενη εφαρμογή</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
index eabb3f4..76967d20 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Translated to <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Sync your bookmarks</translation>
 <translation id="17513872634828108">Open tabs</translation>
+<translation id="1756600373018374892">Tap this button for quick access to your tabs.</translation>
 <translation id="1807246157184219062">Light</translation>
 <translation id="1825719650605518411">First Run Experience</translation>
 <translation id="1829244130665387512">Find in page</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Turn on permission for Chrome in <ph name="BEGIN_LINK" />Android Settings<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Save passwords</translation>
 <translation id="1944384637046898011">Encrypt all with Google password as of <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Control how Google uses your browsing history to personalise Search and other Google services.</translation>
 <translation id="1959930595721737608">Allow JavaScript on the following site.</translation>
 <translation id="1966710179511230534">Please update your sign-in details.</translation>
 <translation id="1974060860693918893">Advanced</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, web app. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Refine</translation>
 <translation id="2315043854645842844">Client side certificate selection is not supported by the operating system.</translation>
-<translation id="2316129865977710310">No, thank you</translation>
 <translation id="2321958826496381788">Drag the slider until you can read this comfortably. Text should look at least this big after double-tapping on a paragraph.</translation>
-<translation id="2329597144923131178">Sign in to get your bookmarks, history, passwords and other settings on all your devices</translation>
 <translation id="2343328333327081434">Installing…</translation>
 <translation id="2351097562818989364">Your translate settings have been reset.</translation>
 <translation id="2359808026110333948">Continue</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Parent folder</translation>
 <translation id="2870560284913253234">Site</translation>
 <translation id="2888126860611144412">About Chrome</translation>
+<translation id="2889768325388591707">Quickly switch tabs</translation>
 <translation id="2891154217021530873">Stop page loading</translation>
 <translation id="2902702728133930130">Chrome failed during start-up with an unexpected error.</translation>
 <translation id="2903493209154104877">Addresses</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Open in incognito tab</translation>
 <translation id="3090193911106258841">Accessing audio and video input</translation>
 <translation id="3137521801621304719">Leave incognito mode</translation>
+<translation id="3149891296864842641">Delivery option</translation>
+<translation id="3162882791484435636">Select shipping option</translation>
+<translation id="3173438333156928404">Error processing payment</translation>
 <translation id="3177909033752230686">Page language:</translation>
 <translation id="3190152372525844641">Turn on permissions for Chrome in <ph name="BEGIN_LINK" />Android Settings<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> stored data</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Do you want <ph name="PASSWORD_MANAGER_BRAND" /> to update your password for this site?</translation>
 <translation id="4881695831933465202">Open</translation>
 <translation id="4885273946141277891">Unsupported number of Chrome instances.</translation>
+<translation id="4923459931733593730">Payment</translation>
 <translation id="4943872375798546930">No results</translation>
-<translation id="4970484396410298643">Access the tabs that you have open on your computer, right here.
-
-Just open Chrome on your computer, go to the menu and select “Sign in to Chrome…”</translation>
 <translation id="497421865427891073">go forward</translation>
 <translation id="4996978546172906250">Share via</translation>
 <translation id="5000922062037820727">Blocked (recommended)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Open in Chrome</translation>
 <translation id="5199929503336119739">Work profile</translation>
 <translation id="5210365745912300556">Close tab</translation>
-<translation id="5210714456814679336">Tabs that you've opened in Chrome on your other devices will appear here.</translation>
 <translation id="5222676887888702881">Sign out</translation>
-<translation id="5228579091201413441">Enable sync</translation>
 <translation id="5233638681132016545">New tab</translation>
 <translation id="5271967389191913893">Device cannot open the content to be downloaded.</translation>
 <translation id="5275558766013849309">Tabs will live together with recent apps.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Blocked</translation>
 <translation id="5684874026226664614">Oops. This page could not be translated.</translation>
 <translation id="5708031556037168012">Keep existing data on your device and permanently import the data to <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Help us to prioritise the features and improvements that we should work on by sending Google information about the files, applications and services running whenever you experience a crash.
-
-        Usage statistics include information such as preferences, button clicks and memory usage. They do not include web page URLs or any personal information. Crash reports contain system information at the time of the crash, and may contain web page URLs or personal information, depending on what was happening at the time of the crash.</translation>
 <translation id="5719837394786370183">Pages that you view in incognito tabs won’t stick around in your browser’s history, cookie store or search history after you've closed all of your incognito tabs. Any files that you download or bookmarks that you create will be kept.
 
 However, you aren't invisible. Going incognito doesn't hide your browsing from your employer, your Internet service provider or the websites you visit.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Refresh</translation>
 <translation id="7191430249889272776">Tab opened in background.</translation>
 <translation id="7208788139759694678">Data Saver disabled</translation>
+<translation id="7220786058474068424">Processing</translation>
 <translation id="7243308994586599757">Options available near bottom of the screen</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> uses your location to show local search results</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Help<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Cancel selection</translation>
 <translation id="7851858861565204677">Other Devices</translation>
 <translation id="7876243839304621966">Remove all</translation>
+<translation id="7902333740914687335">Payment processed</translation>
 <translation id="7947953824732555851">Accept and sign in</translation>
 <translation id="7949961459945740081">Get the latest features</translation>
 <translation id="7963646190083259054">Vendor:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Content</translation>
 <translation id="8173098127580644436">beginning of time</translation>
 <translation id="8200772114523450471">Resume</translation>
+<translation id="8202097416529803614">Order summary</translation>
 <translation id="8209050860603202033">Open image</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> wants to connect to:</translation>
 <translation id="8218346974737627104">Confirm sign-in</translation>
@@ -593,6 +593,8 @@
 <translation id="8942627711005830162">Open in other window</translation>
 <translation id="8959122750345127698">Navigation is unreachable: <ph name="URL" /></translation>
 <translation id="8979340629087822094">past day</translation>
+<translation id="8981454092730389528">Google Activity Controls</translation>
+<translation id="8986494364107987395">Automatically send usage statistics and crash reports to Google</translation>
 <translation id="8987061207681586800">Make Chrome yours</translation>
 <translation id="9019902583201351841">Managed by your parents</translation>
 <translation id="9020607083536754075">Close the current tab and return to the previous app</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
index 9887e05..40b4360 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
@@ -62,7 +62,7 @@
 <translation id="17513872634828108">Pestañas abiertas</translation>
 <translation id="1807246157184219062">Claro</translation>
 <translation id="1825719650605518411">Primera experiencia de ejecución</translation>
-<translation id="1829244130665387512">Buscar en una página</translation>
+<translation id="1829244130665387512">Buscar en la página</translation>
 <translation id="1832521218263067499">Incidentes de seguridad</translation>
 <translation id="1842969606798536927">Pagar</translation>
 <translation id="1853692000353488670">Nueva pestaña de incógnito</translation>
@@ -88,16 +88,14 @@
 <translation id="2126426811489709554">Con tecnología de Chrome</translation>
 <translation id="213279576345780926">Pestaña <ph name="TAB_TITLE" /> cerrada</translation>
 <translation id="2138201775715568214">Buscando páginas web físicas cercanas</translation>
-<translation id="2139186145475833000">Agregar a pant. principal</translation>
+<translation id="2139186145475833000">Agregar a la pantalla principal</translation>
 <translation id="2154710561487035718">Copiar URL</translation>
 <translation id="21570240866965662">Conexión lenta</translation>
 <translation id="219985413780390209">Protegerte a ti y a tu dispositivo contra sitios peligrosos</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" /> (aplicación web), <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Definir mejor</translation>
 <translation id="2315043854645842844">El sistema operativo no admite la selección de certificados del lado del cliente.</translation>
-<translation id="2316129865977710310">No, gracias</translation>
 <translation id="2321958826496381788">Arrastra el control deslizante hasta que puedas leer esto cómodamente. El texto debería verse, al menos, de este tamaño al tocar dos veces un párrafo.</translation>
-<translation id="2329597144923131178">Accede a tu cuenta para ver los marcadores, el historial, las contraseñas y otras opciones de configuración en todos los dispositivos.</translation>
 <translation id="2343328333327081434">Instalando…</translation>
 <translation id="2351097562818989364">Se restableció la configuración de traducción.</translation>
 <translation id="2359808026110333948">Continuar</translation>
@@ -270,9 +268,6 @@
 <translation id="4881695831933465202">Abrir</translation>
 <translation id="4885273946141277891">Cantidad de instancias de Chrome no admitidas</translation>
 <translation id="4943872375798546930">Sin resultados</translation>
-<translation id="4970484396410298643">Accede aquí a las pestañas que abriste en la computadora.
-
-Abre Chrome en la computadora, accede al menú y selecciona "Acceder a Chrome…".</translation>
 <translation id="497421865427891073">Avanzar</translation>
 <translation id="4996978546172906250">Compartir mediante</translation>
 <translation id="5000922062037820727">Bloqueado (recomendado)</translation>
@@ -296,9 +291,7 @@
 <translation id="5184329579814168207">Abrir en Chrome</translation>
 <translation id="5199929503336119739">Perfil de trabajo</translation>
 <translation id="5210365745912300556">Cerrar pestaña</translation>
-<translation id="5210714456814679336">Aparecerán aquí las pestañas que abriste en Chrome desde otros dispositivos.</translation>
 <translation id="5222676887888702881">Salir</translation>
-<translation id="5228579091201413441">Habilitar sincronización</translation>
 <translation id="5233638681132016545">Nueva pestaña</translation>
 <translation id="5271967389191913893">El dispositivo no puede abrir el contenido que se descargará.</translation>
 <translation id="5275558766013849309">Las pestañas se encontrarán junto a las aplicaciones recientes.</translation>
@@ -343,9 +336,6 @@
 <translation id="5677928146339483299">Bloqueado</translation>
 <translation id="5684874026226664614">No se puede traducir esta página.</translation>
 <translation id="5708031556037168012">Mantiene los datos existentes en tu dispositivo y los importa de forma permanente a <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Ayúdanos a establecer prioridades entre las características y las mejoras en las que debemos trabajar: envía información a Google acerca de los archivos, las aplicaciones y los servicios en ejecución cuando se produce un bloqueo.
-
-Las estadísticas de uso incluyen información, como las preferencias, los clics en los botones y el uso de memoria. No se incluyen las URL de las páginas web ni ninguna información personal. Los informes de fallos incluyen la información del sistema en el momento del bloqueo y podrían contener URL de páginas web o información personal, según lo que haya ocurrido en el momento del bloqueo.</translation>
 <translation id="5719837394786370183">Una vez que cierres todas las pestañas de incógnito, los datos de las páginas que hayas visitado en ese modo no se guardarán en el historial del navegador, en la lista de cookies ni en el historial de búsquedas. Sí se guardarán los archivos que descargues y los marcadores que crees.
 
 Sin embargo, no vas a pasar completamente desapercibido. El modo de navegación de incógnito no oculta tu información de navegación de un empleador, del proveedor de servicios de Internet ni de los sitios web que visitas.</translation>
@@ -596,6 +586,7 @@
 <translation id="8942627711005830162">Abrir en otra ventana</translation>
 <translation id="8959122750345127698">Navegación inaccesible: <ph name="URL" /></translation>
 <translation id="8979340629087822094">ayer</translation>
+<translation id="8986494364107987395">Enviar automáticamente estadísticas de uso e informes sobre fallos a Google</translation>
 <translation id="8987061207681586800">Personaliza Chrome</translation>
 <translation id="9019902583201351841">Administrado por tus padres</translation>
 <translation id="9020607083536754075">Cerrar la pestaña actual y volver a la app anterior</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
index b6f0c85a..3f4e2aa9 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Se ha traducido al <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Sincronizar marcadores</translation>
 <translation id="17513872634828108">Pestañas abiertas</translation>
+<translation id="1756600373018374892">Toca este botón para acceder rápidamente a tus pestañas.</translation>
 <translation id="1807246157184219062">Claro</translation>
 <translation id="1825719650605518411">Primera experiencia de ejecución</translation>
 <translation id="1829244130665387512">Buscar en la página</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Activa el permiso para Chrome en los <ph name="BEGIN_LINK" />ajustes de Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Guardar contraseñas</translation>
 <translation id="1944384637046898011">Cifrar todo con una contraseña de Google a partir del <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Controla como utiliza Google tu historial de navegación para personalizar la Búsqueda y otros servicios de Google.</translation>
 <translation id="1959930595721737608">Permite JavaScript en el siguiente sitio web.</translation>
 <translation id="1966710179511230534">Actualiza tus datos de inicio de sesión.</translation>
 <translation id="1974060860693918893">Opciones avanzadas</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, una aplicación web disponible en <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Restringir</translation>
 <translation id="2315043854645842844">El sistema operativo no admite la selección de certificados de cliente.</translation>
-<translation id="2316129865977710310">No, gracias</translation>
 <translation id="2321958826496381788">Arrastra el control deslizante hasta que puedas leer cómodamente. El texto debe tener al menos este tamaño después de tocar un párrafo dos veces.</translation>
-<translation id="2329597144923131178">Accede para ver marcadores, historial, contraseñas y otros en dispos.</translation>
 <translation id="2343328333327081434">Instalando…</translation>
 <translation id="2351097562818989364">Se han restablecido tus ajustes de traducción.</translation>
 <translation id="2359808026110333948">Continuar</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Carpeta principal</translation>
 <translation id="2870560284913253234">Sitio</translation>
 <translation id="2888126860611144412">Información de Chrome</translation>
+<translation id="2889768325388591707">Cambia de pestañas rápidamente</translation>
 <translation id="2891154217021530873">Detener la carga de la página</translation>
 <translation id="2902702728133930130">Se ha producido un error inesperado en Chrome durante el inicio.</translation>
 <translation id="2903493209154104877">Direcciones</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Abrir en modo de incógnito</translation>
 <translation id="3090193911106258841">Accediendo a la entrada de vídeo y audio</translation>
 <translation id="3137521801621304719">Salir del modo incógnito</translation>
+<translation id="3149891296864842641">Opción de envío</translation>
+<translation id="3162882791484435636">Seleccionar opción de envío</translation>
+<translation id="3173438333156928404">Error al procesar pago</translation>
 <translation id="3177909033752230686">Idioma de la página:</translation>
 <translation id="3190152372525844641">Activa los permisos para Chrome en los <ph name="BEGIN_LINK" />ajustes de Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> de datos almacenados</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">¿Quieres que <ph name="PASSWORD_MANAGER_BRAND" /> actualice tu contraseña para este sitio web?</translation>
 <translation id="4881695831933465202">Abrir</translation>
 <translation id="4885273946141277891">Número de instancias de Chrome no admitido.</translation>
+<translation id="4923459931733593730">Pago</translation>
 <translation id="4943872375798546930">Sin resultados</translation>
-<translation id="4970484396410298643">Accede a las pestañas que tengas abiertas en tu ordenador desde aquí.
-
-Solo tienes que abrir Chrome en tu ordenador, ir al menú y seleccionar "Iniciar sesión en Chrome..."</translation>
 <translation id="497421865427891073">Avanzar</translation>
 <translation id="4996978546172906250">Compartir a través de</translation>
 <translation id="5000922062037820727">Bloqueado (recomendado)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Abrir en Chrome</translation>
 <translation id="5199929503336119739">Perfil de trabajo</translation>
 <translation id="5210365745912300556">Cerrar pestaña</translation>
-<translation id="5210714456814679336">Aquí aparecerán las pestañas que hayas abierto en Chrome en otros dispositivos.</translation>
 <translation id="5222676887888702881">Cerrar sesión</translation>
-<translation id="5228579091201413441">Habilitar sincronización</translation>
 <translation id="5233638681132016545">Nueva pestaña</translation>
 <translation id="5271967389191913893">El dispositivo no puede abrir el contenido para descargarlo.</translation>
 <translation id="5275558766013849309">Las pestañas aparecerán junto a aplicaciones recientes.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Con bloqueo</translation>
 <translation id="5684874026226664614">¡Vaya! No se ha podido traducir esta página.</translation>
 <translation id="5708031556037168012">Los datos actuales se mantienen en tu dispositivo y se importan los datos a <ph name="TO_ACCOUNT" /> de forma permanente.</translation>
-<translation id="5712189971979076230">Ayúdanos a priorizar las funciones y las mejoras en las que debemos trabajar enviando información a Google sobre los archivos, las aplicaciones y los servicios utilizados cuando se produce un error.
-
-Las estadísticas de uso incluyen información sobre preferencias, clics en botones, uso de memoria y otros datos. No incluyen las URL de páginas web ni información personal. Los informes sobre fallos contienen información del sistema en el momento del error y pueden incluir las URL de páginas web o información personal (según lo que haya sucedido en el momento del fallo).</translation>
 <translation id="5719837394786370183">Las páginas que visites a través de las pestañas de incógnito no se mostrarán en el historial del navegador, en el almacén de cookies ni en el historial de búsquedas una vez que cierres todas las pestañas de incógnito. Sí se conservarán los archivos que descargues y los marcadores que crees.
 
 No obstante, tus acciones no serán totalmente invisibles. El uso del modo incógnito no te permite ocultar tu actividad de navegación a tu empresa, a tu proveedor de servicios de Internet o a los sitios web que visites.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Actualizar</translation>
 <translation id="7191430249889272776">Pestaña abierta en segundo plano.</translation>
 <translation id="7208788139759694678">Economizador de datos inhabilitado</translation>
+<translation id="7220786058474068424">Procesando pago</translation>
 <translation id="7243308994586599757">Opciones disponibles cerca de la parte inferior de la pantalla</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> utiliza tu ubicación para mostrar resultados de búsqueda locales</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Ayuda<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Cancelar selección</translation>
 <translation id="7851858861565204677">Otros dispositivos</translation>
 <translation id="7876243839304621966">Eliminar todo</translation>
+<translation id="7902333740914687335">Pago procesado</translation>
 <translation id="7947953824732555851">Aceptar y acceder</translation>
 <translation id="7949961459945740081">Obtener las últimas funciones</translation>
 <translation id="7963646190083259054">Proveedor:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Contenido</translation>
 <translation id="8173098127580644436">el origen de los tiempos</translation>
 <translation id="8200772114523450471">Reanudar</translation>
+<translation id="8202097416529803614">Resumen del pedido</translation>
 <translation id="8209050860603202033">Abrir imagen</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> quiere conectarse a:</translation>
 <translation id="8218346974737627104">Confirmar inicio de sesión</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Abrir en otra ventana</translation>
 <translation id="8959122750345127698">No se puede realizar la navegación: <ph name="URL" /></translation>
 <translation id="8979340629087822094">último día</translation>
+<translation id="8981454092730389528">Controles de actividad de Google</translation>
+<translation id="8986494364107987395">Enviar automáticamente estadísticas de uso e informes sobre fallos a Google</translation>
 <translation id="8987061207681586800">Personaliza Chrome</translation>
 <translation id="9019902583201351841">Administrado por tus padres</translation>
 <translation id="9020607083536754075">Cerrar la pestaña actual y volver a la aplicación anterior</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
index b7b47c14..de2b172 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">به <ph name="TARGET_LANGUAGE" /> ترجمه شد.</translation>
 <translation id="1749561566933687563">همگام‌سازی نشانک‌ها</translation>
 <translation id="17513872634828108">بازکردن برگه‌ها</translation>
+<translation id="1756600373018374892">برای دسترسی سریع به برگه‌هایتان، روی این دکمه ضربه بزنید.</translation>
 <translation id="1807246157184219062">روشن</translation>
 <translation id="1825719650605518411">اولین تجربه اجرا</translation>
 <translation id="1829244130665387512">یافتن در صفحه</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">‏مجوز Chrome را در <ph name="BEGIN_LINK" />تنظیمات Android <ph name="END_LINK" /> روشن کنید.</translation>
 <translation id="1943432128510653496">ذخیره گذرواژه‌ها</translation>
 <translation id="1944384637046898011">‏رمزگذاری همه با گذرواژه Google از تاریخ <ph name="TIME" /></translation>
+<translation id="1946005195648379376">‏نحوه استفاده Google از سابقه مرورتان را برای شخصی‌سازی جستجو و سایر سرویس‌های Google کنترل کنید.</translation>
 <translation id="1959930595721737608">اجرای جاوا اسکریپت را در سایت‌های زیر مجاز می‌کند.</translation>
 <translation id="1966710179511230534">لطفاً جزئیات ورود به سیستم را به‌روز کنید.</translation>
 <translation id="1974060860693918893">پیشرفته</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />، برنامه وب. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">فیلتر</translation>
 <translation id="2315043854645842844">انتخاب گواهی سمت کلاینت توسط سیستم‌عامل پشتیبانی نمی‌شود.</translation>
-<translation id="2316129865977710310">نه سپاسگزارم</translation>
 <translation id="2321958826496381788">لغزنده را بکشید تا زمانی که بتوانید این متن را به راحتی بخوانید. بعد از دو ضربه متوالی روی یک پاراگراف، اندازه نوشتار حداقل باید به این بزرگی باشد.</translation>
-<translation id="2329597144923131178">برای دریافت نشانک‌ها، سابقه، گذرواژه‌ها و سایر تنظیماتتان در همه دستگاه‌ها، وارد سیستم شوید.</translation>
 <translation id="2343328333327081434">در حال نصب…</translation>
 <translation id="2351097562818989364">تنظیمات ترجمه شما بازنشانی شده است.</translation>
 <translation id="2359808026110333948">ادامه</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">پوشه اصلی</translation>
 <translation id="2870560284913253234">سایت</translation>
 <translation id="2888126860611144412">‏درباره Chrome</translation>
+<translation id="2889768325388591707">جابه‌جایی سریع بین برگه‌ها</translation>
 <translation id="2891154217021530873">توقف بارگیری صفحه</translation>
 <translation id="2902702728133930130">‏Chrome در هنگام شروع به کار با خطایی غیرمنتظره متوقف شد.</translation>
 <translation id="2903493209154104877">آدرس‌ها</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">باز کردن در برگه ناشناس</translation>
 <translation id="3090193911106258841">در حال دسترسی به ورودی صوتی و ویدیویی</translation>
 <translation id="3137521801621304719">خروج از حالت ناشناس</translation>
+<translation id="3149891296864842641">گزینه ارسال</translation>
+<translation id="3162882791484435636">انتخاب گزینه ارسال</translation>
+<translation id="3173438333156928404">خطا در پردازش پرداخت</translation>
 <translation id="3177909033752230686">زبان صفحه:</translation>
 <translation id="3190152372525844641">‏مجوزهای Chrome را در <ph name="BEGIN_LINK" />تنظیمات Android <ph name="END_LINK" /> روشن کنید.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> داده‌های ذخیره شده</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">می‌خواهید <ph name="PASSWORD_MANAGER_BRAND" /> گذرواژه‌تان را برای این سایت به‌روزرسانی کند؟</translation>
 <translation id="4881695831933465202">باز کردن</translation>
 <translation id="4885273946141277891">‏این تعداد از نسخه‌های Chrome پشتیبانی نمی‌شود.</translation>
+<translation id="4923459931733593730">پرداخت</translation>
 <translation id="4943872375798546930">نتیجه‌ای یافت نشد</translation>
-<translation id="4970484396410298643">‏از اینجا به برگه‌های باز روی رایانه‌تان دسترسی داشته باشید.
-
-کافیست Chrome را در رایانه‌تان باز کنید، به منو بروید و «ورود به سیستم Chrome...» را انتخاب کنید</translation>
 <translation id="497421865427891073">جلو رفتن</translation>
 <translation id="4996978546172906250">اشتراک‌گذاری از طریق</translation>
 <translation id="5000922062037820727">مسدود (توصیه می‌شود)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">‏باز کردن در Chrome</translation>
 <translation id="5199929503336119739">نمایه کاری</translation>
 <translation id="5210365745912300556">بستن برگه</translation>
-<translation id="5210714456814679336">‏برگه‌هایی که در دستگاه‌های دیگر در Chrome باز کرده‌اید، در اینجا نمایان می‌شوند.</translation>
 <translation id="5222676887888702881">خروج از سیستم</translation>
-<translation id="5228579091201413441">فعال کردن همگام‌سازی</translation>
 <translation id="5233638681132016545">برگه جدید</translation>
 <translation id="5271967389191913893">دستگاه نمی‌تواند محتوا را برای بارگیری باز کند.</translation>
 <translation id="5275558766013849309">زبانه‌ها و برنامه‌های اخیر در یک‌جا قرار می‌گیرند.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">مسدود است</translation>
 <translation id="5684874026226664614">متأسفیم. این صفحه ترجمه نشد.</translation>
 <translation id="5708031556037168012">داده‌های کنونی در دستگاه شما نگه‌داشته می‌شوند و داده‌ها به‌صورت دائم در <ph name="TO_ACCOUNT" /> وارد می‌شوند.</translation>
-<translation id="5712189971979076230">‏هر زمان که با یک خرابی روبه‌رو شدید با ارسال اطلاعات درباره فایل‌ها، برنامه‌ها و سرویس‌های در حال اجرا به Google، به ما کمک کنید قابلیت‌ها و بهبودهایی را که باید روی آن‌ها کار کنیم، اولویت‌بندی کنیم.
-
-آمار کاربرد شامل اطلاعاتی مانند تنظیمات ترجیحی، کلیک‌های روی دکمه و مصرف حافظه می‌شود. این آمار نشانی‌های وب صفحه وب یا اطلاعات شخصی را در برندارند. گزارش‌های خرابی شامل اطلاعات سیستم در زمان خراب شدن است و ممکن است بسته به آنچه که در زمان خرابی اتفاق افتاده است، نشانی‌های وب صفحه وب یا اطلاعات شخصی را در برگیرد.</translation>
 <translation id="5719837394786370183">صفحاتی که در برگه‌های ناشناس می‌بینید بعد از بستن برگه‌های ناشناس، در سابقه مرور، فضای ذخیره کوکی یا سابقه جستجویتان به‌جا نمی‌مانند. هر فایلی که دانلود می‌کنید یا نشانک‌هایی که ایجاد می‌کنید، حفظ می‌شوند.
 با این حال، نامرئی نیستید. رفتن به حالت ناشناس، مرورتان را از کارفرما، ارائه‌کننده خدمات اینترنتی یا وب‌سایت‌هایی که بازید می‌کنید، پنهان نمی‌کند.</translation>
 <translation id="572328651809341494">برگه‌های اخیر</translation>
@@ -462,6 +459,7 @@
 <translation id="7180611975245234373">بازخوانی</translation>
 <translation id="7191430249889272776">برگه در پس‌زمینه باز شد.</translation>
 <translation id="7208788139759694678">صرفه‌جویی داده غیرفعال است</translation>
+<translation id="7220786058474068424">درحال پردازش</translation>
 <translation id="7243308994586599757">گزینه‌ها در نزدیک پایین صفحه نمایش در دسترس هستند</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> از موقعیت مکانی شما برای نمایش نتایج جستجوی محلی استفاده می‌کند</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />راهنما<ph name="END_LINK" /></translation>
@@ -477,7 +475,7 @@
 <translation id="7423098979219808738">ابتدا سؤال شود</translation>
 <translation id="7437998757836447326">‏خروج از سیستم Chrome</translation>
 <translation id="7464701184726199289">با این کار داده‌های همگام‌سازی‌شده در همه دستگاه‌ها پاک می‌شوند. تنظیمات ذخیره‌شده سایت حذف نمی‌شوند و احتمالاً عادات مرور شما را نشان می‌دهند. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation>
-<translation id="7473891865547856676">نه سپاسگزارم</translation>
+<translation id="7473891865547856676">نه متشکرم</translation>
 <translation id="7475192538862203634">درصورتی‌که این مورد را مکرراً مشاهده می‌کنید، این <ph name="BEGIN_LINK" />پیشنهادات<ph name="END_LINK" /> را امتحان کنید.</translation>
 <translation id="748127970106343339">تأیید حذف اعتبارنامه دستگاه</translation>
 <translation id="7487352416683556407">‏داده‌های انتخاب‌‌شده از Chrome و دستگاه‌های همگام‌سازی‌شده شما حذف شد.
@@ -510,11 +508,12 @@
 <translation id="7772032839648071052">تأیید عبارت عبور</translation>
 <translation id="7788788617745289808">‏Chrome باید به دوربین دسترسی داشته باشد تا آن را با این سایت به اشتراک بگذارد.</translation>
 <translation id="7791543448312431591">افزودن</translation>
-<translation id="780301667611848630">نه سپاسگزارم</translation>
+<translation id="780301667611848630">نه متشکرم</translation>
 <translation id="7829298379596169484">در حال دسترسی به ورودی صوتی</translation>
 <translation id="7846076177841592234">لغو انتخاب</translation>
 <translation id="7851858861565204677">دستگاه‌های دیگر</translation>
 <translation id="7876243839304621966">حذف همه</translation>
+<translation id="7902333740914687335">پرداخت پردازش شد</translation>
 <translation id="7947953824732555851">پذیرش و ورود به سیستم</translation>
 <translation id="7949961459945740081">دریافت جدیدترین قابلیت‌ها</translation>
 <translation id="7963646190083259054">ارائه‌دهنده:</translation>
@@ -538,6 +537,7 @@
 <translation id="8168435359814927499">محتوا</translation>
 <translation id="8173098127580644436">از ابتدا</translation>
 <translation id="8200772114523450471">ازسرگیری</translation>
+<translation id="8202097416529803614">خلاصه سفارش</translation>
 <translation id="8209050860603202033">باز کردن تصویر</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> می‌خواهد متصل شود به:</translation>
 <translation id="8218346974737627104">تأیید ورود به سیستم</translation>
@@ -594,6 +594,8 @@
 <translation id="8942627711005830162">باز کردن در پنجره دیگر</translation>
 <translation id="8959122750345127698">پیمایش غیرقابل دسترسی است: <ph name="URL" /></translation>
 <translation id="8979340629087822094">روز گذشته</translation>
+<translation id="8981454092730389528">‏کنترل‌های فعالیت Google</translation>
+<translation id="8986494364107987395">‏ارسال خودکار آمار مصرف و گزارش‌های خرابی به Google</translation>
 <translation id="8987061207681586800">‏Chrome را برای خود اختصاصی کنید</translation>
 <translation id="9019902583201351841">مدیریت شده توسط والدین شما</translation>
 <translation id="9020607083536754075">بستن برگه کنونی و برگشت و به برنامه قبلی</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
index 4782d20..3cfb97a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Käännetty kielelle <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Synkronoi kirjanmerkit</translation>
 <translation id="17513872634828108">Avoimet välilehdet</translation>
+<translation id="1756600373018374892">Käytä välilehtiäsi kätevästi napauttamalla tätä painiketta.</translation>
 <translation id="1807246157184219062">Vaalea</translation>
 <translation id="1825719650605518411">First Run Experience</translation>
 <translation id="1829244130665387512">Haku sivulta</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Ota käyttöoikeus käyttöön Chromelle <ph name="BEGIN_LINK" />Android-asetuksissa<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Salasanojen tallentaminen</translation>
 <translation id="1944384637046898011">Salaa kaikki tiedot Google-salasanalla, joka on asetettu <ph name="TIME" />.</translation>
+<translation id="1946005195648379376">Hallinnoi tapaa, jolla Google käyttää selaushistoriaasi haun ja muiden Googlen palveluiden muokkaamiseen.</translation>
 <translation id="1959930595721737608">Sallii JavaScriptin tällä sivustolla.</translation>
 <translation id="1966710179511230534">Päivitä kirjautumistietosi.</translation>
 <translation id="1974060860693918893">Lisäasetukset</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, verkkosovellus. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Tarkenna</translation>
 <translation id="2315043854645842844">Käyttöjärjestelmä ei tue palvelimen varmennevalintaa.</translation>
-<translation id="2316129865977710310">Ei kiitos</translation>
 <translation id="2321958826496381788">Vedä liukusäädintä, kunnes voit lukea tämän mukavasti. Tekstin tulisi olla vähintään näin suurta kaksoisnapautettuasi kappaletta.</translation>
-<translation id="2329597144923131178">Kirjaudu ja käytä kirjanm., historiaa, salasan. ja muita asetuksia kaikissa laitteissasi.</translation>
 <translation id="2343328333327081434">Asennetaan…</translation>
 <translation id="2351097562818989364">Käännösasetukset on nollattu.</translation>
 <translation id="2359808026110333948">Jatka</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Ylätason kansio</translation>
 <translation id="2870560284913253234">Sivusto</translation>
 <translation id="2888126860611144412">Tietoja Chromesta</translation>
+<translation id="2889768325388591707">Vaihda välilehtiä nopeasti</translation>
 <translation id="2891154217021530873">Pysäytä sivun lataus</translation>
 <translation id="2902702728133930130">Chromen käynnistys epäonnistui odottamattoman virheen takia.</translation>
 <translation id="2903493209154104877">Osoitteet</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Avaa incognito-välilehdessä</translation>
 <translation id="3090193911106258841">Ääni- ja videotuloa käytetään</translation>
 <translation id="3137521801621304719">Poistu incognito-tilasta</translation>
+<translation id="3149891296864842641">Toimitustapa</translation>
+<translation id="3162882791484435636">Valitse toimitustapa</translation>
+<translation id="3173438333156928404">Maksua käsiteltäessä tapahtui virhe.</translation>
 <translation id="3177909033752230686">Sivun kieli:</translation>
 <translation id="3190152372525844641">Ota käyttöoikeudet käyttöön Chromelle <ph name="BEGIN_LINK" />Android-asetuksissa<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> tallennettua tietoa</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Haluatko, että <ph name="PASSWORD_MANAGER_BRAND" /> päivittää tämän sivuston salasanasi?</translation>
 <translation id="4881695831933465202">Avaa</translation>
 <translation id="4885273946141277891">Chromen versioiden määrää ei tueta.</translation>
+<translation id="4923459931733593730">Maksu</translation>
 <translation id="4943872375798546930">Ei tuloksia</translation>
-<translation id="4970484396410298643">Voit käyttää tietokoneella avoinna olevia välilehtiä myös täällä.
-
-Avaa Chrome tietokoneella, siirry valikkoon ja valitse Kirjaudu Chromeen…</translation>
 <translation id="497421865427891073">Siirry eteenpäin</translation>
 <translation id="4996978546172906250">Jaa tällä palvelulla:</translation>
 <translation id="5000922062037820727">Estetty (suositus)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Avaa Chromessa</translation>
 <translation id="5199929503336119739">Työprofiili</translation>
 <translation id="5210365745912300556">Sulje välilehti</translation>
-<translation id="5210714456814679336">Muilla laitteilla Chromessa avaamasi välilehdet näytetään täällä.</translation>
 <translation id="5222676887888702881">Kirjaudu ulos</translation>
-<translation id="5228579091201413441">Ota synkronointi käyttöön</translation>
 <translation id="5233638681132016545">Uusi välilehti</translation>
 <translation id="5271967389191913893">Laite ei voi avata ladattavaa sisältöä.</translation>
 <translation id="5275558766013849309">Välilehdet asustavat tämän jälkeen yhdessä viimeaikaisten sovelluksien kanssa.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Estetty</translation>
 <translation id="5684874026226664614">Hups, tätä sivua ei voi kääntää.</translation>
 <translation id="5708031556037168012">Säilytä nykyiset tiedot laitteella ja vie tiedot pysyvästi tilille <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Voit auttaa Googlea suunnittelemaan ominaisuuksien ja parannuksien tärkeysjärjestystä, jos lähetät meille jokaisen kaatumisen jälkeen tietoja käynnissä olleista tiedostoista, sovelluksista palveluista.
-
-Käyttötilastot sisältävät tietoja esimerkiksi asetuksista, painetuista painikkeista ja muistin käytöstä. Ne eivät sisällä verkkosivujen URL-osoitteita tai henkilötietoja. Kaatumisraportit sisältävät tietoja järjestelmästä kaatumisen aikana, ja niihin voi sisältyä verkkosivujen URL-osoitteita tai henkilökohtaisia tietoja riippuen siitä, mitä kaatumisen aikana tapahtui.</translation>
 <translation id="5719837394786370183">Incognito-välilehdillä avaamasi sivut eivät jää selaimen historiaan, evästeisiin tai hakuhistoriaan, kun olet sulkenut kaikki incognito-välilehdet. Kaikki lataamasi tiedostot ja luomasi kirjanmerkit säilytetään.
 
 Et ole kuitenkaan näkymätön. Incognito-tila ei piilota selaustietojasi työnantajaltasi, internetpalveluntarjoajaltasi tai vierailemiltasi verkkosivustoilta.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Päivitä</translation>
 <translation id="7191430249889272776">Välilehti avattiin taustalla.</translation>
 <translation id="7208788139759694678">Data Saver on poistettu käytöstä.</translation>
+<translation id="7220786058474068424">Käsitellään.</translation>
 <translation id="7243308994586599757">Asetukset löytyvät näytön alalaidasta.</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> käyttää sijaintiasi paikallisten hakutulosten näyttämiseen.</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Ohjeita<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Peruuta valinta</translation>
 <translation id="7851858861565204677">Muut laitteet</translation>
 <translation id="7876243839304621966">Poista kaikki</translation>
+<translation id="7902333740914687335">Maksu käsiteltiin.</translation>
 <translation id="7947953824732555851">Hyväksy ja kirjaudu sisään</translation>
 <translation id="7949961459945740081">Lataa uusimmat ominaisuudet</translation>
 <translation id="7963646190083259054">Toimittaja:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Sisältö</translation>
 <translation id="8173098127580644436">alusta asti</translation>
 <translation id="8200772114523450471">Jatka</translation>
+<translation id="8202097416529803614">Tilauksen yhteenveto</translation>
 <translation id="8209050860603202033">Avaa kuva</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> haluaa muodostaa yhteyden seuraaviin laitteisiin:</translation>
 <translation id="8218346974737627104">Kirjautumisen vahvistaminen</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Avaa uudessa ikkunassa</translation>
 <translation id="8959122750345127698">Kohde ei ole saatavilla: <ph name="URL" /></translation>
 <translation id="8979340629087822094">viimeisen päivän ajalta</translation>
+<translation id="8981454092730389528">Googlen toimintojen hallinta</translation>
+<translation id="8986494364107987395">Lähetä Googlelle käyttötilastoja ja virheraportteja automaattisesti</translation>
 <translation id="8987061207681586800">Muokkaa Chromea</translation>
 <translation id="9019902583201351841">Vanhempiesi hallinnoima</translation>
 <translation id="9020607083536754075">Sulje nykyinen välilehti ja palaa edelliseen sovellukseen</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
index bb8ce5e..4627f441 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Isinalin sa <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">I-sync ang iyong mga bookmark</translation>
 <translation id="17513872634828108">Mga bukas na tab</translation>
+<translation id="1756600373018374892">I-tap ang button na ito para sa mabilis na access sa iyong mga tab.</translation>
 <translation id="1807246157184219062">Maliwanag</translation>
 <translation id="1825719650605518411">Unang Karanasan sa Pagtakbo</translation>
 <translation id="1829244130665387512">Nahanap sa pahina</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">I-on ang pahintulot para sa Chrome sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">I-save ang mga password</translation>
 <translation id="1944384637046898011">I-encrypt lahat gamit ang password ng Google simula sa <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Kontrolin kung paano ginagamit ng Google ang iyong history ng pagba-browse upang i-personalize ang Search at iba pang mga serbisyo ng Google.</translation>
 <translation id="1959930595721737608">Pahintulutan ang JavaScript sa sumusunod na site.</translation>
 <translation id="1966710179511230534">Paki-update ang iyong mga detalye sa pag-sign in.</translation>
 <translation id="1974060860693918893">Advanced</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, web app. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Pinuhin</translation>
 <translation id="2315043854645842844">Hindi sinusuportahan ng operating system ang pagpipilian ng certificate sa panig ng kliyente.</translation>
-<translation id="2316129865977710310">Hindi, salamat</translation>
 <translation id="2321958826496381788">I-drag ang slider hanggang sa mabasa mo ito nang kumportable. Dapat ay halos ganito kalaki ang text pagkatapos mag-double tap sa isang talata.</translation>
-<translation id="2329597144923131178">Mag-sign in upang makuha ang iyong mga bookmark, history, password at ibang mga setting sa lahat ng iyong device.</translation>
 <translation id="2343328333327081434">Ini-install…</translation>
 <translation id="2351097562818989364">Na-reset ang iyong mga setting sa pag-translate.</translation>
 <translation id="2359808026110333948">Magpatuloy</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Pangunahing folder</translation>
 <translation id="2870560284913253234">Site</translation>
 <translation id="2888126860611144412">Tungkol sa Chrome</translation>
+<translation id="2889768325388591707">Mabilis na magpalipat-lipat ng mga tab</translation>
 <translation id="2891154217021530873">Ihinto ang pag-load ng page</translation>
 <translation id="2902702728133930130">Nagkaroon ng hindi inaasahang error ang Chrome habang nagsasagawa ng pag-start up.</translation>
 <translation id="2903493209154104877">Mga Address</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Buksan sa tab na incognito</translation>
 <translation id="3090193911106258841">Ina-access ang input ng audio at video</translation>
 <translation id="3137521801621304719">Umalis sa mode na incognito</translation>
+<translation id="3149891296864842641">Opsyon sa pagpapadala</translation>
+<translation id="3162882791484435636">Pumili ng opsyon sa pagpapadala</translation>
+<translation id="3173438333156928404">Nagkaroon ng error sa pagproseso sa pagbabayad</translation>
 <translation id="3177909033752230686">Wika ng Page:</translation>
 <translation id="3190152372525844641">I-on ang mga pahintulot para sa Chrome sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> ang nakaimbak na data</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Gusto mo bang i-update ng <ph name="PASSWORD_MANAGER_BRAND" /> ang iyong password para sa site na ito?</translation>
 <translation id="4881695831933465202">Buksan</translation>
 <translation id="4885273946141277891">Hindi sinusuportahang bilang ng mga instance ng Chrome.</translation>
+<translation id="4923459931733593730">Pagbabayad</translation>
 <translation id="4943872375798546930">Walang mga resulta</translation>
-<translation id="4970484396410298643">I-access ang mga tab na nakabukas sa iyong computer, dito mismo.
-
-Buksan lang ang Chrome sa iyong computer, pumunta sa menu, at piliin ang "Mag-sign in sa Chrome..."</translation>
 <translation id="497421865427891073">Sumulong</translation>
 <translation id="4996978546172906250">Ibahagi gamit ang</translation>
 <translation id="5000922062037820727">Naka-block (inirerekomenda)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Buksan sa Chrome</translation>
 <translation id="5199929503336119739">Profile sa trabaho</translation>
 <translation id="5210365745912300556">Isara ang tab</translation>
-<translation id="5210714456814679336">Lalabas dito ang mga binuksan mong tab sa Chrome sa iba mo pang mga device.</translation>
 <translation id="5222676887888702881">Mag-sign out</translation>
-<translation id="5228579091201413441">I-enable ang pag-sync</translation>
 <translation id="5233638681132016545">Bagong tab</translation>
 <translation id="5271967389191913893">Hindi mabuksan ng device ang content na ida-download.</translation>
 <translation id="5275558766013849309">Magsasama-sama ang mga tab at kamakailang app.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Naka-block</translation>
 <translation id="5684874026226664614">Oops. Hindi maisalin ang pahinang ito.</translation>
 <translation id="5708031556037168012">Panatilihin sa iyong device ang kasalukuyang data at permanenteng i-import ang data sa <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Tulungan kaming unahin ang mga feature at pagpapahusay na dapat naming gawin sa pamamagitan ng pagpapadala sa Google ng impormasyon tungkol sa mga file, application at serbisyo na tumatakbo kapag nakaranas ka ng pag-crash.
-
-Kasama sa mga istatistika sa paggamit ang impormasyon tulad ng mga kagustuhan, pag-click ng button at paggamit ng memory. Hindi kasama sa mga ito ang mga URL ng webpage o anumang personal na impormasyon. Naglalaman ang mga ulat ng pag-crash ng mga impormasyon ng system sa oras ng pag-crash, at maaaring maglaman ng mga URL ng web page o personal na impormasyon, depende sa kung ano ang nangyayari sa oras ng pag-crash.</translation>
 <translation id="5719837394786370183">Hindi mananatili ang mga page na tiningnan mo sa mga tab na incognito sa iyong history ng browser, cookie store o history ng paghahanap pagkatapos mong isara ang lahat ng iyong tab na incognito. Itatabi ang anumang file na iyong na-download o bookmark na iyong ginawa.
 
 Gayunpaman, hindi ka invisible. Hindi tinatago ng pagiging incognito ang iyong pagba-browse sa iyong employer, iyong internet service provider o sa mga binibisita mong website.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">I-refresh</translation>
 <translation id="7191430249889272776">Binuksan ang tab sa background.</translation>
 <translation id="7208788139759694678">Naka-disable ang Data Saver</translation>
+<translation id="7220786058474068424">Pinoproseso</translation>
 <translation id="7243308994586599757">May mga opsyon malapit sa ibaba ng screen</translation>
 <translation id="7244362611678346589">Ginagamit ng <ph name="SEARCH_ENGINE_URL" /> ang iyong lokasyon upang magpakita ng mga lokal na resulta ng paghahanap</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Tulong<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Kanselahin ang pinili</translation>
 <translation id="7851858861565204677">Iba pang mga device</translation>
 <translation id="7876243839304621966">Alisin lahat</translation>
+<translation id="7902333740914687335">Naproseso na ang pagbabayad</translation>
 <translation id="7947953824732555851">I-accept, mag-sign in</translation>
 <translation id="7949961459945740081">Kunin ang pinakabagong feature</translation>
 <translation id="7963646190083259054">Vendor:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Content</translation>
 <translation id="8173098127580644436">mula sa umpisa</translation>
 <translation id="8200772114523450471">Resume</translation>
+<translation id="8202097416529803614">Buod ng order</translation>
 <translation id="8209050860603202033">Buksan ang larawan</translation>
 <translation id="8215250379351058554">Gustong kumonekta ng <ph name="SITE" /> sa:</translation>
 <translation id="8218346974737627104">Kumpirmahin ang pag-sign in</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Buksan sa ibang window</translation>
 <translation id="8959122750345127698">Hindi gumagana ang navigation: <ph name="URL" /></translation>
 <translation id="8979340629087822094">nakalipas na araw</translation>
+<translation id="8981454092730389528">Mga Kontrol ng Aktibidad ng Google</translation>
+<translation id="8986494364107987395">Awtomatikong ipadala ang mga istatistika ng paggamit at mga ulat ng pag-crash sa Google</translation>
 <translation id="8987061207681586800">I-personalize ang iyong Chrome</translation>
 <translation id="9019902583201351841">Pinamamahalaan ng iyong mga magulang</translation>
 <translation id="9020607083536754075">Isara ang kasalukuyang tab at bumalik sa nakaraang app</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
index e941f827..ddc5b57 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Traduction en <ph name="TARGET_LANGUAGE" /> terminée.</translation>
 <translation id="1749561566933687563">Synchroniser vos favoris</translation>
 <translation id="17513872634828108">Onglets ouverts</translation>
+<translation id="1756600373018374892">Appuyez sur ce bouton pour accéder rapidement à vos onglets.</translation>
 <translation id="1807246157184219062">Clair</translation>
 <translation id="1825719650605518411">Expérience de première utilisation</translation>
 <translation id="1829244130665387512">Rechercher sur la page</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Activer l'autorisation pour Chrome dans les <ph name="BEGIN_LINK" />paramètres Android<ph name="END_LINK" /></translation>
 <translation id="1943432128510653496">Enregistrer les mots de passe</translation>
 <translation id="1944384637046898011">Tout chiffrer avec le mot de passe Google à compter du <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Contrôlez la façon dont Google utilise votre historique de navigation pour personnaliser la recherche et d'autres services Google.</translation>
 <translation id="1959930595721737608">Autorise JavaScript sur le site suivant.</translation>
 <translation id="1966710179511230534">Veuillez mettre à jour vos informations de connexion.</translation>
 <translation id="1974060860693918893">Paramètres avancés</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, application Web : <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Affiner</translation>
 <translation id="2315043854645842844">La sélection de certificat côté client n'est pas compatible avec le système d'exploitation.</translation>
-<translation id="2316129865977710310">Non merci</translation>
 <translation id="2321958826496381788">Faites glisser le curseur pour lire le texte aisément. Sa taille doit être similaire à celle-ci lorsque vous appuyez deux fois sur un paragraphe.</translation>
-<translation id="2329597144923131178">Connectez-vous pour synchroniser favoris, historique, mots de passe et autres sur vos appareils. </translation>
 <translation id="2343328333327081434">Installation…</translation>
 <translation id="2351097562818989364">Les paramètres de traduction ont été réinitialisés.</translation>
 <translation id="2359808026110333948">Continuer</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Dossier parent</translation>
 <translation id="2870560284913253234">Site</translation>
 <translation id="2888126860611144412">À propos de Chrome</translation>
+<translation id="2889768325388591707">Changez rapidement d'onglet</translation>
 <translation id="2891154217021530873">Arrêter le chargement de la page</translation>
 <translation id="2902702728133930130">Échec du démarrage de Chrome, en raison d'une erreur inattendue.</translation>
 <translation id="2903493209154104877">Adresses</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Ouvrir dans un onglet de nav. privée</translation>
 <translation id="3090193911106258841">Accès à l'entrée audio et vidéo en cours…</translation>
 <translation id="3137521801621304719">Désactiver le mode navigation privée</translation>
+<translation id="3149891296864842641">Option d'expédition</translation>
+<translation id="3162882791484435636">Sélectionner une option d'expédition</translation>
+<translation id="3173438333156928404">Erreur lors du traitement de votre paiement.</translation>
 <translation id="3177909033752230686">Langue de la page :</translation>
 <translation id="3190152372525844641">Activer les autorisations pour Chrome dans les <ph name="BEGIN_LINK" />paramètres Android<ph name="END_LINK" /></translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> de données stockées</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Voulez-vous que <ph name="PASSWORD_MANAGER_BRAND" /> modifie votre mot de passe pour ce site ?</translation>
 <translation id="4881695831933465202">Ouvrir</translation>
 <translation id="4885273946141277891">Le nombre d'instances de Chrome n'est pas compatible.</translation>
+<translation id="4923459931733593730">Paiement</translation>
 <translation id="4943872375798546930">Aucun résultat</translation>
-<translation id="4970484396410298643">Accédez ici aux onglets ouverts sur votre ordinateur.
-
-Il vous suffit d'ouvrir Chrome sur votre ordinateur, d'accéder au menu, puis de sélectionner "Se connecter à Chrome".</translation>
 <translation id="497421865427891073">Avancer</translation>
 <translation id="4996978546172906250">Partager via</translation>
 <translation id="5000922062037820727">Bloquée (recommandé)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Ouvrir dans Chrome</translation>
 <translation id="5199929503336119739">Profil professionnel</translation>
 <translation id="5210365745912300556">Fermer l'onglet</translation>
-<translation id="5210714456814679336">Les onglets que vous avez ouverts dans Chrome sur vos autres appareils apparaîtront ici.</translation>
 <translation id="5222676887888702881">Déconnexion</translation>
-<translation id="5228579091201413441">Activer la synchronisation</translation>
 <translation id="5233638681132016545">Nouvel onglet</translation>
 <translation id="5271967389191913893">Impossible d'ouvrir le contenu à télécharger sur l'appareil.</translation>
 <translation id="5275558766013849309">Les onglets figureront aux côtés des applications récentes.</translation>
@@ -343,9 +343,6 @@
 <translation id="5677928146339483299">Bloqué</translation>
 <translation id="5684874026226664614">Petit problème… Impossible de traduire cette page.</translation>
 <translation id="5708031556037168012">Maintenir les données déjà enregistrées sur votre appareil et importer les données sur le compte <ph name="TO_ACCOUNT" /> de manière permanente.</translation>
-<translation id="5712189971979076230">Aidez-nous à identifier les fonctionnalités et les améliorations sur lesquelles nous devons travailler en priorité en nous envoyant des informations sur les fichiers, les applications et les services en cours d'exécution au moment où vous constatez un plantage.
-
-Les statistiques d'utilisation englobent des informations telles que les préférences, les clics sur les boutons et l'utilisation de la mémoire. Elles n'incluent pas d'URL de pages Web ni d'informations personnelles. Les rapports d'erreur contiennent des informations relatives au système au moment du plantage, et peuvent contenir des URL de pages Web ou des informations personnelles, en fonction des activités en cours lors de l'incident.</translation>
 <translation id="5719837394786370183">Les pages consultées dans les onglets de navigation privée ne sont pas enregistrées dans l'historique de votre navigateur, dans les cookies ni dans l'historique des recherches une fois que vous avez fermé tous les onglets de navigation privée. Les fichiers téléchargés et les favoris ajoutés sont conservés.
 
 Vous n'êtes cependant pas devenu invisible. L'utilisation du mode navigation privée n'empêche pas votre employeur, votre fournisseur d'accès à Internet ou les sites Web que vous avez consultés d'avoir accès aux informations relatives à votre navigation.</translation>
@@ -464,6 +461,7 @@
 <translation id="7180611975245234373">Actualiser</translation>
 <translation id="7191430249889272776">L'onglet a été ouvert en arrière-plan.</translation>
 <translation id="7208788139759694678">Économiseur de données désactivé</translation>
+<translation id="7220786058474068424">Traitement en cours</translation>
 <translation id="7243308994586599757">Options disponibles au bas de l'écran</translation>
 <translation id="7244362611678346589">Le site <ph name="SEARCH_ENGINE_URL" /> utilise votre position pour afficher les résultats de recherche à proximité.</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Aide<ph name="END_LINK" /></translation>
@@ -517,6 +515,7 @@
 <translation id="7846076177841592234">Annuler la sélection</translation>
 <translation id="7851858861565204677">Autres appareils</translation>
 <translation id="7876243839304621966">Tout supprimer</translation>
+<translation id="7902333740914687335">Paiement traité</translation>
 <translation id="7947953824732555851">Accepter/Se connecter</translation>
 <translation id="7949961459945740081">Obtenir dernières fonctionnalités</translation>
 <translation id="7963646190083259054">Fournisseur :</translation>
@@ -540,6 +539,7 @@
 <translation id="8168435359814927499">Contenu</translation>
 <translation id="8173098127580644436">depuis le début</translation>
 <translation id="8200772114523450471">Reprendre</translation>
+<translation id="8202097416529803614">Récapitulatif de la commande</translation>
 <translation id="8209050860603202033">Ouvrir l'image</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> tente de se connecter au site suivant :</translation>
 <translation id="8218346974737627104">Confirmer la connexion</translation>
@@ -596,6 +596,8 @@
 <translation id="8942627711005830162">Ouvrir dans une autre fenêtre</translation>
 <translation id="8959122750345127698">Impossible d'accéder à <ph name="URL" />.</translation>
 <translation id="8979340629087822094">des dernières 24 heures</translation>
+<translation id="8981454092730389528">Commandes Google relatives à l'activité</translation>
+<translation id="8986494364107987395">Envoyer automatiquement les statistiques d'utilisation et les rapports d'erreur à Google</translation>
 <translation id="8987061207681586800">Personnalisez Chrome</translation>
 <translation id="9019902583201351841">Géré par tes parents</translation>
 <translation id="9020607083536754075">Fermer l'onglet actif et revenir à l'application précédente</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
index 3b16e00..91bd8a3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220"><ph name="TARGET_LANGUAGE" /> में अनुवाद किया गया.</translation>
 <translation id="1749561566933687563">अपने बुकमार्क समन्‍वयित करें</translation>
 <translation id="17513872634828108">टैब खोलें</translation>
+<translation id="1756600373018374892">अपने टैब पर तुरंत एक्सेस के लिए यह बटन टैप करें.</translation>
 <translation id="1807246157184219062">हल्का</translation>
 <translation id="1825719650605518411">पहली बार चलाने का अनुभव</translation>
 <translation id="1829244130665387512">पृष्ठ में ढूंढें</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587"><ph name="BEGIN_LINK" />Android सेटिंग<ph name="END_LINK" /> में Chrome के लिए अनुमति चालू करें.</translation>
 <translation id="1943432128510653496">पासवर्ड सहेजें</translation>
 <translation id="1944384637046898011"><ph name="TIME" /> तक का सभी डेटा Google पासवर्ड से एन्‍क्रिप्‍ट करें</translation>
+<translation id="1946005195648379376">नियंत्रित करें कि खोज और अन्य Google सेवाओं को वैयक्तिकृत करने के लिए Google आपके ब्राउज़िंग इतिहास का उपयोग कैसे करता है.</translation>
 <translation id="1959930595721737608">निम्न साइट पर JavaScript को अनुमति दें.</translation>
 <translation id="1966710179511230534">कृपया अपने प्रवेश विवरण अपडेट करें.</translation>
 <translation id="1974060860693918893">उन्नत</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, वेब ऐप. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">परिशोधित करें</translation>
 <translation id="2315043854645842844">क्लाइंट-साइड प्रमाणपत्र चयन ऑपरेटिंग सिस्टम के द्वारा समर्थित नहीं है.</translation>
-<translation id="2316129865977710310">जी रहने दें</translation>
 <translation id="2321958826496381788">स्‍लाइडर को तब तक खींचें, जब तक कि आपको इसे पढ़ने में सुविधा न हो. पैराग्राफ़ पर डबल-टैप करने के बाद लेख को इतना बड़ा दिखाई देना चाहिए.</translation>
-<translation id="2329597144923131178">सभी डिवाइसों पर बुकमार्क, इतिहास, पासवर्ड और अन्‍य सेटिंग प्राप्‍त करने हेतु प्रवेश करें.</translation>
 <translation id="2343328333327081434">इंस्टॉल जारी...</translation>
 <translation id="2351097562818989364">आपकी अनुवाद सेटिंग रीसेट कर दी गई हैं.</translation>
 <translation id="2359808026110333948">जारी रखें</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">मूल फ़ोल्‍डर</translation>
 <translation id="2870560284913253234">साइट</translation>
 <translation id="2888126860611144412">क्रोम के बारे में</translation>
+<translation id="2889768325388591707">टैब तेज़ी से बदलें</translation>
 <translation id="2891154217021530873">पृष्ठ को लोड करना रोकें</translation>
 <translation id="2902702728133930130">अनपेक्षित त्रुटि के साथ स्टार्टअप के दौरान Chrome विफल रहा.</translation>
 <translation id="2903493209154104877">पते</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">गुप्त टैब में खोलें</translation>
 <translation id="3090193911106258841">ऑडियो और वीडियो इनपुट ऐक्सेस हो रहा है</translation>
 <translation id="3137521801621304719">गुप्त मोड छोड़ें</translation>
+<translation id="3149891296864842641">शिपिंग विकल्प</translation>
+<translation id="3162882791484435636">शिपिंग विकल्प चुनें</translation>
+<translation id="3173438333156928404">भुगतान संसाधित करने में त्रुटि हुई</translation>
 <translation id="3177909033752230686">पृष्ठ की भाषा:</translation>
 <translation id="3190152372525844641"><ph name="BEGIN_LINK" />Android सेटिंग<ph name="END_LINK" /> में Chrome के लिए अनुमतियां चालू करें.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> संग्रहीत डेटा</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">क्या आप चाहते हैं कि <ph name="PASSWORD_MANAGER_BRAND" /> इस साइट के लिए आपके पासवर्ड को अपडेट करे?</translation>
 <translation id="4881695831933465202">खोलें</translation>
 <translation id="4885273946141277891">Chrome इंस्टेंस की असमर्थित संख्या.</translation>
+<translation id="4923459931733593730">भुगतान</translation>
 <translation id="4943872375798546930">कोई परिणाम नहीं</translation>
-<translation id="4970484396410298643">अपने कंप्यूटर पर आपके द्वारा खोले गए टैब सीधे यहां से ऐक्सेस करें.
-
-बस अपने कंप्यूटर पर Chrome खोलें, मेनू पर जाएं और "Chrome में प्रवेश करें…" चुनें</translation>
 <translation id="497421865427891073">आगे जाएं</translation>
 <translation id="4996978546172906250">इसके द्वारा साझा करें</translation>
 <translation id="5000922062037820727">अवरोधित (सुझाया गया)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Chrome में खोलें</translation>
 <translation id="5199929503336119739">कार्य प्रोफ़ाइल</translation>
 <translation id="5210365745912300556">टैब बंद करें</translation>
-<translation id="5210714456814679336">आपके द्वारा अपने अन्‍य डिवाइसों पर Chrome में खोले गए टैब यहां दिखाई देते हैं.</translation>
 <translation id="5222676887888702881">प्रस्थान करें</translation>
-<translation id="5228579091201413441">समन्वयन सक्षम करें</translation>
 <translation id="5233638681132016545">नया टैब</translation>
 <translation id="5271967389191913893">डाउनलोड की जाने वाली सामग्री को डिवाइस नहीं खोल सकता.</translation>
 <translation id="5275558766013849309">टैब, हाल ही के ऐप्‍स के साथ रहेंगे.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">अवरोधित</translation>
 <translation id="5684874026226664614">ओह. इस पृष्ठ का अनुवाद नहीं किया जा सका.</translation>
 <translation id="5708031556037168012">मौजूदा डेटा को अपने डिवाइस पर बनाए रखें और डेटा को स्थायी रूप से <ph name="TO_ACCOUNT" /> में आयात करें.</translation>
-<translation id="5712189971979076230">जब भी क्रैश हो, तो उस दौरान चलने वाली फ़ाइलें, ऐप्लिकेशन और सेवाओं के बारे में जानकारी Google को भेजकर उन सुविधाओं और सुधारों को प्राथमिकता देने में हमारी सहायता करें जिन पर हमें काम करना चाहिए.
-
-उपयोग के आंकड़ों में प्राथमिकताएं, बटन क्लिक और मेमोरी उपयोग जैसी जानकारी शामिल की जाती है. उनमें वेबपृष्ठ URL या कोई व्यक्तिगत जानकारी शामिल नहीं की जाती है. क्रैश रिपोर्ट में क्रैश के समय की सिस्टम जानकारी होती है और क्रैश के समय जो हो रहा था, उसके आधार पर वेब पृष्ठ के URL की या व्यक्तिगत जानकारी हो सकती है.</translation>
 <translation id="5719837394786370183">आपके द्वारा अपने सभी गुप्त टैब बंद करने के बाद आपको गुप्त टैब में दिखाई देने वाले पृष्ठ आपके ब्राउज़र के इतिहास, कुकी स्टोर, या खोज इतिहास में नहीं बने रहेंगे. आप जो भी फ़ाइल डाउनलोड करते हैं या जो भी बुकमार्क बनाते हैं उन्हें रखा जाएगा.
 
 हालांकि, आप अदृश्य नहीं हैं. गुप्त मोड में जाने से आपके नियोक्ता, आपके इंटरनेट सेवा प्रदाता, या आपके द्वारा देखी जाने वाली वेबसाइटों से आपकी ब्राउज़िंग नहीं छिपती.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">रीफ्रेश करें</translation>
 <translation id="7191430249889272776">पृष्ठभूमि में टैब खोला गया.</translation>
 <translation id="7208788139759694678">डेटा बचतकर्ता अक्षम किया गया है</translation>
+<translation id="7220786058474068424">संसाधित हो रहा है</translation>
 <translation id="7243308994586599757">विकल्‍प स्‍क्रीन के नीचे उपलब्‍ध हैं</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" />, स्थानीय खोज परिणाम दिखाने के लिए आपके स्थान का उपयोग करता है</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />सहायता<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">चयन हटाएं</translation>
 <translation id="7851858861565204677">अन्य डिवाइस</translation>
 <translation id="7876243839304621966">सभी को निकालें</translation>
+<translation id="7902333740914687335">भुगतान संसाधित हो गया</translation>
 <translation id="7947953824732555851">स्वीकार करें और प्रवेश करें</translation>
 <translation id="7949961459945740081">नवीनतम सुविधाएं प्राप्त करें</translation>
 <translation id="7963646190083259054">विक्रेता:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">सामग्री</translation>
 <translation id="8173098127580644436">प्रारंभ समय</translation>
 <translation id="8200772114523450471">फिर से शुरू करें</translation>
+<translation id="8202097416529803614">आदेश सारांश</translation>
 <translation id="8209050860603202033">चित्र खोलें</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> इसके साथ कनेक्ट करना चाहता है:</translation>
 <translation id="8218346974737627104">प्रवेश की दुबारा पूछें</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">अन्य विंडो में खोलें</translation>
 <translation id="8959122750345127698">मार्गदर्शक तक नहीं पहुंचा जा सकता: <ph name="URL" /></translation>
 <translation id="8979340629087822094">पिछला दिन</translation>
+<translation id="8981454092730389528">Google गतिविधि नियंत्रण</translation>
+<translation id="8986494364107987395">Google को उपयोग के आंकड़े और क्रैश रिपोर्ट अपने आप भेजें</translation>
 <translation id="8987061207681586800">Chrome को अपना बनाएं</translation>
 <translation id="9019902583201351841">आपके अभिभावकों द्वारा प्रबंधित</translation>
 <translation id="9020607083536754075">वर्तमान टैब बंद करें और पिछले ऐप पर वापस लौटें</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
index 6679de2..0542dd3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Prevedeno na <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Sinkronizirajte oznake</translation>
 <translation id="17513872634828108">Otvorene kartice</translation>
+<translation id="1756600373018374892">Dodirnite ovaj gumb da biste brzo pristupili svojim karticama.</translation>
 <translation id="1807246157184219062">Svijetlo</translation>
 <translation id="1825719650605518411">Doživljaj prvog pokretanja</translation>
 <translation id="1829244130665387512">Traži na stranici</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Uključite dopuštenje za Chrome u <ph name="BEGIN_LINK" />Postavkama Androida<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Spremanje zaporki</translation>
 <translation id="1944384637046898011">Kriptiraj sve pomoću Googleove zaporke od <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Upravljajte načinom na koji Google upotrebljava vašu povijest pregledavanja za prilagodbu Pretraživanja i drugih Googleovih usluga.</translation>
 <translation id="1959930595721737608">Omogućuje JavaScript na sljedećoj web-lokaciji.</translation>
 <translation id="1966710179511230534">Ažurirajte pojedinosti prijave.</translation>
 <translation id="1974060860693918893">Napredno</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, web-aplikacija. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Pročišćavanje</translation>
 <translation id="2315043854645842844">Operativni sustav ne podržava odabir klijentskog certifikata.</translation>
-<translation id="2316129865977710310">Ne, hvala</translation>
 <translation id="2321958826496381788">Pomičite klizač dok ne budete mogli čitati ovaj tekst bez poteškoća. Tekst bi trebao biti barem ovoliko velik nakon što dvaput dodirnete odlomak.</translation>
-<translation id="2329597144923131178">Prijavite se da biste imali svoje oznake, povijest, zaporke i druge postavke na svim svojim uređajima.</translation>
 <translation id="2343328333327081434">Instaliranje…</translation>
 <translation id="2351097562818989364">Vaše su postavke prevođenja vraćene na zadano.</translation>
 <translation id="2359808026110333948">Nastavi</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Nadređena mapa</translation>
 <translation id="2870560284913253234">Web lokacija</translation>
 <translation id="2888126860611144412">O Chromeu</translation>
+<translation id="2889768325388591707">Brzo izmjenjivanje kartica</translation>
 <translation id="2891154217021530873">Zaustavljanje učitavanja stranice</translation>
 <translation id="2902702728133930130">Chrome se nije pokrenuo zbog neočekivane pogreške.</translation>
 <translation id="2903493209154104877">Adrese</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Otvori na kartici Anonimno</translation>
 <translation id="3090193911106258841">Pristupanje audio i videoulazu</translation>
 <translation id="3137521801621304719">Izlaz iz anonimnog načina</translation>
+<translation id="3149891296864842641">Opcija otpreme</translation>
+<translation id="3162882791484435636">Odaberite opciju otpreme</translation>
+<translation id="3173438333156928404">Pogreška prilikom obrade plaćanja</translation>
 <translation id="3177909033752230686">Jezik stranice:</translation>
 <translation id="3190152372525844641">Uključite dopuštenja za Chrome u <ph name="BEGIN_LINK" />Postavkama Androida<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905">Pohranjeni podaci: <ph name="STORAGE_AMOUNT" /></translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Želite li da <ph name="PASSWORD_MANAGER_BRAND" /> ažurira vašu zaporku za tu web-lokaciju?</translation>
 <translation id="4881695831933465202">Otvori</translation>
 <translation id="4885273946141277891">Nepodržan broj različitih verzija Chromea.</translation>
+<translation id="4923459931733593730">Plaćanje</translation>
 <translation id="4943872375798546930">Nema rezultata</translation>
-<translation id="4970484396410298643">Karticama koje ste otvorili na računalu možete pristupiti i ovdje.
-
-Samo otvorite Chrome na računalu, otvorite izbornik i odaberite "Prijava na Chrome…"</translation>
 <translation id="497421865427891073">Idi naprijed</translation>
 <translation id="4996978546172906250">Dijeli putem</translation>
 <translation id="5000922062037820727">Blokirano (preporučeno)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Otvori u Chromeu</translation>
 <translation id="5199929503336119739">Radni profil</translation>
 <translation id="5210365745912300556">Zatvori karticu</translation>
-<translation id="5210714456814679336">Ovdje će se pojaviti kartice koje ste otvorili u Chromeu na drugim uređajima.</translation>
 <translation id="5222676887888702881">Odjava</translation>
-<translation id="5228579091201413441">Omogući sinkronizaciju</translation>
 <translation id="5233638681132016545">Nova kartica</translation>
 <translation id="5271967389191913893">Uređaj ne može otvoriti sadržaj za preuzimanje.</translation>
 <translation id="5275558766013849309">Kartice će biti navedene zajedno s nedavnim aplikacijama.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Blokirano</translation>
 <translation id="5684874026226664614">Ups. Stranicu nije bilo moguće prevesti.</translation>
 <translation id="5708031556037168012">Postojeći se podaci zadržavaju na uređaju i trajno uvoze na račun <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Svaki put kada se nešto sruši, pošaljite Googleu informacije o datotekama, aplikacijama i uslugama koje se izvode kako biste nam pomogli odrediti kojim bismo značajkama i poboljšanjima trebali dati prednost.
-
-        Statistika upotrebe uključuje informacije kao što su postavke, klikovi na gumbe i upotreba memorije. Ne uključuje URL-ove web-stranica ni osobne podatke. Izvješća o rušenju programa sadrže informacije o sustavu u trenutku rušenja i mogu sadržavati URL-ove web-stranica ili osobne podatke, ovisno o tome što se događalo u trenutku rušenja.</translation>
 <translation id="5719837394786370183">Stranice koje gledate na anonimnim karticama neće se zadržati u povijesti preglednika, pohrani kolačića i povijesti pretraživanja nakon što zatvorite sve anonimne kartice. Sve datoteke koje preuzmete i oznake koje izradite sačuvat će se.
 
 Međutim, niste nevidljivi. Anonimni način neće sakriti vaše pregledavanje od vašeg poslodavca, davatelja internetskih usluga i web-lokacija koje posjetite.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Osvježi</translation>
 <translation id="7191430249889272776">Kartica je otvorena u pozadini.</translation>
 <translation id="7208788139759694678">Ušteda podataka nije omogućena</translation>
+<translation id="7220786058474068424">Obrada</translation>
 <translation id="7243308994586599757">Opcije dostupne pri dnu zaslona</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> upotrebljava vašu lokaciju za prikazivanje lokalnih rezultata pretraživanja</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Pomoć<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Poništi odabir</translation>
 <translation id="7851858861565204677">Ostali uređaji</translation>
 <translation id="7876243839304621966">Ukloni sve</translation>
+<translation id="7902333740914687335">Plaćanje obrađeno</translation>
 <translation id="7947953824732555851">Prihv. i prijavi se</translation>
 <translation id="7949961459945740081">Nabavite najnovije značajke</translation>
 <translation id="7963646190083259054">Dobavljač:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Sadržaj</translation>
 <translation id="8173098127580644436">od početka</translation>
 <translation id="8200772114523450471">Nastavi</translation>
+<translation id="8202097416529803614">Sažetak narudžbe</translation>
 <translation id="8209050860603202033">Otvori sliku</translation>
 <translation id="8215250379351058554">Web-lokacija <ph name="SITE" /> želi se povezati s uređajem:</translation>
 <translation id="8218346974737627104">Potvrda prijave</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Otvori u drugom prozoru</translation>
 <translation id="8959122750345127698">Otvaranje je nedostupno: <ph name="URL" /></translation>
 <translation id="8979340629087822094">od proteklog dana</translation>
+<translation id="8981454092730389528">Google kontrole aktivnosti</translation>
+<translation id="8986494364107987395">Automatski šalji Googleu statistiku o upotrebi i izvješća o padu programa</translation>
 <translation id="8987061207681586800">Prilagodite Chrome sebi</translation>
 <translation id="9019902583201351841">Upravljaju tvoji roditelji</translation>
 <translation id="9020607083536754075">Zatvori trenutačnu karticu i vrati se na prethodnu aplikaciju</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
index c44ee3d..c6ad163 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Lefordítva <ph name="TARGET_LANGUAGE" /> nyelvre.</translation>
 <translation id="1749561566933687563">Könyvjelzők szinkronizálása</translation>
 <translation id="17513872634828108">Megnyitott lapok</translation>
+<translation id="1756600373018374892">Koppintson erre a gombra lapjai gyors eléréséhez.</translation>
 <translation id="1807246157184219062">Világos</translation>
 <translation id="1825719650605518411">Első indítás tapasztalata</translation>
 <translation id="1829244130665387512">Keresés ezen az oldalon</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">A Chrome-ra vonatkozó engedély aktiválása az <ph name="BEGIN_LINK" />Android beállításaiban<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Jelszavak mentése</translation>
 <translation id="1944384637046898011">Az összes titkosítása Google-jelszóval ekkortól: <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Annak szabályozása, hogy a Google hogyan használhatja fel a böngészési előzményeket a Keresés és más Google-szolgáltatások személyre szabására.</translation>
 <translation id="1959930595721737608">JavaScript engedélyezése a következő webhelyen.</translation>
 <translation id="1966710179511230534">Kérjük, frissítse bejelentkezési adatait.</translation>
 <translation id="1974060860693918893">Speciális</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, internetes alkalmazás. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Pontosítás</translation>
 <translation id="2315043854645842844">Az ügyféloldali tanúsítványválasztást az operációs rendszer nem támogatja.</translation>
-<translation id="2316129865977710310">Köszönöm, nem</translation>
 <translation id="2321958826496381788">Húzza a csúszkát, amíg kényelmesen nem tudja olvasni a szöveget; legalább ekkorának kell lennie, miután duplán koppint a bekezdésre.</translation>
-<translation id="2329597144923131178">Jelentkezzen be, hogy könyvjelzőit, előzményeit, jelszavait és más beállításait az összes eszközén elérje.</translation>
 <translation id="2343328333327081434">Telepítés…</translation>
 <translation id="2351097562818989364">A fordítási beállítások visszaállítása megtörtént.</translation>
 <translation id="2359808026110333948">Folytatás</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Szülőmappa</translation>
 <translation id="2870560284913253234">Webhely</translation>
 <translation id="2888126860611144412">A Chrome névjegye</translation>
+<translation id="2889768325388591707">Gyors váltás a lapok között</translation>
 <translation id="2891154217021530873">Oldal betöltésének leállítása</translation>
 <translation id="2902702728133930130">A Chrome indítása sikertelen volt egy váratlan hiba miatt.</translation>
 <translation id="2903493209154104877">Címek</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Megnyitás inkognitólapon</translation>
 <translation id="3090193911106258841">Hozzáférés a hang- és videobementhez</translation>
 <translation id="3137521801621304719">Kilépés inkognitómódból</translation>
+<translation id="3149891296864842641">Szállítási lehetőség</translation>
+<translation id="3162882791484435636">Szállítási lehetőség kiválasztása</translation>
+<translation id="3173438333156928404">Hiba a fizetés feldolgozása során</translation>
 <translation id="3177909033752230686">Az oldal nyelve</translation>
 <translation id="3190152372525844641">A Chrome-ra vonatkozó engedélyek aktiválása az <ph name="BEGIN_LINK" />Android beállításaiban<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> tárolt adat</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Szeretné, hogy a(z) <ph name="PASSWORD_MANAGER_BRAND" /> frissítse jelszavát ezen a webhelyen?</translation>
 <translation id="4881695831933465202">Megnyitás</translation>
 <translation id="4885273946141277891">Ilyen sok Chrome-példány nem futhat egyszerre.</translation>
+<translation id="4923459931733593730">Fizetés</translation>
 <translation id="4943872375798546930">Nincs találat</translation>
-<translation id="4970484396410298643">Itt is hozzáférhet a számítógépen megnyitott lapokhoz.
-
-Ehhez elég elindítani a Chrome-ot számítógépén, megnyitni a menüt, majd a „Bejelentkezés a Chrome-ba…” lehetőséget választani.</translation>
 <translation id="497421865427891073">Előrelépés</translation>
 <translation id="4996978546172906250">Megosztás itt:</translation>
 <translation id="5000922062037820727">Letiltva (ajánlott)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Megnyitás Chrome-ban</translation>
 <translation id="5199929503336119739">Munkaprofil</translation>
 <translation id="5210365745912300556">Lap bezárása</translation>
-<translation id="5210714456814679336">A más eszközökön futó Chrome böngészőben megnyitott lapok itt jelennek meg.</translation>
 <translation id="5222676887888702881">Kijelentkezés</translation>
-<translation id="5228579091201413441">Szinkronizálás bekapcsolása</translation>
 <translation id="5233638681132016545">Új lap</translation>
 <translation id="5271967389191913893">Az eszköz nem tudja megnyitni a letölteni kívánt tartalmat.</translation>
 <translation id="5275558766013849309">A lapok együtt fognak szerepelni a legutóbbi alkalmazásokkal.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Letiltva</translation>
 <translation id="5684874026226664614">Hoppá! Az oldalt nem sikerült lefordítani.</translation>
 <translation id="5708031556037168012">A meglévő adatok megtartása az eszközén, és az adatok végleges importálása a(z) <ph name="TO_ACCOUNT" /> fiókba.</translation>
-<translation id="5712189971979076230">Segítsen nekünk annak eldöntésében, hogy mely funkciókon és fejlesztéseken kell előbb dolgoznunk – küldje el a Google-nak a böngésző lefagyásakor éppen futó fájlokkal, alkalmazásokkal és szolgáltatásokkal kapcsolatos információkat.
-
-A használati statisztika részét alkotják például a beállítások, a gombokra kattintások és a memóriahasználat. A statisztika nem tartalmazza weboldalak URL-jeit és semmilyen személyes adatot. A hibajelentések a hiba időpontjában aktuális rendszer-információkat tartalmazzák, de tartalmazhatják weboldalak URL-címeit vagy személyes adatokat is, attól függően, hogy mi történt a hiba időpontjában.</translation>
 <translation id="5719837394786370183">Az inkognitólapokon megtekintett oldalak nem maradnak meg a böngészési előzményekben, a cookie-k tárolójában vagy a keresési előzményekben, miután bezárta az összes inkognitólapot. A letöltött fájlok és a létrehozott könyvjelzők azonban megmaradnak.
 
 Mindazonáltal Ön nem lesz láthatatlan. Az inkognitómód használatával nem rejtheti el böngészési tevékenységét munkaadója, internetszolgáltatója vagy a felkeresett webhelyek elől.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Frissítés</translation>
 <translation id="7191430249889272776">A lap megnyílt a háttérben.</translation>
 <translation id="7208788139759694678">Az Adatforgalom-csökkentő ki van kapcsolva</translation>
+<translation id="7220786058474068424">Feldolgozás alatt</translation>
 <translation id="7243308994586599757">A beállítások a képernyő alsó részén találhatók</translation>
 <translation id="7244362611678346589">A(z) <ph name="SEARCH_ENGINE_URL" /> az Ön tartózkodási helye alapján jelenít meg helyi keresési eredményeket</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Súgó<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Kijelölés törlése</translation>
 <translation id="7851858861565204677">Egyéb eszközök</translation>
 <translation id="7876243839304621966">Összes eltávolítása</translation>
+<translation id="7902333740914687335">Fizetés feldolgozva</translation>
 <translation id="7947953824732555851">Elfogadás és bejelentkezés</translation>
 <translation id="7949961459945740081">A legújabb funkciók megszerzése</translation>
 <translation id="7963646190083259054">Szolgáltató:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Tartalom</translation>
 <translation id="8173098127580644436">a kezdetektől</translation>
 <translation id="8200772114523450471">Folytatás</translation>
+<translation id="8202097416529803614">Rendelés összegzése</translation>
 <translation id="8209050860603202033">Kép megnyitása</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> szeretne csatlakozni a következőhöz:</translation>
 <translation id="8218346974737627104">Bejelentkezés megerősítése</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Megnyitás másik ablakban</translation>
 <translation id="8959122750345127698">Nem érhető el az ide vezető navigáció: <ph name="URL" /></translation>
 <translation id="8979340629087822094">elmúlt nap</translation>
+<translation id="8981454092730389528">Google Tevékenységvezérlők</translation>
+<translation id="8986494364107987395">Használati statisztikák és hibajelentések automatikus küldése a Google-nak</translation>
 <translation id="8987061207681586800">Formálja saját ízlésére a Chrome-ot</translation>
 <translation id="9019902583201351841">Szülők által kezelt</translation>
 <translation id="9020607083536754075">Az aktuális lap bezárása, és visszatérés az előző alkalmazáshoz</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
index 828c4b7..3c02a1a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Diterjemahkan ke <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Sinkronisasikan bookmark Anda</translation>
 <translation id="17513872634828108">Buka tab</translation>
+<translation id="1756600373018374892">Tekan tombol ini untuk akses cepat ke tab Anda.</translation>
 <translation id="1807246157184219062">Terang</translation>
 <translation id="1825719650605518411">Pengalaman Saat Pertama Kali Dijalankan</translation>
 <translation id="1829244130665387512">Cari pada laman</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Aktifkan izin untuk Chrome di <ph name="BEGIN_LINK" />Setelan Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Menyimpan sandi</translation>
 <translation id="1944384637046898011">Enkripsikan semua dengan sandi Google mulai tanggal <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Kontrol cara Google menggunakan riwayat penjelajahan Anda untuk mempersonalisasi Penelusuran dan layanan Google lainnya.</translation>
 <translation id="1959930595721737608">Izinkan JavaScript di situs berikut.</translation>
 <translation id="1966710179511230534">Perbarui detail ID masuk Anda.</translation>
 <translation id="1974060860693918893">Lanjutan</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, aplikasi web. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Saring</translation>
 <translation id="2315043854645842844">Pilihan sertifikat sisi klien tidak didukung oleh sistem operasi.</translation>
-<translation id="2316129865977710310">Lain kali</translation>
 <translation id="2321958826496381788">Seret penggeser sampai Anda dapat membacanya dengan nyaman. Teks harus terlihat setidaknya sebesar ini setelah paragraf diketuk dua kali.</translation>
-<translation id="2329597144923131178">Masuk untuk mendapatkan bookmark, riwayat, sandi, dan setelan Anda lainnya di semua perangkat.</translation>
 <translation id="2343328333327081434">Memasang...</translation>
 <translation id="2351097562818989364">Setelan terjemah telah disetel ulang.</translation>
 <translation id="2359808026110333948">Lanjut</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Folder induk</translation>
 <translation id="2870560284913253234">Situs</translation>
 <translation id="2888126860611144412">Tentang Chrome</translation>
+<translation id="2889768325388591707">Beralih tab dengan cepat</translation>
 <translation id="2891154217021530873">Hentikan pemuatan laman</translation>
 <translation id="2902702728133930130">Chrome gagal memulai karena ada kesalahan yang tidak terduga.</translation>
 <translation id="2903493209154104877">Alamat</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Buka di tab penyamaran</translation>
 <translation id="3090193911106258841">Mengakses masukan audio dan video</translation>
 <translation id="3137521801621304719">Tutup mode penyamaran</translation>
+<translation id="3149891296864842641">Opsi pengiriman</translation>
+<translation id="3162882791484435636">Pilih opsi pengiriman</translation>
+<translation id="3173438333156928404">Terjadi kesalahan saat memproses pembayaran</translation>
 <translation id="3177909033752230686">Bahasa Laman:</translation>
 <translation id="3190152372525844641">Aktifkan izin untuk Chrome di <ph name="BEGIN_LINK" />Setelan Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> data tersimpan</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Apakah Anda ingin <ph name="PASSWORD_MANAGER_BRAND" /> memperbarui sandi untuk situs ini?</translation>
 <translation id="4881695831933465202">Buka</translation>
 <translation id="4885273946141277891">Jumlah kemunculan Chrome tidak didukung.</translation>
+<translation id="4923459931733593730">Pembayaran</translation>
 <translation id="4943872375798546930">Tidak ada hasil</translation>
-<translation id="4970484396410298643">Akses tab yang telah Anda buka di komputer, di sini.
-
-Cukup buka Chrome di komputer, buka menu, lalu pilih "Masuk ke Chrome…”</translation>
 <translation id="497421865427891073">Maju</translation>
 <translation id="4996978546172906250">Bagikan melalui</translation>
 <translation id="5000922062037820727">Diblokir (disarankan)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Buka di Chrome</translation>
 <translation id="5199929503336119739">Profil kerja</translation>
 <translation id="5210365745912300556">Tutup tab</translation>
-<translation id="5210714456814679336">Tab yang telah Anda buka di Chrome pada perangkat Anda yang lain akan muncul di sini.</translation>
 <translation id="5222676887888702881">Keluar</translation>
-<translation id="5228579091201413441">Aktifkan sinkronisasi</translation>
 <translation id="5233638681132016545">Tab baru</translation>
 <translation id="5271967389191913893">Perangkat tidak dapat membuka konten untuk diunduh.</translation>
 <translation id="5275558766013849309">Tab akan ditampilkan bersama aplikasi terkini.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Dicekal</translation>
 <translation id="5684874026226664614">Ups. Laman ini tidak dapat diterjemahkan.</translation>
 <translation id="5708031556037168012">Simpan data yang sudah ada di perangkat dan impor data ke <ph name="TO_ACCOUNT" /> secara permanen.</translation>
-<translation id="5712189971979076230">Bantu kami memprioritaskan fitur dan penyempurnaan yang harus dikerjakan dengan mengirimkan informasi tentang file, aplikasi, dan layanan yang sedang berjalan kepada Google kapan pun aplikasi mogok.
-
-Statistik penggunaan mencakup informasi seperti preferensi, klik tombol, dan penggunaan memori. Statistik ini tidak mencakup URL laman web atau informasi pribadi apa pun. Laporan kerusakan berisi informasi sistem saat terjadi mogok dan dapat berisi URL laman web atau informasi pribadi, tergantung apa yang terjadi saat aplikasi mogok.</translation>
 <translation id="5719837394786370183">Laman yang Anda lihat dalam tab penyamaran tidak akan disimpan di riwayat, penyimpanan cookie, atau riwayat penelusuran browser setelah semua tab penyamaran ditutup. File apa pun yang diunduh atau bookmark yang dibuat akan tetap tersimpan.
 
 Namun demikian, bukan berarti Anda sama sekali tidak terlihat. Menggunakan mode penyamaran tidak akan menyembunyikan penjelajahan yang Anda lakukan dari atasan di kantor, dari penyedia layanan internet, maupun situs web yang Anda kunjungi.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Segarkan</translation>
 <translation id="7191430249889272776">Tab dibuka di latar belakang.</translation>
 <translation id="7208788139759694678">Penghemat Data dinonaktifkan</translation>
+<translation id="7220786058474068424">Memproses</translation>
 <translation id="7243308994586599757">Opsi terdapat di dekat bagian bawah layar</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> menggunakan lokasi Anda untuk menampilkan hasil penelusuran lokal</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Bantuan<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Batalkan pilihan</translation>
 <translation id="7851858861565204677">Perangkat lain</translation>
 <translation id="7876243839304621966">Hapus semua</translation>
+<translation id="7902333740914687335">Pembayaran telah diproses</translation>
 <translation id="7947953824732555851">Terima dan masuk</translation>
 <translation id="7949961459945740081">Dapatkan fitur terbaru</translation>
 <translation id="7963646190083259054">Vendor:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Konten</translation>
 <translation id="8173098127580644436">awal waktu</translation>
 <translation id="8200772114523450471">Lanjutkan</translation>
+<translation id="8202097416529803614">Ringkasan pesanan</translation>
 <translation id="8209050860603202033">Buka gambar</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> ingin terhubung ke:</translation>
 <translation id="8218346974737627104">Konfirmasi proses masuk</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Buka di jendela lain</translation>
 <translation id="8959122750345127698">Navigasi tidak dapat dijangkau: <ph name="URL" /></translation>
 <translation id="8979340629087822094">kemarin</translation>
+<translation id="8981454092730389528">Kontrol Aktivitas Google</translation>
+<translation id="8986494364107987395">Otomatis kirim statistik pemakaian dan laporan kemacetan sistem ke Google</translation>
 <translation id="8987061207681586800">Gayakan Chrome sesukamu</translation>
 <translation id="9019902583201351841">Dikelola oleh orang tua Anda</translation>
 <translation id="9020607083536754075">Tutup tab saat ini dan kembali ke aplikasi sebelumnya</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
index 1247d99..37a56bb 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Tradotto in <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Sincronizza i tuoi preferiti</translation>
 <translation id="17513872634828108">Schede aperte</translation>
+<translation id="1756600373018374892">Tocca questo pulsante per accedere velocemente alle tue schede.</translation>
 <translation id="1807246157184219062">Chiaro</translation>
 <translation id="1825719650605518411">Esperienza prima esecuzione</translation>
 <translation id="1829244130665387512">Trova nella pagina</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Abilita l'autorizzazione per Chrome in <ph name="BEGIN_LINK" />Impostazioni Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Salva password</translation>
 <translation id="1944384637046898011">Cripta tutto con la password Google a partire dal <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Controlla il modo in cui Google utilizza la cronologia di navigazione per personalizzare la Ricerca e altri servizi Google.</translation>
 <translation id="1959930595721737608">Consenti JavaScript nel seguente sito.</translation>
 <translation id="1966710179511230534">Aggiorna i dati di accesso.</translation>
 <translation id="1974060860693918893">Avanzate</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, app web. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Perfeziona</translation>
 <translation id="2315043854645842844">La selezione del certificato lato client non è supportata dal sistema operativo.</translation>
-<translation id="2316129865977710310">No, grazie</translation>
 <translation id="2321958826496381788">Trascina il cursore finché leggi il testo senza problemi. Il testo dovrebbe avere queste dimensioni minime quando tocchi due volte un paragrafo.</translation>
-<translation id="2329597144923131178">Accedi per visualizzare i tuoi Preferiti, la cronologia, le password e altre impostazioni su tutti i tuoi dispositivi.</translation>
 <translation id="2343328333327081434">Installazione…</translation>
 <translation id="2351097562818989364">Le impostazioni di traduzione sono state reimpostate.</translation>
 <translation id="2359808026110333948">Continua</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Cartella principale</translation>
 <translation id="2870560284913253234">Sito</translation>
 <translation id="2888126860611144412">Informazioni su Chrome</translation>
+<translation id="2889768325388591707">Spostamento rapido tra le schede</translation>
 <translation id="2891154217021530873">Interrompe il caricamento della pagina</translation>
 <translation id="2902702728133930130">Impossibile avviare Chrome a causa di un errore imprevisto.</translation>
 <translation id="2903493209154104877">Indirizzi</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Apri in scheda in incognito</translation>
 <translation id="3090193911106258841">Accesso all'input audio e video in corso</translation>
 <translation id="3137521801621304719">Esci dalla modalità di navigazione in incognito</translation>
+<translation id="3149891296864842641">Opzione di spedizione</translation>
+<translation id="3162882791484435636">Seleziona un'opzione di spedizione</translation>
+<translation id="3173438333156928404">Errore durante l'elaborazione del pagamento</translation>
 <translation id="3177909033752230686">Lingua della pagina:</translation>
 <translation id="3190152372525844641">Abilita le autorizzazioni per Chrome in <ph name="BEGIN_LINK" />Impostazioni Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> di dati memorizzati</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Vuoi che <ph name="PASSWORD_MANAGER_BRAND" /> aggiorni la password di questo sito?</translation>
 <translation id="4881695831933465202">Apri</translation>
 <translation id="4885273946141277891">Numero di istanze di Chrome non supportato.</translation>
+<translation id="4923459931733593730">Pagamento</translation>
 <translation id="4943872375798546930">Nessun risultato</translation>
-<translation id="4970484396410298643">Accedi alle schede che hai aperto sul computer direttamente qui.
-
-Apri Chrome sul computer, apri il menu e seleziona "Accedi a Chrome…"</translation>
 <translation id="497421865427891073">Avanti</translation>
 <translation id="4996978546172906250">Condividi tramite</translation>
 <translation id="5000922062037820727">Bloccata (opzione consigliata)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Apri in Chrome</translation>
 <translation id="5199929503336119739">Profilo di lavoro</translation>
 <translation id="5210365745912300556">Chiudi scheda</translation>
-<translation id="5210714456814679336">Le schede aperte in Chrome sugli altri dispositivi verranno visualizzate qui.</translation>
 <translation id="5222676887888702881">Esci</translation>
-<translation id="5228579091201413441">Abilita sincronizzazione</translation>
 <translation id="5233638681132016545">Nuova scheda</translation>
 <translation id="5271967389191913893">Non è possibile aprire i contenuti da scaricare sul dispositivo.</translation>
 <translation id="5275558766013849309">Le schede saranno insieme alle app recenti.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Bloccati</translation>
 <translation id="5684874026226664614">Spiacenti. Impossibile tradurre questa pagina.</translation>
 <translation id="5708031556037168012">Mantieni i dati esistenti sul tuo dispositivo e importa definitivamente i dati nell'account <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Aiutaci a scegliere le funzioni e i miglioramenti a cui dare la priorità inviando a Google informazioni sui file, sulle applicazioni e sui servizi in esecuzione quando si verifica un arresto anomalo.
-
-Le statistiche sull'utilizzo includono informazioni quali preferenze, clic sui pulsanti e utilizzo della memoria. Non includono gli URL delle pagine web o le informazioni personali. I rapporti sugli arresti anomali contengono informazioni sul sistema al momento dell'arresto anomalo e potrebbero includere URL di pagine web o informazioni personali, in base alle attività in corso al momento dell'arresto.</translation>
 <translation id="5719837394786370183">Le pagine visualizzate nelle schede in incognito non vengono memorizzate nella cronologia del browser, nell'archivio di cookie o nella cronologia delle ricerche dopo aver chiuso tutte le schede. I file da te scaricati o i Preferiti da te creati vengono mantenuti.
 
 Tuttavia, le tue attività non sono invisibili. L'attivazione della modalità di navigazione in incognito non consente di nascondere la navigazione al tuo datore di lavoro, al tuo provider di servizi Internet o ai siti web da te visitati.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Aggiorna</translation>
 <translation id="7191430249889272776">Scheda aperta in background.</translation>
 <translation id="7208788139759694678">Funzione Risparmio dati disattivata</translation>
+<translation id="7220786058474068424">Elaborazione in corso</translation>
 <translation id="7243308994586599757">Opzioni disponibili nella parte inferiore dello schermo</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> utilizza la tua posizione per mostrare i risultati della ricerca locale.</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Guida<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Annulla selezione</translation>
 <translation id="7851858861565204677">Altri dispositivi</translation>
 <translation id="7876243839304621966">Rimuovi tutto</translation>
+<translation id="7902333740914687335">Pagamento elaborato</translation>
 <translation id="7947953824732555851">Accetta e accedi</translation>
 <translation id="7949961459945740081">Scopri le nuove funzioni</translation>
 <translation id="7963646190083259054">Fornitore:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Contenuti</translation>
 <translation id="8173098127580644436">tutto</translation>
 <translation id="8200772114523450471">Riprendi</translation>
+<translation id="8202097416529803614">Riepilogo dell’ordine</translation>
 <translation id="8209050860603202033">Apri immagine</translation>
 <translation id="8215250379351058554">Il sito <ph name="SITE" /> vuole collegarsi a:</translation>
 <translation id="8218346974737627104">Conferma accesso</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Apri nell'altra finestra</translation>
 <translation id="8959122750345127698">Navigazione inaccessibile: <ph name="URL" /></translation>
 <translation id="8979340629087822094">ultimo giorno</translation>
+<translation id="8981454092730389528">Gestione attività di Google</translation>
+<translation id="8986494364107987395">Invia automaticamente a Google statistiche sull'utilizzo e segnalazioni sugli arresti anomali</translation>
 <translation id="8987061207681586800">Personalizza Chrome</translation>
 <translation id="9019902583201351841">Gestito dai genitori</translation>
 <translation id="9020607083536754075">Chiudi la scheda corrente e torna all'app precedente</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
index 2b1b065b..4fca861 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">תורגם ל<ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">סנכרון הסימניות שלך</translation>
 <translation id="17513872634828108">כרטיסיות פתוחות</translation>
+<translation id="1756600373018374892">לחץ על לחצן זה כדי לקבל גישה מהירה לכרטיסיות שלך.</translation>
 <translation id="1807246157184219062">בהיר</translation>
 <translation id="1825719650605518411">חוויית הפעלה ראשונה</translation>
 <translation id="1829244130665387512">חפש בדף</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">‏הפעל הרשאה בשביל Chrome ב<ph name="BEGIN_LINK" />הגדרות Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">שמור סיסמאות</translation>
 <translation id="1944384637046898011">‏הצפן הכל באמצעות סיסמת Google החל מ-<ph name="TIME" /></translation>
+<translation id="1946005195648379376">‏קבע כיצד Google משתמשת בהיסטוריית הגלישה שלך כדי להתאים אישית את החיפוש ושירותים אחרים של Google.</translation>
 <translation id="1959930595721737608">‏התר JavaScript באתר הבא.</translation>
 <translation id="1966710179511230534">עדכן את פרטי הכניסה שלך.</translation>
 <translation id="1974060860693918893">מתקדם</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, אפליקציית אינטרנט. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">צמצם</translation>
 <translation id="2315043854645842844">מערכת ההפעלה אינה תומכת בבחירת אישור בצד הלקוח.</translation>
-<translation id="2316129865977710310">לא, תודה</translation>
 <translation id="2321958826496381788">גרור את המחוון עד שתוכל לקרוא את הקטע הזה בצורה נוחה. לאחר שתקיש פעמיים על פיסקה, הטקסט אמור להיות מוצג בגודל הזה לפחות.</translation>
-<translation id="2329597144923131178">היכנס כדי לקבל גישה אל הסימניות, ההיסטוריה, הסיסמאות והגדרות נוספות בכל המכשירים שברשותך.</translation>
 <translation id="2343328333327081434">מתקין...</translation>
 <translation id="2351097562818989364">הגדרות התרגום שלך אופסו.</translation>
 <translation id="2359808026110333948">המשך</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">תיקיית אב</translation>
 <translation id="2870560284913253234">אתר</translation>
 <translation id="2888126860611144412">‏מידע כללי על Chrome</translation>
+<translation id="2889768325388591707">מעבר מהיר בין כרטיסיות</translation>
 <translation id="2891154217021530873">הפסק את טעינת הדף</translation>
 <translation id="2902702728133930130">‏שגיאה בלתי צפויה גרמה לכשל של Chrome בעת ההפעלה.</translation>
 <translation id="2903493209154104877">כתובות</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">פתח בכרטיסיית גלישה בסתר</translation>
 <translation id="3090193911106258841">גישה לקלט אודיו ווידאו</translation>
 <translation id="3137521801621304719">צא ממצב גלישה בסתר</translation>
+<translation id="3149891296864842641">אפשרויות משלוח</translation>
+<translation id="3162882791484435636">בחר באפשרות משלוח</translation>
+<translation id="3173438333156928404">שגיאה בעיבוד התשלום</translation>
 <translation id="3177909033752230686">שפת הדף:</translation>
 <translation id="3190152372525844641">‏הפעל הרשאות בשביל Chrome ב<ph name="BEGIN_LINK" />הגדרות Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905">נתונים מאוחסנים בנפח <ph name="STORAGE_AMOUNT" /></translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">האם תרצה ש-<ph name="PASSWORD_MANAGER_BRAND" /> יעדכן את הסיסמה שלך בשביל האתר הזה?</translation>
 <translation id="4881695831933465202">פתח</translation>
 <translation id="4885273946141277891">‏מספר בלתי נתמך של מופעי Chrome.</translation>
+<translation id="4923459931733593730">תשלום</translation>
 <translation id="4943872375798546930">אין תוצאות</translation>
-<translation id="4970484396410298643">‏גש מכאן ישירות אל הכרטיסיות שפתחת במחשב.
-
-פתח את Chrome במחשב, עבור אל התפריט ובחר באפשרות 'היכנס אל Chrome…'</translation>
 <translation id="497421865427891073">המשך קדימה</translation>
 <translation id="4996978546172906250">שתף באמצעות</translation>
 <translation id="5000922062037820727">חסומה (מומלץ)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">‏פתח ב-Chrome</translation>
 <translation id="5199929503336119739">פרופיל עבודה</translation>
 <translation id="5210365745912300556">סגור כרטיסייה</translation>
-<translation id="5210714456814679336">‏כרטיסיות שפתחת ב-Chrome במכשירים האחרים שלך יופיעו כאן.</translation>
 <translation id="5222676887888702881">יציאה</translation>
-<translation id="5228579091201413441">הפעל סנכרון</translation>
 <translation id="5233638681132016545">כרטיסייה חדשה</translation>
 <translation id="5271967389191913893">המכשיר לא מצליח לפתוח את התוכן להורדה.</translation>
 <translation id="5275558766013849309">כרטיסיות יאוחסנו ביחד עם יישומים אחרונים.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">במצב חסום</translation>
 <translation id="5684874026226664614">אופס. לא ניתן היה לתרגם את הדף הזה.</translation>
 <translation id="5708031556037168012">שמור את הנתונים הקיימים במכשיר וייבא לצמיתות את הנתונים אל <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">‏כדי לעזור לנו לקבוע את סדר העדיפויות לגבי תכונות ושיפורים שעלינו לעבוד עליהם, שלח ל-Google מידע על הקבצים, על האפליקציות ועל השירותים הפועלים בזמן שאתה נתקל בקריסה.
-
-סטטיסטיקות השימוש כוללות מידע כגון העדפות, לחיצות על לחצנים ושימוש בזיכרון. הן אינן כוללות כתובות של דפי אינטרנט או מידע אישי. דוחות קריסה מכילים מידע על המערכת בזמן הקריסה, והם עשויים להכיל כתובות של דפי אינטרנט או מידע אישי, בהתאם למתרחש בזמן הקריסה.</translation>
 <translation id="5719837394786370183">‏דפים שאתה מציג בכרטיסיות גלישה בסתר לא יישמרו בהיסטוריית הדפדפן, אחסון קובצי ה-cookie או היסטוריית החיפושים לאחר שתסגור את כל הכרטיסיות של גלישה בסתר. קבצים שתוריד או סימניות שתיצור יישמרו.
 
 עם זאת, אינך בלתי נראה. מעבר למצב גלישה בסתר אינו מסתיר את הגלישה שלך מהמעסיק, ספק שירות האינטרנט או האתרים שבהם אתה מבקר.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">רענן</translation>
 <translation id="7191430249889272776">הכרטיסייה נפתחה ברקע.</translation>
 <translation id="7208788139759694678">‏חוסך הנתונים (Data Saver) מושבת</translation>
+<translation id="7220786058474068424">מעבד</translation>
 <translation id="7243308994586599757">אפשרויות הזמינות באזור החלק התחתון של המסך</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> משתמש במיקום שלך כדי להציג תוצאות חיפוש מקומיות</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />עזרה<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">בטל את הבחירה</translation>
 <translation id="7851858861565204677">מכשירים אחרים</translation>
 <translation id="7876243839304621966">הסר הכל</translation>
+<translation id="7902333740914687335">התשלום בוצע</translation>
 <translation id="7947953824732555851">קבל והיכנס</translation>
 <translation id="7949961459945740081">קבלת התכונות האחרונות</translation>
 <translation id="7963646190083259054">ספק:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">תוכן</translation>
 <translation id="8173098127580644436">משחר ההיסטוריה</translation>
 <translation id="8200772114523450471">חדש</translation>
+<translation id="8202097416529803614">סיכום הזמנה</translation>
 <translation id="8209050860603202033">פתח את התמונה</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> רוצה להתחבר אל:</translation>
 <translation id="8218346974737627104">אשר את הכניסה</translation>
@@ -593,6 +593,8 @@
 <translation id="8942627711005830162">פתח בחלון האחר</translation>
 <translation id="8959122750345127698">הניווט לא אפשרי: <ph name="URL" /></translation>
 <translation id="8979340629087822094">מהיום האחרון</translation>
+<translation id="8981454092730389528">‏בחירת הפעילויות ב-Google</translation>
+<translation id="8986494364107987395">‏שלח ל-Google דוחות קריסה וסטטיסטיקת שימוש באופן אוטומטי</translation>
 <translation id="8987061207681586800">‏התאם אישית את Chrome</translation>
 <translation id="9019902583201351841">מנוהל על-ידי ההורים שלך</translation>
 <translation id="9020607083536754075">סגור את הכרטיסייה הנוכחית וחזור לאפליקציה הקודמת</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
index 5ac5ea5e..407ec1a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220"><ph name="TARGET_LANGUAGE" />に翻訳しました。</translation>
 <translation id="1749561566933687563">ブックマークの同期</translation>
 <translation id="17513872634828108">開いているタブ</translation>
+<translation id="1756600373018374892">このボタンをタップして簡単にタブに移動できます。</translation>
 <translation id="1807246157184219062">明</translation>
 <translation id="1825719650605518411">初回実行時のエクスペリエンス</translation>
 <translation id="1829244130665387512">ページ内検索</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587"><ph name="BEGIN_LINK" />Android の設定<ph name="END_LINK" />で Chrome の権限を有効にしてください。</translation>
 <translation id="1943432128510653496">パスワードを保存する</translation>
 <translation id="1944384637046898011"><ph name="TIME" />時点の Google パスワードですべてのデータを暗号化する</translation>
+<translation id="1946005195648379376">Google が閲覧履歴をどのような方法で使用し、検索やその他の Google サービスをカスタマイズするかを設定します。</translation>
 <translation id="1959930595721737608">次のサイトで JavaScript を許可します。</translation>
 <translation id="1966710179511230534">ログイン情報を更新してください。</translation>
 <translation id="1974060860693918893">詳細設定</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" /> はウェブアプリです(<ph name="APP_URL" />)。</translation>
 <translation id="2268044343513325586">絞り込み</translation>
 <translation id="2315043854645842844">オペレーティング システムでサポートされていないため、クライアント側で証明書を選択することはできません。</translation>
-<translation id="2316129865977710310">いいえ</translation>
 <translation id="2321958826496381788">読みやすくなるまでスライダをドラッグしてください。段落をダブルタップするとテキストがこれより大きくなります。</translation>
-<translation id="2329597144923131178">ログインすると、お使いのどのデバイスでも同じブックマーク、履歴、パスワード、その他の設定を利用できるようになります。</translation>
 <translation id="2343328333327081434">インストール中...</translation>
 <translation id="2351097562818989364">翻訳設定をリセットしました。</translation>
 <translation id="2359808026110333948">続行</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">親フォルダ</translation>
 <translation id="2870560284913253234">サイト</translation>
 <translation id="2888126860611144412">Chrome について</translation>
+<translation id="2889768325388591707">タブをすばやく切り替える</translation>
 <translation id="2891154217021530873">ページの読み込みを停止</translation>
 <translation id="2902702728133930130">Chrome の起動時に予期しないエラーが発生し、起動できませんでした。</translation>
 <translation id="2903493209154104877">住所</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">シークレット タブで開く</translation>
 <translation id="3090193911106258841">音声 / ビデオ入力にアクセスしています</translation>
 <translation id="3137521801621304719">シークレット モードを終了</translation>
+<translation id="3149891296864842641">配送オプション</translation>
+<translation id="3162882791484435636">配送オプションを選択</translation>
+<translation id="3173438333156928404">お支払いの処理中にエラーが発生しました</translation>
 <translation id="3177909033752230686">ページの言語:</translation>
 <translation id="3190152372525844641"><ph name="BEGIN_LINK" />Android の設定<ph name="END_LINK" />で Chrome の権限を有効にしてください。</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> の保存データ</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625"><ph name="PASSWORD_MANAGER_BRAND" /> でこのサイトのパスワードを更新しますか?</translation>
 <translation id="4881695831933465202">開く</translation>
 <translation id="4885273946141277891">Chrome のインスタンス数の上限を超えています。</translation>
+<translation id="4923459931733593730">お支払い</translation>
 <translation id="4943872375798546930">結果はありません</translation>
-<translation id="4970484396410298643">パソコンで開いたタブにこちらからアクセスできます。
-
-パソコンで Chrome を開き、メニューから [Chrome にログイン] を選択してください。</translation>
 <translation id="497421865427891073">次に進む</translation>
 <translation id="4996978546172906250">共有方法</translation>
 <translation id="5000922062037820727">ブロック(推奨)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Chromeで開く</translation>
 <translation id="5199929503336119739">仕事用プロファイル</translation>
 <translation id="5210365745912300556">タブを閉じる</translation>
-<translation id="5210714456814679336">他のデバイスの Chrome で開いているタブがここに表示されます。</translation>
 <translation id="5222676887888702881">ログアウト</translation>
-<translation id="5228579091201413441">同期を有効にする</translation>
 <translation id="5233638681132016545">新しいタブ</translation>
 <translation id="5271967389191913893">デバイスでダウンロード コンテンツを開くことができません。</translation>
 <translation id="5275558766013849309">タブは最近使ったアプリと一緒に表示されます。</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">ブロック</translation>
 <translation id="5684874026226664614">このページを翻訳できませんでした。</translation>
 <translation id="5708031556037168012">デバイスの既存のデータを保持して、<ph name="TO_ACCOUNT" /> にデータを完全にインポートします。</translation>
-<translation id="5712189971979076230">Google では優先度の高い機能から順に開発や改善に取り組みたいと考えています。そのため、障害が発生した場合は、実行していたファイル、アプリケーション、サービスに関する情報を Google に送信していただけますと幸いです。
-
-使用統計データには、設定、ボタンのクリック数、メモリの使用状況などの情報が含まれ、ウェブページの URL や個人情報は含まれません。障害レポートには、障害発生時のシステム情報が含まれ、障害発生時の状況によってはウェブページの URL や個人情報が含まれることもあります。</translation>
 <translation id="5719837394786370183">シークレット タブで表示したページの記録は、シークレット タブをすべて閉じた後、ブラウザの履歴、Cookieの保存場所、検索履歴から消去されます。ただし、ダウンロードしたファイルや作成したブックマークは保存されます。
 
 あらゆる場所に記録が一切残らないわけではありません。シークレット モードを使っても、雇用主、インターネット サービス プロバイダ、訪問先のウェブサイトに閲覧内容が知られる可能性はあります。</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">更新</translation>
 <translation id="7191430249889272776">バックグラウンドでタブを開きました。</translation>
 <translation id="7208788139759694678">データセーバーは無効です</translation>
+<translation id="7220786058474068424">処理しています</translation>
 <translation id="7243308994586599757">画面の下の方にオプションがあります</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> では地域の検索結果を表示するためにユーザーの位置情報が使用されます</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />ヘルプ<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">選択解除</translation>
 <translation id="7851858861565204677">その他のデバイス</translation>
 <translation id="7876243839304621966">すべて削除</translation>
+<translation id="7902333740914687335">お支払いの処理を完了しました</translation>
 <translation id="7947953824732555851">同意してログイン</translation>
 <translation id="7949961459945740081">最新機能を取得</translation>
 <translation id="7963646190083259054">ベンダー:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">コンテンツ</translation>
 <translation id="8173098127580644436">始めから</translation>
 <translation id="8200772114523450471">再開</translation>
+<translation id="8202097416529803614">ご注文概要</translation>
 <translation id="8209050860603202033">画像を開く</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> の接続先を選択:</translation>
 <translation id="8218346974737627104">ログインの確認</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">別のウィンドウで開く</translation>
 <translation id="8959122750345127698"><ph name="URL" /> にアクセスできません</translation>
 <translation id="8979340629087822094">過去 1 日</translation>
+<translation id="8981454092730389528">Google アクティビティ管理</translation>
+<translation id="8986494364107987395">使用統計データや障害レポートを自動的に Google に送信する</translation>
 <translation id="8987061207681586800">自分だけの Chrome を</translation>
 <translation id="9019902583201351841">保護者により管理されています</translation>
 <translation id="9020607083536754075">現在のタブを閉じて前のアプリに戻る</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
index cae39ab..792140f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220"><ph name="TARGET_LANGUAGE" />로 번역했습니다.</translation>
 <translation id="1749561566933687563">북마크 동기화</translation>
 <translation id="17513872634828108">열린 탭</translation>
+<translation id="1756600373018374892">내 탭에 빠르게 액세스하려면 이 버튼을 탭하세요.</translation>
 <translation id="1807246157184219062">밝게</translation>
 <translation id="1825719650605518411">첫 실행</translation>
 <translation id="1829244130665387512">페이지에서 찾기</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587"><ph name="BEGIN_LINK" />Android 설정<ph name="END_LINK" />에서 Chrome 관련 권한을 설정합니다.</translation>
 <translation id="1943432128510653496">비밀번호 저장</translation>
 <translation id="1944384637046898011"><ph name="TIME" />에 Google 비밀번호로 전체 데이터 암호화</translation>
+<translation id="1946005195648379376">검색 및 다른 Google 서비스를 맞춤설정하기 위하여 Google이 내 인터넷 사용 기록을 사용하는 방법을 조정하세요.</translation>
 <translation id="1959930595721737608">다음 사이트에서 자바스크립트를 허용합니다.</translation>
 <translation id="1966710179511230534">로그인 세부정보를 업데이트하세요.</translation>
 <translation id="1974060860693918893">고급</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, 웹 앱. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">상세검색</translation>
 <translation id="2315043854645842844">클라이언트측 인증서 선택이 운영체제에서 지원되지 않습니다.</translation>
-<translation id="2316129865977710310">아니요, 괜찮습니다.</translation>
 <translation id="2321958826496381788">편하게 읽을 수 있을 때까지 슬라이더를 드래그하세요. 단락을 두 번 탭하면 텍스트가 이 이상의 크기로 표시됩니다.</translation>
-<translation id="2329597144923131178">로그인하면 모든 기기에서 북마크, 방문 기록, 비밀번호, 기타 설정을 사용할 수 있습니다.</translation>
 <translation id="2343328333327081434">설치 중...</translation>
 <translation id="2351097562818989364">번역 설정이 재설정되었습니다.</translation>
 <translation id="2359808026110333948">계속</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">상위 폴더</translation>
 <translation id="2870560284913253234">사이트</translation>
 <translation id="2888126860611144412">크롬 정보</translation>
+<translation id="2889768325388591707">빠른 탭 전환</translation>
 <translation id="2891154217021530873">페이지 로딩 중지</translation>
 <translation id="2902702728133930130">예기치 않은 오류로 인해 Chrome을 시작하지 못했습니다.</translation>
 <translation id="2903493209154104877">주소</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">시크릿 탭에서 열기</translation>
 <translation id="3090193911106258841">오디오 및 비디오 입력 장치에 액세스</translation>
 <translation id="3137521801621304719">시크릿 모드 나가기</translation>
+<translation id="3149891296864842641">배송 옵션</translation>
+<translation id="3162882791484435636">배송 옵션 선택</translation>
+<translation id="3173438333156928404">결제를 처리하는 중에 오류가 발생했습니다.</translation>
 <translation id="3177909033752230686">페이지 언어:</translation>
 <translation id="3190152372525844641"><ph name="BEGIN_LINK" />Android 설정<ph name="END_LINK" />에서 Chrome 관련 권한을 설정합니다.</translation>
 <translation id="3198916472715691905">저장 데이터 <ph name="STORAGE_AMOUNT" /></translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625"><ph name="PASSWORD_MANAGER_BRAND" />에서 이 사이트의 비밀번호를 업데이트하도록 하시겠습니까?</translation>
 <translation id="4881695831933465202">열기</translation>
 <translation id="4885273946141277891">지원되지 않는 Chrome 인스턴스 수입니다.</translation>
+<translation id="4923459931733593730">결제</translation>
 <translation id="4943872375798546930">검색결과가 없습니다.</translation>
-<translation id="4970484396410298643">컴퓨터에서 열어 둔 탭을 여기에서 바로 액세스할 수 있습니다.
-
-컴퓨터에서 Chrome을 열고 메뉴로 이동하여 'Chrome에 로그인...'을 선택하세요.</translation>
 <translation id="497421865427891073">앞으로 이동</translation>
 <translation id="4996978546172906250">공유 방법</translation>
 <translation id="5000922062037820727">차단(권장)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Chrome에서 열기</translation>
 <translation id="5199929503336119739">직장용 프로필</translation>
 <translation id="5210365745912300556">탭 닫기</translation>
-<translation id="5210714456814679336">다른 기기의 Chrome에서 연 탭이 여기에 표시됩니다.</translation>
 <translation id="5222676887888702881">로그아웃</translation>
-<translation id="5228579091201413441">동기화 사용</translation>
 <translation id="5233638681132016545">새 탭</translation>
 <translation id="5271967389191913893">기기에서 다운로드하려는 콘텐츠를 열 수 없습니다.</translation>
 <translation id="5275558766013849309">탭은 최근 앱과 함께 보유할 수 있습니다.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">차단됨</translation>
 <translation id="5684874026226664614">죄송합니다. 이 페이지를 번역할 수 없습니다.</translation>
 <translation id="5708031556037168012">기기의 기존 데이터를 보관하고 데이터를 <ph name="TO_ACCOUNT" />(으)로 완전히 가져옵니다.</translation>
-<translation id="5712189971979076230">다운이 발생할 때마다 실행 중인 파일, 애플리케이션, 서비스에 관한 정보를 Google에 전송하여 우선적으로 구현해야 할 기능과 개선사항을 정할 수 있도록 도와주세요.
-
-사용 통계에는 환경설정, 버튼 클릭수, 메모리 사용량과 같은 정보가 포함되며 웹페이지 URL이나 개인정보는 포함되어 있지 않습니다. 오류 보고서에는 문제가 발생했을 당시의 시스템 정보가 포함되며 발생 당시 상황에 따라 웹페이지 URL이나 개인정보가 포함될 수도 있습니다.</translation>
 <translation id="5719837394786370183">시크릿 탭을 모두 닫으면 시크릿 탭에서 본 페이지는 브라우저 방문 기록, 쿠키 저장소 또는 방문 기록 어디에도 흔적이 남지 않습니다. 단, 다운로드한 파일이나 생성한 북마크는 유지됩니다.
 
 하지만 완전한 비밀이 보장되는 것은 아닙니다. 시크릿 모드로 탐색해도 회사, 인터넷 서비스 제공업체(IPS), 방문한 웹사이트에 저장된 흔적까지 없앨 수는 없습니다.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">새로고침</translation>
 <translation id="7191430249889272776">탭이 백그라운드에 열림</translation>
 <translation id="7208788139759694678">데이터 세이버 사용 안함</translation>
+<translation id="7220786058474068424">처리 중</translation>
 <translation id="7243308994586599757">화면 하단에서 옵션 선택 가능</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" />이(가) 사용자 위치 정보를 사용하여 지역 검색결과 표시</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />도움말<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">선택 취소</translation>
 <translation id="7851858861565204677">다른 기기</translation>
 <translation id="7876243839304621966">모두 삭제</translation>
+<translation id="7902333740914687335">결제 처리됨</translation>
 <translation id="7947953824732555851">수락 및 로그인</translation>
 <translation id="7949961459945740081">최신 기능 다운로드</translation>
 <translation id="7963646190083259054">공급업체:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">콘텐츠</translation>
 <translation id="8173098127580644436">전체</translation>
 <translation id="8200772114523450471">다시 시작</translation>
+<translation id="8202097416529803614">주문 요약</translation>
 <translation id="8209050860603202033">이미지 열기</translation>
 <translation id="8215250379351058554"><ph name="SITE" />에서 다음과 연결하려고 합니다:</translation>
 <translation id="8218346974737627104">로그인 확인</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">다른 창에서 열기</translation>
 <translation id="8959122750345127698">탐색할 수 없음: <ph name="URL" /></translation>
 <translation id="8979340629087822094">지난 1일</translation>
+<translation id="8981454092730389528">Google 활동 제어</translation>
+<translation id="8986494364107987395">사용 통계 및 오류 보고서를 Google에 자동으로 보내기</translation>
 <translation id="8987061207681586800">나만의 Chrome 만들기</translation>
 <translation id="9019902583201351841">부모님이 관리합니다.</translation>
 <translation id="9020607083536754075">현재 탭을 닫고 이전 앱으로 돌아가기</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
index dbfaf8c..1a5bc900 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Išversta į <ph name="TARGET_LANGUAGE" /> k.</translation>
 <translation id="1749561566933687563">Sinchronizuokite žymes</translation>
 <translation id="17513872634828108">Atidaryti skirtukai</translation>
+<translation id="1756600373018374892">Palieskite šį mygtuką, kad greitai pasiektumėte skirtukus.</translation>
 <translation id="1807246157184219062">Šviesi</translation>
 <translation id="1825719650605518411">Pirmosios paleisties patirtis</translation>
 <translation id="1829244130665387512">Surasti puslapyje</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Įjunkite „Chrome“ leidimą <ph name="BEGIN_LINK" />„Android“ nustatymuose<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Slaptažodžių išsaugojimas</translation>
 <translation id="1944384637046898011">Šifruoti viską nuo <ph name="TIME" /> taikant „Google“ slaptažodį</translation>
+<translation id="1946005195648379376">Galite pasirinkti, kaip „Google“ turėtų naudoti jūsų naršymo istoriją, kad suasmenintų Paiešką ir kitas „Google“ paslaugas.</translation>
 <translation id="1959930595721737608">Leisti „JavaScript“ toliau nurodytoje svetainėje.</translation>
 <translation id="1966710179511230534">Atnaujinkite išsamią prisijungimo informaciją.</translation>
 <translation id="1974060860693918893">Išplėstiniai</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966">„<ph name="APP_NAME" />“, žiniatinklio programa. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Patikslinti</translation>
 <translation id="2315043854645842844">Kliento pasirinkto sertifikato nepalaiko operacinė sistema.</translation>
-<translation id="2316129865977710310">Ačiū, ne</translation>
 <translation id="2321958826496381788">Vilkite šliaužiklį, kol bus patogu skaityti šį tekstą. Du kartus palietus pastraipą, tekstas turėtų būti mažiausiai tokio dydžio.</translation>
-<translation id="2329597144923131178">Pris. ir pas. žymių, ist., slapt. bei kitų nust. duom. visuose įreng.</translation>
 <translation id="2343328333327081434">Diegiama...</translation>
 <translation id="2351097562818989364">Vertimo nustatymai buvo nustatyti iš naujo.</translation>
 <translation id="2359808026110333948">Tęsti</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Viršaplankis</translation>
 <translation id="2870560284913253234">Svetainė</translation>
 <translation id="2888126860611144412">Apie „Chrome“</translation>
+<translation id="2889768325388591707">Greitai perjunkite skirtukus</translation>
 <translation id="2891154217021530873">Sustabdyti puslapio įkėlimą</translation>
 <translation id="2902702728133930130">Nepavyko paleisti „Chrome“, nes kilo netikėta klaida.</translation>
 <translation id="2903493209154104877">Adresai</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Atidaryti inkognito skirtuko lape</translation>
 <translation id="3090193911106258841">Pasiekiama garso ir vaizdo įrašų įvestis</translation>
 <translation id="3137521801621304719">Išjungti inkognito režimą</translation>
+<translation id="3149891296864842641">Pristatymo parinktis</translation>
+<translation id="3162882791484435636">Pasirinkite pristatymo parinktį</translation>
+<translation id="3173438333156928404">Apdorojant mokėjimą įvyko klaida</translation>
 <translation id="3177909033752230686">Puslapio kalba:</translation>
 <translation id="3190152372525844641">Įjunkite „Chrome“ leidimus <ph name="BEGIN_LINK" />„Android“ nustatymuose<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905">Išsaugota duomenų: <ph name="STORAGE_AMOUNT" /></translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Ar norite, kad „<ph name="PASSWORD_MANAGER_BRAND" />“ atnaujintų šios svetainės slaptažodį?</translation>
 <translation id="4881695831933465202">Atidaryti</translation>
 <translation id="4885273946141277891">Nepalaikomas „Chrome“ atvejų skaičius.</translation>
+<translation id="4923459931733593730">Mokėjimas</translation>
 <translation id="4943872375798546930">Rezultatų nėra</translation>
-<translation id="4970484396410298643">Čia galite pasiekti skirtukus, kurių lapus esate atidarę kompiuteryje.
-
-Tiesiog atidarykite „Chrome“ kompiuteryje, eikite į meniu ir pasirinkite „Prisijungti prie „Chrome“...“</translation>
 <translation id="497421865427891073">Eiti pirmyn</translation>
 <translation id="4996978546172906250">Bendrinti per</translation>
 <translation id="5000922062037820727">Užblokuota (rekomenduojama)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Atidaryti naudojant „Chrome“</translation>
 <translation id="5199929503336119739">Darbo profilis</translation>
 <translation id="5210365745912300556">Uždaryti skirtuką</translation>
-<translation id="5210714456814679336">Čia bus rodomi kituose įrenginiuose atidarytų „Chrome“ skirtukų lapai.</translation>
 <translation id="5222676887888702881">Atsijungti</translation>
-<translation id="5228579091201413441">Įgalinti sinchronizavimą</translation>
 <translation id="5233638681132016545">Naujas skirtukas</translation>
 <translation id="5271967389191913893">Įrenginyje nepavyksta atidaryti norimo atsisiųsti turinio.</translation>
 <translation id="5275558766013849309">Skirtukai bus pateikti su naujausiomis programomis.</translation>
@@ -343,9 +343,6 @@
 <translation id="5677928146339483299">Užblokuota</translation>
 <translation id="5684874026226664614">Oi, nepavyko išversti šio puslapio.</translation>
 <translation id="5708031556037168012">Esami duomenys bus išlaikyti įrenginyje ir visam laikui importuoti į paskyrą <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Padėkite pirmiausia sutelkti dėmesį į funkcijas ir patobulinimus, ties kuriais turėtume padirbėti, į sistemą „Google“ siųsdami informacijos apie failus, programas ir paslaugas, kurios buvo vykdomos per strigtį.
-
-Naudojimo statistika yra įvairi informacija, įskaitant nuostatas, mygtukų paspaudimus ir atminties naudojimą. Tinklalapių URL adresai ar kita asmeninė informacija neįtraukiama. Strigčių ataskaitose pateikiama užstrigusios sistemos informacija ir jose gali būti tinklalapių URL adresų ar asmeninės informacijos, atsižvelgiant į tai, kas vyko per strigtį.</translation>
 <translation id="5719837394786370183">Kai uždarysite visus inkognito skirtukų lapus, puslapiai, kuriuos žiūrite inkognito režimu, nebus saugomi naršyklės istorijoje, slapukų saugykloje ar paieškos istorijoje. Bus išsaugoti visi atsisiųsti failai ar sukurtos žymės.
 
 Tačiau nesate nematomi. Kai naudojate inkognito režimą, jūsų darbdavys, interneto paslaugų teikėjas ar lankomos svetainės vis tiek gali pasiekti naršymo informaciją.</translation>
@@ -464,6 +461,7 @@
 <translation id="7180611975245234373">Atnaujinti</translation>
 <translation id="7191430249889272776">Skirtuko lapas atidarytas fone.</translation>
 <translation id="7208788139759694678">Duomenų taupymo priemonė išjungta</translation>
+<translation id="7220786058474068424">Apdorojama</translation>
 <translation id="7243308994586599757">Parinktys pasiekiamos netoli ekrano apačios</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> naudoja vietovės informaciją vietinės paieškos rezultatams rodyti</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Pagalba<ph name="END_LINK" /></translation>
@@ -517,6 +515,7 @@
 <translation id="7846076177841592234">Atšaukti pasirinkimą</translation>
 <translation id="7851858861565204677">Kiti įrenginiai</translation>
 <translation id="7876243839304621966">Pašalinti viską</translation>
+<translation id="7902333740914687335">Mokėjimas apdorotas</translation>
 <translation id="7947953824732555851">Sutikti ir prisij.</translation>
 <translation id="7949961459945740081">Gauti naujausias funkcijas</translation>
 <translation id="7963646190083259054">Paslaugos teikėjas:</translation>
@@ -540,6 +539,7 @@
 <translation id="8168435359814927499">Turinys</translation>
 <translation id="8173098127580644436">laiko pradžia</translation>
 <translation id="8200772114523450471">Atnaujinti</translation>
+<translation id="8202097416529803614">Užsakymo suvestinė</translation>
 <translation id="8209050860603202033">Atidaryti vaizdą</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> nori prisijungti prie:</translation>
 <translation id="8218346974737627104">Patvirtinti prisijungimą</translation>
@@ -596,6 +596,8 @@
 <translation id="8942627711005830162">Atidaryti kitame lange</translation>
 <translation id="8959122750345127698">Naršymas nepasiekiamas: <ph name="URL" /></translation>
 <translation id="8979340629087822094">pastaroji diena</translation>
+<translation id="8981454092730389528">„Google“ veiklos valdikliai</translation>
+<translation id="8986494364107987395">Automatiškai siųsti naudojimo statistiką ir strigčių ataskaitas „Google“</translation>
 <translation id="8987061207681586800">Suasmeninkite „Chrome“</translation>
 <translation id="9019902583201351841">Tvarko jūsų tėvai</translation>
 <translation id="9020607083536754075">Uždaryti dabartinį skirtuką ir grįžti į ankstesnę programą</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
index ae66336..3507f8f5 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Tulkots šādā valodā: <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Sinhronizējiet grāmatzīmes</translation>
 <translation id="17513872634828108">Atvērt cilnes</translation>
+<translation id="1756600373018374892">Pieskaries šai pogai, lai ātri piekļūt savām cilnēm.</translation>
 <translation id="1807246157184219062">Gaišs</translation>
 <translation id="1825719650605518411">Pirmās palaišanas programma</translation>
 <translation id="1829244130665387512">Atrast lapā</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587"><ph name="BEGIN_LINK" />Android iestatījumos<ph name="END_LINK" /> ieslēdziet atļauju pārlūkam Chrome.</translation>
 <translation id="1943432128510653496">Paroļu saglabāšana</translation>
 <translation id="1944384637046898011">Šifrēt visu ar Google paroli, sākot no: <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Kontrolējiet to, kā Google var izmantot jūsu pārlūkošanas vēsturi, lai personalizētu Meklēšanu un citus Google pakalpojumus.</translation>
 <translation id="1959930595721737608">Atļaujiet izmantot JavaScript tālāk parādītajā vietnē.</translation>
 <translation id="1966710179511230534">Lūdzu, atjauniniet pierakstīšanās informāciju.</translation>
 <translation id="1974060860693918893">Papildu</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966">Tīmekļa lietotne <ph name="APP_NAME" />. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Uzlabot</translation>
 <translation id="2315043854645842844">Operētājsistēma neatbalsta klienta puses sertifikāta atlasi.</translation>
-<translation id="2316129865977710310">Nē, paldies</translation>
 <translation id="2321958826496381788">Velciet slīdni, kamēr varat ērti lasīt. Pēc dubultskāriena rindkopai tekstam ir jābūt vismaz šādā lielumā.</translation>
-<translation id="2329597144923131178">Pierakstieties, lai grāmatzīmes, vēsture, paroles u.c. būtu pieejamas visās jūsu ierīcēs.</translation>
 <translation id="2343328333327081434">Instalēšana...</translation>
 <translation id="2351097562818989364">Tulkošanas iestatījumi ir atiestatīti.</translation>
 <translation id="2359808026110333948">Turpināt</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Vecākmape</translation>
 <translation id="2870560284913253234">Vietne</translation>
 <translation id="2888126860611144412">Par Chrome</translation>
+<translation id="2889768325388591707">Ātra ciļņu pārslēgšana</translation>
 <translation id="2891154217021530873">Pārtraukt lapas ielādi</translation>
 <translation id="2902702728133930130">Pārlūka Chrome palaišanas laikā radās neparedzēta kļūda.</translation>
 <translation id="2903493209154104877">Adreses</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Atvērt inkognito režīma cilnē</translation>
 <translation id="3090193911106258841">Notiek piekļūšana audio un video ievadei</translation>
 <translation id="3137521801621304719">Iziet no inkognito režīma</translation>
+<translation id="3149891296864842641">Piegādes iespēja</translation>
+<translation id="3162882791484435636">Atlasīt piegādes iespēju</translation>
+<translation id="3173438333156928404">Kļūda, apstrādājot maksājumu</translation>
 <translation id="3177909033752230686">Lapas valoda:</translation>
 <translation id="3190152372525844641"><ph name="BEGIN_LINK" />Android iestatījumos<ph name="END_LINK" /> ieslēdziet atļaujas pārlūkam Chrome.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> saglabātu datu</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Vai vēlaties, lai <ph name="PASSWORD_MANAGER_BRAND" /> atjauninātu jūsu paroli šai vietnei?</translation>
 <translation id="4881695831933465202">Atvērt</translation>
 <translation id="4885273946141277891">Neatbalstīts Chrome instanču skaits</translation>
+<translation id="4923459931733593730">Maksājums</translation>
 <translation id="4943872375798546930">Nav rezultātu</translation>
-<translation id="4970484396410298643">Tieši šeit piekļūstiet cilnēm, kas atvērtas datorā.
-
-Vienkārši atveriet pārlūku Chrome savā datorā, atveriet izvēlni un atlasiet “Pierakstīties pakalpojumā Chrome…”</translation>
 <translation id="497421865427891073">Doties uz priekšu</translation>
 <translation id="4996978546172906250">Kopīgošanas veids:</translation>
 <translation id="5000922062037820727">Bloķēta (ieteicams)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Atvērt pārlūkā Chrome</translation>
 <translation id="5199929503336119739">Darba profils</translation>
 <translation id="5210365745912300556">Aizvērt cilni</translation>
-<translation id="5210714456814679336">Šeit būs redzamas cilnes, kuras esat atvēris pārlūkā Chrome citās ierīcēs.</translation>
 <translation id="5222676887888702881">Izrakstīties</translation>
-<translation id="5228579091201413441">Iespējot sinhronizāciju</translation>
 <translation id="5233638681132016545">Jauna cilne</translation>
 <translation id="5271967389191913893">Ierīcē nevar atvērt lejupielādējamo saturu.</translation>
 <translation id="5275558766013849309">Cilnes tiks rādītas kopā ar pēdējām izmantotajām lietotnēm.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Bloķēts</translation>
 <translation id="5684874026226664614">Hmm... Šo lapu nevarēja iztulkot.</translation>
 <translation id="5708031556037168012">Esošie dati tiks glabāti jūsu ierīcē, kā arī dati tiks pastāvīgi importēti kontā <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Nosūtot Google serveriem informāciju par failiem, lietojumprogrammām un pakalpojumiem, kuri darbojas brīdī, kad notiek avārija, palīdziet mums noteikt to funkciju un uzlabojumu prioritāti, pie kā mums ir jāstrādā.
-
-Lietojuma statistikas datos tiek ietverta tāda informācija kā preferences, klikšķi uz pogām un atmiņas lietojums. Datos netiek ietverti tīmekļa lapu URL un nekāda veida personas informācija. Avāriju pārskatos tiek ietverta avārijas brīdī pieejamā informācija par sistēmu, kā arī var tikt ietverti tīmekļa lapu URL vai personas informācija atkarībā no tā, kas avārijas brīdī ir noticis.</translation>
 <translation id="5719837394786370183">Lapas, ko skatāt inkognito cilnēs, nebūs redzamas pārlūka vēsturē, sīkfailu krātuvē vai meklēšanas vēsturē, kad aizvērsiet visas inkognito cilnes. Tomēr visi lejupielādētie faili un izveidotās grāmatzīmes tiks saglabātas.
 
 Ņemiet vērā, ka inkognito režīmā jūs neesat neredzams. Jūsu pārlūkošanas darbības inkognito režīmā netiek slēptas no jūsu darba devēja, interneta pakalpojumu sniedzēja vai apmeklētajām vietnēm.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Atsvaidzināt</translation>
 <translation id="7191430249889272776">Cilne tika atvērta fonā.</translation>
 <translation id="7208788139759694678">Datu lietojuma samazinātājs ir atspējots.</translation>
+<translation id="7220786058474068424">Notiek apstrāde</translation>
 <translation id="7243308994586599757">Opcijas, kas pieejamas ekrāna apakšējā daļā</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> izmanto jūsu atrašanās vietas informāciju, lai rādītu vietējās meklēšanas rezultātus</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Palīdzība<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Atcelt atlasi</translation>
 <translation id="7851858861565204677">Citas ierīces</translation>
 <translation id="7876243839304621966">Noņemt visu</translation>
+<translation id="7902333740914687335">Maksājums apstrādāts</translation>
 <translation id="7947953824732555851">Pieņemt un pierakst.</translation>
 <translation id="7949961459945740081">Saņemiet jaunākās funkcijas</translation>
 <translation id="7963646190083259054">Nodrošina:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Saturs</translation>
 <translation id="8173098127580644436">paša sākuma</translation>
 <translation id="8200772114523450471">Kopsavilkums</translation>
+<translation id="8202097416529803614">Pasūtījuma kopsavilkums</translation>
 <translation id="8209050860603202033">Atvērt attēlu</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> vēlas izveidot savienojumu ar:</translation>
 <translation id="8218346974737627104">Pierakstīšanās apstiprinājums</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Atvērt citā logā</translation>
 <translation id="8959122750345127698">Navigācija nav sasniedzama: <ph name="URL" /></translation>
 <translation id="8979340629087822094">iepriekšējās dienas</translation>
+<translation id="8981454092730389528">Google aktivitātes vadīklas</translation>
+<translation id="8986494364107987395">Automātiski sūtīt lietošanas statistiku un avāriju pārskatus uzņēmumam Google</translation>
 <translation id="8987061207681586800">Pielāgojiet Chrome sev</translation>
 <translation id="9019902583201351841">Pārvalda jūsu vecāki</translation>
 <translation id="9020607083536754075">Aizvērt pašreizējo cilni un atgriezties iepriekšējā cilnē</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
index 716a742..071be34 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Vertaald naar het <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Synchroniseer je bladwijzers</translation>
 <translation id="17513872634828108">Geopende tabbladen</translation>
+<translation id="1756600373018374892">Tik op deze knop om snel toegang tot je tabbladen te krijgen.</translation>
 <translation id="1807246157184219062">Licht</translation>
 <translation id="1825719650605518411">Ervaring bij eerste uitvoering</translation>
 <translation id="1829244130665387512">Vinden op pagina</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Schakel het recht in voor Chrome via de <ph name="BEGIN_LINK" />Android-instellingen<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Wachtwoorden opslaan</translation>
 <translation id="1944384637046898011">Alles versleutelen met Google-wachtwoord vanaf <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Beheer hoe Google je browsegeschiedenis gebruikt om Google Zoeken en andere Google-services te personaliseren.</translation>
 <translation id="1959930595721737608">JavaScript toestaan op de volgende site.</translation>
 <translation id="1966710179511230534">Update je inloggegevens.</translation>
 <translation id="1974060860693918893">Geavanceerd</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, webapp. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Verfijnen</translation>
 <translation id="2315043854645842844">Certificaatselectie aan clientzijde wordt niet ondersteund door het besturingssysteem.</translation>
-<translation id="2316129865977710310">Nee, bedankt</translation>
 <translation id="2321958826496381788">Sleep de schuifknop tot je deze tekst prettig kunt lezen. De tekst moet minimaal deze grootte hebben nadat je op een alinea hebt dubbelgetikt.</translation>
-<translation id="2329597144923131178">Log in om je bladwijzers, geschiedenis, wachtwoorden en andere instellingen op al je apparaten te gebruiken.</translation>
 <translation id="2343328333327081434">Installeren…</translation>
 <translation id="2351097562818989364">Je vertaalinstellingen zijn opnieuw ingesteld.</translation>
 <translation id="2359808026110333948">Doorgaan</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Bovenliggende map</translation>
 <translation id="2870560284913253234">Site</translation>
 <translation id="2888126860611144412">Over Chrome</translation>
+<translation id="2889768325388591707">Snel schakelen tussen tabbladen</translation>
 <translation id="2891154217021530873">Stoppen met het laden van de pagina</translation>
 <translation id="2902702728133930130">Kan Chrome niet starten door een onverwachte fout.</translation>
 <translation id="2903493209154104877">Adressen</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Openen op incognitotabblad</translation>
 <translation id="3090193911106258841">Audio- en video-invoer openen</translation>
 <translation id="3137521801621304719">Incognitomodus verlaten</translation>
+<translation id="3149891296864842641">Verzendoptie</translation>
+<translation id="3162882791484435636">Verzendoptie selecteren</translation>
+<translation id="3173438333156928404">Fout bij verwerken van betaling</translation>
 <translation id="3177909033752230686">Brontaal:</translation>
 <translation id="3190152372525844641">Schakel rechten in voor Chrome via de <ph name="BEGIN_LINK" />Android-instellingen<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> opgeslagen gegevens</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Wil je dat <ph name="PASSWORD_MANAGER_BRAND" /> je wachtwoord voor deze site updatet?</translation>
 <translation id="4881695831933465202">Openen</translation>
 <translation id="4885273946141277891">Niet-ondersteund aantal Chrome-instanties.</translation>
+<translation id="4923459931733593730">Betaling</translation>
 <translation id="4943872375798546930">Geen resultaten</translation>
-<translation id="4970484396410298643">Bekijk hier de tabbladen die je op je computer hebt geopend.
-
-Open Chrome op je computer, ga naar het menu en selecteer 'Inloggen bij Chrome'.</translation>
 <translation id="497421865427891073">Naar voren gaan</translation>
 <translation id="4996978546172906250">Delen via</translation>
 <translation id="5000922062037820727">Geblokkeerd (aanbevolen)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Openen in Chrome</translation>
 <translation id="5199929503336119739">Werkprofiel</translation>
 <translation id="5210365745912300556">Tabblad sluiten</translation>
-<translation id="5210714456814679336">Tabbladen die je op andere apparaten in Chrome hebt geopend, worden hier weergegeven.</translation>
 <translation id="5222676887888702881">Uitloggen</translation>
-<translation id="5228579091201413441">Synchronisatie inschakelen</translation>
 <translation id="5233638681132016545">Nieuw tabblad</translation>
 <translation id="5271967389191913893">Het apparaat kan de inhoud niet openen die moet worden gedownload.</translation>
 <translation id="5275558766013849309">Tabbladen worden samen bewaard met recent gebruikte apps.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Geblokkeerd</translation>
 <translation id="5684874026226664614">Deze pagina kan niet worden vertaald.</translation>
 <translation id="5708031556037168012">Bestaande gegevens op je apparaat behouden en de gegevens permanent importeren in <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Help ons prioriteit aan te geven aan de functies en verbeteringen waaraan we moeten werken door Google informatie te sturen over de bestanden, apps en services die worden uitgevoerd op het moment dat er een crash plaatsvindt.
-
-Gebruiksstatistieken omvatten informatie zoals voorkeuren, klikken op knoppen en geheugengebruik. Ze bevatten geen URL's van webpagina's of persoonlijke gegevens. Crashrapporten bevatten systeeminformatie ten tijde van de crash en kunnen URL's van webpagina's of persoonlijke gegevens bevatten, afhankelijk van wat er gebeurde op het moment van de crash.</translation>
 <translation id="5719837394786370183">Pagina's die je bekijkt op incognitotabbladen, blijven niet in de geschiedenis, cookie-opslag of zoekgeschiedenis van je browser staan nadat je alle incognitotabbladen hebt gesloten. Bestanden die je downloadt of bladwijzers die je instelt, blijven behouden.
 
 Je bent echter niet onzichtbaar. Als je incognito bent, wordt je browsegeschiedenis niet verborgen voor je werkgever, je internetprovider of de websites die je bezoekt.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Vernieuwen</translation>
 <translation id="7191430249889272776">Tabblad op de achtergrond geopend.</translation>
 <translation id="7208788139759694678">Databesparing uitgeschakeld</translation>
+<translation id="7220786058474068424">Verwerken</translation>
 <translation id="7243308994586599757">Opties beschikbaar onder aan het scherm</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> gebruikt je locatie om lokale zoekresultaten weer te geven</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Help<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Selectie opheffen</translation>
 <translation id="7851858861565204677">Andere apparaten</translation>
 <translation id="7876243839304621966">Alles verwijderen</translation>
+<translation id="7902333740914687335">Betaling verwerkt</translation>
 <translation id="7947953824732555851">Accepteren en inloggen</translation>
 <translation id="7949961459945740081">Ontvang de nieuwste functies</translation>
 <translation id="7963646190083259054">Leverancier:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Inhoud</translation>
 <translation id="8173098127580644436">het eerste gebruik</translation>
 <translation id="8200772114523450471">Hervatten</translation>
+<translation id="8202097416529803614">Besteloverzicht</translation>
 <translation id="8209050860603202033">Afbeelding openen</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> wil verbinden met:</translation>
 <translation id="8218346974737627104">Inloggen bevestigen</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Openen in een ander venster</translation>
 <translation id="8959122750345127698">Navigatie is onbereikbaar: <ph name="URL" /></translation>
 <translation id="8979340629087822094">de afgelopen dag</translation>
+<translation id="8981454092730389528">Google-activiteitsopties</translation>
+<translation id="8986494364107987395">Automatisch gebruiksstatistieken en crashrapporten naar Google verzenden</translation>
 <translation id="8987061207681586800">Personaliseer Chrome voor jou</translation>
 <translation id="9019902583201351841">Beheerd door je ouders</translation>
 <translation id="9020607083536754075">Het huidige tabblad sluiten en teruggaan naar de vorige app</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
index 0050553..ed6ecd9 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Oversatt til <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Synkroniser bokmerkene dine</translation>
 <translation id="17513872634828108">Åpne faner</translation>
+<translation id="1756600373018374892">Trykk på denne knappen for å få rask tilgang til fanene dine.</translation>
 <translation id="1807246157184219062">Lys</translation>
 <translation id="1825719650605518411">Førsteinntrykk</translation>
 <translation id="1829244130665387512">Finn på side</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Slå på tillatelsen for Chrome i <ph name="BEGIN_LINK" />Android-innstillingene<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Lagring av passord</translation>
 <translation id="1944384637046898011">Kryptér alt med Google-passord fra og med <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Kontrollér hvordan Google bruker nettlesingsloggen din for å gi Søk og andre Google-tjenester et personlig preg.</translation>
 <translation id="1959930595721737608">Tillat JavaScript på følgende nettsted.</translation>
 <translation id="1966710179511230534">Oppdater påloggingsinformasjonen din.</translation>
 <translation id="1974060860693918893">Avansert</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, nettprogram. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Finstem</translation>
 <translation id="2315043854645842844">Operativsystemet har ikke støtte for sertifikatvalg på klientsiden.</translation>
-<translation id="2316129865977710310">Nei takk</translation>
 <translation id="2321958826496381788">Dra glidebryteren til du kan lese dette uten problemer. Når du har dobbelttrykket på et avsnitt, bør teksten være minst like stor som dette.</translation>
-<translation id="2329597144923131178">Logg på for å få bokmerkene, loggen, passordene og de andre innstillingene dine på alle enhetene du bruker.</translation>
 <translation id="2343328333327081434">Installerer …</translation>
 <translation id="2351097562818989364">Oversettelsesinnstillingene dine er tilbakestilt.</translation>
 <translation id="2359808026110333948">Fortsett</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Overordnet mappe</translation>
 <translation id="2870560284913253234">Nettsted</translation>
 <translation id="2888126860611144412">Om Chrome</translation>
+<translation id="2889768325388591707">Bytt faner raskt</translation>
 <translation id="2891154217021530873">Stopp innlastingen av siden</translation>
 <translation id="2902702728133930130">Kunne ikke starte Chrome på grunn av en uventet feil.</translation>
 <translation id="2903493209154104877">Adresser</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Åpne i inkognitofane</translation>
 <translation id="3090193911106258841">Åpner lyd- og videoinngang</translation>
 <translation id="3137521801621304719">Avslutt inkognitomodus</translation>
+<translation id="3149891296864842641">Fraktalternativ</translation>
+<translation id="3162882791484435636">Velg fraktalternativ</translation>
+<translation id="3173438333156928404">Feil under behandlingen av betalingen</translation>
 <translation id="3177909033752230686">Språket siden er på:</translation>
 <translation id="3190152372525844641">Slå på tillatelsene for Chrome i <ph name="BEGIN_LINK" />Android-innstillingene<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> lagrede data</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Vil du at <ph name="PASSWORD_MANAGER_BRAND" /> skal oppdatere passordet for dette nettstedet?</translation>
 <translation id="4881695831933465202">Åpne</translation>
 <translation id="4885273946141277891">For mange Chrome-forekomster.</translation>
+<translation id="4923459931733593730">Betaling</translation>
 <translation id="4943872375798546930">Ingen resultater</translation>
-<translation id="4970484396410298643">Du kan bruke fanene du har åpne på datamaskinen, direkte herfra.
-
-Bare åpne Chrome på datamaskinen, gå til menyen, og velg «Logg på Chrome».</translation>
 <translation id="497421865427891073">Gå til neste</translation>
 <translation id="4996978546172906250">Del via</translation>
 <translation id="5000922062037820727">Blokkert (anbefales)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Åpne i Chrome</translation>
 <translation id="5199929503336119739">Jobbprofil</translation>
 <translation id="5210365745912300556">Lukk fanen</translation>
-<translation id="5210714456814679336">Faner du har åpnet i Chrome på de andre enhetene dine, vises her.</translation>
 <translation id="5222676887888702881">Logg av</translation>
-<translation id="5228579091201413441">Slå på synkronisering</translation>
 <translation id="5233638681132016545">Ny fane</translation>
 <translation id="5271967389191913893">Enheten kan ikke åpne innholdet som skal lastes ned.</translation>
 <translation id="5275558766013849309">Nylig brukte faner og apper vises sammen.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Blokkert</translation>
 <translation id="5684874026226664614">Beklager. Denne siden kunne ikke oversettes.</translation>
 <translation id="5708031556037168012">Behold de eksisterende dataene på enheten din, og importér dataene permanent til <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Hjelp oss med å prioritere funksjonene og forbedringene vi skal jobbe på, ved å sende Google informasjon om filene, appene og tjenestene som kjører når du opplever et krasj.
-
-Bruksstatistikken inneholder informasjon om for eksempel innstillinger, knappeklikk og minnebruk. Den inneholder ikke nettadresser eller personopplysninger. Programstopprapporter inneholder systeminformasjon fra krasjtidspunktet, og de kan inneholde nettadresser eller personopplysninger, avhengig av hva som skjedde på krasjtidspunktet.</translation>
 <translation id="5719837394786370183">Når du åpner sider i inkognitofaner, lagres de ikke i nettleser- eller søkeloggen, og eventuelle informasjonskapsler slettes. Filer du laster ned og bokmerker du oppretter, beholdes.
 
 Du er imidlertid ikke usynlig. Inkognito-modusen skjuler ikke surfingen din for arbeidsgiveren, nettleverandøren eller nettstedene du besøker.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Last inn på nytt</translation>
 <translation id="7191430249889272776">En fane ble åpnet i bakgrunnen.</translation>
 <translation id="7208788139759694678">Datasparing er slått av</translation>
+<translation id="7220786058474068424">Behandler</translation>
 <translation id="7243308994586599757">Du finner alternativer ved bunnen av skjermen</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> bruker posisjonen din for å vise lokale søkeresultater</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Hjelp<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Opphev valget</translation>
 <translation id="7851858861565204677">Andre enheter</translation>
 <translation id="7876243839304621966">Fjern alle</translation>
+<translation id="7902333740914687335">Betalingen er behandlet</translation>
 <translation id="7947953824732555851">Godta og logg på</translation>
 <translation id="7949961459945740081">Få de nyeste funksjonene</translation>
 <translation id="7963646190083259054">Leverandør:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Innhold</translation>
 <translation id="8173098127580644436">tidenes morgen</translation>
 <translation id="8200772114523450471">Fortsett</translation>
+<translation id="8202097416529803614">Bestillingssammendrag</translation>
 <translation id="8209050860603202033">Åpne bildet</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> vil koble til:</translation>
 <translation id="8218346974737627104">Bekreft påloggingen</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Åpne i et annet vindu</translation>
 <translation id="8959122750345127698">Nettadressen er utilgjengelig: <ph name="URL" /></translation>
 <translation id="8979340629087822094">det siste døgnet</translation>
+<translation id="8981454092730389528">Google Aktivitetslagring</translation>
+<translation id="8986494364107987395">Send bruksstatistikk og programstopprapporter automatisk til Google</translation>
 <translation id="8987061207681586800">Tilpass Chrome</translation>
 <translation id="9019902583201351841">Administrert av foreldrene dine</translation>
 <translation id="9020607083536754075">Lukk den aktive fanen og gå tilbake til den forrige appen</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
index 5f6a4887..fc13276 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Przetłumaczone na <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Synchronizuj swoje zakładki</translation>
 <translation id="17513872634828108">Otwarte karty</translation>
+<translation id="1756600373018374892">Kliknij ten przycisk, by uzyskać szybki dostęp do swoich kart.</translation>
 <translation id="1807246157184219062">Jasny</translation>
 <translation id="1825719650605518411">Działanie po pierwszym uruchomieniu</translation>
 <translation id="1829244130665387512">Znajdź na stronie</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Przyznaj Chrome uprawnienie w <ph name="BEGIN_LINK" />ustawieniach Androida<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Zapisuj hasła</translation>
 <translation id="1944384637046898011">Zaszyfruj wszystko za pomocą hasła do Google z <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Określ, jak Google może korzystać z Twojej historii przeglądania, by dostosowywać wyniki wyszukiwania i działanie innych usług.</translation>
 <translation id="1959930595721737608">Zezwalaj na działanie JavaScriptu na tej stronie.</translation>
 <translation id="1966710179511230534">Zaktualizuj swoje dane logowania.</translation>
 <translation id="1974060860693918893">Zaawansowane</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" /> – aplikacja internetowa. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Zawęź</translation>
 <translation id="2315043854645842844">Wybieranie certyfikatu klienta nie jest obsługiwane przez ten system operacyjny.</translation>
-<translation id="2316129865977710310">Nie, dziękuję</translation>
 <translation id="2321958826496381788">Przeciągaj suwak, by umożliwić wygodne czytanie. Gdy dwukrotnie klikniesz akapit, tekst powiększy się co najmniej do tej wielkości.</translation>
-<translation id="2329597144923131178">Zaloguj się, by korzystać z zakładek, historii, haseł i innych ustawień na wszystkich swoich urządzeniach.</translation>
 <translation id="2343328333327081434">Instaluję…</translation>
 <translation id="2351097562818989364">Ustawienia tłumaczenia zostały zresetowane.</translation>
 <translation id="2359808026110333948">Kontynuuj</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Folder nadrzędny</translation>
 <translation id="2870560284913253234">Witryna</translation>
 <translation id="2888126860611144412">Chrome – informacje</translation>
+<translation id="2889768325388591707">Szybkie przełączanie się między kartami</translation>
 <translation id="2891154217021530873">Zatrzymaj wczytywanie strony</translation>
 <translation id="2902702728133930130">Podczas uruchamiania Chrome wystąpił nieoczekiwany błąd.</translation>
 <translation id="2903493209154104877">Adresy</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Otwórz w karcie incognito</translation>
 <translation id="3090193911106258841">Otwieram wejście audio i wideo</translation>
 <translation id="3137521801621304719">Wyłącz tryb incognito</translation>
+<translation id="3149891296864842641">Sposób dostawy</translation>
+<translation id="3162882791484435636">Wybierz sposób dostawy</translation>
+<translation id="3173438333156928404">Błąd przetwarzania płatności</translation>
 <translation id="3177909033752230686">Język strony:</translation>
 <translation id="3190152372525844641">Przyznaj Chrome uprawnienia w <ph name="BEGIN_LINK" />ustawieniach Androida<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> zapisanych danych</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Czy <ph name="PASSWORD_MANAGER_BRAND" /> ma zaktualizować hasło do tej strony?</translation>
 <translation id="4881695831933465202">Otwórz</translation>
 <translation id="4885273946141277891">Nieobsługiwana liczba wystąpień Chrome.</translation>
+<translation id="4923459931733593730">Płatność</translation>
 <translation id="4943872375798546930">Brak wyników</translation>
-<translation id="4970484396410298643">Tutaj możesz korzystać z kart otwartych na komputerze.
-
-Wystarczy uruchomić Chrome na komputerze i w menu wybrać „Zaloguj się w Chrome…”</translation>
 <translation id="497421865427891073">Dalej</translation>
 <translation id="4996978546172906250">Udostępnij przez</translation>
 <translation id="5000922062037820727">Zablokowane (zalecane)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Otwórz w Chrome</translation>
 <translation id="5199929503336119739">Profil do pracy</translation>
 <translation id="5210365745912300556">Zamknij kartę</translation>
-<translation id="5210714456814679336">Tutaj wyświetlą się karty otwarte w Chrome na innych urządzeniach.</translation>
 <translation id="5222676887888702881">Wyloguj się</translation>
-<translation id="5228579091201413441">Włącz synchronizację</translation>
 <translation id="5233638681132016545">Nowa karta</translation>
 <translation id="5271967389191913893">Na tym urządzeniu nie można otworzyć treści, które chcesz pobrać.</translation>
 <translation id="5275558766013849309">Karty będą uruchomione razem z ostatnimi aplikacjami.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Zablokowane</translation>
 <translation id="5684874026226664614">Nie można przetłumaczyć tej strony.</translation>
 <translation id="5708031556037168012">Zachowaj istniejące dane na urządzeniu i stale importuj dane na konto <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Pomóż nam określić najważniejsze funkcje i ulepszenia, nad którymi powinniśmy pracować, wysyłając do Google przy każdej awarii informacje o plikach, aplikacjach oraz uruchomionych usługach.
-
-Statystyki użytkowania obejmują np. dane o ustawieniach, kliknięciach przycisków i wykorzystaniu pamięci. Nie zawierają one adresów URL stron internetowych ani żadnych danych osobowych. Raporty o awariach zawierają informacje systemowe z chwili awarii i mogą obejmować adresy URL stron internetowych lub dane osobowe w zależności od okoliczności awarii.</translation>
 <translation id="5719837394786370183">Po zamknięciu wszystkich kart incognito wyświetlane na nich strony nie pozostawią żadnych śladów w historii przeglądarki, magazynie plików cookie ani historii wyszukiwania. Pobrane pliki i utworzone zakładki zostaną zachowane.
 
 To jednak nie oznacza, że Cię nie widać. Nawet gdy przejdziesz w tryb incognito, Twój pracodawca, dostawca usług internetowych czy webmasterzy otwieranych stron mogą dowiedzieć się, co przeglądasz.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Odśwież</translation>
 <translation id="7191430249889272776">Karta otwarta w tle.</translation>
 <translation id="7208788139759694678">Oszczędzanie danych wyłączone</translation>
+<translation id="7220786058474068424">Przetwarzanie</translation>
 <translation id="7243308994586599757">Opcje dostępne u dołu ekranu</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> korzysta z danych o Twojej lokalizacji, by pokazywać lokalne wyniki wyszukiwania</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Pomoc<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Anuluj wybór</translation>
 <translation id="7851858861565204677">Inne urządzenia</translation>
 <translation id="7876243839304621966">Usuń wszystkie</translation>
+<translation id="7902333740914687335">Płatność została przetworzona</translation>
 <translation id="7947953824732555851">Zaakceptuj i zaloguj się</translation>
 <translation id="7949961459945740081">Używaj najnowszych funkcji</translation>
 <translation id="7963646190083259054">Dostawca:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Treści</translation>
 <translation id="8173098127580644436">od początku</translation>
 <translation id="8200772114523450471">Wznów</translation>
+<translation id="8202097416529803614">Podsumowanie zamówienia</translation>
 <translation id="8209050860603202033">Otwórz grafikę</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> chce się połączyć z:</translation>
 <translation id="8218346974737627104">Potwierdź, że chcesz się zalogować</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Otwórz w innym oknie</translation>
 <translation id="8959122750345127698">Adres nieosiągalny: <ph name="URL" /></translation>
 <translation id="8979340629087822094">z ostatniego dnia</translation>
+<translation id="8981454092730389528">Zarządzanie aktywnością Google</translation>
+<translation id="8986494364107987395">Automatycznie przesyłaj statystyki użytkowania i raporty o awariach do Google</translation>
 <translation id="8987061207681586800">Dostosuj Chrome</translation>
 <translation id="9019902583201351841">Zarządzany przez Twoich rodziców</translation>
 <translation id="9020607083536754075">Zamknij aktualną kartę i wróć do poprzedniej aplikacji</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
index 346d671..408b5d7 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -95,9 +95,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, aplicativo da Web. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Refinar</translation>
 <translation id="2315043854645842844">A seleção de certificado do cliente não é compatível com o sistema operacional.</translation>
-<translation id="2316129865977710310">Não.</translation>
 <translation id="2321958826496381788">Arraste o controle deslizante até que você possa ler confortavelmente. O texto deve ter pelo menos este tamanho após um toque duplo em um parágrafo.</translation>
-<translation id="2329597144923131178">Faça login para que favoritos, histórico, senhas e outras configurações fiquem disponíveis em todos os seus dispositivos.</translation>
 <translation id="2343328333327081434">Instalando...</translation>
 <translation id="2351097562818989364">As configurações de tradução foram redefinidas.</translation>
 <translation id="2359808026110333948">Continuar</translation>
@@ -270,9 +268,6 @@
 <translation id="4881695831933465202">Abrir</translation>
 <translation id="4885273946141277891">Número de instâncias do Google Chrome não suportado.</translation>
 <translation id="4943872375798546930">Nenhum resultado</translation>
-<translation id="4970484396410298643">Acesse as guias que você abriu no seu computador, bem aqui.
-
-Basta abrir o Chrome no computador, ir até o menu e selecionar “Fazer login no Google Chrome…”</translation>
 <translation id="497421865427891073">Avançar</translation>
 <translation id="4996978546172906250">Compartilhar via</translation>
 <translation id="5000922062037820727">Bloqueada (recomendado)</translation>
@@ -296,9 +291,7 @@
 <translation id="5184329579814168207">Abrir no Google Chrome</translation>
 <translation id="5199929503336119739">Perfil de trabalho</translation>
 <translation id="5210365745912300556">Fechar guia</translation>
-<translation id="5210714456814679336">As guias que você abriu no Google Chrome nos seus outros dispositivos aparecerão aqui.</translation>
 <translation id="5222676887888702881">Sair</translation>
-<translation id="5228579091201413441">Ativar sincronização</translation>
 <translation id="5233638681132016545">Nova guia</translation>
 <translation id="5271967389191913893">Não é possível abrir no dispositivo o conteúdo a ser transferido por download.</translation>
 <translation id="5275558766013849309">As guias serão mantidas com os aplicativos recentes.</translation>
@@ -342,9 +335,6 @@
 <translation id="5677928146339483299">Bloqueados</translation>
 <translation id="5684874026226664614">Não foi possível traduzir esta página.</translation>
 <translation id="5708031556037168012">Mantém os dados já existentes no seu dispositivo e os importa permanentemente para <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Ajude-nos a priorizar os recursos e aprimoramentos nos quais deveríamos trabalhar, enviando informações ao Google sobre os arquivos, aplicativos e serviços que estão sendo executados quando ocorre uma falha.
-
-        As estatísticas de uso incluem informações como preferências, cliques em botões e uso da memória. Elas não incluem URLs de páginas da Web ou qualquer informação pessoal. Relatórios de erros contêm informações do sistema do momento da falha e podem conter URLs de páginas da Web ou informações pessoais, dependendo de o que estava acontecendo no momento da falha.</translation>
 <translation id="5719837394786370183">As páginas que você visualiza nas guias anônimas não permanecem no histórico do navegador, no armazenamento de cookies nem no histórico de pesquisa depois que você fecha todas as guias anônimas. Os arquivos que você transfere por download ou os favoritos que cria são mantidos.
          No entanto, você não fica invisível. O modo anônimo não oculta sua navegação do seu empregador, do seu provedor de acesso à Internet ou dos websites que você visita.</translation>
 <translation id="572328651809341494">Guias recentes</translation>
@@ -593,6 +583,7 @@
 <translation id="8942627711005830162">Abrir em outra janela</translation>
 <translation id="8959122750345127698">A Navegação GPS está inacessível: <ph name="URL" /></translation>
 <translation id="8979340629087822094">do dia anterior</translation>
+<translation id="8986494364107987395">Enviar automaticamente estatísticas de uso e relatórios de erros ao Google</translation>
 <translation id="8987061207681586800">O Chrome é seu</translation>
 <translation id="9019902583201351841">Gerenciado pelos seus pais</translation>
 <translation id="9020607083536754075">Fechar a guia atual e retornar para o app anterior</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
index 1468345..7dce76e8 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Traduzido para <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Sincronizar os marcadores</translation>
 <translation id="17513872634828108">Separadores abertos</translation>
+<translation id="1756600373018374892">Toque neste botão para aceder rapidamente aos seus separadores.</translation>
 <translation id="1807246157184219062">Claro</translation>
 <translation id="1825719650605518411">Experiência de primeira execução</translation>
 <translation id="1829244130665387512">Localizar na página</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Ative a autorização para o Chrome nas <ph name="BEGIN_LINK" />Definições do Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Guardar palavras-passe</translation>
 <translation id="1944384637046898011">Encriptar tudo com uma palavra-passe do Google a partir de <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Controle a forma como a Google utiliza o seu histórico de navegação para personalizar a Pesquisa Google e outros serviços Google.</translation>
 <translation id="1959930595721737608">Permitir JavaScript no seguinte site.</translation>
 <translation id="1966710179511230534">Atualize os detalhes de início de sessão.</translation>
 <translation id="1974060860693918893">Avançadas</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, aplicação Web. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Refinar</translation>
 <translation id="2315043854645842844">O sistema operativo não suporta a seleção do certificado do lado do cliente.</translation>
-<translation id="2316129865977710310">Não, obrigado</translation>
 <translation id="2321958826496381788">Arraste o controlo de deslize até conseguir ler confortavelmente. O texto deve ter, pelo menos, este tamanho depois de tocar duas vezes num parágrafo.</translation>
-<translation id="2329597144923131178">Inicie sessão para aceder aos marcadores, ao histórico, às palavras-passe e a outras definições em todos os dispositivos.</translation>
 <translation id="2343328333327081434">A instalar...</translation>
 <translation id="2351097562818989364">As definições de tradução foram repostas.</translation>
 <translation id="2359808026110333948">Continuar</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Pasta superior</translation>
 <translation id="2870560284913253234">Site</translation>
 <translation id="2888126860611144412">Acerca do Chrome</translation>
+<translation id="2889768325388591707">Alternar rapidamente entre separadores</translation>
 <translation id="2891154217021530873">Parar carregamento da página</translation>
 <translation id="2902702728133930130">O Chrome falhou durante o arranque com um erro inesperado.</translation>
 <translation id="2903493209154104877">Endereços</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Abrir no separador anónimo</translation>
 <translation id="3090193911106258841">A aceder à entrada de áudio e de vídeo</translation>
 <translation id="3137521801621304719">Sair do modo de navegação anónima</translation>
+<translation id="3149891296864842641">Opção de envio</translation>
+<translation id="3162882791484435636">Selecionar opção de envio</translation>
+<translation id="3173438333156928404">Erro ao processar o pagamento</translation>
 <translation id="3177909033752230686">Idioma da página:</translation>
 <translation id="3190152372525844641">Ative as autorizações para o Chrome nas <ph name="BEGIN_LINK" />Definições do Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> de dados armazenados</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Pretende que o <ph name="PASSWORD_MANAGER_BRAND" /> atualize a sua palavra-passe para este site?</translation>
 <translation id="4881695831933465202">Abrir</translation>
 <translation id="4885273946141277891">Número não suportado de instâncias do Chrome.</translation>
+<translation id="4923459931733593730">Pagamento</translation>
 <translation id="4943872375798546930">Nenhum resultado</translation>
-<translation id="4970484396410298643">Aceda aqui aos separadores abertos no computador.
-
-Basta abrir o Chrome no computador, aceder ao menu e selecionar "Iniciar sessão no Chrome..."</translation>
 <translation id="497421865427891073">Avançar</translation>
 <translation id="4996978546172906250">Partilhar através de</translation>
 <translation id="5000922062037820727">Bloqueado (recomendado)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Abrir no Chrome</translation>
 <translation id="5199929503336119739">Perfil de trabalho</translation>
 <translation id="5210365745912300556">Fechar separador</translation>
-<translation id="5210714456814679336">Os separadores que abriu no Chrome noutros dispositivos aparecem aqui.</translation>
 <translation id="5222676887888702881">Terminar sessão</translation>
-<translation id="5228579091201413441">Ativar a sincronização</translation>
 <translation id="5233638681132016545">Novo separador</translation>
 <translation id="5271967389191913893">O dispositivo não consegue abrir o conteúdo a transferir.</translation>
 <translation id="5275558766013849309">Os separadores são apresentados em conjunto com as aplicações recentes.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Bloqueado</translation>
 <translation id="5684874026226664614">Ups! Não foi possível traduzir esta página.</translation>
 <translation id="5708031556037168012">Manter os dados existentes no dispositivo e importar permanentemente os dados para <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Ajude-nos a dar prioridade às funcionalidades e às melhorias nas quais devemos trabalhar ao enviar à Google informações sobre os ficheiros, as aplicações e os serviços em execução sempre que ocorrer uma falha.
-
-As estatísticas de utilização incluem informações como preferências, cliques em botões e utilização da memória. Estas não incluem URLs de páginas Web nem quaisquer informações pessoais. Os relatórios de falhas contêm informações do sistema no momento em que as falhas ocorreram e podem conter URLs de páginas Web ou informações pessoais, consoante as operações em curso no momento da falha.</translation>
 <translation id="5719837394786370183">As páginas que visualizar em separadores de navegação anónima não serão guardadas no histórico do navegador, no armazenamento de cookies ou no histórico de pesquisas depois de fechar todos os separadores de navegação anónima. Os ficheiros que transferir ou os marcadores que criar manter-se-ão.
 
 No entanto, a navegação não é invisível. Passar para o modo de navegação anónima não oculta a navegação do empregador ou do prestador de serviços de Internet, nem os Websites que visitar.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Atualizar</translation>
 <translation id="7191430249889272776">Separador aberto em segundo plano.</translation>
 <translation id="7208788139759694678">Poupança de dados desativada</translation>
+<translation id="7220786058474068424">A processar</translation>
 <translation id="7243308994586599757">Opções disponíveis junto à parte inferior do ecrã</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> utiliza a sua localização para mostrar resultados da pesquisa locais</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Ajuda<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Cancelar seleção</translation>
 <translation id="7851858861565204677">Outros aparelhos</translation>
 <translation id="7876243839304621966">Remover tudo</translation>
+<translation id="7902333740914687335">Pagamento processado</translation>
 <translation id="7947953824732555851">Aceitar e in. sessão</translation>
 <translation id="7949961459945740081">Obter funcionalidades recentes</translation>
 <translation id="7963646190083259054">Fornecedor:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Conteúdo</translation>
 <translation id="8173098127580644436">desde sempre</translation>
 <translation id="8200772114523450471">Continuar</translation>
+<translation id="8202097416529803614">Resumo da encomenda</translation>
 <translation id="8209050860603202033">Abrir imagem</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> pretende estabelecer ligação a:</translation>
 <translation id="8218346974737627104">Confirmar início de sessão</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Abrir noutra janela</translation>
 <translation id="8959122750345127698">A navegação está inacessível: <ph name="URL" /></translation>
 <translation id="8979340629087822094">do dia anterior</translation>
+<translation id="8981454092730389528">Controlos da atividade Google</translation>
+<translation id="8986494364107987395">Enviar automaticamente estatísticas de utilização e relatórios de falhas para a Google</translation>
 <translation id="8987061207681586800">Personalizar o Chrome</translation>
 <translation id="9019902583201351841">Gerido pelos teus pais</translation>
 <translation id="9020607083536754075">Fechar o separador atual e regressar à aplicação anterior</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
index c9ad692..aeaa9f6 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Tradusă în <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Sincronizează marcajele</translation>
 <translation id="17513872634828108">File deschise</translation>
+<translation id="1756600373018374892">Atinge acest buton pentru a accesa rapid filele.</translation>
 <translation id="1807246157184219062">Luminos</translation>
 <translation id="1825719650605518411">Experiența primei rulări</translation>
 <translation id="1829244130665387512">Găsiți în pagină</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Activează permisiunea pentru Chrome din <ph name="BEGIN_LINK" />Setări Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Parole salvate</translation>
 <translation id="1944384637046898011">Criptează toate datele folosind parola Google din data de <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Controlează cum poate folosi Google istoricul de navigare pentru a personaliza Căutarea și alte servicii Google.</translation>
 <translation id="1959930595721737608">Permite JavaScript pe următorul site.</translation>
 <translation id="1966710179511230534">Actualizați detaliile de conectare.</translation>
 <translation id="1974060860693918893">Avansate</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, aplicație web. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Rafinează</translation>
 <translation id="2315043854645842844">Selectarea certificatelor pe partea de client nu este acceptată de sistemul de operare.</translation>
-<translation id="2316129865977710310">Nu, mulțumesc</translation>
 <translation id="2321958826496381788">Trage cursorul până poți citi textul cu ușurință. Textul trebuie să fie cel puțin la fel de mare ca acesta după o atingere dublă pe un paragraf.</translation>
-<translation id="2329597144923131178">Conectează-te și accesează marcajele, istoricul, parolele și alte setări pe toate dispozitivele.</translation>
 <translation id="2343328333327081434">Se instalează…</translation>
 <translation id="2351097562818989364">Setările de traducere au fost resetate.</translation>
 <translation id="2359808026110333948">Continuă</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Dosar părinte</translation>
 <translation id="2870560284913253234">Site</translation>
 <translation id="2888126860611144412">Despre Chrome</translation>
+<translation id="2889768325388591707">Comută rapid între file</translation>
 <translation id="2891154217021530873">Oprește încărcarea paginii</translation>
 <translation id="2902702728133930130">Chrome nu a pornit. A apărut o eroare neașteptată.</translation>
 <translation id="2903493209154104877">Adrese</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Deschideți într-o filă incognito</translation>
 <translation id="3090193911106258841">Se accesează intrările audio și video</translation>
 <translation id="3137521801621304719">Ieși din modul incognito</translation>
+<translation id="3149891296864842641">Opțiune de expediere</translation>
+<translation id="3162882791484435636">Selectează opțiunea de expediere</translation>
+<translation id="3173438333156928404">Eroare la procesarea plății</translation>
 <translation id="3177909033752230686">Limba paginii:</translation>
 <translation id="3190152372525844641">Activează permisiunile pentru Chrome din <ph name="BEGIN_LINK" />Setări Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905">Date stocate: <ph name="STORAGE_AMOUNT" /></translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Dorești ca <ph name="PASSWORD_MANAGER_BRAND" /> să îți actualizeze parola pentru acest site?</translation>
 <translation id="4881695831933465202">Deschide</translation>
 <translation id="4885273946141277891">Număr de instanțe Chrome neacceptat.</translation>
+<translation id="4923459931733593730">Plată</translation>
 <translation id="4943872375798546930">Nu există rezultate</translation>
-<translation id="4970484396410298643">Accesează chiar aici filele pe care le-ai deschis pe computer.
-
-Deschide Chrome pe computer, accesează meniul și selectează „Conectează-te la Chrome...”</translation>
 <translation id="497421865427891073">Înainte</translation>
 <translation id="4996978546172906250">Trimiteți prin</translation>
 <translation id="5000922062037820727">Blocată (recomandat)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Deschide în Chrome</translation>
 <translation id="5199929503336119739">Profilul de serviciu</translation>
 <translation id="5210365745912300556">Închide fila</translation>
-<translation id="5210714456814679336">Filele deschise în Chrome pe celelalte dispozitive vor apărea aici.</translation>
 <translation id="5222676887888702881">Deconectează-te</translation>
-<translation id="5228579091201413441">Activează sincronizarea</translation>
 <translation id="5233638681132016545">Filă nouă</translation>
 <translation id="5271967389191913893">Dispozitivul nu poate deschide conținutul de descărcat.</translation>
 <translation id="5275558766013849309">Filele se vor afla în același loc ca aplicațiile recente.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Blocat</translation>
 <translation id="5684874026226664614">Hopa. Această pagină nu a putut fi tradusă.</translation>
 <translation id="5708031556037168012">Păstrează datele existente pe dispozitiv și importă definitiv datele în <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Trimite la Google informații despre fișierele, aplicațiile și serviciile care rulează când te confrunți cu o blocare, pentru a ne ajuta să stabilim la care funcții și îmbunătățiri ar trebui să lucrăm.
-
-Statisticile de utilizare includ informații precum preferințele, clicurile pe butoane și utilizarea memoriei. Acestea nu includ adresele URL ale paginilor web sau alte informații personale. Rapoartele de blocare includ informații despre sistem din momentul blocării și pot include adresele URL ale paginilor web sau informații personale, în funcție de ceea ce s-a întâmplat în momentul blocării.</translation>
 <translation id="5719837394786370183">Paginile pe care le vezi în filele incognito nu vor fi înregistrate în istoricul browserului, nu vor stoca cookie-uri și nu vor rămâne în istoricul de căutare după ce închizi toate filele incognito. Fișierele descărcate și marcajele create vor fi păstrate.
 
 Totuși, nu ești invizibil(ă). Trecerea în modul incognito nu ascunde activitatea de navigare față de angajator, față de furnizorul de servicii de internet sau față de site-urile pe care le accesezi.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Actualizați</translation>
 <translation id="7191430249889272776">A fost deschisă o filă în fundal.</translation>
 <translation id="7208788139759694678">Economizorul de date este dezactivat</translation>
+<translation id="7220786058474068424">Se procesează</translation>
 <translation id="7243308994586599757">Opțiuni disponibile în partea de jos a ecranului</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> folosește locația ta pentru a afișa rezultate locale ale căutării</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Ajutor<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Anulează selecția</translation>
 <translation id="7851858861565204677">Alte dispozitive</translation>
 <translation id="7876243839304621966">Elimină tot</translation>
+<translation id="7902333740914687335">Plată procesată</translation>
 <translation id="7947953824732555851">Accept și conectare</translation>
 <translation id="7949961459945740081">Obține ultimele funcții</translation>
 <translation id="7963646190083259054">Producător:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Conținut</translation>
 <translation id="8173098127580644436">de la început</translation>
 <translation id="8200772114523450471">Reia</translation>
+<translation id="8202097416529803614">Rezumatul comenzii</translation>
 <translation id="8209050860603202033">Deschideți imaginea</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> dorește să se conecteze la:</translation>
 <translation id="8218346974737627104">Confirmați conectarea</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Deschide în altă fereastră</translation>
 <translation id="8959122750345127698">Navigarea nu este accesibilă: <ph name="URL" /></translation>
 <translation id="8979340629087822094">din ultima zi</translation>
+<translation id="8981454092730389528">Opțiuni privind activitatea Google</translation>
+<translation id="8986494364107987395">Trimite automat statisticile de utilizare și rapoartele de blocare la Google</translation>
 <translation id="8987061207681586800">Personalizează Chrome</translation>
 <translation id="9019902583201351841">Gestionat de părinții tăi</translation>
 <translation id="9020607083536754075">Închide fila actuală și revino la aplicația anterioară</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
index f3dd299..6b8172b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Переведено на <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Синхронизируйте закладки</translation>
 <translation id="17513872634828108">Открытые вкладки</translation>
+<translation id="1756600373018374892">Используйте эту кнопку для быстрого доступа к вкладкам.</translation>
 <translation id="1807246157184219062">Светлый</translation>
 <translation id="1825719650605518411">Первый запуск</translation>
 <translation id="1829244130665387512">Найти на странице</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Разрешение для Chrome можно предоставить в <ph name="BEGIN_LINK" />настройках Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Сохранение паролей</translation>
 <translation id="1944384637046898011">Зашифровать все с помощью пароля аккаунта Google с <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Укажите, как Google может использовать историю просмотров для персонализации Поиска и других сервисов.</translation>
 <translation id="1959930595721737608">Разрешить JavaScript на указанных сайтах.</translation>
 <translation id="1966710179511230534">Обновите учетные данные</translation>
 <translation id="1974060860693918893">Дополнительные</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966">Приложение "<ph name="APP_NAME" />" (<ph name="APP_URL" />)</translation>
 <translation id="2268044343513325586">Уточнить</translation>
 <translation id="2315043854645842844">Сертификат, выбранный клиентом, не поддерживается операционной системой.</translation>
-<translation id="2316129865977710310">Спасибо, не надо</translation>
 <translation id="2321958826496381788">Перемещайте ползунок, пока текст не станет удобным для чтения. После двойного нажатия на абзац текст должен быть такого размера.</translation>
-<translation id="2329597144923131178">Войдите, чтобы синхронизировать закладки, пароли, историю и т. д. на всех устройствах.</translation>
 <translation id="2343328333327081434">Установка…</translation>
 <translation id="2351097562818989364">Настройки перевода сброшены</translation>
 <translation id="2359808026110333948">Далее</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Родительская папка</translation>
 <translation id="2870560284913253234">Сайт</translation>
 <translation id="2888126860611144412">О браузере Chrome</translation>
+<translation id="2889768325388591707">Быстрое переключение между вкладками</translation>
 <translation id="2891154217021530873">Остановить загрузку страницы</translation>
 <translation id="2902702728133930130">При запуске Chrome произошла непредвиденная ошибка.</translation>
 <translation id="2903493209154104877">Адреса</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Открыть в режиме инкогнито</translation>
 <translation id="3090193911106258841">Доступ к аудио- и видеовходу</translation>
 <translation id="3137521801621304719">Выключить режим инкогнито</translation>
+<translation id="3149891296864842641">Выберите вариант отправки</translation>
+<translation id="3162882791484435636">Выбрать вариант отправки</translation>
+<translation id="3173438333156928404">Не удалось обработать платеж</translation>
 <translation id="3177909033752230686">Язык страницы:</translation>
 <translation id="3190152372525844641">Разрешения для Chrome можно предоставить в <ph name="BEGIN_LINK" />настройках Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905">В памяти занято: <ph name="STORAGE_AMOUNT" /></translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Обновить пароль для этого сайта в сервисе "<ph name="PASSWORD_MANAGER_BRAND" />"?</translation>
 <translation id="4881695831933465202">Открыть</translation>
 <translation id="4885273946141277891">Конфликт версий Chrome</translation>
+<translation id="4923459931733593730">Платеж</translation>
 <translation id="4943872375798546930">Нет результатов</translation>
-<translation id="4970484396410298643">Просматривайте одни и те же вкладки на компьютере и мобильном устройстве.
-
-Для этого откройте меню браузера на компьютере и выберите пункт "Войти в Chrome".</translation>
 <translation id="497421865427891073">Вперед</translation>
 <translation id="4996978546172906250">Способ отправки</translation>
 <translation id="5000922062037820727">Заблокировано (рекомендуется)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Открыть в Chrome</translation>
 <translation id="5199929503336119739">Рабочий профиль</translation>
 <translation id="5210365745912300556">Закрыть вкладку</translation>
-<translation id="5210714456814679336">Здесь появятся вкладки, открытые в Chrome на других устройствах.</translation>
 <translation id="5222676887888702881">Выйти</translation>
-<translation id="5228579091201413441">Включить синхронизацию</translation>
 <translation id="5233638681132016545">Новая вкладка</translation>
 <translation id="5271967389191913893">Не удается открыть скачанный контент.</translation>
 <translation id="5275558766013849309">Каждая вкладка будет отображаться в виде отдельного окна в списке открытых приложений.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Заблокировано</translation>
 <translation id="5684874026226664614">Не удалось перевести страницу</translation>
 <translation id="5708031556037168012">Добавленные ранее данные останутся в памяти устройства, а новый контент будет всегда импортироваться в аккаунт <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Расскажите, на какие проблемы нам стоит обратить внимание прежде всего. Для этого отправляйте в Google сведения о файлах, приложениях и сервисах, в работе которых возникли сбои.
-
-В статистику использования включаются сведения о настройках, нажатиях кнопок и использовании памяти, но не входят URL веб-страниц и личная информация. Отчеты о сбоях содержат системную информацию на момент сбоя, а иногда также URL веб-страниц и личные данные (в зависимости от того, как использовался браузер).</translation>
 <translation id="5719837394786370183">Страницы, открытые в этом окне, не останутся в истории браузера или поиска. Они не оставят на компьютере следов, таких как файлы cookie, после того как вы закроете все вкладки инкогнито. Скачанные вами файлы и добавленные закладки будут сохранены.
 
 В режиме инкогнито ваши действия видны системному администратору и интернет-провайдеру, а также доступны веб-сайтам, которые вы посещаете.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Обновить</translation>
 <translation id="7191430249889272776">Вкладка открыта в фоновом режиме</translation>
 <translation id="7208788139759694678">Расширение "Экономия трафика" отключено</translation>
+<translation id="7220786058474068424">Подождите…</translation>
 <translation id="7243308994586599757">Доступные параметры указаны в нижней части экрана</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> использует ваше местоположение, чтобы показывать результаты поиска по адресам.</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Справка<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Отменить выбор</translation>
 <translation id="7851858861565204677">Другие устройства</translation>
 <translation id="7876243839304621966">Удалить все</translation>
+<translation id="7902333740914687335">Платеж обработан</translation>
 <translation id="7947953824732555851">Принять и войти</translation>
 <translation id="7949961459945740081">C новыми функциями</translation>
 <translation id="7963646190083259054">Поставщик:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Контент</translation>
 <translation id="8173098127580644436">все время</translation>
 <translation id="8200772114523450471">Возобновить</translation>
+<translation id="8202097416529803614">Информация о заказе</translation>
 <translation id="8209050860603202033">Открыть изображение</translation>
 <translation id="8215250379351058554">Сайт <ph name="SITE" /> запрашивает подключение к:</translation>
 <translation id="8218346974737627104">Подтвердите вход</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Открыть в новом окне</translation>
 <translation id="8959122750345127698">Страница не найдена: <ph name="URL" /></translation>
 <translation id="8979340629087822094">вчерашний день</translation>
+<translation id="8981454092730389528">Отслеживание действий в Google</translation>
+<translation id="8986494364107987395">Автоматически отправлять в Google статистику использования и отчеты о сбоях</translation>
 <translation id="8987061207681586800">Ваш персональный Chrome</translation>
 <translation id="9019902583201351841">Управляется вашими родителями</translation>
 <translation id="9020607083536754075">Закрыть текущую вкладку и вернуться к приложению</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
index 895a941..16930ae 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Preložené do jazyka <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Synchronizujte svoje záložky</translation>
 <translation id="17513872634828108">Otvorené karty</translation>
+<translation id="1756600373018374892">Klepnutím na toto tlačidlo rýchlo pristúpite k svojim kartám.</translation>
 <translation id="1807246157184219062">Svetlý režim</translation>
 <translation id="1825719650605518411">Skúsenosť pri prvom spustení</translation>
 <translation id="1829244130665387512">Nájsť na stránke</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Zapnite povolenie pre Chrome v <ph name="BEGIN_LINK" />nastaveniach Androidu<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Ukladanie hesiel</translation>
 <translation id="1944384637046898011">Šifrovať všetko pomocou hesla Google od <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Ovládajte, ako Google môže používať vašu históriu prehliadania na prispôsobenie Vyhľadávania a ďalších služieb Google.</translation>
 <translation id="1959930595721737608">Povolenie JavaScriptu na nasledujúcom webe.</translation>
 <translation id="1966710179511230534">Aktualizujte svoje prihlasovacie údaje.</translation>
 <translation id="1974060860693918893">Rozšírené</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, webová aplikácia: <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Upraviť</translation>
 <translation id="2315043854645842844">Operačný systém nepodporuje výber certifikátu na strane klienta.</translation>
-<translation id="2316129865977710310">Nie, ďakujem</translation>
 <translation id="2321958826496381788">Presúvajte posúvač, dokým nebude čítanie tohto textu pohodlné. Po dvojitom klepnutí na odsek by mal byť text aspoň takto veľký.</translation>
-<translation id="2329597144923131178">Prihláste sa a získajte tak svoje záložky, históriu, heslá a ďalšie nastavenia na všetkých svojich zariadeniach.</translation>
 <translation id="2343328333327081434">Inštaluje sa…</translation>
 <translation id="2351097562818989364">Nastavenia prekladov boli resetované.</translation>
 <translation id="2359808026110333948">Pokračovať</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Nadradený priečinok</translation>
 <translation id="2870560284913253234">Webové stránky</translation>
 <translation id="2888126860611144412">Informácie o Google Chrome</translation>
+<translation id="2889768325388591707">Rýchle prepínanie kariet</translation>
 <translation id="2891154217021530873">Zastaviť načítavanie stránky</translation>
 <translation id="2902702728133930130">Prehliadač Chrome sa nepodarilo spustiť, pretože sa vyskytla neočakávaná chyba</translation>
 <translation id="2903493209154104877">Adresy</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Otvoriť na karte inkognito</translation>
 <translation id="3090193911106258841">Pristupovanie k zvukovému vstupu a vstupu videa</translation>
 <translation id="3137521801621304719">Ukončiť režim inkognito</translation>
+<translation id="3149891296864842641">Možnosť dodania</translation>
+<translation id="3162882791484435636">Vybrať možnosť dodania</translation>
+<translation id="3173438333156928404">Chyba pri spracovaní platby</translation>
 <translation id="3177909033752230686">Jazyk stránky:</translation>
 <translation id="3190152372525844641">Zapnite povolenia pre Chrome v <ph name="BEGIN_LINK" />nastaveniach Androidu<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> uložených údajov</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Chcete, aby <ph name="PASSWORD_MANAGER_BRAND" /> ukladal heslá pre tieto stránky?</translation>
 <translation id="4881695831933465202">Otvoriť</translation>
 <translation id="4885273946141277891">Nepodporovaný počet inštancií prehliadača Chrome.</translation>
+<translation id="4923459931733593730">Platba</translation>
 <translation id="4943872375798546930">Žiadne výsledky</translation>
-<translation id="4970484396410298643">Priamo tu môžete pristupovať ku kartám, ktoré máte otvorené na počítači.
-
-Stačí otvoriť Chrome na počítači, prejsť do ponuky a vybrať možnosť Prihlásiť sa do prehliadača Chrome…</translation>
 <translation id="497421865427891073">Ďalej</translation>
 <translation id="4996978546172906250">Zdieľať prostredníctvom</translation>
 <translation id="5000922062037820727">Blokované (odporúčané)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Otvoriť v prehliadači Chrome</translation>
 <translation id="5199929503336119739">Pracovný profil</translation>
 <translation id="5210365745912300556">Zatvoriť kartu</translation>
-<translation id="5210714456814679336">Tu sa zobrazia karty, ktoré ste otvorili v prehliadači Chrome na iných zariadeniach.</translation>
 <translation id="5222676887888702881">Odhlásiť sa</translation>
-<translation id="5228579091201413441">Povoliť synchronizáciu</translation>
 <translation id="5233638681132016545">Nová karta</translation>
 <translation id="5271967389191913893">Zariadenie nemôže otvoriť obsah na stiahnutie</translation>
 <translation id="5275558766013849309">Karty sa budú zobrazovať spolu s nedávnymi aplikáciami.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Zablokované</translation>
 <translation id="5684874026226664614">Hops. Túto stránku nebolo možné preložiť.</translation>
 <translation id="5708031556037168012">Ponechajte si existujúce údaje na zariadení a natrvalo importujte údaje do účtu <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Pomôžte nám určiť tie funkcie a zlepšenia, na ktorých by sme mali pracovať. Odosielajte Googlu informácie o súboroch, aplikáciách a službách spustených pri zlyhaní.
-
-Štatistiky používania obsahujú informácie, ako sú predvoľby, kliknutia na tlačidlá a využitie pamäte. Nie sú v nich však zahrnuté webové adresy stránok ani osobné informácie. Správy o zlyhaní obsahujú systémové informácie z času, kedy došlo k zlyhaniu. V závislosti od toho, aké aplikácie a služby boli v čase zlyhania spustené, môžu obsahovať webové adresy stránok alebo osobné informácie.</translation>
 <translation id="5719837394786370183">Stránky, ktoré si zobrazíte na kartách inkognito, budú odstránené z histórie prehliadača, z histórie vyhľadávania aj zo súborov cookie okamžite po zatvorení všetkých kariet inkognito. Stiahnuté súbory a záložky, ktoré vytvoríte, ostanú uložené.
 
 Nie ste však neviditeľný/-á. Používanie režimu inkognito neukryje vaše prehliadanie pred vaším zamestnávateľom, poskytovateľom internetových služieb či webovými stránkami, ktoré navštívite.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Obnoviť</translation>
 <translation id="7191430249889272776">Karta je otvorená na pozadí.</translation>
 <translation id="7208788139759694678">Šetrič dát je vypnutý</translation>
+<translation id="7220786058474068424">Spracováva sa</translation>
 <translation id="7243308994586599757">Možnosti sú k dispozícii v dolnej časti obrazovky</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> používa vašu polohu na zobrazovanie miestnych výsledkov vyhľadávania.</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Pomocník<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Zrušiť výber</translation>
 <translation id="7851858861565204677">Ďalšie zariadenia</translation>
 <translation id="7876243839304621966">Odstrániť všetko</translation>
+<translation id="7902333740914687335">Platba bola spracovaná</translation>
 <translation id="7947953824732555851">Prijať a prihl. sa</translation>
 <translation id="7949961459945740081">Získať najnovšie funkcie</translation>
 <translation id="7963646190083259054">Dodávateľ:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Obsah</translation>
 <translation id="8173098127580644436">celého obdobia</translation>
 <translation id="8200772114523450471">Pokračovať</translation>
+<translation id="8202097416529803614">Súhrn objednávky</translation>
 <translation id="8209050860603202033">Otvoriť obrázok</translation>
 <translation id="8215250379351058554">Web <ph name="SITE" /> žiada o pripojenie k zariadeniu:</translation>
 <translation id="8218346974737627104">Potvrdenie prihlásenia</translation>
@@ -593,6 +593,8 @@
 <translation id="8942627711005830162">Otvoriť v ďalšom okne</translation>
 <translation id="8959122750345127698">Navigácia je nedostupná: <ph name="URL" /></translation>
 <translation id="8979340629087822094">posledného dňa</translation>
+<translation id="8981454092730389528">Riadenie aktivity Google</translation>
+<translation id="8986494364107987395">Automaticky odosielať štatistiky o používaní a správy o zlyhaní spoločnosti Google</translation>
 <translation id="8987061207681586800">Prispôsobte si Chrome</translation>
 <translation id="9019902583201351841">Spravované vašimi rodičmi</translation>
 <translation id="9020607083536754075">Zavrieť aktuálnu kartu a prejsť do predchádzajúcej aplikácie</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
index eda85b87..b4416bd 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Prevedeno v ta jezik: <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Sinhroniziranje zaznamkov</translation>
 <translation id="17513872634828108">Odpri zavihke</translation>
+<translation id="1756600373018374892">Dotaknite se tega gumba, če želite hitro dostopati do svojih zavihkov.</translation>
 <translation id="1807246157184219062">Svetlo</translation>
 <translation id="1825719650605518411">Izkušnje ob prvem izvajanju</translation>
 <translation id="1829244130665387512">Poišči na strani</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">V <ph name="BEGIN_LINK" />nastavitvah za Android<ph name="END_LINK" /> vklopite dovoljenje za Chrome.</translation>
 <translation id="1943432128510653496">Shranjevanje gesel</translation>
 <translation id="1944384637046898011">Šifriranje vsega z geslom za Google Račun z dne <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Nadzirajte, kako Google na podlagi vaše zgodovine brskanja prilagaja Iskanje Google in druge Googlove storitve.</translation>
 <translation id="1959930595721737608">Omogočanje JavaScripta na naslednjem spletnem mestu</translation>
 <translation id="1966710179511230534">Posodobite podrobnosti prijave.</translation>
 <translation id="1974060860693918893">Dodatno</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, spletna aplikacija. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Izboljšaj iskanje</translation>
 <translation id="2315043854645842844">Operacijski sistem ne podpira izbire potrdila pri odjemalcu.</translation>
-<translation id="2316129865977710310">Ne, hvala</translation>
 <translation id="2321958826496381788">Drsnik povlecite do želene velikosti pisave. Besedilo naj bo po dvakratnem dotiku odstavka videti vsaj tolikšno.</translation>
-<translation id="2329597144923131178">Prijavite se, da boste lahko dostopali do zaznamkov, zgodovine, gesel in drugih nastavitev v vseh napravah.</translation>
 <translation id="2343328333327081434">Nameščanje ...</translation>
 <translation id="2351097562818989364">Nastavitve za prevajanje so ponastavljene.</translation>
 <translation id="2359808026110333948">Nadaljuj</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Nadrejena mapa</translation>
 <translation id="2870560284913253234">Spletno mesto</translation>
 <translation id="2888126860611144412">O brskalniku Chrome</translation>
+<translation id="2889768325388591707">Hitro preklapljanje med zavihki</translation>
 <translation id="2891154217021530873">Ustavi nalaganje strani</translation>
 <translation id="2902702728133930130">Zaradi nepričakovane napake se Chrome ni uspel zagnati.</translation>
 <translation id="2903493209154104877">Naslovi</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Odpri v zavihku brez beleženja zgodovine</translation>
 <translation id="3090193911106258841">Dostopanje do zvočnih vhodov in videovhodov</translation>
 <translation id="3137521801621304719">Izklop načina brez beleženja zgodovine</translation>
+<translation id="3149891296864842641">Možnost pošiljanja</translation>
+<translation id="3162882791484435636">Izbira možnosti pošiljanja</translation>
+<translation id="3173438333156928404">Napaka pri obdelavi plačila</translation>
 <translation id="3177909033752230686">Jezik strani:</translation>
 <translation id="3190152372525844641">V <ph name="BEGIN_LINK" />nastavitvah za Android<ph name="END_LINK" /> vklopite dovoljenja za Chrome.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> shranjenih podatkov</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Ali želite, da <ph name="PASSWORD_MANAGER_BRAND" /> posodobi geslo za to spletno mesto?</translation>
 <translation id="4881695831933465202">Odpri</translation>
 <translation id="4885273946141277891">To število primerkov Chroma ni podprto.</translation>
+<translation id="4923459931733593730">Plačilo</translation>
 <translation id="4943872375798546930">Ni rezultatov</translation>
-<translation id="4970484396410298643">Do zavihkov, odprtih v računalniku, lahko dostopate tukaj.
-
-V računalniku odprite Chrome, nato meni in izberite »Prijava v Chrome …«</translation>
 <translation id="497421865427891073">Pojdi naprej</translation>
 <translation id="4996978546172906250">Skupna raba prek</translation>
 <translation id="5000922062037820727">Blokirano (priporočeno)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Odpri v Chromu</translation>
 <translation id="5199929503336119739">Delovni profil</translation>
 <translation id="5210365745912300556">Zapri zavihek</translation>
-<translation id="5210714456814679336">Zavihki, ki ste jih odprli v Chromu v drugih napravah, bodo prikazani tukaj.</translation>
 <translation id="5222676887888702881">Odjava</translation>
-<translation id="5228579091201413441">Omogoči sinhronizacijo</translation>
 <translation id="5233638681132016545">Nov zavihek</translation>
 <translation id="5271967389191913893">Naprava ne more odpreti vsebine za prenos.</translation>
 <translation id="5275558766013849309">Zavihki bodo prikazani skupaj z nedavno uporabljenimi aplikacijami.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Blokirano</translation>
 <translation id="5684874026226664614">Ojoj, te strani bi bilo mogoče prevesti.</translation>
 <translation id="5708031556037168012">Ohranitev obstoječih podatkov v napravi in trajni uvoz podatkov v račun <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Pomagajte nam izdelati prednostni seznam funkcij in izboljšav, ki naj jih razvijamo, tako da pošiljate Googlu podatke o datotekah, aplikacijah in storitvah, ki se izvajajo, ko pride do zrušitve.
-
-Statistični podatki o uporabi vključujejo podatke, kot so nastavitve, kliki gumbov in uporaba pomnilnika. Ne vključujejo URL-jev spletnih mest ali kakršnih koli osebnih podatkov. Poročila o zrušitvah vsebujejo podatke o sistemu v trenutku zrušitve in glede na dogajanje v trenutku zrušitve morda vsebujejo tudi URL-je spletnih strani ali osebne podatke.</translation>
 <translation id="5719837394786370183">Strani, ki si jih ogledate na zavihkih brez beleženja zgodovine, ne bodo pustile sledi v zgodovini brskalnika, shrambi piškotkov ali zgodovini iskanja, ko zaprete vse zavihke brez beleženja zgodovine. Prenesene datoteke ali ustvarjeni zaznamki se bodo ohranili.
 
 Kljub temu niste nevidni. Če uporabljate način brez beleženja zgodovine, ne skrijete brskanja pred delodajalcem, ponudnikom internetnih storitev ali spletnimi mesti, ki jih obiskujete.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Osveži</translation>
 <translation id="7191430249889272776">Zavihek se je odprl v ozadju.</translation>
 <translation id="7208788139759694678">Varčevanje s podatki je onemogočeno</translation>
+<translation id="7220786058474068424">Obdelovanje</translation>
 <translation id="7243308994586599757">Možnosti so na voljo pri dnu zaslona</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> uporablja vašo lokacijo za prikaz lokalnih rezultatov iskanja</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Pomoč<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Prekliči izbor</translation>
 <translation id="7851858861565204677">Druge naprave</translation>
 <translation id="7876243839304621966">Odstrani vse</translation>
+<translation id="7902333740914687335">Plačilo je obdelano</translation>
 <translation id="7947953824732555851">Sprejem in prijava</translation>
 <translation id="7949961459945740081">Prejmite najnovejše funkcije</translation>
 <translation id="7963646190083259054">Ponudnik:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Vsebina</translation>
 <translation id="8173098127580644436">od začetka</translation>
 <translation id="8200772114523450471">Nadaljuj</translation>
+<translation id="8202097416529803614">Povzetek naročila</translation>
 <translation id="8209050860603202033">Odpri sliko</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> se želi povezati s tem:</translation>
 <translation id="8218346974737627104">Potrditev prijave</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Odpri v drugem oknu</translation>
 <translation id="8959122750345127698">Krmarjenje ni dosegljivo: <ph name="URL" /></translation>
 <translation id="8979340629087822094">zadnjega dne</translation>
+<translation id="8981454092730389528">Googlovi kontrolniki za dejavnost</translation>
+<translation id="8986494364107987395">Samodejno pošlji statistiko uporabe in poročila o zrušitvi Googlu</translation>
 <translation id="8987061207681586800">Prilagodite si Chrome</translation>
 <translation id="9019902583201351841">Upravljajo starši</translation>
 <translation id="9020607083536754075">Zapri trenutni zavihek in nazaj na prejšnjo aplikacijo</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
index 3305e01..f600ee1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Преведено је на <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Синхронизујте обележиваче</translation>
 <translation id="17513872634828108">Отворене картице</translation>
+<translation id="1756600373018374892">Додирните ово дугме ради бржег приступа картицама.</translation>
 <translation id="1807246157184219062">Светлa</translation>
 <translation id="1825719650605518411">Доживљај првог покретања</translation>
 <translation id="1829244130665387512">Пронађи на страници</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Укључите дозволу за Chrome у <ph name="BEGIN_LINK" />Android подешавањима<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Сачувај лозинке</translation>
 <translation id="1944384637046898011">Шифруј све помоћу Google лозинке од <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Контролишите како Google користи историју прегледања за персонализацију Претраге и других Google услуга</translation>
 <translation id="1959930595721737608">Дозволите JavaScript на следећем сајту.</translation>
 <translation id="1966710179511230534">Ажурирајте податке за пријављивање.</translation>
 <translation id="1974060860693918893">Напредне опције</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, веб-апликација. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Прецизирај</translation>
 <translation id="2315043854645842844">Оперативни систем не подржава избор сертификата за клијента.</translation>
-<translation id="2316129865977710310">Не, хвала</translation>
 <translation id="2321958826496381788">Превлачите клизач док ово не будете могли лако да прочитате. Када двапут додирнете пасус, текст треба да буде бар оволики.</translation>
-<translation id="2329597144923131178">Пријавите се да би вам обележивачи, историја, лозинке и друга подешавања били доступни на свим уређајима.</translation>
 <translation id="2343328333327081434">Инсталира се...</translation>
 <translation id="2351097562818989364">Подешавања за превођење су ресетована.</translation>
 <translation id="2359808026110333948">Настави</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Надређени директоријум</translation>
 <translation id="2870560284913253234">Сајт</translation>
 <translation id="2888126860611144412">О Chrome прегледачу</translation>
+<translation id="2889768325388591707">Брзо пребацујте картице</translation>
 <translation id="2891154217021530873">Заустави учитавање странице</translation>
 <translation id="2902702728133930130">Chrome је отказао током покретања због неочекиване грешке.</translation>
 <translation id="2903493209154104877">Адресе</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Отварање на картици без архивирања</translation>
 <translation id="3090193911106258841">Приступа се аудио и видео улазу</translation>
 <translation id="3137521801621304719">Изађи из режима без архивирања</translation>
+<translation id="3149891296864842641">Опције испоруке</translation>
+<translation id="3162882791484435636">Изабери опцију испоруке</translation>
+<translation id="3173438333156928404">Грешка у обради плаћања</translation>
 <translation id="3177909033752230686">Језик странице:</translation>
 <translation id="3190152372525844641">Укључите дозволе за Chrome у <ph name="BEGIN_LINK" />Android подешавањима<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> сачуваних података</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Желите ли да <ph name="PASSWORD_MANAGER_BRAND" /> ажурира лозинку за овај сајт?</translation>
 <translation id="4881695831933465202">Отвори</translation>
 <translation id="4885273946141277891">Неподржан број Chrome инстанци.</translation>
+<translation id="4923459931733593730">Плаћање</translation>
 <translation id="4943872375798546930">Нема резултата</translation>
-<translation id="4970484396410298643">Овде приступајте картицама које сте отворили на рачунару.
-
-Само отворите Chrome на рачунару, идите на мени и изаберите „Пријави ме у Chrome...“</translation>
 <translation id="497421865427891073">Кретање унапред</translation>
 <translation id="4996978546172906250">Дељење преко</translation>
 <translation id="5000922062037820727">Блокирано (препоручено)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Отвори у Chrome-у</translation>
 <translation id="5199929503336119739">Профил за Work</translation>
 <translation id="5210365745912300556">Затвори картицу</translation>
-<translation id="5210714456814679336">Овде ће се приказивати картице које сте отворили у Chrome-у на другим уређајима.</translation>
 <translation id="5222676887888702881">Одјави ме</translation>
-<translation id="5228579091201413441">Омогући синхронизацију</translation>
 <translation id="5233638681132016545">Нова картица</translation>
 <translation id="5271967389191913893">Уређај не може да отвори садржај за преузимање.</translation>
 <translation id="5275558766013849309">Картице ће се приказивати заједно са недавним апликацијама.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Блокирано</translation>
 <translation id="5684874026226664614">Упс, превођење ове странице није успело.</translation>
 <translation id="5708031556037168012">Задржите постојеће податке на уређају и трајно увезите податке на <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Помозите нам да одредимо приоритет функција и побољшања на којима би требало да радимо тако што ћете слати Google-у информације о датотекама, апликацијама и услугама које сте користили у тренутку отказивања.
-
-Статистика коришћења обухвата информације попут подешавања, кликова на дугмад и коришћења меморије. Не обухвата URL-ове веб-страница нити личне податке. Извештаји о отказивању садрже информације о систему у тренутку отказивања и могу да садрже URL-ове веб-страница или личне податке, у зависности од тога шта се дешавало у тренутку отказивања.</translation>
 <translation id="5719837394786370183">Странице које прегледате на картицама без архивирања се неће задржавати у историји прегледача, складишту колачића или историји претраге када затворите све картице без архивирања. Сачуваћемо све преузете датотеке или направљене обележиваче.
 
           Међутим, нисте невидљиви. Прелазак у режим без архивирања не сакрива оно што прегледате од послодавца, добављача интернет услуге или веб-сајтова које посећујете.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Освежи</translation>
 <translation id="7191430249889272776">Картица је отворена у позадини.</translation>
 <translation id="7208788139759694678">Уштеда података је онемогућена</translation>
+<translation id="7220786058474068424">Обрада</translation>
 <translation id="7243308994586599757">Опције су доступне у дну екрана</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> користи локацију да би приказао локалне резултате претраге</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Помоћ<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Откажи избор</translation>
 <translation id="7851858861565204677">Други уређаји</translation>
 <translation id="7876243839304621966">Уклони све</translation>
+<translation id="7902333740914687335">Плаћање је обрађено</translation>
 <translation id="7947953824732555851">Прихвати и пријави ме</translation>
 <translation id="7949961459945740081">Набавите најновије функције</translation>
 <translation id="7963646190083259054">Продавац:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Садржај</translation>
 <translation id="8173098127580644436">одувек</translation>
 <translation id="8200772114523450471">Настави</translation>
+<translation id="8202097416529803614">Резиме поруџбине</translation>
 <translation id="8209050860603202033">Отвори слику</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> жели да се повеже са:</translation>
 <translation id="8218346974737627104">Потврдите пријављивање</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Отвори у другом прозору</translation>
 <translation id="8959122750345127698">Навигација је недоступна: <ph name="URL" /></translation>
 <translation id="8979340629087822094">прошли дан</translation>
+<translation id="8981454092730389528">Google контроле активности</translation>
+<translation id="8986494364107987395">Аутоматски шаљи Google-у статистичке податке о коришћењу и извештаје о отказивању</translation>
 <translation id="8987061207681586800">Прилагодите Chrome</translation>
 <translation id="9019902583201351841">Овим управљају твоји родитељи</translation>
 <translation id="9020607083536754075">Затвори тренутну картицу и врати се у претходну апликацију</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
index 9b3d0153..fd077eb 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Översatt till <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Synkronisera bokmärken</translation>
 <translation id="17513872634828108">Öppna flikar</translation>
+<translation id="1756600373018374892">Den här knappen ger snabb tillgång till flikarna.</translation>
 <translation id="1807246157184219062">Ljus</translation>
 <translation id="1825719650605518411">Första körningen</translation>
 <translation id="1829244130665387512">Hitta på sida</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Aktivera behörighet för Chrome i <ph name="BEGIN_LINK" />Android-inställningar<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Spara lösenord</translation>
 <translation id="1944384637046898011">Kryptera alla med Google-lösenordet från <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Styr hur Google anpassar Sök och andra Google-tjänster utifrån webbhistoriken.</translation>
 <translation id="1959930595721737608">Tillåt JavaScript på följande webbplats.</translation>
 <translation id="1966710179511230534">Uppdatera dina inloggningsuppgifter.</translation>
 <translation id="1974060860693918893">Avancerat</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, webbapp. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Finjustera</translation>
 <translation id="2315043854645842844">Val av certifikat på klienten stöds inte av operativsystemet.</translation>
-<translation id="2316129865977710310">Nej tack</translation>
 <translation id="2321958826496381788">Flytta reglaget tills du kan läsa texten ordentligt. Texten bör bli åtminstone så här stor när du trycker två gånger på ett stycke.</translation>
-<translation id="2329597144923131178">Logga in så blir bokmärken, historik, lösenord med mera tillgängligt på alla dina enheter.</translation>
 <translation id="2343328333327081434">Installerar …</translation>
 <translation id="2351097562818989364">Översättningsinställningarna har återställts.</translation>
 <translation id="2359808026110333948">Fortsätt</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Överordnad mapp</translation>
 <translation id="2870560284913253234">Webbplats</translation>
 <translation id="2888126860611144412">Om Chrome</translation>
+<translation id="2889768325388591707">Byt flik snabbt</translation>
 <translation id="2891154217021530873">Avbryt inläsningen av sidan</translation>
 <translation id="2902702728133930130">Ett oväntat fel uppstod när Chrome skulle startas.</translation>
 <translation id="2903493209154104877">Adresser</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Öppna i inkognitoflik</translation>
 <translation id="3090193911106258841">Får åtkomst till ljud- och videoindata</translation>
 <translation id="3137521801621304719">Inaktivera inkognitoläge</translation>
+<translation id="3149891296864842641">Fraktalternativ</translation>
+<translation id="3162882791484435636">Välj fraktalternativ</translation>
+<translation id="3173438333156928404">Det gick inte att bearbeta betalningen</translation>
 <translation id="3177909033752230686">Sidans språk:</translation>
 <translation id="3190152372525844641">Aktivera behörigheter för Chrome i <ph name="BEGIN_LINK" />Android-inställningar<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> sparad data</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Vill du att lösenordet för den här webbplatsen ska uppdateras med <ph name="PASSWORD_MANAGER_BRAND" />?</translation>
 <translation id="4881695831933465202">Öppna</translation>
 <translation id="4885273946141277891">Fler Chrome-förekomster än det finns stöd för.</translation>
+<translation id="4923459931733593730">Betalning</translation>
 <translation id="4943872375798546930">Inga resultat</translation>
-<translation id="4970484396410298643">Använd flikar som du öppnar på datorn även här.
-
-Du behöver bara öppna Chrome på datorn, öppna menyn och välja Logga in i Chrome …</translation>
 <translation id="497421865427891073">Fortsätt</translation>
 <translation id="4996978546172906250">Dela via</translation>
 <translation id="5000922062037820727">Blockerad (rekommenderas)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Öppna i Chrome</translation>
 <translation id="5199929503336119739">Jobbprofil</translation>
 <translation id="5210365745912300556">Stäng flik</translation>
-<translation id="5210714456814679336">Flikar som du hat öppnat i Chrome på andra enheter visas här.</translation>
 <translation id="5222676887888702881">Logga ut</translation>
-<translation id="5228579091201413441">Aktivera synkronisering</translation>
 <translation id="5233638681132016545">Ny flik</translation>
 <translation id="5271967389191913893">Innehållet som skulle laddas ned gick inte att öppna på enheten.</translation>
 <translation id="5275558766013849309">Flikarna visas tillsammans med aktuella appar.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Blockerad</translation>
 <translation id="5684874026226664614">Det gick inte att översätta sidan.</translation>
 <translation id="5708031556037168012">Behåll befintlig data på enheten och importera data till <ph name="TO_ACCOUNT" /> permanent.</translation>
-<translation id="5712189971979076230">Hjälp oss att prioritera vilka funktioner och förbättringar vi ska arbeta med genom att skicka information till Google om vilka filer, program och tjänster som körs när en krasch inträffar.
-
-Användningsstatistiken innehåller information som inställningar, knappklick och minnesanvändning. De innehåller inte webbadresser eller personliga uppgifter. Felrapporter innehåller information om systemet vid tidpunkten för kraschen och kan innehålla webbadresser eller personliga uppgifter beroende på vad som hände vid kraschen.</translation>
 <translation id="5719837394786370183">Sidor du visar i inkognitoflikar sparas inte i webbläsarhistoriken och lagras inte bland cookies eller i sökhistoriken när du har stängt alla inkognitoflikar. Däremot sparas alla filer du laddar ned och bokmärken du skapar.
 
 Du är dock inte osynlig. Trots inkognitoläget kan din arbetsgivare, din internetleverantör eller de webbplatser du besöker se din aktivitet.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Uppdatera</translation>
 <translation id="7191430249889272776">Fliken öppnades i bakgrunden.</translation>
 <translation id="7208788139759694678">Databesparing har inaktiverats</translation>
+<translation id="7220786058474068424">Bearbetning pågår</translation>
 <translation id="7243308994586599757">Alternativ visas nära skärmens nedre kant</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> använder din platsinformation för att visa lokala sökresultat</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Hjälp<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Rensa val</translation>
 <translation id="7851858861565204677">Andra enheter</translation>
 <translation id="7876243839304621966">Ta bort alla</translation>
+<translation id="7902333740914687335">Betalningen är slutförd</translation>
 <translation id="7947953824732555851">Godkänn och logga in</translation>
 <translation id="7949961459945740081">Få de senaste funktionerna</translation>
 <translation id="7963646190083259054">Leverantör:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Innehåll</translation>
 <translation id="8173098127580644436">tidens början</translation>
 <translation id="8200772114523450471">Återuppta</translation>
+<translation id="8202097416529803614">Beställningsöversikt</translation>
 <translation id="8209050860603202033">Öppna bild</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> vill ansluta till:</translation>
 <translation id="8218346974737627104">Bekräfta inloggning</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Öppna i ett annat fönster</translation>
 <translation id="8959122750345127698">Det går inte att nå webbadressen: <ph name="URL" /></translation>
 <translation id="8979340629087822094">den senaste dagen</translation>
+<translation id="8981454092730389528">Googles aktivitetsinställningar</translation>
+<translation id="8986494364107987395">Skicka användningsstatistik och kraschrapporter till Google automatiskt</translation>
 <translation id="8987061207681586800">Anpassa Chrome</translation>
 <translation id="9019902583201351841">Hanteras av dina föräldrar</translation>
 <translation id="9020607083536754075">Stäng nuvarande flik och återvänd till föregående app</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
index 052c3c6..14e4dbab 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Imetafsiriwa katika <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Sawazisha alamisho zako</translation>
 <translation id="17513872634828108">Vichupo vilivyo wazi</translation>
+<translation id="1756600373018374892">Gonga kitufe hiki ili ufikie vichupo vyako haraka.</translation>
 <translation id="1807246157184219062">Mwangaza</translation>
 <translation id="1825719650605518411">Hali ya Uendeshaji wa Kwanza</translation>
 <translation id="1829244130665387512">Tafuta katika ukurasa</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Washa ruhusa ya Chrome katika <ph name="BEGIN_LINK" />Mipangilio ya Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Hifadhi manenosiri</translation>
 <translation id="1944384637046898011">Simba yote kwa njia fiche ukitumia nenosiri la Google kuanzia <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Dhibiti namna Google hutumia historia yako ya kuvinjari ili uweke mapendeleo ya huduma za Tafuta na huduma nyingine za Google.</translation>
 <translation id="1959930595721737608">Ruhusu JavaScript kwenye tovuti hii.</translation>
 <translation id="1966710179511230534">Tafadhali sasisha maelezo yako ya kuingia katika akaunti.</translation>
 <translation id="1974060860693918893">Mipangilio ya kina</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, programu ya wavuti. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Chuja</translation>
 <translation id="2315043854645842844">Uchaguzi wa cheti cha sehemu ya seva teja hautumiwi na mfumo wa uendeshaji.</translation>
-<translation id="2316129865977710310">La, asante</translation>
 <translation id="2321958826496381788">Buruta kitelezi hadi uweze kusoma haya kwa starehe. Maandishi yanapaswa kuonekana angalau kwa ukubwa huu baada ya kugonga mara mbili kwenye aya.</translation>
-<translation id="2329597144923131178">Ingia katika akaunti ili upate alamisho, historia, manenosiri, na mipangilio yako mingine kwenye vifaa vyako vyote.</translation>
 <translation id="2343328333327081434">Inasakinisha...</translation>
 <translation id="2351097562818989364">Mipangilio yako ya kutafsiri imewekwa upya.</translation>
 <translation id="2359808026110333948">Endelea</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Folda kuu</translation>
 <translation id="2870560284913253234">Tovuti</translation>
 <translation id="2888126860611144412">Kuhusu Chrome</translation>
+<translation id="2889768325388591707">Badilisha vichupo kwa haraka</translation>
 <translation id="2891154217021530873">Simamisha upakiaji wa ukurasa</translation>
 <translation id="2902702728133930130">Chrome haikufaulu wakati wa kuanza kutokana na hitilafu isiyotarajiwa.</translation>
 <translation id="2903493209154104877">Anwani</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Fungua kwenye kichupo fiche</translation>
 <translation id="3090193911106258841">Inafikia vifaa vya kuingiza sauti na video</translation>
 <translation id="3137521801621304719">Ondoka kwenye hali fiche</translation>
+<translation id="3149891296864842641">Chaguo la usafirishaji</translation>
+<translation id="3162882791484435636">Teua chaguo la usafirishaji</translation>
+<translation id="3173438333156928404">Hitilafu wakati wa kushughulikia malipo</translation>
 <translation id="3177909033752230686">Lugha ya Ukurasa:</translation>
 <translation id="3190152372525844641">Washa ruhusa za Chrome katika <ph name="BEGIN_LINK" />Mipangilio ya Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> za data iliyohifadhiwa</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Je, unataka <ph name="PASSWORD_MANAGER_BRAND" /> isasishe nenosiri lako kwa wavuti huu?</translation>
 <translation id="4881695831933465202">Fungua</translation>
 <translation id="4885273946141277891">Idadi ya matukio ya Chrome isiyoweza kutumika.</translation>
+<translation id="4923459931733593730">Malipo</translation>
 <translation id="4943872375798546930">Hakuna matokeo</translation>
-<translation id="4970484396410298643">Fikia vichupo ambavyo viko wazi kwenye kompyuta yako, papa hapa.
-
-Fungua Chrome kwenye kompyuta yako, nenda kwenye menyu, na uchague “Ingia katika Chrome…”</translation>
 <translation id="497421865427891073">Nenda mbele</translation>
 <translation id="4996978546172906250">Shiriki kupitia</translation>
 <translation id="5000922062037820727">Imezuiwa (imependekezwa)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Fungulia katika Chrome</translation>
 <translation id="5199929503336119739">Wasifu wa kazini</translation>
 <translation id="5210365745912300556">Funga kichupo</translation>
-<translation id="5210714456814679336">Vichupo ambavyo umevifungua katika Chrome kwenye vifaa vyako vingine vitaonekana hapa.</translation>
 <translation id="5222676887888702881">Ondoka</translation>
-<translation id="5228579091201413441">Washa usawazishaji</translation>
 <translation id="5233638681132016545">Kichupo kipya</translation>
 <translation id="5271967389191913893">Kifaa hakiwezi kufungua maudhui yanayopaswa kupakuliwa.</translation>
 <translation id="5275558766013849309">Vichupo vitakaa pamoja na programu za hivi majuzi.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Vilivyozuiwa</translation>
 <translation id="5684874026226664614">Lo!  Ukurasa huu haukuweza kutafsiriwa.</translation>
 <translation id="5708031556037168012">Salia na data iliyopo kwenye kifaa chako na ulete data daima kwenye <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Tusaidie kuweka kipaumbele katika vipengele na maboresho tunayopaswa kushughulikia kwa kuitumia Google maelezo kuhusu faili, programu, na huduma zinazofanya kazi unapokumbwa na hitilafu ya kuacha kufanya kazi.
-
-        Takwimu za matumizi zinajumuisha maelezo kama vile mapendeleo, mibofyo ya vitufe, na matumizi ya hifadhi. Hazijumuishi URL za ukurasa wa wavuti au maelezo yoyote ya kibinafsi. Ripoti za kuacha kufanya kazi zina maelezo ya mfumo ya wakati wa kuacha kufanya kazi, na zinaweza kuwa na URL za ukurasa wa wavuti au maelezo ya kibinafsi, kutegemea na kilichokuwa kikitendeka wakati wa kuacha kufanya kazi.</translation>
 <translation id="5719837394786370183">Kurasa unazoziangalia katika vichupo fiche hazitaendelea kuwepo katika historia ya kivinjari, hifadhi ya vidakuzi, au historia yako ya utafutaji ukishafunga vichupo vyako vyote fiche. Faili zozote unazopakua au alamisho unazounda hazitafutwa.
 
 Hata hivyo, huonekani. Kuvinjari katika hali fiche hakufichi kuvinjari kwako kusionekane kwa mwajiri, mtoa huduma wako wa intaneti, au tovuti unazotembelea.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Onyesha upya</translation>
 <translation id="7191430249889272776">Kichupo kimefunguliwa chini chini.</translation>
 <translation id="7208788139759694678">Kiokoa Data kimezimwa</translation>
+<translation id="7220786058474068424">Malipo yanashughulikiwa</translation>
 <translation id="7243308994586599757">Chaguo zinapatikana karibu na sehemu ya chini ya skrini</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> hutumia mahali ulipo ili kuonyesha matokeo ya utafutaji wa karibu</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Usaidizi<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Ghairi uchaguzi</translation>
 <translation id="7851858861565204677">Vifaa vingine</translation>
 <translation id="7876243839304621966">Ondoa yote</translation>
+<translation id="7902333740914687335">Malipo yameshughulikiwa</translation>
 <translation id="7947953824732555851">Kubali na uingie</translation>
 <translation id="7949961459945740081">Jipatie vipengele vipya</translation>
 <translation id="7963646190083259054">Mchuuzi:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Maudhui</translation>
 <translation id="8173098127580644436">kutoka mwanzo</translation>
 <translation id="8200772114523450471">Endelea</translation>
+<translation id="8202097416529803614">Muhtasari wa agizo</translation>
 <translation id="8209050860603202033">Fungua picha</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> inataka kuunganisha kwenye:</translation>
 <translation id="8218346974737627104">Thibitisha kuingia katika akaunti</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Fungua katika dirisha jingine</translation>
 <translation id="8959122750345127698">Kudurusu hakufikiki: <ph name="URL" /></translation>
 <translation id="8979340629087822094">siku iliyopita</translation>
+<translation id="8981454092730389528">Vidhibiti vya Shughuli za Google</translation>
+<translation id="8986494364107987395">Tumia Google, moja kwa moja, takwimu za matumizi na ripoti za mara ambazo kivinjari kinaacha kufanya kazi</translation>
 <translation id="8987061207681586800">Ifanye Chrome kuwa yako</translation>
 <translation id="9019902583201351841">Inadhibitiwa na wazazi wako</translation>
 <translation id="9020607083536754075">Funga kichupo cha sasa na urudi kwenye programu ya awali</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
index 62bf9b9..4196ed08 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">แปลเป็นภาษา<ph name="TARGET_LANGUAGE" />แล้ว</translation>
 <translation id="1749561566933687563">ซิงค์บุ๊กมาร์กของคุณ</translation>
 <translation id="17513872634828108">แท็บที่เปิดอยู่</translation>
+<translation id="1756600373018374892">แตะปุ่มนี้เพื่อเข้าถึงแท็บอย่างรวดเร็ว</translation>
 <translation id="1807246157184219062">สว่าง</translation>
 <translation id="1825719650605518411">ประสบการณ์กับ First Run</translation>
 <translation id="1829244130665387512">ค้นหาในหน้าเว็บ</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">เปิดการใช้สิทธิ์สำหรับ Chrome ใน<ph name="BEGIN_LINK" />การตั้งค่า Android<ph name="END_LINK" /></translation>
 <translation id="1943432128510653496">บันทึกรหัสผ่าน</translation>
 <translation id="1944384637046898011">เข้ารหัสทั้งหมดด้วยรหัสผ่าน Google ตั้งแต่วันที่ <ph name="TIME" /></translation>
+<translation id="1946005195648379376">ควบคุมวิธีที่ Google ใช้ประวัติการท่องเว็บของคุณเพื่อปรับเปลี่ยนการค้นหาในแบบของคุณและบริการอื่นๆ ของ Google</translation>
 <translation id="1959930595721737608">อนุญาตให้ใช้ JavaScript บนเว็บไซต์ต่อไปนี้</translation>
 <translation id="1966710179511230534">โปรดอัปเดตรายละเอียดการลงชื่อเข้าใช้ของคุณ</translation>
 <translation id="1974060860693918893">ขั้นสูง</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966">เว็บแอป <ph name="APP_NAME" />, <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">ปรับแต่ง</translation>
 <translation id="2315043854645842844">ระบบปฏิบัติการไม่สนับสนุนการเลือกใบรับรองฝั่งลูกค้า</translation>
-<translation id="2316129865977710310">ไม่ ขอบคุณ</translation>
 <translation id="2321958826496381788">ลากแถบเลื่อนจนกว่าคุณจะสามารถอ่านได้อย่างสะดวก ข้อความควรมีขนาดเท่านี้เป็นอย่างน้อยหลังจากแตะ 2 ครั้งบนย่อหน้า</translation>
-<translation id="2329597144923131178">ลงชื่อเข้าใช้เพื่อรับบุ๊กมาร์ก ประวัติ รหัสผ่าน และการตั้งค่าอื่นๆ ในอุปกรณ์ทั้งหมด</translation>
 <translation id="2343328333327081434">กำลังติดตั้ง…</translation>
 <translation id="2351097562818989364">รีเซ็ตการตั้งค่าการแปลภาษาของคุณแล้ว</translation>
 <translation id="2359808026110333948">ดำเนินการต่อ</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">โฟลเดอร์ระดับบนสุด</translation>
 <translation id="2870560284913253234">เว็บไซต์</translation>
 <translation id="2888126860611144412">เกี่ยวกับ Chrome</translation>
+<translation id="2889768325388591707">สลับแท็บอย่างรวดเร็ว</translation>
 <translation id="2891154217021530873">หยุดการโหลดหน้า</translation>
 <translation id="2902702728133930130">Chrome ล้มเหลวในระหว่างเริ่มต้นเนื่องจากข้อผิดพลาดที่ไม่คาดคิด</translation>
 <translation id="2903493209154104877">ที่อยู่</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">เปิดในแท็บไม่ระบุตัวตน</translation>
 <translation id="3090193911106258841">กำลังเข้าถึงอินพุตเสียงและวิดีโอ</translation>
 <translation id="3137521801621304719">ออกจากโหมดไม่ระบุตัวตน</translation>
+<translation id="3149891296864842641">ตัวเลือกการจัดส่ง</translation>
+<translation id="3162882791484435636">เลือกตัวเลือกในการจัดส่ง</translation>
+<translation id="3173438333156928404">เกิดข้อผิดพลาดในการดำเนินการการชำระเงิน</translation>
 <translation id="3177909033752230686">ภาษาหน้าเว็บ:</translation>
 <translation id="3190152372525844641">เปิดการใช้สิทธิ์สำหรับ Chrome ใน<ph name="BEGIN_LINK" />การตั้งค่า Android<ph name="END_LINK" /></translation>
 <translation id="3198916472715691905">ข้อมูลที่จัดเก็บมี <ph name="STORAGE_AMOUNT" /></translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">คุณต้องการให้ <ph name="PASSWORD_MANAGER_BRAND" /> อัปเดตรหัสผ่านของคุณสำหรับเว็บไซต์นี้ไหม</translation>
 <translation id="4881695831933465202">เปิด</translation>
 <translation id="4885273946141277891">อินสแตนซ์ของ Chrome เกินจำนวนที่สนับสนุน</translation>
+<translation id="4923459931733593730">การชำระเงิน</translation>
 <translation id="4943872375798546930">ไม่มีผลการค้นหา</translation>
-<translation id="4970484396410298643">เข้าถึงแท็บที่คุณได้เปิดไว้ในคอมพิวเตอร์ได้ที่นี่
-
-เพียงเปิด Chrome บนคอมพิวเตอร์ของคุณ ไปที่เมนู แล้วเลือก “ลงชื่อเข้าใช้ Chrome…”</translation>
 <translation id="497421865427891073">ไปข้างหน้า</translation>
 <translation id="4996978546172906250">แชร์ผ่าน</translation>
 <translation id="5000922062037820727">ถูกบล็อก (แนะนำ)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">เปิดใน Chrome</translation>
 <translation id="5199929503336119739">โปรไฟล์งาน</translation>
 <translation id="5210365745912300556">ปิดแท็บ</translation>
-<translation id="5210714456814679336">แท็บที่คุณเปิดใน Chrome บนอุปกรณ์อื่นๆ ของคุณจะปรากฏที่นี่</translation>
 <translation id="5222676887888702881">ออกจากระบบ</translation>
-<translation id="5228579091201413441">เปิดใช้การซิงค์</translation>
 <translation id="5233638681132016545">แท็บใหม่</translation>
 <translation id="5271967389191913893">อุปกรณ์ไม่สามารถเปิดเนื้อหาที่จะดาวน์โหลดได้</translation>
 <translation id="5275558766013849309">แท็บจะแสดงร่วมกับแอปล่าสุด</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">ถูกบล็อก</translation>
 <translation id="5684874026226664614">อ๊ะ หน้านี้ไม่สามารถแปลได้</translation>
 <translation id="5708031556037168012">เก็บข้อมูลที่มีไว้บนอุปกรณ์และนำเข้าข้อมูลไปยัง <ph name="TO_ACCOUNT" /> อย่างถาวร</translation>
-<translation id="5712189971979076230">ช่วยเราจัดลำดับความสำคัญของคุณลักษณะและการปรับปรุงที่เราควรทำโดยการส่งข้อมูลเกี่ยวกับไฟล์ แอปพลิเคชัน และบริการที่ทำงานอยู่ในขณะที่เกิดการขัดข้องไปยัง Google
-
-สถิติการใช้งานจะรวมถึงข้อมูลอย่างเช่น ค่ากำหนด การคลิกปุ่ม และการใช้หน่วยความจำ สถิติเหล่านี้ไม่รวม URL ของหน้าเว็บหรือข้อมูลส่วนบุคคลใดๆ ส่วนรายงานข้อขัดข้องนั้นจะประกอบด้วยข้อมูลระบบในเวลาที่มีการขัดข้อง และอาจประกอบด้วย URL ของหน้าเว็บหรือข้อมูลส่วนบุคคล ซึ่งขึ้นอยู่กับสิ่งที่เกิดขึ้นในขณะที่มีการขัดข้อง</translation>
 <translation id="5719837394786370183">หน้าที่คุณดูในแท็บแบบไม่ระบุตัวตนจะไม่เก็บอยู่ในประวัติของเบราว์เซอร์ การจัดเก็บคุกกี้ หรือประวัติการค้นหาหลังจากที่คุณปิดแท็บที่ไม่ระบุตัวตนทั้งหมดแล้ว แต่จะมีการเก็บไฟล์ใดๆ ที่คุณดาวน์โหลดหรือบุ๊กมาร์กที่คุณสร้างไว้
 
 อย่างไรก็ตาม คนอื่นจะยังสามารถมองเห็นคุณ การเข้าสู่โหมดไม่ระบุตัวตนไม่ได้เป็นการซ่อนการท่องเว็บจากนายจ้าง ผู้ให้บริการอินเทอร์เน็ต หรือเว็บไซต์ที่คุณเข้าชม</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">รีเฟรช</translation>
 <translation id="7191430249889272776">แท็บเปิดในพื้นหลัง</translation>
 <translation id="7208788139759694678">ปิดใช้โปรแกรมประหยัดอินเทอร์เน็ต</translation>
+<translation id="7220786058474068424">กำลังดำเนินการ</translation>
 <translation id="7243308994586599757">มีตัวเลือกอยู่ทางด้านล่างของหน้าจอ</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> ใช้ตำแหน่งเพื่อแสดงผลการค้นหาในท้องถิ่น</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />ความช่วยเหลือ<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">ยกเลิกการเลือก</translation>
 <translation id="7851858861565204677">อุปกรณ์อื่นๆ</translation>
 <translation id="7876243839304621966">ลบทั้งหมด</translation>
+<translation id="7902333740914687335">ดำเนินการการชำระเงินแล้ว</translation>
 <translation id="7947953824732555851">ยอมรับและลงชื่อเข้าใช้</translation>
 <translation id="7949961459945740081">รับคุณลักษณะล่าสุด</translation>
 <translation id="7963646190083259054">ผู้ขาย:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">เนื้อหา</translation>
 <translation id="8173098127580644436">ตั้งแต่เริ่มต้น</translation>
 <translation id="8200772114523450471">ทำต่อ</translation>
+<translation id="8202097416529803614">ข้อมูลสรุปคำสั่งซื้อ</translation>
 <translation id="8209050860603202033">เปิดรูปภาพ</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> ต้องการเชื่อมต่อกับ:</translation>
 <translation id="8218346974737627104">ยืนยันการลงชื่อเข้าใช้</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">เปิดในหน้าต่างอื่น</translation>
 <translation id="8959122750345127698">ไม่สามารถเข้าถึงการนำทางได้: <ph name="URL" /></translation>
 <translation id="8979340629087822094">วันที่ผ่านมา</translation>
+<translation id="8981454092730389528">ส่วนควบคุมกิจกรรมของ Google</translation>
+<translation id="8986494364107987395">ส่งสถิติการใช้งานและรายงานข้อขัดข้องไปยัง Google โดยอัตโนมัติ</translation>
 <translation id="8987061207681586800">เปลี่ยน Chrome ในแบบคุณ</translation>
 <translation id="9019902583201351841">มีการจัดการโดยผู้ปกครอง</translation>
 <translation id="9020607083536754075">ปิดแท็บปัจจุบันและกลับไปที่แอปก่อนหน้า</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
index 412df83..d894c4e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220"><ph name="TARGET_LANGUAGE" /> diline çevrildi.</translation>
 <translation id="1749561566933687563">Yer işaretlerinizi senkronize edin</translation>
 <translation id="17513872634828108">Açık sekmeler</translation>
+<translation id="1756600373018374892">Sekmelerinize hızlı bir şekilde erişmek için bu düğmeye dokunun.</translation>
 <translation id="1807246157184219062">Açık</translation>
 <translation id="1825719650605518411">İlk Çalıştırma Deneyimi</translation>
 <translation id="1829244130665387512">Sayfada bul</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587"><ph name="BEGIN_LINK" />Android Ayarları<ph name="END_LINK" />'nda Chrome için izni açın.</translation>
 <translation id="1943432128510653496">Şifreleri kaydetme</translation>
 <translation id="1944384637046898011"><ph name="TIME" /> itibariyle tüm Google şifrelerini şifrele</translation>
+<translation id="1946005195648379376">Google'ın, Arama ve diğer Google hizmetlerini kişiselleştirmek için tarama geçmişinizi nasıl kullanacağını kontrol edin.</translation>
 <translation id="1959930595721737608">Aşağıdaki sitede JavaScript'e izin verin.</translation>
 <translation id="1966710179511230534">Lütfen oturum açma ayrıntılarınızı güncelleyin.</translation>
 <translation id="1974060860693918893">Gelişmiş</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, web uygulaması. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Hassaslaştır</translation>
 <translation id="2315043854645842844">İstemci tarafı sertifika seçimi, işletim sistemi tarafından desteklenmiyor.</translation>
-<translation id="2316129865977710310">Hayır, teşekkürler</translation>
 <translation id="2321958826496381788">Bu yazıyı rahatça okuyana kadar kaydırma çubuğunu sürükleyin. Bir paragrafa iki kez hafifçe dokunduğunuzda metin en az bunun kadar büyük görünmelidir.</translation>
-<translation id="2329597144923131178">Yer işaretlerinize, geçmişinize ve diğer ayarlarınıza tüm cihazlarınızdan erişmek için oturum açın.</translation>
 <translation id="2343328333327081434">Yükleniyor…</translation>
 <translation id="2351097562818989364">Çeviri ayarlarınız sıfırlandı.</translation>
 <translation id="2359808026110333948">Devam Et</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Ana klasör</translation>
 <translation id="2870560284913253234">Site</translation>
 <translation id="2888126860611144412">Chrome hakkında</translation>
+<translation id="2889768325388591707">Sekmeler arasında hızla geçiş yapın</translation>
 <translation id="2891154217021530873">Sayfa yüklemeyi durdur</translation>
 <translation id="2902702728133930130">Chrome başlatılırken beklenmeyen bir hata yüzünden başarısız oldu.</translation>
 <translation id="2903493209154104877">Adresler</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Gizli sekmede aç</translation>
 <translation id="3090193911106258841">Ses ve video girişlerine erişiliyor</translation>
 <translation id="3137521801621304719">Gizli moddan çık</translation>
+<translation id="3149891296864842641">Gönderim seçeneği</translation>
+<translation id="3162882791484435636">Gönderim seçeneğini belirleyin</translation>
+<translation id="3173438333156928404">Ödeme işlenirken hata oluştu</translation>
 <translation id="3177909033752230686">Sayfanın Dili:</translation>
 <translation id="3190152372525844641"><ph name="BEGIN_LINK" />Android Ayarları<ph name="END_LINK" />'nda Chrome için izinleri açın.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> depolanmış veri</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Bu siteye ait şifrenizin <ph name="PASSWORD_MANAGER_BRAND" /> tarafından güncellenmesini ister misiniz?</translation>
 <translation id="4881695831933465202">Aç</translation>
 <translation id="4885273946141277891">Desteklenmeyen sayıda Chrome örneği var.</translation>
+<translation id="4923459931733593730">Ödeme</translation>
 <translation id="4943872375798546930">Sonuç yok</translation>
-<translation id="4970484396410298643">Bilgisayarınızda açtığınız sekmelere doğrudan buradan erişin.
- 
-Bunun için bilgisayarınızda Chrome'u açmanız ve menüye gidip "Chrome'da oturum aç…" seçeneğini belirlemeniz yeterlidir.</translation>
 <translation id="497421865427891073">İlerle</translation>
 <translation id="4996978546172906250">Paylaşım yöntemi:</translation>
 <translation id="5000922062037820727">Engellendi (önerilir)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Chrome'da aç</translation>
 <translation id="5199929503336119739">İş profili</translation>
 <translation id="5210365745912300556">Sekmeyi kapat</translation>
-<translation id="5210714456814679336">Diğer cihazlardaki Chrome'da açtığınız sekmeler burada görünür.</translation>
 <translation id="5222676887888702881">Çıkış</translation>
-<translation id="5228579091201413441">Senkronizasyonu etkinleştir</translation>
 <translation id="5233638681132016545">Yeni sekme</translation>
 <translation id="5271967389191913893">Cihaz, indirilecek içeriği açamıyor.</translation>
 <translation id="5275558766013849309">Sekmeler son kullanılan uygulamalarla birlikte görüntülenecek.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Engellenenler</translation>
 <translation id="5684874026226664614">Hata! Bu sayfa çevrilemedi.</translation>
 <translation id="5708031556037168012">Mevcut verileri cihazınızda tutun ve verileri kalıcı olarak <ph name="TO_ACCOUNT" /> hesabına aktarın.</translation>
-<translation id="5712189971979076230">Bir kilitlenme yaşadığınızda çalışan dosyalarla, uygulamalarla ve hizmetlerle ilgili bilgileri Google'a göndererek, üzerinde çalışmamız gereken özellikler ve iyileştirmelerle ilgili öncelikleri belirlememize yardım edin.
-
-Kullanım istatistikleri; tercihler, tıklanan düğmeler ve bellek kullanımı gibi bilgileri içerir. Web sayfası URL'lerini veya hiçbir kişisel bilgiyi içermez. Kilitlenme raporları, kilitlenme sırasında geçerli olan sistem bilgilerini kapsar ve kilitlenme sırasında olanlara bağlı olarak web sayfası URL'lerini veya kişisel bilgilerinizi içerebilir.</translation>
 <translation id="5719837394786370183">Gizli sekmelerde görüntülediğiniz sayfalar, gizli sekmelerinizin tamamını kapattıktan sonra tarayıcı geçmişinizde, çerez deponuzda veya arama geçmişinizde kalmaz. İndirdiğiniz dosyalar veya oluşturduğunuz yer işaretleri saklanır.
 
 Yine de, görünmez olmazsınız. Gizli moda geçmeniz web'de yaptıklarınızı işvereninizden, İnternet servis sağlayıcınızdan veya ziyaret ettiğiniz web sitelerinden saklamaz.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Yenile</translation>
 <translation id="7191430249889272776">Sekme arka planda açıldı.</translation>
 <translation id="7208788139759694678">Veri Tasarrufu devre dışı bırakıldı</translation>
+<translation id="7220786058474068424">İşleme koyuluyor</translation>
 <translation id="7243308994586599757">Sayfanın altına yakın bir yerde kullanılabilen seçenekler</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" />, yerel arama sonuçlarını göstermek için konumunuzu kullanır</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Yardım<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Seçimi iptal et</translation>
 <translation id="7851858861565204677">Diğer cihazlar</translation>
 <translation id="7876243839304621966">Tümünü kaldır</translation>
+<translation id="7902333740914687335">Ödeme işleme koyuldu</translation>
 <translation id="7947953824732555851">Kabul et ve oturum aç</translation>
 <translation id="7949961459945740081">En yeni özellikleri al</translation>
 <translation id="7963646190083259054">Firma:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">İçerik</translation>
 <translation id="8173098127580644436">en baştan</translation>
 <translation id="8200772114523450471">Sürdür</translation>
+<translation id="8202097416529803614">Sipariş özeti</translation>
 <translation id="8209050860603202033">Resmi aç</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> şuraya bağlanmak istiyor:</translation>
 <translation id="8218346974737627104">Oturum açmayı onaylayın</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Yeni pencerede aç</translation>
 <translation id="8959122750345127698">Gezinme işlevine ulaşılamıyor: <ph name="URL" /></translation>
 <translation id="8979340629087822094">son 1 gün</translation>
+<translation id="8981454092730389528">Google Etkinlik Kontrolleri</translation>
+<translation id="8986494364107987395">Kullanım istatistiklerini ve çökme raporlarını otomatik olarak Google'a gönder</translation>
 <translation id="8987061207681586800">Chrome'u size özel yapın</translation>
 <translation id="9019902583201351841">Ebeveynleriniz tarafından yönetiliyor</translation>
 <translation id="9020607083536754075">Geçerli sekmeyi kapat ve önceki uygulamaya geri dön</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
index f2e8dcf..3dff3af7 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Перекладено такою мовою: <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Синхронізуйте свої закладки</translation>
 <translation id="17513872634828108">Відкриті вкладки</translation>
+<translation id="1756600373018374892">Торкніться цієї кнопки, щоб отримати швидкий доступ до вкладок.</translation>
 <translation id="1807246157184219062">Світла</translation>
 <translation id="1825719650605518411">Перший запуск</translation>
 <translation id="1829244130665387512">Знайти на сторінці</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Увімкніть дозвіл для Chrome у <ph name="BEGIN_LINK" />налаштуваннях Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Зберігання паролів</translation>
 <translation id="1944384637046898011">Зашифрувати всі дані за допомогою пароля Google із <ph name="TIME" />.</translation>
+<translation id="1946005195648379376">Укажіть, як Google має використовувати вашу історію веб-перегляду, щоб персоналізувати Пошук та інші служби Google.</translation>
 <translation id="1959930595721737608">Дозволити JavaScript на цьому сайті.</translation>
 <translation id="1966710179511230534">Оновіть свої дані для входу.</translation>
 <translation id="1974060860693918893">Розширені</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966">Веб-додаток <ph name="APP_NAME" />: <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Уточнити</translation>
 <translation id="2315043854645842844">Операційна система не підтримує сертифікат, вибраний на стороні клієнта.</translation>
-<translation id="2316129865977710310">Ні, дякую</translation>
 <translation id="2321958826496381788">Перетягуйте повзунок, доки розмір тексту не стане зручним для читання. Якщо двічі торкнутись абзацу, розмір тексту має стати принаймні таким, як цей.</translation>
-<translation id="2329597144923131178">Увійдіть, щоб мати доступ до закладок, історії, паролів та інших налаштувань на всіх своїх пристроях.</translation>
 <translation id="2343328333327081434">Встановлення…</translation>
 <translation id="2351097562818989364">Налаштування перекладу скинуто.</translation>
 <translation id="2359808026110333948">Продовжити</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Батьківська папка</translation>
 <translation id="2870560284913253234">Сайт</translation>
 <translation id="2888126860611144412">Про Chrome</translation>
+<translation id="2889768325388591707">Швидко переходьте між вкладками</translation>
 <translation id="2891154217021530873">Припинити завантаження сторінки</translation>
 <translation id="2902702728133930130">Не вдалося запустити Chrome через неочікувану помилку.</translation>
 <translation id="2903493209154104877">Адреси</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Відкрити в анонімній вкладці</translation>
 <translation id="3090193911106258841">Отримання доступу до аудіо- й відеовходу</translation>
 <translation id="3137521801621304719">Вийти з режиму анонімного перегляду</translation>
+<translation id="3149891296864842641">Варіант доставки</translation>
+<translation id="3162882791484435636">Вибрати варіант доставки</translation>
+<translation id="3173438333156928404">Помилка під час обробки платежу</translation>
 <translation id="3177909033752230686">Мова сторінки:</translation>
 <translation id="3190152372525844641">Увімкніть дозволи для Chrome у <ph name="BEGIN_LINK" />налаштуваннях Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> збережених даних</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Оновити пароль для цього сайту в <ph name="PASSWORD_MANAGER_BRAND" />?</translation>
 <translation id="4881695831933465202">Відкрити</translation>
 <translation id="4885273946141277891">Забагато копій Chrome.</translation>
+<translation id="4923459931733593730">Оплата</translation>
 <translation id="4943872375798546930">Не знайдено жодного результату</translation>
-<translation id="4970484396410298643">Отримайте тут доступ до вкладок, відкритих на комп’ютері.
-
-Просто відкрийте Chrome на комп’ютері, перейдіть у меню та виберіть "Увійти в Chrome…"</translation>
 <translation id="497421865427891073">Перейти вперед</translation>
 <translation id="4996978546172906250">Надіслати через</translation>
 <translation id="5000922062037820727">Заблоковано (рекомендується)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Відкрити в Chrome</translation>
 <translation id="5199929503336119739">Робочий профіль</translation>
 <translation id="5210365745912300556">Закрити вкладку</translation>
-<translation id="5210714456814679336">Тут відображатимуться вкладки, відкриті в Chrome на інших пристроях.</translation>
 <translation id="5222676887888702881">Вийти</translation>
-<translation id="5228579091201413441">Увімкнути синхронізацію</translation>
 <translation id="5233638681132016545">Нова вкладка</translation>
 <translation id="5271967389191913893">Вміст, який ви хочете завантажити, не можна відкрити на цьому пристрої.</translation>
 <translation id="5275558766013849309">Вкладки відображатимуться разом із нещодавно відкритими додатками.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Заблоковано</translation>
 <translation id="5684874026226664614">На жаль, цю сторінку неможливо перекласти.</translation>
 <translation id="5708031556037168012">Залишити наявні дані на пристрої та назавжди імпортувати їх в обліковий запис <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Допоможіть нам визначити, що слід покращити, надсилаючи в Google інформацію про файли, додатки та сервіси, які працювали на момент аварійного завершення роботи.
-
-Статистика використання містить дані про налаштування, натискання кнопок і використання пам’яті. Вона не включає URL-адреси веб-сторінок або особисту інформацію. Звіти про аварійне завершення роботи містять дані про систему на момент збою та можуть включати URL-адреси веб-сторінок або особисту інформацію – залежно від активності на момент аварійного завершення роботи.</translation>
 <translation id="5719837394786370183">Сторінки, які ви переглядаєте на анонімних вкладках, не реєструються в історії веб-переглядача чи історії пошуку та не залишають файлів cookie, коли ви закриваєте всі анонімні вкладки. Усі завантажені файли чи створені закладки зберігаються.
 
 Проте ви не можете сховати все. Навіть у режимі анонімного перегляду ваш роботодавець, постачальник послуг Інтернету чи адміністратори веб-сайтів, які ви відвідуєте, можуть бачити, що ви переглядаєте.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Оновити</translation>
 <translation id="7191430249889272776">Вкладку відкрито у фоновому режимі.</translation>
 <translation id="7208788139759694678">Заощадження трафіку вимкнено</translation>
+<translation id="7220786058474068424">Обробка</translation>
 <translation id="7243308994586599757">Опції можна знайти внизу екрана</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> використовує ваші геодані, щоб показувати результати місцевого пошуку</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Довідка<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Скасувати вибір</translation>
 <translation id="7851858861565204677">Інші пристрої</translation>
 <translation id="7876243839304621966">Видалити все</translation>
+<translation id="7902333740914687335">Оплату оброблено</translation>
 <translation id="7947953824732555851">Прийняти й увійти</translation>
 <translation id="7949961459945740081">Завантажити найновіші функції</translation>
 <translation id="7963646190083259054">Постачальник:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Вміст</translation>
 <translation id="8173098127580644436">весь період</translation>
 <translation id="8200772114523450471">Поновити</translation>
+<translation id="8202097416529803614">Підсумок замовлення</translation>
 <translation id="8209050860603202033">Відкрити зображення</translation>
 <translation id="8215250379351058554">Сайт <ph name="SITE" /> хоче під’єднатися до:</translation>
 <translation id="8218346974737627104">Підтвердити вхід</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Відкрити в іншому вікні</translation>
 <translation id="8959122750345127698">Веб-сторінка <ph name="URL" /> недоступна</translation>
 <translation id="8979340629087822094">останній день</translation>
+<translation id="8981454092730389528">Елементи керування активністю в продуктах Google</translation>
+<translation id="8986494364107987395">Автоматично надсилати статистику використання та звіти про аварійне завершення роботи в Google</translation>
 <translation id="8987061207681586800">Chrome саме для вас</translation>
 <translation id="9019902583201351841">Керується батьками</translation>
 <translation id="9020607083536754075">Закрити поточну вкладку й повернутися в попередній додаток</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
index 08937750..3b6d6bd 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">Đã được dịch sang <ph name="TARGET_LANGUAGE" />.</translation>
 <translation id="1749561566933687563">Đồng bộ hóa dấu trang của bạn</translation>
 <translation id="17513872634828108">Tab đang mở</translation>
+<translation id="1756600373018374892">Nhấn nút này để truy cập nhanh vào các tab của bạn.</translation>
 <translation id="1807246157184219062">Sáng</translation>
 <translation id="1825719650605518411">Trải nghiệm lần chạy đầu tiên</translation>
 <translation id="1829244130665387512">Tìm trong trang</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">Bật quyền cho Chrome trong <ph name="BEGIN_LINK" />Cài đặt Android<ph name="END_LINK" />.</translation>
 <translation id="1943432128510653496">Lưu mật khẩu</translation>
 <translation id="1944384637046898011">Mã hóa tất cả dữ liệu bằng mật khẩu Google kể từ <ph name="TIME" /></translation>
+<translation id="1946005195648379376">Kiểm soát cách Google sử dụng lịch sử duyệt web của bạn để cá nhân hóa Tìm kiếm và các dịch vụ khác của Google.</translation>
 <translation id="1959930595721737608">Cho phép Javascript trên trang web sau.</translation>
 <translation id="1966710179511230534">Vui lòng cập nhật chi tiết đăng nhập của bạn.</translation>
 <translation id="1974060860693918893">Nâng cao</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />, ứng dụng web. <ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">Tinh chỉnh</translation>
 <translation id="2315043854645842844">Lựa chọn chứng chỉ phía ứng dụng khách không được hệ điều hành hỗ trợ.</translation>
-<translation id="2316129865977710310">Không, cảm ơn</translation>
 <translation id="2321958826496381788">Kéo thanh trượt cho đến khi bạn có thể đọc nội dung này thoải mái. Chữ tối thiểu phải to như này sau khi bấm đúp vào một đoạn.</translation>
-<translation id="2329597144923131178">Đăng nhập để nhận dấu trang, lịch sử, mật khẩu và các cài đặt khác trên tất cả các thiết bị của bạn.</translation>
 <translation id="2343328333327081434">Đang cài đặt…</translation>
 <translation id="2351097562818989364">Đã đặt lại cài đặt dịch của bạn.</translation>
 <translation id="2359808026110333948">Tiếp tục</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">Thư mục gốc</translation>
 <translation id="2870560284913253234">Trang web</translation>
 <translation id="2888126860611144412">Giới thiệu Chrome</translation>
+<translation id="2889768325388591707">Chuyển đổi tab nhanh</translation>
 <translation id="2891154217021530873">Ngừng tải trang</translation>
 <translation id="2902702728133930130">Chrome khởi động không thành công với lỗi không mong muốn.</translation>
 <translation id="2903493209154104877">Địa chỉ</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">Mở bằng tab ẩn danh</translation>
 <translation id="3090193911106258841">Đang truy cập thiết bị đầu vào video và âm thanh</translation>
 <translation id="3137521801621304719">Thoát chế độ ẩn danh</translation>
+<translation id="3149891296864842641">Tùy chọn giao hàng</translation>
+<translation id="3162882791484435636">Chọn tùy chọn giao hàng</translation>
+<translation id="3173438333156928404">Đã xảy ra lỗi khi xử lý thanh toán</translation>
 <translation id="3177909033752230686">Ngôn ngữ trang:</translation>
 <translation id="3190152372525844641">Bật quyền cho Chrome trong <ph name="BEGIN_LINK" />Cài đặt Android<ph name="END_LINK" />.</translation>
 <translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> dữ liệu được lưu trữ</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">Bạn có muốn <ph name="PASSWORD_MANAGER_BRAND" /> cập nhật mật khẩu của mình cho trang web này không?</translation>
 <translation id="4881695831933465202">Mở</translation>
 <translation id="4885273946141277891">Số phiên bản Chrome không được hỗ trợ.</translation>
+<translation id="4923459931733593730">Thanh toán</translation>
 <translation id="4943872375798546930">Không tìm thấy kết quả nào</translation>
-<translation id="4970484396410298643">Truy cập các tab bạn đã mở trên máy tính của mình, ngay tại đây.
-
-Bạn chỉ cần mở Chrome trên máy tính của mình, chuyển tới menu và chọn "Đăng nhập vào Chrome…”</translation>
 <translation id="497421865427891073">Đi về phía trước</translation>
 <translation id="4996978546172906250">Chia sẻ qua</translation>
 <translation id="5000922062037820727">Bị chặn (được đề xuất)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">Mở trong Chrome</translation>
 <translation id="5199929503336119739">Hồ sơ công việc</translation>
 <translation id="5210365745912300556">Đóng tab</translation>
-<translation id="5210714456814679336">Tab mà bạn đã mở trong Chrome trên thiết bị khác sẽ xuất hiện tại đây.</translation>
 <translation id="5222676887888702881">Đăng xuất</translation>
-<translation id="5228579091201413441">Bật đồng bộ hóa</translation>
 <translation id="5233638681132016545">Tab mới</translation>
 <translation id="5271967389191913893">Thiết bị không thể mở nội dung được tải xuống.</translation>
 <translation id="5275558766013849309">Tab sẽ hoạt động cùng với các ứng dụng gần đây.</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">Bị chặn</translation>
 <translation id="5684874026226664614">Rất tiếc. Không thể dịch trang này.</translation>
 <translation id="5708031556037168012">Giữ lại dữ liệu hiện có trên thiết bị của bạn và nhập dữ liệu vĩnh viễn vào <ph name="TO_ACCOUNT" />.</translation>
-<translation id="5712189971979076230">Giúp chúng tôi ưu tiên các tính năng và cải tiến mà chúng tôi nên giải quyết bằng cách gửi cho Google thông tin về các tệp, ứng dụng và dịch vụ đang chạy bất cứ khi nào bạn gặp sự cố.
-
-Số liệu thống kê sử dụng bao gồm thông tin chẳng hạn như tùy chọn, số lần nhấp nút và mức sử dụng bộ nhớ. Số liệu này không bao gồm URL trang web hoặc bất kỳ thông tin cá nhân nào. Báo cáo sự cố chứa thông tin hệ thống tại thời điểm xảy ra sự cố và có thể bao gồm URL của trang web hoặc thông tin cá nhân tùy thuộc vào hiện tượng tại thời điểm xảy ra sự cố.</translation>
 <translation id="5719837394786370183">Trang mà bạn xem ở tab ẩn danh sẽ không bị lưu lại trong lịch sử của trình duyệt, kho cookie hoặc lịch sử tìm kiếm sau khi bạn đóng tất cả tab ẩn danh của bạn. Mọi tệp bạn tải xuống hoặc dấu trang bạn tạo sẽ được giữ nguyên.
 
 Tuy nhiên, bạn vẫn hiển thị. Truy cập ẩn danh sẽ không ẩn thao tác duyệt của bạn khỏi chủ lao động, nhà cung cấp dịch vụ Internet hoặc trang web bạn truy cập.</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">Làm mới</translation>
 <translation id="7191430249889272776">Tab được mở dưới nền.</translation>
 <translation id="7208788139759694678">Đã tắt Trình tiết kiệm dữ liệu</translation>
+<translation id="7220786058474068424">Đang xử lý</translation>
 <translation id="7243308994586599757">Có các tùy chọn ở gần cuối màn hình</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> sử dụng vị trí của bạn để hiển thị kết quả tìm kiếm địa phương</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />Trợ giúp<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">Hủy chọn</translation>
 <translation id="7851858861565204677">Thiết bị khác</translation>
 <translation id="7876243839304621966">Xóa tất cả</translation>
+<translation id="7902333740914687335">Đã xử lý thanh toán</translation>
 <translation id="7947953824732555851">Chấp nhận &amp; đăng nhập</translation>
 <translation id="7949961459945740081">Cập nhật tính năng mới nhất</translation>
 <translation id="7963646190083259054">Nhà cung cấp:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">Nội dung</translation>
 <translation id="8173098127580644436">mọi thứ</translation>
 <translation id="8200772114523450471">Tiếp tục</translation>
+<translation id="8202097416529803614">Tóm tắt đơn đặt hàng</translation>
 <translation id="8209050860603202033">Mở ảnh</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> muốn kết nối với:</translation>
 <translation id="8218346974737627104">Xác nhận đăng nhập</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">Mở trong cửa sổ khác</translation>
 <translation id="8959122750345127698">Không thể tiếp cận điều hướng: <ph name="URL" /></translation>
 <translation id="8979340629087822094">ngày trước</translation>
+<translation id="8981454092730389528">Điều khiển hoạt động của Google</translation>
+<translation id="8986494364107987395">Tự động gửi số liệu thống kê về việc sử dụng và báo cáo sự cố cho Google</translation>
 <translation id="8987061207681586800">Tùy chỉnh riêng Chrome</translation>
 <translation id="9019902583201351841">Do cha mẹ của bạn quản lý</translation>
 <translation id="9020607083536754075">Đóng tab hiện tại và quay lại ứng dụng trước</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
index b86f1b5..86d3281 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">已翻译成<ph name="TARGET_LANGUAGE" />。</translation>
 <translation id="1749561566933687563">同步您的书签</translation>
 <translation id="17513872634828108">目前打开的标签页</translation>
+<translation id="1756600373018374892">点按此按钮即可快速访问您的标签页。</translation>
 <translation id="1807246157184219062">浅色调</translation>
 <translation id="1825719650605518411">首次运行体验</translation>
 <translation id="1829244130665387512">在网页中查找</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">在 <ph name="BEGIN_LINK" />Android 设置<ph name="END_LINK" />中为 Chrome 启用这项权限。</translation>
 <translation id="1943432128510653496">保存密码</translation>
 <translation id="1944384637046898011">自 <ph name="TIME" />起,使用 Google 密码加密所有数据</translation>
+<translation id="1946005195648379376">控制 Google 如何使用您的浏览记录对 Google 搜索和其他 Google 服务进行个性化设置。</translation>
 <translation id="1959930595721737608">在以下网站上允许 JavaScript。</translation>
 <translation id="1966710179511230534">请更新您的登录详细信息。</translation>
 <translation id="1974060860693918893">高级</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />,网络应用。<ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">优化</translation>
 <translation id="2315043854645842844">操作系统不支持选择客户端证书。</translation>
-<translation id="2316129865977710310">不用了,谢谢</translation>
 <translation id="2321958826496381788">拖动该滑块,将文字调整到适合您阅读的大小。点按两次某段落后,显示的文字至少应是这么大。</translation>
-<translation id="2329597144923131178">登录后可获取您所有设备上保存的书签、历史记录、密码和其他设置。</translation>
 <translation id="2343328333327081434">正在安装…</translation>
 <translation id="2351097562818989364">您的翻译设置已重置。</translation>
 <translation id="2359808026110333948">继续</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">父文件夹</translation>
 <translation id="2870560284913253234">网站</translation>
 <translation id="2888126860611144412">关于 Chrome</translation>
+<translation id="2889768325388591707">快速切换标签页</translation>
 <translation id="2891154217021530873">停止加载网页</translation>
 <translation id="2902702728133930130">由于出现意外错误,Chrome 启动失败。</translation>
 <translation id="2903493209154104877">地址</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">在隐身标签页中打开</translation>
 <translation id="3090193911106258841">正在存取音频和视频输入</translation>
 <translation id="3137521801621304719">退出隐身模式</translation>
+<translation id="3149891296864842641">送货方式</translation>
+<translation id="3162882791484435636">选择送货方式</translation>
+<translation id="3173438333156928404">处理付款时出错</translation>
 <translation id="3177909033752230686">网页语言:</translation>
 <translation id="3190152372525844641">在 <ph name="BEGIN_LINK" />Android 设置<ph name="END_LINK" />中为 Chrome 启用这些权限。</translation>
 <translation id="3198916472715691905">已存储 <ph name="STORAGE_AMOUNT" /> 数据</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">要让<ph name="PASSWORD_MANAGER_BRAND" />更新您登录此网站时使用的密码吗?</translation>
 <translation id="4881695831933465202">打开</translation>
 <translation id="4885273946141277891">Chrome 实例数量已超出上限。</translation>
+<translation id="4923459931733593730">付款</translation>
 <translation id="4943872375798546930">找不到结果</translation>
-<translation id="4970484396410298643">您可以在此处直接访问计算机上打开的标签页。
-
-只需在计算机上打开 Chrome,点击菜单,然后选择“登录到 Chrome…”即可。</translation>
 <translation id="497421865427891073">前进</translation>
 <translation id="4996978546172906250">分享方式</translation>
 <translation id="5000922062037820727">已阻止(推荐)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">在 Chrome 中打开</translation>
 <translation id="5199929503336119739">工作资料</translation>
 <translation id="5210365745912300556">关闭标签页</translation>
-<translation id="5210714456814679336">您在其他设备上的 Chrome 中打开的标签页将列在此次。</translation>
 <translation id="5222676887888702881">退出</translation>
-<translation id="5228579091201413441">启用同步功能</translation>
 <translation id="5233638681132016545">打开新的标签页</translation>
 <translation id="5271967389191913893">设备无法打开要下载的内容。</translation>
 <translation id="5275558766013849309">标签页将与最近用过的应用一起显示。</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">已屏蔽</translation>
 <translation id="5684874026226664614">糟糕,此网页内容无法翻译。</translation>
 <translation id="5708031556037168012">将现有数据保留在您的设备上,并将这些数据永久导入到 <ph name="TO_ACCOUNT" />。</translation>
-<translation id="5712189971979076230">将发生崩溃时正在运行的文件、应用和服务的相关信息发送给 Google,协助我们确定应优先推出和改进哪些功能。
-
-使用情况统计信息包含偏好设置、按钮点击次数和内存使用情况之类的信息,但不包含网页网址或任何个人信息。崩溃报告包含发生崩溃时的系统信息,并可能包含网页网址或个人信息,具体取决于发生崩溃时的情况。</translation>
 <translation id="5719837394786370183">在您关闭所有隐身标签页后,您在这些标签页中查看的网页不会在浏览器历史记录、Cookie 存储区或搜索记录中留下任何痕迹。不过,您下载的所有文件或创建的书签均会保留下来。
 
 但是,这并不意味着您能完全隐身。即使您进入隐身模式,您的雇主、互联网服务提供商和您访问的网站仍然能看到您的浏览活动。</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">刷新</translation>
 <translation id="7191430249889272776">标签页已在后台打开。</translation>
 <translation id="7208788139759694678">流量节省程序已停用</translation>
+<translation id="7220786058474068424">正在处理</translation>
 <translation id="7243308994586599757">选项在靠近屏幕底部的位置</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> 将根据您的位置信息显示本地搜索结果</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />帮助<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">取消选择</translation>
 <translation id="7851858861565204677">来自其他设备的同步</translation>
 <translation id="7876243839304621966">全部删除</translation>
+<translation id="7902333740914687335">付款已处理</translation>
 <translation id="7947953824732555851">接受并登录</translation>
 <translation id="7949961459945740081">获取最新功能</translation>
 <translation id="7963646190083259054">供应商:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">内容</translation>
 <translation id="8173098127580644436">自始至今</translation>
 <translation id="8200772114523450471">继续</translation>
+<translation id="8202097416529803614">订单摘要</translation>
 <translation id="8209050860603202033">打开图片</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> 想连接到:</translation>
 <translation id="8218346974737627104">确认登录</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">在其他窗口中打开</translation>
 <translation id="8959122750345127698">无法访问 <ph name="URL" /></translation>
 <translation id="8979340629087822094">过去 1 天</translation>
+<translation id="8981454092730389528">Google 活动控件</translation>
+<translation id="8986494364107987395">将使用情况统计信息和崩溃报告自动发送给 Google</translation>
 <translation id="8987061207681586800">定制自己专属的 Chrome</translation>
 <translation id="9019902583201351841">由您父母管理</translation>
 <translation id="9020607083536754075">关闭当前的标签页,并返回到之前的应用</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
index d569ef8..d6bc8b1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -60,6 +60,7 @@
 <translation id="1742134235943978220">已翻譯成<ph name="TARGET_LANGUAGE" />。</translation>
 <translation id="1749561566933687563">同步處理您的書籤</translation>
 <translation id="17513872634828108">開啟分頁</translation>
+<translation id="1756600373018374892">輕觸這個按鈕即可快速存取分頁。</translation>
 <translation id="1807246157184219062">淺色</translation>
 <translation id="1825719650605518411">初次使用體驗</translation>
 <translation id="1829244130665387512">在網頁中尋找</translation>
@@ -70,6 +71,7 @@
 <translation id="194341124344773587">請在 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中為 Chrome 啟用這項權限。</translation>
 <translation id="1943432128510653496">儲存密碼</translation>
 <translation id="1944384637046898011">使用截至 <ph name="TIME" />前設定的 Google 密碼為所有資料加密</translation>
+<translation id="1946005195648379376">控制 Google 如何使用您的瀏覽紀錄,為您提供個人化的搜尋服務和其他各項 Google 服務。</translation>
 <translation id="1959930595721737608">允許在下列網站上執行 JavaScript。</translation>
 <translation id="1966710179511230534">請更新您的登入詳細資料。</translation>
 <translation id="1974060860693918893">進階</translation>
@@ -95,9 +97,7 @@
 <translation id="2206488550163399966"><ph name="APP_NAME" />,網路應用程式。<ph name="APP_URL" /></translation>
 <translation id="2268044343513325586">修正搜尋</translation>
 <translation id="2315043854645842844">作業系統不允許您在用戶端選取憑證。</translation>
-<translation id="2316129865977710310">不,謝謝</translation>
 <translation id="2321958826496381788">拖曳滑桿,將文字調整到您可以舒適閱讀的大小。當您輕觸兩下文字段落,文字至少應呈現這樣的大小。</translation>
-<translation id="2329597144923131178">登入後,即可從您使用的任何裝置取得自己的書籤、歷史紀錄、密碼和其他設定。</translation>
 <translation id="2343328333327081434">安裝中…</translation>
 <translation id="2351097562818989364">您的翻譯設定已重設。</translation>
 <translation id="2359808026110333948">繼續</translation>
@@ -138,6 +138,7 @@
 <translation id="2842985007712546952">上層資料夾</translation>
 <translation id="2870560284913253234">網站</translation>
 <translation id="2888126860611144412">關於 Chrome</translation>
+<translation id="2889768325388591707">快速切換分頁</translation>
 <translation id="2891154217021530873">停止載入網頁</translation>
 <translation id="2902702728133930130">發生未預期的錯誤,Chrome 啟動失敗。</translation>
 <translation id="2903493209154104877">地址</translation>
@@ -155,6 +156,9 @@
 <translation id="3089395242580810162">在無痕式分頁中開啟</translation>
 <translation id="3090193911106258841">正在存取音訊和視訊輸入</translation>
 <translation id="3137521801621304719">離開無痕模式</translation>
+<translation id="3149891296864842641">運送方式</translation>
+<translation id="3162882791484435636">選取運送方式</translation>
+<translation id="3173438333156928404">處理付款時發生錯誤</translation>
 <translation id="3177909033752230686">網頁語言:</translation>
 <translation id="3190152372525844641">請在 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中為 Chrome 啟用這些權限。</translation>
 <translation id="3198916472715691905">儲存了 <ph name="STORAGE_AMOUNT" /> 的資料</translation>
@@ -269,10 +273,8 @@
 <translation id="4875622588773761625">您要讓 <ph name="PASSWORD_MANAGER_BRAND" /> 更新您在這個網站設定的密碼嗎?</translation>
 <translation id="4881695831933465202">開啟</translation>
 <translation id="4885273946141277891">Chrome 實例的數量已超出上限。</translation>
+<translation id="4923459931733593730">付款</translation>
 <translation id="4943872375798546930">沒有結果</translation>
-<translation id="4970484396410298643">您可以在這裡使用您在電腦上開啟的所有分頁。
-
-只需在電腦上開啟 Chrome、前往選單,然後選取 [登入 Chrome...] 即可。</translation>
 <translation id="497421865427891073">往前</translation>
 <translation id="4996978546172906250">分享方式:</translation>
 <translation id="5000922062037820727">已封鎖 (建議)</translation>
@@ -296,9 +298,7 @@
 <translation id="5184329579814168207">在 Chrome 中開啟</translation>
 <translation id="5199929503336119739">Work 設定檔</translation>
 <translation id="5210365745912300556">關閉分頁</translation>
-<translation id="5210714456814679336">這裡會顯示您在其他裝置上的 Chrome 中開啟的分頁。</translation>
 <translation id="5222676887888702881">登出</translation>
-<translation id="5228579091201413441">啟用同步功能</translation>
 <translation id="5233638681132016545">新增分頁</translation>
 <translation id="5271967389191913893">裝置無法開啟您要下載的這項內容。</translation>
 <translation id="5275558766013849309">分頁和最近使用的應用程式將會並列顯示。</translation>
@@ -342,9 +342,6 @@
 <translation id="5677928146339483299">已封鎖</translation>
 <translation id="5684874026226664614">糟糕!系統無法翻譯這個網頁的內容。</translation>
 <translation id="5708031556037168012">將現有的資料保留在您的裝置上,並且將資料永久匯入 <ph name="TO_ACCOUNT" />。</translation>
-<translation id="5712189971979076230">發生當機情形時,如果您將當下正在執行的檔案、應用程式和服務的相關資訊傳送給 Google,即可協助我們優先提供重要的功能與改進項目。
-
-使用統計資料包括偏好設定、按鈕點擊次數和記憶體使用量等資訊,不含網頁網址或任何個人資訊。當機報告則包括當機時的系統資訊;而且根據當機時發生的狀況,可能會包含網頁網址和個人資訊。</translation>
 <translation id="5719837394786370183">當您關閉所有無痕式分頁後,您在其中瀏覽的網頁都不會保留在瀏覽器紀錄、Cookie 儲存庫或搜尋紀錄中。不過,系統會將您下載的檔案或建立的書籤全部予以保留。
 
 然而,您並沒有因此隱形。使用無痕模式時,您的雇主和網際網路服務供應商仍然可以追蹤您的瀏覽紀錄,您所造訪的網站也可記錄您的瀏覽行為。</translation>
@@ -463,6 +460,7 @@
 <translation id="7180611975245234373">重新整理</translation>
 <translation id="7191430249889272776">已在背景開啟分頁。</translation>
 <translation id="7208788139759694678">已停用 Data Saver</translation>
+<translation id="7220786058474068424">處理中</translation>
 <translation id="7243308994586599757">選項在接近畫面底部的位置</translation>
 <translation id="7244362611678346589"><ph name="SEARCH_ENGINE_URL" /> 會使用您的位置資訊來顯示當地搜尋結果</translation>
 <translation id="7299441085833132046"><ph name="BEGIN_LINK" />說明<ph name="END_LINK" /></translation>
@@ -516,6 +514,7 @@
 <translation id="7846076177841592234">全部取消選取</translation>
 <translation id="7851858861565204677">其他裝置</translation>
 <translation id="7876243839304621966">全部移除</translation>
+<translation id="7902333740914687335">付款已處理完成</translation>
 <translation id="7947953824732555851">接受並登入</translation>
 <translation id="7949961459945740081">取得最新功能</translation>
 <translation id="7963646190083259054">供應商:</translation>
@@ -539,6 +538,7 @@
 <translation id="8168435359814927499">內容</translation>
 <translation id="8173098127580644436">不限時間</translation>
 <translation id="8200772114523450471">繼續</translation>
+<translation id="8202097416529803614">訂單摘要</translation>
 <translation id="8209050860603202033">開啟圖片</translation>
 <translation id="8215250379351058554"><ph name="SITE" /> 要求與以下裝置連線:</translation>
 <translation id="8218346974737627104">確認登入</translation>
@@ -595,6 +595,8 @@
 <translation id="8942627711005830162">在其他視窗中開啟</translation>
 <translation id="8959122750345127698">瀏覽的網址無法存取:<ph name="URL" /></translation>
 <translation id="8979340629087822094">過去 1 天</translation>
+<translation id="8981454092730389528">Google 活動控制項</translation>
+<translation id="8986494364107987395">自動傳送使用統計資料及當機報告給 Google</translation>
 <translation id="8987061207681586800">自訂您專屬的 Chrome</translation>
 <translation id="9019902583201351841">您的家長已停用這項功能</translation>
 <translation id="9020607083536754075">關閉目前的分頁並返回上一個應用程式</translation>
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index fef5ff3..7ad9cca1 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -375,7 +375,6 @@
   "java/src/org/chromium/chrome/browser/infobar/InfoBarContainer.java",
   "java/src/org/chromium/chrome/browser/infobar/InfoBarContainerLayout.java",
   "java/src/org/chromium/chrome/browser/infobar/InfoBarControlLayout.java",
-  "java/src/org/chromium/chrome/browser/infobar/InfoBarDualControlLayout.java",
   "java/src/org/chromium/chrome/browser/infobar/InfoBarLayout.java",
   "java/src/org/chromium/chrome/browser/infobar/InfoBarView.java",
   "java/src/org/chromium/chrome/browser/infobar/InfoBarWrapper.java",
@@ -579,6 +578,7 @@
   "java/src/org/chromium/chrome/browser/payments/ui/LineItem.java",
   "java/src/org/chromium/chrome/browser/payments/ui/PaymentInformation.java",
   "java/src/org/chromium/chrome/browser/payments/ui/PaymentOption.java",
+  "java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestSection.java",
   "java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java",
   "java/src/org/chromium/chrome/browser/payments/ui/SectionInformation.java",
   "java/src/org/chromium/chrome/browser/physicalweb/BitmapHttpRequest.java",
@@ -711,6 +711,8 @@
   "java/src/org/chromium/chrome/browser/push_messaging/PushMessagingServiceObserver.java",
   "java/src/org/chromium/chrome/browser/rappor/RapporServiceBridge.java",
   "java/src/org/chromium/chrome/browser/rlz/RevenueStats.java",
+  "java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingApiBridge.java",
+  "java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingApiHandler.java",
   "java/src/org/chromium/chrome/browser/search_engines/TemplateUrlService.java",
   "java/src/org/chromium/chrome/browser/services/AccountsChangedReceiver.java",
   "java/src/org/chromium/chrome/browser/services/AndroidEduAndChildAccountHelper.java",
@@ -890,6 +892,7 @@
   "java/src/org/chromium/chrome/browser/widget/BoundedLinearLayout.java",
   "java/src/org/chromium/chrome/browser/widget/ClipDrawableProgressBar.java",
   "java/src/org/chromium/chrome/browser/widget/ControlContainer.java",
+  "java/src/org/chromium/chrome/browser/widget/DualControlLayout.java",
   "java/src/org/chromium/chrome/browser/widget/EmptyAlertEditText.java",
   "java/src/org/chromium/chrome/browser/widget/FadingShadow.java",
   "java/src/org/chromium/chrome/browser/widget/FadingShadowView.java",
@@ -1057,7 +1060,6 @@
   "javatests/src/org/chromium/chrome/browser/incognito/IncognitoNotificationServiceTest.java",
   "javatests/src/org/chromium/chrome/browser/infobar/InfoBarContainerTest.java",
   "javatests/src/org/chromium/chrome/browser/infobar/InfoBarControlLayoutTest.java",
-  "javatests/src/org/chromium/chrome/browser/infobar/InfoBarDualControlLayoutTest.java",
   "javatests/src/org/chromium/chrome/browser/infobar/InfoBarTest.java",
   "javatests/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfobarTest.java",
   "javatests/src/org/chromium/chrome/browser/input/SelectPopupOtherContentViewTest.java",
@@ -1185,6 +1187,7 @@
   "javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenThemeColorTest.java",
   "javatests/src/org/chromium/chrome/browser/webapps/WebappUrlBarTest.java",
   "javatests/src/org/chromium/chrome/browser/webapps/WebappVisibilityTest.java",
+  "javatests/src/org/chromium/chrome/browser/widget/DualControlLayoutTest.java",
   "javatests/src/org/chromium/chrome/browser/widget/OverviewListLayoutTest.java",
   "javatests/src/org/chromium/chrome/browser/widget/RoundedIconGeneratorTest.java",
   "javatests/src/org/chromium/chrome/browser/widget/ToolbarProgressBarTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/physicalweb/ListUrlsActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/physicalweb/ListUrlsActivityTest.java
index bbba646..0d4fd822 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/physicalweb/ListUrlsActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/physicalweb/ListUrlsActivityTest.java
@@ -14,6 +14,7 @@
 import android.test.suitebuilder.annotation.SmallTest;
 import android.view.View;
 
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.test.util.browser.notifications.MockNotificationManagerProxy;
@@ -103,7 +104,9 @@
         assertEquals(URL, testContextWrapper.startedIntents.get(0).getDataString());
     }
 
+    // Onboarding tests are broken (see bug 608872)
     @SmallTest
+    @DisabledTest
     public void testUrlsListEmptyInOnboarding() {
         // In onboarding, we scan for nearby URLs but do not send them to the resolution service to
         // protect the user's privacy. This test checks that the URL list, which only displays
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/physicalweb/UrlManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/physicalweb/UrlManagerTest.java
index 791be56c..033b11ff 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/physicalweb/UrlManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/physicalweb/UrlManagerTest.java
@@ -10,6 +10,7 @@
 import android.test.InstrumentationTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.test.util.browser.notifications.MockNotificationManagerProxy;
 import org.chromium.chrome.test.util.browser.notifications.MockNotificationManagerProxy.NotificationEntry;
 
@@ -51,7 +52,9 @@
         mSharedPreferences.edit().putInt(PREF_PHYSICAL_WEB, PHYSICAL_WEB_ONBOARDING).apply();
     }
 
+    // Onboarding tests are broken (see bug 608872)
     @SmallTest
+    @DisabledTest
     public void testAddUrlWhileOnboardingMakesNotification() throws Exception {
         setOnboarding();
         ArrayList<PwsResult> results = new ArrayList<>();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferencesTest.java
index fbc47426..5480de31 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferencesTest.java
@@ -318,6 +318,8 @@
         });
     }
 
+    // TODO(finnur): Write test for Autoplay.
+
     /**
      * Tests that disabling cookies turns off the third-party cookie toggle.
      * @throws Exception
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarDualControlLayoutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/DualControlLayoutTest.java
similarity index 92%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarDualControlLayoutTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/widget/DualControlLayoutTest.java
index 592b7c2b..0c8cc5d8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarDualControlLayoutTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/DualControlLayoutTest.java
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.infobar;
+package org.chromium.chrome.browser.widget;
 
-import static org.chromium.chrome.browser.infobar.InfoBarDualControlLayout.ALIGN_APART;
-import static org.chromium.chrome.browser.infobar.InfoBarDualControlLayout.ALIGN_END;
-import static org.chromium.chrome.browser.infobar.InfoBarDualControlLayout.ALIGN_START;
+import static org.chromium.chrome.browser.widget.DualControlLayout.ALIGN_APART;
+import static org.chromium.chrome.browser.widget.DualControlLayout.ALIGN_END;
+import static org.chromium.chrome.browser.widget.DualControlLayout.ALIGN_START;
 
 import android.content.Context;
 import android.test.InstrumentationTestCase;
@@ -21,9 +21,9 @@
 import org.chromium.chrome.R;
 
 /**
- * Tests for InfoBarDualControlLayout.
+ * Tests for DualControlLayout.
  */
-public class InfoBarDualControlLayoutTest extends InstrumentationTestCase {
+public class DualControlLayoutTest extends InstrumentationTestCase {
     private static final int PRIMARY_HEIGHT = 16;
     private static final int SECONDARY_HEIGHT = 8;
     private static final int STACKED_MARGIN = 4;
@@ -61,7 +61,7 @@
 
     /** Lays out two controls that fit on the same line. */
     private void runLayoutTest(int alignment, boolean isRtl, boolean addSecondView) {
-        InfoBarDualControlLayout layout = new InfoBarDualControlLayout(mContext, null);
+        DualControlLayout layout = new DualControlLayout(mContext, null);
         layout.setAlignment(alignment);
         layout.setLayoutDirection(isRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
         layout.setLayoutParams(
@@ -157,7 +157,7 @@
 
     /** Runs a test where the controls don't fit on the same line. */
     private void runStackedLayoutTest(int alignment, boolean isRtl) {
-        InfoBarDualControlLayout layout = new InfoBarDualControlLayout(mContext, null);
+        DualControlLayout layout = new DualControlLayout(mContext, null);
         layout.setAlignment(alignment);
         layout.setStackedMargin(STACKED_MARGIN);
         layout.setLayoutDirection(isRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/remote/MediaUrlResolverTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/remote/MediaUrlResolverTest.java
index 1c5a7513..31b94637 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/media/remote/MediaUrlResolverTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/remote/MediaUrlResolverTest.java
@@ -42,7 +42,7 @@
     private static final String COOKIES_HEADER_NAME = "Cookies";
     private static final String CORS_HEADER_NAME = "Access-Control-Allow-Origin";
     private static final String RANGE_HEADER_NAME = "Range";
-    private static final String RANGE_HEADER_VALUE = "bytes: 0-65536";
+    private static final String RANGE_HEADER_VALUE = "bytes=0-65536";
 
     private static final String USER_AGENT_HEADER_NAME = "User-Agent";
     private static final String CHROMECAST_ORIGIN = "https://www.gstatic.com";
diff --git a/chrome/app/BUILD.gn b/chrome/app/BUILD.gn
index 76048f7..3461026 100644
--- a/chrome/app/BUILD.gn
+++ b/chrome/app/BUILD.gn
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/ui.gni")
 import("//mojo/public/mojo_application_manifest.gni")
 import("//tools/grit/grit_rule.gni")
 
@@ -50,7 +51,7 @@
     "java/res/values-uk/generated_resources.xml",
     "java/res/values-vi/generated_resources.xml",
     "java/res/values-zh-rCN/generated_resources.xml",
-    "java/res/values-zh-rTW/generated_resources.xml",
+    "java/res/values-zh/generated_resources.xml",
     "java/res/values/generated_resources.xml",
   ]
 }
@@ -340,7 +341,7 @@
   if (is_mac) {
     sources += [ "chrome_main_mac.mm" ]
 
-    deps += [ "//chrome:main_dll" ]
+    deps += [ "//chrome:chrome_framework" ]
   }
 
   if (is_win) {
@@ -366,25 +367,31 @@
   }
 }
 
-mojo_application_manifest("chrome_manifest") {
-  type = "exe"
-  application_name = "chrome"
-  source = "mojo/chrome_manifest.json"
-  base_manifest = "${root_out_dir}/content_browser_manifest.json"
-  base_deps = [ "//content/public/app:browser_manifest" ]
-}
+if (use_aura) {
+  mojo_application_manifest("chrome_manifest") {
+    type = "exe"
+    application_name = "chrome"
+    source = "mojo/chrome_manifest.json"
+    base_manifest = "${root_out_dir}/content_browser_manifest.json"
+    base_deps = [ "//content/public/app:browser_manifest" ]
+    deps = [
+      "//components/mus:manifest",
+    ]
+    packaged_applications = [ "mus" ]
+  }
 
-mojo_application_manifest("chrome_renderer_manifest") {
-  type = "exe"
-  application_name = "chrome_renderer"
-  source = "mojo/chrome_renderer_manifest.json"
-  base_manifest = "${root_out_dir}/content_renderer_manifest.json"
-  base_deps = [ "//content/public/app:renderer_manifest" ]
-}
+  mojo_application_manifest("chrome_renderer_manifest") {
+    type = "exe"
+    application_name = "chrome_renderer"
+    source = "mojo/chrome_renderer_manifest.json"
+    base_manifest = "${root_out_dir}/content_renderer_manifest.json"
+    base_deps = [ "//content/public/app:renderer_manifest" ]
+  }
 
-group("mojo_manifests") {
-  data_deps = [
-    ":chrome_manifest",
-    ":chrome_renderer_manifest",
-  ]
+  group("mojo_manifests") {
+    data_deps = [
+      ":chrome_manifest",
+      ":chrome_renderer_manifest",
+    ]
+  }
 }
diff --git a/chrome/app/OWNERS b/chrome/app/OWNERS
index 4ea929b..6e5dba8 100644
--- a/chrome/app/OWNERS
+++ b/chrome/app/OWNERS
@@ -16,9 +16,7 @@
 
 per-file media_router_strings.grdp*=apacible@chromium.org
 per-file media_router_strings.grdp*=imcheng@chromium.org
-per-file media_router_strings.grdp*=kmarshall@chromium.org
 per-file media_router_strings.grdp*=mfoltz@chromium.org
-per-file media_router_strings.grdp*=wez@chromium.org
 
 per-file settings*strings*=dbeam@chromium.org
 per-file settings*strings*=dpapad@chromium.org
diff --git a/chrome/app/android/chrome_main_delegate_android.cc b/chrome/app/android/chrome_main_delegate_android.cc
index 3f7d980..298a8f1 100644
--- a/chrome/app/android/chrome_main_delegate_android.cc
+++ b/chrome/app/android/chrome_main_delegate_android.cc
@@ -13,17 +13,15 @@
 #include "base/trace_event/trace_event.h"
 #include "chrome/browser/android/chrome_startup_flags.h"
 #include "chrome/browser/android/metrics/uma_utils.h"
-#include "chrome/browser/android/metrics/uma_utils.h"
+#include "chrome/browser/android/safe_browsing/safe_browsing_api_handler_bridge.h"
 #include "chrome/browser/media/android/remote/remote_media_player_manager.h"
 #include "components/policy/core/browser/android/android_combined_policy_provider.h"
+#include "components/safe_browsing_db/safe_browsing_api_handler.h"
 #include "components/startup_metric_utils/browser/startup_metric_utils.h"
 #include "content/browser/media/android/browser_media_player_manager.h"
 #include "content/public/browser/browser_main_runner.h"
 
-#if defined(SAFE_BROWSING_DB_REMOTE)
-#include "components/safe_browsing_db/safe_browsing_api_handler.h"
 using safe_browsing::SafeBrowsingApiHandler;
-#endif
 
 namespace {
 
@@ -44,10 +42,9 @@
 }
 
 bool ChromeMainDelegateAndroid::BasicStartupComplete(int* exit_code) {
-#if defined(SAFE_BROWSING_DB_REMOTE)
-  safe_browsing_api_handler_.reset(CreateSafeBrowsingApiHandler());
+  safe_browsing_api_handler_.reset(
+      new safe_browsing::SafeBrowsingApiHandlerBridge());
   SafeBrowsingApiHandler::SetInstance(safe_browsing_api_handler_.get());
-#endif
 
   policy::android::AndroidCombinedPolicyProvider::SetShouldWaitForPolicy(true);
   SetChromeSpecificCommandLineFlags();
@@ -107,14 +104,5 @@
 
 void ChromeMainDelegateAndroid::ProcessExiting(
     const std::string& process_type) {
-#if defined(SAFE_BROWSING_DB_REMOTE)
   SafeBrowsingApiHandler::SetInstance(nullptr);
-#endif
 }
-
-#if defined(SAFE_BROWSING_DB_REMOTE)
-SafeBrowsingApiHandler*
-ChromeMainDelegateAndroid::CreateSafeBrowsingApiHandler() {
-  return nullptr;
-}
-#endif
diff --git a/chrome/app/android/chrome_main_delegate_android.h b/chrome/app/android/chrome_main_delegate_android.h
index 6e68170e..caa45f4 100644
--- a/chrome/app/android/chrome_main_delegate_android.h
+++ b/chrome/app/android/chrome_main_delegate_android.h
@@ -31,17 +31,11 @@
       const content::MainFunctionParams& main_function_params) override;
   void ProcessExiting(const std::string& process_type) override;
 
-#if defined(SAFE_BROWSING_DB_REMOTE)
-  virtual safe_browsing::SafeBrowsingApiHandler* CreateSafeBrowsingApiHandler();
-#endif
-
  private:
   std::unique_ptr<content::BrowserMainRunner> browser_runner_;
 
-#if defined(SAFE_BROWSING_DB_REMOTE)
   std::unique_ptr<safe_browsing::SafeBrowsingApiHandler>
       safe_browsing_api_handler_;
-#endif
 
   DISALLOW_COPY_AND_ASSIGN(ChromeMainDelegateAndroid);
 };
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 4e1b2f6..cc7e587 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -128,7 +128,7 @@
       <output filename="java/res/values-uk/generated_resources.xml" lang="uk" type="android" context="android_java" />
       <output filename="java/res/values-vi/generated_resources.xml" lang="vi" type="android" context="android_java" />
       <output filename="java/res/values-zh-rCN/generated_resources.xml" lang="zh-CN" type="android" context="android_java" />
-      <output filename="java/res/values-zh-rTW/generated_resources.xml" lang="zh-TW" type="android" context="android_java" />
+      <output filename="java/res/values-zh/generated_resources.xml" lang="zh-TW" type="android" context="android_java" />
     </if>
   </outputs>
   <translations>
@@ -7524,7 +7524,7 @@
       <if expr="enable_extensions">
         <!-- Feedback Dialog -->
         <message name="IDS_FEEDBACK_REPORT_PAGE_TITLE" desc="Label showing the title of the page that will be reported">
-          Tell us what is happening.
+          Tell us what's happening.
         </message>
         <message name="IDS_FEEDBACK_REPORT_URL_LABEL" desc="Label showing the URL that will be reported">
           URL (optional):
@@ -7583,6 +7583,17 @@
         <message name="IDS_FEEDBACK_SYSINFO_PAGE_LOADING" desc="The message showing the status of the system information preview page that it is still loading">
           Loading...
         </message>
+
+        <!-- Feedback Dialog SRT Prompt -->
+        <message name="IDS_FEEDBACK_SRT_PROMPT_BODY" desc="Body text explaining what the Chrome Software Removal Tool is">
+          Is Chrome crashing, showing unusual startup pages, toolbars, or unexpected ads you can't get rid of, or otherwise changing your browsing experience? You may be able to fix the problem by running the Chrome Cleanup Tool.
+        </message>
+        <message name="IDS_FEEDBACK_SRT_PROMPT_ACCEPT_BUTTON" desc="Button which takes the user to the Chrome Software Removal Tool download page">
+          Download Chrome Cleanup Tool
+        </message>
+        <message name="IDS_FEEDBACK_SRT_PROMPT_DECLINE_BUTTON" desc="Button which declines a prompt and takes the user to the form for filing feedback">
+          Skip
+        </message>
       </if>
 
       <!-- Clear Browsing Data -->
@@ -13758,13 +13769,6 @@
           Don't show this again
         </message>
       </if>
-      <!-- People search strings -->
-      <message name="IDS_PEOPLE_SEARCH_ACTION_EMAIL_TOOLTIP" desc="Tooltip text for sending an email to the person in the result">
-        Email this person
-      </message>
-      <message name="IDS_PEOPLE_SEARCH_ACTION_CHAT_TOOLTIP" desc="Tooltip text for starting a chat with the person in the result">
-        Chat with this person
-      </message>
       <message name="IDS_LOCAL_DISCOVERY_REGISTER_CANCELED_ON_PRINTER" desc="Label for when registration is canceled on the printer side">
         Printer registration has been canceled.
       </message>
diff --git a/chrome/app/mojo/chrome_manifest.json b/chrome/app/mojo/chrome_manifest.json
index cd488366..9e727a2c 100644
--- a/chrome/app/mojo/chrome_manifest.json
+++ b/chrome/app/mojo/chrome_manifest.json
@@ -3,6 +3,9 @@
   "name": "exe:chrome",
   "display_name": "Chrome",
   "capabilities": {
+    "required": {
+      "*": { "classes": [ "app" ] }
+    },
     "provided": {
       "mash:launchable": [ "mash::mojom::Launchable" ]
     }
diff --git a/chrome/app/nibs/BookmarkBarFolderWindow.xib b/chrome/app/nibs/BookmarkBarFolderWindow.xib
index 77410d7..3eb58c5a 100644
--- a/chrome/app/nibs/BookmarkBarFolderWindow.xib
+++ b/chrome/app/nibs/BookmarkBarFolderWindow.xib
@@ -39,7 +39,7 @@
                                     <imageView id="106">
                                         <rect key="frame" x="215" y="1" width="48" height="20"/>
                                         <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
-                                        <imageCell key="cell" refusesFirstResponder="YES" alignment="left" image="menu_overflow_up" id="107"/>
+                                        <imageCell key="cell" refusesFirstResponder="YES" alignment="left" id="107"/>
                                     </imageView>
                                 </subviews>
                             </customView>
@@ -50,7 +50,7 @@
                                     <imageView id="103">
                                         <rect key="frame" x="215" y="1" width="48" height="20"/>
                                         <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
-                                        <imageCell key="cell" refusesFirstResponder="YES" alignment="left" image="menu_overflow_down" id="104"/>
+                                        <imageCell key="cell" refusesFirstResponder="YES" alignment="left" id="104"/>
                                     </imageView>
                                 </subviews>
                             </customView>
@@ -111,8 +111,4 @@
             </view>
         </window>
     </objects>
-    <resources>
-        <image name="menu_overflow_down" width="19" height="19"/>
-        <image name="menu_overflow_up" width="19" height="19"/>
-    </resources>
 </document>
diff --git a/chrome/app/nibs/FindBar.xib b/chrome/app/nibs/FindBar.xib
index 8f4a891..4c2e0f1a 100644
--- a/chrome/app/nibs/FindBar.xib
+++ b/chrome/app/nibs/FindBar.xib
@@ -43,7 +43,7 @@
                         <button id="3">
                             <rect key="frame" x="251" y="5" width="26" height="24"/>
                             <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
-                            <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="find_next_Template" imagePosition="overlaps" alignment="center" borderStyle="border" tag="1" imageScaling="proportionallyDown" inset="2" id="12" customClass="GradientButtonCell">
+                            <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" imagePosition="overlaps" alignment="center" borderStyle="border" tag="1" imageScaling="proportionallyDown" inset="2" id="12" customClass="GradientButtonCell">
                                 <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
                                 <font key="font" metaFont="system"/>
                             </buttonCell>
@@ -54,7 +54,7 @@
                         <button id="4">
                             <rect key="frame" x="228" y="5" width="24" height="24"/>
                             <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
-                            <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="find_prev_Template" imagePosition="only" alignment="center" borderStyle="border" tag="2" imageScaling="proportionallyDown" inset="2" id="11" customClass="GradientButtonCell">
+                            <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" imagePosition="only" alignment="center" borderStyle="border" tag="2" imageScaling="proportionallyDown" inset="2" id="11" customClass="GradientButtonCell">
                                 <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
                                 <font key="font" metaFont="system"/>
                             </buttonCell>
@@ -79,8 +79,4 @@
             </subviews>
         </customView>
     </objects>
-    <resources>
-        <image name="find_next_Template" width="128" height="128"/>
-        <image name="find_prev_Template" width="128" height="128"/>
-    </resources>
 </document>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb
index 19fbb01..daca2586 100644
--- a/chrome/app/resources/chromium_strings_fa.xtb
+++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -36,7 +36,7 @@
 <translation id="2158734852934720349">‏مجوزهای منبع باز سیستم عامل Chromium</translation>
 <translation id="2241627712206172106">‏اگر رایانه‌ای را به صورت مشترک استفاده می‌کنید، دوستان و خانواده می‌توانند به صورت جداگانه مرور کنند و Chromium را به صورتی که مایلند تنظیم کنند.</translation>
 <translation id="225614027745146050">خوش آمدید</translation>
-<translation id="2316129865977710310">نه سپاسگزارم</translation>
+<translation id="2316129865977710310">نه متشکرم</translation>
 <translation id="2347108572062610441">‏این افزونه، صفحه‌ای را تغییر داده است که هنگام راه‌اندازی Chromium نشان داده می‌شود.</translation>
 <translation id="2372704305038231957">‏ممکن است Chromium ‏۳۲ بیتی عملکرد درستی نداشته باشد زیرا دیگر در این سیستم Linux پشتیبانی نمی‌شود. لطفاً به Chromium ‏۶۴ بیتی ارتقا دهید.</translation>
 <translation id="2389622953163669926">{NUM_DOWNLOAD,plural, =1{‏در حال حاضر یک بارگیری در حال انجام است. آیا می‌خواهید بارگیری را لغو کنید و از Chromium خارج شوید؟}one{‏در حال حاضر # بارگیری در حال انجام است. آیا می‌خواهید بارگیری را لغو کنید و از Chromium خارج شوید؟}other{‏در حال حاضر # بارگیری در حال انجام است. آیا می‌خواهید بارگیری‌ها را لغو کنید و از Chromium خارج شوید؟}}</translation>
@@ -180,7 +180,7 @@
 <translation id="7419987137528340081">‏اگر ترجیح می‌دهید داده‌های Chromium خود را جدا نگهدارید، می‌توانید برای <ph name="USER_NAME" />، کاربر Chromium جدیدی ایجاد کنید.</translation>
 <translation id="7421823331379285070">‏Chromium به Windows XP یا نسخه بالاتر آن نیاز دارد. برخی از ویژگی‌ها ممکن است کار نکند.</translation>
 <translation id="7463979740390522693">‏Chromium - اعلان‌ها (<ph name="QUANTITY" /> خوانده نشده)</translation>
-<translation id="7473891865547856676">نه سپاسگزارم</translation>
+<translation id="7473891865547856676">نه متشکرم</translation>
 <translation id="7483335560992089831">‏نمی‌توانید Chromium دارای نسخه مشابه با نسخه در حال اجرا را نصب کنید. لطفاً Chromium را ببندید و دوباره سعی کنید.</translation>
 <translation id="750717762378961310">‏این فایل مخرب است و Chromium آن را مسدود کرده است.</translation>
 <translation id="7549178288319965365">‏درباره سیستم عامل Chromium </translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index d7270458..a3cbf30 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -251,6 +251,7 @@
       ለሁሉም የ<ph name="USER_DISPLAY_EMAIL" /> ተኳሃኝ መሣሪያዎች ብሉቱዝ የሚበራ እና አንዳንድ የሃርድዌር መረጃ ለGoogle እንደሚላክ ልብ ይበሉ። &lt;a&gt;ተጨማሪ ለመረዳት&lt;/a&gt;</translation>
 <translation id="13649080186077898">የራስ-ሙላ ቅንብሮችን ያቀናብሩ</translation>
 <translation id="1367951781824006909">ፋይል ይምረጡ</translation>
+<translation id="136802136832547685">ወደዚህ መሣሪያ የሚታከሉ ምንም ክትትል የሚደረግባቸው ተጠቃሚዎች የሉም።</translation>
 <translation id="1368265273904755308">ችግር ሪፖርት ያድርጉ</translation>
 <translation id="1368832886055348810">ከግራ ወደ ቀኝ</translation>
 <translation id="1370646789215800222">ሰው ይወገድ?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">ፍለጋ </translation>
 <translation id="1384211230590313258">አገልግሎት ፈልጎ ማግኘት አስተናጋጅ</translation>
 <translation id="1386387014181100145">እንዴት ነው?</translation>
+<translation id="1386830813511981192">ከአንድ ሚሊዮን በላይ መተግበሪያዎች እና ጨዋታዎች አሁን በእርስዎ <ph name="DEVICE_TYPE" /> ላይ ይገኛሉ።</translation>
 <translation id="1389297115360905376">ይሄ ከ<ph name="CHROME_WEB_STORE" /> ብቻ ነው ሊታከል የሚችለው።</translation>
 <translation id="1390548061267426325">እንደ መደበኛ ትር ክፈት</translation>
 <translation id="1395262318152388157">የመፈለጊያ ተንሸራታች</translation>
@@ -893,6 +895,7 @@
 <translation id="2280486287150724112">የቀኝ ህዳግ</translation>
 <translation id="2282146716419988068">የጂፒዩ ሂደት</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">ለWebFonts ጭነት አዲስ የተጠቃሚ ወኪል ጣልቃ-ገብነት ስሪት።</translation>
 <translation id="2286454467119466181">ቀላል</translation>
 <translation id="2286950485307333924">አሁን በመለያ ወደ Chrome ገብተዋል</translation>
 <translation id="2287590536030307392">ሁሉንም ገመድ አልባ ግንኙነቶችን ያጥፉ።</translation>
@@ -1070,6 +1073,7 @@
 <translation id="2542049655219295786">Google ሠንጠረዥ</translation>
 <translation id="2546283357679194313">ኩኪዎች እና የጣቢያ ውሂብ</translation>
 <translation id="2549646943416322527">Seccomp ፈልጎ አግኝ</translation>
+<translation id="2550212893339833758">የተተካ ማህደረ ትውስታ</translation>
 <translation id="2553100941515833716">በእያንዳንዱ ዳግም ማስጀመር ላይ የመተግበሪያ አስጀማሪው ጭነት ሁነታ ዳግም ያስጀምሩት።</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> ከ<ph name="NETWORK_ID" /> ጋር ሊገናኝ አልቻለም። እባክዎ ሌላ አውታረ መረብ ይሞክሩ ወይም እንደገና ይሞክሩ።</translation>
 <translation id="2553440850688409052">ይህን ተሰኪ ደብቅ</translation>
@@ -1103,6 +1107,7 @@
 <translation id="2587203970400270934">የከዋኝ ኮድ፦</translation>
 <translation id="2587922270115112871">ክትትል የሚደረግበት ተጠቃሚ መፍጠር የGoogle መለያ አይፈጥርም፣ እና ቅንብሮቻቸው 
      እና ውሂባቸው በChrome አመሳስል በኩል እነሱን ተከትለው ወደ ሌላ መሣሪያ አይሄዱም። ክትትል የሚደረግበት ተጠቃሚ በዚህ መሳሪያ ላይ ብቻ ነው የሚሰራው።</translation>
+<translation id="2594049137847833442">አስፈላጊ የጣቢያዎች አማራጮች በግልጽ አሰሳ ውሂብ መገናኛ ውስጥ</translation>
 <translation id="2594056015203442344">ሲነቃ በትር ቅንጥቡ ላይ ያሉ የተሰሚ አመልካቾች እንደ የትር ተሰሚ ድምጸ-ከል መቆጣጠሪያዎች ሆነው ደርበው ይሰራሉ። ይሄ እንዲሁም በርካታ በተመረጡ ትሮች ላይ ድምጸ-ከል ለማድረግ በትር አውድ ምናሌው ላይ ትዕዛዞችን ያክላል።</translation>
 <translation id="259421303766146093">አታጉላ</translation>
 <translation id="2597852038534460976">Chrome የግድግዳ ወረቀቶችን መድረስ አይችልም። እባክዎ ከአውታረ መረብ ጋር ያገናኙ።</translation>
@@ -1470,7 +1475,6 @@
 <translation id="3065140616557457172">ለመፈለግ ይተይቡ ወይም ለመዳሰስ URL ያስገቡ - ሁሉም ነገር በትክክል ይሰራል።</translation>
 <translation id="3067198360141518313">ይህን ተሰኪ አሂድ</translation>
 <translation id="307519606911195071">በቅንብሮች ገጽ ውስጥ ተጨማሪ የተደራሽነት ባህሪያትን ያንቁ።</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> እንደ ክትትል የሚደረግበት ተጠቃሚ ሆኖ ተፈጥሯል!</translation>
 <translation id="3075874217500066906">የPowerwash ሂደቱን ለመጀመር ዳግም ማስጀመር ያስፈልጋል። ዳግም ከተጀመረ በኋላ መቀጠል እንደሚፈልጉ እንዲያረጋግጡ ይጠየቃሉ።</translation>
 <translation id="3076677906922146425">ማንም ሰው ግለሰብን ወደ Chrome እንዲያክል ይፍቀዱ</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1487,6 +1491,7 @@
 <translation id="3088034400796962477">በቋንቋ ፊደል መጻፍ (salam ← سلام)</translation>
 <translation id="3088325635286126843">እንደገና &amp;ሰይም...</translation>
 <translation id="308903551226753393">በራስ-ሰር ያዋቅሩ</translation>
+<translation id="3089231390674410424">በእርስዎ ምስክርነቶች ላይ ችግር ያለ ይመስላል። እባክዎ እርስዎ በአግባቡ የገቡ መሆንዎን ያረጋግጡና እንደገና ይሞክሩ።</translation>
 <translation id="3090819949319990166">ውጫዊ የcrx ፋይል ወደ <ph name="TEMP_CRX_FILE" /> መቅዳት አልተቻለም።</translation>
 <translation id="3090871774332213558">«<ph name="DEVICE_NAME" />» ተጣምሯል</translation>
 <translation id="3092544800441494315">ይህን ቅጽበታዊ ገጽ እይታን ያካትቱ፦</translation>
@@ -2014,7 +2019,6 @@
 <translation id="3790856258139356663">ለChrome Sync ፈታሽ አገልጋይ ያገናኛል</translation>
 <translation id="3790909017043401679">የሲም ካርድ ፒን ያስገቡ</translation>
 <translation id="3792890930871100565">አታሚዎችን ያላቅቁ</translation>
-<translation id="3795681127952030401"><ph name="URL" /> ማሳወቂያዎችን ለእርስዎ መላክ ይፈልጋል።</translation>
 <translation id="3796648294839530037">ተወዳጅ አውታረ መረቦች፦</translation>
 <translation id="3797900183766075808">«<ph name="SEARCH_TERMS" />»ን በ<ph name="SEARCH_ENGINE" /> ውስጥ &amp;ፈልግ</translation>
 <translation id="3798449238516105146">ስሪት</translation>
@@ -2486,6 +2490,7 @@
 <translation id="4552678318981539154">ተጨማሪ ማከማቻ ይግዙ</translation>
 <translation id="4554591392113183336">ውጫዊ ቅጥያው ከነባሩ ጋር ተመሳሳይ ወይም ያነሰ ስሪት ነው።</translation>
 <translation id="4554796861933393312">የቁስ ንድፍ Ink Drop እነማ ፍጥነት</translation>
+<translation id="4555670907822902621">ዕልባት የተደረጉ ገጾች ከመስመር ውጭ ለመመልከት ማስቀመጥን ያንቁ።</translation>
 <translation id="4555769855065597957">ጥላ</translation>
 <translation id="4556110439722119938">የእርስዎን ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች በሁሉም መሣሪያዎችዎ ላይ መጠቀም እንዲችሉ ከGoogle መለያዎ ጋር ይሰምራሉ</translation>
 <translation id="4557136421275541763">ማስጠንቀቂያ፦</translation>
@@ -2662,6 +2667,7 @@
 <translation id="4824518112777153488">ለተንዣባቢ ንቁ በእጅ ተነኪ ማያዎች ድጋፍ</translation>
 <translation id="4830573902900904548">የእርስዎ <ph name="DEVICE_TYPE" /> <ph name="NETWORK_NAME" />ን ተጠቅሞ ከበይነመረብ ጋር መገናኘት አልቻልም። እባክዎ ሌላ አውታረ መረብ ይምረጡ። <ph name="LEARN_MORE_LINK_START" />ተጨማሪ ለመረዳት<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">የ<ph name="ORGANIZATION" /> ማንነት <ph name="LOCALITY" /> ላይ በ<ph name="ISSUER" /> ተረጋግጧል። የሚሰራ የዕውቅና ማረጋገጫ መረጃ በአገልጋዩ ተሰጥቷል።</translation>
+<translation id="4832537345877333532">የicc ማሳያ ፋይሎችን ለማሳያ ቀለም መለካት ከQuirks Server ሰርስሮ ማውጣትን ያሰናክሉ።</translation>
 <translation id="4834912470034578916">ለድር ማሳወቂያዎች ብጁ አቀማመጦችን አንቃ።</translation>
 <translation id="4835836146030131423">በመግባት ጊዜ ስህተት።</translation>
 <translation id="4837926214103741331">ይህን መሣሪያ ለመጠቀም ስልጣን አልተሰጠዎትም። የመግባት ፍቃድ ለማግኘት የመሣሪያውን ባለቤት ያነጋግሩ።</translation>
@@ -2849,6 +2855,7 @@
 <translation id="5120421890733714118">ድር ጣቢያዎችን ለመለየት ይህን የእውቅና ማረጋገጫ ይመኑ።</translation>
 <translation id="5121130586824819730">ደረቅ አንጻፊዎ ሙሉ ነው። እባክዎ ሌላ ቦታ ላይ ያስቀምጡ ወይም ደረቅ አንጻፊው ላይ ቦታ ያስለቅቁ።</translation>
 <translation id="5125751979347152379">ልክ ያልሆነ URL።</translation>
+<translation id="5126663277159826272">Quirks Clientን ለማሳያ መለካት ያሰናክሉ።</translation>
 <translation id="5127881134400491887">የአውታረ መረብ ግንኙነቶች አቀናብር</translation>
 <translation id="5128590998814119508">የማሳያ ዝርዝር 2-ል ሸራ</translation>
 <translation id="512903556749061217">ተያያዟል</translation>
@@ -2990,9 +2997,11 @@
 <translation id="5301751748813680278">እንደ እንግዳ በመግባት ላይ።</translation>
 <translation id="5301954838959518834">እሺ፣ ገባኝ</translation>
 <translation id="5302048478445481009">ቋንቋ</translation>
+<translation id="5304039790201806037">የጠቋሚ ክስተቶች</translation>
 <translation id="5305688511332277257">ምንም አልተጫነም</translation>
 <translation id="5308380583665731573">ይገናኙ</translation>
 <translation id="5311260548612583999">የግል ቁልፍ ፋይል (ግድ ያይደል)፦</translation>
+<translation id="5313967007315987356">ጣቢያ አክል</translation>
 <translation id="5316588172263354223">በማንኛውም ጊዜ የድምጽ ፍለጋ</translation>
 <translation id="5316716239522500219">ማሳያዎችን አንጸባርቅ</translation>
 <translation id="5317780077021120954">አስቀምጥ</translation>
@@ -3295,6 +3304,7 @@
 <translation id="5734362860645681824">ተግባቦት</translation>
 <translation id="573719557377416048">Copresence ሁነታን አጽዳ</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />፦ አርትዕ ለማድረግ ይምረጡ</translation>
+<translation id="5741454054957165976">ለWebFonts ጭነት አዲስ የተጠቃሚ ወኪል ጣልቃ-ገብነት ስሪቱን ያንቁ።</translation>
 <translation id="574392208103952083">መካከለኛ</translation>
 <translation id="5745056705311424885">የUSB ማህደረ ትውስታ መሰኪያ ተገኝቷል</translation>
 <translation id="5746169159649715125">እንደ PDF አስቀምጥ</translation>
@@ -3343,7 +3353,6 @@
 <translation id="5803531701633845775">ጠቋሚውን ሳያንቀሳቅሱ ኋላ ካሉት ሐረጋት ውስጥ ይምረጡ</translation>
 <translation id="5804241973901381774">ፍቃዶች</translation>
 <translation id="580571955903695899">በርዕስ ቅደም ተከተል አስይዝ</translation>
-<translation id="5808982448801399019">ፈቀዳ አልተሳካም</translation>
 <translation id="580961539202306967">አንድ ጣቢያ የግፋ መልዕክቶችን ለመላክ ሲፈልግ ጠይቀኝ (የሚመከር)</translation>
 <translation id="5815645614496570556">X.400 አድራሻ</translation>
 <translation id="5817397429773072584">ባህላዊ ቻይንኛ</translation>
@@ -3368,6 +3377,7 @@
 <translation id="5834581999798853053"><ph name="TIME" /> ደቂቃዎች አካባቢ ቀርቷል</translation>
 <translation id="5838825566232597749">አሜሪካ ዎርክማን አለምአቀፍ</translation>
 <translation id="5839277899276241121">ክፍያ ከመጠየቂያ አድራሻ ጋር አንድ አይነት</translation>
+<translation id="5844550873065695788">ይሄ ቢያንስ <ph name="TOTAL_COUNT" /> ንጥሎችን ከዚህ መሣሪያ እስከመጨረሻው ይሰርዛል። ውሂብዎን በኋላ ላይ ሰርስረው ለማውጣት እንደ $2 ሆነው ወደ chrome ይግቡ።</translation>
 <translation id="5846929185714966548">ትር 4</translation>
 <translation id="5848934677402291689">ወደ PDF ማስቀመጥ በሂደት ላይ</translation>
 <translation id="5849335628409778954">ክሬዲት ካርድ ያስገቡ...</translation>
@@ -3613,6 +3623,7 @@
 <translation id="6232017090690406397">ባትሪ</translation>
 <translation id="6241530762627360640">ከስርዓትዎ ጋር ስለተጣመሩ የብሉቱዝ መሣሪያዎች ያለ መረጃ ይደርሳልና አቅራቢያ ያሉ የብሉቱዝ መሣሪያዎችን ያገኛል።</translation>
 <translation id="6243774244933267674">አገልጋይ አይገኝም</translation>
+<translation id="6246413617632217567">ክትትል የሚደረግበት ተጠቃሚን ማስመጣት አልተቻለም። እባክዎ የደረቅ አንጻፊዎ ቦታን እና ፈቃዶችን ያረጋግጡና እንደገና ይሞክሩ።</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">ማዘመኛ ዝግጁ ነው</translation>
 <translation id="6248400709929739064">የግርጌ ጽሑፎችን አንቃ</translation>
@@ -3641,6 +3652,7 @@
 <translation id="6277518330158259200">ቅጽበታዊ ገጽ እይታ ፎቶ አን&amp;ሳ</translation>
 <translation id="6279183038361895380">የእርስዎን ጠቋሚ ለማሳየት |<ph name="ACCELERATOR" />| ይጫኑ</translation>
 <translation id="6280215091796946657">በተለየ መለያ ይግቡ</translation>
+<translation id="6280912520669706465">ኤአርሲ</translation>
 <translation id="6281743458679673853">ሁሉም ኤፒአይዎች የአቀማመጥ መመልከቻውን እንዲያንጸባርቁ ሙከራ ያድርጉ። ይህ የwindow.scroll ባሕሪያት ከአቀማመጥ መመልከቻው ጋር ተዛማጅና ተመጣጣኝ እንዲሆኑ ያደርጋል።</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{በእርስዎ አውታረ መረብ ላይ ያለ አዲስ አታሚ}one{በእርስዎ አውታረ መረብ ላይ ያሉ አዲስ አታሚዎች}other{በእርስዎ አውታረ መረብ ላይ ያሉ አዲስ አታሚዎች}}</translation>
 <translation id="6285395082104474418">የሁኔታ ትሪው የአሁኑን የእርስዎ አውታረ መረብ፣ ባትሪ እና ሌሎች ነገሮች ሁኔታ ያሳየዎታል።</translation>
@@ -3696,6 +3708,7 @@
 <translation id="6380143666419481200">ይቀበሉ እና ይቀጥሉ</translation>
 <translation id="6380224340023442078">የይዘት ቅንብሮች …</translation>
 <translation id="6383194710567510941">የchrome.input.ime ኤፒአይ መጠቀምን ያንቁ።</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{ይህ ቢያንስ $1 ንጥል ከዚህ መሣሪያ ይሰርዛል። ውሂብዎን በኋላ ላይ ሰርስረው ለማውጣት እንደ $2 ሆነው ወደ chrome ይግቡ።}one{ይህ ቢያንስ $1 ንጥሎችን ከዚህ መሣሪያ ይሰርዛል። ውሂብዎን በኋላ ላይ ሰርስረው ለማውጣት እንደ $2 ሆነው ወደ chrome ይግቡ።}other{ይህ ቢያንስ $1 ንጥሎችን ከዚህ መሣሪያ ይሰርዛል። ውሂብዎን በኋላ ላይ ሰርስረው ለማውጣት እንደ $2 ሆነው ወደ chrome ይግቡ።}}</translation>
 <translation id="6384275966486438344">የፍለጋ ቅንብሮችዎን ወደሚከተለው ይለውጡ፦ <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">በዚህ መስኮት ውስጥ የሚመለከቷቸውን ገጾች በአሰሳ ታሪክዎ ላይ የማይታዩ ሲሆን ሁሉንም የተከፈቱ የእንግዳ መስኮቶችን ከዘጉ በኋላ እንደ ኩኪዎች ያሉ ሌሎች መከታተያዎች በእርስዎ ኮምፒውተር ላይ አይተዉም። ይሁንና ማንኛውም የሚያወርዷቸው ፋይሎች ይቀመጣሉ።</translation>
 <translation id="6391538222494443604">የግብአት ማውጫ መኖር ይኖርበታል።</translation>
@@ -3834,6 +3847,7 @@
 <translation id="6575134580692778371">አልተዋቀረም</translation>
 <translation id="6575251558004911012">አንድ ጣቢያ ካሜራዎን ለመድረስ ሲፈልግ ይጠይቅ (የሚመከር)</translation>
 <translation id="6579159469348633828">Brotli ይዘት-ምስጠራ።</translation>
+<translation id="6580151766480067746">የኤአርሲ ስሪት</translation>
 <translation id="6581162200855843583">Google Drive አገናኝ</translation>
 <translation id="6583070985841601920">እንደ <ph name="USER_EMAIL_ADDRESS" /> ሆነው ገብተዋል። ማመሳሰል በአስተዳዳሪዎ ተሰናክሏል።</translation>
 <translation id="65832705307647870">አዲሱን የትር ገጽ በተወዳጅ ጣቢያዎች ቅድሚያ ይሙሉ።</translation>
@@ -3999,6 +4013,7 @@
 <translation id="6847758263950452722">ገጽ እንደ ኤም ኤች ቲ ኤም ኤል አስቀምጥ</translation>
 <translation id="6853388645642883916">ማዘመኛ እያንቀላፋ ነው</translation>
 <translation id="68541483639528434">ሌሎች ትሮችን ዝጋ</translation>
+<translation id="6856701878604560493">የመስመር ውጭ ዕልባቶችን አንቃ</translation>
 <translation id="6860097299815761905">የተኪ ቅንብሮች...</translation>
 <translation id="6860427144121307915">በትር ውስጥ ክፈት</translation>
 <translation id="6862635236584086457">በዚህ አቃፊ ውስጥ የተቀመጡ ፋይሎች ሁሉ በራስ-ሰር መስመር ላይ መጠባበቂያ ይቀመጥላቸዋል</translation>
@@ -4173,6 +4188,7 @@
 <translation id="7092106376816104">የማይካተቱ ብቅ-ባዮች</translation>
 <translation id="7093866338626856921">ስማቸው እንደሚከተለው ከሆኑ መሣሪያዎች ጋር ውሂብ ተለዋወጥ፦ <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">ተጨማሪ ግሩም ባህሪያትን ማግኘት ይፈልጋሉ?</translation>
+<translation id="7096108453481049031">ክትትል የሚደረግበት ተጠቃሚን ማስመጣት አልተቻለም። እባክዎ የአውታረ መረብዎን ግንኙነት ይፈትሹና ቆይተው እንደገና ይሞክሩ።</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> ንጥሎች ተመርጠዋል</translation>
 <translation id="710227449793100220">የማስመሰያ ማሰር።</translation>
 <translation id="7106346894903675391">ተጨማሪ ማከማቻ ይግዙ...</translation>
@@ -4201,6 +4217,7 @@
 <translation id="713888829801648570">ይቅርታ፣ ከመስመር ውጪ ስለሆነ የይለፍ ቃልዎ ሊረጋገጥ አልቻለም።</translation>
 <translation id="7140928199327930795">ሌሎች የሚገኙ ምንም መሣሪያዎች የሉም።</translation>
 <translation id="7141105143012495934">የእርስዎ መለያ ዝርዝሮች ተመልሰው ሊገኙ ሳላልቻሉ መግባት አልተሳካም። እባክዎ የእርስዎን አስተዳዳሪ ያነጋግሩ ወይም እንደገና ይሞክሩ።</translation>
+<translation id="7141331524324591758">ለጠቋሚ ክስተቶች ኤፒአይ ከፊል የሙከራ ድጋፍን ያነቃል። ይሄ በድር ገንቢዎች ለመሞከር ብቻ የታሰበ ነው፣ አንዳንድ ድር ጣቢያዎች ሳያስታውቁ እንዲበላሹ ያደርጋል።</translation>
 <translation id="7143207342074048698">በመያያዝ ላይ</translation>
 <translation id="7144878232160441200">እንደገና ሞክር</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> ተሰናክሏል። እሱን ዳግም ለማንቃት እባክዎ ወደ <ph name="CHROME_PLUGINS_LINK" /> ይሂዱ።</translation>
@@ -4854,6 +4871,7 @@
 <translation id="8119572489781388874">ቅንብሮችን ቀይር</translation>
 <translation id="8119631488458759651">ይህን ጣቢያ አስወግድ</translation>
 <translation id="8121385576314601440">የሃንጉል ግቤት ቅንብሮች</translation>
+<translation id="8122245494004914423">ይሄ የአሰሳ ውሂብዎን ከዚህ መሣሪያ እስከመጨረሻው ይሰርዘዋል። ውሂብዎን በኋላ ላይ ሰርስረው ለማውጣት እንደ $2 ሆነው ወደ chrome ይግቡ።</translation>
 <translation id="8124313775439841391">የሚቀናበር ONC</translation>
 <translation id="8126844665673008223">የድር Bluetooth</translation>
 <translation id="8127322077195964840">ከአካባቢ አስተናጋጅ የተጫኑ ግብዓቶች የመጡ ልክ ያልሆኑ ምስክር ወረቀቶችን ፍቀድ።</translation>
@@ -4939,6 +4957,7 @@
 <translation id="8226742006292257240">ከታች በዘፈቀደ የመነጨ ለኮምፒውተርዎ የተመደበ የቲ ፒ ኤም ይለፍ ቃል ነው፦</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />፣ <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">በአሁኑ ጊዜ <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ላይ ያሉ አጥቂዎች በእርስዎ ኮምፒውተር ላይ መረጃዎን የሚሰርቁ ወይም የሚሰርዙ (ለምሳሌ፦ ፎቶዎች፣ የይለፍ ቃላት፣ መልዕክቶች እና ክሬዲት ካርዶች) አደገኛ ፕሮግራሞችን ለመጫን ሊሞክሩ ይችላሉ።የተቀመጡ</translation>
+<translation id="8233254008506535819">በአሰሳ ውሂብን አጽዳ መገናኛው ውስጥ አስፈላጊ ጣቢያዎችን በተፈቀደላቸው ዝርዝር ውስጥ የማካተት አማራጩን ያካትቱ።</translation>
 <translation id="8236231079192337250">ለአታሚ አንጻፊዎች የChrome የድር መደብር የሥነ ጥበብ ማዕከል መተግበሪያ</translation>
 <translation id="8238649969398088015">የእገዛ ጠቃሚ ምክር</translation>
 <translation id="8240697550402899963">ንቡር/ክላሲክ ገጽታ ተጠቀም</translation>
@@ -5263,7 +5282,6 @@
 <translation id="8708671767545720562">&amp;ተጨማሪ መረጃ</translation>
 <translation id="8711402221661888347">Pickles</translation>
 <translation id="8711453844311572806">የእርስዎ ስልክ ሲከፈት እና አጠገብ ከሆነ ለመግባት በቀላሉ ጠቅ ያድርጉ። አለበለዚያ የቁልፍ አዶ ይታየዎትና የይለፍ ቃልዎን መተየብ ይኖርብዎታል።</translation>
-<translation id="8712637175834984815">ገባኝ</translation>
 <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />የስርዓት መረጃ<ph name="END_LINK1" /> ላክ</translation>
 <translation id="8713979477561846077">በሚነካ ቁልፍ ሰሌዳ ላይ ሲተየብ የሚነካ ቁልፍ ሰሌዳ ራስ-ሰር ማረሚያን ለአሜሪካ ቁልፍ ሰሌዳ ያንቁ።</translation>
 <translation id="871476437400413057">Google ያስቀመጣቸው የይለፍ ቃሎች</translation>
@@ -5627,6 +5645,7 @@
 <translation id="952992212772159698">አልገበረም</translation>
 <translation id="953000875543358078">ይሄ አንድ ደቂቃ ገደማ ሊወስድ ይችላል</translation>
 <translation id="960987915827980018">1 ሰዓት አካባቢ ቀርቷል</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{ይሄ የ$1 ንጥሉን ለዘለዓለም ከዚህ መሣሪያ ይሰርዘዋል። ውሂብዎን በኋላ ላይ ሰርስረው ለማውጣት እንደ $2 ሆነው ወደ chrome ይግቡ።}one{ይሄ የ$1 ንጥሎቹን ለዘለዓለም ከዚህ መሣሪያ ይሰርዘዋል። ውሂብዎን በኋላ ላይ ሰርስረው ለማውጣት እንደ $2 ሆነው ወደ chrome ይግቡ።}other{ይሄ የ$1 ንጥሎቹን ለዘለዓለም ከዚህ መሣሪያ ይሰርዘዋል። ውሂብዎን በኋላ ላይ ሰርስረው ለማውጣት እንደ $2 ሆነው ወደ chrome ይግቡ።}}</translation>
 <translation id="96421021576709873">የWi-Fi አውታረ መረብ</translation>
 <translation id="965490406356730238">የተቀረጸ ክፍለ ገጸ ድር የሚገኝ ሲሆን በሃርድዌር የፈጠነ የmjpeg ምስጠራ መፍታትን ያንቁ።</translation>
 <translation id="968174221497644223">የመተግበሪያ መሸጎጫ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 8089ca4..235ef425 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -251,6 +251,7 @@
       لاحظ أنه سيتم تشغيل بلوتوث لجميع أجهزة <ph name="USER_DISPLAY_EMAIL" /> المتوافقة، وسيتم إرسال بعض معلومات الأجهزة إلى Google. &lt;a&gt;مزيد من المعلومات&lt;/a&gt;</translation>
 <translation id="13649080186077898">إدارة إعدادات الملء التلقائي</translation>
 <translation id="1367951781824006909">اختيار ملف</translation>
+<translation id="136802136832547685">ليس هناك مستخدمون تحت الإشراف لإضافتهم لهذا الجهاز.</translation>
 <translation id="1368265273904755308">الإبلاغ عن مشكلة</translation>
 <translation id="1368832886055348810">من اليسار لليمين</translation>
 <translation id="1370646789215800222">هل تريد إزالة شخص؟</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">البحث</translation>
 <translation id="1384211230590313258">معالج اكتشاف الخدمة</translation>
 <translation id="1386387014181100145">مرحبًا.</translation>
+<translation id="1386830813511981192">يتوفر أكثر من مليون تطبيق ولعبة الآن على <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">لا يمكن إضافة ذلك إلا من خلال <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">فتح كعلامة تبويب عادية</translation>
 <translation id="1395262318152388157">شريط تمرير البحث</translation>
@@ -893,6 +895,7 @@
 <translation id="2280486287150724112">الهامش الأيمن</translation>
 <translation id="2282146716419988068">‏معالجة وحدة معالجة الرسومات (GPU)</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">‏إصدار جديد متاح من تحميل تدخل وكيل المستخدم لـ WebFonts.</translation>
 <translation id="2286454467119466181">بسيطة</translation>
 <translation id="2286950485307333924">‏تم تسجيل دخولك الآن إلى Chrome</translation>
 <translation id="2287590536030307392">إيقاف جميع الاتصالات اللاسلكية.</translation>
@@ -1070,6 +1073,7 @@
 <translation id="2542049655219295786">‏جدول من Google</translation>
 <translation id="2546283357679194313">ملفات تعريف الارتباط وبيانات الموقع</translation>
 <translation id="2549646943416322527">‏أداة الكشف عن Seccomp</translation>
+<translation id="2550212893339833758">ذاكرة مساحة التبديل</translation>
 <translation id="2553100941515833716">‏إعادة تعيين حالة تثبيت Launcher تطبيقات عند كل إعادة تشغيل.</translation>
 <translation id="2553340429761841190">تعذر على <ph name="PRODUCT_NAME" /> الاتصال بـ <ph name="NETWORK_ID" />. الرجاء تحديد شبكة أخرى أو إعادة المحاولة.</translation>
 <translation id="2553440850688409052">إخفاء هذا المكون الإضافي</translation>
@@ -1102,6 +1106,7 @@
 <translation id="2585300050980572691">إعدادات البحث الافتراضية</translation>
 <translation id="2587203970400270934">رمز مشغل الشبكة:</translation>
 <translation id="2587922270115112871">‏لا يؤدي إنشاء مستخدم يخضع للإدارة إلى إنشاء حساب Google، ولن تنتقل الإعدادات والبيانات التابعة له إلى الأجهزة الأخرى التي تستخدم مزامنة Chrome. يسري المستخدم الذي يخضع للإدارة فقط على هذا الجهاز.</translation>
+<translation id="2594049137847833442">خيارات المواقع المهمة في مربع الحوار "محو بيانات التصفُّح"</translation>
 <translation id="2594056015203442344">عند تمكين هذه الخاصية، تتضاعف مؤشرات الصوت في شريط علامات التبويب بالإضافة إلى وحدات التحكم لكتم الصوت بعلامة التبويب . كما يضيف ذلك أيضًا الأوامر في قائمة سياق التبويب لسرعة كتم علامات التبويب المتعددة المختارة.</translation>
 <translation id="259421303766146093">تصغير</translation>
 <translation id="2597852038534460976">‏يتعذر على Chrome الدخول إلى الخلفيات. يُرجى الاتصال بالشبكة.</translation>
@@ -1469,7 +1474,6 @@
 <translation id="3065140616557457172">‏يمكنك طباعة كلمة أو عبارة للبحث  في الويب أو إدخال عنوان URL للتجوال بين صفحات الويب. الخيار لك.</translation>
 <translation id="3067198360141518313">تشغيل هذا المكون الإضافي</translation>
 <translation id="307519606911195071">تمكين ميزات إمكانية الوصول الإضافية في صفحة الإعدادات.</translation>
-<translation id="3075239840551149663">تمّ إنشاء <ph name="NEW_PROFILE_NAME" /> باعتباره مستخدمًا يخضع للإشراف!</translation>
 <translation id="3075874217500066906">يجب إعادة التشغيل لبدء عملية المحو الكامل. بعد إعادة التشغيل سيُطلب منك تأكيد أنك تريد المتابعة.</translation>
 <translation id="3076677906922146425">‏السماح لأي شخص بإضافة أحد الأشخاص إلى Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1486,6 +1490,7 @@
 <translation id="3088034400796962477">‏التحويل الصوتي (سلام ← salam)</translation>
 <translation id="3088325635286126843">إ&amp;عادة تسمية...</translation>
 <translation id="308903551226753393">التهيئة تلقائيًا</translation>
+<translation id="3089231390674410424">يبدو أن هناك مشكلة ما في بيانات الاعتماد. يُرجى التأكد من إدخالها بشكل صحيح وإعادة المحاولة.</translation>
 <translation id="3090819949319990166">‏لا يمكن نسخ ملف CRX الخارجي إلى <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">تم إقران "<ph name="DEVICE_NAME" />"</translation>
 <translation id="3092544800441494315">تضمين لقطة الشاشة هذه:</translation>
@@ -2010,7 +2015,6 @@
 <translation id="3790856258139356663">‏الاتصال بخادم الاختبار لمزامنة Chrome.</translation>
 <translation id="3790909017043401679">‏إدخال رقم التعريف الشخصي لبطاقة SIM</translation>
 <translation id="3792890930871100565">فصل الطابعات</translation>
-<translation id="3795681127952030401">يريد <ph name="URL" /> أن يرسل لك إشعارات.</translation>
 <translation id="3796648294839530037">الشبكات المفضلة:</translation>
 <translation id="3797900183766075808">&amp;بحث <ph name="SEARCH_ENGINE" /> عن "<ph name="SEARCH_TERMS" />"</translation>
 <translation id="3798449238516105146">الإصدار</translation>
@@ -2481,6 +2485,7 @@
 <translation id="4552678318981539154">شراء المزيد من السعة التخزينية</translation>
 <translation id="4554591392113183336">الإضافة الخارجية في نفس الإصدار أو إصدار أقل مقارنة بالموجودة حاليًا.</translation>
 <translation id="4554796861933393312">‏سرعة الصور المتحركة لـ Ink Drop للتصميم متعدد الأبعاد</translation>
+<translation id="4555670907822902621">تمكين حفظ الصفحات ذات الإشارات المرجعية للمشاهدة في وضع عدم الاتصال.</translation>
 <translation id="4555769855065597957">ظل</translation>
 <translation id="4556110439722119938">‏ستتم مزامنة الإشارات المرجعية والسجل وكلمات المرور والإعدادات الأخرى مع حسابك في Google لكي يتسنّى لك استخدامها على جميع أجهزتك</translation>
 <translation id="4557136421275541763">تحذير:</translation>
@@ -2656,6 +2661,7 @@
 <translation id="4824518112777153488">الدعم للشاشات التي تعمل باللمس ويمكن التمرير عليها</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> غير قادر على الاتصال بالإنترنت باستخدام <ph name="NETWORK_NAME" />. يُرجى اختيار شبكة أخرى. <ph name="LEARN_MORE_LINK_START" />مزيد من المعلومات<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">تم التحقق من هوية <ph name="ORGANIZATION" /> في <ph name="LOCALITY" /> بواسطة <ph name="ISSUER" />. تم التزويد بمعلومات شفافية الشهادة الصالحة من خلال الخادم.</translation>
+<translation id="4832537345877333532">‏تعطيل استرداد ملفات عرض icc من خادم Quirks لعرض معايرة الألوان.</translation>
 <translation id="4834912470034578916">تمكين تنسيقات مخصصة لإشعارات الويب.</translation>
 <translation id="4835836146030131423">حدث خطأ أثناء تسجيل الدخول.</translation>
 <translation id="4837926214103741331">لا يصرح لك باستخدام هذا الجهاز. يُرجى الاتصال بمالك الجهاز، للحصول على إذن تسجيل الدخول.</translation>
@@ -2842,6 +2848,7 @@
 <translation id="5120421890733714118">الوثوق بهذه الشهادة لتحديد هوية مواقع الويب.</translation>
 <translation id="5121130586824819730">القرص الصلب ممتلئ. الرجاء الحفظ في مكان آخر أو توفير مساحة أكبر على القرص الصلب.</translation>
 <translation id="5125751979347152379">‏عنوان URL غير صالح.</translation>
+<translation id="5126663277159826272">‏تعطيل برنامج Quirks لعرض المعايرة.</translation>
 <translation id="5127881134400491887">إدارة اتصالات الشبكة</translation>
 <translation id="5128590998814119508">ملء الشاشة ثنائي الأبعاد لقائمة العرض</translation>
 <translation id="512903556749061217">متصل</translation>
@@ -2983,9 +2990,11 @@
 <translation id="5301751748813680278">جارٍ تسجيل الدخول كضيف.</translation>
 <translation id="5301954838959518834">موافق وأعي ذلك</translation>
 <translation id="5302048478445481009">اللغة</translation>
+<translation id="5304039790201806037">أحداث المؤشر</translation>
 <translation id="5305688511332277257">لم يتم تثبيت أية شهادات</translation>
 <translation id="5308380583665731573">اتصال</translation>
 <translation id="5311260548612583999">ملف مفتاح خاص (اختياري):</translation>
+<translation id="5313967007315987356">إضافة موقع ويب</translation>
 <translation id="5316588172263354223">البحث الصوتي في أي وقت</translation>
 <translation id="5316716239522500219">نسخ الشاشات</translation>
 <translation id="5317780077021120954">حفظ</translation>
@@ -3288,6 +3297,7 @@
 <translation id="5734362860645681824">الاتصالات</translation>
 <translation id="573719557377416048">‏محو حالة Copresence</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: حدد للتعديل</translation>
+<translation id="5741454054957165976">‏تمكين الإصدار الجديد المتاح من تحميل تدخل وكيل المستخدم لـ WebFonts.</translation>
 <translation id="574392208103952083">متوسط</translation>
 <translation id="5745056705311424885">‏اكتشاف رقاقة ذاكرة USB</translation>
 <translation id="5746169159649715125">‏حفظ بتنسيق ملف PDF</translation>
@@ -3336,7 +3346,6 @@
 <translation id="5803531701633845775">اختر عبارات من الخلف، بدون نقل المؤشر</translation>
 <translation id="5804241973901381774">الأذونات</translation>
 <translation id="580571955903695899">إعادة الترتيب بحسب العنوان</translation>
-<translation id="5808982448801399019">إخفاق التفويض</translation>
 <translation id="580961539202306967">اسألني عندما يحاول موقع أن يرسل لي رسائل دفع (يُوصى به)</translation>
 <translation id="5815645614496570556">‏عنوان X.400</translation>
 <translation id="5817397429773072584">الصينية التقليدية</translation>
@@ -3361,6 +3370,7 @@
 <translation id="5834581999798853053">تتبقى <ph name="TIME" /> دقيقة تقريبًا</translation>
 <translation id="5838825566232597749">‏Workman الأمريكية الدولية</translation>
 <translation id="5839277899276241121">مثل عنوان إرسال الفواتير</translation>
+<translation id="5844550873065695788">‏سيؤدي هذا إلى حذف <ph name="TOTAL_COUNT" /> من العناصر على الأقل من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome باعتبارك ($2).</translation>
 <translation id="5846929185714966548">علامة التبويب 4</translation>
 <translation id="5848934677402291689">‏جارٍ الحفظ إلى PDF</translation>
 <translation id="5849335628409778954">أدخل بطاقة الائتمان...</translation>
@@ -3606,6 +3616,7 @@
 <translation id="6232017090690406397">البطارية</translation>
 <translation id="6241530762627360640">الوصول إلى معلومات حول أجهزة البلوتوث المقترنة بنظامك واكتشاف أجهزة البلوتوث القريبة.</translation>
 <translation id="6243774244933267674">الخادم غير متاح</translation>
+<translation id="6246413617632217567">تعذّر استيراد المستخدم تحت الإشراف. يُرجى التحقق من مساحة محرك الأقراص الثابتة والأذونات، وإعادة المحاولة.</translation>
 <translation id="6247708409970142803">%<ph name="PERCENTAGE" /></translation>
 <translation id="624789221780392884">التحديث جاهز</translation>
 <translation id="6248400709929739064">تمكين الترجمات المصاحبة</translation>
@@ -3634,6 +3645,7 @@
 <translation id="6277518330158259200">الت&amp;قاط لقطة شاشة</translation>
 <translation id="6279183038361895380">اضغط على |<ph name="ACCELERATOR" />| لعرض المؤشر</translation>
 <translation id="6280215091796946657">تسجيل الدخول باستخدام حساب مختلف</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">‏جرّب الحصول على جميع واجهات برمجة التطبيقات التي تعكس إطار عرض التنسيق. وهذا بدوره سيؤدي إلى جعل مواقع window.scroll ترتبط بإطار عرض التنسيق.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{طابعة جديدة على شبكتك}zero{طابعات جديدة على شبكتك}two{طابعتان جديدتان على شبكتك}few{طابعات جديدة على شبكتك}many{طابعات جديدة على شبكتك}other{طابعات جديدة على شبكتك}}</translation>
 <translation id="6285395082104474418">يوضح لك شريط الحالة حالة كل من الشبكة والبطارية وغير ذلك.</translation>
@@ -3689,6 +3701,7 @@
 <translation id="6380143666419481200">قبول ومتابعة</translation>
 <translation id="6380224340023442078">إعدادات المحتوى...</translation>
 <translation id="6383194710567510941">‏تمكين استخدام واجهة برمجة تطبيقات chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{‏سيؤدي هذا إلى حذف عنصر $1 على الأقل من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome باعتبارك ($2).}zero{‏سيؤدي هذا إلى حذف $1 عنصر على الأقل من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome باعتبارك ($2).}two{‏سيؤدي هذا إلى حذف عنصرين ($1) على الأقل من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome باعتبارك ($2).}few{‏سيؤدي هذا إلى حذف $1 عناصر على الأقل من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome باعتبارك ($2).}many{‏سيؤدي هذا إلى حذف $1 عنصرًا على الأقل من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome باعتبارك ($2).}other{‏سيؤدي هذا إلى حذف $1 عنصر على الأقل من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome باعتبارك ($2).}}</translation>
 <translation id="6384275966486438344">تغيير إعدادات البحث لـ: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">لن تُظهر الصفحات التي تعرضها في هذه النافذة في سجل المتصفح، ولن تترك أي آثار أخرى، مثل ملفات تعريف الارتباط، في الكمبيوتر بعد إغلاق جميع النوافذ المفتوحة بالضيف. ومع هذا سيتم الاحتفاظ بأي ملفات يتم تنزيلها.</translation>
 <translation id="6391538222494443604">يجب أن يكون دليل الإدخال موجودًا.</translation>
@@ -3827,6 +3840,7 @@
 <translation id="6575134580692778371">غير مهيأ</translation>
 <translation id="6575251558004911012">الرجوع إليك عندما يطلب أحد المواقع الدخول إلى الكاميرا (مستحسن)</translation>
 <translation id="6579159469348633828">‏ترميز المحتوى لـ Brotli</translation>
+<translation id="6580151766480067746">‏إصدار ARC</translation>
 <translation id="6581162200855843583">‏رابط Google Drive</translation>
 <translation id="6583070985841601920">تم تسجيل الدخول باعتبارك <ph name="USER_EMAIL_ADDRESS" />. عطّل المشرف ميزة المزامنة.</translation>
 <translation id="65832705307647870">تعبئة مسبقة لصفحة علامة تبويب جديدة بالمواقع الشائعة.</translation>
@@ -3992,6 +4006,7 @@
 <translation id="6847758263950452722">‏حفظ الصفحة كـ MHTML</translation>
 <translation id="6853388645642883916">خدمة التحديث خاملة</translation>
 <translation id="68541483639528434">إغلاق علامات التبويب الأخرى</translation>
+<translation id="6856701878604560493">تمكين الإشارات المرجعية في وضع عدم اتصال</translation>
 <translation id="6860097299815761905">إعدادات الخادم الوكيل...</translation>
 <translation id="6860427144121307915">فتح في علامة تبويب</translation>
 <translation id="6862635236584086457">جميع الملفات المحفوظة في هذا المجلد يتم الاحتفاظ بنسخة احتياطية منها تلقائيًا عبر الإنترنت</translation>
@@ -4166,6 +4181,7 @@
 <translation id="7092106376816104">استثناءات النوافذ المنبثقة</translation>
 <translation id="7093866338626856921">تبادل البيانات مع الأجهزة المسماه: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">هل تريد اكتشاف المزيد من الميزات الرائعة؟</translation>
+<translation id="7096108453481049031">تعذّر استيراد المستخدم تحت الإشراف. يُرجى التحقق من اتصال الشبكة وإعادة المحاولة لاحقًا.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> من العناصر المحددة</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">شراء المزيد من السعة التخزينية...</translation>
@@ -4194,6 +4210,7 @@
 <translation id="713888829801648570">عفوًا، لا يمكن التحقق من كلمة المرور لأنك في وضع عدم الاتصال.</translation>
 <translation id="7140928199327930795">لا توجد أجهزة أخرى متاحة.</translation>
 <translation id="7141105143012495934">فشل تسجيل الدخول، نظرًا لعدم القدرة على استرداد تفاصيل حسابك، يُرجى الاتصال بالمسؤول أو إعادة المحاولة.</translation>
+<translation id="7141331524324591758">تُمكّن الدعم التجريبي الجزئي لواجهة برمجة تطبيقات أحداث المؤشر. والهدف من ذلك هو الاختبار من جانب مطوري برامج الويب فقط، وسيؤدي هذا إلى حدوث عطل طفيف في بعض مواقع الويب.</translation>
 <translation id="7143207342074048698">اتصال</translation>
 <translation id="7144878232160441200">إعادة المحاولة</translation>
 <translation id="7148311641502571842">تم تعطيل <ph name="PLUGIN_NAME" />. لإعادة تمكينه، الرجاء الانتقال إلى <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4842,6 +4859,7 @@
 <translation id="8119572489781388874">تعديل الإعدادات</translation>
 <translation id="8119631488458759651">إزالة هذا الموقع</translation>
 <translation id="8121385576314601440">إعدادات الإدخال بالهانغولية</translation>
+<translation id="8122245494004914423">‏سيؤدي هذا إلى حذف بيانات التصفح من هذا الجهاز نهائيًا. ولاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome باعتبارك ($2).</translation>
 <translation id="8124313775439841391">‏ONC مُدار</translation>
 <translation id="8126844665673008223">بلوتوث الويب</translation>
 <translation id="8127322077195964840">السماح بالشهادات غير الصالحة للموارد التي تم تحميلها من المضيف المحلي.</translation>
@@ -4927,6 +4945,7 @@
 <translation id="8226742006292257240">‏في ما يلي كلمة مرور TPM التي تم إنشاؤها عشوائيًا والتي تم تخصيصها للكمبيوتر:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />، <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">قد يحاول المستهدفون الموجودون حاليًا على <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> تثبيت برامج خطيرة على جهاز الكمبيوتر التابع لك تسرق معلوماتك أو تحذفها (على سبيل المثال، الصور وكلمات المرور والرسائل وبطاقات الائتمان).</translation>
+<translation id="8233254008506535819">إدراج الخيار لإضافة المواقع المهمة إلى القائمة البيضاء في مربع الحوار "محو بيانات التصفُّح".</translation>
 <translation id="8236231079192337250">‏تطبيق معرض سوق Chrome الإلكتروني لبرامج تشغيل الطابعة</translation>
 <translation id="8238649969398088015">نصيحة مساعدة</translation>
 <translation id="8240697550402899963">استخدام مظهر كلاسيكي</translation>
@@ -5250,7 +5269,6 @@
 <translation id="8708671767545720562">&amp;مزيد من المعلومات</translation>
 <translation id="8711402221661888347">المخلل</translation>
 <translation id="8711453844311572806">عندما يكون هاتفك غير مقفل وقريب، انقر فقط للدخول. غير ذلك، سترى رمزًا مؤمّنًا وستحتاج إلى كتابة كلمة المرور.</translation>
-<translation id="8712637175834984815">تم</translation>
 <translation id="8713570323158206935">إرسال <ph name="BEGIN_LINK1" />معلومات النظام<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">‏إن التصحيح التلقائي في لوحة المفاتيح الفعلية يمكن تمكينه للوحة مفاتيح US، التي يمكنها تقديم اقتراحات أثناء الكتابة على لوحة المفاتيح الفعلية.</translation>
 <translation id="871476437400413057">‏كلمات مرور Google التي تم حفظها</translation>
@@ -5614,6 +5632,7 @@
 <translation id="952992212772159698">غير نشطة</translation>
 <translation id="953000875543358078">قد يستغرق ذلك فترة تصل إلى دقيقة أو نحو ذلك</translation>
 <translation id="960987915827980018">تتبقى ساعة واحدة تقريبًا</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{‏سيؤدي هذا إلى حذف عنصر $1 من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome باعتبارك ($2).}zero{‏سيؤدي هذا إلى حذف $1 عنصر من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome باعتبارك ($2).}two{‏سيؤدي هذا إلى حذف عنصرين ($1) من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome باعتبارك ($2).}few{‏سيؤدي هذا إلى حذف $1 عناصر من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome باعتبارك ($2).}many{‏سيؤدي هذا إلى حذف $1 عنصرًا من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome باعتبارك ($2).}other{‏سيؤدي هذا إلى حذف $1 عنصر من هذا الجهاز نهائيًا. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome باعتبارك ($2).}}</translation>
 <translation id="96421021576709873">‏شبكة Wi-Fi</translation>
 <translation id="965490406356730238">‏تمكين فك تشفير mjpeg للأجهزة المسرّعة وذلك للإطار الذي تم التقاطه حيثما توفر ذلك.</translation>
 <translation id="968174221497644223">ذاكرة التخزين المؤقت للتطبيق</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 3d77614..646b77a 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -251,6 +251,7 @@
         Обърнете внимание, че Bluetooth ще се включи за всички съвместими устройства на <ph name="USER_DISPLAY_EMAIL" /> и че до Google ще се изпраща определена информация за хардуера. &lt;a&gt;Научете повече&lt;/a&gt;</translation>
 <translation id="13649080186077898">Управление на настройките за автоматично попълване</translation>
 <translation id="1367951781824006909">Избор на файл</translation>
+<translation id="136802136832547685">Няма контролирани потребители, които да добавите към това устройство.</translation>
 <translation id="1368265273904755308">Подаване на сигнал за проблем</translation>
 <translation id="1368832886055348810">Отляво надясно</translation>
 <translation id="1370646789215800222">Да се премахне ли този човек?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Търсене</translation>
 <translation id="1384211230590313258">Обработка на откриването на услуги</translation>
 <translation id="1386387014181100145">Здравейте.</translation>
+<translation id="1386830813511981192">Вече имате достъп до над 1 милион приложения и игри на своя <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Това може да се добави само от <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Отваряне като нормален раздел</translation>
 <translation id="1395262318152388157">Плъзгач за търсене</translation>
@@ -889,6 +891,7 @@
 <translation id="2280486287150724112">Дясно поле</translation>
 <translation id="2282146716419988068">Процес на графичния процесор</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Нова версия на функцията за намеса на потребителския агент при зареждане на уеб шрифтове.</translation>
 <translation id="2286454467119466181">Опростено</translation>
 <translation id="2286950485307333924">Вече влязохте в Chrome</translation>
 <translation id="2287590536030307392">Изключване на всички безжични връзки.</translation>
@@ -1066,6 +1069,7 @@
 <translation id="2542049655219295786">Таблица в Google</translation>
 <translation id="2546283357679194313">„Бисквитки“ и данни за сайтове</translation>
 <translation id="2549646943416322527">Откриване на Seccomp</translation>
+<translation id="2550212893339833758">Резервна памет</translation>
 <translation id="2553100941515833716">Нулиране на състоянието на инсталиране на стартовия панел за приложения при всяко рестартиране.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> не успя да се свърже с: <ph name="NETWORK_ID" />. Моля, изберете друга мрежа или опитайте отново.</translation>
 <translation id="2553440850688409052">Скриване на тази приставка</translation>
@@ -1099,6 +1103,7 @@
 <translation id="2587203970400270934">Код на оператора:</translation>
 <translation id="2587922270115112871">Създаването на контролиран потребител не създава профил в Google и настройките
 и данните му няма да бъдат налични за него на други устройства чрез синхронизирането в Chrome. Контролираният потребител е валиден само за това устройство.</translation>
+<translation id="2594049137847833442">Опции за важните сайтове в диалоговия прозорец за изчистване на данните за сърфирането</translation>
 <translation id="2594056015203442344">При активиране аудиоиндикаторите в лентата с раздели служат и за спиране на звука на разделите. Също така в контекстното меню на разделите се добавят команди за бързо заглушаване на звука на няколко избрани раздела.</translation>
 <translation id="259421303766146093">Намаляване</translation>
 <translation id="2597852038534460976">Chrome няма достъп до тапетите. Моля, свържете се с мрежа.</translation>
@@ -1466,7 +1471,6 @@
 <translation id="3065140616557457172">Въведи за търсене или въведи URL адрес, за да навигирате - просто всичко работи.</translation>
 <translation id="3067198360141518313">Стартиране на тази приставка</translation>
 <translation id="307519606911195071">Активиране на допълнителните функции за достъпност на страницата „Настройки“.</translation>
-<translation id="3075239840551149663">Създадохте <ph name="NEW_PROFILE_NAME" /> като контролиран потребител!</translation>
 <translation id="3075874217500066906">За започването на Powerwash се изисква рестартиране. След това ще бъдете помолени да потвърдите, че искате да продължите.</translation>
 <translation id="3076677906922146425">Разрешаване на всички да добавят хора към Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1483,6 +1487,7 @@
 <translation id="3088034400796962477">Транслитерация (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Преименуване...</translation>
 <translation id="308903551226753393">Автоматично конфигуриране</translation>
+<translation id="3089231390674410424">Изглежда, че има проблем с данните ви за вход. Моля, уверете се, че сте влезли правилно, и опитайте отново.</translation>
 <translation id="3090819949319990166">Външният crx файл не може да се копира в/ъв „<ph name="TEMP_CRX_FILE" />“.</translation>
 <translation id="3090871774332213558">Успешно сдвояване на <ph name="DEVICE_NAME" /></translation>
 <translation id="3092544800441494315">Да се включи тази екранна снимка:</translation>
@@ -2009,7 +2014,6 @@
 <translation id="3790856258139356663">Свързва се с тестовия сървър за синхронизирането в Chrome.</translation>
 <translation id="3790909017043401679">Въвеждане на ПИН кода на SIM картата</translation>
 <translation id="3792890930871100565">Прекъсване на връзката с принтерите</translation>
-<translation id="3795681127952030401"><ph name="URL" /> иска да ви изпраща известия.</translation>
 <translation id="3796648294839530037">Любими мрежи:</translation>
 <translation id="3797900183766075808">&amp;Търсене на „<ph name="SEARCH_TERMS" />“ със: <ph name="SEARCH_ENGINE" /></translation>
 <translation id="3798449238516105146">Версия</translation>
@@ -2483,6 +2487,7 @@
 <translation id="4552678318981539154">Купуване на още хранилище</translation>
 <translation id="4554591392113183336">Версията на външното разширение е същата или по-стара в сравнение със съществуващата.</translation>
 <translation id="4554796861933393312">Скорост на анимацията на мастилената капка на material design</translation>
+<translation id="4555670907822902621">Активирайте функцията, позволяваща страниците, за които са създадени отметки, да се запазват за преглед офлайн.</translation>
 <translation id="4555769855065597957">Сянка</translation>
 <translation id="4556110439722119938">Вашите отметки, история, пароли и други настройки ще се синхронизират с профила ви в Google, за да можете да ги използвате на всичките си устройства</translation>
 <translation id="4557136421275541763">Предупреждение:</translation>
@@ -2658,6 +2663,7 @@
 <translation id="4824518112777153488">Поддръжка за сензорни екрани със задействане от разстояние</translation>
 <translation id="4830573902900904548">Устройството ви <ph name="DEVICE_TYPE" /> не може да се свърже с интернет през „<ph name="NETWORK_NAME" />“. Моля, изберете друга мрежа. <ph name="LEARN_MORE_LINK_START" />Научете повече<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Самоличността на <ph name="ORGANIZATION" /> в/ъв <ph name="LOCALITY" /> е потвърдена от <ph name="ISSUER" />. Сървърът предостави валидна информация за прозрачност на сертификата.</translation>
+<translation id="4832537345877333532">Деактивиране на извличането на ICC файловете за дисплея от сървъра Quirks с цел калибриране на цветовете.</translation>
 <translation id="4834912470034578916">Активиране на персонализираните оформления за известия от мрежата.</translation>
 <translation id="4835836146030131423">Грешка при влизането.</translation>
 <translation id="4837926214103741331">Не сте упълномощени да използвате това устройство. За разрешение за вход се свържете със собственика му.</translation>
@@ -2845,6 +2851,7 @@
 <translation id="5120421890733714118">Да се има доверие на този сертификат за идентифициране на уебсайтове.</translation>
 <translation id="5121130586824819730">Твърдият ви диск е пълен.  Моля, запазете на друго място или освободете още пространство на диска.</translation>
 <translation id="5125751979347152379">Невалиден URL адрес.</translation>
+<translation id="5126663277159826272">Деактивиране на клиентската програма Quirks за калибриране на дисплея.</translation>
 <translation id="5127881134400491887">Управление на мрежовите връзки</translation>
 <translation id="5128590998814119508">Двуизмерно платно с екранен списък</translation>
 <translation id="512903556749061217">свързано</translation>
@@ -2986,9 +2993,11 @@
 <translation id="5301751748813680278">Влиза се като гост.</translation>
 <translation id="5301954838959518834">Добре, разбрах</translation>
 <translation id="5302048478445481009">Език</translation>
+<translation id="5304039790201806037">Събития за курсора</translation>
 <translation id="5305688511332277257">Няма инсталирани</translation>
 <translation id="5308380583665731573">Свързване</translation>
 <translation id="5311260548612583999">Файл с личен ключ (по избор):</translation>
+<translation id="5313967007315987356">Добавяне на сайт</translation>
 <translation id="5316588172263354223">Гласово търсене по всяко време</translation>
 <translation id="5316716239522500219">Дублиране на мониторите</translation>
 <translation id="5317780077021120954">Запазване</translation>
@@ -3292,6 +3301,7 @@
 <translation id="5734362860645681824">Комуникации</translation>
 <translation id="573719557377416048">Изчистване на състоянието на паралелно присъствие</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: Изберете, за да редактирате</translation>
+<translation id="5741454054957165976">Активирайте новата версия на функцията за намеса на потребителския агент при зареждане на уеб шрифтове.</translation>
 <translation id="574392208103952083">Среден</translation>
 <translation id="5745056705311424885">Открита е USB памет</translation>
 <translation id="5746169159649715125">Запазване като PDF файл</translation>
@@ -3340,7 +3350,6 @@
 <translation id="5803531701633845775">Да се избират фрази от обратната страна без преместване на курсора</translation>
 <translation id="5804241973901381774">Разрешения</translation>
 <translation id="580571955903695899">Преподреждане по азбучен ред</translation>
-<translation id="5808982448801399019">Упълномощаването не бе успешно</translation>
 <translation id="580961539202306967">Извеждане на запитване, когато сайт иска да ми изпраща насочени съобщения (препоръчително)</translation>
 <translation id="5815645614496570556">Адрес на X.400</translation>
 <translation id="5817397429773072584">китайски (традиционен)</translation>
@@ -3365,6 +3374,7 @@
 <translation id="5834581999798853053">Остават около <ph name="TIME" /> минути</translation>
 <translation id="5838825566232597749">Американска (Уъркман) международна клавиатура</translation>
 <translation id="5839277899276241121">Същият като адреса за фактуриране</translation>
+<translation id="5844550873065695788">Поне <ph name="TOTAL_COUNT" /> елемента ще се изтрият за постоянно от това устройство. За да извлечете данните си по-късно, влезте в Chrome като $2.</translation>
 <translation id="5846929185714966548">Раздел 4</translation>
 <translation id="5848934677402291689">Запазването в PDF файл е в ход</translation>
 <translation id="5849335628409778954">Въвеждане на кредитна карта...</translation>
@@ -3609,6 +3619,7 @@
 <translation id="6232017090690406397">Батерия</translation>
 <translation id="6241530762627360640">Да осъществява достъп до информацията за сдвоените със системата ви устройства с Bluetooth и да открива тези, които са наблизо.</translation>
 <translation id="6243774244933267674">Няма достъп до сървъра</translation>
+<translation id="6246413617632217567">Контролираният потребител не можа да бъде импортиран. Моля, проверете свободното място и разрешенията на твърдия си диск и опитайте отново.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Актуализацията е готова</translation>
 <translation id="6248400709929739064">Активиране на субтитрите</translation>
@@ -3637,6 +3648,7 @@
 <translation id="6277518330158259200">Създаване на &amp;екранна снимка</translation>
 <translation id="6279183038361895380">Натиснете |<ph name="ACCELERATOR" />|, за да се покаже курсорът</translation>
 <translation id="6280215091796946657">Влизане с друг профил</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Експеримент, чрез който всички приложни програмни интерфейси (API) отразяват външната част на прозоречния изглед. Така свойствата window.scroll ще се прилагат спрямо нея.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Нов принтер в мрежата ви}other{Нови принтери в мрежата ви}}</translation>
 <translation id="6285395082104474418">В тази лента се показва текущото състояние на мрежата, батерията и др.</translation>
@@ -3692,6 +3704,7 @@
 <translation id="6380143666419481200">Приемам и продължавам</translation>
 <translation id="6380224340023442078">Настройки за съдържанието...</translation>
 <translation id="6383194710567510941">Активирайте използването на приложния програмен интерфейс (API) chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Поне $1 елемент ще се изтрие за постоянно от това устройство. За да извлечете данните си по-късно, влезте в Chrome като $2.}other{Поне $1 елемента ще се изтрият за постоянно от това устройство. За да извлечете данните си по-късно, влезте в Chrome като $2.}}</translation>
 <translation id="6384275966486438344">Променете настройките си за търсене на: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Преглежданите от вас страници в този прозорец няма да се показват в историята на браузъра и няма да оставят на компютъра други следи, като „бисквитки“, след като затворите всички прозорци в режим като гост. Изтеглените от вас файлове обаче ще бъдат запазени.</translation>
 <translation id="6391538222494443604">Трябва да съществува директория за въвеждане.</translation>
@@ -3830,6 +3843,7 @@
 <translation id="6575134580692778371">Не е конфигурирано</translation>
 <translation id="6575251558004911012">Извеждане на запитване, когато сайт иска достъп до камерата ви (препоръчително)</translation>
 <translation id="6579159469348633828">Кодиране на съдържание чрез Brotli.</translation>
+<translation id="6580151766480067746">Версия на ARC</translation>
 <translation id="6581162200855843583">Връзка към Google Диск</translation>
 <translation id="6583070985841601920">Влезли сте като <ph name="USER_EMAIL_ADDRESS" />. Синхронизирането е деактивирано от администратора ви.</translation>
 <translation id="65832705307647870">Новият раздел в браузъра е предварително попълнен с популярни сайтове.</translation>
@@ -3995,6 +4009,7 @@
 <translation id="6847758263950452722">Запазване на страницата като MHTML</translation>
 <translation id="6853388645642883916">Актуализиращата програма е в спящ режим</translation>
 <translation id="68541483639528434">Затваряне на другите раздели</translation>
+<translation id="6856701878604560493">Активиране на офлайн отметките</translation>
 <translation id="6860097299815761905">Настройки за прокси сървър...</translation>
 <translation id="6860427144121307915">Отваряне в раздел</translation>
 <translation id="6862635236584086457">За всички файлове, запазени в тази папка, автоматично се създават резервни копия онлайн</translation>
@@ -4166,6 +4181,7 @@
 <translation id="7092106376816104">Изключения за изскачащи прозорци</translation>
 <translation id="7093866338626856921">Обмен на данни с устройствата със следните имена: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Искате да откриете още невероятни функции?</translation>
+<translation id="7096108453481049031">Контролираният потребител не можа да бъде импортиран. Моля, проверете мрежовата си връзка и опитайте отново по-късно.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> избрани елемента</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Купуване на още хранилище...</translation>
@@ -4194,6 +4210,7 @@
 <translation id="713888829801648570">За съжаление, паролата ви не можа да бъде потвърдена, защото сте офлайн.</translation>
 <translation id="7140928199327930795">Няма други налични устройства.</translation>
 <translation id="7141105143012495934">Влизането не бе успешно, тъй като данните за профила ви не можаха да се извлекат. Моля, свържете се с администратора си или опитайте отново.</translation>
+<translation id="7141331524324591758">Активира частичната експериментална поддръжка за API за събития за курсора. Тази функция е предназначена само за извършване на тестове от програмистите и ще доведе до проблеми в някои сайтове.</translation>
 <translation id="7143207342074048698">Свързва се</translation>
 <translation id="7144878232160441200">Нов опит</translation>
 <translation id="7148311641502571842">Приставката <ph name="PLUGIN_NAME" /> е деактивирана. За да я активирате отново, моля, отворете <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4842,6 +4859,7 @@
 <translation id="8119572489781388874">Промяна на настройките</translation>
 <translation id="8119631488458759651">премахване на този сайт</translation>
 <translation id="8121385576314601440">Настройки за въвеждане на хангъл</translation>
+<translation id="8122245494004914423">Данните за сърфирането ви ще се изтрият за постоянно от това устройство. За да ги извлечете по-късно, влезте в Chrome като $2.</translation>
 <translation id="8124313775439841391">Управлявано ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Разрешаване на невалидни сертификати за ресурси, зареждани от localhost.</translation>
@@ -4926,6 +4944,7 @@
 <translation id="8226742006292257240">По-долу е произволно генерираната чрез модула TPM парола, която е присвоена на компютъра ви:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" /> и <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Понастоящем извършители на атака срещу <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> може да опитат да инсталират опасни програми на компютъра ви, които крадат или изтриват информацията ви (например снимки, пароли, съобщения и номера на кредитни карти).</translation>
+<translation id="8233254008506535819">Добавете опцията за поставяне на важните сайтове в белия списък към диалоговия прозорец за изчистване на данните за сърфирането.</translation>
 <translation id="8236231079192337250">Приложения Галерия на уеб магазина на Chrome за драйвери за принтер</translation>
 <translation id="8238649969398088015">Помощен съвет</translation>
 <translation id="8240697550402899963">Използване на класическата тема</translation>
@@ -5250,7 +5269,6 @@
 <translation id="8708671767545720562">&amp;Още информация</translation>
 <translation id="8711402221661888347">Хамбургер</translation>
 <translation id="8711453844311572806">Когато телефонът ви е отключен и е наблизо, трябва само да кликнете, за да влезете. В противен случай ще видите икона за заключване и ще трябва да въведете паролата си.</translation>
-<translation id="8712637175834984815">Разбрах</translation>
 <translation id="8713570323158206935">Изпращане на <ph name="BEGIN_LINK1" />системна информация<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Активирайте функцията за автоматични поправки за английски (САЩ). Тя може да предоставя предложения, докато пишете на физическа клавиатура.</translation>
 <translation id="871476437400413057">запазени в Google пароли</translation>
@@ -5614,6 +5632,7 @@
 <translation id="952992212772159698">Не е активиран</translation>
 <translation id="953000875543358078">Това може да отнеме около минута</translation>
 <translation id="960987915827980018">Остава около 1 час</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{$1 елемент ще се изтрие за постоянно от това устройство. За да извлечете данните си по-късно, влезте в Chrome като $2.}other{$1 елемента ще се изтрият за постоянно от това устройство. За да извлечете данните си по-късно, влезте в Chrome като $2.}}</translation>
 <translation id="96421021576709873">Wi-Fi мрежа</translation>
 <translation id="965490406356730238">Активирайте хардуерно ускореното декодиране на mjpeg за заснетите кадри, където е налице.</translation>
 <translation id="968174221497644223">Кеш на приложение</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index c7cfa448..b3574ee 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -251,6 +251,7 @@
       মনে রাখবেন, <ph name="USER_DISPLAY_EMAIL" /> এর জন সামঞ্জস্যপূর্ণ ডিভাইসগুলির সবগুলিতে Bluetooth চালু হবে এবং কিছু হার্ডওয়্যার তথ্য Google এ পাঠানো হবে। &lt;a&gt;আরো জানুন&lt;/a&gt;</translation>
 <translation id="13649080186077898">স্বতঃপূর্ণ সেটিংস পরিচালনা করুন</translation>
 <translation id="1367951781824006909">একটি ফাইল চয়ন করুন</translation>
+<translation id="136802136832547685">এই ডিভাইসটিতে যোগ করার মতো কোনো তত্ত্বাবধানে থাকা ব্যবহারকারী নেই৷</translation>
 <translation id="1368265273904755308">সমস্যা প্রতিবেদন করুন</translation>
 <translation id="1368832886055348810">বাম থেকে ডান</translation>
 <translation id="1370646789215800222">ব্যক্তিকে সরাবেন?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">অনুসন্ধান</translation>
 <translation id="1384211230590313258">পরিষেবা আবিষ্কার হ্যান্ডলার</translation>
 <translation id="1386387014181100145">আপনি কেমন আছেন৷</translation>
+<translation id="1386830813511981192">আপনার <ph name="DEVICE_TYPE" /> এ এখন দশ লক্ষেরও বেশি অ্যাপ্লিকেশান এবং গেম পাবেন</translation>
 <translation id="1389297115360905376">এটি কেবলমাত্র <ph name="CHROME_WEB_STORE" /> থেকে ইনস্টল জোড়া যেতে পারে৷</translation>
 <translation id="1390548061267426325">নিয়মিত ট্যাব রূপে খুলুন</translation>
 <translation id="1395262318152388157">স্লাইডার খুঁজুন</translation>
@@ -891,6 +893,7 @@
 <translation id="2280486287150724112">ডান মার্জিন</translation>
 <translation id="2282146716419988068">GPU প্রক্রিয়া</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">WebFonts লোডিংয়ের জন্য ব্যবহারকারি-এজেন্টের হস্তক্ষেপের নতুন সংস্করণ</translation>
 <translation id="2286454467119466181">সহজ</translation>
 <translation id="2286950485307333924">আপনি এখন Chrome এ সাইন ইন করেছেন</translation>
 <translation id="2287590536030307392">সব বেতার সংযোগ বন্ধ করুন৷</translation>
@@ -1068,6 +1071,7 @@
 <translation id="2542049655219295786">Google টেবিল</translation>
 <translation id="2546283357679194313">কুকিজ ও সাইট ডেটা</translation>
 <translation id="2549646943416322527">Seccomp আবিষ্কারক</translation>
+<translation id="2550212893339833758">অদলবদল করা মেমরি</translation>
 <translation id="2553100941515833716">প্রতি পুনর্সূচনাতে অ্যাপ্লিকেশান লঞ্চার ইনস্টলের স্থিতি পুনরায় সেট করুন৷</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" />, <ph name="NETWORK_ID" /> এর সাথে সংযোগ স্থাপনে অক্ষম ছিল৷ দয়া করে অন্য একটি নেটওয়ার্ক নির্বাচন করুন বা আবার চেষ্টা করুন৷</translation>
 <translation id="2553440850688409052">এই প্লাগইনটি লুকান</translation>
@@ -1102,6 +1106,7 @@
 <translation id="2587922270115112871">তত্ত্বাবধানে থাকা ব্যবহারকারী তৈরি করলে Google অ্যাকাউন্ট তৈরি হয় না এবং সেগুলির ডেটা ও সেটিংস
     অন্য ডিভাইসগুলিতে Chrome এর মাধ্যমে সেগুলিকে অনুসরণ করবে না৷
    একটি তত্ত্বাবধানে থাকা ব্যবহারকারী শুধুমাত্র এই ডিভাইসে প্রযোজ্য হয়৷</translation>
+<translation id="2594049137847833442">ব্রাউজিং ডেটা সাফ করার ডায়ালগে গুরুত্বপূর্ণ সাইটের বিকল্পগুলি</translation>
 <translation id="2594056015203442344">যখন সক্ষম করা থাকে, তখন ট্যাব স্ট্রিপে থাকা অডিও সূচকগুলি, ট্যাব অডিও নিঃশব্দ নিয়ন্ত্রণগুলির হিসাবে দ্বিগুন হয়৷ এছাড়াও এটি, একাধিক নির্বাচিত ট্যাব নিঃশব্দ করার জন্য ট্যাবের প্রসঙ্গ মেনুতে কমান্ড যোগ করে৷</translation>
 <translation id="259421303766146093">পরিবর্ধিত করুন</translation>
 <translation id="2597852038534460976">Chrome ওয়ালপেপারগুলি অ্যাক্সেস করতে পারছে না৷ দয়া করে একটি নেটওয়ার্কে সংযোগ করুন৷</translation>
@@ -1468,7 +1473,6 @@
 <translation id="3065140616557457172">অনুসন্ধানের জন্য টাইপ করুন অথবা সমস্তকিছু ঠিকঠাক কাজ করছে - তা নেভিগেট করা জন্য একটি URL প্রবেশ করান৷</translation>
 <translation id="3067198360141518313">এই প্লাগ ইনটি চালনা করুন</translation>
 <translation id="307519606911195071">সেটিংস পৃষ্ঠায় অতিরিক্ত অ্যাক্সেসযোগ্যতার বৈশিষ্ট্যগুলি সক্ষম করুন।</translation>
-<translation id="3075239840551149663">একটি তত্ত্বাবধানে থাকা ব্যবহারকারী হিসেবে <ph name="NEW_PROFILE_NAME" /> তৈরি করা হয়েছে!</translation>
 <translation id="3075874217500066906">পাওয়ারওয়াশ প্রক্রিয়া শুরু করতে রিস্টার্ট করার প্রয়োজন৷ রিস্টার্ট করার পরে আপনার প্রক্রিয়া করার সম্মতি চাওয়া হবে৷</translation>
 <translation id="3076677906922146425">সকলকে Chrome এ কোনো ব্যক্তিকে যোগ করার অনুমতি দিন</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1485,6 +1489,7 @@
 <translation id="3088034400796962477">লিপ্যন্তরকরণ (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;পুনঃনামকরণ...</translation>
 <translation id="308903551226753393">স্বয়ংক্রিয়ভাবে কনফিগার করুন</translation>
+<translation id="3089231390674410424">দেখে মনে হচ্ছে আপনার শংসাপত্রগুলিতে কিছু সমস্যা রয়েছে৷ দয়া করে নিশ্চিত করুন যে আপনি সঠিকভাবে সাইন ইন করছেন এবং আবার চেষ্টা করুন৷</translation>
 <translation id="3090819949319990166"><ph name="TEMP_CRX_FILE" /> এ বহিরাগত crx ফাইলটি অনুলিপি করতে পারবেন না৷</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" যুক্ত করা হয়েছে</translation>
 <translation id="3092544800441494315">এই স্ক্রিনশটটি অন্তর্ভুক্ত করুন:</translation>
@@ -2007,7 +2012,6 @@
 <translation id="3790856258139356663">Chrome সিঙ্ক এর জন্য পরীক্ষার সার্ভরের সাথে সংযোগ করে৷</translation>
 <translation id="3790909017043401679">SIM কার্ড পিন লিখুন</translation>
 <translation id="3792890930871100565">প্রিন্টার সংযোগ বিচ্ছিন্ন করুন</translation>
-<translation id="3795681127952030401"><ph name="URL" /> আপনাকে বিজ্ঞপ্তি পাঠাতে চায়।</translation>
 <translation id="3796648294839530037">পছন্দসই নেটওয়ার্কগুলি:</translation>
 <translation id="3797900183766075808"><ph name="SEARCH_ENGINE" /> এ “<ph name="SEARCH_TERMS" />” এর &amp;অনুসন্ধান করুন</translation>
 <translation id="3798449238516105146">সংস্করণ</translation>
@@ -2479,6 +2483,7 @@
 <translation id="4552678318981539154">আরো সঞ্চয়স্থান কিনুন</translation>
 <translation id="4554591392113183336">বিদ্যমানটির তুলনায় বাহ্যিক এক্সটেনশানটি একই বা আরো পুরোনো সংস্করণের৷</translation>
 <translation id="4554796861933393312">মেটারিয়াল ডিজাইন কালির ফোঁটার অ্যানিমেশান গতি</translation>
+<translation id="4555670907822902621">অফলাইনে দেখার জন্য বুকমার্ক করা পৃষ্ঠাগুলি সংরক্ষণ করা সক্ষম করে।</translation>
 <translation id="4555769855065597957">ছায়া</translation>
 <translation id="4556110439722119938">আপনার বুকমার্ক, ইতিহাস এবং অন্যান্য সেটিংস আপনার Google অ্যাকাউন্টে সিঙ্ক হবে যাতে আপনি আপনার সমস্ত ডিভাইসে সেগুলি ব্যবহার করতে পারেন।</translation>
 <translation id="4557136421275541763">সতর্কতা: </translation>
@@ -2653,6 +2658,7 @@
 <translation id="4824518112777153488">টাচস্ক্রীনগুলির উপর কার্সার রেখে দেখা সমর্থন</translation>
 <translation id="4830573902900904548">আপনার <ph name="DEVICE_TYPE" /> <ph name="NETWORK_NAME" /> ব্যবহার করে ইন্টারনেটে সংযুক্ত হতে অক্ষম। দয়া করে অন্য নেটওয়ার্ক চয়ন করুন। <ph name="LEARN_MORE_LINK_START" />আরো জানুন<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572"><ph name="LOCALITY" /> তে <ph name="ORGANIZATION" /> এর পরিচয় <ph name="ISSUER" /> এর দ্বারা যাচাই করা হয়েছে। সার্ভার বৈধ শংসাপত্রের স্বচ্ছতার তথ্য সরবরাহ করেছে।</translation>
+<translation id="4832537345877333532">প্রদর্শনের রঙ ক্রমাঙ্কনের জন্য Quirks সার্ভার থেকে icc প্রদর্শন ফাইলগুলির পুনরুদ্ধার অক্ষম করে।</translation>
 <translation id="4834912470034578916">ওয়েব বিজ্ঞপ্তিগুলির জন্য কাস্টম লেআউট সক্ষম করুন।</translation>
 <translation id="4835836146030131423">সাইন ইন করার সময় ত্রুটি৷</translation>
 <translation id="4837926214103741331">আপনার কাছে এই ডিভাইস ব্যবহারের অনুমতি নেই৷ দয়া করে সাইন-ইন করার অনুমতির জন্য ডিভাইসের মালিকের সঙ্গে যোগাযোগ করুন৷</translation>
@@ -2839,6 +2845,7 @@
 <translation id="5120421890733714118">ওয়েবসাইট শনাক্ত করার জন্য এই শংসপত্রটিকে বিশ্বাস করুন৷</translation>
 <translation id="5121130586824819730">আপনার হার্ড ডিস্ক পূর্ণ৷ দয়া করে অন্য কোনো স্থানে সংরক্ষণ করুন অথবা হার্ড ডিস্কে আরো জায়গা তৈরী করুন৷</translation>
 <translation id="5125751979347152379">অকার্যকর URL৷</translation>
+<translation id="5126663277159826272">প্রদর্শন ক্রমাঙ্কনের জন্য Quirks ক্লায়েন্ট অক্ষম করে।</translation>
 <translation id="5127881134400491887">নেটওয়ার্ক সংযোগগুলি পরিচালনা করুন</translation>
 <translation id="5128590998814119508">প্রদর্শন তালিকা 2D ক্যানভাস</translation>
 <translation id="512903556749061217">সংযুক্ত</translation>
@@ -2980,9 +2987,11 @@
 <translation id="5301751748813680278">অতিথি হিসাবে প্রবেশ করা।</translation>
 <translation id="5301954838959518834">আচ্ছা, বুঝেছি</translation>
 <translation id="5302048478445481009">ভাষা</translation>
+<translation id="5304039790201806037">পয়েন্টার ইভেন্টগুলি</translation>
 <translation id="5305688511332277257">কিছুই ইনস্টল নেই</translation>
 <translation id="5308380583665731573">সংযুক্ত করুন</translation>
 <translation id="5311260548612583999">ব্যক্তিগত কী ফাইল (ঐচ্ছিক):</translation>
+<translation id="5313967007315987356">সাইট যোগ করুন</translation>
 <translation id="5316588172263354223">যেকোনো সময়ে ভয়েস অনুসন্ধান করুন</translation>
 <translation id="5316716239522500219">আয়না মনিটর</translation>
 <translation id="5317780077021120954">সংরক্ষণ করুন</translation>
@@ -3286,6 +3295,7 @@
 <translation id="5734362860645681824">যোগাযোগগুলি</translation>
 <translation id="573719557377416048">কোপ্রেজেন্স স্থিতি সরিয়ে দিন</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: সম্পাদনার জন্য নির্বাচন করুন</translation>
+<translation id="5741454054957165976">WebFonts লোডিংয়ের জন্য ব্যবহারকারি-এজেন্টের হস্তক্ষেপের নতুন সংস্করণ সক্ষম করে</translation>
 <translation id="574392208103952083">মাঝারি</translation>
 <translation id="5745056705311424885">USB মেমরি স্টিক সনাক্ত হয়েছে</translation>
 <translation id="5746169159649715125">PDF রূপে সংরক্ষণ করুন</translation>
@@ -3334,7 +3344,6 @@
 <translation id="5803531701633845775">কার্সরটি না সরিয়ে পিছন থেকে শব্দবন্ধগুলি চয়ন করুন</translation>
 <translation id="5804241973901381774">অনুমতিগুলি</translation>
 <translation id="580571955903695899">শিরোনাম অনুসারে পুনঃক্রম করুন</translation>
-<translation id="5808982448801399019">অনুমোদন ব্যর্থ হয়েছে</translation>
 <translation id="580961539202306967">যখন কোনো সাইট আমাকে পুশ বার্তা পাঠাতে চায়, তখন আমাকে জিজ্ঞাসা করুন (প্রস্তাবিত)</translation>
 <translation id="5815645614496570556">X.400 ঠিকানা</translation>
 <translation id="5817397429773072584">ঐতিহ্যবাহি চীনা</translation>
@@ -3359,6 +3368,7 @@
 <translation id="5834581999798853053">প্রায় <ph name="TIME" /> মিনিট বাকি</translation>
 <translation id="5838825566232597749">মার্কিন ওয়ার্কম্যান আন্তর্জাতিক</translation>
 <translation id="5839277899276241121">বিলিং ঠিকানার মতো</translation>
+<translation id="5844550873065695788">এটি স্থায়ীভাবে এই ডিভাইস থেকে অন্ততঃ <ph name="TOTAL_COUNT" />টি আইটেম মুছে ফেলবে। আপনার ডেটা পরে পুনরুদ্ধার করার জন্য, Chrome এ $2 হিসাবে সাইন ইন করুন।</translation>
 <translation id="5846929185714966548">ট্যাব ৪</translation>
 <translation id="5848934677402291689">PDF-এ সংরক্ষণ  	প্রক্রিয়ায় আছে</translation>
 <translation id="5849335628409778954">ক্রেডিট কার্ডের তথ্য লিখুন...</translation>
@@ -3604,6 +3614,7 @@
 <translation id="6232017090690406397">ব্যাটারি: %</translation>
 <translation id="6241530762627360640">আপনার সিস্টেমের সঙ্গে যুক্ত করা Bluetooth ডিভাইসগুলির সম্পর্কে তথ্য অ্যাক্সেস করুন এবং কাছাকাছি  Bluetooth ডিভাইসগুলি খুঁজুন।</translation>
 <translation id="6243774244933267674">সার্ভার অনুপলব্ধ</translation>
+<translation id="6246413617632217567">তত্বাবধানে থাকা ব্যবহারকারী আমদানি করা যায়নি৷ দয়া করে আপনার হার্ড ডিস্কের সঞ্চয়স্থান ও অনুমতি পরীক্ষা করুন এবং আবার চেষ্টা করুন৷</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">আপডেট প্রস্তুত</translation>
 <translation id="6248400709929739064">সাবটাইটেল সক্ষম করুন</translation>
@@ -3632,6 +3643,7 @@
 <translation id="6277518330158259200">স্ক্রীনশট নি&amp;ন</translation>
 <translation id="6279183038361895380">আপনার কার্সার দেখাতে |<ph name="ACCELERATOR" />| চাপুন</translation>
 <translation id="6280215091796946657">অন্য একটি অ্যাকাউন্ট দিয়ে সাইন ইন করুন</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">সব APIগুলি দ্বারা লেআউট ভিউপোর্ট প্রতিফলন করাতে গবেষণা করে। এটি window.scroll বৈশিষ্টসমূহকে লেআউট ভিউপোর্টের সাথে সম্পর্কিত করবে।</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{আপনার নেটওয়ার্কে নতুন প্রিন্টারটি}one{আপনার নেটওয়ার্কে নতুন প্রিন্টারগুলি}other{আপনার নেটওয়ার্কে নতুন প্রিন্টারগুলি}}</translation>
 <translation id="6285395082104474418">স্থিতি ট্রে আপনাকে আপনার নেটওয়ার্ক, ব্যাটারি এবং অন্যান্য জিনিসগুলির অবস্থা দেখায়৷</translation>
@@ -3687,6 +3699,7 @@
 <translation id="6380143666419481200">স্বীকার ও অবিরত করুন</translation>
 <translation id="6380224340023442078">সামগ্রী সেটিংস...</translation>
 <translation id="6383194710567510941">chrome.input.ime API এর ব্যবহার সক্ষম করে।</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{এটি স্থায়ীভাবে এই ডিভাইস থেকে অন্তত $1টি আইটেম মুছে ফেলবে। আপনার ডেটা পরে পুনরুদ্ধার করার জন্য, Chrome এ $2 হিসাবে সাইন ইন করুন।}one{এটি স্থায়ীভাবে এই ডিভাইস থেকে অন্তত $1টি আইটেম মুছে ফেলবে। আপনার ডেটা পরে পুনরুদ্ধার করার জন্য, Chrome এ $2 হিসাবে সাইন ইন করুন।}other{এটি স্থায়ীভাবে এই ডিভাইস থেকে অন্তত $1টি আইটেম মুছে ফেলবে। আপনার ডেটা পরে পুনরুদ্ধার করার জন্য, Chrome এ $2 হিসাবে সাইন ইন করুন।}}</translation>
 <translation id="6384275966486438344">আপনার অনুসন্ধানের সেটিংস এ পরিবর্তন করুন: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">এই উইন্ডোতে আপনি যে পৃষ্ঠাগুলি দেখেন তা ব্রাউজারের ইতিহাসে উপস্থিত হবে না, এবং আপনি সমস্ত খোলা অতিথি উইন্ডো বন্ধ করার পরে এগুলি কম্পিউটারটিতে কুকিজের মতো অন্যান্য ট্রেসগুলিও রেখে যাবে না৷ যদিও আপনার ডাউনলোড করা যেকোনো ফাইল সংরক্ষিত করা হবে৷</translation>
 <translation id="6391538222494443604">ইনপুট নির্দেশিকা বন্ধ করা আবশ্যক৷</translation>
@@ -3824,6 +3837,7 @@
 <translation id="6575134580692778371">কনফিগার হয়নি</translation>
 <translation id="6575251558004911012">যখন কোনো একটি সাইট আপনার ক্যামেরা অ্যাক্সেস করতে চায় তখন জিজ্ঞাসা করবে (প্রস্তাবিত)</translation>
 <translation id="6579159469348633828">Brotli সামগ্রী-এনকোডিং।</translation>
+<translation id="6580151766480067746">ARC সংস্করণ</translation>
 <translation id="6581162200855843583">Google ড্রাইভ লিঙ্ক</translation>
 <translation id="6583070985841601920"><ph name="USER_EMAIL_ADDRESS" /> হিসাবে সাইন ইন করেছেন৷ আপনার প্রশাসকের দ্বারা সিঙ্ক অক্ষম করা হয়েছে৷</translation>
 <translation id="65832705307647870">নতুন ট্যাব পৃষ্ঠাতে আগে থেকেই জনপ্রিয় সাইটগুলি রাখুন</translation>
@@ -3992,6 +4006,7 @@
 <translation id="6847758263950452722">MHTML হিসাবে পৃষ্ঠা সংরক্ষণ করুন</translation>
 <translation id="6853388645642883916">আপডেটার নিদ্রা মোডে রয়েছে</translation>
 <translation id="68541483639528434">অন্যান্য ট্যাব বন্ধ করুন</translation>
+<translation id="6856701878604560493">অফলাইন বুকমার্ক সক্ষম করে</translation>
 <translation id="6860097299815761905">প্রক্সি সেটিংস...</translation>
 <translation id="6860427144121307915">একটি ট্যাবে খুলুন</translation>
 <translation id="6862635236584086457">এই ফোল্ডারটিতে সংরক্ষিত সব ফাইল অনলাইনে স্বয়ংক্রিয়ভাবে ব্যাক আপ করা হয়েছে</translation>
@@ -4162,6 +4177,7 @@
 <translation id="7092106376816104">পপ-আও ব্যতিক্রম</translation>
 <translation id="7093866338626856921"><ph name="HOSTNAMES" />: নামের্ ডিভাইসসমূহের সাথে ডেটা বিনিময় করুন</translation>
 <translation id="7096082900368329802">আরো অসাধারণ সব বৈশিষ্ট্য আবিষ্কার করতে চান?</translation>
+<translation id="7096108453481049031">তত্ত্বাবধানে থাকা ব্যবহারকারী আমদানি করা যায়নি৷ দয়া করে আপনার নেটওয়ার্ক সংযোগটি পরীক্ষা করে দেখুন এবং পরে আবার চেষ্টা করুন৷</translation>
 <translation id="7100897339030255923"><ph name="COUNT" />টি আইটেম নির্বাচিত</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">আরো সঞ্চয়স্থান কিনুন...</translation>
@@ -4190,6 +4206,7 @@
 <translation id="713888829801648570">দুঃখিত, আপনি অফলাইনে থাকায় আপনার পাসওয়ার্ড যাচাই করা যায়নি৷</translation>
 <translation id="7140928199327930795">অন্য কোনো উপলব্ধ ডিভাইস নেই৷</translation>
 <translation id="7141105143012495934">আপনার অ্যাকাউন্টের বিশদ বিবরণ পুনরুদ্ধার করতে না পারায় সাইন ইন ব্যর্থ হয়েছে। দয়া করে আপনার প্রশাসকের সাথে যোগাযোগ করুন অথবা আবার চেষ্টা করুন।</translation>
+<translation id="7141331524324591758">পয়েন্টার ইভেন্টগুলির API এর জন্য আংশিক পরীক্ষামূলক সমর্থন সক্ষম করে। এটা শুধুমাত্র ওয়েব বিকাশকারীদের দ্বারা পরীক্ষার উদ্দেশ্যে রাখা হয়েছে, এর কারণে কিছু কিছু ওয়েবসাইটের ভেতরে অকেজো লিঙ্ক থাকতে পারে।</translation>
 <translation id="7143207342074048698">সংযুক্ত হচ্ছে</translation>
 <translation id="7144878232160441200">পুনরায় চেষ্টা করুন</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> অক্ষম করা হয়েছে৷ এটিকে পুনঃসক্ষম করতে, দয়া করে <ph name="CHROME_PLUGINS_LINK" />-এ যান৷</translation>
@@ -4837,6 +4854,7 @@
 <translation id="8119572489781388874">সেটিংস সংশোধন করুন</translation>
 <translation id="8119631488458759651">এই সাইটটি সরান</translation>
 <translation id="8121385576314601440">হাঙ্গুল ইনপুট সেটিংস</translation>
+<translation id="8122245494004914423">এটি স্থায়ীভাবে এই ডিভাইস থেকে আপনার ব্রাউজিং ডেটা মুছে ফেলবে। আপনার ডেটা পরে পুনরুদ্ধার করার জন্য, Chrome এ $2 হিসাবে সাইন ইন করুন।</translation>
 <translation id="8124313775439841391">ONC পরিচালিত করা হযেছে</translation>
 <translation id="8126844665673008223">ওয়েব Bluetooth</translation>
 <translation id="8127322077195964840">স্থানীয় হোস্ট থেকে যে সম্পদ লোড হয় তার জন্য অবৈধ শংসাপত্রের অনুমতি দিন।</translation>
@@ -4922,6 +4940,7 @@
 <translation id="8226742006292257240">আপনার কম্পিউটারে অ্যাসাইন করা হয়েছে এমন এলোমেলোভাবে জেনারেট হওয়া TPM পাসওয়ার্ডটি নীচে:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">বর্তমানে <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> এর আক্রমণকারীরা আপনার কম্পিউটারে ক্ষতিকারক প্রোগ্রাম ইনস্টল করতে পারে যা আপনার তথ্য (উদাহরণস্বরুপ, ফটো, পাসওয়ার্ড, বার্তা এবং ক্রেডিট কার্ড) চুরি করতে বা মুছে দিতে পারে।</translation>
+<translation id="8233254008506535819">ব্রাউজিং ডেটা সাফ করার ডায়ালগে গুরুত্বপূর্ণ সাইটগুলিকে পরিচ্ছন্ন তালিকায় অন্তর্ভুক্ত করার বিকল্প অন্তর্ভুক্ত করে।</translation>
 <translation id="8236231079192337250">প্রিন্টার ড্রাইভারের জন্য Chrome ওয়েব দোকান গ্যালারি অ্যাপ্লিকেশান</translation>
 <translation id="8238649969398088015">সহায়তা  টিপ</translation>
 <translation id="8240697550402899963">ক্লাসিক থিম ব্যবহার করুন</translation>
@@ -5246,7 +5265,6 @@
 <translation id="8708671767545720562">&amp;আরো তথ্য</translation>
 <translation id="8711402221661888347">আচার</translation>
 <translation id="8711453844311572806">আপনার ফোন আনলক এবং আশেপাশে থাকাকালীন, লিখতে শুধু ক্লিক করুন৷ অন্যথায়, আপনি একটি লক প্রতিকৃতি দেখতে পাবেন এবং আপনাকে পাসওয়ার্ড টাইপ করতে হবে৷</translation>
-<translation id="8712637175834984815">বুঝেছি</translation>
 <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />সিস্টেমের তথ্য<ph name="END_LINK1" /> পাঠান</translation>
 <translation id="8713979477561846077">US কীবোর্ডের জন্য ফিজিক্যাল কীবোর্ড স্বতঃ-সংশোধন সক্ষম করুন, যা ফিজিক্যাল কীবোর্ডে লেখার সময় প্রস্তাবনাগুলি প্রদান করতে পারে৷</translation>
 <translation id="871476437400413057">Google এর সংরক্ষিত পাসওয়ার্ডগুলি</translation>
@@ -5610,6 +5628,7 @@
 <translation id="952992212772159698">সক্রিয় নেই</translation>
 <translation id="953000875543358078">এতে এক মিনিট বা তার কাছাকাছি সময় লাগতে পারে</translation>
 <translation id="960987915827980018">প্রায় 1 ঘণ্টা বাকি</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{এটি স্থায়ীভাবে এই ডিভাইস থেকে $1টি আইটেম মুছে ফেলবে। আপনার ডেটা পরে পুনরুদ্ধার করার জন্য, Chrome এ $2 হিসাবে সাইন ইন করুন।}one{এটি স্থায়ীভাবে এই ডিভাইস থেকে $1টি আইটেম মুছে ফেলবে। আপনার ডেটা পরে পুনরুদ্ধার করার জন্য, Chrome এ $2 হিসাবে সাইন ইন করুন।}other{এটি স্থায়ীভাবে এই ডিভাইস থেকে $1টি আইটেম মুছে ফেলবে। আপনার ডেটা পরে পুনরুদ্ধার করার জন্য, Chrome এ $2 হিসাবে সাইন ইন করুন।}}</translation>
 <translation id="96421021576709873">Wi-Fi নেটওয়ার্ক</translation>
 <translation id="965490406356730238">উপলব্ধ থাকলে, ক্যাপচার করা ফ্রেমের জন্য হার্ডওয়্যার অ্যাক্সিলারেশন সমৃদ্ধ MPEG ডিকোড সক্ষম করুন।</translation>
 <translation id="968174221497644223">অ্যাপ্লিকেশন ক্যাশে</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index e7adb3b..513f493 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -251,6 +251,7 @@
       Tingueu en compte que el Bluetooth s'activarà per a tots els dispositius compatibles de l'usuari <ph name="USER_DISPLAY_EMAIL" /> i s'enviarà informació sobre el maquinari a Google. &lt;a&gt;Més informació&lt;/a&gt;</translation>
 <translation id="13649080186077898">Gestiona la configuració d'Emplenament automàtic</translation>
 <translation id="1367951781824006909">Trieu un fitxer</translation>
+<translation id="136802136832547685">No hi ha cap usuari supervisat per afegir a aquest dispositiu.</translation>
 <translation id="1368265273904755308">Informeu d'un problema</translation>
 <translation id="1368832886055348810">D'esquerra a dreta</translation>
 <translation id="1370646789215800222">Voleu suprimir la persona?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Cerca</translation>
 <translation id="1384211230590313258">Gestor per a la detecció de serveis</translation>
 <translation id="1386387014181100145">Hola.</translation>
+<translation id="1386830813511981192">Ja hi ha disponibles més d'un milió d'aplicacions i jocs a <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Només es pot afegir des de <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Obre com a pestanya normal</translation>
 <translation id="1395262318152388157">Control lliscant de cerca</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">Marge dret</translation>
 <translation id="2282146716419988068">Procés de GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Nova versió de la intervenció de l'agent d'usuari per carregar tipus de lletra web.</translation>
 <translation id="2286454467119466181">Simple</translation>
 <translation id="2286950485307333924">Heu iniciat la sessió a Chrome</translation>
 <translation id="2287590536030307392">Desactiva totes les connexions sense fil.</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">Taula de Google</translation>
 <translation id="2546283357679194313">Dades de llocs i galetes</translation>
 <translation id="2549646943416322527">Detector de Seccomp</translation>
+<translation id="2550212893339833758">Memòria intercanviada</translation>
 <translation id="2553100941515833716">Restableix l'estat d'instal·lació del Menú d'aplicacions en cada reinici.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> no s'ha pogut connectar a <ph name="NETWORK_ID" />. Seleccioneu una altra xarxa o bé torneu-ho a provar.</translation>
 <translation id="2553440850688409052">Amaga aquest connector</translation>
@@ -1101,6 +1105,7 @@
 <translation id="2585300050980572691">Configuració de cerca predeterminada</translation>
 <translation id="2587203970400270934">Codi d'operador:</translation>
 <translation id="2587922270115112871">En crear un usuari supervisat no es crea un compte de Google, i la seva configuració i les seves dades no passaran a altres dispositius amb la sincronització de Chrome. Actualment, un usuari supervisat només aplica la instal·lació de Chrome en aquest dispositiu.</translation>
+<translation id="2594049137847833442">Opcions per a llocs importants al quadre de diàleg Esborra les dades de navegació</translation>
 <translation id="2594056015203442344">Quan estan activats, els indicadors d'àudio de la barra de pestanyes actuen com a controls per silenciar l'àudio de les pestanyes. També s'afegeixen comandaments al menú contextual de les pestanyes per silenciar ràpidament múltiples pestanyes seleccionades.</translation>
 <translation id="259421303766146093">Redueix</translation>
 <translation id="2597852038534460976">Chrome no pot accedir als fons de pantalla. Connecteu-vos a una xarxa.</translation>
@@ -1468,7 +1473,6 @@
 <translation id="3065140616557457172">Introduïu una cerca o bé un URL pel qual voleu navegar: podeu fer servir el mètode que vulgueu.</translation>
 <translation id="3067198360141518313">Executa aquest connector</translation>
 <translation id="307519606911195071">Activa les funcions addicionals d'accessibilitat a la pàgina Configuració.</translation>
-<translation id="3075239840551149663">S'ha creat <ph name="NEW_PROFILE_NAME" /> com a usuari supervisat.</translation>
 <translation id="3075874217500066906">Per començar el procés de Powerwash, cal que reinicieu el dispositiu. Després de fer-ho, haureu de confirmar que voleu continuar.</translation>
 <translation id="3076677906922146425">Permet que qualsevol persona pugui afegir una persona a Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1485,6 +1489,7 @@
 <translation id="3088034400796962477">Transliteració (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Canvia el nom...</translation>
 <translation id="308903551226753393">Configura automàticament</translation>
+<translation id="3089231390674410424">Sembla que hi ha un problema amb les credencials. Assegureu-vos que la sessió està ben iniciada i torneu-ho a provar.</translation>
 <translation id="3090819949319990166">No es pot copiar el fitxer crx extern a <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" emparellat</translation>
 <translation id="3092544800441494315">Inclou la captura de pantalla</translation>
@@ -2011,7 +2016,6 @@
 <translation id="3790856258139356663">Es connecta al servidor de prova per a Sincronització de Chrome.</translation>
 <translation id="3790909017043401679">Introduïu el PIN de la targeta SIM</translation>
 <translation id="3792890930871100565">Desconnecta impressores</translation>
-<translation id="3795681127952030401"><ph name="URL" /> us vol enviar notificacions.</translation>
 <translation id="3796648294839530037">Xarxes preferides:</translation>
 <translation id="3797900183766075808">&amp;Cerca "<ph name="SEARCH_TERMS" />" a <ph name="SEARCH_ENGINE" /></translation>
 <translation id="3798449238516105146">Versió</translation>
@@ -2484,6 +2488,7 @@
 <translation id="4552678318981539154">Compra més emmagatzematge</translation>
 <translation id="4554591392113183336">L'extensió externa té la mateixa versió, o una d'anterior, en comparació amb l'existent.</translation>
 <translation id="4554796861933393312">Velocitat d'animació amb gota de tinta de material design</translation>
+<translation id="4555670907822902621">Activa la visualització sense connexió de les pàgines afegides a les adreces d'interès.</translation>
 <translation id="4555769855065597957">Ombra</translation>
 <translation id="4556110439722119938">Les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració se sincronitzaran amb el vostre compte de Google, perquè els pugueu utilitzar en tots els dispositius.</translation>
 <translation id="4557136421275541763">Advertiment:</translation>
@@ -2657,6 +2662,7 @@
 <translation id="4824518112777153488">Compatibilitat amb pantalles tàctils amb funció de passar el cursor per sobre</translation>
 <translation id="4830573902900904548">El vostre dispositiu <ph name="DEVICE_TYPE" /> no es pot connectar a Internet mitjançant <ph name="NETWORK_NAME" />. Trieu una altra xarxa. <ph name="LEARN_MORE_LINK_START" />Més informació<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572"><ph name="ISSUER" /> ha verificat la identitat de l'organització <ph name="ORGANIZATION" /> a <ph name="LOCALITY" />. El servidor ha proporcionat informació vàlida de Transparència de certificats.</translation>
+<translation id="4832537345877333532">Desactiva la recuperació dels fitxers de visualització icc de Quirks Server per calibrar el color de la visualització.</translation>
 <translation id="4834912470034578916">Activa els dissenys personalitzats per a les notificacions web.</translation>
 <translation id="4835836146030131423">S'ha produït un error en iniciar la sessió.</translation>
 <translation id="4837926214103741331">No teniu autorització per fer servir aquest dispositiu. Contacteu amb el propietari del dispositiu per obtenir el permís d'inici de sessió.</translation>
@@ -2844,6 +2850,7 @@
 <translation id="5120421890733714118">Confia en aquest certificat per identificar llocs web.</translation>
 <translation id="5121130586824819730">El vostre disc dur és ple. Deseu-ho en una altra ubicació o allibereu espai del disc dur.</translation>
 <translation id="5125751979347152379">URL no vàlid.</translation>
+<translation id="5126663277159826272">Desactiva Quirks Client per calibrar la visualització.</translation>
 <translation id="5127881134400491887">Gestioneu les connexions de xarxa</translation>
 <translation id="5128590998814119508">Llenços 2D a les llistes de visualització</translation>
 <translation id="512903556749061217">connectat</translation>
@@ -2984,9 +2991,11 @@
 <translation id="5301751748813680278">S'està entrant com a Convidat.</translation>
 <translation id="5301954838959518834">D'acord, entesos</translation>
 <translation id="5302048478445481009">Idioma</translation>
+<translation id="5304039790201806037">Esdeveniments del punter</translation>
 <translation id="5305688511332277257">Cap d'instal·lat</translation>
 <translation id="5308380583665731573">Connexió</translation>
 <translation id="5311260548612583999">Clau privada (opcional): </translation>
+<translation id="5313967007315987356">Afegeix un lloc</translation>
 <translation id="5316588172263354223">Cercar per veu en qualsevol moment</translation>
 <translation id="5316716239522500219">Replica els monitors</translation>
 <translation id="5317780077021120954">Desa</translation>
@@ -3290,6 +3299,7 @@
 <translation id="5734362860645681824">Comunicacions</translation>
 <translation id="573719557377416048">Esborra l'estat de copresència</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: selecciona per editar-lo</translation>
+<translation id="5741454054957165976">Activa la nova versió de la intervenció de l'agent d'usuari per carregar tipus de lletra web.</translation>
 <translation id="574392208103952083">Mitjà</translation>
 <translation id="5745056705311424885">S'ha detectat un llapis de memòria USB</translation>
 <translation id="5746169159649715125">Desa com a PDF</translation>
@@ -3338,7 +3348,6 @@
 <translation id="5803531701633845775">Tria frases de darrere sense moure el cursor</translation>
 <translation id="5804241973901381774">Permisos</translation>
 <translation id="580571955903695899">Torna a ordenar per títol</translation>
-<translation id="5808982448801399019">No s'ha pogut completar l'autorització</translation>
 <translation id="580961539202306967">Pregunta'm quan un lloc vulgui enviar-me missatges de tramesa automàtica (recomanat)</translation>
 <translation id="5815645614496570556">Adreça X.400</translation>
 <translation id="5817397429773072584">Xinès tradicional</translation>
@@ -3364,6 +3373,7 @@
 <translation id="5834581999798853053">Queda cosa de <ph name="TIME" /> minuts</translation>
 <translation id="5838825566232597749">Workman nord-americà internacional</translation>
 <translation id="5839277899276241121">La mateixa que l'adreça de facturació</translation>
+<translation id="5844550873065695788">Amb aquesta acció, se suprimiran almenys <ph name="TOTAL_COUNT" /> elements d'aquest dispositiu de manera permanent. Per recuperar les vostres dades més endavant, inicieu la sessió a Chrome com a $2.</translation>
 <translation id="5846929185714966548">Pestanya 4</translation>
 <translation id="5848934677402291689">S'està desant en format PDF</translation>
 <translation id="5849335628409778954">Introdueix la targeta de crèdit...</translation>
@@ -3608,6 +3618,7 @@
 <translation id="6232017090690406397">Bateria</translation>
 <translation id="6241530762627360640">Accedir a informació sobre els dispositius Bluetooth emparellats amb el sistema i descobrir dispositius Bluetooth a prop</translation>
 <translation id="6243774244933267674">El servidor no està disponible</translation>
+<translation id="6246413617632217567">L'usuari supervisat no s'ha pogut importar. Comproveu els vostres permisos i l'espai disponible a la unitat de disc dur i torneu-ho a provar.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Actualització a punt.</translation>
 <translation id="6248400709929739064">Activa els subtítols</translation>
@@ -3636,6 +3647,7 @@
 <translation id="6277518330158259200">Fes una c&amp;aptura de pantalla</translation>
 <translation id="6279183038361895380">Premeu |<ph name="ACCELERATOR" />| per veure el cursor</translation>
 <translation id="6280215091796946657">Inicia la sessió amb un altre compte</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Experimenteu perquè la finestra gràfica de disseny es reflecteixi en totes les API. Això farà que les propietats de window.scroll estiguin relacionades amb la finestra gràfica de disseny.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Impressora nova a la xarxa}other{Impressores noves a la xarxa}}</translation>
 <translation id="6285395082104474418">La safata d'estat mostra l'estat actual de la xarxa, de la bateria i molt més.</translation>
@@ -3691,6 +3703,7 @@
 <translation id="6380143666419481200">Accepta i continua</translation>
 <translation id="6380224340023442078">Configuració del contingut...</translation>
 <translation id="6383194710567510941">Activa l'ús de l'API chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Amb aquesta acció, se suprimirà almenys $1 element d'aquest dispositiu de manera permanent. Per recuperar les vostres dades més endavant, inicieu la sessió a Chrome com a $2.}other{Amb aquesta acció, se suprimiran almenys $1 elements d'aquest dispositiu de manera permanent. Per recuperar les vostres dades més endavant, inicieu la sessió a Chrome com a $2.}}</translation>
 <translation id="6384275966486438344">Canvia la configuració de la cerca a: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Les pàgines que visualitzeu en aquesta finestra no es mostraran a l'historial del navegador i no deixaran cap altre rastre a l'ordinador, com ara galetes, després de tancar totes les finestres obertes de la sessió de convidat. No obstant això, es conservaran tots els fitxers que baixeu.</translation>
 <translation id="6391538222494443604">El directori d'entrada ha d'existir.</translation>
@@ -3828,6 +3841,7 @@
 <translation id="6575134580692778371">No configurat</translation>
 <translation id="6575251558004911012">Pregunta'm quan un lloc requereixi accés a la càmera (opció recomanada)</translation>
 <translation id="6579159469348633828">Codificació de contingut Brotli.</translation>
+<translation id="6580151766480067746">Versió d'ARC</translation>
 <translation id="6581162200855843583">Enllaç de Google Drive</translation>
 <translation id="6583070985841601920">Heu iniciat la sessió com a <ph name="USER_EMAIL_ADDRESS" />. L'administrador ha desactivat la sincronització.</translation>
 <translation id="65832705307647870">Emplena prèviament la pàgina Pestanya nova amb llocs populars.</translation>
@@ -3993,6 +4007,7 @@
 <translation id="6847758263950452722">Desa la pàgina com a MHTML</translation>
 <translation id="6853388645642883916">S'ha posat l'actualitzador en repòs.</translation>
 <translation id="68541483639528434">Tanca les altres pestanyes</translation>
+<translation id="6856701878604560493">Activa les adreces d'interès sense connexió</translation>
 <translation id="6860097299815761905">Config. servidor interm.</translation>
 <translation id="6860427144121307915">Obre en una pestanya</translation>
 <translation id="6862635236584086457">Es fa una còpia de seguretat en línia automàticament de tots els fitxers desats en aquesta carpeta</translation>
@@ -4165,6 +4180,7 @@
 <translation id="7092106376816104">Excepcions de finestres emergents</translation>
 <translation id="7093866338626856921">Intercanviar dades amb els dispositius <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Voleu descobrir més funcions increïbles?</translation>
+<translation id="7096108453481049031">L'usuari supervisat no s'ha pogut importar. Comproveu la connexió a la xarxa i torneu-ho a provar més tard.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> elements seleccionats</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Compra més emmagatzematge...</translation>
@@ -4193,6 +4209,7 @@
 <translation id="713888829801648570">La contrasenya no s'ha pogut verificar perquè no esteu connectat a Internet.</translation>
 <translation id="7140928199327930795">No hi ha cap altre dispositiu disponible.</translation>
 <translation id="7141105143012495934">S'ha produït un problema en iniciar la sessió perquè no s'ha pogut recuperar la informació del compte. Contacteu amb l'administrador o torneu a provar-ho.</translation>
+<translation id="7141331524324591758">Activa la compatibilitat parcial i experimental amb l'API d'Esdeveniments del punter. Aquesta política està dissenyada exclusivament perquè els desenvolupadors web facin proves i causarà errors gairebé imperceptibles en alguns llocs web.</translation>
 <translation id="7143207342074048698">S'està connectant</translation>
 <translation id="7144878232160441200">Torna-ho a provar</translation>
 <translation id="7148311641502571842">S'ha desactivat <ph name="PLUGIN_NAME" />. Per tornar a activar-lo, aneu a <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4833,6 +4850,7 @@
 <translation id="8119572489781388874">Modifica la configuració</translation>
 <translation id="8119631488458759651">elimina aquest lloc</translation>
 <translation id="8121385576314601440">Configuració de la introducció en mode Hangul</translation>
+<translation id="8122245494004914423">Amb aquesta acció, se suprimiran les vostres dades de navegació d'aquest dispositiu de manera permanent. Per recuperar les vostres dades més endavant, inicieu la sessió a Chrome com a $2.</translation>
 <translation id="8124313775439841391">ONC gestionat</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Permet l'ús de certificats no vàlids quan es carreguin recursos des del localhost.</translation>
@@ -4917,6 +4935,7 @@
 <translation id="8226742006292257240">A continuació, trobareu la contrasenya de TPM generada aleatòriament que s'ha assignat al vostre ordinador:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Els atacants que actualment són a <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> poden provar d'instal·lar programes perillosos a l'ordinador amb els quals es pot robar o suprimir la vostra informació (per exemple, les fotos, les contrasenyes, els missatges i les targetes de crèdit).</translation>
+<translation id="8233254008506535819">Inclou al quadre de diàleg Esborra les dades de navegació l'opció per afegir llocs importants a la llista blanca.</translation>
 <translation id="8236231079192337250">Aplicació Galeria de Chrome Web Store per a controladors d'impressora</translation>
 <translation id="8238649969398088015">Consell d'ajuda</translation>
 <translation id="8240697550402899963">Utilitza el tema Clàssic</translation>
@@ -4942,7 +4961,7 @@
 <translation id="8261378640211443080">Aquesta extensió no apareix a <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> i és possible que s'hagi afegit sense que ho sapigueu.</translation>
 <translation id="8261387128019234107">Afegeix un compte per a: <ph name="PROFILE_NAME" /></translation>
 <translation id="8261490674758214762">Poden:</translation>
-<translation id="8261506727792406068">Elimina</translation>
+<translation id="8261506727792406068">Suprimeix</translation>
 <translation id="8261580862248730866">Excepcions del micròfon</translation>
 <translation id="8261673729476082470">S'està creant una còpia de seguretat de <ph name="FILE_COUNT" /> fotos a <ph name="BEGIN_LINK" />Google Drive<ph name="END_LINK" /></translation>
 <translation id="8263231521757761563">Gestors de protocols actius</translation>
@@ -5240,7 +5259,6 @@
 <translation id="8708671767545720562">&amp;Més informació</translation>
 <translation id="8711402221661888347">Hamburguesa</translation>
 <translation id="8711453844311572806">Si el telèfon està desbloquejat i a prop, només heu de fer clic per accedir-hi. En cas contrari, es mostra una icona de bloqueig i heu d'escriure la contrasenya.</translation>
-<translation id="8712637175834984815">D'acord</translation>
 <translation id="8713570323158206935">Envia <ph name="BEGIN_LINK1" />informació del sistema<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Activa la correcció automàtica al teclat físic dels EUA, per obtenir suggeriments a mesura que s'escriu en un teclat físic.</translation>
 <translation id="871476437400413057">Contrasenyes desades de Google</translation>
@@ -5603,6 +5621,7 @@
 <translation id="952992212772159698">No activat</translation>
 <translation id="953000875543358078">Això pot tardar més o menys un minut</translation>
 <translation id="960987915827980018">Queda cosa d'una hora</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Amb aquesta acció, se suprimirà $1 element d'aquest dispositiu de manera permanent. Per recuperar les vostres dades més endavant, inicieu la sessió a Chrome com a $2.}other{Amb aquesta acció, se suprimiran $1 elements d'aquest dispositiu de manera permanent. Per recuperar les vostres dades més endavant, inicieu la sessió a Chrome com a $2.}}</translation>
 <translation id="96421021576709873">Xarxa Wi-Fi</translation>
 <translation id="965490406356730238">Si està disponible, activeu la descodificació de mjpeg accelerada amb maquinari per als fotogrames capturats.</translation>
 <translation id="968174221497644223">Memòria cau de l'aplicació</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 5fab51e0..0c893d16 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -251,6 +251,7 @@
         Ve všech zařízeních kompatibilních s účtem <ph name="USER_DISPLAY_EMAIL" /> bude zapnuto rozhraní Bluetooth a některé informace o hardwaru budou odeslány do Googlu. &lt;a&gt;Další informace&lt;/a&gt;</translation>
 <translation id="13649080186077898">Spravovat nastavení Automatického vyplňování</translation>
 <translation id="1367951781824006909">Vybrat soubor</translation>
+<translation id="136802136832547685">Nejsou k dispozici žádní dozorovaní uživatelé, které by do tohoto zařízení bylo možné přidat.</translation>
 <translation id="1368265273904755308">Nahlásit problém</translation>
 <translation id="1368832886055348810">Zleva doprava</translation>
 <translation id="1370646789215800222">Odebrat uživatele?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Vyhledávání</translation>
 <translation id="1384211230590313258">Obslužný nástroj rozpoznávání služeb</translation>
 <translation id="1386387014181100145">Nazdárek!</translation>
+<translation id="1386830813511981192">Ve vašem zařízení <ph name="DEVICE_TYPE" /> je nyní k dispozici více než milion aplikací a her.</translation>
 <translation id="1389297115360905376">Lze přidat pouze ze stránek <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Otevřít jako běžnou kartu</translation>
 <translation id="1395262318152388157">Posuvník přehrávání</translation>
@@ -890,6 +892,7 @@
 <translation id="2280486287150724112">Pravý okraj</translation>
 <translation id="2282146716419988068">Proces GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Nová verze intervence uživatelského agenta pro načítání webových písem</translation>
 <translation id="2286454467119466181">Jednoduché</translation>
 <translation id="2286950485307333924">Nyní jste do Chromu přihlášeni</translation>
 <translation id="2287590536030307392">Vypne všechna bezdrátová připojení.</translation>
@@ -1067,6 +1070,7 @@
 <translation id="2542049655219295786">Tabulka Google</translation>
 <translation id="2546283357679194313">Soubory cookie a data webových stránek</translation>
 <translation id="2549646943416322527">Detektor Seccomp</translation>
+<translation id="2550212893339833758">Stránkovaná paměť</translation>
 <translation id="2553100941515833716">Při každém restartu resetovat stav instalace spouštěče aplikací</translation>
 <translation id="2553340429761841190">Systému <ph name="PRODUCT_NAME" /> se nepodařilo připojit k síti <ph name="NETWORK_ID" />. Vyberte jinou síť nebo to zkuste znovu.</translation>
 <translation id="2553440850688409052">Skrýt tento plugin</translation>
@@ -1100,6 +1104,7 @@
 <translation id="2587203970400270934">Kód operátora:</translation>
 <translation id="2587922270115112871">Vytvořením dozorovaného uživatele nebude vytvořen účet Google. Nastavení
     a údaje uživatele nebudou přenesena do dalších zařízení využívajících synchronizaci Chrome. Profil dozorovaného uživatele bude použit pouze v tomto zařízení.</translation>
+<translation id="2594049137847833442">Možnosti důležitých webů v dialogovém okně vymazání údajů o prohlížení</translation>
 <translation id="2594056015203442344">Když je tato funkce povolena, indikátory zvuku na liště karet budou fungovat také jako ovládací prvky k vypnutí nebo zapnutí zvuku karty. Do kontextové nabídky karet budou také přidány příkazy, pomocí kterých lze rychle vypnout zvuk několika vybraných karet.</translation>
 <translation id="259421303766146093">Zmenšit</translation>
 <translation id="2597852038534460976">Chrome nemůže získat přístup k tapetám. Připojte se k síti.</translation>
@@ -1467,7 +1472,6 @@
 <translation id="3065140616557457172">Zadejte text pro vyhledávání nebo adresu URL – funguje vše.</translation>
 <translation id="3067198360141518313">Spustit plugin</translation>
 <translation id="307519606911195071">Povolit na stránce Nastavení další funkce přístupnosti.</translation>
-<translation id="3075239840551149663">Vytvořili jste dozorovaného uživatele <ph name="NEW_PROFILE_NAME" />!</translation>
 <translation id="3075874217500066906">K zahájení obnovení pomocí funkce Powerwash je vyžadován restart. Po restartování budete požádáni o potvrzení, že chcete pokračovat.</translation>
 <translation id="3076677906922146425">Umožnit komukoli přidání uživatele do Chromu</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1484,6 +1488,7 @@
 <translation id="3088034400796962477">Přepis (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Přejmenovat...</translation>
 <translation id="308903551226753393">Konfigurovat automaticky</translation>
+<translation id="3089231390674410424">Zdá se, že došlo k problému s vašimi identifikačními údaji. Zkontrolujte, zda jste správně přihlášeni, a zkuste to znovu.</translation>
 <translation id="3090819949319990166">Obsah externího souboru CRX nelze zkopírovat do souboru <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">Zařízení „<ph name="DEVICE_NAME" />“ bylo spárováno</translation>
 <translation id="3092544800441494315">Přiložit tento snímek obrazovky:</translation>
@@ -2008,7 +2013,6 @@
 <translation id="3790856258139356663">Připojí se k testovacímu serveru Synchronizace Chromu.</translation>
 <translation id="3790909017043401679">Zadejte PIN SIM karty</translation>
 <translation id="3792890930871100565">Odpojit tiskárny</translation>
-<translation id="3795681127952030401"><ph name="URL" /> vám chce zasílat oznámení.</translation>
 <translation id="3796648294839530037">Oblíbené sítě:</translation>
 <translation id="3797900183766075808">&amp;Vyhledat „<ph name="SEARCH_TERMS" />“ pomocí vyhledávače <ph name="SEARCH_ENGINE" /></translation>
 <translation id="3798449238516105146">Verze</translation>
@@ -2481,6 +2485,7 @@
 <translation id="4552678318981539154">Koupit větší úložiště</translation>
 <translation id="4554591392113183336">Externí rozšíření má stejnou nebo nižší verzi než stávající.</translation>
 <translation id="4554796861933393312">Rychlost animace kapky inkoustu ve vzhledu Material Design</translation>
+<translation id="4555670907822902621">Povolit ukládání stránek přidaných do záložek k zobrazení offline.</translation>
 <translation id="4555769855065597957">Stín</translation>
 <translation id="4556110439722119938">Vaše záložky, historie, hesla a další nastavení budou synchronizována do účtu Google, abyste je mohli používat ve všech svých zařízeních.</translation>
 <translation id="4557136421275541763">Upozornění:</translation>
@@ -2655,6 +2660,7 @@
 <translation id="4824518112777153488">Podpora pro dotykové obrazovky s funkcí umístění ukazatele</translation>
 <translation id="4830573902900904548">Váš <ph name="DEVICE_TYPE" /> se pomocí sítě <ph name="NETWORK_NAME" /> nemůže připojit k internetu. Zkuste prosím jinou síť. <ph name="LEARN_MORE_LINK_START" />Další informace<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Identita organizace <ph name="ORGANIZATION" /> se sídlem na adrese <ph name="LOCALITY" /> byla ověřena organizací <ph name="ISSUER" />. Server poskytl platné údaje o transparentnosti certifikátu.</translation>
+<translation id="4832537345877333532">Zakázat stahování souborů ICC displejů ze serveru Quirks Server pro kalibraci barev displeje.</translation>
 <translation id="4834912470034578916">Povolit vlastní rozvržení pro oznámení Web Notifications</translation>
 <translation id="4835836146030131423">Chyba přihlašování.</translation>
 <translation id="4837926214103741331">Nemáte oprávnění používat toto zařízení. Kontaktujte vlastníka zařízení a požádejte jej o oprávnění k přihlášení.</translation>
@@ -2842,6 +2848,7 @@
 <translation id="5120421890733714118">Důvěřovat tomuto certifikátu k identifikaci webových stránek.</translation>
 <translation id="5121130586824819730">Pevný disk je plný. Uložte prosím soubor do jiného umístění nebo uvolněte místo na disku.</translation>
 <translation id="5125751979347152379">Neplatná adresa URL.</translation>
+<translation id="5126663277159826272">Zakázat klienta Quirks Client pro kalibraci displeje</translation>
 <translation id="5127881134400491887">Správa síťových připojení</translation>
 <translation id="5128590998814119508">Seznam zobrazení prvků canvas 2D</translation>
 <translation id="512903556749061217">připojeno</translation>
@@ -2981,9 +2988,11 @@
 <translation id="5301751748813680278">Vstupujete jako host.</translation>
 <translation id="5301954838959518834">Ano, chápu</translation>
 <translation id="5302048478445481009">Jazyk</translation>
+<translation id="5304039790201806037">Události ukazovacích zařízení</translation>
 <translation id="5305688511332277257">Není nainstalován žádný certifikát</translation>
 <translation id="5308380583665731573">Připojení</translation>
 <translation id="5311260548612583999">Soubor soukromého klíče (volitelné):</translation>
+<translation id="5313967007315987356">Přidat web</translation>
 <translation id="5316588172263354223">Hlasové vyhledávání kdykoliv</translation>
 <translation id="5316716239522500219">Zrcadlit monitory</translation>
 <translation id="5317780077021120954">Uložit</translation>
@@ -3286,6 +3295,7 @@
 <translation id="5734362860645681824">Komunikační příslušenství</translation>
 <translation id="573719557377416048">Vymazat stav souběžné přítomnosti zařízení v okolí</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: kliknutím upravte</translation>
+<translation id="5741454054957165976">Povolí novou verzi intervence uživatelského agenta pro načítání webových písem.</translation>
 <translation id="574392208103952083">Střední</translation>
 <translation id="5745056705311424885">Byla rozpoznána paměťová jednotka USB</translation>
 <translation id="5746169159649715125">Uložit jako PDF</translation>
@@ -3334,7 +3344,6 @@
 <translation id="5803531701633845775">Vybírat sousloví odzadu bez přesunutí kurzoru</translation>
 <translation id="5804241973901381774">Oprávnění</translation>
 <translation id="580571955903695899">Znovu uspořádat podle názvu</translation>
-<translation id="5808982448801399019">Autorizace se nezdařila</translation>
 <translation id="580961539202306967">Zeptat se, když mi chce web odeslat nabízenou zprávu (doporučeno)</translation>
 <translation id="5815645614496570556">Adresa X.400</translation>
 <translation id="5817397429773072584">Tradiční čínština</translation>
@@ -3359,6 +3368,7 @@
 <translation id="5834581999798853053">Zbývá přibližně <ph name="TIME" /> min</translation>
 <translation id="5838825566232597749">Americká mezinárodní klávesnice s rozložením Workman</translation>
 <translation id="5839277899276241121">Stejná jako fakturační adresa</translation>
+<translation id="5844550873065695788">Touto akcí z tohoto zařízení trvale smažete minimálně následující počet položek: <ph name="TOTAL_COUNT" />. Budete-li chtít své údaje později stáhnout, přihlaste se do Chromu jako $2.</translation>
 <translation id="5846929185714966548">Karta 4</translation>
 <translation id="5848934677402291689">Probíhá ukládání do souboru PDF</translation>
 <translation id="5849335628409778954">Zadat platební kartu...</translation>
@@ -3605,6 +3615,7 @@
 <translation id="6232017090690406397">Baterie</translation>
 <translation id="6241530762627360640">Přístup k informacím o zařízeních Bluetooth spárovaných s vaším systémem a objevování zařízení Bluetooth v okolí</translation>
 <translation id="6243774244933267674">Server není dostupný</translation>
+<translation id="6246413617632217567">Import dozorovaného uživatele se nezdařil. Zkontrolujte místo na disku a oprávnění a zkuste to znovu.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" /> %</translation>
 <translation id="624789221780392884">Je připravena aktualizace</translation>
 <translation id="6248400709929739064">Zapnout titulky</translation>
@@ -3633,6 +3644,7 @@
 <translation id="6277518330158259200">&amp;Pořídit snímek obrazovky</translation>
 <translation id="6279183038361895380">Kurzor zobrazíte stisknutím klávesy |<ph name="ACCELERATOR" />|</translation>
 <translation id="6280215091796946657">Přihlásit se pomocí jiného účtu</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Experiment, který umožňuje všem rozhraním API reflektovat viewport rozvržení. Nastavení window.scroll bude tudíž vycházet z viewportu rozvržení.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nová tiskárna v síti}few{Nové tiskárny v síti}many{Nové tiskárny v síti}other{Nové tiskárny v síti}}</translation>
 <translation id="6285395082104474418">Na stavovém panelu se zobrazuje aktuální stav sítě a baterie a další informace.</translation>
@@ -3688,6 +3700,7 @@
 <translation id="6380143666419481200">Přijmout a pokračovat</translation>
 <translation id="6380224340023442078">Nastavení obsahu...</translation>
 <translation id="6383194710567510941">Umožňuje aktivovat rozhraní chrome.input.ime API.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Touto akcí z tohoto zařízení trvale smažete minimálně $1 položku. Budete-li chtít své údaje později stáhnout, přihlaste se do Chromu jako $2.}few{Touto akcí z tohoto zařízení trvale smažete minimálně $1 položky. Budete-li chtít své údaje později stáhnout, přihlaste se do Chromu jako $2.}many{Touto akcí z tohoto zařízení trvale smažete minimálně $1 položky. Budete-li chtít své údaje později stáhnout, přihlaste se do Chromu jako $2.}other{Touto akcí z tohoto zařízení trvale smažete minimálně $1 položek. Budete-li chtít své údaje později stáhnout, přihlaste se do Chromu jako $2.}}</translation>
 <translation id="6384275966486438344">Změňte nastavení vyhledávání na: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Stránky, které otevřete v tomto okně, nebudou uvedeny v historii prohlížeče a nezanechají v počítači po zavření všech oken hosta žádné stopy, např. soubory cookie. Všechny stažené soubory však budou zachovány.</translation>
 <translation id="6391538222494443604">Vstupní adresář musí existovat.</translation>
@@ -3826,6 +3839,7 @@
 <translation id="6575134580692778371">Není konfigurováno</translation>
 <translation id="6575251558004911012">Zeptat se, když web požaduje přístup k vaší kameře (doporučeno)</translation>
 <translation id="6579159469348633828">Kódování obsahu Brotli</translation>
+<translation id="6580151766480067746">Verze ARC</translation>
 <translation id="6581162200855843583">Odkaz na Disk Google</translation>
 <translation id="6583070985841601920">Jste přihlášeni k účtu <ph name="USER_EMAIL_ADDRESS" />. Synchronizace byla zakázána vaším administrátorem.</translation>
 <translation id="65832705307647870">Předvyplnit stránku Nová karta populárními weby.</translation>
@@ -3991,6 +4005,7 @@
 <translation id="6847758263950452722">Uložit stránku ve formátu MHTML</translation>
 <translation id="6853388645642883916">Nástroj na aktualizaci je v režimu spánku</translation>
 <translation id="68541483639528434">Zavřít ostatní karty</translation>
+<translation id="6856701878604560493">Aktivovat offline záložky</translation>
 <translation id="6860097299815761905">Nastavení proxy serveru...</translation>
 <translation id="6860427144121307915">Otevřít na kartě</translation>
 <translation id="6862635236584086457">Všechny soubory uložené v této složce se automaticky zálohují online</translation>
@@ -4164,6 +4179,7 @@
 <translation id="7092106376816104">Výjimky vyskakovacích oken</translation>
 <translation id="7093866338626856921">Výměna dat s následujícími zařízeními: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Chcete objevit další úžasné funkce?</translation>
+<translation id="7096108453481049031">Import dozorovaného uživatele se nezdařil. Zkontrolujte připojení k síti a zkuste to znovu.</translation>
 <translation id="7100897339030255923">Vybrané položky: <ph name="COUNT" /></translation>
 <translation id="710227449793100220">Token Binding</translation>
 <translation id="7106346894903675391">Koupit větší úložiště...</translation>
@@ -4192,6 +4208,7 @@
 <translation id="713888829801648570">Je nám líto, ale heslo nebylo možné ověřit, protože jste offline.</translation>
 <translation id="7140928199327930795">Nejsou k dispozici žádná další zařízení.</translation>
 <translation id="7141105143012495934">Přihlášení selhalo, protože se nepodařilo načíst podrobnosti účtu. Kontaktujte administrátora nebo to zkuste znovu.</translation>
+<translation id="7141331524324591758">Povolí experimentální podporu rozhraní Pointer Events API. Tento příznak je určen pouze pro webové vývojáře k testování. Způsobí, že některé weby budou fungovat nepatrně chybně.</translation>
 <translation id="7143207342074048698">Připojování</translation>
 <translation id="7144878232160441200">Opakovat</translation>
 <translation id="7148311641502571842">Plugin <ph name="PLUGIN_NAME" /> byl deaktivován. Chcete-li jej znovu aktivovat, přejděte na stránku <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4836,6 +4853,7 @@
 <translation id="8119572489781388874">Změnit nastavení</translation>
 <translation id="8119631488458759651">odstranit tyto stránky</translation>
 <translation id="8121385576314601440">Nastavení zadávání písma Hangul</translation>
+<translation id="8122245494004914423">Tímto z tohoto zařízení trvale smažete své údaje o prohlížení. Budete-li chtít své údaje později stáhnout, přihlaste se do Chromu jako $2.</translation>
 <translation id="8124313775439841391">Spravovaná ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Povolit neplatné certifikáty pro zdroje načítané z hostitele localhost</translation>
@@ -4921,6 +4939,7 @@
 <translation id="8226742006292257240">Níže je náhodně vygenerované heslo modulu TPM, které bylo přiřazeno vašemu počítači:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Útočníci, kteří se aktuálně nacházejí na webu <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />, se mohou pokusit nainstalovat do vašeho počítače nebezpečné programy, které mohou ukrást nebo smazat vaše informace (například fotky, hesla, zprávy nebo platební karty).</translation>
+<translation id="8233254008506535819">Zahrnout v dialogovém okně smazání údajů o prohlížení možnost přidání důležitých webů na seznam povolených.</translation>
 <translation id="8236231079192337250">Aplikace Galerie Internetového obchodu Chrome pro ovladače tiskáren</translation>
 <translation id="8238649969398088015">Tip nápovědy</translation>
 <translation id="8240697550402899963">Použít klasický motiv</translation>
@@ -5245,7 +5264,6 @@
 <translation id="8708671767545720562">&amp;Další informace</translation>
 <translation id="8711402221661888347">Hamburger</translation>
 <translation id="8711453844311572806">Když je váš telefon odemknut a je poblíž, stačí ke vstupu pouze kliknout. V opačném případě se zobrazí ikona uzamčení a bude nutné zadat heslo.</translation>
-<translation id="8712637175834984815">Hotovo</translation>
 <translation id="8713570323158206935">Odeslat <ph name="BEGIN_LINK1" />informace o systému<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Umožňuje aktivovat automatické opravy vstupu fyzické klávesnice pro anglickou (USA) klávesnici, které během psaní na fyzické klávesnici mohou zobrazovat návrhy.</translation>
 <translation id="871476437400413057">hesla uložená Googlem</translation>
@@ -5609,6 +5627,7 @@
 <translation id="952992212772159698">Není aktivováno</translation>
 <translation id="953000875543358078">Tato akce může trvat i minutu nebo déle</translation>
 <translation id="960987915827980018">Zbývá přibližně hodina</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Touto akcí z tohoto zařízení trvale smažete $1 položku. Budete-li chtít své údaje později stáhnout, přihlaste se do Chromu jako $2.}few{Touto akcí z tohoto zařízení trvale smažete $1 položky. Budete-li chtít své údaje později stáhnout, přihlaste se do Chromu jako $2.}many{Touto akcí z tohoto zařízení trvale smažete $1 položky. Budete-li chtít své údaje později stáhnout, přihlaste se do Chromu jako $2.}other{Touto akcí z tohoto zařízení trvale smažete $1 položek. Budete-li chtít své údaje později stáhnout, přihlaste se do Chromu jako $2.}}</translation>
 <translation id="96421021576709873">Síť Wi-Fi</translation>
 <translation id="965490406356730238">Umožňuje aktivovat hardwarově akcelerované dekódování souborů mjpeg pro zachycené rámce, jsou-li k dispozici.</translation>
 <translation id="968174221497644223">Mezipaměť aplikace</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 6fef843..c45505f 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -142,7 +142,7 @@
 <translation id="1196789802623400962">Aktivér/deaktiver muligheden for bevægelsesredigering på siden med indstillinger for det virtuelle tastatur.</translation>
 <translation id="1196849605089373692">Angiver kvalitetsindstilling for billeder ved nedskalering.</translation>
 <translation id="1197199342062592414">Lad os komme i gang</translation>
-<translation id="119738088725604856">Vindue med skærmbillede</translation>
+<translation id="119738088725604856">Tag skærmbillede af vindue</translation>
 <translation id="1197979282329025000">Der opstod en fejl under hentningen af udskriftsegenskaber for printeren <ph name="PRINTER_NAME" />. Denne printer kunne ikke registreres med <ph name="CLOUD_PRINT_NAME" />.</translation>
 <translation id="1198271701881992799">Lad os komme i gang</translation>
 <translation id="1199232041627643649">Hold <ph name="KEY_EQUIVALENT" /> nede for at afslutte.</translation>
@@ -251,6 +251,7 @@
       Bemærk, at Bluetooth vil være aktiveret for alle enheder, der er kompatible med <ph name="USER_DISPLAY_EMAIL" />, og visse hardwareoplysninger sendes til Google. &lt;a&gt;Få flere oplysninger&lt;/a&gt;</translation>
 <translation id="13649080186077898">Administrer indstillinger for AutoFyld</translation>
 <translation id="1367951781824006909">Vælg en fil</translation>
+<translation id="136802136832547685">Der er ingen administrerede brugere at føje til denne enhed.</translation>
 <translation id="1368265273904755308">Rapportér problem</translation>
 <translation id="1368832886055348810">Venstre til højre</translation>
 <translation id="1370646789215800222">Vil du fjerne personen?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Søg</translation>
 <translation id="1384211230590313258">Værktøj til håndtering af søgefunktionen til tjenester</translation>
 <translation id="1386387014181100145">Davs!</translation>
+<translation id="1386830813511981192">Over en million apps og spil er nu tilgængelige på din <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Denne kan kun installeres via <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Åbn som almindelig fane</translation>
 <translation id="1395262318152388157">Søgeskyder</translation>
@@ -889,6 +891,7 @@
 <translation id="2280486287150724112">Højremargen</translation>
 <translation id="2282146716419988068">GPU-proces</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">En ny version af indgriben fra brugeragent i forbindelse med indlæsning af WebFonts.</translation>
 <translation id="2286454467119466181">Simple</translation>
 <translation id="2286950485307333924">Du er nu logget ind på Chrome</translation>
 <translation id="2287590536030307392">Sluk for alle trådløse forbindelser.</translation>
@@ -1066,6 +1069,7 @@
 <translation id="2542049655219295786">Google-tabel</translation>
 <translation id="2546283357679194313">Cookies og websitedata</translation>
 <translation id="2549646943416322527">Seccomp-registrering</translation>
+<translation id="2550212893339833758">Ombyttet hukommelse</translation>
 <translation id="2553100941515833716">Gendan installationstilstanden for applisten ved genstart.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> kunne ikke oprette forbindelse til <ph name="NETWORK_ID" />. Vælg et andet netværk, eller prøv igen.</translation>
 <translation id="2553440850688409052">Skjul dette plugin</translation>
@@ -1100,6 +1104,7 @@
 <translation id="2587922270115112871">Der oprettes ikke automatisk en Google-konto, når du opretter en administreret bruger, og indstillinger
     og data for denne bruger følger ikke automatisk med til andre enheder med Chrome-synkronisering.
     Brugeren er kun administreret på denne enhed.</translation>
+<translation id="2594049137847833442">Indstillinger for vigtige websites i dialogboksen til rydning af browserdata</translation>
 <translation id="2594056015203442344">Hvis lydindikatorerne i fanelinjen aktiveres, kan de også bruges som kontrolknapper til fanernes lyd. Dette tilføjer også kommandoer under fanens genvejsmenu, som kan bruges til hurtigt at slå lyd til og fra for flere markerede faner.</translation>
 <translation id="259421303766146093">Ophæv forstørrelse</translation>
 <translation id="2597852038534460976">Chrome kan ikke få adgang til baggrunde. Opret forbindelse til et netværk.</translation>
@@ -1469,7 +1474,6 @@
 <translation id="3065140616557457172">Tast for at søge, eller angiv en webadresse for at navigere – det hele virker.</translation>
 <translation id="3067198360141518313">Kør dette plugin</translation>
 <translation id="307519606911195071">Aktivér flere hjælpefunktioner på siden Indstillinger.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> er blevet oprettet som en administreret bruger.</translation>
 <translation id="3075874217500066906">Enheden skal genstartes for at begynde Powerwash-processen. Efter genstart vil du blive bedt om at bekræfte, at du vil fortsætte.</translation>
 <translation id="3076677906922146425">Lad andre føje en person til Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1486,6 +1490,7 @@
 <translation id="3088034400796962477">Translitteration (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Omdøb...</translation>
 <translation id="308903551226753393">Konfigurer automatisk</translation>
+<translation id="3089231390674410424">Det ser ud til, at der er et problem med dine loginoplysninger. Sørg for, at du er logget ind på korrekt vis, og prøv igen.</translation>
 <translation id="3090819949319990166">Ekstern crx-fil kan ikke kopieres til <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" er parret</translation>
 <translation id="3092544800441494315">Inkluder dette skærmbillede:</translation>
@@ -2013,7 +2018,6 @@
 <translation id="3790856258139356663">Opretter forbindelse til testserveren for Chrome-synkronisering.</translation>
 <translation id="3790909017043401679">Indtast pinkode til SIM-kort</translation>
 <translation id="3792890930871100565">Afbryd printere</translation>
-<translation id="3795681127952030401"><ph name="URL" /> vil gerne sende dig underretninger.</translation>
 <translation id="3796648294839530037">Foretrukne netværk:</translation>
 <translation id="3797900183766075808">&amp;Søg på <ph name="SEARCH_ENGINE" /> efter "<ph name="SEARCH_TERMS" />"</translation>
 <translation id="3798449238516105146">Version</translation>
@@ -2486,6 +2490,7 @@
 <translation id="4552678318981539154">Køb mere lagerplads</translation>
 <translation id="4554591392113183336">Ekstern udvidelse er den samme version eller en ældre version end den eksisterende.</translation>
 <translation id="4554796861933393312">Animationshastighed for material design-blækdråbe</translation>
+<translation id="4555670907822902621">Aktivér, at sider med bogmærke gemmes til visning offline.</translation>
 <translation id="4555769855065597957">Skygge</translation>
 <translation id="4556110439722119938">Dine bogmærker, din historik, dine adgangskoder og andre indstillinger synkroniseres med din Google-konto, så du kan bruge dem på alle dine enheder</translation>
 <translation id="4557136421275541763">Advarsel!</translation>
@@ -2661,6 +2666,7 @@
 <translation id="4824518112777153488">Understøttelse af touchskærme, hvor du kan holde markøren over et element</translation>
 <translation id="4830573902900904548">Din <ph name="DEVICE_TYPE" /> kan ikke oprette forbindelse til internettet via <ph name="NETWORK_NAME" />. Vælg et andet netværk. <ph name="LEARN_MORE_LINK_START" />Få flere oplysninger<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Identiteten af <ph name="ORGANIZATION" /> i <ph name="LOCALITY" /> er blevet bekræftet af <ph name="ISSUER" />. Serveren leverede gyldige Certificate Transparency-oplysninger.</translation>
+<translation id="4832537345877333532">Deaktivér hentning af icc-filer til visning fra Quirks Server til farvekalibrering af visningen.</translation>
 <translation id="4834912470034578916">Aktivér tilpassede layouts for Webunderretninger.</translation>
 <translation id="4835836146030131423">Fejl under login.</translation>
 <translation id="4837926214103741331">Du har ikke tilladelse til at bruge denne enhed. Kontakt enhedsejeren for at få tilladelse til at logge ind.</translation>
@@ -2848,6 +2854,7 @@
 <translation id="5120421890733714118">Hav tillid til, at dette certifikat kan identificere websites.</translation>
 <translation id="5121130586824819730">Din harddisk er fuld. Gem på en anden placering, eller frigør mere plads på harddisken.</translation>
 <translation id="5125751979347152379">Ugyldig webadresse.</translation>
+<translation id="5126663277159826272">Deaktiver Quirks Client til kalibrering af visningen.</translation>
 <translation id="5127881134400491887">Administrere netværksforbindelser</translation>
 <translation id="5128590998814119508">Displayliste for 2D-lærred</translation>
 <translation id="512903556749061217">tilknyttet</translation>
@@ -2988,9 +2995,11 @@
 <translation id="5301751748813680278">Gæsteadgang.</translation>
 <translation id="5301954838959518834">OK, det er forstået</translation>
 <translation id="5302048478445481009">Sprog</translation>
+<translation id="5304039790201806037">Hændelser for pegeredskab</translation>
 <translation id="5305688511332277257">Ingen installeret</translation>
 <translation id="5308380583665731573">Få forbindelse</translation>
 <translation id="5311260548612583999">Privat nøglefil (valgfri):</translation>
+<translation id="5313967007315987356">Tilføj website</translation>
 <translation id="5316588172263354223">Talesøgning til enhver tid</translation>
 <translation id="5316716239522500219">Spejlvend skærmene</translation>
 <translation id="5317780077021120954">Gem</translation>
@@ -3293,6 +3302,7 @@
 <translation id="5734362860645681824">Kommunikation</translation>
 <translation id="573719557377416048">Slet tilstanden Copresence</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: vælg for at redigere</translation>
+<translation id="5741454054957165976">Aktivér ny version af indgriben fra brugeragent i forbindelse med indlæsning af WebFonts.</translation>
 <translation id="574392208103952083">Mellem</translation>
 <translation id="5745056705311424885">USB-nøgle er registreret</translation>
 <translation id="5746169159649715125">Gem som PDF</translation>
@@ -3341,7 +3351,6 @@
 <translation id="5803531701633845775">Vælg sætninger bagfra uden at flytte markøren</translation>
 <translation id="5804241973901381774">Tilladelser</translation>
 <translation id="580571955903695899">Omorganiser efter titel</translation>
-<translation id="5808982448801399019">Godkendelsen mislykkedes</translation>
 <translation id="580961539202306967">Spørg mig, når et website vil sende mig push-meddelelser (anbefales)</translation>
 <translation id="5815645614496570556">X.400-adresse</translation>
 <translation id="5817397429773072584">Kinesisk (traditionelt)</translation>
@@ -3366,6 +3375,7 @@
 <translation id="5834581999798853053">Omkring <ph name="TIME" /> minutter tilbage</translation>
 <translation id="5838825566232597749">Internationalt amerikansk Workman</translation>
 <translation id="5839277899276241121">Samme som faktureringsadressen</translation>
+<translation id="5844550873065695788">Denne handling sletter mindst <ph name="TOTAL_COUNT" /> elementer permanent fra denne enhed. Hvis du senere vil hente dine data igen, skal du logge ind i Chrome som $2.</translation>
 <translation id="5846929185714966548">Fane 4</translation>
 <translation id="5848934677402291689">Gemmer som PDF</translation>
 <translation id="5849335628409778954">Tilføj kreditkort...</translation>
@@ -3611,6 +3621,7 @@
 <translation id="6232017090690406397">Batteri</translation>
 <translation id="6241530762627360640">Få adgang til oplysninger om Bluetooth-enheder, der er parret med dit system, og registrér Bluetooth-enheder i nærheden.</translation>
 <translation id="6243774244933267674">Serveren er utilgængelig</translation>
+<translation id="6246413617632217567">Den administrerede bruger kunne ikke importeres. Kontrollér, om der er ledig plads på din harddisk, og at du har de rette tilladelser, og prøv igen.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" /> %</translation>
 <translation id="624789221780392884">Opdateringen er klar</translation>
 <translation id="6248400709929739064">Aktivér undertekster</translation>
@@ -3639,6 +3650,7 @@
 <translation id="6277518330158259200">T&amp;ag skærmbillede</translation>
 <translation id="6279183038361895380">Tryk på |<ph name="ACCELERATOR" />| at se markøren</translation>
 <translation id="6280215091796946657">Log ind med en anden konto</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Eksperiment, hvor alle API'er afspejler layoutvisningen. Dette gør window.scroll-egenskaber relevante for layoutvisningen.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Ny printer på dit netværk}one{Nye printere på dit netværk}other{Nye printere på dit netværk}}</translation>
 <translation id="6285395082104474418">I statusbakken kan du se den aktuelle status for dit netværk, batteri og meget mere.</translation>
@@ -3694,6 +3706,7 @@
 <translation id="6380143666419481200">Godkend og fortsæt</translation>
 <translation id="6380224340023442078">Indstillinger for indhold...</translation>
 <translation id="6383194710567510941">Aktivér brugen af chrome.input.ime API.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Denne handling sletter mindst $1 element permanent fra denne enhed. Hvis du senere vil hente dine data igen, skal du logge ind i Chrome som $2.}one{Denne handling sletter mindst $1 element permanent fra denne enhed. Hvis du senere vil hente dine data igen, skal du logge ind i Chrome som $2.}other{Denne handling sletter mindst $1 elementer permanent fra denne enhed. Hvis du senere vil hente dine data igen, skal du logge ind i Chrome som $2.}}</translation>
 <translation id="6384275966486438344">Skifte dine søgeindstillinger til: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">De sider, du ser i dette vindue, vises ikke i browserhistorikken, og de efterlader ikke andre spor som f.eks. cookies på computeren, når du lukker alle åbne vinduer i gæstesessionen. Alle de filer, du downloader, vil dog blive gemt.</translation>
 <translation id="6391538222494443604">Indtastningsindeks skal eksistere.</translation>
@@ -3832,6 +3845,7 @@
 <translation id="6575134580692778371">Ikke konfigureret</translation>
 <translation id="6575251558004911012">Spørg om tilladelse, hvis et website kræver adgang til dit kamera (anbefales)</translation>
 <translation id="6579159469348633828">Brotli Content-Encoding.</translation>
+<translation id="6580151766480067746">ARC-version</translation>
 <translation id="6581162200855843583">Link til Google Drev</translation>
 <translation id="6583070985841601920">Logget ind som <ph name="USER_EMAIL_ADDRESS" />. Synkronisering er deaktiveret af din administrator.</translation>
 <translation id="65832705307647870">Udfyld automatisk siden Ny fane med populære websites.</translation>
@@ -3997,6 +4011,7 @@
 <translation id="6847758263950452722">Gem side som MHTML</translation>
 <translation id="6853388645642883916">Opdateringsprogrammet er i dvale</translation>
 <translation id="68541483639528434">Luk alle andre faner</translation>
+<translation id="6856701878604560493">Aktivér bogmærker, der er gemt offline</translation>
 <translation id="6860097299815761905">Indstillinger for proxy...</translation>
 <translation id="6860427144121307915">Åbn på en fane</translation>
 <translation id="6862635236584086457">Alle de filer, der er gemt i denne mappe, sikkerhedskopieres automatisk online</translation>
@@ -4168,6 +4183,7 @@
 <translation id="7092106376816104">Undtagelser for pop op-vinduer</translation>
 <translation id="7093866338626856921">Udveksle data med enhederne ved navn: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Vil du opleve flere fantastiske funktioner?</translation>
+<translation id="7096108453481049031">Den overvågede bruger kunne ikke importeres. Kontrollér din netværksforbindelse, og prøv igen senere.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> elementer er markeret</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Køb mere lagerplads...</translation>
@@ -4196,6 +4212,7 @@
 <translation id="713888829801648570">Din adgangskode blev ikke bekræftet, fordi du er offline.</translation>
 <translation id="7140928199327930795">Der er ingen andre tilgængelige enheder.</translation>
 <translation id="7141105143012495934">Login mislykkedes, da dine kontooplysninger ikke kunne hentes. Kontakt din administrator, eller prøv igen.</translation>
+<translation id="7141331524324591758">Aktiverer delvis eksperimentel understøttelse af Pointer Events API. Dette er kun beregnet til, at webudviklere kan teste, og medfører små problemer på nogle websites.</translation>
 <translation id="7143207342074048698">Opretter forbindelse</translation>
 <translation id="7144878232160441200">Prøv igen</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> er blevet deaktiveret. Gå til <ph name="CHROME_PLUGINS_LINK" /> for at aktivere den igen .</translation>
@@ -4844,6 +4861,7 @@
 <translation id="8119572489781388874">Rediger indstillinger</translation>
 <translation id="8119631488458759651">fjern dette website</translation>
 <translation id="8121385576314601440">Indstillinger for Hangul-indtastning</translation>
+<translation id="8122245494004914423">Denne handling sletter dine browserdata permanent fra denne enhed. Hvis du senere vil hente dine data igen, skal du logge ind i Chrome som $2.</translation>
 <translation id="8124313775439841391">Administreret ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Tillad ugyldige certifikater til ressourcer, der indlæses fra localhost.</translation>
@@ -4929,6 +4947,7 @@
 <translation id="8226742006292257240">Nedenfor ses den vilkårlige TPM-adgangskode, der er tilknyttet din computer:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Hackere, der i øjeblikket befinder sig på <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />, vil muligvis forsøge at installere skadelige programmer på din computer, som stjæler eller sletter dine oplysninger (f.eks. billeder, adgangskoder, beskeder og kreditkortoplysninger).</translation>
+<translation id="8233254008506535819">Medtag muligheden for at hvidliste vigtige websites i dialogboksen til at rydde browserdata.</translation>
 <translation id="8236231079192337250">Chrome Webshop Galleri-appen til printerdrivere</translation>
 <translation id="8238649969398088015">Hjælpetip</translation>
 <translation id="8240697550402899963">Brug klassisk tema</translation>
@@ -5252,7 +5271,6 @@
 <translation id="8708671767545720562">&amp;Flere oplysninger</translation>
 <translation id="8711402221661888347">Elvis</translation>
 <translation id="8711453844311572806">Hvis din telefon er låst op og i nærheden, skal du blot klikke for at få adgang. Hvis ikke, får du vist en hængelås og er nødt til at indtaste din adgangskode.</translation>
-<translation id="8712637175834984815">Forstået</translation>
 <translation id="8713570323158206935">Send <ph name="BEGIN_LINK1" />systemoplysninger<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Aktivér fysisk tastaturstavekontrol for amerikansk tastatur, som kan give forslag, mens der tastes på det fysiske tastatur.</translation>
 <translation id="871476437400413057">Gemte adgangskoder på Google</translation>
@@ -5617,6 +5635,7 @@
 <translation id="952992212772159698">Ikke aktiveret</translation>
 <translation id="953000875543358078">Dette kan tage op til et minuts tid</translation>
 <translation id="960987915827980018">Omkring én time tilbage</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Denne handling sletter $1 element permanent fra denne enhed. Hvis du senere vil hente dine data igen, skal du logge ind i Chrome som $2.}one{Denne handling sletter $1 element permanent fra denne enhed. Hvis du senere vil hente dine data igen, skal du logge ind i Chrome som $2.}other{Denne handling sletter $1 elementer permanent fra denne enhed. Hvis du senere vil hente dine data igen, skal du logge ind i Chrome som $2.}}</translation>
 <translation id="96421021576709873">Wi-Fi-netværk</translation>
 <translation id="965490406356730238">Aktivér hardwareaccelereret MJPEG-afkodning for billeder, hvis muligt.</translation>
 <translation id="968174221497644223">Applikationscache</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index eb8d6d6..9de0819 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -142,7 +142,7 @@
 <translation id="1196789802623400962">Aktiviert/Deaktiviert die Option zum Bearbeiten mit Bewegungen auf der Einstellungsseite der Bildschirmtastatur.</translation>
 <translation id="1196849605089373692">Angabe der Qualitätseinstellung für aufgenommene Bilder bei Verkleinerung</translation>
 <translation id="1197199342062592414">Los geht's</translation>
-<translation id="119738088725604856">Screenshotfenster</translation>
+<translation id="119738088725604856">Screenshot von Fenster</translation>
 <translation id="1197979282329025000">Beim Abrufen der Druckerfunktionen für Drucker "<ph name="PRINTER_NAME" />" ist ein Fehler aufgetreten. Dieser Drucker konnte nicht mit <ph name="CLOUD_PRINT_NAME" /> registriert werden.</translation>
 <translation id="1198271701881992799">Erste Schritte</translation>
 <translation id="1199232041627643649">Zum Beenden <ph name="KEY_EQUIVALENT" /> gedrückt halten</translation>
@@ -251,6 +251,7 @@
       Hinweis: Bluetooth wird für alle kompatiblen Geräte von <ph name="USER_DISPLAY_EMAIL" /> aktiviert und bestimmte Hardwareinformationen werden an Google gesendet. &lt;a&gt;Weitere Informationen&lt;/a&gt;</translation>
 <translation id="13649080186077898">AutoFill-Einstellungen verwalten</translation>
 <translation id="1367951781824006909">Datei auswählen</translation>
+<translation id="136802136832547685">Es gibt keine betreuten Nutzer, die diesem Gerät hinzugefügt werden können.</translation>
 <translation id="1368265273904755308">Problem melden</translation>
 <translation id="1368832886055348810">Rechtsläufig</translation>
 <translation id="1370646789215800222">Person entfernen?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Suchen</translation>
 <translation id="1384211230590313258">Handler zur Diensterkennung</translation>
 <translation id="1386387014181100145">Hallo!</translation>
+<translation id="1386830813511981192">Sie haben auf Ihrem <ph name="DEVICE_TYPE" /> nun Zugriff auf Millionen von Apps und Spielen.</translation>
 <translation id="1389297115360905376">Dieser Artikel kann nur über den <ph name="CHROME_WEB_STORE" /> hinzugefügt werden.</translation>
 <translation id="1390548061267426325">In normalem Tab öffnen</translation>
 <translation id="1395262318152388157">Schieberegler für die Suche</translation>
@@ -889,6 +891,7 @@
 <translation id="2280486287150724112">Rechter Rand</translation>
 <translation id="2282146716419988068">GPU-Verarbeitung</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Neue Version des User-Agent-Eingriffs zum Laden von WebFonts.</translation>
 <translation id="2286454467119466181">Einfach</translation>
 <translation id="2286950485307333924">Sie sind jetzt in Chrome angemeldet.</translation>
 <translation id="2287590536030307392">Alle Drahtlosverbindungen werden deaktiviert.</translation>
@@ -1066,6 +1069,7 @@
 <translation id="2542049655219295786">Google-Tabelle</translation>
 <translation id="2546283357679194313">Cookies und Websitedaten</translation>
 <translation id="2549646943416322527">Seccomp-Detektor</translation>
+<translation id="2550212893339833758">Swap-Speicher</translation>
 <translation id="2553100941515833716">Installationsstatus des App Launchers bei jedem Neustart zurücksetzen</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> konnte keine Verbindung zu <ph name="NETWORK_ID" /> herstellen. Wählen Sie ein anderes Netzwerk oder versuchen Sie es erneut.</translation>
 <translation id="2553440850688409052">Dieses Plug-in ausblenden</translation>
@@ -1098,6 +1102,7 @@
 <translation id="2585300050980572691">Standardeinstellungen für die Suche</translation>
 <translation id="2587203970400270934">Betreibercode:</translation>
 <translation id="2587922270115112871">Beim Erstellen eines betreuten Nutzers wird kein Google-Konto erstellt und seine Einstellungen und Daten werden nicht über die Chrome-Synchronisierung auf anderen Geräten übernommen. Betreute Nutzer werden nur auf diesem Gerät eingerichtet.</translation>
+<translation id="2594049137847833442">Wichtige Standortoptionen im Dialogfeld "Browserdaten löschen"</translation>
 <translation id="2594056015203442344">Bei Aktivierung erhält die Audioanzeige in der Tableiste ein Steuerfeld zum Stummschalten des Tabs. Durch die Funktion werden außerdem im Tab-Kontextmenü Befehle hinzugefügt, mit denen sich mehrere ausgewählte Tabs schnell stummschalten lassen.</translation>
 <translation id="259421303766146093">Verkleinern</translation>
 <translation id="2597852038534460976">Chrome kann nicht auf Hintergründe zugreifen. Stellen Sie eine Verbindung zu einem Netzwerk her.</translation>
@@ -1465,7 +1470,6 @@
 <translation id="3065140616557457172">Einfach Suchbegriff oder Webadresse eingeben – alles ist möglich.</translation>
 <translation id="3067198360141518313">Dieses Plug-in ausführen</translation>
 <translation id="307519606911195071">Zusätzliche Bedienungshilfen auf der Seite "Einstellungen" aktivieren.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> wurde als betreuter Nutzer erstellt.</translation>
 <translation id="3075874217500066906">Zu Beginn des Powerwashs ist ein Neustart erforderlich. Nach dem Neustart werden Sie gefragt, ob der Vorgang fortgesetzt werden soll.</translation>
 <translation id="3076677906922146425">Jeder darf Personen zu Chrome hinzufügen.</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1482,6 +1486,7 @@
 <translation id="3088034400796962477">Transliteration (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Umbenennen...</translation>
 <translation id="308903551226753393">Automatisch konfigurieren</translation>
+<translation id="3089231390674410424">Bei Ihren Anmeldedaten ist ein Problem aufgetreten. Bitte melden Sie sich mit den korrekten Daten an und versuchen Sie es noch einmal.</translation>
 <translation id="3090819949319990166">Externe CRX-Datei konnte nicht als <ph name="TEMP_CRX_FILE" /> kopiert werden.</translation>
 <translation id="3090871774332213558">Pairing mit "<ph name="DEVICE_NAME" />" durchgeführt</translation>
 <translation id="3092544800441494315">Diesen Screenshot einfügen:</translation>
@@ -2009,7 +2014,6 @@
 <translation id="3790856258139356663">Verbindung mit dem Testserver für die Chrome-Synchronisierung wird hergestellt.</translation>
 <translation id="3790909017043401679">PIN der SIM-Karte eingeben</translation>
 <translation id="3792890930871100565">Druckerverbindungen trennen</translation>
-<translation id="3795681127952030401"><ph name="URL" /> möchte Ihnen Benachrichtigungen senden.</translation>
 <translation id="3796648294839530037">Bevorzugte Netzwerke:</translation>
 <translation id="3797900183766075808"><ph name="SEARCH_ENGINE" /> nach "<ph name="SEARCH_TERMS" />" durchsuchen</translation>
 <translation id="3798449238516105146">Version</translation>
@@ -2483,6 +2487,7 @@
 <translation id="4552678318981539154">Mehr Speicherplatz erwerben</translation>
 <translation id="4554591392113183336">Die Version der externen Erweiterung ist identisch mit der vorhandenen Version oder niedriger als diese.</translation>
 <translation id="4554796861933393312">Animationsgeschwindigkeit des Material Design-Tintentropfens</translation>
+<translation id="4555670907822902621">Speicherung von Seiten mit Lesezeichen für die Offlinewiedergabe aktivieren.</translation>
 <translation id="4555769855065597957">Schatten</translation>
 <translation id="4556110439722119938">Lesezeichen, Verlauf, Passwörter und andere Einstellungen werden mit Ihrem Google-Konto synchronisiert, damit Sie sie auf allen Ihren Geräten nutzen können.</translation>
 <translation id="4557136421275541763">Warnung:</translation>
@@ -2656,6 +2661,7 @@
 <translation id="4824518112777153488">Unterstützung für hoverfähige Touchscreens</translation>
 <translation id="4830573902900904548">Ihr Gerät (<ph name="DEVICE_TYPE" />) kann über <ph name="NETWORK_NAME" /> keine Internetverbindung herstellen. Bitte wählen Sie ein anderes Netzwerk aus. <ph name="LEARN_MORE_LINK_START" />Weitere Informationen<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Die Identität von <ph name="ORGANIZATION" /> in <ph name="LOCALITY" /> wurde von <ph name="ISSUER" /> bestätigt. Gültige Informationen zur Zertifikatstransparenz wurden vom Server bereitgestellt.</translation>
+<translation id="4832537345877333532">Abrufen der icc-Anzeigedateien für die Farbkalibrierung der Anzeige vom Quirks-Server deaktivieren.</translation>
 <translation id="4834912470034578916">Benutzerdefinierte Layouts für Webbenachrichtigungen aktivieren.</translation>
 <translation id="4835836146030131423">Fehler bei Anmeldung</translation>
 <translation id="4837926214103741331">Sie sind nicht zur Verwendung dieses Geräts berechtigt. Bitten Sie den Geräteinhaber um eine Anmeldeberechtigung.</translation>
@@ -2843,6 +2849,7 @@
 <translation id="5120421890733714118">Diesem Zertifikat zur Identifizierung von Websites vertrauen</translation>
 <translation id="5121130586824819730">Ihre Festplatte ist voll. Wählen Sie bitte einen anderen Speicherort aus oder geben Sie Speicherplatz auf der Festplatte frei.</translation>
 <translation id="5125751979347152379">Ungültige URL</translation>
+<translation id="5126663277159826272">Quirks-Client zur Kalibrierung der Anzeige deaktivieren.</translation>
 <translation id="5127881134400491887">Netzwerkverbindungen verwalten</translation>
 <translation id="5128590998814119508">2D-Canvasanzeigeliste</translation>
 <translation id="512903556749061217">angeschlossen</translation>
@@ -2982,9 +2989,11 @@
 <translation id="5301751748813680278">Anmeldung als Gast</translation>
 <translation id="5301954838959518834">OK</translation>
 <translation id="5302048478445481009">Sprache</translation>
+<translation id="5304039790201806037">Zeigerereignisse</translation>
 <translation id="5305688511332277257">Keine installiert</translation>
 <translation id="5308380583665731573">Verbinden</translation>
 <translation id="5311260548612583999">Private Schlüsseldatei (optional):</translation>
+<translation id="5313967007315987356">Website hinzufügen</translation>
 <translation id="5316588172263354223">Jederzeit die Sprachsuche nutzen</translation>
 <translation id="5316716239522500219">Monitore spiegeln</translation>
 <translation id="5317780077021120954">Speichern</translation>
@@ -3116,7 +3125,7 @@
 <translation id="5485102783864353244">App hinzufügen</translation>
 <translation id="5485754497697573575">Alle Tabs wiederherstellen</translation>
 <translation id="5486261815000869482">Passwort bestätigen</translation>
-<translation id="5486275809415469523"><ph name="APP_NAME" /> teilt Ihren Bildschirm mit <ph name="TAB_NAME" />.</translation>
+<translation id="5486275809415469523"><ph name="APP_NAME" /> teilt den Bildschirm mit <ph name="TAB_NAME" />.</translation>
 <translation id="5486326529110362464">Es muss ein Eingabewert für den privaten Schlüssel vorhanden sein.</translation>
 <translation id="5486561344817861625">Browser-Neustart simulieren</translation>
 <translation id="54870580363317966">Wählen Sie einen Avatar für den betreuten Nutzer aus.</translation>
@@ -3287,6 +3296,7 @@
 <translation id="5734362860645681824">Kommunikation</translation>
 <translation id="573719557377416048">Copresence-Status löschen</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: zum Bearbeiten auswählen</translation>
+<translation id="5741454054957165976">Neue Version des User-Agent-Eingriffs zum Laden von WebFonts aktivieren.</translation>
 <translation id="574392208103952083">Mittel</translation>
 <translation id="5745056705311424885">USB-Speicherstick gefunden</translation>
 <translation id="5746169159649715125">Als PDF speichern</translation>
@@ -3335,7 +3345,6 @@
 <translation id="5803531701633845775">Wortgruppen von hinten wählen, ohne den Cursor zu bewegen</translation>
 <translation id="5804241973901381774">Berechtigungen</translation>
 <translation id="580571955903695899">Neu sortieren nach Titel</translation>
-<translation id="5808982448801399019">Autorisierung fehlgeschlagen</translation>
 <translation id="580961539202306967">Nachfragen, wenn eine Website mir Push-Nachrichten senden möchte (empfohlen)</translation>
 <translation id="5815645614496570556">X.400-Adresse</translation>
 <translation id="5817397429773072584">Chinesisch (traditionell)</translation>
@@ -3360,6 +3369,7 @@
 <translation id="5834581999798853053">Noch etwa <ph name="TIME" /> Minuten</translation>
 <translation id="5838825566232597749">Internationale US-amerikanische Workman-Tastatur</translation>
 <translation id="5839277899276241121">Wie Rechnungsadresse</translation>
+<translation id="5844550873065695788">Dadurch werden mindestens <ph name="TOTAL_COUNT" /> Elemente dauerhaft von diesem Gerät gelöscht. Wenn Sie Ihre Daten später abrufen möchten, melden Sie sich als $2 in Chrome an.</translation>
 <translation id="5846929185714966548">Tab 4</translation>
 <translation id="5848934677402291689">Datei wird als PDF gespeichert</translation>
 <translation id="5849335628409778954">Kreditkartendaten eingeben...</translation>
@@ -3604,6 +3614,7 @@
 <translation id="6232017090690406397">Akku</translation>
 <translation id="6241530762627360640">Auf Informationen zu Bluetooth-Geräten mit Pairing mit Ihrem System zugreifen und Bluetooth-Geräte in der Nähe finden</translation>
 <translation id="6243774244933267674">Server nicht verfügbar</translation>
+<translation id="6246413617632217567">Der betreute Nutzer konnte nicht importiert werden. Bitte überprüfen Sie Ihren Festplattenspeicherplatz und Ihre Berechtigungen und versuchen Sie es noch einmal.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" /> %</translation>
 <translation id="624789221780392884">Update bereit</translation>
 <translation id="6248400709929739064">Untertitel aktivieren</translation>
@@ -3632,6 +3643,7 @@
 <translation id="6277518330158259200">Screenshot &amp;erstellen</translation>
 <translation id="6279183038361895380">Zum Einblenden des Cursors |<ph name="ACCELERATOR" />| drücken</translation>
 <translation id="6280215091796946657">Mit einem anderen Konto anmelden</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Experiment zur Übernahme des Layout-Darstellungsbereichs in allen APIs. Damit wird ein Verhältnis zwischen "window.scroll"-Eigenschaften und dem Layout-Darstellungsbereich hergestellt.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Neuer Drucker in Ihrem Netzwerk gefunden}other{Neue Drucker in Ihrem Netzwerk gefunden}}</translation>
 <translation id="6285395082104474418">In der Statusleiste wird unter anderem der aktuelle Status Ihres Netzwerks und Ihres Akkus angezeigt.</translation>
@@ -3687,6 +3699,7 @@
 <translation id="6380143666419481200">Akzeptieren und fortfahren</translation>
 <translation id="6380224340023442078">Inhaltseinstellungen...</translation>
 <translation id="6383194710567510941">Aktiviert die Verwendung der chrome.input.ime API.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Dadurch wird mindestens $1 Element dauerhaft von diesem Gerät gelöscht. Wenn Sie Ihre Daten später abrufen möchten, melden Sie sich als $2 in Chrome an.}other{Dadurch werden mindestens $1 Elemente dauerhaft von diesem Gerät gelöscht. Wenn Sie Ihre Daten später abrufen möchten, melden Sie sich als $2 in Chrome an.}}</translation>
 <translation id="6384275966486438344">Sucheinstellungen in <ph name="SEARCH_HOST" /> ändern</translation>
 <translation id="6390799748543157332">In diesem Fenster aufgerufene Seiten erscheinen nicht im Browserverlauf und hinterlassen auch keine anderweitigen Spuren wie Cookies auf dem Computer, nachdem Sie alle geöffneten Gastmodus-Fenster geschlossen haben. Heruntergeladene Dateien bleiben jedoch erhalten.</translation>
 <translation id="6391538222494443604">Eingabeverzeichnis muss vorhanden sein.</translation>
@@ -3825,6 +3838,7 @@
 <translation id="6575134580692778371">Nicht konfiguriert</translation>
 <translation id="6575251558004911012">Nachfragen, wenn eine Website auf Ihre Kamera zugreifen möchte (empfohlen)</translation>
 <translation id="6579159469348633828">Brotli Content-Encoding.</translation>
+<translation id="6580151766480067746">ARC-Version</translation>
 <translation id="6581162200855843583">Google Drive-Link</translation>
 <translation id="6583070985841601920">Angemeldet als <ph name="USER_EMAIL_ADDRESS" />. Die Synchronisierung wurde von Ihrem Administrator deaktiviert.</translation>
 <translation id="65832705307647870">"Neuer Tab"-Seite vorab mit beliebten Websites füllen.</translation>
@@ -3990,6 +4004,7 @@
 <translation id="6847758263950452722">Seite als MHTML speichern</translation>
 <translation id="6853388645642883916">Updater im Ruhemodus</translation>
 <translation id="68541483639528434">Andere Tabs schließen</translation>
+<translation id="6856701878604560493">Offlinelesezeichen aktivieren</translation>
 <translation id="6860097299815761905">Proxy-Einstellungen...</translation>
 <translation id="6860427144121307915">In Tab öffnen</translation>
 <translation id="6862635236584086457">Alle in diesem Ordner gespeicherten Dateien werden automatisch online gesichert.</translation>
@@ -4160,6 +4175,7 @@
 <translation id="7092106376816104">Ausnahmen für Pop-ups</translation>
 <translation id="7093866338626856921">Daten mit den Geräten mit folgenden Namen austauschen: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Möchten Sie weitere tolle Funktionen kennenlernen?</translation>
+<translation id="7096108453481049031">Der betreute Nutzer konnte nicht importiert werden. Bitte überprüfen Sie die Netzwerkverbindung und versuchen Sie es später noch einmal.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> Elemente ausgewählt</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Mehr Speicherplatz erwerben...</translation>
@@ -4188,6 +4204,7 @@
 <translation id="713888829801648570">Ihr Passwort konnte nicht überprüft werden, da Sie offline sind.</translation>
 <translation id="7140928199327930795">Keine weiteren Geräte vorhanden</translation>
 <translation id="7141105143012495934">Sie konnten nicht angemeldet werden, weil Ihre Kontodetails nicht abgerufen werden konnten. Bitte wenden Sie sich an Ihren Administrator oder versuchen Sie es erneut.</translation>
+<translation id="7141331524324591758">Aktiviert die teilweise experimentelle Unterstützung für die Pointer Events API. Dies ist nur für Tests durch Webentwickler vorgesehen. Einige Websites können dadurch kleine Fehler aufweisen.</translation>
 <translation id="7143207342074048698">Verbindung wird hergestellt.</translation>
 <translation id="7144878232160441200">Wiederholen</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> wurde deaktiviert. Rufen Sie <ph name="CHROME_PLUGINS_LINK" /> auf, um es wieder zu aktivieren.</translation>
@@ -4707,7 +4724,7 @@
 <translation id="7925686952655276919">Keine mobilen Daten für die Synchronisierung verwenden</translation>
 <translation id="7926906273904422255">Nicht sicheren Ursprung als nicht sicher oder als "zweifelhaft" markieren</translation>
 <translation id="7928710562641958568">Gerät auswerfen</translation>
-<translation id="79312157130859720"><ph name="APP_NAME" /> teilt Ihren Bildschirm und Ihr Audio.</translation>
+<translation id="79312157130859720"><ph name="APP_NAME" /> teilt Bildschirm und Audio.</translation>
 <translation id="7938594894617528435">Derzeit offline</translation>
 <translation id="7939374455203157513">Clouddienste aktivieren</translation>
 <translation id="7939412583708276221">Trotzdem beibehalten</translation>
@@ -4839,6 +4856,7 @@
 <translation id="8119572489781388874">Einstellungen ändern</translation>
 <translation id="8119631488458759651">Diese Website entfernen</translation>
 <translation id="8121385576314601440">Hangul-Eingabeeinstellungen</translation>
+<translation id="8122245494004914423">Dadurch werden Ihre Browserdaten dauerhaft von diesem Gerät gelöscht. Wenn Sie Ihre Daten später abrufen möchten, melden Sie sich als $2 in Chrome an.</translation>
 <translation id="8124313775439841391">Verwaltete ONC-Eigenschaften</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Ungültige Zertifikate für von localhost geladene Ressourcen erlauben</translation>
@@ -4923,6 +4941,7 @@
 <translation id="8226742006292257240">Hier ist das zufällig generierte TPM-Passwort, das Ihrem Computer zugewiesen wurde:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Zurzeit auf <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> befindliche Angreifer versuchen unter Umständen, gefährliche Programme auf Ihrem Computer zu installieren, um Ihre Daten zu stehlen oder zu löschen, zum Beispiel Fotos, Passwörter, Nachrichten und Kreditkartendaten.</translation>
+<translation id="8233254008506535819">Verwenden Sie die Option, um wichtige Websites im Dialogfeld "Browserdaten löschen" auf die weiße Liste zu setzen.</translation>
 <translation id="8236231079192337250">Chrome Web Store-Galerie App für Druckertreiber</translation>
 <translation id="8238649969398088015">Hilfe</translation>
 <translation id="8240697550402899963">Klassisches Design verwenden</translation>
@@ -5197,7 +5216,7 @@
 <translation id="8656768832129462377">Nicht überprüfen</translation>
 <translation id="8656946437567854031">Durch Klicken auf "Weiter" stimmen Sie den <ph name="LEGAL_DOC_LINK_TEXT_1" />, <ph name="LEGAL_DOC_LINK_TEXT_2" />, <ph name="LEGAL_DOC_LINK_TEXT_3" />, <ph name="LEGAL_DOC_LINK_TEXT_4" />, <ph name="LEGAL_DOC_LINK_TEXT_5" /> und der <ph name="LEGAL_DOC_LINK_TEXT_6" /> zu.</translation>
 <translation id="8658595122208653918">Druckeroptionen ändern...</translation>
-<translation id="8658645149275195032"><ph name="APP_NAME" /> teilt Ihren Bildschirm und Ihr Audio mit <ph name="TAB_NAME" />.</translation>
+<translation id="8658645149275195032"><ph name="APP_NAME" /> teilt Bildschirm und Audio mit <ph name="TAB_NAME" />.</translation>
 <translation id="8659716501582523573">IP-Adresse:</translation>
 <translation id="8661290697478713397">Link in Inko&amp;gnito-Fenster öffnen</translation>
 <translation id="8662795692588422978">Personen</translation>
@@ -5246,7 +5265,6 @@
 <translation id="8708671767545720562">&amp;Weitere Informationen</translation>
 <translation id="8711402221661888347">Burger</translation>
 <translation id="8711453844311572806">Wenn Ihr Telefon entsperrt und in der Nähe ist, können Sie Ihr Gerät mit nur einem Klick verwenden. Andernfalls sehen Sie ein Sperrsymbol und müssen Ihr Passwort eingeben.</translation>
-<translation id="8712637175834984815">Alles klar</translation>
 <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />Systeminformation<ph name="END_LINK1" /> senden</translation>
 <translation id="8713979477561846077">Aktiviert die Autokorrektur für physische Tastaturen für Englisch (USA). Damit erhalten Sie Vorschläge bei der Eingabe auf einer physischen Tastatur.</translation>
 <translation id="871476437400413057">In Google gespeicherte Passwörter</translation>
@@ -5609,6 +5627,7 @@
 <translation id="952992212772159698">Nicht aktiviert</translation>
 <translation id="953000875543358078">Dies kann etwa eine Minute dauern</translation>
 <translation id="960987915827980018">Noch etwa 1 Stunde</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Dadurch wird $1 Element dauerhaft von diesem Gerät gelöscht. Wenn Sie Ihre Daten später abrufen möchten, melden Sie sich als $2 in Chrome an.}other{Dadurch werden $1 Elemente dauerhaft von diesem Gerät gelöscht. Wenn Sie Ihre Daten später abrufen möchten, melden Sie sich als $2 in Chrome an.}}</translation>
 <translation id="96421021576709873">WLAN-Netzwerk</translation>
 <translation id="965490406356730238">Aktiviert die hardwarebeschleunigte MJPEG-Decodierung für erfasste Frames, falls verfügbar</translation>
 <translation id="968174221497644223">Cache</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index b51d5ff..ad6bbcf 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -252,6 +252,7 @@
       Λάβετε υπόψη ότι το Bluetooth θα ενεργοποιηθεί για όλες τις συμβατές συσκευές του <ph name="USER_DISPLAY_EMAIL" /> και ότι κάποιες πληροφορίες υλικού θα αποσταλούν στην Google. &lt;a&gt;Μάθετε περισσότερα&lt;/a&gt;</translation>
 <translation id="13649080186077898">Διαχείριση ρυθμίσεων Αυτόματης Συμπλήρωσης</translation>
 <translation id="1367951781824006909">Επιλογή αρχείου</translation>
+<translation id="136802136832547685">Δεν υπάρχουν εποπτευόμενοι χρήστες για προσθήκη σε αυτήν τη συσκευή.</translation>
 <translation id="1368265273904755308">Αναφορά προβλήματος</translation>
 <translation id="1368832886055348810">Από αριστερά προς τα δεξιά</translation>
 <translation id="1370646789215800222">Κατάργηση ατόμου;</translation>
@@ -265,6 +266,7 @@
 <translation id="1383876407941801731">Αναζήτηση</translation>
 <translation id="1384211230590313258">Δείκτης χειρισμού ανακάλυψης υπηρεσίας</translation>
 <translation id="1386387014181100145">Γεια σας.</translation>
+<translation id="1386830813511981192">Περισσότερες από ένα εκατομμύριο εφαρμογές και παιχνίδια είναι πλέον διαθέσιμα στη συσκευή σας <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Η προσθήκη αυτή είναι δυνατή μόνο από το <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Άνοιγμα σε κανονική καρτέλα</translation>
 <translation id="1395262318152388157">Ρυθμιστικό αναζήτησης</translation>
@@ -896,6 +898,7 @@
 <translation id="2280486287150724112">Δεξιό περιθώριο</translation>
 <translation id="2282146716419988068">Διαδικασία GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Νέα έκδοση της παρέμβασης παράγοντα χρήστη για τη φόρτωση γραμματοσειρών ιστού.</translation>
 <translation id="2286454467119466181">Απλή</translation>
 <translation id="2286950485307333924">Έχετε συνδεθεί στο Chrome</translation>
 <translation id="2287590536030307392">Απενεργοποίηση όλων των ασύρματων συνδέσεων.</translation>
@@ -1073,6 +1076,7 @@
 <translation id="2542049655219295786">Πίνακας Google</translation>
 <translation id="2546283357679194313">Cookie και δεδομένα ιστότοπου</translation>
 <translation id="2549646943416322527">Εργαλείο εντοπισμού Seccomp</translation>
+<translation id="2550212893339833758">Μνήμη ανταλλαγής</translation>
 <translation id="2553100941515833716">Επαναφορά της κατάστασης εγκατάστασης της Εφαρμογής εκκίνησης με κάθε επανεκκίνηση.</translation>
 <translation id="2553340429761841190">Το <ph name="PRODUCT_NAME" /> δεν ήταν δυνατό να συνδεθεί στο <ph name="NETWORK_ID" />. Επιλέξτε άλλο δίκτυο ή δοκιμάστε ξανά.</translation>
 <translation id="2553440850688409052">Απόκρυψη αυτής της προσθήκης</translation>
@@ -1106,6 +1110,7 @@
 <translation id="2587203970400270934">Κωδικός τελεστή:</translation>
 <translation id="2587922270115112871">Η δημιουργία ενός εποπτευόμενου χρήστη δεν δημιουργεί νέο Λογαριασμό Google και οι ρυθμίσεις
     και τα δεδομένα του μεταφέρονται σε άλλες συσκευές με το Συγχρονισμό Chrome. Οι εποπτευόμενοι χρήστες ισχύουν μόνο για αυτήν τη συσκευή.</translation>
+<translation id="2594049137847833442">Επιλογές σημαντικών ιστότοπων στο παράθυρο διαλόγου "Διαγραφή δεδομένων περιήγησης"</translation>
 <translation id="2594056015203442344">Κατά την ενεργοποίηση, οι ενδείξεις ήχου στη γραμμή καρτελών διπλασιάζονται καθώς ο ήχος καρτέλας θέτει σε σίγαση τα στοιχεία ελέγχου.  Με αυτόν τον τρόπο προστίθενται επίσης εντολές στο μενού περιεχομένου της καρτέλας για την εύκολη σίγαση πολλαπλά επιλεγμένων καρτελών.</translation>
 <translation id="259421303766146093">Κατάργηση μεγέθυνσης</translation>
 <translation id="2597852038534460976">Το Chrome δεν μπορεί να αποκτήσει πρόσβαση στις ταπετσαρίες. Συνδεθείτε σε ένα δίκτυο.</translation>
@@ -1475,7 +1480,6 @@
 <translation id="3065140616557457172">Πληκτρολογήστε για αναζήτηση ή εισαγάγετε μια διεύθυνση URL για πλοήγηση - όλα είναι δυνατά.</translation>
 <translation id="3067198360141518313">Εκτέλεση αυτής της προσθήκης</translation>
 <translation id="307519606911195071">Ενεργοποιήστε επιπλέον λειτουργίες προσβασιμότητας στη σελίδα "Ρυθμίσεις".</translation>
-<translation id="3075239840551149663">Δημιουργήθηκε το προφίλ εποπτευόμενου χρήστη <ph name="NEW_PROFILE_NAME" />!</translation>
 <translation id="3075874217500066906">Απαιτείται επανεκκίνηση προκειμένου να ξεκινήσει η διαδικασία Powerwash. Μετά την επανεκκίνηση, θα σας ζητηθεί να επιβεβαιώσετε ότι θέλετε να συνεχίσετε.</translation>
 <translation id="3076677906922146425">Να επιτρέπεται σε όλους τους χρήστες να προσθέτουν άτομα στο Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1492,6 +1496,7 @@
 <translation id="3088034400796962477">Μεταγραφή (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Μετονομασία...</translation>
 <translation id="308903551226753393">Αυτόματη διαμόρφωση</translation>
+<translation id="3089231390674410424">Φαίνεται πως υπάρχει πρόβλημα με τα διαπιστευτήριά σας. Βεβαιωθείτε ότι έχετε συνδεθεί σωστά και δοκιμάστε ξανά.</translation>
 <translation id="3090819949319990166">Δεν είναι δυνατή η αντιγραφή του εξωτερικού αρχείου crx στο <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">Έγινε σύζευξη της συσκευής "<ph name="DEVICE_NAME" />"</translation>
 <translation id="3092544800441494315">Συμπερίληψη αυτού του στιγμιότυπου οθόνης:</translation>
@@ -2022,7 +2027,6 @@
 <translation id="3790856258139356663">Συνδέεται με το διακομιστή δοκιμών για το Συγχρονισμό Chrome.</translation>
 <translation id="3790909017043401679">Εισαγωγή PIN κάρτας SIM</translation>
 <translation id="3792890930871100565">Αποσύνδεση εκτυπωτών</translation>
-<translation id="3795681127952030401">Η διεύθυνση <ph name="URL" /> θέλει να σας στείλει ειδοποιήσεις.</translation>
 <translation id="3796648294839530037">Αγαπημένα δίκτυα:</translation>
 <translation id="3797900183766075808">&amp;Αναζήτηση <ph name="SEARCH_ENGINE" /> για "<ph name="SEARCH_TERMS" />"</translation>
 <translation id="3798449238516105146">Έκδοση</translation>
@@ -2497,6 +2501,7 @@
 <translation id="4552678318981539154">Αγοράστε περισσότερο αποθηκευτικό χώρο</translation>
 <translation id="4554591392113183336">Η εξωτερική επέκταση είναι στην ίδια ή προγενέστερη έκδοση σε σύγκριση με την υπάρχουσα.</translation>
 <translation id="4554796861933393312">Ταχύτητα κινούμενης εικόνας σταγόνας μελανιού Material Design</translation>
+<translation id="4555670907822902621">Ενεργοποίηση αποθήκευσης σελίδων με σελιδοδείκτη για προβολή εκτός σύνδεσης.</translation>
 <translation id="4555769855065597957">Σκιά</translation>
 <translation id="4556110439722119938">Οι σελιδοδείκτες, το ιστορικό, οι κωδικοί πρόσβασης και άλλες ρυθμίσεις σας θα συγχρονιστούν στο Λογαριασμό σας Google, ώστε η χρήση τους να είναι δυνατή σε όλες τις συσκευές σας</translation>
 <translation id="4557136421275541763">Προειδοποίηση:</translation>
@@ -2674,6 +2679,7 @@
 <translation id="4824518112777153488">Υποστήριξη για οθόνες αφής με δυνατότητα τοποθέτησης δείκτη</translation>
 <translation id="4830573902900904548">Η συσκευή σας <ph name="DEVICE_TYPE" /> δεν μπορεί να συνδεθεί στο διαδίκτυο χρησιμοποιώντας το δίκτυο <ph name="NETWORK_NAME" />. Επιλέξτε κάποιο άλλο δίκτυο. <ph name="LEARN_MORE_LINK_START" />Μάθετε περισσότερα<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Η ταυτότητα του <ph name="ORGANIZATION" /> σε <ph name="LOCALITY" /> επαληθεύτηκε από <ph name="ISSUER" />. Παρασχέθηκαν έγκυρες πληροφορίες πιστοποιητικού διαφάνειας από το διακομιστή.</translation>
+<translation id="4832537345877333532">Απενεργοποίηση ανάκτησης αρχείων προβολής icc από τον διακομιστή Quirks, για βαθμονόμηση χρωμάτων της οθόνης.</translation>
 <translation id="4834912470034578916">Ενεργοποίηση προσαρμοσμένων διατάξεων για Ειδοποιήσεις ιστού.</translation>
 <translation id="4835836146030131423">Σφάλμα κατά τη σύνδεση.</translation>
 <translation id="4837926214103741331">Δεν έχετε εξουσιοδότηση για χρήση αυτής της συσκευής. Για να λάβετε άδεια σύνδεσης, επικοινωνήστε με τον κάτοχο της συσκευής.</translation>
@@ -2863,6 +2869,7 @@
 <translation id="5120421890733714118">Να γίνεται αξιόπιστο αυτό το πιστοποιητικό για τον προσδιορισμό ιστοτόπων.</translation>
 <translation id="5121130586824819730">Ο σκληρός σας δίσκος είναι πλήρης. Αποθηκεύστε σε άλλη τοποθεσία ή αδειάστε τον σκληρό δίσκο.</translation>
 <translation id="5125751979347152379">Μη έγκυρη διεύθυνση URL.</translation>
+<translation id="5126663277159826272">Απενεργοποίηση εφαρμογής πελάτη Quirks για βαθμονόμηση οθόνης.</translation>
 <translation id="5127881134400491887">Διαχείριση συνδέσεων δικτύου</translation>
 <translation id="5128590998814119508">Δισδιάστατος καμβάς λίστας προβολής</translation>
 <translation id="512903556749061217">συνδέθηκε</translation>
@@ -3005,9 +3012,11 @@
 <translation id="5301751748813680278">Είσοδος ως επισκέπτης.</translation>
 <translation id="5301954838959518834">Εντάξει, το κατάλαβα</translation>
 <translation id="5302048478445481009">Γλώσσα</translation>
+<translation id="5304039790201806037">Συμβάντα δείκτη</translation>
 <translation id="5305688511332277257">Δεν υπάρχει εγκατεστημένο</translation>
 <translation id="5308380583665731573">Σύνδεση</translation>
 <translation id="5311260548612583999">Αρχείο ιδ. κλειδιού (προαιρετικό): </translation>
+<translation id="5313967007315987356">Προσθήκη ιστότοπου</translation>
 <translation id="5316588172263354223">Φωνητική αναζήτηση ανά πάσα στιγμή</translation>
 <translation id="5316716239522500219">Κατοπτρισμός οθονών</translation>
 <translation id="5317780077021120954">Αποθήκευση</translation>
@@ -3312,6 +3321,7 @@
 <translation id="5734362860645681824">Επικοινωνίες</translation>
 <translation id="573719557377416048">Διαγραφή κατάστασης ταυτόχρονης παρουσίας</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: επιλέξτε για επεξεργασία</translation>
+<translation id="5741454054957165976">Ενεργοποίηση της νέας έκδοσης παρέμβασης παράγοντα χρήστη για τη φόρτωση γραμματοσειρών ιστού.</translation>
 <translation id="574392208103952083">Μέτριο</translation>
 <translation id="5745056705311424885">Εντοπίστηκε συσκευή αποθήκευσης USB</translation>
 <translation id="5746169159649715125">Αποθήκευση ως PDF</translation>
@@ -3360,7 +3370,6 @@
 <translation id="5803531701633845775">Επιλέξτε φράσεις από το παρασκήνιο, χωρίς να μετακινήσετε το δείκτη</translation>
 <translation id="5804241973901381774">Άδειες</translation>
 <translation id="580571955903695899">Αναδιοργάνωση κατά τίτλο</translation>
-<translation id="5808982448801399019">Η εξουσιοδότηση απέτυχε</translation>
 <translation id="580961539202306967">Να μου ζητείται άδεια όταν ένας ιστότοπος θέλει να μου στέλνει μηνύματα push (συνιστάται)</translation>
 <translation id="5815645614496570556">Διεύθυνση X.400</translation>
 <translation id="5817397429773072584">Παραδοσιακά Κινεζικά</translation>
@@ -3385,6 +3394,7 @@
 <translation id="5834581999798853053">Απομένουν περίπου <ph name="TIME" /> λεπτά</translation>
 <translation id="5838825566232597749">Διεθνές ΗΠΑ Workman</translation>
 <translation id="5839277899276241121">Ίδια με τη διεύθυνση χρέωσης</translation>
+<translation id="5844550873065695788">Με αυτήν την ενέργεια θα διαγραφούν οριστικά τουλάχιστον <ph name="TOTAL_COUNT" /> στοιχεία από αυτήν τη συσκευή. Για να ανακτήσετε τα δεδομένα σας αργότερα, συνδεθείτε στο Chrome ως $2.</translation>
 <translation id="5846929185714966548">Καρτέλα 4</translation>
 <translation id="5848934677402291689">Η αποθήκευση σε PDF βρίσκεται σε εξέλιξη</translation>
 <translation id="5849335628409778954">Εισαγάγετε πιστωτική κάρτα…</translation>
@@ -3629,6 +3639,7 @@
 <translation id="6232017090690406397">Μπαταρία</translation>
 <translation id="6241530762627360640">Πρόσβαση σε πληροφορίες σχετικά με τις συσκευές Bluetooth που βρίσκονται σε ζεύξη με το σύστημά σας και εντοπισμός κοντινών συσκευών Bluetooth.</translation>
 <translation id="6243774244933267674">Ο διακομιστής δεν είναι διαθέσιμος</translation>
+<translation id="6246413617632217567">Δεν ήταν δυνατή η εισαγωγή του εποπτευόμενου χρήστη. Ελέγξτε τον ελεύθερο χώρο στον σκληρό δίσκο και τα δικαιώματά σας και προσπαθήστε ξανά.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Έτοιμη ενημέρωση</translation>
 <translation id="6248400709929739064">Ενεργοποίηση υπότιτλων</translation>
@@ -3657,6 +3668,7 @@
 <translation id="6277518330158259200">Λήψη στιγμιότυπου οθόνης</translation>
 <translation id="6279183038361895380">Πιέστε |<ph name="ACCELERATOR" />| για να εμφανιστεί ο δρομέας</translation>
 <translation id="6280215091796946657">Συνδεθείτε με διαφορετικό λογαριασμό</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Πείραμα με σκοπό όλα τα API να αντανακλούν τη θύρα προβολής διάταξης. Αυτό θα κάνει τις ιδιότητες window.scroll σχετικές με τη θύρα προβολής διάταξης.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Εντοπίστηκε νέος εκτυπωτής στο δίκτυό σας}other{Εντοπίστηκαν νέοι εκτυπωτές στο δίκτυό σας}}</translation>
 <translation id="6285395082104474418">Η περιοχή κατάστασης εμφανίζει την τρέχουσα κατάσταση του δικτύου, της μπαταρίας σας και άλλα.</translation>
@@ -3712,6 +3724,7 @@
 <translation id="6380143666419481200">Αποδοχή και συνέχεια</translation>
 <translation id="6380224340023442078">Ρυθμίσεις περιεχομένου...</translation>
 <translation id="6383194710567510941">Επιτρέπει τη χρήση του API chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Με αυτή την ενέργεια θα διαγραφεί οριστικά τουλάχιστον 1$ στοιχείο από αυτή τη συσκευή. Για να ανακτήσετε τα δεδομένα σας αργότερα, συνδεθείτε στο Chrome ως $2.}other{Με αυτή την ενέργεια θα διαγραφούν οριστικά τουλάχιστον 1$ στοιχεία από αυτή τη συσκευή. Για να ανακτήσετε τα δεδομένα σας αργότερα, συνδεθείτε στο Chrome ως $2.}}</translation>
 <translation id="6384275966486438344">Αλλαγή των ρυθμίσεων αναζήτησης σε: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Οι σελίδες που βλέπετε σε αυτό το παράθυρο δεν θα εμφανίζεται στο ιστορικό του προγράμματος περιήγησης και δεν θα αφήνουν άλλα ίχνη, όπως cookie, στον υπολογιστή αφού κλείσετε όλα τα ανοιχτά παράθυρα Επισκέπτη. Ωστόσο, τυχόν αρχεία τα οποία έχετε κατεβάσει θα διατηρηθούν.</translation>
 <translation id="6391538222494443604">Ο κατάλογος εισόδου πρέπει να υπάρχει.</translation>
@@ -3850,6 +3863,7 @@
 <translation id="6575134580692778371">Δεν διαμορφώθηκε</translation>
 <translation id="6575251558004911012">Να γίνεται ερώτηση όταν ένας ιστότοπος ζητά πρόσβαση στην κάμερά σας (συνιστάται)</translation>
 <translation id="6579159469348633828">Κωδικοποίηση περιεχομένου Brotli.</translation>
+<translation id="6580151766480067746">Έκδοση ARC</translation>
 <translation id="6581162200855843583">Σύνδεσμος του Google Drive</translation>
 <translation id="6583070985841601920">Συνδεδεμένος χρήστης ως <ph name="USER_EMAIL_ADDRESS" />. Ο συγχρονισμός σας έχει απενεργοποιηθεί από το διαχειριστή σας.</translation>
 <translation id="65832705307647870">Προσυμπλήρωση της Σελίδας σε νέα καρτέλα με δημοφιλείς ιστότοπους.</translation>
@@ -4017,6 +4031,7 @@
 <translation id="6847758263950452722">Αποθήκευση σελίδας ως MHTML</translation>
 <translation id="6853388645642883916">Το πρόγραμμα ενημέρωσης είναι σε αδράνεια</translation>
 <translation id="68541483639528434">Κλείσιμο των άλλων καρτελών</translation>
+<translation id="6856701878604560493">Ενεργοποίηση σελιδοδεικτών εκτός σύνδεσης</translation>
 <translation id="6860097299815761905">Ρυθμίσεις διακομιστή μεσολάβησης...</translation>
 <translation id="6860427144121307915">Άνοιγμα σε καρτέλα</translation>
 <translation id="6862635236584086457">Για όλα τα αρχεία που αποθηκεύονται σε αυτόν το φάκελο δημιουργούνται αυτόματα αντίγραφα ασφαλείας στο διαδίκτυο</translation>
@@ -4190,6 +4205,7 @@
 <translation id="7092106376816104">Εξαιρέσεις αναδυόμενων παραθύρων</translation>
 <translation id="7093866338626856921">Ανταλλαγή δεδομένων με συσκευές με την ονομασία: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Θέλετε να ανακαλύψετε περισσότερες καταπληκτικές λειτουργίες;</translation>
+<translation id="7096108453481049031">Δεν ήταν δυνατή η εισαγωγή του εποπτευόμενου χρήστη. Ελέγξτε τη σύνδεση δικτύου σας και δοκιμάστε ξανά αργότερα.</translation>
 <translation id="7100897339030255923">Έχουν επιλεγεί <ph name="COUNT" /> στοιχεία</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Αγοράστε περισσότερο αποθηκευτικό χώρο...</translation>
@@ -4218,6 +4234,7 @@
 <translation id="713888829801648570">Δυστυχώς, δεν ήταν δυνατή η επαλήθευση του κωδικού πρόσβασής σας διότι είστε εκτός σύνδεσης.</translation>
 <translation id="7140928199327930795">Δεν υπάρχουν άλλες διαθέσιμες συσκευές.</translation>
 <translation id="7141105143012495934">Η σύνδεση απέτυχε επειδή δεν ήταν δυνατή η ανάκτηση των στοιχείων του λογαριασμού σας. Επικοινωνήστε με τον διαχειριστή σας ή προσπαθήστε ξανά.</translation>
+<translation id="7141331524324591758">Ενεργοποιεί τη μερική πειραματική υποστήριξη για το API Συμβάντων δείκτη. Αυτό προορίζεται μόνο για δοκιμή από προγραμματιστές ιστού, θα προκαλέσει μικρά σφάλματα σε ορισμένους ιστότοπους.</translation>
 <translation id="7143207342074048698">Σύνδεση</translation>
 <translation id="7144878232160441200">Δοκιμάστε ξανά</translation>
 <translation id="7148311641502571842">Η προσθήκη <ph name="PLUGIN_NAME" /> έχει απενεργοποιηθεί. Για να την ενεργοποιήσετε ξανά, μεταβείτε στον σύνδεσμο <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4870,6 +4887,7 @@
 <translation id="8119572489781388874">Τροποποίηση ρυθμίσεων</translation>
 <translation id="8119631488458759651">κατάργηση αυτού του ιστοτόπου</translation>
 <translation id="8121385576314601440">Ρυθμίσεις εισόδου Χανγκούλ</translation>
+<translation id="8122245494004914423">Με αυτήν την ενέργεια θα διαγραφούν οριστικά τα δεδομένα περιήγησής σας από αυτήν τη συσκευή. Για να ανακτήσετε τα δεδομένα σας αργότερα, συνδεθείτε στο Chrome ως $2.</translation>
 <translation id="8124313775439841391">ONC με ιδιότητες διαχείρισης</translation>
 <translation id="8126844665673008223">Bluetooth ιστού</translation>
 <translation id="8127322077195964840">Να επιτρέπονται μη έγκυρα πιστοποιητικά για πόρους που φορτώνονται από τον τοπικό κεντρικό υπολογιστή.</translation>
@@ -4955,6 +4973,7 @@
 <translation id="8226742006292257240">Ακολουθεί ο κωδικός πρόσβασης TPM που δημιουρήθηκε τυχαία και έχει εκχωρηθεί στον υπολογιστή σας:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Οι εισβολείς που βρίσκονται αυτήν τη στιγμή στον ιστότοπο <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ενδέχεται να επιχειρήσουν να εγκαταστήσουν επικίνδυνα προγράμματα στον υπολογιστή σας, τα οποία μπορούν να υποκλέψουν ή να διαγράψουν τα δεδομένα σας (για παράδειγμα, φωτογραφίες, κωδικούς πρόσβασης, μηνύματα και στοιχεία πιστωτικών καρτών).</translation>
+<translation id="8233254008506535819">Συμπερίληψη της επιλογής προσθήκης στη λίστα επιτρεπόμενων των σημαντικών ιστότοπων στο παράθυρο διαλόγου "Διαγραφή δεδομένων περιήγησης".</translation>
 <translation id="8236231079192337250">Εφαρμογή Chrome Web Store Gallery για προγράμματα οδήγησης εκτυπωτών</translation>
 <translation id="8238649969398088015">Συμβουλή βοήθειας</translation>
 <translation id="8240697550402899963">Χρήση κλασικού θέματος</translation>
@@ -5282,7 +5301,6 @@
 <translation id="8708671767545720562">&amp;Περισσότερες πληροφορίες</translation>
 <translation id="8711402221661888347">Πίκλες</translation>
 <translation id="8711453844311572806">Όταν το τηλέφωνό σας είναι ξεκλειδωμένο και σε κοντινή απόσταση, απλώς κάντε κλικ για να εισέλθετε. Στην αντίθετη περίπτωση, θα δείτε ένα εικονίδιο κλειδώματος και θα πρέπει να πληκτρολογήσετε τον κωδικό πρόσβασής σας.</translation>
-<translation id="8712637175834984815">Κατάλαβα!</translation>
 <translation id="8713570323158206935">Αποστολή <ph name="BEGIN_LINK1" />πληροφοριών συστήματος<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Ενεργοποιήστε την αυτόματη διόρθωση φυσικού πληκτρολογίου για το πληκτρολόγιο ΗΠΑ, η οποία μπορεί να παρέχει προτάσεις καθώς πληκτρολογείτε στο φυσικό πληκτρολόγιο.</translation>
 <translation id="871476437400413057">Κωδικοί πρόσβασης που έχουν αποθηκευτεί από το Google</translation>
@@ -5646,6 +5664,7 @@
 <translation id="952992212772159698">Μη ενεργοποιημένο</translation>
 <translation id="953000875543358078">Αυτή η διαδικασία μπορεί να διαρκέσει έως περίπου ένα λεπτό</translation>
 <translation id="960987915827980018">Απομένει περίπου 1 ώρα</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Με αυτή την ενέργεια θα διαγραφεί οριστικά 1$ στοιχείο από αυτή τη συσκευή. Για να ανακτήσετε τα δεδομένα σας αργότερα, συνδεθείτε στο Chrome ως $2.}other{Με αυτή την ενέργεια θα διαγραφούν οριστικά 1$ στοιχεία από αυτή τη συσκευή. Για να ανακτήσετε τα δεδομένα σας αργότερα, συνδεθείτε στο Chrome ως $2.}}</translation>
 <translation id="96421021576709873">Δίκτυο Wi-Fi</translation>
 <translation id="965490406356730238">Ενεργοποίηση αποκωδικοποίησης mjpeg με επιτάχυνση εξοπλισμού για καρέ που έχουν ληφθεί, όπου είναι διαθέσιμα.</translation>
 <translation id="968174221497644223">Προσωρινή μνήμη εφαρμογής</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 8219d98..4762be56 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -251,6 +251,7 @@
         Note that Bluetooth will be turned on for all <ph name="USER_DISPLAY_EMAIL" />'s compatible devices, and some hardware information will be sent to Google. &lt;a&gt;Learn more&lt;/a&gt;</translation>
 <translation id="13649080186077898">Manage Auto-fill settings</translation>
 <translation id="1367951781824006909">Choose a file</translation>
+<translation id="136802136832547685">There are no supervised users to add to this device.</translation>
 <translation id="1368265273904755308">Report issue</translation>
 <translation id="1368832886055348810">Left to Right</translation>
 <translation id="1370646789215800222">Remove person?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Search</translation>
 <translation id="1384211230590313258">Service Discovery Handler</translation>
 <translation id="1386387014181100145">Howdy.</translation>
+<translation id="1386830813511981192">Over a million apps and games now available on your <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">This can only be added from the <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Open as a Standard Tab</translation>
 <translation id="1395262318152388157">Seek slider</translation>
@@ -894,6 +896,7 @@
 <translation id="2280486287150724112">Right margin</translation>
 <translation id="2282146716419988068">GPU Process</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">New version of User Agent Intervention for WebFonts loading.</translation>
 <translation id="2286454467119466181">Simple</translation>
 <translation id="2286950485307333924">You're now signed in to Chrome</translation>
 <translation id="2287590536030307392">Turn off all wireless connections.</translation>
@@ -1071,6 +1074,7 @@
 <translation id="2542049655219295786">Google table</translation>
 <translation id="2546283357679194313">Cookies and site data</translation>
 <translation id="2549646943416322527">Seccomp Detector</translation>
+<translation id="2550212893339833758">Swapped memory</translation>
 <translation id="2553100941515833716">Reset the App Launcher install state on every restart.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> was unable to connect to <ph name="NETWORK_ID" />. Please select another network or try again.</translation>
 <translation id="2553440850688409052">Hide This Plug-in</translation>
@@ -1103,6 +1107,7 @@
 <translation id="2585300050980572691">Default search settings</translation>
 <translation id="2587203970400270934">Operator code:</translation>
 <translation id="2587922270115112871">Creating a supervised user does not create a Google Account, and their settings and data will not follow them to other devices with Chrome Sync. A supervised user applies only to this device.</translation>
+<translation id="2594049137847833442">Important sites options in clear browsing data dialogue</translation>
 <translation id="2594056015203442344">When enabled, the audio indicators in the tab strip double as tab audio mute controls.  This also adds commands in the tab context menu for quickly muting multiple selected tabs.</translation>
 <translation id="259421303766146093">Demagnify</translation>
 <translation id="2597852038534460976">Chrome cannot access wallpapers. Please connect to a network.</translation>
@@ -1470,7 +1475,6 @@
 <translation id="3065140616557457172">Type to search or enter a URL to navigate - everything just works.</translation>
 <translation id="3067198360141518313">Run this plug-in</translation>
 <translation id="307519606911195071">Enable additional accessibility features in the Settings page.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> has been created as a supervised user!</translation>
 <translation id="3075874217500066906">A restart is required to begin the Powerwash process. After restart you will be asked to confirm that you want to proceed.</translation>
 <translation id="3076677906922146425">Let anyone add a person to Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1487,6 +1491,7 @@
 <translation id="3088034400796962477">Transliteration (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Rename...</translation>
 <translation id="308903551226753393">Configure automatically</translation>
+<translation id="3089231390674410424">Looks like there's a problem with your credentials. Please make sure that you're signed in properly and try again.</translation>
 <translation id="3090819949319990166">Can't copy external crx file to <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" paired</translation>
 <translation id="3092544800441494315">Include this screenshot:</translation>
@@ -2014,7 +2019,6 @@
 <translation id="3790856258139356663">Connects to the testing server for Chrome Sync.</translation>
 <translation id="3790909017043401679">Enter SIM card PIN</translation>
 <translation id="3792890930871100565">Disconnect printers</translation>
-<translation id="3795681127952030401"><ph name="URL" /> wants to send you notifications.</translation>
 <translation id="3796648294839530037">Favourite Networks:</translation>
 <translation id="3797900183766075808">&amp;Search <ph name="SEARCH_ENGINE" /> for “<ph name="SEARCH_TERMS" />”</translation>
 <translation id="3798449238516105146">Version</translation>
@@ -2488,6 +2492,7 @@
 <translation id="4552678318981539154">Buy more storage</translation>
 <translation id="4554591392113183336">External extension is at the same or lower version compared to the existing one.</translation>
 <translation id="4554796861933393312">Material Design Ink Drop Animation Speed</translation>
+<translation id="4555670907822902621">Enable saving bookmarked pages for offline viewing.</translation>
 <translation id="4555769855065597957">Shadow</translation>
 <translation id="4556110439722119938">Your bookmarks, history, passwords and other settings will be synced to your Google Account so that you can use them on all your devices</translation>
 <translation id="4557136421275541763">Warning:</translation>
@@ -2664,6 +2669,7 @@
 <translation id="4824518112777153488">Support for hover capable touchscreens</translation>
 <translation id="4830573902900904548">Your <ph name="DEVICE_TYPE" /> is unable to connect to the Internet using <ph name="NETWORK_NAME" />. Please choose another network. <ph name="LEARN_MORE_LINK_START" />Find out more<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">The identity of <ph name="ORGANIZATION" /> at <ph name="LOCALITY" /> has been verified by <ph name="ISSUER" />. Valid Certificate Transparency information was supplied by the server.</translation>
+<translation id="4832537345877333532">Disable retrieval of ICC display files from Quirks Server for display colour calibration.</translation>
 <translation id="4834912470034578916">Enable customised layouts for Web Notifications.</translation>
 <translation id="4835836146030131423">Error signing in.</translation>
 <translation id="4837926214103741331">You are not authorised to use this device. Please contact the device owner for sign-in permission.</translation>
@@ -2851,6 +2857,7 @@
 <translation id="5120421890733714118">Trust this certificate for identifying websites.</translation>
 <translation id="5121130586824819730">Your hard disk is full.  Please save to another location or make more room on the hard disk.</translation>
 <translation id="5125751979347152379">Invalid URL.</translation>
+<translation id="5126663277159826272">Disable Quirks Client for display calibration.</translation>
 <translation id="5127881134400491887">Manage network connections</translation>
 <translation id="5128590998814119508">Display list 2D canvas</translation>
 <translation id="512903556749061217">attached</translation>
@@ -2992,9 +2999,11 @@
 <translation id="5301751748813680278">Entering as Guest.</translation>
 <translation id="5301954838959518834">OK, got it</translation>
 <translation id="5302048478445481009">Language</translation>
+<translation id="5304039790201806037">Pointer Events</translation>
 <translation id="5305688511332277257">None installed</translation>
 <translation id="5308380583665731573">Connect</translation>
 <translation id="5311260548612583999">Private key file (optional):</translation>
+<translation id="5313967007315987356">Add site</translation>
 <translation id="5316588172263354223">Voice search at any time</translation>
 <translation id="5316716239522500219">Mirror monitors</translation>
 <translation id="5317780077021120954">Save</translation>
@@ -3297,6 +3306,7 @@
 <translation id="5734362860645681824">Communications</translation>
 <translation id="573719557377416048">Clear Copresence State</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: select to edit</translation>
+<translation id="5741454054957165976">Enable new version of User Agent Intervention for WebFonts loading.</translation>
 <translation id="574392208103952083">Medium</translation>
 <translation id="5745056705311424885">USB memory stick detected</translation>
 <translation id="5746169159649715125">Save as PDF</translation>
@@ -3345,7 +3355,6 @@
 <translation id="5803531701633845775">Choose phrases from the back without moving the cursor</translation>
 <translation id="5804241973901381774">Permissions</translation>
 <translation id="580571955903695899">Reorder by Title</translation>
-<translation id="5808982448801399019">Authorisation failed</translation>
 <translation id="580961539202306967">Ask me when a site wants to send me push messages (recommended)</translation>
 <translation id="5815645614496570556">X.400 Address</translation>
 <translation id="5817397429773072584">Traditional Chinese</translation>
@@ -3370,6 +3379,7 @@
 <translation id="5834581999798853053">About <ph name="TIME" /> minutes left</translation>
 <translation id="5838825566232597749">US Workman international</translation>
 <translation id="5839277899276241121">Same as billing address</translation>
+<translation id="5844550873065695788">This will permanently delete at least <ph name="TOTAL_COUNT" /> items from this device. To retrieve your data later, sign in to chrome as $2.</translation>
 <translation id="5846929185714966548">Tab 4</translation>
 <translation id="5848934677402291689">Saving to PDF in progress</translation>
 <translation id="5849335628409778954">Enter credit card...</translation>
@@ -3616,6 +3626,7 @@
 <translation id="6232017090690406397">Battery</translation>
 <translation id="6241530762627360640">Access information about Bluetooth devices paired with your system and discover nearby Bluetooth devices.</translation>
 <translation id="6243774244933267674">Server unavailable</translation>
+<translation id="6246413617632217567">The supervised user couldn't be imported. Please check your hard drive space and permissions and try again.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Update ready</translation>
 <translation id="6248400709929739064">Enable subtitles</translation>
@@ -3644,6 +3655,7 @@
 <translation id="6277518330158259200">T&amp;ake Screenshot</translation>
 <translation id="6279183038361895380">Press |<ph name="ACCELERATOR" />| to show your cursor</translation>
 <translation id="6280215091796946657">Sign in with a different account</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Experiment to have all APIs reflect the layout viewport. This will make window.scroll properties relative to the layout viewport.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{New printer on your network}other{New printers on your network}}</translation>
 <translation id="6285395082104474418">The status tray shows you the current state of your network, battery and more.</translation>
@@ -3699,6 +3711,7 @@
 <translation id="6380143666419481200">Accept and continue</translation>
 <translation id="6380224340023442078">Content settings...</translation>
 <translation id="6383194710567510941">Enable the use of chrome.input.ime API.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{This will permanently delete at least $1 item from this device. To retrieve your data later, sign in to chrome as $2.}other{This will permanently delete at least $1 items from this device. To retrieve your data later, sign in to chrome as $2.}}</translation>
 <translation id="6384275966486438344">Change your search settings to: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Pages that you view in this window won’t appear in the browser history and they won’t leave other traces, like cookies, on the computer after you close all open Guest windows. Any files that you download, however, will be preserved.</translation>
 <translation id="6391538222494443604">Input directory must exist.</translation>
@@ -3837,6 +3850,7 @@
 <translation id="6575134580692778371">Not configured</translation>
 <translation id="6575251558004911012">Ask when a site requires access to your camera (recommended)</translation>
 <translation id="6579159469348633828">Brotli Content-Encoding.</translation>
+<translation id="6580151766480067746">ARC Version</translation>
 <translation id="6581162200855843583">Google Drive link</translation>
 <translation id="6583070985841601920">Signed in as <ph name="USER_EMAIL_ADDRESS" />. Sync is disabled by your administrator.</translation>
 <translation id="65832705307647870">Pre-populate the New Tab page with popular sites.</translation>
@@ -4002,6 +4016,7 @@
 <translation id="6847758263950452722">Save Page as MHTML</translation>
 <translation id="6853388645642883916">Updater sleeping</translation>
 <translation id="68541483639528434">Close other tabs</translation>
+<translation id="6856701878604560493">Enable offline bookmarks</translation>
 <translation id="6860097299815761905">Proxy settings...</translation>
 <translation id="6860427144121307915">Open in a Tab</translation>
 <translation id="6862635236584086457">All files saved in this folder are backed up online automatically</translation>
@@ -4176,6 +4191,7 @@
 <translation id="7092106376816104">Pop-up exceptions</translation>
 <translation id="7093866338626856921">Exchange data with the devices named: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Want to discover more awesome features?</translation>
+<translation id="7096108453481049031">The supervised user couldn't be imported. Please check your network connection and try again later.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> items selected</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Buy more storage...</translation>
@@ -4204,6 +4220,7 @@
 <translation id="713888829801648570">Sorry, your password could not be verified because you are offline.</translation>
 <translation id="7140928199327930795">No other available devices.</translation>
 <translation id="7141105143012495934">Sign-in failed because your account details could not be retrieved. Please contact your administrator or try again.</translation>
+<translation id="7141331524324591758">Enables partial experimental support for the Pointer Events API.  This is intended only for testing by web developers; it will cause some websites to be subtly broken.</translation>
 <translation id="7143207342074048698">Connecting ...</translation>
 <translation id="7144878232160441200">Retry</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> has been disabled. To re-enable it, please go to <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4852,6 +4869,7 @@
 <translation id="8119572489781388874">Modify settings</translation>
 <translation id="8119631488458759651">remove this site</translation>
 <translation id="8121385576314601440">Hangul input settings</translation>
+<translation id="8122245494004914423">This will permanently delete your browsing data from this device. To retrieve your data later, sign in to chrome as $2.</translation>
 <translation id="8124313775439841391">Managed ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Allow invalid certificates for resources loaded from localhost.</translation>
@@ -4937,6 +4955,7 @@
 <translation id="8226742006292257240">Below is the randomly generated TPM password that has been assigned to your computer:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Attackers currently on <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> might attempt to install dangerous programmes on your computer that steal or delete your information (for example, photos, passwords, messages and credit cards).</translation>
+<translation id="8233254008506535819">Include the option to whitelist important sites in the clear browsing data dialogue.</translation>
 <translation id="8236231079192337250">Chrome Web Store Gallery app for printer drivers</translation>
 <translation id="8238649969398088015">Help tip</translation>
 <translation id="8240697550402899963">Use Classic theme</translation>
@@ -5261,7 +5280,6 @@
 <translation id="8708671767545720562">&amp;More Information</translation>
 <translation id="8711402221661888347">Ketchup</translation>
 <translation id="8711453844311572806">When your phone is unlocked and nearby, just click to enter. Otherwise, you’ll see a locked icon and need to type your password.</translation>
-<translation id="8712637175834984815">Got it</translation>
 <translation id="8713570323158206935">Send <ph name="BEGIN_LINK1" />system information<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Enable physical keyboard auto-correct for US keyboard, which can provide suggestions while typing on physical keyboard.</translation>
 <translation id="871476437400413057">Google saved passwords</translation>
@@ -5625,6 +5643,7 @@
 <translation id="952992212772159698">Not activated</translation>
 <translation id="953000875543358078">This may take up to a minute or so</translation>
 <translation id="960987915827980018">About 1 hour left</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{This will permanently delete $1 item from this device. To retrieve your data later, sign in to chrome as $2.}other{This will permanently delete $1 items from this device. To retrieve your data later, sign in to chrome as $2.}}</translation>
 <translation id="96421021576709873">Wi-Fi network</translation>
 <translation id="965490406356730238">Enable hardware-accelerated mjpeg decode for captured frame where available.</translation>
 <translation id="968174221497644223">Application cache</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 3c6819791e..48390f54 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -1466,7 +1466,6 @@
 <translation id="3065140616557457172">Puedes escribir una consulta o bien la dirección URL de la página que quieres visitar, lo que prefieras.</translation>
 <translation id="3067198360141518313">Ejecutar este complemento</translation>
 <translation id="307519606911195071">Habilita funciones de accesibilidad adicionales en la página Configuración.</translation>
-<translation id="3075239840551149663">Se creó <ph name="NEW_PROFILE_NAME" /> como usuario supervisado</translation>
 <translation id="3075874217500066906">Es necesario reiniciar el dispositivo antes de comenzar el proceso de la función Powerwash. Luego de reiniciar, debes confirmar que quieres continuar.</translation>
 <translation id="3076677906922146425">Permitir que cualquiera agregue una persona a Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -2010,7 +2009,6 @@
 <translation id="3790856258139356663">Se conecta al servidor de prueba para la Sincronización de Chrome.</translation>
 <translation id="3790909017043401679">Ingresa el PIN de la tarjeta SIM.</translation>
 <translation id="3792890930871100565">Desconectar impresoras</translation>
-<translation id="3795681127952030401"><ph name="URL" /> quiere enviarte notificaciones.</translation>
 <translation id="3796648294839530037">Redes favoritas:</translation>
 <translation id="3797900183766075808">&amp;Buscar "<ph name="SEARCH_TERMS" />" en <ph name="SEARCH_ENGINE" /></translation>
 <translation id="3798449238516105146">Versión</translation>
@@ -2990,6 +2988,7 @@
 <translation id="5305688511332277257">No hay certificados instalados</translation>
 <translation id="5308380583665731573">Conectar</translation>
 <translation id="5311260548612583999">Archivo de clave privada (opcional):</translation>
+<translation id="5313967007315987356">Agregar sitio</translation>
 <translation id="5316588172263354223">Búsqueda por voz en cualquier momento</translation>
 <translation id="5316716239522500219">Reflejar monitores</translation>
 <translation id="5317780077021120954">Guardar</translation>
@@ -3340,7 +3339,6 @@
 <translation id="5803531701633845775">Elige frases de la parte posterior sin mover el cursor</translation>
 <translation id="5804241973901381774">Permisos</translation>
 <translation id="580571955903695899">Reordenar por título</translation>
-<translation id="5808982448801399019">Se produjo un error en la autorización</translation>
 <translation id="580961539202306967">Preguntarme cuando un sitio quiera enviarme mensajes de inserción (recomendado)</translation>
 <translation id="5815645614496570556">Dirección X 400</translation>
 <translation id="5817397429773072584">Chino tradicional</translation>
@@ -4971,7 +4969,7 @@
 <translation id="8284279544186306258">todos los sitios de <ph name="WEBSITE_1" /></translation>
 <translation id="8286227656784970313">Utilizar diccionario del sistema</translation>
 <translation id="8286817579635702504">Permite habilitar varias funciones de seguridad que tal vez dañen una o más páginas que visitas a diario; por ejemplo, la verificación estricta de contenido mixto y el bloqueo de funciones eficaces para proteger el entorno. Es posible que esta marca represente una molestia.</translation>
-<translation id="8288342810474863437">Las funcionalidades de importación y exportación se encuentran en las opciones de configuración de contraseñas.</translation>
+<translation id="8288342810474863437">Las funciones de importación y exportación se encuentran en las opciones de configuración de contraseñas.</translation>
 <translation id="8297012244086013755">Hangul de triple alternancia (sin presionar mayúsculas)</translation>
 <translation id="8298115750975731693">Es posible que la red Wi-Fi que estás usando (<ph name="WIFI_NAME" />) requiera que accedas a <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation>
 <translation id="8299269255470343364">Japonés</translation>
@@ -5249,7 +5247,6 @@
 <translation id="8708671767545720562">&amp;Más información</translation>
 <translation id="8711402221661888347">Condimento</translation>
 <translation id="8711453844311572806">Cuando el teléfono se encuentre cerca y desbloqueado, solo haz clic para ingresar. De lo contrario, verás un ícono de bloqueo y deberás escribir la contraseña.</translation>
-<translation id="8712637175834984815">Entendido</translation>
 <translation id="8713570323158206935">Enviar <ph name="BEGIN_LINK1" />información del sistema<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Habilitar la autocorrección de teclado físico para un teclado de los Estados Unidos que ofrece sugerencias mientras escribes en un teclado físico</translation>
 <translation id="871476437400413057">Contraseñas guardadas por Google</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 7b2d4e3b..e1ea7dc 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -251,6 +251,7 @@
       Ten en cuenta que la función Bluetooth estará activada para todos los dispositivos compatibles de <ph name="USER_DISPLAY_EMAIL" /> y que se enviarán algunos datos sobre el hardware a Google. &lt;a&gt;Más información&lt;/a&gt;</translation>
 <translation id="13649080186077898">Administrar configuración de Autocompletar</translation>
 <translation id="1367951781824006909">Selecciona un archivo</translation>
+<translation id="136802136832547685">No hay ningún usuario supervisado para añadir a este dispositivo.</translation>
 <translation id="1368265273904755308">Notificar error</translation>
 <translation id="1368832886055348810">De izquierda a derecha</translation>
 <translation id="1370646789215800222">¿Eliminar a esta persona?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Buscar</translation>
 <translation id="1384211230590313258">Controlador de descubrimiento de servicios</translation>
 <translation id="1386387014181100145">Hola.</translation>
+<translation id="1386830813511981192">Ya están disponibles más de un millón de aplicaciones y juegos en tu <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Este elemento solo se puede añadir desde <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Abrir como pestaña normal</translation>
 <translation id="1395262318152388157">Control deslizante de búsqueda</translation>
@@ -893,6 +895,7 @@
 <translation id="2280486287150724112">Margen derecho</translation>
 <translation id="2282146716419988068">Proceso de GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Nueva versión de la intervención de user-agent para cargar WebFonts.</translation>
 <translation id="2286454467119466181">Sencilla</translation>
 <translation id="2286950485307333924">Has iniciado sesión en Chrome</translation>
 <translation id="2287590536030307392">Desactiva todas las conexiones inalámbricas.</translation>
@@ -1070,6 +1073,7 @@
 <translation id="2542049655219295786">Tabla de Google</translation>
 <translation id="2546283357679194313">Datos de sitios y cookies</translation>
 <translation id="2549646943416322527">Detector del modo Seccomp</translation>
+<translation id="2550212893339833758">Memoria trasladada al espacio de reserva</translation>
 <translation id="2553100941515833716">Restablecer el estado de instalación del menú de aplicaciones cada vez que se reinicie el navegador.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> no ha podido establecer conexión con <ph name="NETWORK_ID" />. Selecciona otra red o vuelve a intentarlo.</translation>
 <translation id="2553440850688409052">Ocultar este complemento</translation>
@@ -1103,6 +1107,7 @@
 <translation id="2587203970400270934">Código del operador:</translation>
 <translation id="2587922270115112871">Al crear un usuario supervisado, no se crea una cuenta de Google, y sus datos
 y su configuración no se sincronizan en otros dispositivos con la función de sincronización de Chrome. Un usuario supervisado solo se aplica a este dispositivo.</translation>
+<translation id="2594049137847833442">Opciones de sitios web importantes en el cuadro de diálogo Eliminar datos de navegación</translation>
 <translation id="2594056015203442344">Si se habilita esta opción, los indicadores de audio de la barra de pestañas también funcionan como controles para silenciar el audio de las pestañas. Además, se añaden comandos en el menú contextual de la pestaña para poder silenciar rápidamente varias pestañas seleccionadas.</translation>
 <translation id="259421303766146093">Reducir</translation>
 <translation id="2597852038534460976">Chrome no puede acceder a los fondos de pantalla. Conéctate a una red.</translation>
@@ -1472,7 +1477,6 @@
 <translation id="3065140616557457172">Puedes introducir una consulta o bien la URL de la página que quieres visitar, lo que prefieras.</translation>
 <translation id="3067198360141518313">Ejecutar este complemento</translation>
 <translation id="307519606911195071">Permite habilitar las funciones de accesibilidad adicionales en la página de configuración.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> se ha creado como usuario supervisado</translation>
 <translation id="3075874217500066906">Es necesario reiniciar el dispositivo antes de comenzar el proceso de Powerwash. Después de reiniciar, se te pedirá que confirmes si quieres continuar.</translation>
 <translation id="3076677906922146425">Dejar que cualquier pueda añadir a una persona a Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1489,6 +1493,7 @@
 <translation id="3088034400796962477">Transliteración (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Cambiar nombre...</translation>
 <translation id="308903551226753393">Configurar automáticamente</translation>
+<translation id="3089231390674410424">Parece que ha habido un problema con tus credenciales. Asegúrate de que has iniciado sesión correctamente y vuelve a intentarlo.</translation>
 <translation id="3090819949319990166">No se puede copiar el archivo crx externo en <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558"><ph name="DEVICE_NAME" /> vinculado</translation>
 <translation id="3092544800441494315">Incluir esta captura de pantalla:</translation>
@@ -1630,7 +1635,7 @@
 <translation id="329650768420594634">Advertencia sobre el empaquetado de extensión</translation>
 <translation id="3296763833017966289">Georgiano</translation>
 <translation id="3297788108165652516">Esta red se comparte con otros usuarios.</translation>
-<translation id="3298076529330673844">Siempre permitido para ejecutarse</translation>
+<translation id="3298076529330673844">Permitir que se ejecute siempre</translation>
 <translation id="329838636886466101">Reparar</translation>
 <translation id="3298461240075561421">Aunque hayas descargado archivos de este sitio web con anterioridad, el sitio podría estar hackeado. En lugar de recuperar el archivo, puedes intentar descargarlo más tarde.</translation>
 <translation id="3298789223962368867">URL introducida no válida</translation>
@@ -2013,7 +2018,6 @@
 <translation id="3790856258139356663">Establece conexión con el servidor de pruebas de Sincronización de Chrome.</translation>
 <translation id="3790909017043401679">Introducir el PIN de la tarjeta SIM</translation>
 <translation id="3792890930871100565">Desconectar impresoras</translation>
-<translation id="3795681127952030401"><ph name="URL" /> quiere enviarte notificaciones.</translation>
 <translation id="3796648294839530037">Redes favoritas:</translation>
 <translation id="3797900183766075808">&amp;Buscar <ph name="SEARCH_TERMS" /> en <ph name="SEARCH_ENGINE" /></translation>
 <translation id="3798449238516105146">Versión</translation>
@@ -2486,6 +2490,7 @@
 <translation id="4552678318981539154">Comprar más almacenamiento</translation>
 <translation id="4554591392113183336">La versión de la extensión externa es igual o anterior a la actual.</translation>
 <translation id="4554796861933393312">Velocidad de la animación de la gota de tinta de Material Design</translation>
+<translation id="4555670907822902621">Permite guardar las páginas añadidas a marcadores para verlas sin conexión.</translation>
 <translation id="4555769855065597957">Sombra</translation>
 <translation id="4556110439722119938">Tus marcadores, historial, contraseñas y otros ajustes se sincronizarán con tu cuenta de Google para que puedas utilizarlos en todos tus dispositivos</translation>
 <translation id="4557136421275541763">Advertencia:</translation>
@@ -2661,6 +2666,7 @@
 <translation id="4824518112777153488">Compatibilidad con pantallas táctiles con capacidad de colocar el cursor sobre un elemento.</translation>
 <translation id="4830573902900904548">Tu <ph name="DEVICE_TYPE" /> no puede conectarse a Internet con <ph name="NETWORK_NAME" />. Selecciona otra red. <ph name="LEARN_MORE_LINK_START" />Más información<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572"><ph name="ISSUER" /> ha verificado la identidad de <ph name="ORGANIZATION" /> en <ph name="LOCALITY" />. El servidor ha proporcionado información de Transparencia de certificados válida.</translation>
+<translation id="4832537345877333532">Inhabilita la recuperación de archivos de pantalla ICC de Quirks Server para calibrar el color de la pantalla.</translation>
 <translation id="4834912470034578916">Habilitar diseños personalizados para las notificaciones web.</translation>
 <translation id="4835836146030131423">Se ha producido un error al acceder.</translation>
 <translation id="4837926214103741331">No tienes autorización para utilizar este dispositivo. Ponte en contacto con su propietario para obtener permiso de inicio de sesión.</translation>
@@ -2847,6 +2853,7 @@
 <translation id="5120421890733714118">Confiar en este certificado para identificar sitios web</translation>
 <translation id="5121130586824819730">Tu disco duro está lleno. Guarda el archivo en otra ubicación o libera espacio en el disco duro.</translation>
 <translation id="5125751979347152379">La URL no es válida.</translation>
+<translation id="5126663277159826272">Inhabilitar cliente de Quirks para calibrar la pantalla.</translation>
 <translation id="5127881134400491887">Administrar conexiones de red</translation>
 <translation id="5128590998814119508">Lista de presentación para lienzo 2D</translation>
 <translation id="512903556749061217">conectado</translation>
@@ -2986,9 +2993,11 @@
 <translation id="5301751748813680278">Iniciando sesión de invitado</translation>
 <translation id="5301954838959518834">Entendido</translation>
 <translation id="5302048478445481009">Idioma</translation>
+<translation id="5304039790201806037">Eventos de puntero</translation>
 <translation id="5305688511332277257">No hay certificados instalados</translation>
 <translation id="5308380583665731573">Conectar</translation>
 <translation id="5311260548612583999">Clave privada (opcional):</translation>
+<translation id="5313967007315987356">Añadir sitio</translation>
 <translation id="5316588172263354223">Haz búsquedas por voz en cualquier momento</translation>
 <translation id="5316716239522500219">Copiar monitores</translation>
 <translation id="5317780077021120954">Guardar</translation>
@@ -3291,6 +3300,7 @@
 <translation id="5734362860645681824">Comunicaciones</translation>
 <translation id="573719557377416048">Borrar estado de copresencia</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: seleccionar para editar</translation>
+<translation id="5741454054957165976">Habilita la nueva versión de la intervención de user-agent para cargar WebFonts.</translation>
 <translation id="574392208103952083">Mediano</translation>
 <translation id="5745056705311424885">Memoria USB detectada</translation>
 <translation id="5746169159649715125">Guardar como PDF</translation>
@@ -3339,7 +3349,6 @@
 <translation id="5803531701633845775">Seleccionar frases anteriores, sin mover el cursor</translation>
 <translation id="5804241973901381774">Permisos</translation>
 <translation id="580571955903695899">Reordenar por título</translation>
-<translation id="5808982448801399019">Error de autorización</translation>
 <translation id="580961539202306967">Preguntarme cuando un sitio quiera enviarme mensajes push (recomendado)</translation>
 <translation id="5815645614496570556">Dirección X.400</translation>
 <translation id="5817397429773072584">Chino tradicional</translation>
@@ -3364,6 +3373,7 @@
 <translation id="5834581999798853053">Unos <ph name="TIME" /> minutos</translation>
 <translation id="5838825566232597749">Internacional estilo Workman (EE. UU.)</translation>
 <translation id="5839277899276241121">Igual que la dirección de facturación</translation>
+<translation id="5844550873065695788">Se eliminarán permanentemente al menos <ph name="TOTAL_COUNT" /> elementos de este dispositivo. Para recuperar tus datos en otro momento, inicia sesión en Chrome como $2.</translation>
 <translation id="5846929185714966548">Pestaña 4</translation>
 <translation id="5848934677402291689">Guardando como PDF...</translation>
 <translation id="5849335628409778954">Introducir tarjeta de crédito...</translation>
@@ -3610,6 +3620,7 @@
 <translation id="6232017090690406397">Batería</translation>
 <translation id="6241530762627360640">Acceder a información sobre dispositivos Bluetooth vinculados a tu sistema y descubrir dispositivos Bluetooth cercanos.</translation>
 <translation id="6243774244933267674">Servidor no disponible</translation>
+<translation id="6246413617632217567">No se ha podido importar el usuario supervisado. Comprueba los permisos y el espacio de tu disco duro y vuelve a intentarlo.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Actualización lista</translation>
 <translation id="6248400709929739064">Habilitar subtítulos</translation>
@@ -3638,6 +3649,7 @@
 <translation id="6277518330158259200">H&amp;acer captura de pantalla</translation>
 <translation id="6279183038361895380">Pulsa |<ph name="ACCELERATOR" />| para mostrar el cursor</translation>
 <translation id="6280215091796946657">Iniciar sesión con otra cuenta</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Experimento que permite que todas las API reflejen la ventana gráfica de diseño. De esta forma, las propiedades window.scroll estarán relacionadas con la ventana gráfica de diseño.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nueva impresora en tu red}other{Nuevas impresoras en tu red}}</translation>
 <translation id="6285395082104474418">La bandeja de estado te muestra el estado actual de la red y de la batería, entre otra información.</translation>
@@ -3693,6 +3705,7 @@
 <translation id="6380143666419481200">Aceptar y continuar</translation>
 <translation id="6380224340023442078">Configuración de contenido...</translation>
 <translation id="6383194710567510941">Habilita el uso de la API chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Se eliminará permanentemente al menos $1 elemento de este dispositivo. Para recuperar tus datos en otro momento, inicia sesión en Chrome como $2.}other{Se eliminarán permanentemente al menos $1 elementos de este dispositivo. Para recuperar tus datos en otro momento, inicia sesión en Chrome como $2.}}</translation>
 <translation id="6384275966486438344">Cambiar configuración de búsqueda por: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Las páginas que aparezcan en esta ventana no se mostrarán en el historial del navegador y no dejarán otros rastros como cookies en el ordenador después de cerrar todas las ventanas abiertas de la sesión de invitado. No obstante, se conservará cualquier archivo que descargues.</translation>
 <translation id="6391538222494443604">Debe existir el directorio de entrada.</translation>
@@ -3830,6 +3843,7 @@
 <translation id="6575134580692778371">Sin configurar</translation>
 <translation id="6575251558004911012">Solicitar permiso cuando un sitio requiera acceso a tu cámara (recomendado)</translation>
 <translation id="6579159469348633828">Codificación de contenido Brotli</translation>
+<translation id="6580151766480067746">Versión de ARC</translation>
 <translation id="6581162200855843583">Enlace de Google Drive</translation>
 <translation id="6583070985841601920">Has iniciado sesión como <ph name="USER_EMAIL_ADDRESS" />. Tu administrador ha inhabilitado la sincronización.</translation>
 <translation id="65832705307647870">Rellena previamente la página Nueva pestaña con sitios web populares.</translation>
@@ -3995,6 +4009,7 @@
 <translation id="6847758263950452722">Guardar página como MHTML</translation>
 <translation id="6853388645642883916">Herramienta de actualización no disponible</translation>
 <translation id="68541483639528434">Cerrar las demás pestañas</translation>
+<translation id="6856701878604560493">Habilitar marcadores sin conexión</translation>
 <translation id="6860097299815761905">Configuración de proxy...</translation>
 <translation id="6860427144121307915">Abrir en una pestaña</translation>
 <translation id="6862635236584086457">Se realiza una copia de seguridad online de forma automática de todos los archivos guardados en esta carpeta .</translation>
@@ -4167,6 +4182,7 @@
 <translation id="7092106376816104">Excepciones de pop-ups</translation>
 <translation id="7093866338626856921">Intercambiar datos con los dispositivos denominados <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">¿Quieres descubrir otras fantásticas funciones?</translation>
+<translation id="7096108453481049031">No se ha podido importar el usuario supervisado. Comprueba tu conexión de red y vuelve a intentarlo más tarde.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> elementos seleccionados</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Comprar más almacenamiento...</translation>
@@ -4195,6 +4211,7 @@
 <translation id="713888829801648570">La contraseña no se ha podido verificar porque no te has conectado a Internet.</translation>
 <translation id="7140928199327930795">No hay otros dispositivos disponibles.</translation>
 <translation id="7141105143012495934">Se ha producido un error al iniciar sesión porque no ha sido posible recuperar la información de la cuenta. Ponte en contacto con el administrador o vuelve a intentarlo.</translation>
+<translation id="7141331524324591758">Habilita la compatibilidad experimental parcial del API de eventos del puntero. Esta función se ha diseñado únicamente para que los desarrolladores web realicen pruebas. Puede hacer que algunos sitios web dejen de funcionar correctamente.</translation>
 <translation id="7143207342074048698">Conectando</translation>
 <translation id="7144878232160441200">Volver a intentar</translation>
 <translation id="7148311641502571842">Se ha inhabilitado <ph name="PLUGIN_NAME" />. Para volver a habilitarlo, accede a <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4842,6 +4859,7 @@
 <translation id="8119572489781388874">Modificar configuración</translation>
 <translation id="8119631488458759651">eliminar este sitio</translation>
 <translation id="8121385576314601440">Configuración de entrada en modo Hangul</translation>
+<translation id="8122245494004914423">Se eliminarán permanentemente tus datos de navegación de este dispositivo. Para recuperar tus datos en otro momento, inicia sesión en Chrome como $2.</translation>
 <translation id="8124313775439841391">ONC administrado</translation>
 <translation id="8126844665673008223">Bluetooth web</translation>
 <translation id="8127322077195964840">Permitir que se carguen certificados no válidos desde localhost.</translation>
@@ -4927,6 +4945,7 @@
 <translation id="8226742006292257240">Esta es la contraseña del TPM generada aleatoriamente que se ha asignado a tu ordenador:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" /> o <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Los actuales atacantes del sitio <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> podrían intentar instalar programas peligrosos en tu ordenador para robar o eliminar tu información (por ejemplo, fotos, contraseñas, mensajes y tarjetas de crédito).</translation>
+<translation id="8233254008506535819">Incluye la opción para añadir a una lista blanca sitios web importantes en el cuadro de diálogo Borrar datos de navegación.</translation>
 <translation id="8236231079192337250">Aplicación Galería de Chrome Web Store para controladores de impresora</translation>
 <translation id="8238649969398088015">Sugerencia de ayuda</translation>
 <translation id="8240697550402899963">Utilizar tema clásico</translation>
@@ -5251,7 +5270,6 @@
 <translation id="8708671767545720562">&amp;Más información</translation>
 <translation id="8711402221661888347">Hamburguesa</translation>
 <translation id="8711453844311572806">Si el teléfono está desbloqueado y se encuentra cerca, solo tienes que hacer clic para acceder. De lo contrario, se mostrará un icono de bloqueo y deberás escribir la contraseña.</translation>
-<translation id="8712637175834984815">Listo</translation>
 <translation id="8713570323158206935">Enviar <ph name="BEGIN_LINK1" />información del sistema<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Habilita la autocorrección de teclado físico para el teclado de Estados Unidos, lo que permite mostrar sugerencias al escribir en el teclado físico.</translation>
 <translation id="871476437400413057">Contraseñas guardadas de Google</translation>
@@ -5615,6 +5633,7 @@
 <translation id="952992212772159698">Sin activar</translation>
 <translation id="953000875543358078">Este proceso puede durar aproximadamente hasta un minuto</translation>
 <translation id="960987915827980018">Aproximadamente 1 hora</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Se eliminará permanentemente $1 elemento de este dispositivo. Para recuperar tus datos en otro momento, inicia sesión en Chrome como $2.}other{Se eliminarán permanentemente $1 elementos de este dispositivo. Para recuperar tus datos en otro momento, inicia sesión en Chrome como $2.}}</translation>
 <translation id="96421021576709873">Red Wi-Fi</translation>
 <translation id="965490406356730238">Permite habilitar la opción de decodificación de mjpeg acelerada por hardware para el fotograma capturado si está disponible.</translation>
 <translation id="968174221497644223">Caché de aplicación</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index d367a10..6166f43 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -251,6 +251,7 @@
       Pange tähele, et Bluetooth lülitatakse sisse kõigi kasutaja <ph name="USER_DISPLAY_EMAIL" /> ühilduvate seadmete puhul ja teatud riistvarateavet saadetakse Google'ile. &lt;a&gt;Lisateave&lt;/a&gt;</translation>
 <translation id="13649080186077898">Luba automaatse täitmise seaded</translation>
 <translation id="1367951781824006909">Vali fail</translation>
+<translation id="136802136832547685">Pole jälgitavaid kasutajaid, keda sellesse seadmesse lisada.</translation>
 <translation id="1368265273904755308">Teata probleemist</translation>
 <translation id="1368832886055348810">Left to Right (Vasakult paremale)</translation>
 <translation id="1370646789215800222">Kas eemaldada isik?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Otsi</translation>
 <translation id="1384211230590313258">Teenuse tuvastamise töötleja</translation>
 <translation id="1386387014181100145">Terekest!</translation>
+<translation id="1386830813511981192">Teie seadmes <ph name="DEVICE_TYPE" /> on nüüd saadaval üle miljoni rakenduse ja mängu.</translation>
 <translation id="1389297115360905376">Seda on võimalik lisada vaid teenusest <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Ava tavalisel vahelehel</translation>
 <translation id="1395262318152388157">Otsinguliugur</translation>
@@ -893,6 +895,7 @@
 <translation id="2280486287150724112">Parem veeris</translation>
 <translation id="2282146716419988068">GPU-protsess</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Funktsiooni Kasutaja-agendi sekkumine WebFontsi laadimisel uus versioon.</translation>
 <translation id="2286454467119466181">Lihtne</translation>
 <translation id="2286950485307333924">Olete nüüd Chrome'i sisse logitud</translation>
 <translation id="2287590536030307392">Lülitab kõik traadita ühendused välja.</translation>
@@ -1070,6 +1073,7 @@
 <translation id="2542049655219295786">Google'i tabel</translation>
 <translation id="2546283357679194313">Küpsised ja saidiandmed</translation>
 <translation id="2549646943416322527">Seccompi tuvasti</translation>
+<translation id="2550212893339833758">Saalitud mälu</translation>
 <translation id="2553100941515833716">Rakenduste käivitaja installioleku lähtestamine igal taaskäivitamisel.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> ei suutnud ühenduda võrku <ph name="NETWORK_ID" />. Valige muu võrk või proovige uuesti.</translation>
 <translation id="2553440850688409052">Peida pistikprogramm</translation>
@@ -1103,6 +1107,7 @@
 <translation id="2587203970400270934">Operaatori kood:</translation>
 <translation id="2587922270115112871">Jälgitava kasutaja loomine ei loo Google'i kontot ning kasutaja seaded ja andmed
     ei järgne talle teistes Chrome'i sünkroonimise funktsiooniga seadmetes. Jälgitav kasutaja kehtib ainult selles seadmes.</translation>
+<translation id="2594049137847833442">Tähtsate saitide valikud sirvimisandmete kustutamise dialoogis</translation>
 <translation id="2594056015203442344">Selle lubamise korral kahekordistuvad helinäidikud vahelehtede ribal võrreldes vahekaardi heli summutuse juhtnuppudega. Lisab ka vahekaardi kontekstimenüüsse käske mitme valitud vahekaardi kiiresti summutamiseks.</translation>
 <translation id="259421303766146093">Vähendus</translation>
 <translation id="2597852038534460976">Chrome ei saa juurdepääsu taustapiltidele. Ühendage seade võrku.</translation>
@@ -1470,7 +1475,6 @@
 <translation id="3065140616557457172">Tippige otsinguks või sisestage navigeerimiseks URL - ja kõik lihtsalt toimib.</translation>
 <translation id="3067198360141518313">Käita pistikprogramm</translation>
 <translation id="307519606911195071">Lubatakse juurdepääsetavuse lisafunktsioonid lehel Seaded.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> loodi valvatud kasutajana.</translation>
 <translation id="3075874217500066906">Powerwashi toiminguks on vajalik taaskäivitamine. Pärast taaskäivitamist palutakse teil kinnitada jätkamise soov.</translation>
 <translation id="3076677906922146425">Igaüks saab inimese Chrome'i lisada</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" /> / <ph name="DOWNLOAD_TOTAL" />-st</translation>
@@ -1487,6 +1491,7 @@
 <translation id="3088034400796962477">Transliteratsioon (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Nimeta ümber ...</translation>
 <translation id="308903551226753393">Seadista automaatselt</translation>
+<translation id="3089231390674410424">Näib, et teie mandaadiga on probleem. Veenduge, et oleksite õigesti sisse logitud, ja proovige uuesti.</translation>
 <translation id="3090819949319990166">Välist crx-faili ei saa faili <ph name="TEMP_CRX_FILE" /> kopeerida.</translation>
 <translation id="3090871774332213558">Seade „<ph name="DEVICE_NAME" />” on seotud</translation>
 <translation id="3092544800441494315">Lisa see ekraanipilt:</translation>
@@ -2014,7 +2019,6 @@
 <translation id="3790856258139356663">Loob ühenduse Chrome'i sünkroonimise testserveriga.</translation>
 <translation id="3790909017043401679">Sisestage SIM-kaardi PIN-kood</translation>
 <translation id="3792890930871100565">Eemalda printereid</translation>
-<translation id="3795681127952030401"><ph name="URL" /> soovib saata märguandeid.</translation>
 <translation id="3796648294839530037">Lemmikvõrgud:</translation>
 <translation id="3797900183766075808">&amp;Otsi otsingumootoriga <ph name="SEARCH_ENGINE" /> terminit „<ph name="SEARCH_TERMS" />”</translation>
 <translation id="3798449238516105146">Versioon</translation>
@@ -2487,6 +2491,7 @@
 <translation id="4552678318981539154">Ostke rohkem talletusruumi</translation>
 <translation id="4554591392113183336">Välise laienduse versioon on sama või vanem mis olemasoleval.</translation>
 <translation id="4554796861933393312">Materiaalse disaini tindipleki animatsiooni kiirus</translation>
+<translation id="4555670907822902621">Lubatakse järjehoidjatesse lisatud lehtede salvestamine võrguühenduseta vaatamiseks.</translation>
 <translation id="4555769855065597957">Vari</translation>
 <translation id="4556110439722119938">Teie järjehoidjad, ajalugu, paroolid ja muud seaded sünkroonitakse teie Google'i kontoga, et saaksite neid kasutada kõigis oma seadmetes</translation>
 <translation id="4557136421275541763">Hoiatus.</translation>
@@ -2663,6 +2668,7 @@
 <translation id="4824518112777153488">Hõljutusfunktsiooniga puuteekraanide tugi</translation>
 <translation id="4830573902900904548">Seade <ph name="DEVICE_TYPE" /> ei saa võrgu <ph name="NETWORK_NAME" /> kaudu Internetiga ühendust. Valige mõni teine võrk. <ph name="LEARN_MORE_LINK_START" />Lisateave<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Organisatsiooni <ph name="ORGANIZATION" /> identiteedi asukohas <ph name="LOCALITY" /> kinnitas väljaandja <ph name="ISSUER" />. Server esitas kehtiva sertifikaadi läbipaistvuse teabe.</translation>
+<translation id="4832537345877333532">Keelatakse ICC-ekraanifailide toomine Quirksi Serverist ekraani värvide kalibreerimiseks.</translation>
 <translation id="4834912470034578916">Luba veebimärguannete puhul kohandatud paigutused.</translation>
 <translation id="4835836146030131423">Sisselogimisel ilmnes viga.</translation>
 <translation id="4837926214103741331">Teil ei ole seadme kasutamiseks volitust. Sisselogimisloa saamiseks võtke ühendust omanikuga.</translation>
@@ -2850,6 +2856,7 @@
 <translation id="5120421890733714118">Usalda seda sertifikaati veebisaitide tuvastamiseks.</translation>
 <translation id="5121130586824819730">Teie kõvaketas on täis. Salvestage muusse asukohta või vabastage kõvakettaruumi.</translation>
 <translation id="5125751979347152379">Vale URL.</translation>
+<translation id="5126663277159826272">Keela Quirksi kliendil ekraani kalibreerida.</translation>
 <translation id="5127881134400491887">Võrguühenduste haldamine</translation>
 <translation id="5128590998814119508">Kuvaloendi 2D-lõuend</translation>
 <translation id="512903556749061217">ühendatud</translation>
@@ -2991,9 +2998,11 @@
 <translation id="5301751748813680278">Sisenemine külastajana.</translation>
 <translation id="5301954838959518834">Selge, sain aru</translation>
 <translation id="5302048478445481009">Keel</translation>
+<translation id="5304039790201806037">Kursori sündmused</translation>
 <translation id="5305688511332277257">Pole ühtegi installitud</translation>
 <translation id="5308380583665731573">Ühendamine</translation>
 <translation id="5311260548612583999">Privaatvõtme fail (valik.):</translation>
+<translation id="5313967007315987356">Lisa sait</translation>
 <translation id="5316588172263354223">Häälotsing igal ajal</translation>
 <translation id="5316716239522500219">Kuvarite peegeldamine</translation>
 <translation id="5317780077021120954">Salvesta</translation>
@@ -3296,6 +3305,7 @@
 <translation id="5734362860645681824">Vestlusteenused</translation>
 <translation id="573719557377416048">Kohaloleku kustutamine</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: muutmiseks valige</translation>
+<translation id="5741454054957165976">Lubatakse funktsiooni Kasutaja-agendi sekkumine WebFontsi laadimisel uus versioon.</translation>
 <translation id="574392208103952083">Keskmine</translation>
 <translation id="5745056705311424885">Tuvastati USB-mälupulk</translation>
 <translation id="5746169159649715125">Salvesta PDF-ina</translation>
@@ -3344,7 +3354,6 @@
 <translation id="5803531701633845775">Valige tagant fraasid kursorit liigutamata</translation>
 <translation id="5804241973901381774">Load</translation>
 <translation id="580571955903695899">Järjesta pealkirja alusel uuesti</translation>
-<translation id="5808982448801399019">Volitamine ebaõnnestus</translation>
 <translation id="580961539202306967">Küsi, kui sait tahab saata tõukesõnumeid (soovitatav)</translation>
 <translation id="5815645614496570556">X.400 aadress</translation>
 <translation id="5817397429773072584">hiina (traditsiooniline)</translation>
@@ -3369,6 +3378,7 @@
 <translation id="5834581999798853053">Jäänud on umbes <ph name="TIME" /> minutit</translation>
 <translation id="5838825566232597749">USA Workmani rahvusvaheline klaviatuur</translation>
 <translation id="5839277899276241121">Sama kui arveldusaadress</translation>
+<translation id="5844550873065695788">See kustutab sellest seadmest jäädavalt vähemalt <ph name="TOTAL_COUNT" /> üksust. Oma andmete hiljem toomiseks logige Chrome'i sisse kasutajana $2.</translation>
 <translation id="5846929185714966548">Vahekaart 4</translation>
 <translation id="5848934677402291689">PDF-ina salvestamine on pooleli</translation>
 <translation id="5849335628409778954">Sisestage krediitkaardi andmed ...</translation>
@@ -3615,6 +3625,7 @@
 <translation id="6232017090690406397">Aku</translation>
 <translation id="6241530762627360640">Juurdepääs teie süsteemiga seotud Bluetoothi seadmete teabele ja läheduses olevate Bluetoothi seadmete tuvastamine.</translation>
 <translation id="6243774244933267674">Server ei ole saadaval</translation>
+<translation id="6246413617632217567">Jälgitavat kasutajat ei saanud importida. Kontrollige kõvakettaruumi ja lube ning proovige uuesti.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Värskendus on valmis</translation>
 <translation id="6248400709929739064">Luba subtiitrid</translation>
@@ -3643,6 +3654,7 @@
 <translation id="6277518330158259200">J&amp;äädvusta ekraanipilt</translation>
 <translation id="6279183038361895380">Kursori kuvamiseks vajutage klahvi |<ph name="ACCELERATOR" />|</translation>
 <translation id="6280215091796946657">Logige sisse teise kontoga</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Eksperiment selleks, et kõik API-d kajastaksid küljenduse vaateakent. See muudab window.scroll-i atribuudid küljenduse vaateakna suhtes suhteliseks.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Teie võrgus on uus printer}other{Teie võrgus on uued printerid}}</translation>
 <translation id="6285395082104474418">Olekuala kuvab võrgu ja aku praeguse oleku ning muu teabe.</translation>
@@ -3698,6 +3710,7 @@
 <translation id="6380143666419481200">Nõustu ja jätka</translation>
 <translation id="6380224340023442078">Sisu seaded...</translation>
 <translation id="6383194710567510941">Lubatakse chrome.input.ime API kasutamine.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{See kustutab sellest seadmest jäädavalt vähemalt $1 üksuse. Oma andmete hiljem toomiseks logige Chrome'i sisse kasutajana $2.}other{See kustutab sellest seadmest jäädavalt vähemalt $1 üksust. Oma andmete hiljem toomiseks logige Chrome'i sisse kasutajana $2.}}</translation>
 <translation id="6384275966486438344">Muutke oma otsinguseadeid: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Lehti, mida vaatate selles aknas, ei lisata teie brauseri ajalukku ja pärast kõikide avatud külalise režiimi akende sulgemist ei jää neist arvutisse ka muid jälgi (nt küpsiseid). Kõik allalaaditud failid siiski säilitatakse.</translation>
 <translation id="6391538222494443604">Olemas peab olema sisendkataloog.</translation>
@@ -3836,6 +3849,7 @@
 <translation id="6575134580692778371">Ei ole konfigureeritud</translation>
 <translation id="6575251558004911012">Küsi, kui sait soovib juurdepääsu kaamerale (soovitatav)</translation>
 <translation id="6579159469348633828">Brotli sisu kodeerimine.</translation>
+<translation id="6580151766480067746">ARC versioon</translation>
 <translation id="6581162200855843583">Google Drive'i link</translation>
 <translation id="6583070985841601920">Sisse logitud kasutajana <ph name="USER_EMAIL_ADDRESS" />. Administraator on sünkroonimise keelanud.</translation>
 <translation id="65832705307647870">Uus vaheleht eeltäidetakse populaarsete saitidega.</translation>
@@ -4001,6 +4015,7 @@
 <translation id="6847758263950452722">Lehe salvestamine MHTML-ina</translation>
 <translation id="6853388645642883916">Värskendaja on unerežiimis</translation>
 <translation id="68541483639528434">Sule muud vahelehed</translation>
+<translation id="6856701878604560493">Luba võrguühenduseta järjehoidjad</translation>
 <translation id="6860097299815761905">Puhverserveri seaded ...</translation>
 <translation id="6860427144121307915">Ava vahekaardil</translation>
 <translation id="6862635236584086457">Kõik sellesse kausta salvestatud failid varundatakse võrgus automaatselt</translation>
@@ -4174,6 +4189,7 @@
 <translation id="7092106376816104">Hüpikute erandid</translation>
 <translation id="7093866338626856921">Vaheta andmeid seadmetega <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Kas soovite avastada rohkem suurepäraseid funktsioone?</translation>
+<translation id="7096108453481049031">Jälgitavat kasutajat ei saanud importida. Kontrollige võrguühendust ja proovige hiljem uuesti.</translation>
 <translation id="7100897339030255923">Valitud on <ph name="COUNT" /> üksust</translation>
 <translation id="710227449793100220">Märgi sidumine.</translation>
 <translation id="7106346894903675391">Ostke rohkem talletusruumi ...</translation>
@@ -4202,6 +4218,7 @@
 <translation id="713888829801648570">Kahjuks ei saa teie parooli kinnitada, kuna olete offlainis.</translation>
 <translation id="7140928199327930795">Saadaval pole ühtegi muud seadet.</translation>
 <translation id="7141105143012495934">Sisselogimine ebaõnnestus, kuna teie konto üksikasju ei saanud tuua. Võtke ühendust administraatoriga või proovige uuesti.</translation>
+<translation id="7141331524324591758">Lubatakse Kursori sündmuste API osaline katseline tugi. See on mõeldud ainult veebiarendajatele testimiseks ja põhjustab mõne veebisaidi töös märkamatuid tõrkeid.</translation>
 <translation id="7143207342074048698">Ühendamine</translation>
 <translation id="7144878232160441200">Proovi uuesti</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> on keelatud. Lubamiseks külastage aadressi <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4850,6 +4867,7 @@
 <translation id="8119572489781388874">Muuda seadeid</translation>
 <translation id="8119631488458759651">eemalda see sait</translation>
 <translation id="8121385576314601440">Hanguli sisestusseaded</translation>
+<translation id="8122245494004914423">See kustutab sellest seadmest jäädavalt teie sirvimisandmed. Oma andmete hiljem toomiseks logige Chrome'i sisse kasutajana $2.</translation>
 <translation id="8124313775439841391">Hallatud ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Kehtetute sertifikaatide lubamine kohalikust hostist laaditud ressursside puhul.</translation>
@@ -4934,6 +4952,7 @@
 <translation id="8226742006292257240">Alljärgnev on juhuslikult loodud TPM-i parool, mis on teie arvutile määratud:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Saidil <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> olevad ründajad võivad proovida installida teie arvutisse ohtlikke programme, mis varastavad teie teavet või kustutavad selle (nt fotod, paroolid, sõnumid ja krediitkaardiandmed).</translation>
+<translation id="8233254008506535819">Kaasatakse valik, et lisada tähtsad saidid sirvimisandmete kustutamise dialoogis lubatute loendisse.</translation>
 <translation id="8236231079192337250">Chrome'i veebipoe galerii rakendus printeridraiveritele</translation>
 <translation id="8238649969398088015">Abinõuanne</translation>
 <translation id="8240697550402899963">Kasuta klassikalist teemat</translation>
@@ -5258,7 +5277,6 @@
 <translation id="8708671767545720562">&amp;Lisateave</translation>
 <translation id="8711402221661888347">Burger</translation>
 <translation id="8711453844311572806">Kui telefon on avatud ja läheduses, siis piisab sisenemiseks lihtsalt klõpsamisest. Muidu näete ikooni Lukus ja peate sisestama parooli.</translation>
-<translation id="8712637175834984815">Selge</translation>
 <translation id="8713570323158206935">Saada <ph name="BEGIN_LINK1" />süsteemiteave<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Luba füüsilise klaviatuuri automaatparanduse funktsioon USA klaviatuuril, mis pakub füüsilisel klaviatuuril teksti sisestades soovitusi.</translation>
 <translation id="871476437400413057">Google'i salvestatud paroolid</translation>
@@ -5622,6 +5640,7 @@
 <translation id="952992212772159698">Aktiveerimata</translation>
 <translation id="953000875543358078">See võib võtta umbes minuti</translation>
 <translation id="960987915827980018">Jäänud on umbes 1 tund</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{See kustutab sellest seadmest jäädavalt $1 üksuse. Oma andmete hiljem toomiseks logige Chrome'i sisse kasutajana $2.}other{See kustutab sellest seadmest jäädavalt $1 üksust. Oma andmete hiljem toomiseks logige Chrome'i sisse kasutajana $2.}}</translation>
 <translation id="96421021576709873">WiFi-võrk</translation>
 <translation id="965490406356730238">Võimaluse korral lubatakse jäädvustatud kaadri puhul riistvarakiirendusega mjpeg-vormingu dekodeerimine.</translation>
 <translation id="968174221497644223">Rakenduse vahemälu</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index a2b6840d..a9a5d83 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -168,7 +168,7 @@
 <translation id="1225177025209879837">پردازش درخواست...</translation>
 <translation id="1225211345201532184">مورد ۵ قفسه</translation>
 <translation id="1225404570112441414">برای استفاه از این سایت در هر زمانی، آن را به قفسه‌تان اضافه کنید.</translation>
-<translation id="1227507814927581609">هنگام اتصال به «<ph name="DEVICE_NAME" />» تأیید اعتبار انجام نشد.</translation>
+<translation id="1227507814927581609">هنگام اتصال به «<ph name="DEVICE_NAME" />» تأیید اعتبار ناموفق بود.</translation>
 <translation id="1232569758102978740">بدون عنوان</translation>
 <translation id="1233721473400465416">زبان و کشور</translation>
 <translation id="1234808891666923653">کارمندان سرویس</translation>
@@ -252,6 +252,7 @@
 &lt;a&gt;بیشتر بدانید&lt;/a&gt;</translation>
 <translation id="13649080186077898">مدیریت تنظیمات تکمیل خودکار</translation>
 <translation id="1367951781824006909">انتخاب یک فایل</translation>
+<translation id="136802136832547685">کاربر تحت‌نظارتی برای افزودن به این دستگاه وجود ندارد.</translation>
 <translation id="1368265273904755308">گزارش مشکل</translation>
 <translation id="1368832886055348810">چپ به راست</translation>
 <translation id="1370646789215800222">شخص حذف شود؟</translation>
@@ -265,6 +266,7 @@
 <translation id="1383876407941801731">جستجو</translation>
 <translation id="1384211230590313258">کنترل‌کننده یافتن سرویس‌ها</translation>
 <translation id="1386387014181100145">سلام، حالتان چطور است.</translation>
+<translation id="1386830813511981192">بیش از یک میلیون برنامه و بازی اکنون در <ph name="DEVICE_TYPE" /> شما در دسترس است.</translation>
 <translation id="1389297115360905376">این مورد را فقط می‌توان از <ph name="CHROME_WEB_STORE" /> اضافه کرد.</translation>
 <translation id="1390548061267426325">بازکردن به‌عنوان برگه عادی</translation>
 <translation id="1395262318152388157">اسلایدر جستجو</translation>
@@ -890,6 +892,7 @@
 <translation id="2280486287150724112">حاشیه راست</translation>
 <translation id="2282146716419988068">‏پردازش GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">‏نسخه جدید مداخله نماینده کاربر برای بار کردن WebFonts.</translation>
 <translation id="2286454467119466181">ساده</translation>
 <translation id="2286950485307333924">‏اکنون در سیستم Chrome هستید</translation>
 <translation id="2287590536030307392">همه اتصالات بی‌سیم را غیرفعال کنید.</translation>
@@ -903,7 +906,7 @@
 <translation id="2307462900900812319">پیکربندی شبکه</translation>
 <translation id="230927227160767054">این صفحه، می‌خواهد یک کنترل‌کننده سرویس نصب کند.</translation>
 <translation id="2312980885338881851">اووه! به‌نظر می‌رسد هیچ کاربر نظارت‌شده‌ای برای وارد کردن ندارید. لطفاً از دستگاه دیگری یک یا چند کاربر نظارت‌شده ایجاد کنید تا بتوانید آنها را اینجا وارد نمایید.</translation>
-<translation id="2316129865977710310">نه سپاسگزارم</translation>
+<translation id="2316129865977710310">نه متشکرم</translation>
 <translation id="2317031807364506312">لغو</translation>
 <translation id="2318143611928805047">اندازه کاغذ</translation>
 <translation id="2322193970951063277">سرصفحه‌ها و پانویس‌ها</translation>
@@ -1067,6 +1070,7 @@
 <translation id="2542049655219295786">‏جدول Google </translation>
 <translation id="2546283357679194313">کوکی‌ها و داده‌های سایت</translation>
 <translation id="2549646943416322527">‏شناساگر Seccomp</translation>
+<translation id="2550212893339833758">حافظه جابه‌جاشده</translation>
 <translation id="2553100941515833716">وضعیت نصب راه‌انداز برنامه را در هر شروع به کار مجدد بازنشانی کنید.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> نتوانست به <ph name="NETWORK_ID" /> متصل شود. لطفاً یک شبکه دیگر را انتخاب کرده یا دوباره امتحان کنید.</translation>
 <translation id="2553440850688409052">پنهان کردن این افزایه</translation>
@@ -1099,6 +1103,7 @@
 <translation id="2585300050980572691">تنظیمات پیش‌فرض جستجو</translation>
 <translation id="2587203970400270934">کد اپراتور:</translation>
 <translation id="2587922270115112871">‏با ایجاد کاربر نظارت شده، حساب Google ایجاد نمی‌شود و تنظیمات و داده‌های آن در دستگاه‌های دیگری که دارای قابلیت همگام‌ساز Chrome هستند اعمال نمی‌شود. کاربر نظارت شده فقط در این دستگاه اعمال می‌شود.</translation>
+<translation id="2594049137847833442">گزینه‌های سایت‌های مهم در کادر گفتگوی داده‌های محصول مرور</translation>
 <translation id="2594056015203442344">زمانی که فعال است، در حالی‌که صدای برگه کنترل‌ها را بی‌صدا می‌کند، نشانگرهای شنیداری در نوار برگه دوبرابر می‌گردند. همچنین دستوراتی را در منوی زمینه برگه برای بی‌صدا کردن سریع چندین برگه منتخب اضافه می‌کند.</translation>
 <translation id="259421303766146093">لغو بزرگ‌نمایی</translation>
 <translation id="2597852038534460976">‏Chrome نمی‌تواند به کاغذدیواری‌ها دسترسی پیدا کند. لطفاً به یک شبکه وصل شوید.</translation>
@@ -1466,7 +1471,6 @@
 <translation id="3065140616557457172">‏برای جستجو تایپ کنید یا URL را برای پیمایش وارد کنید - همه چیز آماده است.</translation>
 <translation id="3067198360141518313">اجرای این افزایه</translation>
 <translation id="307519606911195071">قابلیت‌های دسترس‌پذیری بیشتری را در صفحه «تنظیمات» فعال کنید.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> به عنوان یک کاربر نظارت‌شده ایجاد شده است!</translation>
 <translation id="3075874217500066906">‏برای شروع فرآیند Powerwash، به یک راه‌اندازی مجدد نیاز دارید. پس از راه‌اندازی مجدد، از شما خواسته می‌شود تأیید کنید که می‌خواهید ادامه دهید.</translation>
 <translation id="3076677906922146425">‏اجازه به همه برای افزودن شخصی به Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1483,6 +1487,7 @@
 <translation id="3088034400796962477">‏نویسه‌گردانی (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;تغییر‌نام...</translation>
 <translation id="308903551226753393">پیکربندی به صورت خودکار</translation>
+<translation id="3089231390674410424">اوه! به‌نظر می‌رسد مشکلی در اعتبارنامه شما وجود دارد. لطفاً مطمئن شوید به‌درستی به سیستم وارد شده‌اید و دوباره امتحان کنید.</translation>
 <translation id="3090819949319990166">‏فایل خارجی crx در <ph name="TEMP_CRX_FILE" /> کپی نمی‌شود.</translation>
 <translation id="3090871774332213558">«<ph name="DEVICE_NAME" />» مرتبط شد</translation>
 <translation id="3092544800441494315">لحاظ کردن این عکس صفحهٔ نمایش:</translation>
@@ -1916,7 +1921,7 @@
 <translation id="3665842570601375360">امنیت:</translation>
 <translation id="3668570675727296296">تنظیمات زبان</translation>
 <translation id="3668823961463113931">کنترل‌کننده‌ها</translation>
-<translation id="3672159315667503033"><ph name="URL" /> می‌خواهد بطور دائم داده‌های بزرگ را در رایانه محلی شما ذخیره کند.</translation>
+<translation id="3672159315667503033"><ph name="URL" /> می‌خواهد به‌طور دائم داده‌های بزرگ را در رایانه محلی شما ذخیره کند.</translation>
 <translation id="3672681487849735243">یک خطای کارخانه شناسایی شده است</translation>
 <translation id="367645871420407123">اگر می‌خواهید گذرواژه ریشه را روی مقدار تصویر آرمایشی پیش‌فرض تنظیم کنید، خالی بگذارید</translation>
 <translation id="3678156199662914018">برنامهٔ افزودنی: <ph name="EXTENSION_NAME" /></translation>
@@ -2010,7 +2015,6 @@
 <translation id="3790856258139356663">‏به سرور آزمایش برای همگام‌سازی Chrome متصل می‌شود.</translation>
 <translation id="3790909017043401679">وارد کردن پین سیم کارت</translation>
 <translation id="3792890930871100565">قطع ارتباط چاپگرها</translation>
-<translation id="3795681127952030401"><ph name="URL" /> می‌خواهد به شما اعلان‌هایی ارسال کند.</translation>
 <translation id="3796648294839530037">شبکه‌های دلخواه:</translation>
 <translation id="3797900183766075808">‏(&amp;S) جستجوی <ph name="SEARCH_ENGINE" /> برای «<ph name="SEARCH_TERMS" />»</translation>
 <translation id="3798449238516105146">نسخه</translation>
@@ -2484,6 +2488,7 @@
 <translation id="4552678318981539154">خرید فضای ذخیره بیشتر</translation>
 <translation id="4554591392113183336">برنامه افزودنی خارجی در مقایسه با برنامه کنونی، دارای همان نسخه یا نسخه پایین‌تر است.</translation>
 <translation id="4554796861933393312">سرعت پویانمایی قطره جوهر با طراحی سه‌بعدی</translation>
+<translation id="4555670907822902621">ذخیره کردن صفحه‌های نشانک‌گذاری‌شده را برای مشاهده آفلاین فعال کنید.</translation>
 <translation id="4555769855065597957">سایه</translation>
 <translation id="4556110439722119938">‏نشانک‌ها، سابقه، گذرواژه‌ها و سایر تنظیمات در حساب Google شما همگام‌سازی می‌شوند تا بتوانید از آن‌ها در همه دستگاه‌هایتان استفاده کنید.</translation>
 <translation id="4557136421275541763">اخطار:</translation>
@@ -2519,7 +2524,7 @@
 <translation id="4618990963915449444">همه فایل‌های موجود در <ph name="DEVICE_NAME" /> پاک می‌شوند.</translation>
 <translation id="4619415398457343772">‏توافق AA</translation>
 <translation id="4620809267248568679">این تنظیم توسط یک برنامهٔ افزودنی به اجرا گذاشته می‌شود.</translation>
-<translation id="4622797390298627177">از بررسی‌های درجه تعامل کاربر برای نمایش بنرهای برنامه مثل ضروری بودن بازدید قبلی کاربر از سایت و اینکه بنر اخیراً نشان داده نشده باشد، عبور می‌کند. این قابلیت به برنامه‌نویسان امکان می‌دهد برآورده شدن سایر الزامات واجد شرایط بودن برای نمایش بنرهای برنامه، مثل داشتن مانیفست را آزمایش کنند.</translation>
+<translation id="4622797390298627177">سلسله مراتب بررسی درجه تعامل کاربر برای نمایش بنرهای برنامه را طی نمی‌کند؛ نمونه‌های آن ضرورت بازدید قبلی کاربر از سایت یا ضرورت اینکه بنر اخیراً نشان داده نشده باشد. این به تولیدکنندگان امکان می‌دهد تا از سایر شرایط صلاحیت برای نمایش بنرهای برنامه (مثلاً داشتن اظهارنامه) برخوردار شوند.</translation>
 <translation id="462288279674432182">‏IP محدود:</translation>
 <translation id="4623525071606576283">صفحاتی که وقتی مرورگر آفلاین است، بارگیری نمی‌شوند، وقتی مرورگر دوباره آنلاین شود، مجدداً به صورت خودکار بارگیری می‌شوند.</translation>
 <translation id="4623537843784569564">ممکن است این برنامه افزودنی درست به‌روزرسانی نشده باشد. سعی کنید دوباره آن را نصب کنید.</translation>
@@ -2658,6 +2663,7 @@
 <translation id="4824518112777153488">پشتیبانی برای صفحه لمسی با قابلیت نگه‌داشتن نشانگر روی مورد</translation>
 <translation id="4830573902900904548">دستگاه <ph name="DEVICE_TYPE" /> شما نمی‌تواند با استفاده از <ph name="NETWORK_NAME" /> به اینترنت متصل شود. لطفاً شبکه دیگری انتخاب کنید. <ph name="LEARN_MORE_LINK_START" />بیشتر بدانید<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">هویت <ph name="ORGANIZATION" /> در <ph name="LOCALITY" /> توسط <ph name="ISSUER" /> تأیید شده است. اطلاعات شفافیت گواهینامه معتبر توسط سرور ارائه شد.</translation>
+<translation id="4832537345877333532">‏بازیابی فایل‌های نمایشگر icc را از Quirks Server برای کالیبراسیون رنگ نمایشگر غیرفعال کنید.</translation>
 <translation id="4834912470034578916">فعال کردن طرح‌بندی‌های سفارشی برای اعلان‌های وب.</translation>
 <translation id="4835836146030131423">خطای ورود به سیستم.</translation>
 <translation id="4837926214103741331">مجاز به استفاده از این دستگاه نیستید. لطفاً برای دریافت اجازه ورود به سیستم با مالک دستگاه تماس بگیرید.</translation>
@@ -2845,6 +2851,7 @@
 <translation id="5120421890733714118">برای شناسایی وب‌سایتها به این گواهی اطمینان شود.</translation>
 <translation id="5121130586824819730">دیسک سخت پر است. لطفاً در محل دیگری ذخیره کنید یا فضای بیشتری در دیسک سخت ایجاد کنید.</translation>
 <translation id="5125751979347152379">نشانی وب نامعتبر است.</translation>
+<translation id="5126663277159826272">‏غیرفعال‌ کردن Quirks Client برای کالیبراسیون نمایشگر.</translation>
 <translation id="5127881134400491887">مدیریت اتصالات شبکه</translation>
 <translation id="5128590998814119508">نمایش فهرست کانواس دوبعدی</translation>
 <translation id="512903556749061217">متصل</translation>
@@ -2987,9 +2994,11 @@
 <translation id="5301751748813680278">ورود به‌عنوان مهمان.</translation>
 <translation id="5301954838959518834">بله، متوجه شدم</translation>
 <translation id="5302048478445481009">زبان</translation>
+<translation id="5304039790201806037">رویدادهای اشاره‌گر</translation>
 <translation id="5305688511332277257">چیزی نصب نشده است</translation>
 <translation id="5308380583665731573">اتصال</translation>
 <translation id="5311260548612583999">فایل کلید خصوصی (اختیاری):</translation>
+<translation id="5313967007315987356">افزودن سایت</translation>
 <translation id="5316588172263354223">جستجوی شفاهی در زمان دلخواه</translation>
 <translation id="5316716239522500219">بازتاب مانیتورها</translation>
 <translation id="5317780077021120954">ذخیره</translation>
@@ -3292,6 +3301,7 @@
 <translation id="5734362860645681824">ارتباطات</translation>
 <translation id="573719557377416048">پاک کردن وضعیت حضور مشترک</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: انتخاب برای ویرایش</translation>
+<translation id="5741454054957165976">‏نسخه جدید مداخله نماینده کاربر را برای بار کردن WebFonts فعال کنید.</translation>
 <translation id="574392208103952083">متوسط</translation>
 <translation id="5745056705311424885">‏کارت حافظهٔ USB شناسایی شد</translation>
 <translation id="5746169159649715125">‏ذخیره به‌عنوان PDF</translation>
@@ -3340,7 +3350,6 @@
 <translation id="5803531701633845775">انتخاب عباراتی از برگشت، بدون حرکت دادن مکان نما</translation>
 <translation id="5804241973901381774">مجوزها</translation>
 <translation id="580571955903695899">ترتیب مجدد براساس عنوان</translation>
-<translation id="5808982448801399019">احراز هویت ناموفق بود</translation>
 <translation id="580961539202306967">وقتی سایتی می‌خواهد پیام‌های فشاری برایم ارسال کند، از من سؤال شود (توصیه می‌شود)</translation>
 <translation id="5815645614496570556">‏آدرس X.400</translation>
 <translation id="5817397429773072584">چینی سنتی</translation>
@@ -3365,6 +3374,7 @@
 <translation id="5834581999798853053">حدود <ph name="TIME" /> دقیقه باقی مانده است</translation>
 <translation id="5838825566232597749">‏بین‌المللی US Workman</translation>
 <translation id="5839277899276241121">مانند آدرس صورت‌حساب</translation>
+<translation id="5844550873065695788">‏این کار حداقل <ph name="TOTAL_COUNT" /> مورد را برای همیشه از این دستگاه حذف می‌کند. برای بازیابی داده‌هایتان در فرصت دیگری، به سیستم chrome به‌عنوان ‎$2 وارد شوید.</translation>
 <translation id="5846929185714966548">برگه ۴</translation>
 <translation id="5848934677402291689">‏ذخیره در PDF در حال انجام است</translation>
 <translation id="5849335628409778954">کارت اعتباری را وارد کنید...</translation>
@@ -3609,6 +3619,7 @@
 <translation id="6232017090690406397">باتری</translation>
 <translation id="6241530762627360640">دسترسی به اطلاعات دستگاه‌های بلوتوث مرتبط شده با سیستم شما و کشف دستگاه‌های بلوتوث در این نزدیکی.</translation>
 <translation id="6243774244933267674">سرور در دسترس نیست</translation>
+<translation id="6246413617632217567">کاربر تحت‌نظارت وارد نشد. لطفاً فضای دیسک سخت و مجوزهایتان را بررسی کرده، دوباره امتحان کنید.</translation>
 <translation id="6247708409970142803">%<ph name="PERCENTAGE" /></translation>
 <translation id="624789221780392884">به‌روزرسانی آماده است</translation>
 <translation id="6248400709929739064">فعال کردن زیرنویس</translation>
@@ -3637,6 +3648,7 @@
 <translation id="6277518330158259200">گرفتن عکس صفحه‌نمایش</translation>
 <translation id="6279183038361895380">برای نمایش نشان‌گر |<ph name="ACCELERATOR" />| را فشار دهید</translation>
 <translation id="6280215091796946657">ورود به سیستم با حساب دیگر</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">‏آزمایشی برای انعکاس بخش قابل مشاهده طرح‌بندی همه فایل‌های API. این کار ویژگی‌های window.scroll را به بخش قابل مشاهده طرح‌بندی مربوط می‌کند.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{چاپگر جدید در شبکه شما}one{چاپگر جدید در شبکه شما}other{چاپگر جدید در شبکه شما}}</translation>
 <translation id="6285395082104474418">سینی وضعیت، وضعیت فعلی شبکه، باتری و موارد دیگر را به شما نشان می‌دهد.</translation>
@@ -3692,6 +3704,7 @@
 <translation id="6380143666419481200">پذیرش و ادامه</translation>
 <translation id="6380224340023442078">تنظیمات محتوا...</translation>
 <translation id="6383194710567510941">‏استفاده از chrome.input.ime API را فعال می‌کند.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{‏این کار حداقل $1 مورد را برای همیشه از این دستگاه حذف می‌کند. برای بازیابی داده‌هایتان در فرصت دیگری، به سیستم chrome به‌عنوان ‎$2 وارد شوید.}one{‏این کار حداقل $1 مورد را برای همیشه از این دستگاه حذف می‌کند. برای بازیابی داده‌هایتان در فرصت دیگری، به سیستم chrome به‌عنوان ‎$2 وارد شوید.}other{‏این کار حداقل $1 مورد را برای همیشه از این دستگاه حذف می‌کند. برای بازیابی داده‌هایتان در فرصت دیگری، به سیستم chrome به‌عنوان ‎$2 وارد شوید.}}</translation>
 <translation id="6384275966486438344">تغییر تنظیمات جستجویتان به: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">صفحاتی که در این پنجره مشاهده می‌کنید در سابقه مرورگر نشان داده نمی‌شوند و بعد از بسته شدن همه پنجره‌های مهمان باز، هیچ رد دیگری (مانند کوکی) در رایانه از خود به جای نمی‌گذارند. با این وجود، فایل‌هایی که دانلود می‌کنید، حفظ می‌شوند.</translation>
 <translation id="6391538222494443604">دایرکتوری ورودی باید بسته شود.</translation>
@@ -3830,6 +3843,7 @@
 <translation id="6575134580692778371">پیکربندی نشده</translation>
 <translation id="6575251558004911012">وقتی سایتی باید به دوربین دسترسی داشته باشد، سؤال شود (توصیه می‌شود)</translation>
 <translation id="6579159469348633828">‏کدبندی محتوای Brotli.</translation>
+<translation id="6580151766480067746">‏نسخه ARC</translation>
 <translation id="6581162200855843583">‏پیوند Google Drive</translation>
 <translation id="6583070985841601920">بعنوان <ph name="USER_EMAIL_ADDRESS" /> وارد سیستم شدید. همگام‌سازی توسط سرپرست شما غیرفعال شده است.</translation>
 <translation id="65832705307647870">سایت‌های پرطرفدار از قبل به صفحه «برگه جدید» اضافه می‌شود.</translation>
@@ -3995,6 +4009,7 @@
 <translation id="6847758263950452722">‏ذخیره صفحه به صورت MHTML</translation>
 <translation id="6853388645642883916">به‌روزرسان در حالت خواب</translation>
 <translation id="68541483639528434">بستن برگه‌های دیگر</translation>
+<translation id="6856701878604560493">فعال کردن نشانک‌های آفلاین</translation>
 <translation id="6860097299815761905">تنظیمات پراکسی...</translation>
 <translation id="6860427144121307915">باز کردن در یک برگه</translation>
 <translation id="6862635236584086457">از همه فایل‌های ذخیره شده در این پوشه به‌صورت خودکار و آنلاین نسخهٔ پشتیبان تهیه می‌شود</translation>
@@ -4166,6 +4181,7 @@
 <translation id="7092106376816104">موارد استثنای پنجره بازشو</translation>
 <translation id="7093866338626856921">تبادل داده با دستگاه‌هایی با نام‌های: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">می‌خواهید قابلیت‌های عالی‌تری را کشف کنید؟</translation>
+<translation id="7096108453481049031">کاربر تحت‌نظارت وارد نشد. لطفاً اتصال شبکه‌تان را بررسی کرده، بعداً دوباره امتحان کنید.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> مورد انتخاب شدند</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">خرید فضای ذخیره بیشتر...</translation>
@@ -4194,6 +4210,7 @@
 <translation id="713888829801648570">متأسفیم، گذرواژه‌تان قابل تأیید نیست، زیرا آفلاین هستید.</translation>
 <translation id="7140928199327930795">هیچ دستگاه دیگری در دسترس نیست.</translation>
 <translation id="7141105143012495934">به دلیل اینکه جزئيات حساب شما بازیابی نشد، ورود به سیستم ناموفق بود. لطفاً با سرپرستتان تماس بگیرید یا دوباره امتحان کنید.</translation>
+<translation id="7141331524324591758">‏پشتیبانی آزمایشی جزئی را برای Pointer Events API فعال می‌کند. این فقط برای آزمایش توسط تولیدکنندگان وب درنظر گرفته شده است، خرابی‌های ماهرانه‌ای را در برخی وب‌سایت‌ها ایجاد می‌کند.</translation>
 <translation id="7143207342074048698">در حال اتصال</translation>
 <translation id="7144878232160441200">سعی مجدد</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> غیرفعال شده است. برای فعال کردن مجدد آن، لطفاً به <ph name="CHROME_PLUGINS_LINK" /> بروید.</translation>
@@ -4403,7 +4420,7 @@
 <translation id="7469894403370665791">اتصال به این شبکه به صورت خودکار</translation>
 <translation id="747114903913869239">خطا: رمزگشایی برنامهٔ افزودنی ممکن نیست</translation>
 <translation id="7472639616520044048">‏انواع MIME:</translation>
-<translation id="7473891865547856676">نه سپاسگزارم</translation>
+<translation id="7473891865547856676">نه متشکرم</translation>
 <translation id="747459581954555080">بازیابی همه</translation>
 <translation id="7474669101120914750">این تنظیم با افزونه <ph name="NAME" /> کنترل می‌شود</translation>
 <translation id="7474889694310679759">صفحه‌کلید کانادایی انگلیسی</translation>
@@ -4617,7 +4634,7 @@
 <translation id="7799329977874311193">‏سند HTML</translation>
 <translation id="7800518121066352902">چرخاندن خلاف جهت ع&amp;قربه‌های ساعت</translation>
 <translation id="7801746894267596941">‏فقط فردی با عبارت عبور شما می‌تواند داده رمزگذاری شده شما را بخواند. عبارت عبور توسط Google ارسال یا ذخیره نمی‌شود. اگر عبارت عبور خود را فراموش کرده‌اید، باید</translation>
-<translation id="780301667611848630">نه سپاسگزارم</translation>
+<translation id="780301667611848630">نه متشکرم</translation>
 <translation id="7805768142964895445">وضعیت</translation>
 <translation id="7806513705704909664">فعال کردن «تکمیل خودکار» برای پر کردن فرم‌های وب با یک کلیک.</translation>
 <translation id="7807711621188256451">دسترسی <ph name="HOST" /> به دوربین شما همیشه مجاز باشد</translation>
@@ -4843,6 +4860,7 @@
 <translation id="8119572489781388874">تغییر تنظیمات</translation>
 <translation id="8119631488458759651">حذف این سایت</translation>
 <translation id="8121385576314601440">تنظیمات ورودی هانگول</translation>
+<translation id="8122245494004914423">‏این کار داده‌های محصول مرور را برای همیشه از این دستگاه حذف می‌کند. برای بازیابی داده‌هایتان در فرصت دیگری، به‌عنوان ‎$2 به chrome وارد شوید.</translation>
 <translation id="8124313775439841391">‏ONC مدیریت شده</translation>
 <translation id="8126844665673008223">بلوتوث وب</translation>
 <translation id="8127322077195964840">امکان دادن به گواهی‌های نامعتبر برای منابع بارگیری شده از میزبان محلی.</translation>
@@ -4927,6 +4945,7 @@
 <translation id="8226742006292257240">‏در زیر گذرواژه TPM ایجاد شده به صورت تصادفی، آورده شده که به رایانهٔ شما اختصاص داده شده است:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />،‏ <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">ممکن است مهاجمین حاضر در <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> تلاش کنند تا برنامه‌های خطرناکی در رایانه شما نصب کنند که اطلاعات شما (مانند عکس‌ها، گذرواژه‌ها، پیام‌ها و کارت‌های اعتباری شما) را سرقت یا حذف می‌کنند.</translation>
+<translation id="8233254008506535819">برای قرار دادن سایت‌های مهم در فهرست مجاز، این گزینه را به کادر گفتگوی پاک کردن داده‌های محصول مرور اضافه کنید.</translation>
 <translation id="8236231079192337250">‏برنامه گالری فروشگاه وب Chrome برای درایورهای چاپگر</translation>
 <translation id="8238649969398088015">نکته راهنمایی</translation>
 <translation id="8240697550402899963">استفاده از طرح زمینه کلاسیک</translation>
@@ -5250,7 +5269,6 @@
 <translation id="8708671767545720562">&amp;اطلاعات بیشتر</translation>
 <translation id="8711402221661888347">همبرگر</translation>
 <translation id="8711453844311572806">وقتی تلفنتان قفل نیست و همین اطراف است، برای وارد شدن فقط کلیک کنید. در غیر این صورت، یک نماد قفل خواهید دید و باید گذرواژه‌تان را تایپ کنید.</translation>
-<translation id="8712637175834984815">متوجه شدم</translation>
 <translation id="8713570323158206935">ارسال <ph name="BEGIN_LINK1" />اطلاعات سیستم<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">تصحیح خودکار صفحه‌کلید فیزیکی را برای صفحه‌کلید آمریکایی فعال می‌کند، این صفحه‌کلید می‌تواند پیشنهاداتی را در حین تایپ در صفحه‌کلید فیزیکی ارائه کند.</translation>
 <translation id="871476437400413057">‏گذرواژه‌های ذخیره‌شده Google</translation>
@@ -5299,7 +5317,7 @@
 <translation id="8769662576926275897">جزئیات کارت</translation>
 <translation id="8770196827482281187">‏روش ورودی فارسی (طرح کلی ISIRI 2901)</translation>
 <translation id="8774934320277480003">حاشیه بالا</translation>
-<translation id="8775404590947523323">ویرایش‌های شما بطور خودکار ذخیره می‌شوند.<ph name="BREAKS" />برای داشتن یک نسخه از تصویر اصلی٬ علامت «رونویسی نسخهٔ اصلی» را بردارید.</translation>
+<translation id="8775404590947523323">ویرایش‌های شما به‌طور خودکار ذخیره می‌شوند.<ph name="BREAKS" />برای داشتن یک نسخه از تصویر اصلی٬ علامت «رونویسی نسخهٔ اصلی» را بردارید.</translation>
 <translation id="8777218413579204310">شناسایی محتوا</translation>
 <translation id="8777628254805677039">گذرواژه کاربر ریشه</translation>
 <translation id="878069093594050299">این گواهی برای استفاده‌های زیر تأیید شده است:</translation>
@@ -5614,6 +5632,7 @@
 <translation id="952992212772159698">فعال نشد</translation>
 <translation id="953000875543358078">ممکن است تا یک دقیقه یا بیشتر طول بکشد</translation>
 <translation id="960987915827980018">حدود ۱ ساعت باقی مانده است</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{‏این کار $1 مورد را برای همیشه از این دستگاه حذف می‌کند. برای بازیابی داده‌هایتان در فرصت دیگری، به سیستم chrome به‌عنوان ‎$2 وارد شوید.}one{‏این کار $1 مورد را برای همیشه از این دستگاه حذف می‌کند. برای بازیابی داده‌هایتان در فرصت دیگری، به سیستم chrome به‌عنوان ‎$2 وارد شوید.}other{‏این کار $1 مورد را برای همیشه از این دستگاه حذف می‌کند. برای بازیابی داده‌هایتان در فرصت دیگری، به سیستم chrome به‌عنوان ‎$2 وارد شوید.}}</translation>
 <translation id="96421021576709873">‏شبکه‌ Wi-Fi</translation>
 <translation id="965490406356730238">‏رمزگشای mjpeg شتاب‌داده شده برای سخت‌افزار را برای قاب ضبط شده (در صورت وجود) فعال می‌کند.</translation>
 <translation id="968174221497644223">حافظه پنهان برنامه</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 1169f1c..6c5916c 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -251,6 +251,7 @@
       Huomaa, että Bluetooth otetaan käyttöön kaikissa käyttäjän <ph name="USER_DISPLAY_EMAIL" /> yhteensopivissa laitteissa ja joitain laitteistotietoja lähetetään Googlelle. &lt;a&gt;Lisätietoja&lt;/a&gt;</translation>
 <translation id="13649080186077898">Hallinnoi automaattisen täytön asetuksia</translation>
 <translation id="1367951781824006909">Valitse tiedosto</translation>
+<translation id="136802136832547685">Tälle laitteelle lisättäviä valvottuja käyttäjiä ei ole.</translation>
 <translation id="1368265273904755308">Ilmoita ongelmasta</translation>
 <translation id="1368832886055348810">Vasemmalta oikealle</translation>
 <translation id="1370646789215800222">Poistetaanko tämä henkilö?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Haku</translation>
 <translation id="1384211230590313258">Palveluiden löytämisen käsittelijä</translation>
 <translation id="1386387014181100145">Heipä hei!</translation>
+<translation id="1386830813511981192">Yli miljoona sovellusta ja peliä on saatavilla laitteelle <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Tämä voidaan asentaa vain sijainnista <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Avaa tavallisella välilehdellä</translation>
 <translation id="1395262318152388157">Kelaamisen liukusäädin</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">Oikea reuna</translation>
 <translation id="2282146716419988068">GPU-prosessi</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Uusi versio käyttäjäagentin toimenpiteestä verkkokirjasinten lataamista varten</translation>
 <translation id="2286454467119466181">Yksinkertainen</translation>
 <translation id="2286950485307333924">Olet nyt kirjautuneena Chromeen</translation>
 <translation id="2287590536030307392">Sammuta kaikki langattomat yhteydet.</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">Google-taulukko</translation>
 <translation id="2546283357679194313">Evästeet ja sivustotiedot</translation>
 <translation id="2549646943416322527">Seccomp-havaitsin</translation>
+<translation id="2550212893339833758">Vaihdettu muisti</translation>
 <translation id="2553100941515833716">Palauta sovelluksien käynnistysohjelman asennustila jokaisessa uudelleenkäynnistyksessä.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> ei voinut yhdistää verkkoon <ph name="NETWORK_ID" />. Valitse toinen verkko tai yritä uudelleen.</translation>
 <translation id="2553440850688409052">Piilota tämä laajennus</translation>
@@ -1103,6 +1107,7 @@
 <translation id="2587922270115112871">Valvotun käyttäjän luominen ei luo Google-tiliä, ja heidän asetuksensa ja
     tietonsa eivät seuraa heitä muihin laitteisiin Chromen synkronoinnin jälkeen.
     Valvotun käyttäjän voi luoda vain tälle laitteelle.</translation>
+<translation id="2594049137847833442">Tärkeiden sivustojen asetukset selaustietojen tyhjennysikkunassa</translation>
 <translation id="2594056015203442344">Kun tämä on käytössä, välilehtirivin äänen tilaosoittimet toimivat myös välilehden äänten mykistyspainikkeina. Tämä myös lisää komentoja välilehden kontekstivalikkoon, jotta voit mykistää nopeasti useita valittuja välilehtiä.</translation>
 <translation id="259421303766146093">Poista suurennus</translation>
 <translation id="2597852038534460976">Chrome ei voi käyttää taustakuvia. Muodosta verkkoyhteys.</translation>
@@ -1470,7 +1475,6 @@
 <translation id="3065140616557457172">Kirjoita haku tai URL-osoite suoraa siirtymistä varten. Kaikki käy.</translation>
 <translation id="3067198360141518313">Suorita laajennus</translation>
 <translation id="307519606911195071">Voit ottaa muita esteettömyysominaisuuksia käyttöön Asetukset-sivulla.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> on luotu valvottuna käyttäjänä!</translation>
 <translation id="3075874217500066906">Powerwash-prosessin aloittaminen vaatii uudelleenkäynnistyksen. Uudelleenkäynnistyksen jälkeen sinua pyydetään vahvistamaan, että haluat jatkaa.</translation>
 <translation id="3076677906922146425">Anna kaikkien lisätä profiileja Chromeen</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1487,6 +1491,7 @@
 <translation id="3088034400796962477">Translitterointi (salam ← سلام)</translation>
 <translation id="3088325635286126843">Nimeä uudelleen...</translation>
 <translation id="308903551226753393">Määritä automaattisesti</translation>
+<translation id="3089231390674410424">Kirjautumistiedoissasi on jokin ongelma. Varmista, että olet kirjautunut sisään oikein, ja yritä uudelleen.</translation>
 <translation id="3090819949319990166">Ulkoista crx-tiedostoa ei voi kopioida kohteeseen <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">Laitepari muodostettu laitteen <ph name="DEVICE_NAME" /> kanssa</translation>
 <translation id="3092544800441494315">Liitä mukaan tämä kuvakaappaus:</translation>
@@ -2013,7 +2018,6 @@
 <translation id="3790856258139356663">Yhdistää Chromen synkronoinnin testauspalvelimeen.</translation>
 <translation id="3790909017043401679">Anna SIM-kortin PIN-koodi</translation>
 <translation id="3792890930871100565">Irrota tulostimet</translation>
-<translation id="3795681127952030401"><ph name="URL" /> haluaa lähettää sinulle ilmoituksia.</translation>
 <translation id="3796648294839530037">Suosikkiverkot:</translation>
 <translation id="3797900183766075808"><ph name="SEARCH_ENGINE" />-haku termillä <ph name="SEARCH_TERMS" /></translation>
 <translation id="3798449238516105146">Versio</translation>
@@ -2483,6 +2487,7 @@
 <translation id="4552678318981539154">Osta lisää tallennustilaa</translation>
 <translation id="4554591392113183336">Ulkoinen laajennus on sama tai aiempi versio kuin nykyinen.</translation>
 <translation id="4554796861933393312">Material Designin mustepisara-animaation nopeus</translation>
+<translation id="4555670907822902621">Salli kirjanmerkkeihin lisättyjen sivujen tallentaminen offline-katselua varten.</translation>
 <translation id="4555769855065597957">Varjo</translation>
 <translation id="4556110439722119938">Kirjanmerkkisi, historiasi, salasanasi ja muut asetuksesi synkronoidaan Google-tilillesi, jotta voit käyttää niitä kaikilla laitteillasi.</translation>
 <translation id="4557136421275541763">Varoitus:</translation>
@@ -2654,6 +2659,7 @@
 <translation id="4824518112777153488">Leijutusta tukevien kosketusnäyttöjen tuki</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> ei voi muodostaa internetyhteyttä verkon <ph name="NETWORK_NAME" /> kautta. Valitse toinen verkko. <ph name="LEARN_MORE_LINK_START" />Lisätietoja<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572"><ph name="ISSUER" /> on vahvistanut identiteetin <ph name="ORGANIZATION" /> sijainnissa <ph name="LOCALITY" />. Palvelin antoi kelvolliset Certificate Transparency -tiedot.</translation>
+<translation id="4832537345877333532">Estä ICC-näyttötiedostojen noutaminen Quirks Serveriltä näytön värien kalibrointia varten.</translation>
 <translation id="4834912470034578916">Ota käyttöön verkkoilmoitusten muokatut asettelut.</translation>
 <translation id="4835836146030131423">Virhe kirjautumisessa.</translation>
 <translation id="4837926214103741331">Sinulla ei ole tämän laitteen käyttölupaa. Pyydä laitteen omistajalta kirjautumislupa.</translation>
@@ -2841,6 +2847,7 @@
 <translation id="5120421890733714118">Luota tähän varmenteeseen verkkosivustojen tunnistamisessa.</translation>
 <translation id="5121130586824819730">Kiintolevy on täynnä. Tallenna muuhun sijaintiin tai vapauta levytilaa.</translation>
 <translation id="5125751979347152379">Virheellinen URL-osoite.</translation>
+<translation id="5126663277159826272">Estä Quirks Clientin käyttö näytön kalibroinnissa</translation>
 <translation id="5127881134400491887">hallinnoida verkkoyhteyksiä</translation>
 <translation id="5128590998814119508">2D Canvas -näyttöluettelo</translation>
 <translation id="512903556749061217">liitetty</translation>
@@ -2980,9 +2987,11 @@
 <translation id="5301751748813680278">Vierailijakäyttö.</translation>
 <translation id="5301954838959518834">Selvä</translation>
 <translation id="5302048478445481009">Kieli</translation>
+<translation id="5304039790201806037">Osoitintapahtumat</translation>
 <translation id="5305688511332277257">Yhtään ei ole asennettu</translation>
 <translation id="5308380583665731573">Muodosta yhteys</translation>
 <translation id="5311260548612583999">Yksityinen avaintiedosto (valinnainen):</translation>
+<translation id="5313967007315987356">Lisää sivusto</translation>
 <translation id="5316588172263354223">Puhehaun käynnistys milloin tahansa</translation>
 <translation id="5316716239522500219">Peilaa näytöt</translation>
 <translation id="5317780077021120954">Tallenna</translation>
@@ -3285,6 +3294,7 @@
 <translation id="5734362860645681824">Äänilaitteet</translation>
 <translation id="573719557377416048">Tyhjennä Copresence-tila</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: valitse ja muokkaa</translation>
+<translation id="5741454054957165976">Ota käyttöön uusi versio verkkokirjasinten lataamiseen käytettävästä käyttäjäagentin toimenpiteestä.</translation>
 <translation id="574392208103952083">Keskikoko</translation>
 <translation id="5745056705311424885">USB-muistitikku havaittu</translation>
 <translation id="5746169159649715125">Tallenna PDF-muodossa</translation>
@@ -3333,7 +3343,6 @@
 <translation id="5803531701633845775">Valitse lausekkeita takaa liikuttamatta osoitinta</translation>
 <translation id="5804241973901381774">Käyttöluvat</translation>
 <translation id="580571955903695899">Järjestä otsikon mukaan</translation>
-<translation id="5808982448801399019">Valtuutus epäonnistui.</translation>
 <translation id="580961539202306967">Kysy minulta sivuston halutessa lähettää push-viestejä (suositus)</translation>
 <translation id="5815645614496570556">X.400-osoite</translation>
 <translation id="5817397429773072584">perinteinen kiina</translation>
@@ -3358,6 +3367,7 @@
 <translation id="5834581999798853053">Noin <ph name="TIME" /> minuuttia jäljellä</translation>
 <translation id="5838825566232597749">Yhdysvallat, kansainvälinen Workman</translation>
 <translation id="5839277899276241121">Sama kuin laskutusosoite</translation>
+<translation id="5844550873065695788">Vähintään <ph name="TOTAL_COUNT" /> kohdetta poistetaan pysyvästi tältä laitteelta. Jos haluat palauttaa tiedot myöhemmin, kirjaudu Chromeen käyttäjänä $2.</translation>
 <translation id="5846929185714966548">Välilehti 4</translation>
 <translation id="5848934677402291689">PDF-tiedostoksi tallentaminen käynnissä</translation>
 <translation id="5849335628409778954">Lisää luottokortti…</translation>
@@ -3604,6 +3614,7 @@
 <translation id="6232017090690406397">Akku</translation>
 <translation id="6241530762627360640">Käyttää järjestelmäsi kanssa laitepariksi liitettyjen Bluetooth-laitteiden tietoja ja löytää lähellä olevia Bluetooth-laitteita.</translation>
 <translation id="6243774244933267674">Palvelin ei ole käytettävissä</translation>
+<translation id="6246413617632217567">Valvotun käyttäjän tuonti epäonnistui. Tarkista kiintolevytila ja käyttöluvat ja yritä sitten uudelleen.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" /> %</translation>
 <translation id="624789221780392884">Päivitys on valmis</translation>
 <translation id="6248400709929739064">Ota tekstitykset käyttöön</translation>
@@ -3632,6 +3643,7 @@
 <translation id="6277518330158259200">Ot&amp;a kuvakaappaus</translation>
 <translation id="6279183038361895380">Näytä kursori painamalla |<ph name="ACCELERATOR" />|.</translation>
 <translation id="6280215091796946657">Kirjaudu sisään toisella tilillä</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Kokeilu, jolla kaikki sovellusliittymät saadaan sisällytettyä asettelunäkymään. Tällöin window.scroll-vieritysominaisuudet toteutetaan suhteessa asettelunäkymään.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Verkossasi on uusi tulostin}other{Verkossasi on uusia tulostimia}}</translation>
 <translation id="6285395082104474418">Tila-alueella näkyy verkon ja akun nykyinen tila sekä muita tietoja.</translation>
@@ -3687,6 +3699,7 @@
 <translation id="6380143666419481200">Hyväksy ja jatka</translation>
 <translation id="6380224340023442078">Sisältöasetukset...</translation>
 <translation id="6383194710567510941">Ottaa käyttöön chrome.input.ime-sovellusliittymän.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Vähintään $1 kohde poistetaan pysyvästi tältä laitteelta. Jos haluat palauttaa tiedot myöhemmin, kirjaudu Chromeen käyttäjänä $2.}other{Vähintään $1 kohdetta poistetaan pysyvästi tältä laitteelta. Jos haluat palauttaa tiedot myöhemmin, kirjaudu Chromeen käyttäjänä $2.}}</translation>
 <translation id="6384275966486438344">Ota käyttöön seuraava hakukone: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Tässä ikkunassa katselemasi sivut eivät näy selaushistoriassa, eikä niistä jää tietokoneelle muita jälkiä, kuten evästeitä, suljettuasi kaikki vierailijaikkunat. Kaikki lataamasi tiedostot kuitenkin säilytetään.</translation>
 <translation id="6391538222494443604">Syöttöhakemistoa ei ole olemassa.</translation>
@@ -3825,6 +3838,7 @@
 <translation id="6575134580692778371">Ei määritetty</translation>
 <translation id="6575251558004911012">Kysy aina, kun sivusto vaatii kameran käyttöoikeutta (suositus)</translation>
 <translation id="6579159469348633828">Brotli-sisällönkoodaus</translation>
+<translation id="6580151766480067746">ARC-versio</translation>
 <translation id="6581162200855843583">Google Drive -linkki</translation>
 <translation id="6583070985841601920">Kirjautunut käyttäjä: <ph name="USER_EMAIL_ADDRESS" />. Järjestelmänvalvoja on poistanut synkronoinnin käytöstä.</translation>
 <translation id="65832705307647870">Täytä Uusi välilehti -sivu suosituilla sivustoilla.</translation>
@@ -3990,6 +4004,7 @@
 <translation id="6847758263950452722">Tallenna sivu MHTML-muodossa</translation>
 <translation id="6853388645642883916">Päivittäjä on lepotilassa</translation>
 <translation id="68541483639528434">Sulje muut välilehdet</translation>
+<translation id="6856701878604560493">Ota offline-kirjanmerkit käyttöön</translation>
 <translation id="6860097299815761905">Välityspalvelimen asetukset...</translation>
 <translation id="6860427144121307915">Avaa välilehdessä</translation>
 <translation id="6862635236584086457">Kaikki tähän kansioon tallennetut tiedostot varmuuskopioidaan verkkoon automaattisesti</translation>
@@ -4160,6 +4175,7 @@
 <translation id="7092106376816104">Ponnahdusikkunapoikkeukset</translation>
 <translation id="7093866338626856921">Vaihtaa tietoja isäntää <ph name="HOSTNAMES" /> käyttävien laitteiden kanssa.</translation>
 <translation id="7096082900368329802">Haluatko löytää lisää mahtavia ominaisuuksia?</translation>
+<translation id="7096108453481049031">Valvotun käyttäjän tuonti epäonnistui. Tarkista verkkoyhteys ja yritä myöhemmin uudelleen.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> valittua kohdetta</translation>
 <translation id="710227449793100220">Token Binding</translation>
 <translation id="7106346894903675391">Osta lisää tallennustilaa...</translation>
@@ -4188,6 +4204,7 @@
 <translation id="713888829801648570">Salasanaasi ei voi vahvistaa, koska olet offline-tilassa.</translation>
 <translation id="7140928199327930795">Ei muita käytettävissä olevia laitteita.</translation>
 <translation id="7141105143012495934">Sisäänkirjautuminen epäonnistui, koska tilitietojasi ei löytynyt. Ota yhteyttä järjestelmänvalvojaan tai yritä uudelleen.</translation>
+<translation id="7141331524324591758">Tämä merkintä ottaa käyttöön osoitintapahtumien sovellusliittymän kokeellisen ja osittaisen tuen. Tämä toiminto on tarkoitettu vain verkkokehittäjien testikäyttöä varten, ja se estää joitakin verkkosivustoja toimimasta oikein.</translation>
 <translation id="7143207342074048698">Yhdistetään</translation>
 <translation id="7144878232160441200">Yritä uudelleen</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> on poistettu käytöstä. Jos haluat ottaa sen uudelleen käyttöön, avaa <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4835,6 +4852,7 @@
 <translation id="8119572489781388874">Muokkaa asetuksia</translation>
 <translation id="8119631488458759651">poista tämä sivusto</translation>
 <translation id="8121385576314601440">Hangul-syöttöasetukset</translation>
+<translation id="8122245494004914423">Selaustiedot poistetaan pysyvästi tältä laitteelta. Jos haluat palauttaa tiedot myöhemmin, kirjaudu Chromeen käyttäjänä $2.</translation>
 <translation id="8124313775439841391">Hallinnoitu ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Salli virheelliset varmenteet paikallisisännältä ladatuille resursseille.</translation>
@@ -4919,6 +4937,7 @@
 <translation id="8226742006292257240">Alla on tietokoneellesi myönnetty satunnaisesti luotu TPM-salasana.</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Sivustoon <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> hyökännyt taho voi yrittää asentaa tietokoneeseesi vaarallisia ohjelmia, jotka varastavat tai poistavat tietojasi, kuten kuviasi, salasanojasi, viestejäsi ja luottokorttiesi tietoja.</translation>
+<translation id="8233254008506535819">Mahdollista tärkeiden sivustojen lisääminen sallittujen luetteloon selaustietojen tyhjennysikkunassa.</translation>
 <translation id="8236231079192337250">Chrome Web Store Gallery -sovellus tulostinajureille</translation>
 <translation id="8238649969398088015">Ohjevinkki</translation>
 <translation id="8240697550402899963">Käytä perinteistä teemaa</translation>
@@ -5242,7 +5261,6 @@
 <translation id="8708671767545720562">&amp;Lisätietoja</translation>
 <translation id="8711402221661888347">Hamppari</translation>
 <translation id="8711453844311572806">Kun puhelimesi lukitus on avattu ja se on lähellä, aloita käyttö klikkaamalla. Muussa tapauksessa näet lukituskuvakkeen, jolloin sinun on kirjoitettava salasanasi.</translation>
-<translation id="8712637175834984815">Ymmärretty</translation>
 <translation id="8713570323158206935">Lähetä <ph name="BEGIN_LINK1" />järjestelmän tiedot<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Ota käyttöön fyysisen näppäimistön automaattinen oikeinkirjoituksen tarkistus yhdysvaltalaiselle näppäimistölle. Ominaisuus voi tarjota ehdotuksia kirjoittaessasi fyysisellä näppäimistöllä.</translation>
 <translation id="871476437400413057">Googlen tallentamia salasanoja</translation>
@@ -5605,6 +5623,7 @@
 <translation id="952992212772159698">Ei aktivoitu</translation>
 <translation id="953000875543358078">Tämä voi kestää noin minuutin.</translation>
 <translation id="960987915827980018">Noin tunti jäljellä</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{$1 kohde poistetaan pysyvästi tältä laitteelta. Jos haluat palauttaa tiedot myöhemmin, kirjaudu Chromeen käyttäjänä $2.}other{$1 kohdetta poistetaan pysyvästi tältä laitteelta. Jos haluat palauttaa tiedot myöhemmin, kirjaudu Chromeen käyttäjänä $2.}}</translation>
 <translation id="96421021576709873">Wi-Fi-verkko</translation>
 <translation id="965490406356730238">Ota käyttöön laitekiihdytetty mjpeg-tiedoston purkaminen kuvakaapatuille kehyksille aina kun mahdollista.</translation>
 <translation id="968174221497644223">Sovellusvälimuisti</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 0fa65d0..a955d449 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -252,6 +252,7 @@
         Tandaan na io-on ang Bluetooth para sa lahat ng device na compatible sa <ph name="USER_DISPLAY_EMAIL" />, at magpapadala ng ilang impormasyon ng hardware sa Google. &lt;a&gt;Matuto nang higit pa&lt;/a&gt;</translation>
 <translation id="13649080186077898">Pamahalaan ang mga setting ng Autofill</translation>
 <translation id="1367951781824006909">Pumili ng isang file</translation>
+<translation id="136802136832547685">Walang mga pinangangasiwaang user na idaragdag sa device na ito.</translation>
 <translation id="1368265273904755308">Mag-ulat ng isyu</translation>
 <translation id="1368832886055348810">Kaliwa papuntang Kanan</translation>
 <translation id="1370646789215800222">Alisin ang tao?</translation>
@@ -265,6 +266,7 @@
 <translation id="1383876407941801731">Hanapin</translation>
 <translation id="1384211230590313258">Tagapangasiwa sa Pagtuklas ng Serbisyo</translation>
 <translation id="1386387014181100145">Kamusta.</translation>
+<translation id="1386830813511981192">Available na ngayon ang mahigit sa isang milyong app at laro sa iyong <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Maidaragdag lamang ito mula sa <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Buksan bilang Regular na Tab</translation>
 <translation id="1395262318152388157">Slider ng seek bar</translation>
@@ -895,6 +897,7 @@
 <translation id="2280486287150724112">Kanang margin</translation>
 <translation id="2282146716419988068">Proseso ng GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Bagong bersyon ng User Agent Intervention para sa paglo-load ng WebFonts.</translation>
 <translation id="2286454467119466181">Simple</translation>
 <translation id="2286950485307333924">Naka-sign in ka ngayon sa Chrome</translation>
 <translation id="2287590536030307392">I-off ang lahat ng wireless na koneksyon.</translation>
@@ -1072,6 +1075,7 @@
 <translation id="2542049655219295786">Talahanayan ng Google</translation>
 <translation id="2546283357679194313">Cookies at data ng site</translation>
 <translation id="2549646943416322527">Detector ng Seccomp</translation>
+<translation id="2550212893339833758">Na-swap na memory</translation>
 <translation id="2553100941515833716">I-reset ang estado sa pag-install ng App Launcher sa bawat pag-restart.</translation>
 <translation id="2553340429761841190">Hindi nagawang kumonekta ng <ph name="PRODUCT_NAME" /> sa <ph name="NETWORK_ID" />. Mangyaring pumili ng ibang network o subukang muli.</translation>
 <translation id="2553440850688409052">Itago ang Plugin na Ito</translation>
@@ -1105,6 +1109,7 @@
 <translation id="2587203970400270934">Operator code:</translation>
 <translation id="2587922270115112871">Hindi gumagawa ng isang Google Account ang paggawa ng isang pinangangasiwaang user, at hindi susunod sa mga ito ang mga setting
     at data ng mga ito sa iba pang mga device na may Chrome Sync. Nalalapat lang ang isang pinangangasiwaang user sa device na ito.</translation>
+<translation id="2594049137847833442">Mga opsyon sa mahahalagang site sa dialog na i-clear ang data ng pagba-browse</translation>
 <translation id="2594056015203442344">Kapag na-enable, nagiging mga kontrol sa pag-mute ng audio ng tab din ang mga audio indicator sa tab strip.  Nagdaragdag din ito ng mga command sa menu ng konteksto ng tab upang mabilis na mag-mute ng maraming piniling tab.</translation>
 <translation id="259421303766146093">I-demagnify</translation>
 <translation id="2597852038534460976">Hindi ma-access ng Chrome ang mga wallpaper. Mangyaring kumonekta sa isang network.</translation>
@@ -1472,7 +1477,6 @@
 <translation id="3065140616557457172">I-type upang mahanap o ilagay ang isang URL para i-navigate - gumagana naman ang lahat.</translation>
 <translation id="3067198360141518313">Patakbuhin ang plugin na ito</translation>
 <translation id="307519606911195071">I-enable ang mga karagdagang feature ng accessibility sa page ng Mga Setting.</translation>
-<translation id="3075239840551149663">Nagawa na si <ph name="NEW_PROFILE_NAME" /> bilang isang pinangangasiwaang user!</translation>
 <translation id="3075874217500066906">Kailangang mag-restart upang masimulan ang proseso ng Powerwash. Pagkatapos mag-restart, hihilingin sa iyo na kumpirmahing gusto mong magpatuloy.</translation>
 <translation id="3076677906922146425">Hayaan ang sinuman na magdagdag ng tao sa Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1489,6 +1493,7 @@
 <translation id="3088034400796962477">Transliteration (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Palitan ang pangalan...</translation>
 <translation id="308903551226753393">Awtomatikong i-configure</translation>
+<translation id="3089231390674410424">Mukhang may problema sa iyong mga kredensyal. Pakitiyak na naka-sign in ka nang maayos at subukang muli.</translation>
 <translation id="3090819949319990166">Hindi makopya ang external na crx file sa <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">Napares na ang "<ph name="DEVICE_NAME" />"</translation>
 <translation id="3092544800441494315">Isama ang screenshot na ito</translation>
@@ -2017,7 +2022,6 @@
 <translation id="3790856258139356663">Kumokonekta sa server ng pagsubok para sa Chrome Sync.</translation>
 <translation id="3790909017043401679">Ilagay ang PIN ng SIM Card</translation>
 <translation id="3792890930871100565">Idiskonekta ang mga printer</translation>
-<translation id="3795681127952030401">Gusto ng <ph name="URL" /> na magpadala sa iyo ng mga notification.</translation>
 <translation id="3796648294839530037">Mga Paboritong Network:</translation>
 <translation id="3797900183766075808">&amp;Maghanap sa <ph name="SEARCH_ENGINE" /> ng “<ph name="SEARCH_TERMS" />”</translation>
 <translation id="3798449238516105146">Bersyon</translation>
@@ -2491,6 +2495,7 @@
 <translation id="4552678318981539154">Bumili ng higit pang storage</translation>
 <translation id="4554591392113183336">Pareho o mas mababa ang bersyon ng external na extension kumpara sa umiiral nang extension.</translation>
 <translation id="4554796861933393312">Bilis ng Animation ng Ink Drop ng Disenyo ng Materyal</translation>
+<translation id="4555670907822902621">I-enable ang pagse-save ng mga naka-bookmark na page para matingnan offline.</translation>
 <translation id="4555769855065597957">Shadow</translation>
 <translation id="4556110439722119938">Masi-sync ang iyong mga bookmark, history, mga password at iba pang mga setting sa iyong Google Account upang magamit mo ang mga ito sa lahat ng iyong device</translation>
 <translation id="4557136421275541763">Babala:</translation>
@@ -2667,6 +2672,7 @@
 <translation id="4824518112777153488">Suporta para sa mga touchscreen kung saan maaaring mag-hover</translation>
 <translation id="4830573902900904548">Hindi makakonekta sa Internet ang iyong <ph name="DEVICE_TYPE" /> gamit ang <ph name="NETWORK_NAME" />. Mangyaring pumili ng ibang network. <ph name="LEARN_MORE_LINK_START" />Matuto nang higit pa<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Na-verify na ng <ph name="ISSUER" /> ang pagkakakilanlan ng <ph name="ORGANIZATION" /> sa <ph name="LOCALITY" />. Nagbigay ang server ng wastong impormasyon sa Certificate Transparency.</translation>
+<translation id="4832537345877333532">I-disable ang pag-retrieve ng mga display file ng icc mula sa Quirks Server para sa calibration ng kulay ng display.</translation>
 <translation id="4834912470034578916">I-enable ang mga custom na layout para sa Mga Notification sa Web.</translation>
 <translation id="4835836146030131423">Error sa pag-sign in.</translation>
 <translation id="4837926214103741331">Wala kang pahintulot na gamitin ang device na ito. Mangyaring makipag-ugnayan sa may-ari ng device upang makakuha ng pahintulot sa pag-sign in.</translation>
@@ -2854,6 +2860,7 @@
 <translation id="5120421890733714118">Pagkatiwalaan ang certificate na ito para sa pagtukoy ng mga website.</translation>
 <translation id="5121130586824819730">Puno na ang iyong hard disk. Mangyaring i-save sa isa pang lokasyon o magbakante ng espasyo sa hard disk.</translation>
 <translation id="5125751979347152379">Di-wastong URL.</translation>
+<translation id="5126663277159826272">I-disable ang Quirks Client para sa calibration ng display.</translation>
 <translation id="5127881134400491887">Pamahalaan ang mga koneksyon ng network</translation>
 <translation id="5128590998814119508">2D canvas ng listahan ng display</translation>
 <translation id="512903556749061217">naka-attach</translation>
@@ -2995,9 +3002,11 @@
 <translation id="5301751748813680278">Pumapasok bilang Bisita.</translation>
 <translation id="5301954838959518834">OK, nakuha ko na</translation>
 <translation id="5302048478445481009">Wika</translation>
+<translation id="5304039790201806037">Mga Kaganapan ng Pointer</translation>
 <translation id="5305688511332277257">Walang naka-install</translation>
 <translation id="5308380583665731573">Kumonekta</translation>
 <translation id="5311260548612583999">Private key file (opsyonal): </translation>
+<translation id="5313967007315987356">Magdagdag ng site</translation>
 <translation id="5316588172263354223">Paghahanap gamit ang boses kahit kailan</translation>
 <translation id="5316716239522500219">I-mirror ang mga monitor</translation>
 <translation id="5317780077021120954">I-save</translation>
@@ -3300,6 +3309,7 @@
 <translation id="5734362860645681824">Komunikasyon</translation>
 <translation id="573719557377416048">I-clear ang Katayuan ng Copresence</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: piliin upang i-edit</translation>
+<translation id="5741454054957165976">I-enable ang Bagong bersyon ng User Agent Intervention para sa paglo-load ng WebFonts.</translation>
 <translation id="574392208103952083">Katamtaman</translation>
 <translation id="5745056705311424885">Nakita ang USB memory stick</translation>
 <translation id="5746169159649715125">I-save bilang PDF</translation>
@@ -3348,7 +3358,6 @@
 <translation id="5803531701633845775">Pumili ng mga parirala mula sa likod, nang hindi nililipat ang cursor</translation>
 <translation id="5804241973901381774">Mga Pahintulot</translation>
 <translation id="580571955903695899">Muling Ayusin ayon sa Pamagat</translation>
-<translation id="5808982448801399019">Hindi nakagawa ng authorization code</translation>
 <translation id="580961539202306967">Tanungin ako kapag gusto ng isang site na magpadala sa akin ng mga push message (inirerekomenda)</translation>
 <translation id="5815645614496570556">Address na X.400</translation>
 <translation id="5817397429773072584">Traditional Chinese</translation>
@@ -3373,6 +3382,7 @@
 <translation id="5834581999798853053">Mga <ph name="TIME" /> (na) minuto ang natitira</translation>
 <translation id="5838825566232597749">US Workman international</translation>
 <translation id="5839277899276241121">Kapareho ng billing address</translation>
+<translation id="5844550873065695788">Permanente itong magde-delete ng hind bababa sa <ph name="TOTAL_COUNT" /> (na) item sa device na ito. Upang kunin sa ibang pagkakataon ang iyong data, mag-sign in sa chrome bilang $2.</translation>
 <translation id="5846929185714966548">Tab 4</translation>
 <translation id="5848934677402291689">Kasalukuyang isinasagawa ang pagse-save sa PDF</translation>
 <translation id="5849335628409778954">Ilagay ang credit card...</translation>
@@ -3619,6 +3629,7 @@
 <translation id="6232017090690406397">Baterya</translation>
 <translation id="6241530762627360640">Mag-access ng impormasyon tungkol sa mga Bluetooth device na nakapares sa iyong system at tumuklas ng mga kalapit na Bluetooth device.</translation>
 <translation id="6243774244933267674">Hindi available ang server</translation>
+<translation id="6246413617632217567">Hindi ma-import ang pinangangasiwaang user. Pakitingnan ang espasyo sa iyong hard drive at mga pahintulot at subukang muli.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Handa na ang pag-update</translation>
 <translation id="6248400709929739064">I-enable ang mga subtitle</translation>
@@ -3647,6 +3658,7 @@
 <translation id="6277518330158259200">Kumuha ng Screenshot</translation>
 <translation id="6279183038361895380">Pindutin ang |<ph name="ACCELERATOR" />| upang ipakita ang iyong cursor</translation>
 <translation id="6280215091796946657">Mag-sign in gamit ang ibang account</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Mag-eksperimento upang lumabas sa lahat ng API ang layout viewport. Gagawin nitong nauugnay ang mga property ng window.scroll sa layout viewport.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Bagong printer sa iyong network}one{Mga bagong printer sa iyong network}other{Mga bagong printer sa iyong network}}</translation>
 <translation id="6285395082104474418">Ipinapakita sa iyo ng status tray ang kasalukuyang estado ng iyong network, baterya at higit pa.</translation>
@@ -3702,6 +3714,7 @@
 <translation id="6380143666419481200">Tanggapin at magpatuloy</translation>
 <translation id="6380224340023442078">Mga setting ng content</translation>
 <translation id="6383194710567510941">I-enable ang paggamit ng chrome.input.ime API.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Permanente itong magde-delete ng hindi bababa sa $1 item sa device na ito. Upang kunin sa ibang pagkakataon ang iyong data, mag-sign in sa chrome bilang $2.}one{Permanente itong magde-delete ng hindi bababa sa $1 item sa device na ito. Upang kunin sa ibang pagkakataon ang iyong data, mag-sign in sa chrome bilang $2.}other{Permanente itong magde-delete ng hindi bababa sa $1 na item sa device na ito. Upang kunin sa ibang pagkakataon ang iyong data, mag-sign in sa chrome bilang $2.}}</translation>
 <translation id="6384275966486438344">Gawing ito ang iyong mga setting ng paghahanap: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Hindi lalabas sa iyong history ng browser ang mga page na tiningnan mo sa window na ito at hindi mag-iiwan ang mga ito ng iba pang mga palatandaan, tulad ng cookies, sa computer pagkatapos mong isara ang lahat ng nakabukas na mga window ng Bisita. Gayunpaman, papanatilihin ang anumang mga file na na-download mo.</translation>
 <translation id="6391538222494443604">Dapat na umiiral ang direktoryo ng input.</translation>
@@ -3840,6 +3853,7 @@
 <translation id="6575134580692778371">Hindi na-configure</translation>
 <translation id="6575251558004911012">Magtanong kapag nangangailangan ang isang site ng access sa iyong camera (inirerekomenda)</translation>
 <translation id="6579159469348633828">Brotli Content-Encoding.</translation>
+<translation id="6580151766480067746">Bersyon ng ARC</translation>
 <translation id="6581162200855843583">link ng Google Drive</translation>
 <translation id="6583070985841601920">Naka-sign in bilang <ph name="USER_EMAIL_ADDRESS" />. Hindi pinagana ng iyong administrator ang pag-sync.</translation>
 <translation id="65832705307647870">Paunang lagyan ng mga sikat na site ang page ng Bagong Tab.</translation>
@@ -4006,6 +4020,7 @@
 <translation id="6847758263950452722">I-save ang pahina bilang MHTML</translation>
 <translation id="6853388645642883916">Naka-sleep ang updater</translation>
 <translation id="68541483639528434">Isara ang ibang mga tab</translation>
+<translation id="6856701878604560493">I-enable ang mga offline na bookmark</translation>
 <translation id="6860097299815761905">Mga setting ng proxy...</translation>
 <translation id="6860427144121307915">Buksan sa isang Tab</translation>
 <translation id="6862635236584086457">Lahat ng file na na-save sa folder na ito ay awtomatikong na-back up online</translation>
@@ -4180,6 +4195,7 @@
 <translation id="7092106376816104">Mga pagbubukod ng pop-up</translation>
 <translation id="7093866338626856921">Makipagpalit ng data sa mga device na pinangalanang: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Gustong makatuklas ng higit pang mga kahanga-hangang feature?</translation>
+<translation id="7096108453481049031">Hindi ma-import ang pinangangasiwaang user. Pakitingnan ang iyong koneksyon sa network at subukang muli sa ibang pagkakataon.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> (na) item ang pinili</translation>
 <translation id="710227449793100220">Pagba-bind ng Token.</translation>
 <translation id="7106346894903675391">Bumili ng higit pang storage...</translation>
@@ -4208,6 +4224,7 @@
 <translation id="713888829801648570">Paumanhin, hindi ma-verify ang iyong password dahil offline ka.</translation>
 <translation id="7140928199327930795">Walang ibang available na mga device.</translation>
 <translation id="7141105143012495934">Hindi nakapag-sign dahil hindi maibalik ang mga detalye ng iyong account. Mangyaring makipag-ugnayan sa iyong administrator o subukang muli.</translation>
+<translation id="7141331524324591758">Ine-enable ang bahagyang pang-eksperimentong suporta para sa Pointer Events API.  Nilayon lang ito para sa pagsubok ng mga web developer, magdudulot ito sa ilang website na bahagyang masira.</translation>
 <translation id="7143207342074048698">Kumokonekta</translation>
 <translation id="7144878232160441200">Subukang muli</translation>
 <translation id="7148311641502571842">Hindi na pinapagana ang <ph name="PLUGIN_NAME" />. Upang muli itong paganahin, mangyaring pumunta sa <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4856,6 +4873,7 @@
 <translation id="8119572489781388874">Baguhin ang mga setting</translation>
 <translation id="8119631488458759651">alisin ang site na ito</translation>
 <translation id="8121385576314601440">Mga setting ng pag-input na Hangul</translation>
+<translation id="8122245494004914423">Permanente nitong ide-delete sa device na ito ang data ng iyong pagba-browse. Upang kunin sa ibang pagkakataon ang iyong data, mag-sign in sa chrome bilang $2.</translation>
 <translation id="8124313775439841391">Pinamamahalaang ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Payagan ang mga di-wastong certificate para sa mga mapagkukunang nilo-load mula sa localhost.</translation>
@@ -4941,6 +4959,7 @@
 <translation id="8226742006292257240">Sa ibaba ay ang random na binubuong TPM password na itinalaga sa iyong computer:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Maaaring subukan ng mga attacker na kasalukuyang nasa <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> na mag-install ng mga mapanganib na program sa iyong computer na nagnanakaw o nagde-delete ng iyong impormasyon (halimbawa, mga larawan, password, mensahe at credit card).</translation>
+<translation id="8233254008506535819">Isama ang opsyong mag-whitelist ng mga mahalagang site sa dialog ng i-clear ang data ng pagba-browse.</translation>
 <translation id="8236231079192337250">Chrome Web Store Gallery app para sa mga driver ng printer</translation>
 <translation id="8238649969398088015">Tip sa pagtulong</translation>
 <translation id="8240697550402899963">Gamitin ang tema na Classic</translation>
@@ -5267,7 +5286,6 @@
 <translation id="8708671767545720562">&amp;Higit Pang Impormasyon</translation>
 <translation id="8711402221661888347">Burger</translation>
 <translation id="8711453844311572806">Kapag naka-unlock ang iyong telepono at nasa malapit ito, mag-click lang upang makapasok. Kung hindi, makakakita ka ng icon na naka-lock at kakailanganin mong i-type ang iyong password.</translation>
-<translation id="8712637175834984815">Nakuha ko</translation>
 <translation id="8713570323158206935">Ipadala ang <ph name="BEGIN_LINK1" />impormasyon ng system<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">I-enable ang autocorrect ng pisikal na keyboard para sa US keyboard, na makapagbibigay ng mga suhestyon habang nagta-type sa pisikal na keyboard.</translation>
 <translation id="871476437400413057">Mga password na naka-save sa Google</translation>
@@ -5633,6 +5651,7 @@
 <translation id="952992212772159698">Hindi na-activate</translation>
 <translation id="953000875543358078">Maaari itong abutin nang isang minuto o higit pa</translation>
 <translation id="960987915827980018">Mga 1 oras ang natitira</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Permanente itong magde-delete ng $1 item sa device na ito. Upang kunin sa ibang pagkakataon ang iyong data, mag-sign in sa chrome bilang $2.}one{Permanente itong magde-delete ng $1 item sa device na ito. Upang kunin sa ibang pagkakataon ang iyong data, mag-sign in sa chrome bilang $2.}other{Permanente itong magde-delete ng $1 na item sa device na ito. Upang kunin sa ibang pagkakataon ang iyong data, mag-sign in sa chrome bilang $2.}}</translation>
 <translation id="96421021576709873">Wi-Fi network</translation>
 <translation id="965490406356730238">I-enable ang mjpeg decode na pinabilis ng hardware para sa na-capture na frame kapag available.</translation>
 <translation id="968174221497644223">Cache ng application</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 1c55fe5..4915613 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -142,7 +142,7 @@
 <translation id="1196789802623400962">Activer ou désactiver l'option de modification de geste sur la page des paramètres du clavier virtuel</translation>
 <translation id="1196849605089373692">Spécifie le paramètre de qualité pour les images capturées en cas de réduction du dimensionnement de celles-ci.</translation>
 <translation id="1197199342062592414">Commençons !</translation>
-<translation id="119738088725604856">Fenêtre de la capture d'écran</translation>
+<translation id="119738088725604856">Capture d'écran de la fenêtre</translation>
 <translation id="1197979282329025000">Une erreur s'est produite lors de la récupération des fonctions de l'imprimante <ph name="PRINTER_NAME" />. Cette imprimante n'a pas pu être enregistrée dans <ph name="CLOUD_PRINT_NAME" />.</translation>
 <translation id="1198271701881992799">Mise en route</translation>
 <translation id="1199232041627643649">Maintenez la touche <ph name="KEY_EQUIVALENT" /> enfoncée pour quitter.</translation>
@@ -251,6 +251,7 @@
       Le Bluetooth sera activé pour tous les appareils compatibles appartenant à <ph name="USER_DISPLAY_EMAIL" /> et certaines informations relatives au matériel seront envoyées à Google. &lt;a&gt;En savoir plus&lt;/a&gt;</translation>
 <translation id="13649080186077898">Gérer les paramètres de saisie automatique</translation>
 <translation id="1367951781824006909">Choisir un fichier</translation>
+<translation id="136802136832547685">Aucun utilisateur supervisé à ajouter à cet appareil.</translation>
 <translation id="1368265273904755308">Signaler un problème</translation>
 <translation id="1368832886055348810">De gauche à droite</translation>
 <translation id="1370646789215800222">Supprimer le profil utilisateur ?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Rechercher</translation>
 <translation id="1384211230590313258">Gestion des recherches de services</translation>
 <translation id="1386387014181100145">Bonjour</translation>
+<translation id="1386830813511981192">Plus d'un million d'applications et de jeux à présent disponibles sur votre <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Cet élément doit être installé depuis le <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Ouvrir dans un onglet standard</translation>
 <translation id="1395262318152388157">Barre de recherche</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">Marge droite</translation>
 <translation id="2282146716419988068">GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Nouvelle version de l'intervention du user-agent pour le chargement des polices Web.</translation>
 <translation id="2286454467119466181">Simple</translation>
 <translation id="2286950485307333924">Vous êtes connecté à Chrome</translation>
 <translation id="2287590536030307392">Cette option désactive toutes les connexions sans fil.</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">Tableau Google</translation>
 <translation id="2546283357679194313">Cookies et données de site</translation>
 <translation id="2549646943416322527">Détection seccomp</translation>
+<translation id="2550212893339833758">Espace mémoire d'échange</translation>
 <translation id="2553100941515833716">Réinitialiser l'état d'installation du lanceur d'applications à chaque redémarrage</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> n'est pas parvenu à se connecter à <ph name="NETWORK_ID" />. Sélectionnez un autre réseau ou réessayez.</translation>
 <translation id="2553440850688409052">Masquer ce plug-in</translation>
@@ -1102,6 +1106,7 @@
 <translation id="2587203970400270934">Code opérateur :</translation>
 <translation id="2587922270115112871">La création d'un utilisateur supervisé n'entraîne pas la création d'un compte Google, et ses paramètres
     et ses données ne seront pas copiés sur ses autres appareils avec la synchronisation Google Chrome. La création d'un utilisateur supervisé ne s'applique qu'à cet appareil.</translation>
+<translation id="2594049137847833442">Options pour les sites importants dans la boîte de dialogue "Effacer les données de navigation"</translation>
 <translation id="2594056015203442344">Lorsqu'ils sont activés, les indicateurs audio de la barre d'onglets servent à réactiver le son des onglets. Des commandes sont également ajoutées dans le menu contextuel d'onglet pour couper le son de plusieurs onglets sélectionnés rapidement.</translation>
 <translation id="259421303766146093">Réduire</translation>
 <translation id="2597852038534460976">Chrome ne peut pas accéder aux fonds d'écran. Veuillez vous connecter à un réseau.</translation>
@@ -1469,7 +1474,6 @@
 <translation id="3065140616557457172">Tapez votre requête ou saisissez une URL pour commencer la navigation : c'est à vous de choisir.</translation>
 <translation id="3067198360141518313">Exécuter ce plug-in</translation>
 <translation id="307519606911195071">Permet d'activer des fonctionnalités d'accessibilité supplémentaires sur la page des paramètres.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> a bien été créé en tant qu'utilisateur supervisé</translation>
 <translation id="3075874217500066906">Un redémarrage est nécessaire pour commencer le processus Powerwash. Après le redémarrage, vous serez invité à confirmer que vous souhaitez poursuivre.</translation>
 <translation id="3076677906922146425">Autoriser tous les utilisateurs à ajouter une personne dans Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1486,6 +1490,7 @@
 <translation id="3088034400796962477">Translittération (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Renommer...</translation>
 <translation id="308903551226753393">Configurer automatiquement</translation>
+<translation id="3089231390674410424">Il semble qu'il y ait un problème avec vos identifiants. Veuillez vous assurer que vous êtes correctement connecté, puis réessayer.</translation>
 <translation id="3090819949319990166">Impossible de copier le fichier crx externe dans <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" associé.</translation>
 <translation id="3092544800441494315">Inclure cette capture d'écran :</translation>
@@ -2013,7 +2018,6 @@
 <translation id="3790856258139356663">Se connecte au serveur de test pour la synchronisation Chrome.</translation>
 <translation id="3790909017043401679">Saisir le code PIN de la carte SIM</translation>
 <translation id="3792890930871100565">Déconnecter des imprimantes</translation>
-<translation id="3795681127952030401">"<ph name="URL" />" requiert l'envoi de notifications.</translation>
 <translation id="3796648294839530037">Réseaux favoris :</translation>
 <translation id="3797900183766075808">&amp;Rechercher "<ph name="SEARCH_TERMS" />" avec <ph name="SEARCH_ENGINE" /></translation>
 <translation id="3798449238516105146">Version</translation>
@@ -2487,6 +2491,7 @@
 <translation id="4552678318981539154">Acheter de l'espace de stockage supplémentaire</translation>
 <translation id="4554591392113183336">La version d'extension externe est identique ou antérieure à la version existante.</translation>
 <translation id="4554796861933393312">Vitesse de l'animation de la goutte d'encre Material Design</translation>
+<translation id="4555670907822902621">Activer l'enregistrement des pages ajoutées aux favoris pour une consultation hors connexion.</translation>
 <translation id="4555769855065597957">Duplicata</translation>
 <translation id="4556110439722119938">Vos favoris, votre historique, vos mots de passe et d'autres paramètres seront synchronisés avec votre compte Google, afin que vous puissiez les utiliser sur tous vos appareils.</translation>
 <translation id="4557136421275541763">Avertissement :</translation>
@@ -2662,6 +2667,7 @@
 <translation id="4824518112777153488">Compatibilité avec les écrans tactiles permettant le survol</translation>
 <translation id="4830573902900904548">Votre <ph name="DEVICE_TYPE" /> ne parvient pas à se connecter à Internet via le réseau <ph name="NETWORK_NAME" />. Veuillez sélectionner un autre réseau. <ph name="LEARN_MORE_LINK_START" />En savoir plus<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">L'identité de l'organisation <ph name="ORGANIZATION" />, située à <ph name="LOCALITY" />, a été validée par <ph name="ISSUER" />. Des informations valides relatives à la transparence des certificats ont été fournies par le serveur.</translation>
+<translation id="4832537345877333532">Désactiver la récupération des fichiers d'affichage icc issus de Quirks Server pour l'étalonnage des couleurs de l'écran.</translation>
 <translation id="4834912470034578916">Activer les mises en page personnalisées pour les notifications Web</translation>
 <translation id="4835836146030131423">Erreur lors de la connexion</translation>
 <translation id="4837926214103741331">Vous n'êtes pas autorisé à utiliser cet appareil. Pour obtenir l'autorisation de vous y connecter, veuillez contacter son propriétaire.</translation>
@@ -2849,6 +2855,7 @@
 <translation id="5120421890733714118">Considérer ce certificat comme fiable pour identifier les sites Web</translation>
 <translation id="5121130586824819730">Votre disque dur est saturé. Veuillez enregistrer à un autre emplacement ou libérer de l'espace sur le disque dur.</translation>
 <translation id="5125751979347152379">URL incorrecte</translation>
+<translation id="5126663277159826272">Désactiver Quirks Client pour l'étalonnage de l'écran.</translation>
 <translation id="5127881134400491887">Gérer les connexions réseau</translation>
 <translation id="5128590998814119508">Canvas 2D de liste d'affichage</translation>
 <translation id="512903556749061217">connecté</translation>
@@ -2990,9 +2997,11 @@
 <translation id="5301751748813680278">Entrée en tant qu'invité.</translation>
 <translation id="5301954838959518834">OK</translation>
 <translation id="5302048478445481009">Langue</translation>
+<translation id="5304039790201806037">Événements du curseur</translation>
 <translation id="5305688511332277257">Aucun certificat installé</translation>
 <translation id="5308380583665731573">Connexion</translation>
 <translation id="5311260548612583999">Fichier de clé privée (facultatif) :</translation>
+<translation id="5313967007315987356">Ajouter un site</translation>
 <translation id="5316588172263354223">Effectuer une recherche vocale à tout moment</translation>
 <translation id="5316716239522500219">Mettre en miroir les moniteurs</translation>
 <translation id="5317780077021120954">Enregistrer</translation>
@@ -3296,6 +3305,7 @@
 <translation id="5734362860645681824">Communications</translation>
 <translation id="573719557377416048">Effacer l'état de présence simultanée</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" /> : sélectionner pour modifier</translation>
+<translation id="5741454054957165976">Activer la nouvelle version de l'intervention du user-agent pour le chargement des polices Web.</translation>
 <translation id="574392208103952083">Moyenne</translation>
 <translation id="5745056705311424885">Mémoire USB détectée</translation>
 <translation id="5746169159649715125">Enregistrer au format PDF</translation>
@@ -3344,7 +3354,6 @@
 <translation id="5803531701633845775">Choisir les expressions en arrière-plan, sans déplacer le pointeur</translation>
 <translation id="5804241973901381774">Autorisations</translation>
 <translation id="580571955903695899">Trier par nom</translation>
-<translation id="5808982448801399019">Échec de l'autorisation</translation>
 <translation id="580961539202306967">Me demander lorsqu'un site requiert l'envoi de messages Push (recommandé)</translation>
 <translation id="5815645614496570556">Adresse X.400</translation>
 <translation id="5817397429773072584">Chinois traditionnel</translation>
@@ -3369,6 +3378,7 @@
 <translation id="5834581999798853053">Environ <ph name="TIME" /> minutes restantes</translation>
 <translation id="5838825566232597749">Clavier Workman international américain</translation>
 <translation id="5839277899276241121">Identique à l'adresse de facturation</translation>
+<translation id="5844550873065695788">Cette action aura pour effet de supprimer définitivement au moins <ph name="TOTAL_COUNT" /> éléments de cet appareil. Pour récupérer vos données plus tard, connectez-vous à Chrome en tant que $2.</translation>
 <translation id="5846929185714966548">Tab 4</translation>
 <translation id="5848934677402291689">Enregistrement au format PDF en cours…</translation>
 <translation id="5849335628409778954">Saisir les informations de la carte de paiement…</translation>
@@ -3615,6 +3625,7 @@
 <translation id="6232017090690406397">Batterie</translation>
 <translation id="6241530762627360640">Accéder aux informations relatives aux appareils Bluetooth associés à votre système et détecter les appareils Bluetooth à proximité</translation>
 <translation id="6243774244933267674">Serveur indisponible.</translation>
+<translation id="6246413617632217567">Impossible d'importer l'utilisateur supervisé. Veuillez vérifier l'espace disponible sur votre disque dur et vos autorisations, puis réessayer.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" /> %</translation>
 <translation id="624789221780392884">Mise à jour prête</translation>
 <translation id="6248400709929739064">Activer les sous-titres</translation>
@@ -3643,6 +3654,7 @@
 <translation id="6277518330158259200">F&amp;aire une capture d'écran</translation>
 <translation id="6279183038361895380">Appuyez sur |<ph name="ACCELERATOR" />| pour afficher le curseur.</translation>
 <translation id="6280215091796946657">Se connecter avec un autre compte</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Faites en sorte que toutes les API représentent la fenêtre d'affichage de mise en page. De ce fait, les propriétés "window.scroll" seront définies par rapport à la fenêtre d'affichage de mise en page.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nouvelle imprimante sur le réseau}one{Nouvelle imprimante sur le réseau}other{Nouvelles imprimantes sur le réseau}}</translation>
 <translation id="6285395082104474418">La barre d'état vous indique, entre autres, l'état actuel de votre réseau et de votre batterie.</translation>
@@ -3698,6 +3710,7 @@
 <translation id="6380143666419481200">Accepter et continuer</translation>
 <translation id="6380224340023442078">Paramètres de contenu...</translation>
 <translation id="6383194710567510941">Activer l'utilisation de l'API chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Cette action aura pour effet de supprimer définitivement au moins $1 élément de cet appareil. Pour récupérer vos données plus tard, connectez-vous à Chrome en tant que $2.}one{Cette action aura pour effet de supprimer définitivement au moins $1 élément de cet appareil. Pour récupérer vos données plus tard, connectez-vous à Chrome en tant que $2.}other{Cette action aura pour effet de supprimer définitivement au moins $1 éléments de cet appareil. Pour récupérer vos données plus tard, connectez-vous à Chrome en tant que $2.}}</translation>
 <translation id="6384275966486438344">Modifier les paramètres de la recherche pour utiliser l'adresse <ph name="SEARCH_HOST" />.</translation>
 <translation id="6390799748543157332">Les pages que vous consultez dans cette fenêtre ne sont pas consignées dans l'historique du navigateur et ne laissent aucune autre trace sur votre ordinateur (des cookies, par exemple), une fois que vous avez fermé toutes les fenêtres Invité ouvertes. Tous les fichiers téléchargés sont toutefois conservés.</translation>
 <translation id="6391538222494443604">Le répertoire d'extensions est obligatoire.</translation>
@@ -3836,6 +3849,7 @@
 <translation id="6575134580692778371">Non configuré</translation>
 <translation id="6575251558004911012">Me demander lorsqu'un site demande l'accès à ma caméra (recommandé)</translation>
 <translation id="6579159469348633828">Encodage de contenu Brotli</translation>
+<translation id="6580151766480067746">Version d'ARC</translation>
 <translation id="6581162200855843583">Lien Google Drive</translation>
 <translation id="6583070985841601920">Connecté avec l'adresse <ph name="USER_EMAIL_ADDRESS" />. Votre administrateur a désactivé la synchronisation.</translation>
 <translation id="65832705307647870">Préremplit la page Nouvel onglet avec des sites populaires.</translation>
@@ -4001,6 +4015,7 @@
 <translation id="6847758263950452722">Enregistrer la page au format MHTML</translation>
 <translation id="6853388645642883916">Processus de mise à jour en veille</translation>
 <translation id="68541483639528434">Fermer les autres onglets</translation>
+<translation id="6856701878604560493">Activer les favoris hors connexion</translation>
 <translation id="6860097299815761905">Paramètres du proxy...</translation>
 <translation id="6860427144121307915">Ouvrir dans un onglet</translation>
 <translation id="6862635236584086457">Tous les fichiers enregistrés dans ce dossier sont automatiquement sauvegardés en ligne.</translation>
@@ -4172,6 +4187,7 @@
 <translation id="7092106376816104">Exceptions liées aux fenêtres pop-up</translation>
 <translation id="7093866338626856921">Échanger des données avec les appareils suivants : "<ph name="HOSTNAMES" />"</translation>
 <translation id="7096082900368329802">Vous avez envie de découvrir d'autres fonctionnalités impressionnantes ?</translation>
+<translation id="7096108453481049031">Impossible d'importer l'utilisateur supervisé. Veuillez vérifier votre connexion réseau, puis réessayer plus tard.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> éléments sélectionnés</translation>
 <translation id="710227449793100220">Token Binding</translation>
 <translation id="7106346894903675391">Acheter de l'espace de stockage supplémentaire…</translation>
@@ -4200,6 +4216,7 @@
 <translation id="713888829801648570">Votre mot de passe n'a pas pu être vérifié, car votre appareil est hors connexion.</translation>
 <translation id="7140928199327930795">Aucun autre périphérique disponible</translation>
 <translation id="7141105143012495934">Échec de la connexion, car il est impossible de récupérer les informations relatives à votre compte. Veuillez contacter votre administrateur ou réessayer.</translation>
+<translation id="7141331524324591758">Permet une compatibilité expérimentale partielle avec l'API Pointer Events. Cette option est réservée aux tests par les développeurs Web. Elle entraînera des erreurs peu visibles sur certains sites Web.</translation>
 <translation id="7143207342074048698">Connexion en cours</translation>
 <translation id="7144878232160441200">Réessayer</translation>
 <translation id="7148311641502571842">Le plug-in <ph name="PLUGIN_NAME" /> a été désactivé. Pour le réactiver, veuillez accéder à <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4848,6 +4865,7 @@
 <translation id="8119572489781388874">Modifier les paramètres</translation>
 <translation id="8119631488458759651">supprimer ce site</translation>
 <translation id="8121385576314601440">Paramètres de saisie hangûl</translation>
+<translation id="8122245494004914423">Cette action aura pour effet de supprimer définitivement vos données de navigation de cet appareil. Pour récupérer vos données plus tard, connectez-vous à Chrome en tant que $2.</translation>
 <translation id="8124313775439841391">ONC géré</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Autoriser les certificats non valides pour les ressources chargées à partir de l'hôte local</translation>
@@ -4933,6 +4951,7 @@
 <translation id="8226742006292257240">Le mot de passe TPM ci-dessous, généré de façon aléatoire, a été attribué à votre ordinateur :</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Les individus malveillants actuellement à l'œuvre sur le site <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> pourraient tenter d'installer des programmes dangereux sur votre ordinateur, de manière à récupérer vos informations (par exemple des photos, des mots de passe, des messages et des numéros de carte de paiement) sans votre autorisation, ou à les supprimer.</translation>
+<translation id="8233254008506535819">Inclure l'option permettant d'ajouter des sites importants à la liste blanche dans la boîte de dialogue "Effacer les données de navigation"</translation>
 <translation id="8236231079192337250">Application Chrome Web Store Gallery pour les pilotes d'imprimante</translation>
 <translation id="8238649969398088015">Astuce</translation>
 <translation id="8240697550402899963">Utiliser le thème classique</translation>
@@ -5256,7 +5275,6 @@
 <translation id="8708671767545720562">Plus d'informations</translation>
 <translation id="8711402221661888347">Hamburger</translation>
 <translation id="8711453844311572806">Lorsque votre téléphone est déverrouillé et situé à proximité, un clic suffit pour accéder à l'appareil. Dans le cas contraire, une icône de verrouillage est affichée et vous devez saisir le mot de passe.</translation>
-<translation id="8712637175834984815">OK</translation>
 <translation id="8713570323158206935">Envoyer des <ph name="BEGIN_LINK1" />informations système<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Activez la correction automatique du clavier physique, qui offre des suggestions pendant la saisie, pour le clavier américain.</translation>
 <translation id="871476437400413057">Mots de passe Google enregistrés</translation>
@@ -5620,6 +5638,7 @@
 <translation id="952992212772159698">Désactivé</translation>
 <translation id="953000875543358078">Cette opération peut prendre environ une minute.</translation>
 <translation id="960987915827980018">Environ 1 heure restante</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Cette action aura pour effet de supprimer définitivement $1 élément de cet appareil. Pour récupérer vos données plus tard, connectez-vous à Chrome en tant que $2.}one{Cette action aura pour effet de supprimer définitivement $1 élément de cet appareil. Pour récupérer vos données plus tard, connectez-vous à Chrome en tant que $2.}other{Cette action aura pour effet de supprimer définitivement $1 éléments de cet appareil. Pour récupérer vos données plus tard, connectez-vous à Chrome en tant que $2.}}</translation>
 <translation id="96421021576709873">Réseau Wi-Fi</translation>
 <translation id="965490406356730238">Activer le décodage MJPEG avec accélération matérielle pour l'image capturée, si disponible</translation>
 <translation id="968174221497644223">Cache de l'application</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 97d8b32..c277982 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -251,6 +251,7 @@
       નોંધો કે બ્લુટૂથ, <ph name="USER_DISPLAY_EMAIL" /> ના બધા સંગત ઉપકરણો માટે ચાલુ રહેશે અને કેટલીક હાર્ડવેર માહિતી Google ને મોકલવામાં આવશે. &lt;a&gt;વધુ જાણો&lt;/a&gt;</translation>
 <translation id="13649080186077898">સ્વતઃભરો સેટિંગ્સ મેનેજ કરો</translation>
 <translation id="1367951781824006909">એક ફાઇલ પસંદ કરો</translation>
+<translation id="136802136832547685">આ ઉપકરણ પર ઉમેરવા માટે કોઇ નિરીક્ષિત વપરાશકર્તાઓ નથી.</translation>
 <translation id="1368265273904755308">સમસ્યાની જાણ કરો</translation>
 <translation id="1368832886055348810">ડાબેથી જમણે</translation>
 <translation id="1370646789215800222">વ્યક્તિને દૂર કરીએ?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">શોધો</translation>
 <translation id="1384211230590313258">સેવા શોધ હેન્ડલર</translation>
 <translation id="1386387014181100145">હેલો.</translation>
+<translation id="1386830813511981192">તમારા <ph name="DEVICE_TYPE" /> પર હવે એક લાખથી વધુ ઍપ્લિકેશનો અને રમતો ઉપલબ્ધ છે.</translation>
 <translation id="1389297115360905376">આ ફક્ત <ph name="CHROME_WEB_STORE" /> થી જ ઉમેરી શકાશે.</translation>
 <translation id="1390548061267426325">નિયમિત ટૅબ તરીકે ખોલો</translation>
 <translation id="1395262318152388157">સ્લાઇડર શોધો</translation>
@@ -889,6 +891,7 @@
 <translation id="2280486287150724112">જમણો હાસિયો</translation>
 <translation id="2282146716419988068">GPU પ્રક્રિયા</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">WebFonts લોડિંગ માટે વપરાશકર્તા એજન્ટ હસ્તક્ષેપનું નવું સંસ્કરણ.</translation>
 <translation id="2286454467119466181">સરળ</translation>
 <translation id="2286950485307333924">તમે હમણાં Chrome માં સાઇન ઇન કર્યું છે</translation>
 <translation id="2287590536030307392">બધા વાયરલેસ કનેક્શંસને બંધ કરો.</translation>
@@ -1066,6 +1069,7 @@
 <translation id="2542049655219295786">Google કોષ્ટક</translation>
 <translation id="2546283357679194313">કૂકીઝ અને સાઇટ ડેટા</translation>
 <translation id="2549646943416322527">Seccomp શોધકર્તા</translation>
+<translation id="2550212893339833758">સ્વૅપ કરેલ મેમરી</translation>
 <translation id="2553100941515833716">દરેક પુનઃપ્રારંભ પર એપ લૉન્ચર ઇન્સ્ટોલ સ્થિતિને ફરીથી સેટ કરો.</translation>
 <translation id="2553340429761841190"><ph name="NETWORK_ID" /> ને કનેક્ટ કરવામાં <ph name="PRODUCT_NAME" /> અક્ષમ હતું. કૃપા કરીને બીજું નેટવર્ક પસંદ કરો અથવા ફરી પ્રયાસ કરો.</translation>
 <translation id="2553440850688409052">આ પ્લગિન છુપાવો </translation>
@@ -1099,6 +1103,7 @@
 <translation id="2587203970400270934">ઑપરેટર કોડ:</translation>
 <translation id="2587922270115112871">નિરીક્ષણ કરેલ વપરાશકર્તા બનાવવાથી Google એકાઉન્ટ બનતું નથી અને તેની સેટિંગ્સ 
     અને ડેટા Chrome સમન્વયન સાથેના અન્ય ઉપકરણો પર તેમને અનુસરશે નહીં. હાલમાં, નિરીક્ષણ કરેલ વપરાશકર્તા માત્ર આ ઉપકરણ પર જ લાગુ થાય છે.</translation>
+<translation id="2594049137847833442">બ્રાઉઝિંગ ડેટા સાફ કરો સંવાદમાં મહત્વના સાઇટ્સ વિકલ્પો</translation>
 <translation id="2594056015203442344">સક્ષમ કરેલ હોય, ત્યારે ટૅબ સ્ટ્રિપમાં ઑડિઓ સંકેતો ટૅબ ઑડિઓ મ્યૂટ નિયંત્રણો તરીકે બમણા થઈ જાય છે. આ બહુવિધ પસંદ કરેલ ટૅબ્સને ઝડપથી મ્યૂટ કરવા માટે ટૅબ સંદર્ભ મેનૂમાં આદેશોને પણ ઉમેરે છે.</translation>
 <translation id="259421303766146093">ડીમૅગ્નિફાઇ</translation>
 <translation id="2597852038534460976">Chrome વૉલપેપર્સની ઍક્સેસ કરી શકતું નથી. નેટવર્ક સાથે કનેક્ટ કરો.</translation>
@@ -1466,7 +1471,6 @@
 <translation id="3065140616557457172">શોધવા માટે ટાઇપ કરો અથવા નેવિગેટ કરવા માટે એક URL દાખલ કરો – દરેક વસ્તુ કાર્ય કરે છે.</translation>
 <translation id="3067198360141518313">આ પ્લગિન ચલાવો</translation>
 <translation id="307519606911195071">સેટિંગ્સ પૃષ્ઠમાં અતિરિક્ત અ‍ૅક્સેસિબિલિટી સુવિધાઓને સક્ષમ કરો.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> ને નિરીક્ષણ કરેલ વપરાશકર્તા તરીકે બનાવવામાં આવ્યું છે!</translation>
 <translation id="3075874217500066906">Powerwash પ્રક્રિયા શરૂ કરવા માટે પુનઃપ્રારંભ જરૂરી છે. પુનઃપ્રારંભ પછી તમે આગળ વધવા માંગો છો કે કેમ તે તમને પૂછવામાં આવશે.</translation>
 <translation id="3076677906922146425">કોઇને પણ Chrome માં કોઇ વ્યક્તિ ઉમેરવા દો</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1483,6 +1487,7 @@
 <translation id="3088034400796962477">લિવ્યંતરણ (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;નામ બદલો...</translation>
 <translation id="308903551226753393">આપમેળે ગોઠવો</translation>
+<translation id="3089231390674410424">તમારા ઓળખપત્રમાં સમસ્યા હોય એવું લાગે છે. કૃપા કરીને ખાતરી કરો કે તમે ઠીકથી સાઇન ઇન થયાં છો અને ફરી પ્રયાસ કરો.</translation>
 <translation id="3090819949319990166">બાહ્ય crx ફાઇલને <ph name="TEMP_CRX_FILE" /> પર કૉપિ કરી શકતાં નથી.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />"થી જોડી બનાવી</translation>
 <translation id="3092544800441494315">આ સ્ક્રીનશોટ શામેલ કરો:</translation>
@@ -2010,7 +2015,6 @@
 <translation id="3790856258139356663">Chrome સમન્વયન માટે પરીક્ષણ સર્વરથી કનેક્ટ કરે છે.</translation>
 <translation id="3790909017043401679">SIM કાર્ડ PIN દાખલ કરો</translation>
 <translation id="3792890930871100565">પ્રિંટર્સ ડિસ્કનેક્ટ કરો</translation>
-<translation id="3795681127952030401"><ph name="URL" />, તમને સૂચનાઓ મોકલવા માગે છે.</translation>
 <translation id="3796648294839530037">મનપસંદ નેટવર્ક્સ:</translation>
 <translation id="3797900183766075808">“<ph name="SEARCH_TERMS" />” માટે <ph name="SEARCH_ENGINE" /> માં &amp;શોધ કરો</translation>
 <translation id="3798449238516105146">સંસ્કરણ</translation>
@@ -2484,6 +2488,7 @@
 <translation id="4552678318981539154">વધુ સ્ટોરેજ ખરીદો</translation>
 <translation id="4554591392113183336">બાહ્ય એક્સટેન્શન હાલના એક્સટેન્શનની સરખામણીએ સમાન અથવા નીચલા સંસ્કરણ પર છે.</translation>
 <translation id="4554796861933393312">સામગ્રી ડિઝાઇન ઇન્ક ડ્રોપ એનિમેશન ઝડપ</translation>
+<translation id="4555670907822902621">ઑફલાઇન જોવા માટે બુકમાર્ક કરેલા પૃષ્ઠો સાચવવાનું સક્ષમ કરો.</translation>
 <translation id="4555769855065597957">શેડો</translation>
 <translation id="4556110439722119938">તમારા Google એકાઉન્ટ પર તમારા બુકમાર્ક્સ, ઇતિહાસ, પાસવર્ડ્સ અને અન્ય સેટિંગ્સ સમન્વયિત કરવામાં આવશે જેથી કરીને તમે તમારા બધા ઉપકરણો પર તેમનો ઉપયોગ કરી શકો.</translation>
 <translation id="4557136421275541763">ચેતવણી:</translation>
@@ -2659,6 +2664,7 @@
 <translation id="4824518112777153488">હોવર સમર્થ ટચસ્ક્રીન્સ માટે સમર્થન</translation>
 <translation id="4830573902900904548"><ph name="NETWORK_NAME" /> નો ઉપયોગ કરીને ઇન્ટરનેટથી કનેક્ટ થવામાં તમારી <ph name="DEVICE_TYPE" /> અસમર્થ છે. કૃપા કરીને બીજું નેટવર્ક પસંદ કરો. <ph name="LEARN_MORE_LINK_START" />વધુ જાણો<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572"><ph name="ISSUER" /> દ્વારા <ph name="LOCALITY" /> ખાતે <ph name="ORGANIZATION" /> ની ઓળખ ચકાસવામાં આવી છે. સર્વર દ્વારા માન્ય પ્રમાણપત્ર પારદર્શિતા માહિતી પૂરી પાડવામાં આવી હતી.</translation>
+<translation id="4832537345877333532">પ્રદર્શન રંગ કૅલિબ્રેશન માટે Quirks સર્વરથી icc પ્રદર્શન ફાઇલોની પુનઃપ્રાપ્તિને અક્ષમ કરો.</translation>
 <translation id="4834912470034578916">વેબ સૂચનાઓ માટે કસ્ટમ લેઆઉટને સક્ષમ કરો.</translation>
 <translation id="4835836146030131423">સાઇનિંગ ઇન કરવામાં ભૂલ.</translation>
 <translation id="4837926214103741331">તમે આ ઉપકરણ વાપરવા માટે અધિકૃત નથી. કૃપા કરીને સાઇન ઇન કરવાની પરવાનગી માટે ઉપકરણના માલિકનો સંપર્ક કરો.</translation>
@@ -2846,6 +2852,7 @@
 <translation id="5120421890733714118">વેબસાઇટ્સ ઓળખવા માટે આ પ્રમાણપત્ર પર વિશ્વાસ કરો.</translation>
 <translation id="5121130586824819730">તમારી હાર્ડ ડિસ્ક પૂર્ણ ભરેલી છે. કૃપા કરીને અન્ય સ્થાન પર સાચવો અથવા હાર્ડ ડિસ્ક પર વધુ જગ્યા કરો.</translation>
 <translation id="5125751979347152379">અમાન્ય URL.</translation>
+<translation id="5126663277159826272">પ્રદર્શન કૅલિબ્રેશન માટે Quirks ક્લાઇન્ટને અક્ષમ કરો.</translation>
 <translation id="5127881134400491887">નેટવર્ક કનેક્શન્સનું સંચાલન કરો</translation>
 <translation id="5128590998814119508">પ્રદર્શન સૂચિ 2D કૅન્વાસ</translation>
 <translation id="512903556749061217">જોડાયેલું</translation>
@@ -2985,9 +2992,11 @@
 <translation id="5301751748813680278">અતિથિ તરીકે દાખલ થઈ રહ્યું છે.</translation>
 <translation id="5301954838959518834">બરાબર, સમજાઇ ગયું</translation>
 <translation id="5302048478445481009">ભાષા</translation>
+<translation id="5304039790201806037">પૉઇન્ટર ઇવેન્ટ્સ</translation>
 <translation id="5305688511332277257">કશું ઇન્સ્ટોલ કરેલું નથી</translation>
 <translation id="5308380583665731573">કનેક્ટ કરો</translation>
 <translation id="5311260548612583999">ખાનગી કી ફાઇલ (વૈકલ્પિક):</translation>
+<translation id="5313967007315987356">સાઈટ ઉમેરો</translation>
 <translation id="5316588172263354223">કોઇપણ સમયે વૉઇસ શોધ</translation>
 <translation id="5316716239522500219">મિરર મૉનિટર્સ</translation>
 <translation id="5317780077021120954">સાચવો</translation>
@@ -3291,6 +3300,7 @@
 <translation id="5734362860645681824">સંચાર</translation>
 <translation id="573719557377416048">સહઉપસ્થિતિ સ્થિતિ સાફ કરો</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: સંપાદિત કરવા માટે પસંદ કરો</translation>
+<translation id="5741454054957165976">WebFonts લોડિંગ માટે વપરાશકર્તા એજન્ટ હસ્તક્ષેપનું નવું સંસ્કરણ સક્ષમ કરો.</translation>
 <translation id="574392208103952083">મધ્યમ</translation>
 <translation id="5745056705311424885">USB મેમરી સ્ટિક મળ્યું</translation>
 <translation id="5746169159649715125">PDF તરીકે સાચવો</translation>
@@ -3339,7 +3349,6 @@
 <translation id="5803531701633845775">કર્સરને ખસેડ્યા વગર, પાછળથી શબ્દસમૂહ પસંદ કરો</translation>
 <translation id="5804241973901381774">પરવાનગીઓ</translation>
 <translation id="580571955903695899">શીર્ષકથી પુનઃક્રમાંકિત કરો</translation>
-<translation id="5808982448801399019">પ્રમાણીકરણ નિષ્ફળ થયું</translation>
 <translation id="580961539202306967">જ્યારે સાઇટ મને પુશ સંદેશાઓ મોકલવાનું ઇચ્છે ત્યારે મને પૂછો (ભલામણ કરેલ)</translation>
 <translation id="5815645614496570556">X.400 સરનામું</translation>
 <translation id="5817397429773072584">પરંપરાગત ચાઇનીઝ</translation>
@@ -3364,6 +3373,7 @@
 <translation id="5834581999798853053">લગભગ <ph name="TIME" /> મિનિટ બાકી</translation>
 <translation id="5838825566232597749">US Workman આંતરરાષ્ટ્રિય</translation>
 <translation id="5839277899276241121">બિલિંગ સરનામા તરીકે જ</translation>
+<translation id="5844550873065695788">આ ઓછામાં ઓછી <ph name="TOTAL_COUNT" /> આઇટમ્સને આ ઉપકરણમાંથી સ્થાયી રૂપે કાઢી નાખશે. પછીથી તમારા ડેટાને પુનઃપ્રાપ્ત કરવા માટે, $2 તરીકે chrome માં સાઇન ઇન કરો.</translation>
 <translation id="5846929185714966548">ટૅબ 4</translation>
 <translation id="5848934677402291689">PDF પર સાચવવાનું પ્રક્રિયામાં છે</translation>
 <translation id="5849335628409778954">ક્રેડિટ કાર્ડ દાખલ કરો...</translation>
@@ -3608,6 +3618,7 @@
 <translation id="6232017090690406397">બૅટરી</translation>
 <translation id="6241530762627360640">તમારા સિસ્ટમ સાથે જોડી બનાવેલા Bluetooth ઉપકરણો વિશેની માહિતી ઍક્સેસ કરો અને નજીકના Bluetooth ઉપકરણોની શોધ કરો.</translation>
 <translation id="6243774244933267674">સર્વર અનુપલબ્ધ</translation>
+<translation id="6246413617632217567">નિરીક્ષિત વપરાશકર્તા આયાત કરી શક્યાં નથી. કૃપા કરીને તમારું હાર્ડ ડ્રાઇવ સ્થાન અને પરવાનગીઓ તપાસો અને ફરીથી પ્રયાસ કરો.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">અપડેટ તૈયાર</translation>
 <translation id="6248400709929739064">ઉપશીર્ષકો સક્ષમ કરો</translation>
@@ -3636,6 +3647,7 @@
 <translation id="6277518330158259200">સ્ક્રીનશોટ &amp;લો</translation>
 <translation id="6279183038361895380">તમારા કર્સરને બતાવવા માટે |<ph name="ACCELERATOR" />| દબાવો</translation>
 <translation id="6280215091796946657">એક અલગ એકાઉન્ટ સાથે સાઇન ઇન કરો</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">તમામ API, લેઆઉટ વ્યૂપોર્ટને પ્રતિબિંબિત કરે તે માટેનો પ્રયોગ. આ window.scroll પ્રોપર્ટીઝને લેઆઉટ વ્યૂપોર્ટથી સંબંધિત બનાવશે.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{તમારા નેટવર્ક પર નવું પ્રિન્ટર}one{તમારા નેટવર્ક પર નવા પ્રિન્ટર્સ}other{તમારા નેટવર્ક પર નવા પ્રિન્ટર્સ}}</translation>
 <translation id="6285395082104474418">સ્થિતિ ટ્રે તમને તમારા નેટવર્ક, બેટરી અને વધુની વર્તમાન સ્થિતિ બતાવે છે.</translation>
@@ -3691,6 +3703,7 @@
 <translation id="6380143666419481200">સ્વીકારો અને ચાલુ રાખો</translation>
 <translation id="6380224340023442078">સામગ્રી સેટિંગ્સ...</translation>
 <translation id="6383194710567510941">chrome.input.ime API ના ઉપયોગને સક્ષમ કરો.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{આ ઓછામાં ઓછી $1 આઇટમને આ ઉપકરણમાંથી સ્થાયી રૂપે કાઢી નાખશે. પછીથી તમારા ડેટાને પુનઃપ્રાપ્ત કરવા માટે, $2 તરીકે chrome માં સાઇન ઇન કરો.}one{આ ઓછામાં ઓછી $1 આઇટમ્સને આ ઉપકરણમાંથી સ્થાયી રૂપે કાઢી નાખશે. પછીથી તમારા ડેટાને પુનઃપ્રાપ્ત કરવા માટે, $2 તરીકે chrome માં સાઇન ઇન કરો.}other{આ ઓછામાં ઓછી $1 આઇટમ્સને આ ઉપકરણમાંથી સ્થાયી રૂપે કાઢી નાખશે. પછીથી તમારા ડેટાને પુનઃપ્રાપ્ત કરવા માટે, $2 તરીકે chrome માં સાઇન ઇન કરો.}}</translation>
 <translation id="6384275966486438344">આ પર તમારી શોધ સેટિંગ્સ બદલો: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">આ વિંડોમાં તમે જે પૃષ્ઠો જોઈ રહ્યાં છો તે બ્રાઉઝર ઇતિહાસમાં દેખાશે નહીં અને તે તમે બધી ખુલેલી અતિથિ વિંડોઝ બંધ કરી દો તે પછી તમારા કમ્પ્યુટર પર કૂકીઝ જેવા કોઈ અન્ય નિશાન છોડશે નહીં. જો કે, તમે ડાઉનલોડ કરેલી કોઈપણ ફાઇલો જાળવવામાં આવશે.</translation>
 <translation id="6391538222494443604">ઇનપુટ નિર્દેશિકા અસતિત્વમાં હોવી જોઈએ. </translation>
@@ -3830,6 +3843,7 @@
 <translation id="6575134580692778371">ગોઠવેલું નથી</translation>
 <translation id="6575251558004911012">જ્યારે કોઈ સાઇટને તમારા કૅમેરાને ઍક્સેસ કરવાની જરૂર હોય, ત્યારે પૂછો (ભલામણ કરેલ)</translation>
 <translation id="6579159469348633828">Brotli સામગ્રી-એન્કોડિંગ.</translation>
+<translation id="6580151766480067746">ARC સંસ્કરણ</translation>
 <translation id="6581162200855843583">Google ડ્રાઇવ લિંક</translation>
 <translation id="6583070985841601920"><ph name="USER_EMAIL_ADDRESS" /> તરીકે સાઇન ઇન. સમન્વયન તમારા સંચાલક દ્વારા અક્ષમ છે.</translation>
 <translation id="65832705307647870">લોકપ્રિય સાઇટ્સ વડે નવા ટેબ પૃષ્ઠને પ્રી-પોપ્યુલેટ કરો.</translation>
@@ -3995,6 +4009,7 @@
 <translation id="6847758263950452722">MHTML તરીકે પૃષ્ઠ સાચવો</translation>
 <translation id="6853388645642883916">અપડેટકર્તા નિષ્ક્રિય છે</translation>
 <translation id="68541483639528434">અન્ય ટૅબ્સને બંધ કરો</translation>
+<translation id="6856701878604560493">ઑફલાઇન બુકમાર્ક્સ સક્ષમ કરો</translation>
 <translation id="6860097299815761905">પ્રોક્સી સેટિંગ્સ...</translation>
 <translation id="6860427144121307915">એક ટેબમાં ખોલો</translation>
 <translation id="6862635236584086457">આ ફોલ્ડરમાં સાચવેલી તમામ ફાઇલોનો આપમેળે ઑનલાઇન બૅકઅપ લેવાય છે</translation>
@@ -4167,6 +4182,7 @@
 <translation id="7092106376816104">પૉપ-અપ અપવાદો</translation>
 <translation id="7093866338626856921">આ નામના ઉપકરણ સાથે ડેટા વિનિમય કરો: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">વધુ અદ્ભુત સુવિધાઓ શોધવા માગો છો?</translation>
+<translation id="7096108453481049031">નિરીક્ષિત વપરાશકર્તાને આયાત કરી શક્યાં નથી. કૃપા કરીને તમારું નેટવર્ક કનેક્શન તપાસો અને પછીથી ફરી પ્રયાસ કરો.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> આઇટમ્સ પસંદ કરી</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">વધુ સ્ટોરેજ ખરીદો...</translation>
@@ -4195,6 +4211,7 @@
 <translation id="713888829801648570">માફ કરશો, તમારો પાસવર્ડ ચકાસી શકાયો નથી કારણ કે તમે ઑફલાઇન છો.</translation>
 <translation id="7140928199327930795">કોઈ અન્ય ઉપલબ્ધ ઉપકરણો નથી.</translation>
 <translation id="7141105143012495934">સાઇન-ઇન નિષ્ફળ થયું કારણ કે તમારી એકાઉન્ટ વિગતો પુનઃપ્રાપ્ત કરી શકાઈ નથી. કૃપા કરીને તમારા વ્યવસ્થાપકનો સંપર્ક કરો અથવા ફરી પ્રયાસ કરો.</translation>
+<translation id="7141331524324591758">પૉઇન્ટર ઇવેન્ટ્સ API માટે આંશિક પ્રાયોગિક સમર્થન સક્ષમ કરે છે. આ માત્ર વેબ વિકાસકર્તાઓ દ્વારા પરીક્ષણના હેતુ માટે જ બનાવાયેલ છે, આને કારણે કેટલીક વેબસાઇટ્સ આસાનીથી ભાંગી પડે છે.</translation>
 <translation id="7143207342074048698">કનેક્ટ કરી રહ્યું છે</translation>
 <translation id="7144878232160441200">ફરી પ્રયાસ કરો</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> પ્લગ-ઇન અક્ષમ કરવામાં આવ્યું છે. તેને ફરીથી સક્ષમ કરવા માટે, કૃપા કરીને <ph name="CHROME_PLUGINS_LINK" /> પર જાઓ.</translation>
@@ -4838,6 +4855,7 @@
 <translation id="8119572489781388874">સેટિંગ્સ સંશોધિત કરો</translation>
 <translation id="8119631488458759651">આ સાઇટને દૂર કરો</translation>
 <translation id="8121385576314601440">હંગુલ ઇનપુટ સેટિંગ્સ</translation>
+<translation id="8122245494004914423">આ તમારા બ્રાઉઝીંગ ડેટાને આ ઉપકરણમાંથી સ્થાયી રૂપે કાઢી નાખશે. પછીથી તમારા ડેટાને પુનઃપ્રાપ્ત કરવા માટે, $2 તરીકે chrome માં સાઇન ઇન કરો.</translation>
 <translation id="8124313775439841391">સંચાલિત ONC</translation>
 <translation id="8126844665673008223">વેબ Bluetooth</translation>
 <translation id="8127322077195964840">localhost તરફથી લોડ થયેલા સંસાધનો માટે અમાન્ય પ્રમાણપત્રોને મંજૂરી આપો.</translation>
@@ -4923,6 +4941,7 @@
 <translation id="8226742006292257240">નીચે રેંડમલી બનાવેલો TPM પાસવર્ડ છે જે તમારા કમ્પ્યુટરને અસાઇન કરવામાં આવ્યો છે:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">હુમલાખોરો હાલમાં <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> પર છે તે તમારા કમ્પ્યુટર પર તમારી માહિતી (ઉદાહરણ તરીકે, ફોટા, પાસવર્ડ્સ, સંદેશા અને ક્રેડિટ કાર્ડ્સ) ને ચોરી શકે કે કાઢી નાખે તેવા જોખમી પ્રોગ્રામ્સને ઇન્સ્ટોલ કરવાનો પ્રયાસ કરી શકે છે.</translation>
+<translation id="8233254008506535819">બ્રાઉઝિંગ ડેટા સાફ કરો સંવાદમાં મહત્વની સાઇટ્સ વ્હાઇટલીસ્ટ કરવા માટે વિકલ્પ શામેલ કરો.</translation>
 <translation id="8236231079192337250">પ્રિન્ટર ડ્રાઇવર્સ માટે Chrome વેબ દુકાન ગૅલેરી એપ્લિકેશન</translation>
 <translation id="8238649969398088015">સહાય ટિપ</translation>
 <translation id="8240697550402899963">ક્લાસિક થીમનો ઉપયોગ કરો</translation>
@@ -5248,7 +5267,6 @@
 <translation id="8708671767545720562">&amp;વધુ માહિતી</translation>
 <translation id="8711402221661888347">પિકલ્સ</translation>
 <translation id="8711453844311572806">જ્યારે તમારો ફોન અનલૉક હોય અને નજીકમાં હોય, ત્યારે દાખલ કરવા માટે ફક્ત ક્લિક કરો. અન્યથા, તમે એક લૉક થયેલું આયકન જોશો અને તમારે તમારો પાસવર્ડ લખવાની જરૂર પડશે.</translation>
-<translation id="8712637175834984815">સમજાઈ ગયું</translation>
 <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />સિસ્ટમ માહિતી<ph name="END_LINK1" /> મોકલો</translation>
 <translation id="8713979477561846077">US કીબોર્ડ માટે ભૌતિક કીબોર્ડ સ્વતઃસુધારો સક્ષમ કરો, જે ભૌતિક કીબોર્ડ પર ટાઇપ કરતાની સાથે જ સૂચનો પ્રદાન કરી શકે છે.</translation>
 <translation id="871476437400413057">Google સાચવેલ પાસવર્ડ્સ</translation>
@@ -5612,6 +5630,7 @@
 <translation id="952992212772159698">સક્રિય કરેલું નથી</translation>
 <translation id="953000875543358078">આમાં એક મિનિટ અથવા તેથી વધુ સમય લાગી શકે છે</translation>
 <translation id="960987915827980018">લગભગ 1 કલાક બાકી</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{આ $1 આઇટમને આ ઉપકરણમાંથી સ્થાયી રૂપે કાઢી નાખશે. પછીથી તમારા ડેટાને પુનઃપ્રાપ્ત કરવા માટે, $2 તરીકે chrome માં સાઇન ઇન કરો.}one{આ $1 આઇટમ્સને આ ઉપકરણમાંથી સ્થાયી રૂપે કાઢી નાખશે. પછીથી તમારા ડેટાને પુનઃપ્રાપ્ત કરવા માટે, $2 તરીકે chrome માં સાઇન ઇન કરો.}other{આ $1 આઇટમ્સને આ ઉપકરણમાંથી સ્થાયી રૂપે કાઢી નાખશે. પછીથી તમારા ડેટાને પુનઃપ્રાપ્ત કરવા માટે, $2 તરીકે chrome માં સાઇન ઇન કરો.}}</translation>
 <translation id="96421021576709873">Wi-Fi નેટવર્ક</translation>
 <translation id="965490406356730238">જ્યાં ઉપલબ્ધ હોય ત્યાં કેપ્ચર કરેલ ફ્રેમ માટે હાર્ડવેર-એક્સિલરેટેડ mjpeg ડીકોડ સક્ષમ કરો.</translation>
 <translation id="968174221497644223">એપ્લિકેશન કેશ</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index c56375c07..013b11f 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -251,6 +251,7 @@
       ध्‍यान दें कि ब्‍लूटूथ को <ph name="USER_DISPLAY_EMAIL" /> के सभी संगत डिवाइस के लिए चालू रखा जाएगा और कुछ हार्डवेयर जानकारी Google को भेजी जाएगी. &lt;a&gt;और जानें&lt;/a&gt;</translation>
 <translation id="13649080186077898">स्‍वत: भरण सेटिंग प्रबंधित करें</translation>
 <translation id="1367951781824006909">कोई फ़ाइल चुनें</translation>
+<translation id="136802136832547685">इस डिवाइस में जोड़ने के लिए कोई पर्यवेक्षित उपयोगकर्ता नहीं है.</translation>
 <translation id="1368265273904755308">समस्‍या की रिपोर्ट करें</translation>
 <translation id="1368832886055348810">बाएं से दाएं</translation>
 <translation id="1370646789215800222">व्यक्ति को निकालें?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">खोज</translation>
 <translation id="1384211230590313258">सेवा खोज हैंडलर</translation>
 <translation id="1386387014181100145">कैसे हैं.</translation>
+<translation id="1386830813511981192">आपके <ph name="DEVICE_TYPE" /> पर अब दस लाख से अधिक ऐप्लिकेशन और गेम उपलब्ध हैं.</translation>
 <translation id="1389297115360905376">इसे केवल <ph name="CHROME_WEB_STORE" /> से ही जोड़ा जा सकता है.</translation>
 <translation id="1390548061267426325">नियमित टैब के रूप में खोलें</translation>
 <translation id="1395262318152388157">सीक स्‍लाइडर</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">दायां हाशिया</translation>
 <translation id="2282146716419988068">GPU प्रक्रिया</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">WebFonts लोडिंग के लिए उपयोगकर्ता एजेंट हस्तक्षेप का नया वर्शन.</translation>
 <translation id="2286454467119466181">आसान</translation>
 <translation id="2286950485307333924">अब आपने Chrome में प्रवेश कर लिया है</translation>
 <translation id="2287590536030307392">सभी वायरलेस कनेक्‍शन बंद करें.</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">Google तालिका</translation>
 <translation id="2546283357679194313">कुकी और साइट डेटा</translation>
 <translation id="2549646943416322527">Seccomp पहचानकर्ता</translation>
+<translation id="2550212893339833758">स्वैप की गई मेमोरी</translation>
 <translation id="2553100941515833716">प्रत्येक बार पुन: प्रारंभ होने पर ऐप्लिकेशन लॉन्चर इंस्टॉल स्थिति रीसेट करें.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" />, <ph name="NETWORK_ID" /> से कनेक्‍ट करने में असमर्थ था. कृपया कोई अन्‍य नेटवर्क चुनें या पुन: प्रयास करें.</translation>
 <translation id="2553440850688409052">यह प्लग इन छुपाएं</translation>
@@ -1102,6 +1106,7 @@
 <translation id="2587203970400270934">ऑपरेटर कोड:</translation>
 <translation id="2587922270115112871">पर्यवेक्षित उपयोगकर्ता बनाने से Google खाता नहीं बनता, और उसकी सेटिंग और डेटा
     Chrome समन्वयन के साथ अन्य डिवाइस पर उसका अनुसरण नहीं करेंगे. पर्यवेक्षित उपयोगकर्ता केवल इस डिवाइस पर लागू होता है.</translation>
+<translation id="2594049137847833442">ब्राउजिंग डेटा साफ़ करें संवाद में महत्वपूर्ण साइट विकल्प</translation>
 <translation id="2594056015203442344">सक्षम होने पर, टैब स्ट्रिप में ऑडियो संकेतक टैब ऑडियो म्‍यूट नियंत्रण के रूप में दोहरा होता है.  यह चुने गए एकाधिक टैब को त्वरित रूप से म्‍यूट करने के लिए टैब प्रसंग मेनू में आदेश भी जोड़ता है.</translation>
 <translation id="259421303766146093">अनावर्धित करें</translation>
 <translation id="2597852038534460976">Chrome, वॉलपेपर एक्सेस नहीं कर सकता. कृपया किसी नेटवर्क से कनेक्ट करें.</translation>
@@ -1469,7 +1474,6 @@
 <translation id="3065140616557457172">खोजने के लिए लिखें या नेविगेट करने के लिए URL दर्ज करें- कुछ भी चलेगा.</translation>
 <translation id="3067198360141518313">यह प्लग इन चलाएं</translation>
 <translation id="307519606911195071">सेटिंग पृष्ठ में अतिरिक्त एक्सेस-योग्यता सुविधाओं को सक्षम करें.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> को पर्यवेक्षित उपयोगकर्ता बनाया गया है!</translation>
 <translation id="3075874217500066906">पावरवॉश प्रक्रिया शुरू करने के लिए पुन: प्रारंभ करने की आवश्‍यकता है. पुन: प्रारंभ करने के बाद आपसे इस बात की पुष्‍टि करने के लिए पूछा जाएगा कि क्या आप आगे बढ़ना चाहते हैं.</translation>
 <translation id="3076677906922146425">किसी को भी Chrome में एक व्‍यक्‍ति जोड़ने दें</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1486,6 +1490,7 @@
 <translation id="3088034400796962477">लिप्यंतरण (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;नाम बदलें...</translation>
 <translation id="308903551226753393">अपने आप कॉन्फ़िगर करें</translation>
+<translation id="3089231390674410424">ऐसा लगता है कि आपके क्रेडेंशियल में कोई समस्या है. कृपया सुनिश्चित करें कि आपने ठीक तरह से प्रवेश किया हुआ है और पुनः प्रयास करें.</translation>
 <translation id="3090819949319990166">बाहरी crx फ़ाइल की <ph name="TEMP_CRX_FILE" /> में प्रतिलिपि नहीं बनाई जा सकती.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" युग्मित किया गया</translation>
 <translation id="3092544800441494315">इस स्‍क्रीनशॉट को शामिल करें:</translation>
@@ -2013,7 +2018,6 @@
 <translation id="3790856258139356663">Chrome समन्‍वयन के परीक्षण सर्वर से कनेक्ट करता है.</translation>
 <translation id="3790909017043401679">सिम कार्ड पिन दर्ज करें</translation>
 <translation id="3792890930871100565">प्रिंटर डिस्कनेक्ट करें</translation>
-<translation id="3795681127952030401"><ph name="URL" /> आपको सूचनाएं भेजना चाहता है.</translation>
 <translation id="3796648294839530037">पसंदीदा नेटवर्क:</translation>
 <translation id="3797900183766075808">“<ph name="SEARCH_TERMS" />” को खोजने के लिए <ph name="SEARCH_ENGINE" /> पर &amp;खोजें</translation>
 <translation id="3798449238516105146">वर्शन</translation>
@@ -2486,6 +2490,7 @@
 <translation id="4552678318981539154">अधिक मेमोरी खरीदें</translation>
 <translation id="4554591392113183336">बाहरी एक्‍सटेंशन मौजूदा की तुलना में समान या निम्नतर संस्‍करण पर है.</translation>
 <translation id="4554796861933393312">मटीरियल डिज़ाइन इंक ड्रॉप ऐनिमेशन की गति</translation>
+<translation id="4555670907822902621">ऑफ़लाइन देखने के लिए बुकमार्क किए गए पृष्ठों को सहेजना सक्षम करें.</translation>
 <translation id="4555769855065597957">परछाई</translation>
 <translation id="4556110439722119938">आपके बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग को आपके Google खाते में समन्वयित किया जाएगा ताकि आप उनका उपयोग अपने सभी डिवाइस पर कर सकें</translation>
 <translation id="4557136421275541763">चेतावनी:</translation>
@@ -2662,6 +2667,7 @@
 <translation id="4824518112777153488">होवर करने में सक्षम टचस्‍क्रीन के लिए समर्थन</translation>
 <translation id="4830573902900904548">आपका <ph name="DEVICE_TYPE" /> <ph name="NETWORK_NAME" /> का उपयोग करके इंटरनेट से कनेक्ट करने में असमर्थ है. कृपया कोई अन्य नेटवर्क चुनें. <ph name="LEARN_MORE_LINK_START" />और जानें<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572"><ph name="LOCALITY" /> में <ph name="ORGANIZATION" /> की पहचान <ph name="ISSUER" /> द्वारा सत्यापित की गई है. सर्वर द्वारा मान्य प्रमाणपत्र पारदर्शिता जानकारी की आपूर्ति की गई थी.</translation>
+<translation id="4832537345877333532">प्रदर्शन रंग कैलिब्रेशन के लिए Quirks Server से icc प्रदर्शन फ़ाइलों की पुनर्प्राप्ति अक्षम करें.</translation>
 <translation id="4834912470034578916">वेब नोटिफिकेशन के लिए कस्टम लेआउट सक्षम करें.</translation>
 <translation id="4835836146030131423">प्रवेश करने में त्रुटि.</translation>
 <translation id="4837926214103741331">आप इस डिवाइस का उपयोग करने के लिए अधिकृत नहीं हैं. कृपया प्रवेश अनुमति के लिए डिवाइस के स्‍वामी से संपर्क करें.</translation>
@@ -2849,6 +2855,7 @@
 <translation id="5120421890733714118">वेबसाइटों की पहचान करने के लिए इस प्रमाणपत्र पर विश्वास करें.</translation>
 <translation id="5121130586824819730">आपकी हार्ड डिस्‍क भर गई है.  कृपया किसी अन्‍य स्‍थान पर सहेजें या हार्ड डिस्‍क पर जगह बनाएं.</translation>
 <translation id="5125751979347152379">अमान्य URL.</translation>
+<translation id="5126663277159826272">प्रदर्शन कैलिब्रेशन के लिए Quirks Client को अक्षम करें.</translation>
 <translation id="5127881134400491887">नेटवर्क कनेक्शन प्रबंधित करें</translation>
 <translation id="5128590998814119508">प्रदर्शन सूची 2D कैनवस</translation>
 <translation id="512903556749061217">अनुलग्न</translation>
@@ -2990,9 +2997,11 @@
 <translation id="5301751748813680278">अतिथि के रूप में प्रवेश कर रहा है.</translation>
 <translation id="5301954838959518834">ठीक है, समझ गया/गई</translation>
 <translation id="5302048478445481009">भाषा</translation>
+<translation id="5304039790201806037">Pointer Events</translation>
 <translation id="5305688511332277257">कुछ भी इंस्टॉल नहीं है</translation>
 <translation id="5308380583665731573">कनेक्ट करें</translation>
 <translation id="5311260548612583999">निजी कुंजी फ़ाइल (वैकल्पिक):</translation>
+<translation id="5313967007315987356">साइट जोड़ें</translation>
 <translation id="5316588172263354223">किसी भी समय बोलकर खोजें</translation>
 <translation id="5316716239522500219">मॉनीटर मिरर करें</translation>
 <translation id="5317780077021120954">सहेजें</translation>
@@ -3295,6 +3304,7 @@
 <translation id="5734362860645681824">संचार</translation>
 <translation id="573719557377416048">Copresence की स्‍थिति साफ़ करें</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: संपादित करने के लिए चुनें</translation>
+<translation id="5741454054957165976">WebFonts लोडिंग के लिए उपयोगकर्ता एजेंट हस्तक्षेप का नया वर्शन सक्षम करें.</translation>
 <translation id="574392208103952083">मध्यम</translation>
 <translation id="5745056705311424885">USB मेमोरी स्‍टिक का पता चला है</translation>
 <translation id="5746169159649715125">PDF के रूप में सहेजें</translation>
@@ -3343,7 +3353,6 @@
 <translation id="5803531701633845775">कर्सर ले जाए बिना, पीछे से वाक्यांश चुनें</translation>
 <translation id="5804241973901381774">अनुमतियां</translation>
 <translation id="580571955903695899">शीर्षक द्वारा फिर से क्रमित करें</translation>
-<translation id="5808982448801399019">प्रमाणीकरण विफल रहा</translation>
 <translation id="580961539202306967">जब कोई साइट मुझे पुश संदेश भेजना चाहे तो मुझसे पूछें (सुझाए गए)</translation>
 <translation id="5815645614496570556">X.400 पता</translation>
 <translation id="5817397429773072584">पारंपरिक चीनी</translation>
@@ -3368,6 +3377,7 @@
 <translation id="5834581999798853053">लगभग <ph name="TIME" /> मिनट शेष हैं</translation>
 <translation id="5838825566232597749">यूएस वर्कमैन अंतर्राष्‍ट्रीय</translation>
 <translation id="5839277899276241121">बिलिंग पते के समान</translation>
+<translation id="5844550873065695788">यह इस डिवाइस से कम से कम <ph name="TOTAL_COUNT" /> आइटम स्थायी रूप से हटा देगा. बाद में अपना डेटा पुनर्प्राप्त करने के लिए, $2 के रूप में chrome में प्रवेश करें.</translation>
 <translation id="5846929185714966548">टैब 4</translation>
 <translation id="5848934677402291689">PDF में सहेजना प्रगति पर है</translation>
 <translation id="5849335628409778954">क्रेडिट कार्ड दर्ज करें...</translation>
@@ -3614,6 +3624,7 @@
 <translation id="6232017090690406397">बैटरी</translation>
 <translation id="6241530762627360640">अपने सिस्टम के साथ युग्मित ब्लूटूथ डिवाइस से संबंधित जानकारी एक्सेस करें और आस-पास के ब्लूटूथ डिवाइस की खोज करें.</translation>
 <translation id="6243774244933267674">सर्वर अनुपलब्‍ध है</translation>
+<translation id="6246413617632217567">पर्यवेक्षित उपयोगकर्ता को आयात नहीं किया जा सका. कृपया अपने हार्ड ड्राइव का स्थान और अनुमतियां जांचें तथा पुनः प्रयास करें.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">अपडेट तैयार है</translation>
 <translation id="6248400709929739064">उपशीर्षक सक्षम करें</translation>
@@ -3642,6 +3653,7 @@
 <translation id="6277518330158259200">स्क्री&amp;नशॉट लें</translation>
 <translation id="6279183038361895380">अपना कर्सर दिखाने के लिए |<ph name="ACCELERATOR" />| दबाएं</translation>
 <translation id="6280215091796946657">किसी दूसरे खाते से प्रवेश करें</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">सभी के द्वारा लेआउट व्यूपोर्ट प्रदर्शित किए जाने के लिए प्रयोग करें. इससे window.scroll प्रॉपर्टी, लेआउट व्यूपोर्ट से संबंधित हो जाएंगी.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{आपके नेटवर्क पर नया प्रिंटर}one{आपके नेटवर्क पर नए प्रिंटर}other{आपके नेटवर्क पर नए प्रिंटर}}</translation>
 <translation id="6285395082104474418">स्थिति ट्रे आपको आपके नेटवर्क, बैटरी आदि की वर्तमान स्थिति दिखाती है.</translation>
@@ -3697,6 +3709,7 @@
 <translation id="6380143666419481200">स्वीकार करें और जारी रखें</translation>
 <translation id="6380224340023442078">सामग्री सेटिंग...</translation>
 <translation id="6383194710567510941">chrome.input.ime API का उपयोग सक्षम करें.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{यह इस डिवाइस से कम से कम $1 आइटम स्थायी रूप से हटा देगा. बाद में अपना डेटा पुनर्प्राप्त करने के लिए, $2 के रूप में chrome में प्रवेश करें.}one{यह इस डिवाइस से कम से कम $1 आइटम स्थायी रूप से हटा देगा. बाद में अपना डेटा पुनर्प्राप्त करने के लिए, $2 के रूप में chrome में प्रवेश करें.}other{यह इस डिवाइस से कम से कम $1 आइटम स्थायी रूप से हटा देगा. बाद में अपना डेटा पुनर्प्राप्त करने के लिए, $2 के रूप में chrome में प्रवेश करें.}}</translation>
 <translation id="6384275966486438344">अपनी खोज सेटिंग इसमें बदलें: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">इस विंडो में आपके द्वारा देखे जाने वाले पृष्ठ ब्राउज़र इतिहास में दिखाई नहीं देंगे और वे आपके द्वारा खोली गईं सभी अतिथि विंडो बंद करने के बाद कंप्यूटर पर कुकी जैसे अन्य चिह्न नहीं छोड़ेंगे. हालांकि, आपके द्वारा डाउनलोड की जाने वाली सभी फ़ाइलें संरक्षित कर ली जाएंगी.</translation>
 <translation id="6391538222494443604">इनपुट निर्देशिका मौजूद होनी चाहिए.</translation>
@@ -3835,6 +3848,7 @@
 <translation id="6575134580692778371">कॉन्फ़िगर नहीं है</translation>
 <translation id="6575251558004911012">जब किसी साइट को आपका कैमरा एक्सेस करना हो तो पूछें (सुझाये गये) </translation>
 <translation id="6579159469348633828">Brotli सामग्री-एन्‍कोडिंग.</translation>
+<translation id="6580151766480067746">ARC वर्शन</translation>
 <translation id="6581162200855843583">Google डिस्क लिंक</translation>
 <translation id="6583070985841601920"><ph name="USER_EMAIL_ADDRESS" /> के रूप में प्रवेश हैं. समन्वयन आपके व्यवस्थापक द्वारा अक्षम किया गया है.</translation>
 <translation id="65832705307647870">नया टैब पृष्‍ठ को लोकप्रिय साइटों के साथ प्री-पॉप्‍युलेट करें.</translation>
@@ -4000,6 +4014,7 @@
 <translation id="6847758263950452722">MHTML के रूप में पृष्ठ सहेजें</translation>
 <translation id="6853388645642883916">अपडेटर निष्क्रिय</translation>
 <translation id="68541483639528434">अन्य टैब बंद करें</translation>
+<translation id="6856701878604560493">ऑफ़लाइन बुकमार्क सक्षम करें</translation>
 <translation id="6860097299815761905">प्रॉक्‍सी सेटिंग...</translation>
 <translation id="6860427144121307915">टैब में खोलें</translation>
 <translation id="6862635236584086457">इस फ़ोल्डर में सहेजी गई सभी फ़ाइलों का अपने आप ऑनलाइन बैकअप लिया जाता है</translation>
@@ -4174,6 +4189,7 @@
 <translation id="7092106376816104">पॉप-अप अपवाद</translation>
 <translation id="7093866338626856921"><ph name="HOSTNAMES" /> नामक डिवाइस से डेटा का आदान-प्रदान करें</translation>
 <translation id="7096082900368329802">अधिक शानदार सुविधाओं के बारे में जानना चाहते हैं?</translation>
+<translation id="7096108453481049031">पर्यवेक्षित उपयोगकर्ता आयात नहीं किया जा सकता. कृपया अपना नेटवर्क कनेक्शन जांचें और बाद में पुनः प्रयास करें.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> आइटम चयनित</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">अधिक मेमोरी खरीदें...</translation>
@@ -4202,6 +4218,7 @@
 <translation id="713888829801648570">क्षमा करें, आपका पासवर्ड सत्‍यापित नहीं किया जा सका क्‍योंकि आप ऑफ़लाइन हैं.</translation>
 <translation id="7140928199327930795">कोई अन्य उपलब्ध डिवाइस नहीं हैं.</translation>
 <translation id="7141105143012495934">प्रवेश करना विफल रहा क्योंकि आपका खाता विवरण पुनः प्राप्त नहीं किया जा सका. कृपया अपने नियंत्रक से संपर्क करें या पुनः प्रयास करें.</translation>
+<translation id="7141331524324591758">Pointer Events API के लिए आंशिक प्रयोगात्मक समर्थन सक्षम करता है.  इसे केवल वेब डेवलपर द्वारा परीक्षण के उद्देश्य से बनाया गया है, इसके कारण कुछ वेबसाइट ठीक से काम नहीं करेंगी.</translation>
 <translation id="7143207342074048698">कनेक्‍ट हो रहा है</translation>
 <translation id="7144878232160441200">पुन: प्रयास करें</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> को अक्षम कर दिया गया है. उसे पुन:-सक्षम करने के लिए, कृपया <ph name="CHROME_PLUGINS_LINK" /> पर जाएं.</translation>
@@ -4850,6 +4867,7 @@
 <translation id="8119572489781388874">सेटिंग संशोधित करें</translation>
 <translation id="8119631488458759651">यह साइट निकालें</translation>
 <translation id="8121385576314601440">हंगुल इनपुट सेटिंग</translation>
+<translation id="8122245494004914423">यह इस डिवाइस से आपका ब्राउज़िंग डेटा स्थायी रूप से हटा देगा. बाद में अपना डेटा पुनर्प्राप्त करने के लिए, $2 के रूप में chrome में प्रवेश करें.</translation>
 <translation id="8124313775439841391">प्रबंधित ONC</translation>
 <translation id="8126844665673008223">वेब ब्‍लूटूथ</translation>
 <translation id="8127322077195964840">स्‍थानीय होस्‍ट से लोड किए गए संसाधनों के लिए अमान्‍य प्रमाणपत्रों की अनुमति दें.</translation>
@@ -4934,6 +4952,7 @@
 <translation id="8226742006292257240">नीचे यादृच्छिक रूप से निर्मित TPM पासवर्ड है जो कि आपके कंप्‍यूटर के लिए असाइन किया गया है:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">वर्तमान में <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> पर मौजूद हमलावर आपके कंप्यूटर पर ऐसे खतरनाक प्रोग्राम इंस्टॉल करने का प्रयास कर सकते हैं जो आपकी जानकारी (उदाहरण के लिए, फ़ोटो, पासवर्ड, संदेश और क्रेडिट कार्ड) चुरा लेते हैं या उसे हटा देते हैं.</translation>
+<translation id="8233254008506535819">ब्राउज़िंग डेटा साफ़ करें संवाद में महत्वपूर्ण साइटें श्वेतसूची में डालने का विकल्प शामिल है.</translation>
 <translation id="8236231079192337250">प्रिंटर ड्राइवर के लिए Chrome वेब स्‍टोर गैलरी ऐप</translation>
 <translation id="8238649969398088015">सहायता युक्ति</translation>
 <translation id="8240697550402899963">क्लासिक थीम का उपयोग करें</translation>
@@ -5257,7 +5276,6 @@
 <translation id="8708671767545720562">&amp;अधिक जानकारी</translation>
 <translation id="8711402221661888347">पिकल्‍स</translation>
 <translation id="8711453844311572806">जब आपका फ़ोन अनलॉक हो और आस-पास हो, तो प्रवेश करने के लिए बस क्‍लिक करें. अन्‍यथा, आपको एक लॉक आइकन दिखाई देगा और आपको अपना पासवर्ड लिखना होगा.</translation>
-<translation id="8712637175834984815">समझ लिया</translation>
 <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />सिस्‍टम जानकारी<ph name="END_LINK1" /> भेजें</translation>
 <translation id="8713979477561846077">यूएस कीबोर्ड के लिए भौतिक कीबोर्ड स्‍वत: सुधार सक्षम करें, जिससे भौतिक कीबोर्ड पर लिखते समय सुझाव प्रदान किए जा सकते हैं.</translation>
 <translation id="871476437400413057">Google द्वारा सहेजे गए पासवर्ड</translation>
@@ -5620,6 +5638,7 @@
 <translation id="952992212772159698">सक्रिय नहीं किया गया</translation>
 <translation id="953000875543358078">इसमें एक मिनट या कुछ अधिक समय लग सकता है</translation>
 <translation id="960987915827980018">लगभग 1 घंटा शेष है</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{यह इस डिवाइस से $1 आइटम स्थायी रूप से हटा देगा. बाद में अपना डेटा पुनर्प्राप्त करने के लिए, $2 के रूप में chrome में प्रवेश करें.}one{यह इस डिवाइस से $1 आइटम स्थायी रूप से हटा देगा. बाद में अपना डेटा पुनर्प्राप्त करने के लिए, $2 के रूप में chrome में प्रवेश करें.}other{यह इस डिवाइस से $1 आइटम स्थायी रूप से हटा देगा. बाद में अपना डेटा पुनर्प्राप्त करने के लिए, $2 के रूप में chrome में प्रवेश करें.}}</translation>
 <translation id="96421021576709873">वाई-फ़ाई  नेटवर्क</translation>
 <translation id="965490406356730238">जहां उपलब्ध हो वहां कैप्चर की गई फ़्रेम के लिए हार्डवेयर-त्वरित mjpeg डीकोड सक्षम करें.</translation>
 <translation id="968174221497644223">अनुप्रयोग संचय</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index a9cb7a2..fa6ef57 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -251,6 +251,7 @@
       Bluetooth će biti uključen za sve kompatibilne uređaje korisnika <ph name="USER_DISPLAY_EMAIL" />, a Googleu će se poslati neki podaci o hardveru. &lt;a&gt;Saznajte više&lt;/a&gt;</translation>
 <translation id="13649080186077898">Upravljaj postavkama Automatskog popunjavanja</translation>
 <translation id="1367951781824006909">Odaberite datoteku</translation>
+<translation id="136802136832547685">Nema nadziranih korisnika koji se mogu dodati na ovaj uređaj.</translation>
 <translation id="1368265273904755308">Prijava problema</translation>
 <translation id="1368832886055348810">Slijeva udesno</translation>
 <translation id="1370646789215800222">Ukloniti osobu?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Traži</translation>
 <translation id="1384211230590313258">Rukovanje otkrivanjem usluge</translation>
 <translation id="1386387014181100145">Pozdrav.</translation>
+<translation id="1386830813511981192">Više od milijun aplikacija i igara sada je dostupno na vašem uređaju <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Može se dodati jedino iz usluge <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Otvori kao uobičajenu karticu</translation>
 <translation id="1395262318152388157">Klizač za traženje</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">Desna margina</translation>
 <translation id="2282146716419988068">GPU proces</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Nova verzija intervencije korisničkog agenta za učitavanje web-fontova.</translation>
 <translation id="2286454467119466181">Jednostavno sučelje</translation>
 <translation id="2286950485307333924">Prijavljeni ste u Chrome</translation>
 <translation id="2287590536030307392">Isključite sve bežične veze.</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">Googleova tablica</translation>
 <translation id="2546283357679194313">Kolačići i podaci o web-lokacijama</translation>
 <translation id="2549646943416322527">Otkrivanje Seccompa</translation>
+<translation id="2550212893339833758">Zamijenjena memorija</translation>
 <translation id="2553100941515833716">Vrati stanje instaliranja Pokretača aplikacija na zadano pri svakom ponovnom pokretanju.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> nije se mogao povezati s mrežom <ph name="NETWORK_ID" />. Odaberite drugu mrežu ili pokušajte ponovno.</translation>
 <translation id="2553440850688409052">Sakrij ovaj dodatak</translation>
@@ -1102,6 +1106,7 @@
 <translation id="2587203970400270934">Kôd operatora:</translation>
 <translation id="2587922270115112871">Izradom nadziranog korisnika ne izrađuje se Google račun. Njegove postavke
     i podaci neće ga slijediti na druge uređaje sa Sinkronizacijom u Chromeu. Nadzirani se korisnik trenutačno primjenjuje samo na ovaj uređaj.</translation>
+<translation id="2594049137847833442">Važne opcije za web-lokacije u dijaloškom okviru za brisanje podataka o pregledavanju</translation>
 <translation id="2594056015203442344">Kada je omogućeno, pokazatelji zvuka na vrpci s karticama djeluju i kao kontrole za isključivanje zvuka na karticama.  To također dodaje naredbe u kontekstualnom izborniku kartice za brzo isključivanje zvuka na više odabranih kartica.</translation>
 <translation id="259421303766146093">Isključi povećanje</translation>
 <translation id="2597852038534460976">Chrome ne može pristupiti pozadinskim slikama. Povežite se s mrežom.</translation>
@@ -1469,7 +1474,6 @@
 <translation id="3065140616557457172">Unesite pojam za pretraživanje ili URL za odlazak na stranicu - i jedno i drugo radi.</translation>
 <translation id="3067198360141518313">Pokrenite ovaj dodatak</translation>
 <translation id="307519606911195071">Omogućuje dodatne značajke pristupačnosti na stranici postavki.</translation>
-<translation id="3075239840551149663">Profil <ph name="NEW_PROFILE_NAME" /> izrađen je kao nadzirani korisnik!</translation>
 <translation id="3075874217500066906">Za pokretanje postupka Powerwash potrebno je ponovo pokrenuti uređaj. Nakon ponovnog pokretanja morat ćete potvrditi da želite nastaviti.</translation>
 <translation id="3076677906922146425">Dopusti svakome da doda osobu u Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1486,6 +1490,7 @@
 <translation id="3088034400796962477">transliteracija (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Preimenuj...</translation>
 <translation id="308903551226753393">Automatska konfiguracija</translation>
+<translation id="3089231390674410424">Izgleda da ima problema s vašim vjerodajnicama. Provjerite jeste li se pravilno prijavili i pokušajte ponovo.</translation>
 <translation id="3090819949319990166">Nije moguće kopiranje crx datoteke u <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">Upareno: "<ph name="DEVICE_NAME" />"</translation>
 <translation id="3092544800441494315">Uključi ovu snimku zaslona:</translation>
@@ -2012,7 +2017,6 @@
 <translation id="3790856258139356663">Priključuje se na poslužitelj za testiranje za Chrome sinkronizaciju.</translation>
 <translation id="3790909017043401679">Unesite PIN za SIM karticu</translation>
 <translation id="3792890930871100565">Isključi pisače</translation>
-<translation id="3795681127952030401"><ph name="URL" /> želi vam poslati obavijesti.</translation>
 <translation id="3796648294839530037">Omiljene mreže:</translation>
 <translation id="3797900183766075808">&amp;Traži pojam "<ph name="SEARCH_TERMS" />" na tražilici <ph name="SEARCH_ENGINE" /></translation>
 <translation id="3798449238516105146">Verzija</translation>
@@ -2486,6 +2490,7 @@
 <translation id="4552678318981539154">Kupite još prostora za pohranu</translation>
 <translation id="4554591392113183336">Vanjsko proširenje iste je ili starije verzije u odnosu na postojeću.</translation>
 <translation id="4554796861933393312">Brzina animacije kapi tinte u dizajnu materijala</translation>
+<translation id="4555670907822902621">Omogući spremanje označenih stranica za offline gledanje.</translation>
 <translation id="4555769855065597957">Sjena</translation>
 <translation id="4556110439722119938">Vaše oznake, povijest, zaporke i ostale postavke sinkronizirat će se s vašim Google računom kako biste ih mogli upotrebljavati na svim svojim uređajima.</translation>
 <translation id="4557136421275541763">Upozorenje:</translation>
@@ -2662,6 +2667,7 @@
 <translation id="4824518112777153488">Podrška za dodirne zaslone s mogućnošću zadržavanja pokazivača iznad stavki</translation>
 <translation id="4830573902900904548">Vaš uređaj <ph name="DEVICE_TYPE" /> ne može se povezati s internetom putem mreže <ph name="NETWORK_NAME" />. Odaberite drugu mrežu. <ph name="LEARN_MORE_LINK_START" />Saznajte više<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Izdavatelj certifikata <ph name="ISSUER" /> potvrdio je identitet organizacije <ph name="ORGANIZATION" /> na lokaciji <ph name="LOCALITY" />. Važeće informacije o transparentnosti certifikata pružio je poslužitelj.</translation>
+<translation id="4832537345877333532">Onemogućuje dohvaćanje datoteka ICC zaslona s Quirksova poslužitelja za kalibraciju boje na zaslonu.</translation>
 <translation id="4834912470034578916">Omogući prilagođeni izgled za web-obavijesti.</translation>
 <translation id="4835836146030131423">Pogreška u prijavi.</translation>
 <translation id="4837926214103741331">Niste ovlašteni za upotrebu ovog uređaja. Zamolite vlasnika da vam dopusti prijavu.</translation>
@@ -2849,6 +2855,7 @@
 <translation id="5120421890733714118">Vjeruj ovom certifikatu za identificiranje web-lokacija.</translation>
 <translation id="5121130586824819730">Vaš je tvrdi disk pun. Spremite na neku drugu lokaciju ili oslobodite prostor na tvrdom disku.</translation>
 <translation id="5125751979347152379">Nevažeći URL.</translation>
+<translation id="5126663277159826272">Onemogući Quirks Client za kalibraciju zaslona.</translation>
 <translation id="5127881134400491887">upravljati mrežnim vezama</translation>
 <translation id="5128590998814119508">2D platno popisa za prikaz</translation>
 <translation id="512903556749061217">povezano</translation>
@@ -2990,9 +2997,11 @@
 <translation id="5301751748813680278">Ulazite kao Gost.</translation>
 <translation id="5301954838959518834">U redu, shvaćam</translation>
 <translation id="5302048478445481009">Jezik</translation>
+<translation id="5304039790201806037">Događaji pokazivača</translation>
 <translation id="5305688511332277257">Nijedan nije instaliran</translation>
 <translation id="5308380583665731573">Povežite se</translation>
 <translation id="5311260548612583999">Datoteka s os.klj. (neobav.)</translation>
+<translation id="5313967007315987356">Dodaj web-lokaciju</translation>
 <translation id="5316588172263354223">Glasovno pretraživanje u bilo kojem trenutku</translation>
 <translation id="5316716239522500219">Zrcalni monitori</translation>
 <translation id="5317780077021120954">Spremi</translation>
@@ -3295,6 +3304,7 @@
 <translation id="5734362860645681824">Komunikacije</translation>
 <translation id="573719557377416048">Izbriši stanje istodobne prisutnosti</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: odaberi za uređivanje</translation>
+<translation id="5741454054957165976">Omogućuje novu verziju intervencije korisničkog agenta za učitavanje web-fontova.</translation>
 <translation id="574392208103952083">Srednje</translation>
 <translation id="5745056705311424885">Otkriven je USB memorijski privjesak</translation>
 <translation id="5746169159649715125">Spremi kao PDF</translation>
@@ -3343,7 +3353,6 @@
 <translation id="5803531701633845775">Odaberite rečenice iz pozadine, bez pomicanja pokazivača</translation>
 <translation id="5804241973901381774">Dozvoljeno</translation>
 <translation id="580571955903695899">Poredaj ponovo po naslovu</translation>
-<translation id="5808982448801399019">Autorizacija nije uspjela</translation>
 <translation id="580961539202306967">Pitaj me kada mi web-lokacija želi slati push poruke (preporučeno)</translation>
 <translation id="5815645614496570556">X.400 adresa</translation>
 <translation id="5817397429773072584">tradicionalni kineski</translation>
@@ -3368,6 +3377,7 @@
 <translation id="5834581999798853053">Preostalo je oko <ph name="TIME" /> min</translation>
 <translation id="5838825566232597749">Američka međunarodna Workman</translation>
 <translation id="5839277899276241121">Isto kao i adresa za naplatu</translation>
+<translation id="5844550873065695788">Time će se trajno izbrisati najmanje <ph name="TOTAL_COUNT" /> stav. s ovog uređaja. Da biste kasnije dohvatili svoje podatke, prijavite se na Chrome kao $2.</translation>
 <translation id="5846929185714966548">Kartica 4</translation>
 <translation id="5848934677402291689">U tijeku je spremanje u PDF</translation>
 <translation id="5849335628409778954">Unesite kreditnu karticu...</translation>
@@ -3612,6 +3622,7 @@
 <translation id="6232017090690406397">Baterija</translation>
 <translation id="6241530762627360640">pristupiti informacijama o Bluetooth uređajima uparenim s vašim sustavom i otkrivati Bluetooth uređaje u blizini</translation>
 <translation id="6243774244933267674">Poslužitelj nije dostupan</translation>
+<translation id="6246413617632217567">Nadzirani korisnik nije uvezen. Provjerite imate li dovoljno prostora na tvrdom disku i potrebna dopuštenja pa pokušajte ponovo.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Ažuriranje je spremno</translation>
 <translation id="6248400709929739064">Omogući titlove</translation>
@@ -3640,6 +3651,7 @@
 <translation id="6277518330158259200">I&amp;zradi snimku zaslona</translation>
 <translation id="6279183038361895380">Pritisnite |<ph name="ACCELERATOR" />| da bi se prikazao pokazivač</translation>
 <translation id="6280215091796946657">Prijavite se drugim računom</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Eksperiment kojim svi API-ji odražavaju vidljivi dio izgleda. Time će svojstva "window.scroll" postati razmjerna vidljivom dijelu izgleda.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Novi pisač na vašoj mreži}one{Novi pisači na vašoj mreži}few{Novi pisači na vašoj mreži}other{Novi pisači na vašoj mreži}}</translation>
 <translation id="6285395082104474418">Traka statusa prikazuje trenutačno stanje vaše mreže, baterije i ostalog.</translation>
@@ -3695,6 +3707,7 @@
 <translation id="6380143666419481200">Prihvati i nastavi</translation>
 <translation id="6380224340023442078">Postavke sadržaja...</translation>
 <translation id="6383194710567510941">Omogućuje upotrebu chrome.input.ime API-ja.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Time će se trajno izbrisati najmanje $1 stavka s ovog uređaja. Da biste kasnije dohvatili svoje podatke, prijavite se na Chrome kao $2.}one{Time će se trajno izbrisati najmanje $1 stavka s ovog uređaja. Da biste kasnije dohvatili svoje podatke, prijavite se na Chrome kao $2.}few{Time će se trajno izbrisati najmanje $1 stavke s ovog uređaja. Da biste kasnije dohvatili svoje podatke, prijavite se na Chrome kao $2.}other{Time će se trajno izbrisati najmanje $1 stavki s ovog uređaja. Da biste kasnije dohvatili svoje podatke, prijavite se na Chrome kao $2.}}</translation>
 <translation id="6384275966486438344">promijeniti postavke pretraživanja u: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Stranice koje gledate u ovom prozoru neće se pojaviti u povijesti preglednika niti će ostaviti druge tragove, poput kolačića, na računalu nakon što zatvorite sve otvorene gostujuće prozore. Međutim, datoteke koje preuzmete sačuvat će se.</translation>
 <translation id="6391538222494443604">Mora postojati direktorij za unos.</translation>
@@ -3833,6 +3846,7 @@
 <translation id="6575134580692778371">Nije konfigurirano</translation>
 <translation id="6575251558004911012">Pitaj me kad web-lokacija zatraži pristup mojoj kameri (preporučeno)</translation>
 <translation id="6579159469348633828">Kodiranje sadržaja u Brotliju.</translation>
+<translation id="6580151766480067746">Verzija ARC-a</translation>
 <translation id="6581162200855843583">Veza na Google disk</translation>
 <translation id="6583070985841601920">Prijavljeni ste kao <ph name="USER_EMAIL_ADDRESS" />. Administrator je onemogućio sinkronizaciju.</translation>
 <translation id="65832705307647870">Stranica nove kartice unaprijed se popunjava popularnim web-lokacijama.</translation>
@@ -3998,6 +4012,7 @@
 <translation id="6847758263950452722">Spremi stranicu kao MHTML</translation>
 <translation id="6853388645642883916">Alat za ažuriranje u mirovanju je</translation>
 <translation id="68541483639528434">Zatvori ostale kartice</translation>
+<translation id="6856701878604560493">Omogući offline oznake</translation>
 <translation id="6860097299815761905">Proxy postavke...</translation>
 <translation id="6860427144121307915">Otvori u kartici</translation>
 <translation id="6862635236584086457">Za sve datoteke spremljene u ovoj mapi automatski se izrađuje sigurnosna kopija na mreži</translation>
@@ -4168,6 +4183,7 @@
 <translation id="7092106376816104">Iznimke za skočne prozore</translation>
 <translation id="7093866338626856921">razmjenjivati podatke s uređajima naziva: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Želite li otkriti još fantastičnih značajki?</translation>
+<translation id="7096108453481049031">Nadzirani korisnik nije uvezen. Provjerite jeste li povezani s mrežom i pokušajte ponovo.</translation>
 <translation id="7100897339030255923">Broj odabranih stavki: <ph name="COUNT" /></translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Kupite još prostora za pohranu...</translation>
@@ -4196,6 +4212,7 @@
 <translation id="713888829801648570">Nažalost, vašu zaporku nije moguće provjeriti jer ste offline.</translation>
 <translation id="7140928199327930795">Nema drugih dostupnih uređaja.</translation>
 <translation id="7141105143012495934">Prijava nije uspjela jer nisu dohvaćeni podaci o vašem računu. Obratite se administratoru ili pokušajte ponovo.</translation>
+<translation id="7141331524324591758">Omogućuje djelomičnu eksperimentalnu podršku za Pointer Events API. To je namijenjeno samo za testiranja koja vrše razvojni programeri za web i može uzrokovati donekle nepravilno funkcioniranje nekih web-lokacija.</translation>
 <translation id="7143207342074048698">Povezivanje</translation>
 <translation id="7144878232160441200">Pokušaj ponovo</translation>
 <translation id="7148311641502571842">Onemogućen je dodatak <ph name="PLUGIN_NAME" />. Da biste ga ponovo omogućili, idite na stranicu <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4843,6 +4860,7 @@
 <translation id="8119572489781388874">Izmjena postavki</translation>
 <translation id="8119631488458759651">Ukloni ovu web-lokaciju</translation>
 <translation id="8121385576314601440">Postavke unosa za Hangul</translation>
+<translation id="8122245494004914423">Time će se trajno izbrisati podaci o pregledavanju s ovog uređaja. Da biste kasnije dohvatili svoje podatke, prijavite se na Chrome kao $2.</translation>
 <translation id="8124313775439841391">Upravljani ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Dopusti nevažeće certifikate za resurse učitane s lokalnog hosta.</translation>
@@ -4927,6 +4945,7 @@
 <translation id="8226742006292257240">Dolje je nasumice generirana zaporka modula pouzdane platforme dodijeljena vašem računalu:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Napadači koji se trenutačno nalaze na <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> mogu pokušati instalirati opasne programe na vaše računalo radi krađe ili brisanja vaših podataka (na primjer, fotografija, zaporki, poruka i brojeva kreditnih kartica).</translation>
+<translation id="8233254008506535819">U dijaloški okvir za brisanje podataka o pregledavanju uključi opciju stavljanja važnih web-lokacija na popis dopuštenih.</translation>
 <translation id="8236231079192337250">Aplikacija Galerija Chrome web-trgovine za upravljačke programe pisača</translation>
 <translation id="8238649969398088015">Savjet za pomoć</translation>
 <translation id="8240697550402899963">Upotrijebi klasičnu temu</translation>
@@ -5250,7 +5269,6 @@
 <translation id="8708671767545720562">&amp;Više informacija</translation>
 <translation id="8711402221661888347">Kiseli krastavci</translation>
 <translation id="8711453844311572806">Kada je vaš telefon otključan i u blizini, samo kliknite za pristup. U suprotnom ćete vidjeti ikonu lokota i morat ćete unijeti zaporku.</translation>
-<translation id="8712637175834984815">Shvaćam</translation>
 <translation id="8713570323158206935">Pošalji <ph name="BEGIN_LINK1" />informacije o sustavu<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Omogućivanje automatskog ispravljanja za američku tipkovnicu koje može davati prijedloge prilikom pisanja pomoću fizičke tipkovnice.</translation>
 <translation id="871476437400413057">Google spremljene zaporke</translation>
@@ -5613,6 +5631,7 @@
 <translation id="952992212772159698">Nije aktivirano</translation>
 <translation id="953000875543358078">To može trajati otprilike minutu</translation>
 <translation id="960987915827980018">Još otprilike 1 sat</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Time će se trajno izbrisati $1 stavka s ovog uređaja. Da biste kasnije dohvatili svoje podatke, prijavite se na Chrome kao $2.}one{Time će se trajno izbrisati $1 stavka s ovog uređaja. Da biste kasnije dohvatili svoje podatke, prijavite se na Chrome kao $2.}few{Time će se trajno izbrisati $1 stavke s ovog uređaja. Da biste kasnije dohvatili svoje podatke, prijavite se na Chrome kao $2.}other{Time će se trajno izbrisati $1 stavki s ovog uređaja. Da biste kasnije dohvatili svoje podatke, prijavite se na Chrome kao $2.}}</translation>
 <translation id="96421021576709873">Wi-Fi mreža</translation>
 <translation id="965490406356730238">Omogućuje hardverski ubrzano MJPEG dekodiranje za snimljeni okvir tamo gdje je to dostupno.</translation>
 <translation id="968174221497644223">Predmemorija aplikacije</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 314e237..222c74f 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -251,6 +251,7 @@
       Felhívjuk figyelmét arra, hogy a Bluetooth a(z) <ph name="USER_DISPLAY_EMAIL" /> fiók valamennyi kompatibilis eszközén be lesz kapcsolva, és az eszközök bizonyos hardveradatokat elküldenek a Google számára. &lt;a&gt;További információ&lt;/a&gt;</translation>
 <translation id="13649080186077898">Automatikus kitöltés beállításainak kezelése</translation>
 <translation id="1367951781824006909">Válasszon egy fájlt</translation>
+<translation id="136802136832547685">Nincs felügyelt felhasználó, akit hozzá lehetne adni ehhez az eszközhöz.</translation>
 <translation id="1368265273904755308">Probléma bejelentése</translation>
 <translation id="1368832886055348810">Balról jobbra</translation>
 <translation id="1370646789215800222">Eltávolítja a felhasználót?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Keresés</translation>
 <translation id="1384211230590313258">Szolgáltatás-felfedezés kezelője</translation>
 <translation id="1386387014181100145">Üdvözöljük!</translation>
+<translation id="1386830813511981192">Több mint egymillió alkalmazás és játék áll rendelkezésére <ph name="DEVICE_TYPE" /> eszközén.</translation>
 <translation id="1389297115360905376">Ez csak innen adható hozzá: <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Megnyitás normál lapként</translation>
 <translation id="1395262318152388157">Keresőcsúszka</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">Jobb margó</translation>
 <translation id="2282146716419988068">GPU-folyamat</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Felhasználói ügynök beavatkozása (új verzió) a WebFonts betöltése esetén.</translation>
 <translation id="2286454467119466181">Egyszerű</translation>
 <translation id="2286950485307333924">Most már bejelentkezett a Chrome-ba</translation>
 <translation id="2287590536030307392">Az összes vezeték nélküli hálózat kikapcsolása.</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">Google-tábla</translation>
 <translation id="2546283357679194313">Cookie-k és webhelyadatok</translation>
 <translation id="2549646943416322527">Seccomp-érzékelő</translation>
+<translation id="2550212893339833758">Swap memória</translation>
 <translation id="2553100941515833716">Az Alkalmazásindító telepítési állapotának visszaállítása minden újraindításkor.</translation>
 <translation id="2553340429761841190">A <ph name="PRODUCT_NAME" /> nem tudott kapcsolódni a következőhöz: <ph name="NETWORK_ID" />. Válasszon másik hálózatot és próbálja újra.</translation>
 <translation id="2553440850688409052">Plug-in elrejtése</translation>
@@ -1103,6 +1107,7 @@
 <translation id="2587922270115112871">Felügyelt felhasználó létrehozásával nem hoz létre Google-fiókot, ezenkívül
     a beállításai és az adatai nem jelennek meg más eszközökön a Chrome szinkronizáló
     használata esetén. A felügyelt felhasználó csak ezen az eszközön érvényes.</translation>
+<translation id="2594049137847833442">Fontos webhelyek lehetőségei a Böngészési adatok törlése párbeszédpanelen.</translation>
 <translation id="2594056015203442344">Ha be van kapcsolva, a lapsoron található hangkijelzők hangnémító vezérlőkként is működnek. A művelet továbbá parancsokat ad a lap helyi menüjéhez, amellyel egyszerre több kiválasztott lap is gyorsan némítható.</translation>
 <translation id="259421303766146093">Kicsinyítés</translation>
 <translation id="2597852038534460976">A Chrome nem tudja elérni a háttérképeket. Kapcsolódjon egy hálózathoz.</translation>
@@ -1470,7 +1475,6 @@
 <translation id="3065140616557457172">Írja be a keresett kifejezést, vagy írja be a felkeresni kívánt URL-címet – mindkét lehetőség működik.</translation>
 <translation id="3067198360141518313">A plug-in futtatása</translation>
 <translation id="307519606911195071">További kisegítő lehetőségek engedélyezése a Beállítások oldalon.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> létrehozva felügyelt felhasználóként!</translation>
 <translation id="3075874217500066906">A Powerwash művelet elindításához újraindítás szükséges. Az újraindítás után a rendszer kéri a folytatás megerősítését.</translation>
 <translation id="3076677906922146425">Bárki hozzáadhat felhasználót a Chrome-ban</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1487,6 +1491,7 @@
 <translation id="3088034400796962477">Átírás (salam ← سلام)</translation>
 <translation id="3088325635286126843">Át&amp;nevezés...</translation>
 <translation id="308903551226753393">Beállítás automatikusan</translation>
+<translation id="3089231390674410424">Úgy tűnik, probléma van a hitelesítési adatokkal. Győződjön meg róla, hogy megfelelően bejelentkezett, majd próbálja újra.</translation>
 <translation id="3090819949319990166">A külső crx-fájl nem másolható a következő helyre: <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">„<ph name="DEVICE_NAME" />” párosítva</translation>
 <translation id="3092544800441494315">A következő képernyőkép mellékelése:</translation>
@@ -2014,7 +2019,6 @@
 <translation id="3790856258139356663">A Chrome-szinkronizálás végrehajtása érdekében csatlakozik a tesztszerverhez.</translation>
 <translation id="3790909017043401679">Adja meg a SIM-kártya PIN kódját</translation>
 <translation id="3792890930871100565">Nyomtatók leválasztása</translation>
-<translation id="3795681127952030401">A(z) <ph name="URL" /> értesítéseket szeretne küldeni Önnek.</translation>
 <translation id="3796648294839530037">Kedvenc hálózatok:</translation>
 <translation id="3797900183766075808">&amp;Keresés a(z) <ph name="SEARCH_ENGINE" /> keresőmotorral a következőre: <ph name="SEARCH_TERMS" /></translation>
 <translation id="3798449238516105146">Verzió</translation>
@@ -2486,6 +2490,7 @@
 <translation id="4552678318981539154">További tárhely vásárlása</translation>
 <translation id="4554591392113183336">A külső bővítmény a meglévő bővítmény verziószintjén vagy az alatt van.</translation>
 <translation id="4554796861933393312">Anyagszerű megjelenésű tintafolt animációs sebessége</translation>
+<translation id="4555670907822902621">A könyvjelzővel ellátott oldalak offline megtekintésre való letöltésének engedélyezése.</translation>
 <translation id="4555769855065597957">Árnyék</translation>
 <translation id="4556110439722119938">A böngésző szinkronizálni fogja a könyvjelzőket, az előzményeket, a jelszavakat és az egyéb beállításokat Google-fiókjával, hogy bármelyik eszközén hozzájuk férjen.</translation>
 <translation id="4557136421275541763">Figyelmeztetés:</translation>
@@ -2662,6 +2667,7 @@
 <translation id="4824518112777153488">A ráhúzást lehetővé tevő érintőképernyők támogatása</translation>
 <translation id="4830573902900904548">A(z) <ph name="DEVICE_TYPE" /> nem tud csatlakozni az internethez a következő hálózaton: <ph name="NETWORK_NAME" />. Kérjük, válasszon másik hálózatot. <ph name="LEARN_MORE_LINK_START" />További információ<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">A(z) <ph name="ORGANIZATION" /> identitását a(z) <ph name="LOCALITY" /> régióban <ph name="ISSUER" /> ellenőrizte. A szerver elérhetővé tette a tanúsítvány érvényes átláthatósági adatait.</translation>
+<translation id="4832537345877333532">Az ICC (színprofil)-fájlok Quirks Servertől való lekérésének letiltása a kijelző színkalibrálásánál.</translation>
 <translation id="4834912470034578916">Egyéni elrendezések engedélyezése a webes értesítéseknél.</translation>
 <translation id="4835836146030131423">Hiba a bejelentkezéskor.</translation>
 <translation id="4837926214103741331">Nem jogosult ennek az eszköznek a használatára. Bejelentkezési engedély kéréséhez vegye fel a kapcsolatot az eszköz tulajdonosával.</translation>
@@ -2849,6 +2855,7 @@
 <translation id="5120421890733714118">Bízzon meg ebben a tanúsítványban webhelyek azonosításakor.</translation>
 <translation id="5121130586824819730">A merevlemez megtelt. Kérjük, mentsen másik helyre, vagy szabadítson fel elegendő helyet a merevlemezen.</translation>
 <translation id="5125751979347152379">Érvénytelen URL</translation>
+<translation id="5126663277159826272">Quirks-ügyfél letiltása a kijelző kalibrálásánál.</translation>
 <translation id="5127881134400491887">Hálózati kapcsolatok kezelése</translation>
 <translation id="5128590998814119508">Kijelzőlista 2D vászon</translation>
 <translation id="512903556749061217">csatlakoztatva</translation>
@@ -2990,9 +2997,11 @@
 <translation id="5301751748813680278">Belépés vendégként.</translation>
 <translation id="5301954838959518834">Rendben, értem</translation>
 <translation id="5302048478445481009">Nyelv</translation>
+<translation id="5304039790201806037">Mutatóesemények</translation>
 <translation id="5305688511332277257">Nincs telepítve</translation>
 <translation id="5308380583665731573">Csatlakozás</translation>
 <translation id="5311260548612583999">Privátkulcs-fájl (nem kötelező):</translation>
+<translation id="5313967007315987356">Webhely hozzáadása</translation>
 <translation id="5316588172263354223">Hangalapú keresés bármikor</translation>
 <translation id="5316716239522500219">Monitorok tükrözése</translation>
 <translation id="5317780077021120954">Mentés</translation>
@@ -3296,6 +3305,7 @@
 <translation id="5734362860645681824">Kommunikáció</translation>
 <translation id="573719557377416048">Együttes jelenlét állapotának törlése</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: a szerkesztéshez válassza ki</translation>
+<translation id="5741454054957165976">A Felhasználói ügynök beavatkozásának (új verzió) engedélyezése a WebFonts betöltése esetén.</translation>
 <translation id="574392208103952083">Közepes</translation>
 <translation id="5745056705311424885">USB-memóriakártya észlelve</translation>
 <translation id="5746169159649715125">Mentés PDF-ként</translation>
@@ -3344,7 +3354,6 @@
 <translation id="5803531701633845775">Kifejezések kiválasztása hátulról, a kurzor mozgatása nélkül</translation>
 <translation id="5804241973901381774">Engedélyek</translation>
 <translation id="580571955903695899">Rendezés cím alapján</translation>
-<translation id="5808982448801399019">A hitelesítés sikertelen</translation>
 <translation id="580961539202306967">Kérdezzen meg, amikor egy webhely push üzeneteket szeretne küldeni nekem (ajánlott)</translation>
 <translation id="5815645614496570556">X.400 cím</translation>
 <translation id="5817397429773072584">Hagyományos kínai</translation>
@@ -3369,6 +3378,7 @@
 <translation id="5834581999798853053">Körülbelül <ph name="TIME" /> perc van hátra</translation>
 <translation id="5838825566232597749">USA „Workman” nemzetközi</translation>
 <translation id="5839277899276241121">Ugyanaz, mint a számlázási cím</translation>
+<translation id="5844550873065695788">Ezzel véglegesen töröl legalább <ph name="TOTAL_COUNT" /> elemet erről az eszközről. Az adatok későbbi lekéréséhez jelentkezzen be a Chrome-ba mint $2.</translation>
 <translation id="5846929185714966548">4. lap</translation>
 <translation id="5848934677402291689">A PDF-be mentés folyamatban van</translation>
 <translation id="5849335628409778954">Hitelkártya megadása…</translation>
@@ -3613,6 +3623,7 @@
 <translation id="6232017090690406397">Akkumulátor</translation>
 <translation id="6241530762627360640">A rendszerrel párosított Bluetooth-eszközökkel kapcsolatos információk elérése és a közeli Bluetooth-eszközök felderítése.</translation>
 <translation id="6243774244933267674">A szerver nem érhető el</translation>
+<translation id="6246413617632217567">Nem sikerült importálni a felügyelt felhasználót. Kérjük, ellenőrizze a merevlemezen rendelkezésre álló helyet és az engedélyeket, majd próbálja újra.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">A frissítés készen áll</translation>
 <translation id="6248400709929739064">Feliratok engedélyezése</translation>
@@ -3641,6 +3652,7 @@
 <translation id="6277518330158259200">&amp;Képernyőkép készítése</translation>
 <translation id="6279183038361895380">Az egérmutató megjelenítéséhez nyomja meg a következő billentyűt: |<ph name="ACCELERATOR" />|</translation>
 <translation id="6280215091796946657">Bejelentkezés másik fiókkal</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Arra irányuló kísérlet, hogy valamennyi API az elrendezés látható területét tükrözze – ennek hatására a window.scroll tulajdonságok az elrendezés látható területéhez fognak viszonyulni.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Új nyomtató a hálózaton}other{Új nyomtatók a hálózaton}}</translation>
 <translation id="6285395082104474418">Az állapottálca megjeleníti a hálózat, az akkumulátor és egyebek aktuális állapotát.</translation>
@@ -3696,6 +3708,7 @@
 <translation id="6380143666419481200">Elfogadás és folytatás</translation>
 <translation id="6380224340023442078">Tartalombeállítások...</translation>
 <translation id="6383194710567510941">A chrome.input.ime API használatának engedélyezése.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Ezzel véglegesen töröl legalább $1 elemet erről az eszközről. Az adatok későbbi lekéréséhez jelentkezzen be a Chrome-ba mint $2.}other{Ezzel véglegesen töröl legalább $1 elemet erről az eszközről. Az adatok későbbi lekéréséhez jelentkezzen be a Chrome-ba mint $2.}}</translation>
 <translation id="6384275966486438344">A keresési beállítások módosítása a következőre: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Az ebben az ablakban megtekintett oldalak a vendégmódban megnyitott ablakok bezárását követően nem fognak megjelenni a böngészési előzmények között, és nem hagynak egyéb nyomokat, például cookie-kat a számítógépen. Azonban az Ön által letöltött fájlokat a rendszer megőrzi.</translation>
 <translation id="6391538222494443604">Kell lennie beviteli könyvtárnak.</translation>
@@ -3834,6 +3847,7 @@
 <translation id="6575134580692778371">Nincs konfigurálva</translation>
 <translation id="6575251558004911012">Kérdezzen rá, amikor egy webhely hozzáférést kér a kamerához (ajánlott)</translation>
 <translation id="6579159469348633828">Brotli-tartalomkódolás.</translation>
+<translation id="6580151766480067746">ARC-verzió</translation>
 <translation id="6581162200855843583">Google Drive link</translation>
 <translation id="6583070985841601920"><ph name="USER_EMAIL_ADDRESS" /> néven jelentkezett be. Rendszergazdája kikapcsolta a szinkronizálást.</translation>
 <translation id="65832705307647870">Az Új lap oldal előre történő kitöltése népszerű webhelyekkel.</translation>
@@ -3999,6 +4013,7 @@
 <translation id="6847758263950452722">Oldal mentése MHTML-ként</translation>
 <translation id="6853388645642883916">A frissítő alvó módba került</translation>
 <translation id="68541483639528434">A többi lap bezárása</translation>
+<translation id="6856701878604560493">Offline könyvjelzők engedélyezése</translation>
 <translation id="6860097299815761905">Proxy-beállítások...</translation>
 <translation id="6860427144121307915">Megnyitás lapon</translation>
 <translation id="6862635236584086457">Az ebbe a mappába mentett minden fájlról online biztonsági másolat készül</translation>
@@ -4170,6 +4185,7 @@
 <translation id="7092106376816104">Előugró ablakok kivételei</translation>
 <translation id="7093866338626856921">Adatok cseréje a(z) <ph name="HOSTNAMES" /> nevű eszközökkel</translation>
 <translation id="7096082900368329802">Szívesen felfedezne további lélegzetelállító funkciókat is?</translation>
+<translation id="7096108453481049031">Nem sikerült a felügyelt felhasználó importálása. Ellenőrizze a hálózati kapcsolatot, és próbálja újra később.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> elem kiválasztva</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">További tárhely vásárlása...</translation>
@@ -4198,6 +4214,7 @@
 <translation id="713888829801648570">Jelszavát nem tudtuk ellenőrizni, mert offline állapotban van.</translation>
 <translation id="7140928199327930795">Nincs más elérhető eszköz.</translation>
 <translation id="7141105143012495934">A bejelentkezés nem sikerült, mert a fiókadatokat nem sikerült lekérni. Kérjük, forduljon rendszergazdájához, vagy próbálja újra.</translation>
+<translation id="7141331524324591758">Engedélyezi a Mutatóesemények API részleges kísérleti támogatását. Csak webfejlesztők tesztelési céljaira szánjuk, mert egyes webhelyeken kisebb hibák jelentkezhetnek.</translation>
 <translation id="7143207342074048698">Csatlakozás</translation>
 <translation id="7144878232160441200">Újra</translation>
 <translation id="7148311641502571842">A(z) <ph name="PLUGIN_NAME" /> plug-in le van tiltva. Újbóli engedélyezéséhez keresse fel a következő címet: <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4846,6 +4863,7 @@
 <translation id="8119572489781388874">Beállítások módosítása</translation>
 <translation id="8119631488458759651">webhely eltávolítása</translation>
 <translation id="8121385576314601440">Hangul beviteli beállítások</translation>
+<translation id="8122245494004914423">Ezzel az eszközön lévő összes böngészési adat véglegesen törlődik. Az adatok későbbi lekéréséhez jelentkezzen be a Chrome-ba mint $2.</translation>
 <translation id="8124313775439841391">Felügyelt ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Érvénytelen tanúsítványok engedélyezése a localhostról betöltött források esetében.</translation>
@@ -4930,6 +4948,7 @@
 <translation id="8226742006292257240">Alább látható a véletlenszerűen generált TPM-jelszó, amelyet a számítógépéhez rendeltünk:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" /> és <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Előfordulhat, hogy a(z) <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> webhely támadói veszélyes programokat kísérelnek meg telepíteni számítógépére, amelyek ellopják vagy törlik adatait (például fotóit, jelszavait, üzeneteit és hitelkártyaadatait).</translation>
+<translation id="8233254008506535819">A fontos webhelyek engedélyezőlistára helyezésének lehetősége a „Böngészési adatok törlése” párbeszédpanelen.</translation>
 <translation id="8236231079192337250">Chrome Internetes áruház Galéria – alkalmazás nyomtatóillesztőkhöz</translation>
 <translation id="8238649969398088015">Súgótipp</translation>
 <translation id="8240697550402899963">A klasszikus téma használata</translation>
@@ -5254,7 +5273,6 @@
 <translation id="8708671767545720562">&amp;További információ</translation>
 <translation id="8711402221661888347">Hamburger</translation>
 <translation id="8711453844311572806">Ha telefonját feloldotta, és az a közelben van, egyszerűen kattintson a belépéshez. Ellenkező esetben a zárolás ikonja jelenik meg, és be kell gépelnie a jelszavát.</translation>
-<translation id="8712637175834984815">Sikerült</translation>
 <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />Rendszeradatok<ph name="END_LINK1" /> küldése</translation>
 <translation id="8713979477561846077">Fizikai billentyűzet automatikus javításának engedélyezése USA-beli kiosztást használó billentyűzetek esetén, hogy javaslatok jelenjenek meg a fizikai billentyűzeten történő gépelés közben.</translation>
 <translation id="871476437400413057">Mentett Google-jelszavak</translation>
@@ -5617,6 +5635,7 @@
 <translation id="952992212772159698">Nincs aktiválva</translation>
 <translation id="953000875543358078">Ez körülbelül egy percet vehet igénybe</translation>
 <translation id="960987915827980018">Körülbelül 1 óra van hátra</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Ezzel véglegesen töröl $1 elemet erről az eszközről. Az adatok későbbi lekéréséhez jelentkezzen be a Chrome-ba mint $2.}other{Ezzel véglegesen töröl $1 elemet erről az eszközről. Az adatok későbbi lekéréséhez jelentkezzen be a Chrome-ba mint $2.}}</translation>
 <translation id="96421021576709873">Wi-Fi hálózat</translation>
 <translation id="965490406356730238">Hardveresen gyorsított mjpeg-dekódolás engedélyezése rögzített képkockánál, amennyiben lehetséges.</translation>
 <translation id="968174221497644223">Alkalmazás-gyorsítótár</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 0807b370..64077d9c 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -251,6 +251,7 @@
       Perhatikan bahwa Bluetooth akan diaktifkan untuk semua perangkat milik <ph name="USER_DISPLAY_EMAIL" /> yang kompatibel, dan beberapa informasi perangkat keras akan dikirim ke Google. &lt;a&gt;Pelajari lebih lanjut&lt;/a&gt;</translation>
 <translation id="13649080186077898">Kelola setelan IsiOtomatis</translation>
 <translation id="1367951781824006909">Pilih file</translation>
+<translation id="136802136832547685">Tidak ada pengguna yang dilindungi untuk ditambahkan ke perangkat ini.</translation>
 <translation id="1368265273904755308">Laporkan masalah</translation>
 <translation id="1368832886055348810">Kiri ke Kanan</translation>
 <translation id="1370646789215800222">Hapus orang?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Telusuri</translation>
 <translation id="1384211230590313258">Penangan Penemuan Layanan</translation>
 <translation id="1386387014181100145">Hai.</translation>
+<translation id="1386830813511981192">Lebih dari satu juta aplikasi dan game kini tersedia di <ph name="DEVICE_TYPE" /> Anda.</translation>
 <translation id="1389297115360905376">Yang seperti ini hanya dapat ditambahkan dari <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Buka sebagai Tab Biasa</translation>
 <translation id="1395262318152388157">Bilah geser</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">Batas kanan</translation>
 <translation id="2282146716419988068">Proses GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Versi baru Intervensi Agen Pengguna untuk pemuatan WebFont.</translation>
 <translation id="2286454467119466181">Sederhana</translation>
 <translation id="2286950485307333924">Anda sudah masuk ke Chrome</translation>
 <translation id="2287590536030307392">Matikan semua sambungan nirkabel.</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">Tabel Google</translation>
 <translation id="2546283357679194313">Cookie dan data situs</translation>
 <translation id="2549646943416322527">Pendeteksi Seccomp</translation>
+<translation id="2550212893339833758">Memori yang ditukar</translation>
 <translation id="2553100941515833716">Setel ulang status pemasangan Peluncur Aplikasi setiap dimulai ulang.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> tidak dapat menyambung ke <ph name="NETWORK_ID" />. Harap pilih jaringan lain atau coba lagi.</translation>
 <translation id="2553440850688409052">Sembunyikan Plugin Ini</translation>
@@ -1102,6 +1106,7 @@
 <translation id="2587203970400270934">Kode operator:</translation>
 <translation id="2587922270115112871">Dengan membuat pengguna yang dilindungi, Anda tidak membuat Akun Google, dan setelan
     serta datanya tidak akan mengikutinya ke perangkat lain dengan Penyinkronan Chrome. Pengguna yang diawasi hanya berlaku untuk perangkat ini.</translation>
+<translation id="2594049137847833442">Opsi situs yang penting pada dialog hapus data penjelajahan</translation>
 <translation id="2594056015203442344">Jika diaktifkan, indikator audio dalam tab setrip berfungsi ganda sebagai kontrol nonaktif audio tab.  Hal ini juga menambah perintah di menu konteks tab untuk dengan cepat menonaktifkan beberapa tab yang dipilih.</translation>
 <translation id="259421303766146093">Memperkecil</translation>
 <translation id="2597852038534460976">Chrome tidak dapat mengakses wallpaper. Sambungkan ke jaringan.</translation>
@@ -1469,7 +1474,6 @@
 <translation id="3065140616557457172">Ketik untuk mencari atau masukkan URL untuk menavigasi - semuanya dapat digunakan.</translation>
 <translation id="3067198360141518313">Jalankan plugin ini</translation>
 <translation id="307519606911195071">Mengaktifkan fitur aksesibilitas tambahan di laman Setelan.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> telah dibuat sebagai pengguna yang dilindungi!</translation>
 <translation id="3075874217500066906">Anda perlu memulai ulang untuk memulai proses Powerwash. Setelah proses mulai ulang, Anda akan diminta untuk mengonfirmasi apakah ingin melanjutkan.</translation>
 <translation id="3076677906922146425">Izinkan siapa pun menambahkan orang ke Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1486,6 +1490,7 @@
 <translation id="3088034400796962477">Transliterasi (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Ubah nama...</translation>
 <translation id="308903551226753393">Konfigurasi secara otomatis</translation>
+<translation id="3089231390674410424">Sepertinya ada masalah dengan kredensial Anda. Pastikan Anda masuk dengan benar lalu coba lagi.</translation>
 <translation id="3090819949319990166">Tidak dapat menyalin file crx eksternal ke <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" disandingkan</translation>
 <translation id="3092544800441494315">Sertakan tangkapan layar ini:</translation>
@@ -2013,7 +2018,6 @@
 <translation id="3790856258139356663">Menghubungkan ke server pengujian untuk Sinkronisasi Chrome.</translation>
 <translation id="3790909017043401679">Masukkan PIN kartu SIM</translation>
 <translation id="3792890930871100565">Lepaskan sambungan printer</translation>
-<translation id="3795681127952030401"><ph name="URL" /> ingin mengirimkan pemberitahuan kepada Anda.</translation>
 <translation id="3796648294839530037">Jaringan Favorit:</translation>
 <translation id="3797900183766075808">&amp;Menelusuri <ph name="SEARCH_ENGINE" /> untuk “<ph name="SEARCH_TERMS" />”</translation>
 <translation id="3798449238516105146">Versi</translation>
@@ -2487,6 +2491,7 @@
 <translation id="4552678318981539154">Beli penyimpanan lagi</translation>
 <translation id="4554591392113183336">Versi ekstensi eksternal sama atau lebih rendah dibandingkan yang sudah ada.</translation>
 <translation id="4554796861933393312">Kecepatan Animasi Tetesan Tinta Desain Material</translation>
+<translation id="4555670907822902621">Mengaktifkan penyimpanan laman yang dibookmark untuk dilihat saat offline.</translation>
 <translation id="4555769855065597957">Bayangan</translation>
 <translation id="4556110439722119938">Bookmark, riwayat, sandi, dan setelan lainnya akan disinkronkan ke Akun Google agar Anda dapat menggunakannya di semua perangkat</translation>
 <translation id="4557136421275541763">Peringatan:</translation>
@@ -2663,6 +2668,7 @@
 <translation id="4824518112777153488">Dukungan untuk layar sentuh yang dapat diarahkan</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> Anda tidak dapat menyambung ke internet menggunakan <ph name="NETWORK_NAME" />. Pilih jaringan lainnya. <ph name="LEARN_MORE_LINK_START" />Pelajari lebih lanjut<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Identitas <ph name="ORGANIZATION" /> di <ph name="LOCALITY" /> telah diverifikasi oleh <ph name="ISSUER" />. Informasi Transparansi Sertifikat yang valid diberikan oleh server.</translation>
+<translation id="4832537345877333532">Menonaktifkan pengambilan file tampilan icc dari Quirks Server untuk kalibrasi warna tampilan.</translation>
 <translation id="4834912470034578916">Aktifkan tata letak khusus untuk Pemberitahuan Web</translation>
 <translation id="4835836146030131423">Kesalahan masuk ke sistem.</translation>
 <translation id="4837926214103741331">Anda tidak diizinkan untuk menggunakan perangkat ini. Untuk izin masuk, hubungi pemilik perangkat.</translation>
@@ -2850,6 +2856,7 @@
 <translation id="5120421890733714118">Percayai sertifikat ini untuk mengidentifikasi situs web.</translation>
 <translation id="5121130586824819730">Hard disk Anda sudah penuh. Simpan ke lokasi lain atau kosongkan lebih banyak ruang pada hard disk.</translation>
 <translation id="5125751979347152379">URL tidak valid.</translation>
+<translation id="5126663277159826272">Nonaktifkan Quirks Client untuk kalibrasi tampilan.</translation>
 <translation id="5127881134400491887">Mengelola sambungan jaringan</translation>
 <translation id="5128590998814119508">Kanvas 2D daftar tampilan</translation>
 <translation id="512903556749061217">terpasang</translation>
@@ -2991,9 +2998,11 @@
 <translation id="5301751748813680278">Masuk sebagai Tamu.</translation>
 <translation id="5301954838959518834">Oke, mengerti</translation>
 <translation id="5302048478445481009">Bahasa</translation>
+<translation id="5304039790201806037">Kejadian Penunjuk</translation>
 <translation id="5305688511332277257">Tidak ada yang dipasang</translation>
 <translation id="5308380583665731573">Sambungkan</translation>
 <translation id="5311260548612583999">Kunci pribadi (opsional):</translation>
+<translation id="5313967007315987356">Tambahkan situs</translation>
 <translation id="5316588172263354223">Penelusuran suara kapan saja</translation>
 <translation id="5316716239522500219">Cerminkan monitor</translation>
 <translation id="5317780077021120954">Simpan</translation>
@@ -3296,6 +3305,7 @@
 <translation id="5734362860645681824">Komunikasi</translation>
 <translation id="573719557377416048">Hapus Status Kehadiran (Copresence)</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: pilih untuk mengedit</translation>
+<translation id="5741454054957165976">Mengaktifkan Versi baru Intervensi Agen Pengguna untuk pemuatan WebFont.</translation>
 <translation id="574392208103952083">Sedang</translation>
 <translation id="5745056705311424885">Stik memori USB terdeteksi.</translation>
 <translation id="5746169159649715125">Simpan sebagai PDF</translation>
@@ -3344,7 +3354,6 @@
 <translation id="5803531701633845775">Pilih frasa dari belakang, tanpa memindahkan kursor</translation>
 <translation id="5804241973901381774">Izin</translation>
 <translation id="580571955903695899">Susun Ulang menurut Judul</translation>
-<translation id="5808982448801399019">Otorisasi gagal</translation>
 <translation id="580961539202306967">Tanyakan kepada saya saat situs ingin mengirim pesan push (disarankan)</translation>
 <translation id="5815645614496570556">X.400 Address</translation>
 <translation id="5817397429773072584">China Aksara Tradisional</translation>
@@ -3369,6 +3378,7 @@
 <translation id="5834581999798853053">Sekitar <ph name="TIME" /> menit lagi</translation>
 <translation id="5838825566232597749">Internasional Workman AS</translation>
 <translation id="5839277899276241121">Sama dengan alamat penagihan</translation>
+<translation id="5844550873065695788">Tindakan ini akan menghapus setidaknya <ph name="TOTAL_COUNT" /> item dari perangkat ini secara permanen. Untuk mengambil data Anda nanti, masuk ke Chrome sebagai $2.</translation>
 <translation id="5846929185714966548">Tab 4</translation>
 <translation id="5848934677402291689">Menyimpan ke dalam bentuk PDF sedang berlangsung</translation>
 <translation id="5849335628409778954">Masukkan kartu kredit...</translation>
@@ -3613,6 +3623,7 @@
 <translation id="6232017090690406397">Baterai</translation>
 <translation id="6241530762627360640">Mengakses informasi tentang perangkat Bluetooth yang disandingkan dengan sistem Anda dan menemukan perangkat Bluetooth di sekitarnya.</translation>
 <translation id="6243774244933267674">Server tidak tersedia</translation>
+<translation id="6246413617632217567">Pengguna yang dilindungi tersebut tidak dapat diimpor. Periksa izin dan ruang hard drive Anda, lalu coba lagi.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Pembaruan siap</translation>
 <translation id="6248400709929739064">Aktifkan subtitel</translation>
@@ -3641,6 +3652,7 @@
 <translation id="6277518330158259200">Ambil Tangkapan Layar</translation>
 <translation id="6279183038361895380">Tekan |<ph name="ACCELERATOR" />| untuk menampilkan kursor</translation>
 <translation id="6280215091796946657">Masuk dengan akun lain</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Melakukan eksperimen agar semua API merefleksikan area pandang tata letak. Ini akan membuat properti jendela gulir relatif dengan area pandang tata letak.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Printer baru di jaringan Anda}other{Printer baru di jaringan Anda}}</translation>
 <translation id="6285395082104474418">Baki status menampilkan status saat ini atas jaringan, baterai, dan yang lainnya kepada Anda.</translation>
@@ -3696,6 +3708,7 @@
 <translation id="6380143666419481200">Setujui dan lanjutkan</translation>
 <translation id="6380224340023442078">Setelan konten...</translation>
 <translation id="6383194710567510941">Mengaktifkan penggunaan API chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Tindakan ini akan menghapus setidaknya $1 item dari perangkat ini secara permanen. Untuk mengambil data Anda nanti, masuk ke Chrome sebagai $2.}other{Tindakan ini akan menghapus setidaknya $1 item dari perangkat ini secara permanen. Untuk mengambil data Anda nanti, masuk ke Chrome sebagai $2.}}</translation>
 <translation id="6384275966486438344">Ubah setelan penelusuran Anda menjadi: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Laman yang Anda lihat di jendela ini tidak akan muncul dalam riwayat browser dan tidak meninggalkan jejak lain, seperti cookie, di komputer setelah Anda menutup semua jendela Tamu yang terbuka. Namun, file apa pun yang Anda unduh akan tersimpan.</translation>
 <translation id="6391538222494443604">Direktori masukan harus ada.</translation>
@@ -3834,6 +3847,7 @@
 <translation id="6575134580692778371">Tidak dikonfigurasi</translation>
 <translation id="6575251558004911012">Tanyakan saat situs memerlukan akses ke kamera (disarankan)</translation>
 <translation id="6579159469348633828">Enkode Konten Brotli.</translation>
+<translation id="6580151766480067746">Versi ARC</translation>
 <translation id="6581162200855843583">Tautan Google Drive</translation>
 <translation id="6583070985841601920">Masuk sebagai <ph name="USER_EMAIL_ADDRESS" />. Sinkronisasi dinonaktifkan oleh administrator Anda.</translation>
 <translation id="65832705307647870">Isi laman Tab Baru terlebih dahulu dengan situs populer.</translation>
@@ -3999,6 +4013,7 @@
 <translation id="6847758263950452722">Simpan Laman sebagai MHTML</translation>
 <translation id="6853388645642883916">Updater dalam mode tidur</translation>
 <translation id="68541483639528434">Tutup tab lain</translation>
+<translation id="6856701878604560493">Aktifkan bookmark offline</translation>
 <translation id="6860097299815761905">Setelan proxy...</translation>
 <translation id="6860427144121307915">Buka di Tab</translation>
 <translation id="6862635236584086457">Semua file yang disimpan dalam folder ini otomatis dicadangkan secara online</translation>
@@ -4170,6 +4185,7 @@
 <translation id="7092106376816104">Pengecualian munculan</translation>
 <translation id="7093866338626856921">Menukar data dengan perangkat yang bernama: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Ingin menemukan fitur yang lebih hebat?</translation>
+<translation id="7096108453481049031">Pengguna baru yang dilindungi tersebut tidak dapat diimpor. Periksa sambungan jaringan Anda dan coba lagi.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> item dipilih</translation>
 <translation id="710227449793100220">Pengikatan Token.</translation>
 <translation id="7106346894903675391">Beli penyimpanan lagi...</translation>
@@ -4198,6 +4214,7 @@
 <translation id="713888829801648570">Maaf, sandi Anda tidak dapat diverifikasi karena Anda tidak tersambung ke internet.</translation>
 <translation id="7140928199327930795">Tidak ada perangkat lain.</translation>
 <translation id="7141105143012495934">Proses masuk gagal karena detail akun Anda tidak dapat diambil. Hubungi administrator Anda atau coba lagi.</translation>
+<translation id="7141331524324591758">Mengaktifkan dukungan eksperimental sebagian untuk API Kejadian Penunjuk.  Hal ini hanya ditujukan untuk pengujian oleh pengembang web, yang akan menyebabkan beberapa situs web rusak secara tersembunyi.</translation>
 <translation id="7143207342074048698">Menyambungkan</translation>
 <translation id="7144878232160441200">Coba lagi</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> telah dinonaktifkan. Untuk mengaktifkannya kembali, buka <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4846,6 +4863,7 @@
 <translation id="8119572489781388874">Mengubah setelan</translation>
 <translation id="8119631488458759651">hapus situs ini</translation>
 <translation id="8121385576314601440">Setelan masukan Hangul</translation>
+<translation id="8122245494004914423">Tindakan ini akan menghapus data penjelajahan Anda dari perangkat ini secara permanen. Untuk mengambil data Anda nanti, masuk ke Chrome sebagai $2.</translation>
 <translation id="8124313775439841391">ONC yang dikelola</translation>
 <translation id="8126844665673008223">Bluetooth Web</translation>
 <translation id="8127322077195964840">Izinkan sertifikat yang tidak valid untuk sumber daya dimuat dari localhost.</translation>
@@ -4930,6 +4948,7 @@
 <translation id="8226742006292257240">Di bawah adalah sandi TPM yang dibuat secara acak yang telah ditetapkan untuk komputer Anda:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Saat ini penyerang yang berada pada <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> mungkin berusaha memasang program berbahaya di komputer Anda yang dapat mencuri dan menghapus informasi Anda (misalnya, foto, sandi, pesan, dan kartu kredit).</translation>
+<translation id="8233254008506535819">Menyertakan opsi untuk memasukkan situs yang penting ke daftar putih pada dialog hapus data penjelajahan.</translation>
 <translation id="8236231079192337250">Aplikasi Galeri Toko Web Chrome untuk driver printer</translation>
 <translation id="8238649969398088015">Kiat bantuan</translation>
 <translation id="8240697550402899963">Gunakan tema Klasik</translation>
@@ -5253,7 +5272,6 @@
 <translation id="8708671767545720562">Informasi Selengkapnya</translation>
 <translation id="8711402221661888347">Burger</translation>
 <translation id="8711453844311572806">Jika ponsel terbuka dan berada di dekat Anda, cukup klik untuk masuk. Jika tidak, Anda akan melihat ikon terkunci dan perlu memasukkan sandi.</translation>
-<translation id="8712637175834984815">Mengerti</translation>
 <translation id="8713570323158206935">Kirim <ph name="BEGIN_LINK1" />sistem informasi<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Aktifkan koreksi otomatis keyboard fisik untuk keyboard AS, yang dapat memberikan saran saat mengetik di keyboard fisik.</translation>
 <translation id="871476437400413057">Sandi yang disimpan Google</translation>
@@ -5616,6 +5634,7 @@
 <translation id="952992212772159698">Tidak diaktifkan</translation>
 <translation id="953000875543358078">Tindakan ini dapat memakan waktu beberapa menit</translation>
 <translation id="960987915827980018">Sekitar 1 jam lagi</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Tindakan ini akan menghapus $1 item dari perangkat ini secara permanen. Untuk mengambil data Anda nanti, masuk ke Chrome sebagai $2.}other{Tindakan ini akan menghapus $1 item dari perangkat ini secara permanen. Untuk mengambil data Anda nanti, masuk ke Chrome sebagai $2.}}</translation>
 <translation id="96421021576709873">Jaringan Wi-Fi</translation>
 <translation id="965490406356730238">Mengaktifkan dekode mjpeg dengan percepatan perangkat keras untuk bingkai yang dijepret jika tersedia.</translation>
 <translation id="968174221497644223">Cache aplikasi</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 3cc3fe6f..f9459dd04 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -251,6 +251,7 @@
 Tieni presente che il Bluetooth verrà attivato per tutti i dispositivi compatibili di <ph name="USER_DISPLAY_EMAIL" /> e che verranno inviate alcune informazioni sull'hardware a Google. &lt;a&gt;Ulteriori informazioni&lt;/a&gt;</translation>
 <translation id="13649080186077898">Gestisci impostazioni di Compilazione automatica</translation>
 <translation id="1367951781824006909">Scegli un file</translation>
+<translation id="136802136832547685">Nessun utente supervisionato da aggiungere a questo dispositivo.</translation>
 <translation id="1368265273904755308">Consente di segnalare un problema</translation>
 <translation id="1368832886055348810">Da sinistra a destra</translation>
 <translation id="1370646789215800222">Rimuovere la persona?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Cerca</translation>
 <translation id="1384211230590313258">Service Discovery Handler</translation>
 <translation id="1386387014181100145">Salve.</translation>
+<translation id="1386830813511981192">Attualmente è disponibile più di un milione di app e giochi per il tuo dispositivo <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">È possibile aggiungerla soltanto dal <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Apri in una scheda normale</translation>
 <translation id="1395262318152388157">Dispositivo di scorrimento</translation>
@@ -891,6 +893,7 @@
 <translation id="2280486287150724112">Margine destro</translation>
 <translation id="2282146716419988068">Processo GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Nuova versione di intervento di user-agent per il caricamento di web font.</translation>
 <translation id="2286454467119466181">Semplice</translation>
 <translation id="2286950485307333924">Hai eseguito l'accesso a Chrome</translation>
 <translation id="2287590536030307392">Disattiva tutte le connessioni wireless.</translation>
@@ -1068,6 +1071,7 @@
 <translation id="2542049655219295786">Tabella Google</translation>
 <translation id="2546283357679194313">Cookie e dati dei siti</translation>
 <translation id="2549646943416322527">Seccomp Detector</translation>
+<translation id="2550212893339833758">Memoria sostituita</translation>
 <translation id="2553100941515833716">Reimposta stato installazione di Avvio applicazioni a ogni riavvio.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> non è riuscito a collegarsi a <ph name="NETWORK_ID" />. Seleziona un'altra rete o riprova.</translation>
 <translation id="2553440850688409052">Nascondi questo plug-in</translation>
@@ -1100,6 +1104,7 @@
 <translation id="2585300050980572691">Impostazioni di ricerca predefinite</translation>
 <translation id="2587203970400270934">Codice operatore:</translation>
 <translation id="2587922270115112871">La creazione di un utente supervisionato non comporta la creazione di un account Google e i relativi dati e le impostazioni non saranno disponibili su altri dispositivi grazie alla Sincronizzazione Google Chrome. Un utente supervisionato viene configurato soltanto su questo dispositivo.</translation>
+<translation id="2594049137847833442">Opzioni relative a siti importanti nella finestra di dialogo Cancella dati di navigazione</translation>
 <translation id="2594056015203442344">Se viene attivata questa opzione, gli indicatori dell'audio nella tabstrip consentono anche di disattivare l'audio delle schede. Vengono inoltre aggiunti comandi nel menu contestuale delle schede per disattivare rapidamente l'audio di diverse schede selezionate.</translation>
 <translation id="259421303766146093">Annulla ingrandimento</translation>
 <translation id="2597852038534460976">Impossibile accedere agli sfondi in Chrome. Collegati a una rete.</translation>
@@ -1467,7 +1472,6 @@
 <translation id="3065140616557457172">Digita i termini di ricerca o inserisci un URL per navigare. Entrambe le soluzioni funzionano.</translation>
 <translation id="3067198360141518313">Esegui questo plug-in</translation>
 <translation id="307519606911195071">Abilita altre funzioni di accessibilità nella pagina Impostazioni.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> è stato creato come utente supervisionato.</translation>
 <translation id="3075874217500066906">È necessario riavviare per iniziare la procedura di Powerwash. Dopo il riavvio ti verrà chiesto di confermare di voler procedere.</translation>
 <translation id="3076677906922146425">Consenti a tutti di aggiungere una persona su Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1484,6 +1488,7 @@
 <translation id="3088034400796962477">Traslitterazione (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Rinomina...</translation>
 <translation id="308903551226753393">Configura automaticamente</translation>
+<translation id="3089231390674410424">Risulta che ci sia un problema con le tue credenziali. Assicurati di avere eseguito correttamente l'accesso e riprova.</translation>
 <translation id="3090819949319990166">Impossibile copiare il file crx esterno su <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" accoppiato</translation>
 <translation id="3092544800441494315">Includi questo screenshot:</translation>
@@ -2009,7 +2014,6 @@
 <translation id="3790856258139356663">Consente di collegarsi al server di test per Sincronizzazione Chrome.</translation>
 <translation id="3790909017043401679">Inserisci il PIN della scheda SIM</translation>
 <translation id="3792890930871100565">Scollega stampanti</translation>
-<translation id="3795681127952030401"><ph name="URL" /> desidera inviarti notifiche.</translation>
 <translation id="3796648294839530037">Reti preferite:</translation>
 <translation id="3797900183766075808">&amp;Cerca <ph name="SEARCH_ENGINE" /> con "<ph name="SEARCH_TERMS" />"</translation>
 <translation id="3798449238516105146">Versione</translation>
@@ -2483,6 +2487,7 @@
 <translation id="4552678318981539154">Acquista più spazio di archiviazione</translation>
 <translation id="4554591392113183336">La versione dell'estensione esterna è pari o precedente a quella dell'estensione esistente.</translation>
 <translation id="4554796861933393312">Velocità animazione goccia d'inchiostro material design</translation>
+<translation id="4555670907822902621">Attiva il salvataggio dei preferiti per la visualizzazione offline.</translation>
 <translation id="4555769855065597957">Ombra</translation>
 <translation id="4556110439722119938">I tuoi preferiti, la cronologia, le password e altre impostazioni verranno sincronizzati con il tuo account Google per consentirti di utilizzarli su tutti i tuoi dispositivi</translation>
 <translation id="4557136421275541763">Avviso:</translation>
@@ -2656,6 +2661,7 @@
 <translation id="4824518112777153488">Supporto di touchscreen sensibili al passaggio del puntatore del mouse</translation>
 <translation id="4830573902900904548">Il <ph name="DEVICE_TYPE" /> non è in grado di connettersi a Internet utilizzando <ph name="NETWORK_NAME" />. Scegli un'altra rete. <ph name="LEARN_MORE_LINK_START" />Ulteriori informazioni<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">L'identità di <ph name="ORGANIZATION" /> a <ph name="LOCALITY" /> è stata verificata da <ph name="ISSUER" />. Sono state fornite informazioni su Certificate Transparency valide dal server.</translation>
+<translation id="4832537345877333532">Disattiva recupero file icc dello schermo da Quirks Server per la calibrazione dei colori.</translation>
 <translation id="4834912470034578916">Abilita layout personalizzati per le notifiche web.</translation>
 <translation id="4835836146030131423">Errore durante l'accesso.</translation>
 <translation id="4837926214103741331">Non sei autorizzato a utilizzare questo dispositivo. Per ottenere l'autorizzazione di accesso contatta il proprietario del dispositivo.</translation>
@@ -2843,6 +2849,7 @@
 <translation id="5120421890733714118">Considera attendibile questo certificato per l'identificazione dei siti web.</translation>
 <translation id="5121130586824819730">Il disco rigido è pieno. Salva in un'altra posizione o libera spazio sul disco rigido.</translation>
 <translation id="5125751979347152379">URL non valido.</translation>
+<translation id="5126663277159826272">Disattiva calibrazione dello schermo per Quirks Client.</translation>
 <translation id="5127881134400491887">Gestione di connessioni di rete</translation>
 <translation id="5128590998814119508">Canvas 2D elenchi visualizzazione</translation>
 <translation id="512903556749061217">collegato</translation>
@@ -2984,9 +2991,11 @@
 <translation id="5301751748813680278">Accesso come Ospite.</translation>
 <translation id="5301954838959518834">OK</translation>
 <translation id="5302048478445481009">Lingua</translation>
+<translation id="5304039790201806037">Pointer Events</translation>
 <translation id="5305688511332277257">Nessuno installato</translation>
 <translation id="5308380583665731573">Connessione</translation>
 <translation id="5311260548612583999">File chiave privata (facoltativo):</translation>
+<translation id="5313967007315987356">Aggiungi sito</translation>
 <translation id="5316588172263354223">Ricerche vocali in qualsiasi momento</translation>
 <translation id="5316716239522500219">Consente di duplicare i monitor</translation>
 <translation id="5317780077021120954">Salva</translation>
@@ -3289,6 +3298,7 @@
 <translation id="5734362860645681824">Comunicazioni</translation>
 <translation id="573719557377416048">Cancella stato compresenza</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: seleziona per modificare</translation>
+<translation id="5741454054957165976">Attiva nuova versione di intervento di user-agent per il caricamento di web font.</translation>
 <translation id="574392208103952083">Medie</translation>
 <translation id="5745056705311424885">Chiavetta USB rilevata</translation>
 <translation id="5746169159649715125">Salva come PDF</translation>
@@ -3337,7 +3347,6 @@
 <translation id="5803531701633845775">Scegli frasi da dietro senza spostare il cursore</translation>
 <translation id="5804241973901381774">Autorizzazioni</translation>
 <translation id="580571955903695899">Riordina per titolo</translation>
-<translation id="5808982448801399019">Autorizzazione non riuscita</translation>
 <translation id="580961539202306967">Chiedimi quando un sito desidera inviarmi messaggi push (consigliato)</translation>
 <translation id="5815645614496570556">Indirizzo X.400</translation>
 <translation id="5817397429773072584">Cinese tradizionale</translation>
@@ -3362,6 +3371,7 @@
 <translation id="5834581999798853053">Circa <ph name="TIME" /> minuti rimanenti</translation>
 <translation id="5838825566232597749">Internazionale Workman USA</translation>
 <translation id="5839277899276241121">Uguale all'indirizzo di fatturazione</translation>
+<translation id="5844550873065695788">Verranno eliminati definitivamente almeno <ph name="TOTAL_COUNT" /> elementi da questo dispositivo. Per recuperare i dati in un secondo momento, accedi a Chrome come $2.</translation>
 <translation id="5846929185714966548">Scheda 4</translation>
 <translation id="5848934677402291689">Salvataggio in formato PDF in corso</translation>
 <translation id="5849335628409778954">Inserisci carta di credito...</translation>
@@ -3606,6 +3616,7 @@
 <translation id="6232017090690406397">Batteria</translation>
 <translation id="6241530762627360640">Accedere a informazioni sui dispositivi Bluetooth accoppiati con il sistema e rilevare dispositivi Bluetooth nelle vicinanze.</translation>
 <translation id="6243774244933267674">Server non disponibile</translation>
+<translation id="6246413617632217567">Impossibile importare l'utente supervisionato. Controlla lo spazio disponibile sul disco rigido e le autorizzazioni, quindi riprova.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Aggiornamento pronto</translation>
 <translation id="6248400709929739064">Attiva i sottotitoli</translation>
@@ -3634,6 +3645,7 @@
 <translation id="6277518330158259200">&amp;Acquisisci screenshot</translation>
 <translation id="6279183038361895380">Premi |<ph name="ACCELERATOR" />| per mostrare il puntatore</translation>
 <translation id="6280215091796946657">Accedi con un altro account</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Un esperimento per applicare l'area visibile del layout in tutte le API. Le proprietà window.scroll diventeranno relative rispetto all'area visibile del layout.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nuova stampante in rete}other{Nuove stampanti in rete}}</translation>
 <translation id="6285395082104474418">Nella barra di stato viene indicato lo stato corrente della rete, della batteria e di altri elementi.</translation>
@@ -3689,6 +3701,7 @@
 <translation id="6380143666419481200">Accetta e continua</translation>
 <translation id="6380224340023442078">Impostazioni contenuti...</translation>
 <translation id="6383194710567510941">Consente di attivare l'utilizzo dell'API chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Verrà eliminato almeno $1 elemento da questo dispositivo. Per recuperare i dati in un secondo momento, accedi a Chrome come $2.}other{Verranno eliminati almeno $1 elementi da questo dispositivo. Per recuperare i dati in un secondo momento, accedi a Chrome come $2.}}</translation>
 <translation id="6384275966486438344">Modifica delle impostazioni di ricerca per: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Le pagine visualizzate in questa finestra non verranno memorizzate nella cronologia del browser e non lasceranno altre tracce, ad esempio cookie, sul computer dopo la chiusura di tutte le finestre Ospite aperte. Tutti i file scaricati verranno comunque conservati.</translation>
 <translation id="6391538222494443604">La directory di input deve essere esistente.</translation>
@@ -3827,6 +3840,7 @@
 <translation id="6575134580692778371">Non configurata</translation>
 <translation id="6575251558004911012">Chiedi quando un sito richiede l'accesso alla fotocamera (opzione consigliata)</translation>
 <translation id="6579159469348633828">Codifica dei contenuti Brotli.</translation>
+<translation id="6580151766480067746">Versione ARC</translation>
 <translation id="6581162200855843583">Link Google Drive</translation>
 <translation id="6583070985841601920">Accesso eseguito come <ph name="USER_EMAIL_ADDRESS" />. La sincronizzazione è stata disattivata dall'amministratore.</translation>
 <translation id="65832705307647870">Inserisci automaticamente siti famosi nella pagina Nuova scheda.</translation>
@@ -3993,6 +4007,7 @@
 <translation id="6847758263950452722">Salva pagina in MHTML</translation>
 <translation id="6853388645642883916">Programma di aggiornamento in sospensione</translation>
 <translation id="68541483639528434">Chiudi le altre schede</translation>
+<translation id="6856701878604560493">Attiva preferiti offline</translation>
 <translation id="6860097299815761905">Impostazioni proxy...</translation>
 <translation id="6860427144121307915">Apri in una scheda</translation>
 <translation id="6862635236584086457">Per tutti i file salvati in questa cartella viene effettuato automaticamente il backup online</translation>
@@ -4164,6 +4179,7 @@
 <translation id="7092106376816104">Eccezioni popup</translation>
 <translation id="7093866338626856921">Scambio di dati con i dispositivi: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Vuoi scoprire altre funzionalità straordinarie?</translation>
+<translation id="7096108453481049031">Impossibile importare l'utente supervisionato. Controlla la connessione di rete e riprova più tardi.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> elementi selezionati</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Acquista più spazio di archiviazione...</translation>
@@ -4192,6 +4208,7 @@
 <translation id="713888829801648570">Spiacenti, impossibile verificare la password perché sei offline.</translation>
 <translation id="7140928199327930795">Non ci sono altri dispositivi disponibili.</translation>
 <translation id="7141105143012495934">Accesso non riuscito perché non è stato possibile recuperare i dati dell'account. Contatta l'amministratore o riprova.</translation>
+<translation id="7141331524324591758">Attiva il supporto sperimentale parziale dell'API Pointer Events. È pensato unicamente per essere testato dagli sviluppatori, danneggia lievemente alcuni siti web.</translation>
 <translation id="7143207342074048698">Connessione</translation>
 <translation id="7144878232160441200">Riprova</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> è stato disattivato. Per riattivarlo, visita la pagina all'indirizzo <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4831,6 +4848,7 @@
 <translation id="8119572489781388874">Modifica impostazioni</translation>
 <translation id="8119631488458759651">rimuovi questo sito</translation>
 <translation id="8121385576314601440">Impostazioni di immissione hangul</translation>
+<translation id="8122245494004914423">Verranno eliminati definitivamente i tuoi dati di navigazione da questo dispositivo. Per recuperare i dati in un secondo momento, accedi a Chrome come $2.</translation>
 <translation id="8124313775439841391">ONC gestito</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Consenti certificati non validi per risorse caricate da localhost.</translation>
@@ -4915,6 +4933,7 @@
 <translation id="8226742006292257240">Di seguito viene indicata la password TPM generata in modo casuale che è stata assegnata al tuo computer:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">I malintenzionati attualmente sul sito <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> potrebbero tentare di installare sul tuo computer programmi pericolosi che scoprono o eliminano i tuoi dati (ad esempio foto, password, messaggi e carte di credito).</translation>
+<translation id="8233254008506535819">Includi l'opzione per autorizzare i siti importanti nella finestra di dialogo Cancella dati di navigazione.</translation>
 <translation id="8236231079192337250">App Chrome Web Store Gallery per driver per stampanti</translation>
 <translation id="8238649969398088015">Suggerimento utile</translation>
 <translation id="8240697550402899963">Utilizza tema Classic</translation>
@@ -5238,7 +5257,6 @@
 <translation id="8708671767545720562">Ulteriori infor&amp;mazioni</translation>
 <translation id="8711402221661888347">Sottaceto</translation>
 <translation id="8711453844311572806">Quando il telefono è sbloccato e nelle vicinanze, è sufficiente fare clic per accedere. In caso contrario, è visualizzata l'icona di blocco e devi digitare la password.</translation>
-<translation id="8712637175834984815">Fatto</translation>
 <translation id="8713570323158206935">Invia <ph name="BEGIN_LINK1" />informazioni sul sistema<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Consente di attivare la correzione automatica per la tastiera fisica americana, che può fornire suggerimenti durante la digitazione con la tastiera fisica.</translation>
 <translation id="871476437400413057">Password Google salvate</translation>
@@ -5601,6 +5619,7 @@
 <translation id="952992212772159698">Non attivo</translation>
 <translation id="953000875543358078">L'operazione potrebbe richiedere fino a un minuto o poco più</translation>
 <translation id="960987915827980018">Circa un'ora rimanente</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Verrà eliminato definitivamente $1 elemento da questo dispositivo. Per recuperare i dati in un secondo momento, accedi a Chrome come $2.}other{Verranno eliminati definitivamente $1 elementi da questo dispositivo. Per recuperare i dati in un secondo momento, accedi a Chrome come $2.}}</translation>
 <translation id="96421021576709873">Rete Wi-Fi</translation>
 <translation id="965490406356730238">Abilita la codifica mjpeg con accelerazione hardware per il frame acquisito, se disponibile.</translation>
 <translation id="968174221497644223">Cache applicazione</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 785c11c..74d428a 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -250,6 +250,7 @@
 <translation id="1364639026564874341">‏השאר את מכשיר ה-<ph name="DEVICE_TYPE" /> לא נעול כל עוד הטלפון נמצא בקרבת מקום ואינו נעול. שים לב - Bluetooth יופעל בכל המכשירים התואמים של <ph name="USER_DISPLAY_EMAIL" />פרטי חומרה מסוימים יישלחו אל Google. &lt;a&gt;למידע נוסף&lt;/a&gt;</translation>
 <translation id="13649080186077898">נהל הגדרות של 'מילוי אוטומטי'</translation>
 <translation id="1367951781824006909">בחר קובץ</translation>
+<translation id="136802136832547685">לא נמצאו משתמשים בפיקוח שניתן להוסיף למכשיר זה.</translation>
 <translation id="1368265273904755308">דווח על בעיה</translation>
 <translation id="1368832886055348810">משמאל לימין</translation>
 <translation id="1370646789215800222">האם להסיר את המשתמש?</translation>
@@ -263,6 +264,7 @@
 <translation id="1383876407941801731">חפש</translation>
 <translation id="1384211230590313258">מטפל באיתור שירותים</translation>
 <translation id="1386387014181100145">אהלן.</translation>
+<translation id="1386830813511981192">יותר ממיליון אפליקציות ומשחקים זמינים כעת ב-<ph name="DEVICE_TYPE" /> שלך.</translation>
 <translation id="1389297115360905376">ניתן להוסיף רק מ-<ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">פתח ככרטיסייה רגילה</translation>
 <translation id="1395262318152388157">מחוון חיפוש</translation>
@@ -883,6 +885,7 @@
 <translation id="2280486287150724112">שוליים ימניים</translation>
 <translation id="2282146716419988068">‏תהליך GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">‏טעינת גירסה חדשה של התערבות סוכן משתמש ל-WebFonts.</translation>
 <translation id="2286454467119466181">פשוט</translation>
 <translation id="2286950485307333924">‏אתה מחובר כעת ל-Chrome</translation>
 <translation id="2287590536030307392">כבה את כל החיבורים האלחוטיים.</translation>
@@ -1060,6 +1063,7 @@
 <translation id="2542049655219295786">‏טבלה של Google</translation>
 <translation id="2546283357679194313">‏נתוני אתר וקובצי Cookie</translation>
 <translation id="2549646943416322527">‏מאתר Seccomp</translation>
+<translation id="2550212893339833758">זיכרון מוחלף</translation>
 <translation id="2553100941515833716">אפס את מצב ההתקנה של מפעיל היישומים בכל אתחול.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> לא הצליח להתחבר אל <ph name="NETWORK_ID" />. בחר רשת אחרת או נסה שוב.</translation>
 <translation id="2553440850688409052">הסתר פלאגין זה</translation>
@@ -1093,6 +1097,7 @@
 <translation id="2587203970400270934">קוד מפעיל:</translation>
 <translation id="2587922270115112871">‏יצירת משתמש בפיקוח אינה גורמת ליצירת חשבון Google, וההגדרות
     והנתונים של המשתמש בפיקוח לא יעברו איתו למכשירים אחרים באמצעות סנכרון Chrome. הגדרת משתמש בפיקוח חלה על מכשיר זה בלבד.</translation>
+<translation id="2594049137847833442">אפשרויות אתר חשובות בתיבת הדו-שיח 'נקה נתוני גלישה'</translation>
 <translation id="2594056015203442344">כאשר הם מופעלים, סימני האודיו החזותיים ברצועת הכרטיסייה משמשים כפקדי השתקת אודיו. נוספות גם פקודות בתפריט ההקשר של הכרטיסייה להשתקה של כרטיסיות מרובות שנבחרו.</translation>
 <translation id="259421303766146093">בטל הגדלה</translation>
 <translation id="2597852038534460976">‏Chrome לא יכול לגשת לטפטים. התחבר לרשת.</translation>
@@ -1460,7 +1465,6 @@
 <translation id="3065140616557457172">הקלד לחיפוש או הזן כתובת אתר לניווט - שניהם עובדים.</translation>
 <translation id="3067198360141518313">הרץ פלאגין זה</translation>
 <translation id="307519606911195071">הפעל תכונות נגישות נוספות בדף ההגדרות.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> נוצר כמשתמש בפיקוח!</translation>
 <translation id="3075874217500066906">‏נדרשת הפעלה מחדש על מנת להתחיל את תהליך ה-Powerwash. לאחר ההפעלה מחדש תתבקש לאשר שברצונך להמשיך.</translation>
 <translation id="3076677906922146425">‏אפשר לכולם להוסיף אדם ב-Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1477,6 +1481,7 @@
 <translation id="3088034400796962477">‏תעתוק (‎سلام ← salam)</translation>
 <translation id="3088325635286126843">&amp;שנה שם...</translation>
 <translation id="308903551226753393">הגדר באופן אוטומטי</translation>
+<translation id="3089231390674410424">נראה שישנה בעיה עם פרטי הכניסה שלך. ודא שאתה מחובר למערכת כהלכה ונסה שוב.</translation>
 <translation id="3090819949319990166">‏לא ניתן להעתיק קובץ crx חיצוני ל-<ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" מותאם</translation>
 <translation id="3092544800441494315">כלול צילום מסך זה:</translation>
@@ -2003,7 +2008,6 @@
 <translation id="3790856258139356663">‏מתחבר אל שרת הבדיקה של סנכרון Chrome.</translation>
 <translation id="3790909017043401679">‏הזן PIN של כרטיס SIM</translation>
 <translation id="3792890930871100565">נתק מדפסות</translation>
-<translation id="3795681127952030401"><ph name="URL" /> רוצה לשלוח לך הודעות.</translation>
 <translation id="3796648294839530037">רשתות מועדפות:</translation>
 <translation id="3797900183766075808">&amp;חפש ב-<ph name="SEARCH_ENGINE" /> אחר '<ph name="SEARCH_TERMS" />'</translation>
 <translation id="3798449238516105146">גרסה</translation>
@@ -2477,6 +2481,7 @@
 <translation id="4552678318981539154">קנה עוד שטח אחסון</translation>
 <translation id="4554591392113183336">התוסף החיצוני הוא מגרסה זהה או קודמת לזו של התוסף הקיים.</translation>
 <translation id="4554796861933393312">מהירות אנימציה של טיפת דיו בעיצוב חדשני תלת-ממדי</translation>
+<translation id="4555670907822902621">מאפשר שמירת דפים שנוספו לסימניות לצפייה לא מקוונת.</translation>
 <translation id="4555769855065597957">צל</translation>
 <translation id="4556110439722119938">‏הסימניות, ההיסטוריה, הסיסמאות והגדרות נוספות יסונכרנו עם חשבון Google, כך שתוכל להשתמש בהם בכל המכשירים שלך.</translation>
 <translation id="4557136421275541763">אזהרה:</translation>
@@ -2653,6 +2658,7 @@
 <translation id="4824518112777153488">תמיכה במסכי מגע שמאפשרים להעביר את האצבע מעל פריטים במסך</translation>
 <translation id="4830573902900904548">ה-<ph name="DEVICE_TYPE" /> לא מצליח להתחבר אל האינטרנט באמצעות <ph name="NETWORK_NAME" />. בחר רשת אחרת. <ph name="LEARN_MORE_LINK_START" />למידע נוסף<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">הזהות של <ph name="ORGANIZATION" /> במיקום <ph name="LOCALITY" /> אומתה על ידי <ph name="ISSUER" />. השרת סיפק מידע שקיפות חוקי על האישור.</translation>
+<translation id="4832537345877333532">‏השבת אחזור של קובצי תצוגה מסוג icc מ-Quirks Server לכיול צבעי המסך.</translation>
 <translation id="4834912470034578916">הפעל פריסות מותאמות אישית ל'הודעות אינטרנט'.</translation>
 <translation id="4835836146030131423">שגיאת כניסה.</translation>
 <translation id="4837926214103741331">אין לך אישור להשתמש במכשיר הזה. צור קשר עם בעל המכשיר כדי לקבל הרשאת כניסה.</translation>
@@ -2840,6 +2846,7 @@
 <translation id="5120421890733714118">תן אמון באישור זה לזיהוי אתרי אינטרנט.</translation>
 <translation id="5121130586824819730">הדיסק הקשיח מלא. שמור במיקום אחר או פנה מקום בדיסק הקשיח.</translation>
 <translation id="5125751979347152379">כתובת אתר לא חוקית.</translation>
+<translation id="5126663277159826272">‏השבת את Quirks Client לכיול המסך.</translation>
 <translation id="5127881134400491887">ניהול חיבורי רשת</translation>
 <translation id="5128590998814119508">בד ציור דו-ממדי ברשימת תצוגה</translation>
 <translation id="512903556749061217">מחובר</translation>
@@ -2981,9 +2988,11 @@
 <translation id="5301751748813680278">נכנס כאורח.</translation>
 <translation id="5301954838959518834">בסדר גמור, הבנתי</translation>
 <translation id="5302048478445481009">שפה</translation>
+<translation id="5304039790201806037">Pointer Events</translation>
 <translation id="5305688511332277257">לא מותקנים אישורים</translation>
 <translation id="5308380583665731573">התחברות</translation>
 <translation id="5311260548612583999">קובץ מפתח פרטי (אופציונלי):</translation>
+<translation id="5313967007315987356">הוסף אתר</translation>
 <translation id="5316588172263354223">חיפוש קולי בכל עת</translation>
 <translation id="5316716239522500219">שיקוף צגים</translation>
 <translation id="5317780077021120954">שמור</translation>
@@ -3286,6 +3295,7 @@
 <translation id="5734362860645681824">תקשורת</translation>
 <translation id="573719557377416048">נקה מצב נוכחות משותפת</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: בחר כדי לערוך</translation>
+<translation id="5741454054957165976">‏הפעל גירסה חדשה של התערבות סוכן משתמש לטעינת WebFonts.</translation>
 <translation id="574392208103952083">בינוני</translation>
 <translation id="5745056705311424885">‏זוהה מקל זיכרון USB</translation>
 <translation id="5746169159649715125">‏שמור כקובץ PDF</translation>
@@ -3334,7 +3344,6 @@
 <translation id="5803531701633845775">בחר ביטויים מהסוף, מבלי להזיז את הסמן</translation>
 <translation id="5804241973901381774">הרשאות</translation>
 <translation id="580571955903695899">סדר מחדש לפי כותרת</translation>
-<translation id="5808982448801399019">ההרשאה נכשלה</translation>
 <translation id="580961539202306967">שאל אותי כאשר אתר רוצה לשלוח לי הודעות בדחיפה (מומלץ)</translation>
 <translation id="5815645614496570556">‏כתובת X.400</translation>
 <translation id="5817397429773072584">סינית מסורתית</translation>
@@ -3359,6 +3368,7 @@
 <translation id="5834581999798853053">נותרו בערך <ph name="TIME" /> דקות</translation>
 <translation id="5838825566232597749">‏US Workman בינלאומית</translation>
 <translation id="5839277899276241121">זהה לכתובת לחיוב</translation>
+<translation id="5844550873065695788">‏הפעולה תמחק לצמיתות <ph name="TOTAL_COUNT" /> פריטים לפחות מהמכשיר הזה. כדי לאחזר את הנתונים מאוחר יותר, היכנס ל-Chrome בתור $2.</translation>
 <translation id="5846929185714966548">כרטיסייה 4</translation>
 <translation id="5848934677402291689">‏מתבצעת שמירה לקובץ PDF‏</translation>
 <translation id="5849335628409778954">הזן כרטיס אשראי...</translation>
@@ -3603,6 +3613,7 @@
 <translation id="6232017090690406397">סוללה</translation>
 <translation id="6241530762627360640">‏פרטי גישה של מכשירי Bluetooth המותאמים למערכת שלך ומגלים מכשירי Bluetooth קרובים.</translation>
 <translation id="6243774244933267674">השרת אינו זמין</translation>
+<translation id="6246413617632217567">לא ניתן לייבא את המשתמש בפיקוח. בדוק אם יש שטח אחסון פנוי בכונן הקשיח ואת ההרשאות שלך ונסה שוב.</translation>
 <translation id="6247708409970142803">%<ph name="PERCENTAGE" /></translation>
 <translation id="624789221780392884">העדכון מוכן</translation>
 <translation id="6248400709929739064">הפעל כתוביות</translation>
@@ -3631,6 +3642,7 @@
 <translation id="6277518330158259200">צלם מסך</translation>
 <translation id="6279183038361895380">הקש על |<ph name="ACCELERATOR" />| כדי להציג את הסמן</translation>
 <translation id="6280215091796946657">היכנס באמצעות חשבון אחר</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">‏ניסוי שמטרתו לגרום לכך שכל ממשקי ה-API ישקפו את אזור התצוגה של הפריסה. פעולה זו תהפוך את מאפייני window.scroll ליחסיים לאזור התצוגה של הפריסה.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{מדפסת חדשה ברשת שלך}two{מדפסות חדשות ברשת שלך}many{מדפסות חדשות ברשת שלך}other{מדפסות חדשות ברשת שלך}}</translation>
 <translation id="6285395082104474418">מגש הסטטוס מציג לך את המצב הנוכחי של הרשת, הסוללה ועוד.</translation>
@@ -3686,6 +3698,7 @@
 <translation id="6380143666419481200">קבל והמשך</translation>
 <translation id="6380224340023442078">הגדרות תוכן...</translation>
 <translation id="6383194710567510941">‏אפשר שימוש ב-chrome.input.ime API.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{‏הפעולה תמחק לצמיתות פריט אחד לפחות מהמכשיר הזה. כדי לאחזר את הנתונים מאוחר יותר, היכנס ל-Chrome בתור $2.}two{‏הפעולה תמחק לצמיתות שני פריטים לפחות מהמכשיר הזה. כדי לאחזר את הנתונים מאוחר יותר, היכנס ל-Chrome בתור $2.}many{‏הפעולה תמחק לצמיתות $1 פריטים לפחות מהמכשיר הזה. כדי לאחזר את הנתונים מאוחר יותר, היכנס ל-Chrome בתור $2.}other{‏הפעולה תמחק לצמיתות $1 פריטים לפחות מהמכשיר הזה. כדי לאחזר את הנתונים מאוחר יותר, היכנס ל-Chrome בתור $2.}}</translation>
 <translation id="6384275966486438344">שנה את הגדרות החיפוש שלך ל: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">‏הדפים שאתה מציג בחלון זה לא יופיעו בהיסטוריית הדפדפן, ולאחר שתסגור את כל חלונות האורח הפתוחים, לא יותירו במחשב עקבות, כמו קובצי Cookie. עם זאת, כל הקבצים שאתה מוריד יישמרו.</translation>
 <translation id="6391538222494443604">ספריית קלט חייבת להתקיים.</translation>
@@ -3824,6 +3837,7 @@
 <translation id="6575134580692778371">לא הוגדר</translation>
 <translation id="6575251558004911012">שאל כשאתר מבקש גישה אל המצלמה שלך (מומלץ)</translation>
 <translation id="6579159469348633828">‏קידוד תוכן Brotli.</translation>
+<translation id="6580151766480067746">‏גירסת ARC</translation>
 <translation id="6581162200855843583">‏קישור ל-Google Drive</translation>
 <translation id="6583070985841601920">מחובר כ-<ph name="USER_EMAIL_ADDRESS" />. הסנכרון בוטל על ידי מנהל המערכת שלך.</translation>
 <translation id="65832705307647870">אכלס מראש את הדף 'כרטיסייה חדשה' באתרים פופולריים.</translation>
@@ -3989,6 +4003,7 @@
 <translation id="6847758263950452722">‏שמור דף כ-MHTML</translation>
 <translation id="6853388645642883916">המעדכן במצב שינה</translation>
 <translation id="68541483639528434">סגור כרטיסיות אחרות</translation>
+<translation id="6856701878604560493">הפעל סימניות לא מקוונות</translation>
 <translation id="6860097299815761905">‏הגדרות שרת proxy...</translation>
 <translation id="6860427144121307915">פתח בכרטיסייה</translation>
 <translation id="6862635236584086457">כל הקבצים השמורים בתיקיה זו מגובים באופן אוטומטי באינטרנט</translation>
@@ -4159,6 +4174,7 @@
 <translation id="7092106376816104">חריגים של חלונות קופצים</translation>
 <translation id="7093866338626856921">החלפת נתונים עם המכשירים ששמותיהם: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">רוצה לגלות עוד תכונות מעולות?</translation>
+<translation id="7096108453481049031">לא ניתן לייבא את המשתמש בפיקוח. בדוק את החיבור לרשת ונסה שוב מאוחר יותר.</translation>
 <translation id="7100897339030255923">נבחרו <ph name="COUNT" /> פריטים</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">קנה שטח אחסון נוסף...</translation>
@@ -4187,6 +4203,7 @@
 <translation id="713888829801648570">מצטערים, לא ניתן לאמת את סיסמתך מכיוון שאתה במצב לא מקוון.</translation>
 <translation id="7140928199327930795">אין מכשירים זמינים נוספים.</translation>
 <translation id="7141105143012495934">הכניסה נכשלה מפני שלא ניתן היה לאחזר את פרטי החשבון. צור קשר עם מנהל המערכת או נסה שוב.</translation>
+<translation id="7141331524324591758">‏מאפשר תמיכה ניסיונית חלקית לממשק ה-API של Pointer Events. אפשרות זו מיועדת לצורך בדיקות של מפתחי אתרים בלבד, והיא תוביל לשיבושים קלים בפעילותם של אתרים מסוימים.</translation>
 <translation id="7143207342074048698">מתחבר</translation>
 <translation id="7144878232160441200">נסה שוב</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> הושבת. כדי להפעילו מחדש, עבור אל <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4827,6 +4844,7 @@
 <translation id="8119572489781388874">שנה הגדרות</translation>
 <translation id="8119631488458759651">הסר אתר זה</translation>
 <translation id="8121385576314601440">הגדרות קלט הנגול</translation>
+<translation id="8122245494004914423">‏הפעולה תמחק לצמיתות את נתוני הגלישה מהמכשיר הזה. כדי לאחזר את הנתונים מאוחר יותר, היכנס ל-Chrome בתור $2.</translation>
 <translation id="8124313775439841391">‏ONC מנוהל</translation>
 <translation id="8126844665673008223">‏Bluetooth באינטרנט</translation>
 <translation id="8127322077195964840">‏התר אישורים לא חוקיים בשביל משאבים הנטענים מ-localhost.</translation>
@@ -4911,6 +4929,7 @@
 <translation id="8226742006292257240">‏סיסמת TPM שנוצרה באקראי והוקצתה למחשב שלך:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">תוקפים הנמצאים כעת ב-<ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> עשויים לנסות להתקין במחשב שלך תכניות מסוכנות שגונבות או מוחקות מידע שלך (לדוגמה, תמונות, סיסמאות, הודעות וכרטיסי אשראי).</translation>
+<translation id="8233254008506535819">כלול את האפשרות להוסיף אתרים חשובים לרשימת ההיתרים בתיבת הדו-שיח 'נקה נתוני גלישה'.</translation>
 <translation id="8236231079192337250">‏יישום 'הגלריה של חנות האינטרנט של Chrome' למנהלי התקן למדפסות</translation>
 <translation id="8238649969398088015">טיפ עזרה</translation>
 <translation id="8240697550402899963">השתמש בעיצוב קלאסי</translation>
@@ -5234,7 +5253,6 @@
 <translation id="8708671767545720562">&amp;מידע נוסף</translation>
 <translation id="8711402221661888347">חמוצים</translation>
 <translation id="8711453844311572806">כשהטלפון שלך נמצא בקרבת מקום ואינו נעול, לחץ כדי להיכנס. אחרת, תראה סמל מנעול ותצטרך להקליד את הסיסמה.</translation>
-<translation id="8712637175834984815">הבנתי</translation>
 <translation id="8713570323158206935">שלח <ph name="BEGIN_LINK1" />פרטי מערכת<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">הפעל תיקון אוטומטי של מקלדת פיזית עבור מקלדת באנגלית ארה"ב, אשר יכולה לספק הצעות כמו בהקלדה במקלדת פיזית.</translation>
 <translation id="871476437400413057">‏סיסמאות שמורות ב-Google</translation>
@@ -5597,6 +5615,7 @@
 <translation id="952992212772159698">לא פעיל</translation>
 <translation id="953000875543358078">ייתכן שהפעולה תימשך עד כדקה</translation>
 <translation id="960987915827980018">נותרה בערך שעה אחת</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{‏הפעולה תמחק לצמיתות פריט אחד מהמכשיר הזה. כדי לאחזר את הנתונים מאוחר יותר, היכנס ל-Chrome בתור $2.}two{‏הפעולה תמחק לצמיתות שני פריטים מהמכשיר הזה. כדי לאחזר את הנתונים מאוחר יותר, היכנס ל-Chrome בתור $2.}many{‏הפעולה תמחק לצמיתות $1 פריטים מהמכשיר הזה. כדי לאחזר את הנתונים מאוחר יותר, היכנס ל-Chrome בתור $2.}other{‏הפעולה תמחק לצמיתות $1 פריטים מהמכשיר הזה. כדי לאחזר את הנתונים מאוחר יותר, היכנס ל-Chrome בתור $2.}}</translation>
 <translation id="96421021576709873">‏רשת Wi-Fi</translation>
 <translation id="965490406356730238">‏היכן שהדבר אפשרי, הפעל פענוח של קובצי mjpeg עם האצה באמצעות חומרה בשביל מסגרת שצולמה.</translation>
 <translation id="968174221497644223">קובץ שמור של יישום</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index a5101ea9..1361ce65 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -251,6 +251,7 @@
         この場合、<ph name="USER_DISPLAY_EMAIL" /> のすべての対応デバイスで Bluetooth が有効になり、一部のハードウェア情報が Google に送信されます。&lt;a&gt;詳細&lt;/a&gt;</translation>
 <translation id="13649080186077898">自動入力設定の管理</translation>
 <translation id="1367951781824006909">ファイルを選択</translation>
+<translation id="136802136832547685">この端末に追加する監視対象ユーザーは存在しません。</translation>
 <translation id="1368265273904755308">問題を報告</translation>
 <translation id="1368832886055348810">左から右</translation>
 <translation id="1370646789215800222">ユーザーを削除しますか?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">検索</translation>
 <translation id="1384211230590313258">サービス検出ハンドラ</translation>
 <translation id="1386387014181100145">こんにちは。</translation>
+<translation id="1386830813511981192">お使いの <ph name="DEVICE_TYPE" /> で 100 万種類以上のアプリとゲームをご利用いただけるようになりました。</translation>
 <translation id="1389297115360905376">これは <ph name="CHROME_WEB_STORE" /> からのみ追加できます。</translation>
 <translation id="1390548061267426325">通常のタブとして開く</translation>
 <translation id="1395262318152388157">シーク スライダー</translation>
@@ -893,6 +895,7 @@
 <translation id="2280486287150724112">右余白</translation>
 <translation id="2282146716419988068">GPU プロセス</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">WebFonts を読み込むユーザー エージェント処理の新しいバージョン</translation>
 <translation id="2286454467119466181">シンプル</translation>
 <translation id="2286950485307333924">Chrome にログイン済み</translation>
 <translation id="2287590536030307392">すべての無線接続をオフにします。</translation>
@@ -1070,6 +1073,7 @@
 <translation id="2542049655219295786">Google Table</translation>
 <translation id="2546283357679194313">Cookie とサイト データ</translation>
 <translation id="2549646943416322527">Seccomp 検出機能</translation>
+<translation id="2550212893339833758">スワップ対象メモリ</translation>
 <translation id="2553100941515833716">再起動のたびにアプリ ランチャーのインストール状態をリセットする。</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> は <ph name="NETWORK_ID" /> に接続できませんでした。別のネットワークを選択するか、もう一度お試しください。</translation>
 <translation id="2553440850688409052">このプラグインを表示しない</translation>
@@ -1103,6 +1107,7 @@
 <translation id="2587203970400270934">事業者コード:</translation>
 <translation id="2587922270115112871">監視対象ユーザーを作成しても Google アカウントは作成されません。監視対象ユーザーの設定と
     データは、Chrome Sync で他のデバイスにはコピーされません。監視対象ユーザーはこのデバイスでのみ有効です。</translation>
+<translation id="2594049137847833442">閲覧履歴データの消去ダイアログに表示する重要サイトのオプション</translation>
 <translation id="2594056015203442344">有効にした場合、タブ バーの音声インジケータをタブの音声ミュート用コントロールとして使えるようになります。また、タブのコンテキスト メニューには、選択した複数のタブをすばやくミュートするコマンドが追加されます。</translation>
 <translation id="259421303766146093">縮小表示</translation>
 <translation id="2597852038534460976">Chrome では壁紙にアクセスできません。ネットワークに接続してください。</translation>
@@ -1470,7 +1475,6 @@
 <translation id="3065140616557457172">キーワードを入力して検索するか、直接 URL を入力してください。</translation>
 <translation id="3067198360141518313">このプラグインを実行する</translation>
 <translation id="307519606911195071">[設定] ページで追加のユーザー補助機能を設定できるようにします。</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> が監視対象ユーザーとして作成されました</translation>
 <translation id="3075874217500066906">Powerwash を開始するには再起動が必要です。再起動後、続行の確認メッセージが表示されます。</translation>
 <translation id="3076677906922146425">だれでも Chrome にユーザーを追加できるようにする</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1487,6 +1491,7 @@
 <translation id="3088034400796962477">文字変換(salam ← سلام)</translation>
 <translation id="3088325635286126843">名前を変更(&amp;R)...</translation>
 <translation id="308903551226753393">自動設定</translation>
+<translation id="3089231390674410424">認証情報に問題があるようです。正しくログインしていることを確認し、もう一度お試しください。</translation>
 <translation id="3090819949319990166">外部の crx ファイルは <ph name="TEMP_CRX_FILE" /> にコピーできません。</translation>
 <translation id="3090871774332213558">「<ph name="DEVICE_NAME" />」がペア設定されました</translation>
 <translation id="3092544800441494315">このスクリーンショットを含める:</translation>
@@ -2014,7 +2019,6 @@
 <translation id="3790856258139356663">Chrome 同期のためにテストサーバーに接続します。</translation>
 <translation id="3790909017043401679">SIM カードの PIN の入力</translation>
 <translation id="3792890930871100565">プリンタを切断</translation>
-<translation id="3795681127952030401"><ph name="URL" /> が通知を送信しようとしています。</translation>
 <translation id="3796648294839530037">お気に入りのネットワーク:</translation>
 <translation id="3797900183766075808"><ph name="SEARCH_ENGINE" /> で「<ph name="SEARCH_TERMS" />」を検索(&amp;S)</translation>
 <translation id="3798449238516105146">バージョン</translation>
@@ -2488,6 +2492,7 @@
 <translation id="4552678318981539154">追加ストレージを購入</translation>
 <translation id="4554591392113183336">外部の拡張機能のバージョンが既存のバージョン以下です。</translation>
 <translation id="4554796861933393312">マテリアル デザインのインク滴のアニメーション再生速度</translation>
+<translation id="4555670907822902621">ブックマークしたページをオフラインでの閲覧用に保存できるようにします。</translation>
 <translation id="4555769855065597957">シャドウ</translation>
 <translation id="4556110439722119938">ブックマーク、履歴、パスワード、その他の設定が Google アカウントに同期され、どの端末でも利用できるようになります</translation>
 <translation id="4557136421275541763">警告:</translation>
@@ -2664,6 +2669,7 @@
 <translation id="4824518112777153488">ホバリング対応タッチスクリーンのサポート</translation>
 <translation id="4830573902900904548">お使いの <ph name="DEVICE_TYPE" /> から <ph name="NETWORK_NAME" /> を使用してインターネットに接続できません。別のネットワークを選択してください。<ph name="LEARN_MORE_LINK_START" />詳細<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572"><ph name="ORGANIZATION" />(<ph name="LOCALITY" />)の識別情報が <ph name="ISSUER" /> によって確認されました。証明書の透明性に関する有効な情報がサーバーから提供されました。</translation>
+<translation id="4832537345877333532">ディスプレイの色校正用に Quirks サーバーから ICC ディスプレイ ファイルを取得できないようにします。</translation>
 <translation id="4834912470034578916">ウェブ通知のカスタム レイアウトを有効にする</translation>
 <translation id="4835836146030131423">ログイン中にエラーが発生しました。</translation>
 <translation id="4837926214103741331">このデバイスを使用する権限がありません。ログイン権限については、デバイスの所有者にお問い合わせください。</translation>
@@ -2851,6 +2857,7 @@
 <translation id="5120421890733714118">ウェブサイトの身元を特定するこの証明書を信頼します。</translation>
 <translation id="5121130586824819730">ハード ディスクがいっぱいです。別の場所に保存するか、ハード ディスクの空き容量を増やしてください。</translation>
 <translation id="5125751979347152379">URL が無効です。</translation>
+<translation id="5126663277159826272">ディスプレイ校正用の Quirks クライアントを無効にする。</translation>
 <translation id="5127881134400491887">ネットワーク接続の管理</translation>
 <translation id="5128590998814119508">表示リストによる 2D キャンバス表示</translation>
 <translation id="512903556749061217">接続</translation>
@@ -2992,9 +2999,11 @@
 <translation id="5301751748813680278">ゲストとしてログインしています。</translation>
 <translation id="5301954838959518834">OK</translation>
 <translation id="5302048478445481009">言語</translation>
+<translation id="5304039790201806037">ポインタ イベント</translation>
 <translation id="5305688511332277257">インストールされていません</translation>
 <translation id="5308380583665731573">接続</translation>
 <translation id="5311260548612583999">秘密鍵ファイル(省略可能):</translation>
+<translation id="5313967007315987356">サイトを追加</translation>
 <translation id="5316588172263354223">いつでも音声検索が可能</translation>
 <translation id="5316716239522500219">モニターをミラーリングする</translation>
 <translation id="5317780077021120954">保存</translation>
@@ -3297,6 +3306,7 @@
 <translation id="5734362860645681824">通信</translation>
 <translation id="573719557377416048">端末検出の状態を消去</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: 選択して編集</translation>
+<translation id="5741454054957165976">WebFonts を読み込むユーザー エージェント処理の新しいバージョンを有効にします。</translation>
 <translation id="574392208103952083">中</translation>
 <translation id="5745056705311424885">USB メモリ スティックが検出されました</translation>
 <translation id="5746169159649715125">PDF に保存</translation>
@@ -3345,7 +3355,6 @@
 <translation id="5803531701633845775">カーソルを動かさずに後ろからフレーズを選択する</translation>
 <translation id="5804241973901381774">権限</translation>
 <translation id="580571955903695899">タイトルで並べ替え</translation>
-<translation id="5808982448801399019">認証できませんでした</translation>
 <translation id="580961539202306967">サイトがプッシュ メッセージを送信しようとする際に確認する(推奨)</translation>
 <translation id="5815645614496570556">X.400 アドレス</translation>
 <translation id="5817397429773072584">中国語(繁体字)</translation>
@@ -3370,6 +3379,7 @@
 <translation id="5834581999798853053">あと約 <ph name="TIME" /> 分</translation>
 <translation id="5838825566232597749">US Workman インターナショナル</translation>
 <translation id="5839277899276241121">請求先住所と同じ</translation>
+<translation id="5844550873065695788">少なくとも <ph name="TOTAL_COUNT" /> 件の項目がこの端末から完全に削除されます。後でデータを取得するには、$2 として Chrome にログインしてください。</translation>
 <translation id="5846929185714966548">タブ 4</translation>
 <translation id="5848934677402291689">PDF に保存中です</translation>
 <translation id="5849335628409778954">クレジット カード情報を入力...</translation>
@@ -3614,6 +3624,7 @@
 <translation id="6232017090690406397">バッテリー</translation>
 <translation id="6241530762627360640">システムでペア設定されている Bluetooth デバイスの情報へのアクセスと、近くにある Bluetooth デバイスの検出。</translation>
 <translation id="6243774244933267674">サーバーを使用できません</translation>
+<translation id="6246413617632217567">監視対象ユーザーをインポートできませんでした。ハードドライブの空き容量と権限を確認し、もう一度お試しください。</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">アップデート準備完了</translation>
 <translation id="6248400709929739064">字幕を有効にする</translation>
@@ -3642,6 +3653,7 @@
 <translation id="6277518330158259200">スクリーンショットを撮る(&amp;A)</translation>
 <translation id="6279183038361895380">カーソルを表示するには |<ph name="ACCELERATOR" />| を押します</translation>
 <translation id="6280215091796946657">別のアカウントでログイン</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">すべての API でレイアウト ビューポートを反映するようにした試験運用版の機能です。この場合、window.scroll プロパティはレイアウト ビューポートを基準とした相対的な値に設定されます。</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{ネットワーク上の新しいプリンタ}other{ネットワーク上の新しいプリンタ}}</translation>
 <translation id="6285395082104474418">ステータス トレイには、ネットワーク、バッテリーなどの現在の状態が表示されます。</translation>
@@ -3697,6 +3709,7 @@
 <translation id="6380143666419481200">同意して続行</translation>
 <translation id="6380224340023442078">コンテンツの設定...</translation>
 <translation id="6383194710567510941">chrome.input.ime API の使用を有効にします。</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{少なくとも $1 件の項目がこの端末から完全に削除されます。後でデータを取得するには、$2 として Chrome にログインしてください。}other{少なくとも $1 件の項目がこの端末から完全に削除されます。後でデータを取得するには、$2 として Chrome にログインしてください。}}</translation>
 <translation id="6384275966486438344">検索設定を次に変更します: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">このウィンドウで開いたページはブラウザの履歴に記録されません。また、開いているゲスト ウィンドウをすべて閉じると、Cookie などのデータはパソコンから消去されます。ただし、ダウンロードしたファイルは保持されます。</translation>
 <translation id="6391538222494443604">入力ディレクトリが存在している必要があります。</translation>
@@ -3835,6 +3848,7 @@
 <translation id="6575134580692778371">設定されていません</translation>
 <translation id="6575251558004911012">カメラへのアクセスをサイトが要求するたびに確認する(推奨)</translation>
 <translation id="6579159469348633828">Brotli コンテンツ エンコード</translation>
+<translation id="6580151766480067746">ARC バージョン</translation>
 <translation id="6581162200855843583">Google ドライブ リンク</translation>
 <translation id="6583070985841601920"><ph name="USER_EMAIL_ADDRESS" /> としてログインしましたが、同期は管理者によって無効にされています。</translation>
 <translation id="65832705307647870">新しいタブページを開いたときに人気サイトの一覧を表示します。</translation>
@@ -4000,6 +4014,7 @@
 <translation id="6847758263950452722">MHTML としてページを保存</translation>
 <translation id="6853388645642883916">アップデータのスリープ中</translation>
 <translation id="68541483639528434">他のタブをすべて閉じる</translation>
+<translation id="6856701878604560493">オフライン ブックマークを有効にする</translation>
 <translation id="6860097299815761905">プロキシの設定...</translation>
 <translation id="6860427144121307915">タブで開く</translation>
 <translation id="6862635236584086457">このフォルダに保存されているすべてのファイルが自動的にオンラインにバックアップされます。</translation>
@@ -4172,6 +4187,7 @@
 <translation id="7092106376816104">ポップアップの例外</translation>
 <translation id="7093866338626856921">デバイス <ph name="HOSTNAMES" /> とのデータ交換</translation>
 <translation id="7096082900368329802">まだまだ機能があります。</translation>
+<translation id="7096108453481049031">監視対象ユーザーをインポートできませんでした。ネットワーク接続を確認し、しばらくしてからもう一度お試しください。</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> 個のアイテムが選択されています</translation>
 <translation id="710227449793100220">Token Binding。</translation>
 <translation id="7106346894903675391">追加容量を購入...</translation>
@@ -4200,6 +4216,7 @@
 <translation id="713888829801648570">オフラインになっているためパスワードを確認できませんでした。</translation>
 <translation id="7140928199327930795">利用可能なデバイスは他にありません。</translation>
 <translation id="7141105143012495934">アカウントの詳細を取得できなかったためログインできませんでした。管理者に問い合わせるか、もう一度お試しください。</translation>
+<translation id="7141331524324591758">Pointer Events API の試験サポートを一部有効にします。これはウェブ デベロッパーによるテストのみを目的とした機能です。ウェブサイトによっては小さな破損の原因となることもあります。</translation>
 <translation id="7143207342074048698">接続中</translation>
 <translation id="7144878232160441200">再読み込み</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> は無効になりました。再度有効にするには、<ph name="CHROME_PLUGINS_LINK" /> にアクセスしてください。</translation>
@@ -4850,6 +4867,7 @@
 <translation id="8119572489781388874">設定を変更</translation>
 <translation id="8119631488458759651">このサイトを削除</translation>
 <translation id="8121385576314601440">ハングル入力設定</translation>
+<translation id="8122245494004914423">閲覧データがこの端末から完全に削除されます。後でデータを取得するには、$2 として Chrome にログインしてください。</translation>
 <translation id="8124313775439841391">管理対象 ONC</translation>
 <translation id="8126844665673008223">ウェブ Bluetooth</translation>
 <translation id="8127322077195964840">ローカルホストから読み込んだリソースに対して無効な証明書を許可する</translation>
@@ -4934,6 +4952,7 @@
 <translation id="8226742006292257240">ランダムに生成され、ご使用のパソコンに割り当てられた TPM パスワードは以下のとおりです:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />、<ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">現在、<ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> では、悪意のあるユーザーがご利用のパソコンに危険なプログラム(写真、パスワード、メッセージ、クレジット カード番号などを盗み取るか削除するプログラム)をインストールしようとしている可能性があります。</translation>
+<translation id="8233254008506535819">重要サイトをホワイトリストに登録するオプションを閲覧履歴データの消去ダイアログに表示します。</translation>
 <translation id="8236231079192337250">プリンタ ドライバ用 Chrome ウェブストア ギャラリー アプリ</translation>
 <translation id="8238649969398088015">ヘルプのヒント</translation>
 <translation id="8240697550402899963">クラシック テーマを使用</translation>
@@ -5257,7 +5276,6 @@
 <translation id="8708671767545720562">詳細情報(&amp;M)</translation>
 <translation id="8711402221661888347">ピクルス</translation>
 <translation id="8711453844311572806">スマートフォンがロック解除された状態で近くにある場合は、クリックするとログインできます。この状態にない場合は施錠アイコンが表示されるので、パスワードを入力する必要があります。</translation>
-<translation id="8712637175834984815">閉じる</translation>
 <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />システム情報<ph name="END_LINK1" />を送信する</translation>
 <translation id="8713979477561846077">US キーボードに対し、物理キーボードの自動修正機能を有効にします。この場合、物理キーボードで文字を入力すると候補が表示されます。</translation>
 <translation id="871476437400413057">Google で保存したパスワード</translation>
@@ -5620,6 +5638,7 @@
 <translation id="952992212772159698">無効</translation>
 <translation id="953000875543358078">これには数分かかる場合があります</translation>
 <translation id="960987915827980018">あと約 1 時間</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{$1 件の項目がこの端末から完全に削除されます。後でデータを取得するには、$2 として Chrome にログインしてください。}other{$1 件の項目がこの端末から完全に削除されます。後でデータを取得するには、$2 として Chrome にログインしてください。}}</translation>
 <translation id="96421021576709873">Wi-Fi ネットワーク</translation>
 <translation id="965490406356730238">取得済みのフレームに対し、可能な場合にハードウェア アクセラレーションによる mjpeg デコードを有効にします。</translation>
 <translation id="968174221497644223">アプリケーション キャッシュ</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 16b5cce0..e3fa395 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -251,6 +251,7 @@
       <ph name="USER_DISPLAY_EMAIL" /> ನ ಹೊಂದಾಣಿಕೆಯಾಗುವ ಎಲ್ಲ ಸಾಧನಗಳಿಗೆ ಬ್ಲೂಟೂತ್ ಅನ್ನು ಆನ್ ಮಾಡಲಾಗುತ್ತದೆ ಎಂಬುದನ್ನು ಗಮನದಲ್ಲಿರಿಸಿಕೊಳ್ಳಿ ಮತ್ತು ಕೆಲವು ಹಾರ್ಡ್‌ವೇರ್ ಮಾಹಿತಿಯನ್ನು Google ಗೆ ಕಳುಹಿಸಲಾಗುತ್ತದೆ. &lt;a&gt;ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ&lt;/a&gt;</translation>
 <translation id="13649080186077898">ಸ್ವಯಂ ತುಂಬುವಿಕೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation>
 <translation id="1367951781824006909">ಫೈಲ್‌ವೊಂದನ್ನು ಆರಿಸಿ</translation>
+<translation id="136802136832547685">ಈ ಸಾಧನಕ್ಕೆ ಸೇರಿಸಲು ಯಾವುದೇ ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರರು ಇಲ್ಲ.</translation>
 <translation id="1368265273904755308">ಸಮಸ್ಯೆ ವರದಿ ಮಾಡಿ</translation>
 <translation id="1368832886055348810">ಎಡದಿಂದ ಬಲಕ್ಕೆ</translation>
 <translation id="1370646789215800222">ವ್ಯಕ್ತಿಯನ್ನು ತೆಗೆದುಹಾಕುವುದೇ?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">ಹುಡುಕಾಟ</translation>
 <translation id="1384211230590313258">ಸೇವೆ ಡಿಸ್ಕವರಿ ಹ್ಯಾಂಡ್ಲರ್</translation>
 <translation id="1386387014181100145">ಹೇಗಿರುವಿರಿ.</translation>
+<translation id="1386830813511981192">ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ನಲ್ಲಿ ಸಾವಿರಾರು ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ಆಟಗಳು ಇದೀಗ ಲಭ್ಯವಿವೆ.</translation>
 <translation id="1389297115360905376"><ph name="CHROME_WEB_STORE" /> ಮೂಲಕ ಮಾತ್ರ ಸೇರಿಸಬಹುದಾಗಿದೆ.</translation>
 <translation id="1390548061267426325">ದಿನನಿತ್ಯದ ಟ್ಯಾಬ್ ಅಂತೆ ತೆರೆಯಿರಿ</translation>
 <translation id="1395262318152388157">ಸೀಕ್ ಸ್ಲೈಡರ್</translation>
@@ -592,7 +594,7 @@
 <translation id="1826516787628120939">ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="1828149253358786390">ನಿಮಗೆ ಅಧಿಸೂಚನೆಗಳನ್ನು ಕಳುಹಿಸಲು <ph name="SITE" /> ಬಯಸುತ್ತದೆ.</translation>
 <translation id="1828901632669367785">ಸಿಸ್ಟಂ ಸಂವಾದವನ್ನು ಬಳಸಿಕೊಂಡು ಮುದ್ರಿಸಿ...</translation>
-<translation id="1829192082282182671">ಜೂಮ್ &amp;ಔಟ್</translation>
+<translation id="1829192082282182671">ಝೂಮ್ &amp;ಔಟ್</translation>
 <translation id="1830550083491357902">ಸೈನ್ ಇನ್ ಆಗಿಲ್ಲ</translation>
 <translation id="1832511806131704864">ಫೋನ್ ಬದಲಾವಣೆ ನವೀಕರಿಸಲಾಗಿದೆ</translation>
 <translation id="1834560242799653253">ಓರಿಯಂಟೇಶನ್:</translation>
@@ -893,6 +895,7 @@
 <translation id="2280486287150724112">ಬಲ ಅಂಚು</translation>
 <translation id="2282146716419988068">GPU ಪ್ರಕ್ರಿಯೆ</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">ಹೊಸ ಆವೃತ್ತಿ WebFonts ಲೋಡ್ ಆಗುವಿಕೆಗೆ ಬಳಕೆದಾರ-ಏಜೆಂಟ್ ಮಧ್ಯಸ್ಥಿಕೆ.</translation>
 <translation id="2286454467119466181">ಸರಳ</translation>
 <translation id="2286950485307333924">ನೀವು ಇದೀಗ Chrome ಗೆ ಸೈನ್‌ ಇನ್‌ ಆಗಿರುವಿರಿ</translation>
 <translation id="2287590536030307392">ಎಲ್ಲಾ ವೈರ್‌ಲೆಸ್ ಸಂಪರ್ಕಗಳನ್ನು ಆಫ್ ಮಾಡಿ. </translation>
@@ -1070,6 +1073,7 @@
 <translation id="2542049655219295786">Google ಕೋಷ್ಟಕ</translation>
 <translation id="2546283357679194313">ಕುಕೀಗಳು ಮತ್ತು ಸೈಟ್ ಡೇಟಾ</translation>
 <translation id="2549646943416322527">Seccomp ಡಿಟೆಕ್ಟರ್</translation>
+<translation id="2550212893339833758">ಬದಲಾಯಿಸಿದ ಮೆಮೊರಿ</translation>
 <translation id="2553100941515833716">ಪ್ರತಿ ಬಾರಿ ಮರುಪ್ರಾರಂಭಿಸಿದಾಗಲೆಲ್ಲ ಅಪ್ಲಿಕೇಶನ್ ಲಾಂಚರ್ ಸ್ಥಾಪನೆಯ ಸ್ಥಿತಿಯನ್ನು ಮರುಹೊಂದಿಸಿ.</translation>
 <translation id="2553340429761841190"><ph name="NETWORK_ID" /> ಅನ್ನು ಸಂಪರ್ಕಿಸಲು <ph name="PRODUCT_NAME" /> ಗೆ ಸಾಧ್ಯವಿಲ್ಲ. ದಯವಿಟ್ಟು ಇನ್ನೊಂದು ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ ಅಥವಾ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="2553440850688409052">ಈ ಪ್ಲಗ್‌ ಇನ್ ಅನ್ನು ಮರೆಮಾಡು</translation>
@@ -1103,6 +1107,7 @@
 <translation id="2587203970400270934">ಆಪರೇಟರ್ ಕೋಡ್:</translation>
 <translation id="2587922270115112871">ಮೇಲ್ವಿಚಾರಣೆಯ ಬಳಕೆದಾರರನ್ನು ರಚಿಸುವುದರಿಂದ Google ಖಾತೆಯನ್ನು ಮತ್ತು ಅದರ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ರಚಿಸಿದಂತಾಗುವುದಿಲ್ಲ, 
     ಹಾಗೂ ಡೇಟಾವು Chrome ಸಿಂಕ್‌ನೊಂದಿಗೆ ಇತರ ಸಾಧನಗಳಿಗೆ ಅವುಗಳನ್ನು ಅನುಸರಿಸುವುದಿಲ್ಲ. ಈ ಸಾಧನದಲ್ಲಿ ಮಾತ್ರ ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರರನ್ನು ಅನ್ವಯವಾಗುತ್ತದೆ.</translation>
+<translation id="2594049137847833442">ಬ್ರೌಸಿಂಗ್ ಡೇಟಾ ತೆರವುಗೊಳಿಸು ಸಂವಾದದಲ್ಲಿ ಪ್ರಮುಖ ಸೈಟ್‌ಗಳ ಆಯ್ಕೆ</translation>
 <translation id="2594056015203442344">ಸಕ್ರಿಯಗೊಳಿಸಿದಾಗ, ಟ್ಯಾಬ್ ಆಡಿಯೊ ಮ್ಯೂಟ್ ನಿಯಂತ್ರಿಸುವ ಕಾರಣದಿಂದಾಗಿ ಟ್ಯಾಬ್ ಸ್ಟ್ರಿಪ್‌ನಲ್ಲಿನ ಆಡಿಯೊ ಸೂಚಕಗಳು ದುಪ್ಪಟ್ಟುಗೊಳ್ಳಬಹುದು. ಆಯ್ಕೆಮಾಡಲಾದ ಬಹು ಟ್ಯಾಬ್‌ಗಳನ್ನು ತ್ವರಿತವಾಗಿ ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಬ್ ಸಂದರ್ಭದಲ್ಲಿ ಇದು ಆದೇಶಗಳನ್ನು ಸಹ ಸೇರಿಸುತ್ತದೆ.</translation>
 <translation id="259421303766146093">ವರ್ಧನೆ ಕುಗ್ಗಿಸು</translation>
 <translation id="2597852038534460976">Chrome ಗೆ ವಾಲ್‌ಪೇಪರ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ದಯವಿಟ್ಟು ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಪಡಿಸಿ.</translation>
@@ -1119,7 +1124,7 @@
 <translation id="2612676031748830579">ಕಾರ್ಡ್ ಸಂಖ್ಯೆ</translation>
 <translation id="2615569600992945508">ಯಾವುದೇ ಸೈಟ್‌ಗಳಿಗೂ ಮೌಸ್ ಕರ್ಸರ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಅನುಮತಿಸಬೇಡ</translation>
 <translation id="2616366145935564096"><ph name="WEBSITE_1" /> ನಲ್ಲಿ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಓದಿ ಮತ್ತು ಬದಲಾಯಿಸಿ</translation>
-<translation id="2617653079636271958">ಜೂಮ್: <ph name="VALUE" />%</translation>
+<translation id="2617653079636271958">ಝೂಮ್: <ph name="VALUE" />%</translation>
 <translation id="2617919205928008385">ಸ್ಥಳಾವಕಾಶ ಕಡಿಮೆ ಇದೆ</translation>
 <translation id="2619052155095999743">Insert</translation>
 <translation id="2620090360073999360">ಈ ಸಮಯದಲ್ಲಿ Google ಡ್ರೈವ್‌ ಅನ್ನು ತಲುಪಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation>
@@ -1470,7 +1475,6 @@
 <translation id="3065140616557457172">ಹುಡುಕಲು ನಮೂದಿಸಿ ಅಥವಾ ನ್ಯಾವಿಗೇಟ್‌ ಮಾಡಲು URL ಅನ್ನು ನಮೂದಿಸಿ- ಎಲ್ಲವೂ ಕೆಲಸ ಮಾಡುತ್ತದೆ.</translation>
 <translation id="3067198360141518313">ಈ ಪ್ಲಗಿನ್ ಚಾಲನೆ ಮಾಡು</translation>
 <translation id="307519606911195071">ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಪುಟದಲ್ಲಿ ಹೆಚ್ಚುವರಿ ಪ್ರವೇಶದ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> ಅವರನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರರಾಗಿ ರಚಿಸಲಾಗಿದೆ!</translation>
 <translation id="3075874217500066906">ಪವರ್‌ವಾಶ್ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಆರಂಭಿಸಲು ಪುನರಾರಂಭದ ಅಗತ್ಯವಿದೆ. ಪುನರಾರಂಭದ ನಂತರ ಮುಂದುವರಿಸಲು ಬಯಸುತ್ತೀರಾ ಎಂದು ನಿಮ್ಮಲ್ಲಿ ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಕೇಳಲಾಗುತ್ತದೆ.</translation>
 <translation id="3076677906922146425">Chrome ಗೆ ವ್ಯಕ್ತಿಯನ್ನು ಸೇರಿಸಲು ಯಾರಿಗಾದರೂ ಅನುಮತಿಸು</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1487,6 +1491,7 @@
 <translation id="3088034400796962477">ಲಿಪ್ಯಂತರಣ (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;ಮರುಹೆಸರಿಸು...</translation>
 <translation id="308903551226753393">ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಿ</translation>
+<translation id="3089231390674410424">ನಿಮ್ಮ ರುಜುವಾತುಗಳೊಂದಿಗೆ ಸಮಸ್ಯೆ ಇದೆಯೆಂದು ತೋರುತ್ತಿದೆ. ನೀವು ಸರಿಯಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಿರುವಿರಾ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="3090819949319990166">ಬಾಹ್ಯ crx ಫೈಲ್ ಅನ್ನು <ph name="TEMP_CRX_FILE" /> ಗೆ ನಕಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" ಜೋಡಿಸಲಾಗಿದೆ</translation>
 <translation id="3092544800441494315">ಈ ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ಅನ್ನು ಸೇರಿಸಿ:</translation>
@@ -1783,7 +1788,7 @@
 <translation id="3494768541638400973">Google ಜಪಾನೀಸ್ ಇನ್‌ಪುಟ್ (ಜಪಾನೀಸ್ ಕೀಬೋರ್ಡ್‌ಗಾಗಿ)</translation>
 <translation id="3494769164076977169">ಮೊದಲ ಫೈಲ್‌ ಬಳಿಕ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೈಟ್‌ವೊಂದು ಫೈಲ್‌ಗಳನ್ನು ಡೌನ್‌ಲೋಡ್‌ ಮಾಡಲು ಪ್ರಯತ್ನಿಸುವಾಗ ಕೇಳಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation>
 <translation id="3495304270784461826"><ph name="COUNT" /> ದೋಷಗಳು.</translation>
-<translation id="3496213124478423963">ಜೂಮ್ ಔಟ್</translation>
+<translation id="3496213124478423963">ಝೂಮ್ ಔಟ್</translation>
 <translation id="3496381219560704722">VPD ಮೌಲ್ಯಗಳನ್ನು ಅತಿಕ್ರಮಿಸು.</translation>
 <translation id="3496520356073548867">ಮಕ್ಕಳ ಖಾತೆಯ ಸುರಕ್ಷಿತಸೈಟ್‌ಗಳ ಫಿಲ್ಟರ್ ಮಾಡುವಿಕೆ</translation>
 <translation id="3502662168994969388">ಮ್ಯಾನಿಫೆಸ್ಟ್ ಫೈಲ್‌ನ URL ನಿಂದ ಸ್ಥಳೀಯ ಕ್ಲೈಂಟ್ ಅಪ್ಲಿಕೇಶನ್ GDB ಆಧಾರಿತ ಡೀಬಗ್ ಮಾಡುವುದನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತದೆ. ಸ್ಥಳೀಯ ಕ್ಲೈಂಟ್ GDB ಆಧಾರಿತ ಕಾರ್ಯನಿರ್ವಹಿಸಲು ಈ ಆಯ್ಕೆಗಾಗಿ ಡೀಬಗ್ ಮಾಡುವುದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕು.</translation>
@@ -1913,7 +1918,7 @@
 <translation id="3656059567098593256"><ph name="APP_NAME" /> ನಿಮ್ಮ ಪರದೆಯಲ್ಲಿರುವ ವಿಷಯವನ್ನು <ph name="TARGET_NAME" /> ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಲು ಬಯಸುತ್ತದೆ. ನೀವು ಹಂಚಿಕೊಳ್ಳಲು ಬಯಸುವ ಸಂಗತಿಯನ್ನು ಆಯ್ಕೆಮಾಡಿ.</translation>
 <translation id="3657468915905674858">PPAPI Win32k ಲಾಕ್‌ಡೌನ್ ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="3660234220361471169">ವಿಶ್ವಾಸಾರ್ಹವಿಲ್ಲದ</translation>
-<translation id="3665371460012342183">ಆಕಸ್ಮಿಕವಾಗಿ ಒಂದೇ ಬಾರಿಗೆ ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚು ಲಿಂಕ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸುವ ಸಮಯದಲ್ಲಿ ಟಚ್‌ಸ್ಕ್ರೀನ್‌ನ ಮೇಲೆ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಜೂಮ್ ಮಾಡಲಾದ ಗುಳ್ಳೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
+<translation id="3665371460012342183">ಆಕಸ್ಮಿಕವಾಗಿ ಒಂದೇ ಬಾರಿಗೆ ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚು ಲಿಂಕ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸುವ ಸಮಯದಲ್ಲಿ ಟಚ್‌ಸ್ಕ್ರೀನ್‌ನ ಮೇಲೆ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಝೂಮ್ ಮಾಡಲಾದ ಗುಳ್ಳೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="3665589677786828986">ನಿಮ್ಮ ಕೆಲವು ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಬೇರೊಂದು ಪ್ರೋಗ್ರಾಂನಿಂದಾಗಿ ಹಾನಿಗೊಳಗಾಗಿರುವುದು Chrome ಗಮನಕ್ಕೆ ಬಂದಿದೆ ಮತ್ತು ಅವುಗಳ ಮೂಲ ಡೀಫಾಲ್ಟ್‌ಗಳಿಗೆ ಅವುಗಳನ್ನು ಮರುಹೊಂದಿಸಿದೆ.</translation>
 <translation id="3665842570601375360">ಭದ್ರತೆ:</translation>
 <translation id="3668570675727296296">ಭಾಷೆಯ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
@@ -2012,7 +2017,6 @@
 <translation id="3790856258139356663">Chrome ಸಿಂಕ್‌ ಮಾಡಲು ಪರೀಕ್ಷಕ ಸರ್ವರ್‌ಗೆ ಸಂಪರ್ಕಪಡಿಸುತ್ತದೆ.</translation>
 <translation id="3790909017043401679">SIM ಕಾರ್ಡ್ PIN ನಮೂದಿಸಿ</translation>
 <translation id="3792890930871100565">ಮುದ್ರಕಗಳನ್ನು ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಿ</translation>
-<translation id="3795681127952030401">ನಿಮಗೆ ಅಧಿಸೂಚನೆಗಳನ್ನು ಕಳುಹಿಸಲು <ph name="URL" /> ಬಯಸುತ್ತದೆ.</translation>
 <translation id="3796648294839530037">ಮೆಚ್ಚಿನ ನೆಟ್‌ವರ್ಕ್‌ಗಳು:</translation>
 <translation id="3797900183766075808"><ph name="SEARCH_ENGINE" /> ಗಾಗಿ '<ph name="SEARCH_TERMS" />' &amp;ಹುಡುಕಿ</translation>
 <translation id="3798449238516105146">ಆವೃತ್ತಿ</translation>
@@ -2486,6 +2490,7 @@
 <translation id="4552678318981539154">ಇನ್ನಷ್ಟು ಸಂಗ್ರಹಣೆಯನ್ನು ಖರೀದಿಸಿ</translation>
 <translation id="4554591392113183336">ಬಾಹ್ಯ ವಿಸ್ತರಣೆಯು ಅಸ್ತಿತ್ವದಲ್ಲಿರುವುದಕ್ಕೆ ಹೋಲಿಸಿದರೆ ಅದೇ ಅಥವಾ ಕಡಿಮೆ ಆವೃತ್ತಿಯಲ್ಲಿದೆ</translation>
 <translation id="4554796861933393312">ವಸ್ತು ವಿನ್ಯಾಸ ಇಂಕ್ ಡ್ರಾಪ್ ಆನಿಮೇಶನ್ ವೇಗ</translation>
+<translation id="4555670907822902621">ಆಫ್‌ಲೈನ್ ವೀಕ್ಷಣೆಗಾಗಿ ಬುಕ್‌ಮಾರ್ಕ್‌ ಮಾಡಿದ ಪುಟಗಳನ್ನು ಉಳಿಸುವುದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="4555769855065597957">ನೆರಳು</translation>
 <translation id="4556110439722119938">ನಿಮ್ಮ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು, ಇತಿಹಾಸ, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಮತ್ತು ಇತರ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ನಿಮ್ಮ Google ಖಾತೆಗೆ ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತದೆ ಈ ಮೂಲಕ ಅವುಗಳನ್ನು ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ನೀವು ಬಳಸಬಹುದು</translation>
 <translation id="4557136421275541763">ಎಚ್ಚರಿಕೆ:</translation>
@@ -2663,6 +2668,7 @@
 <translation id="4824518112777153488">ಹರಿದಾಡುವ ಸಾಮರ್ಥ್ಯದ ಟಚ್‌ಸ್ಕ್ರೀನ್‌ಗಳಿಗೆ ಬೆಂಬಲ</translation>
 <translation id="4830573902900904548"><ph name="NETWORK_NAME" /> ಬಳಸಿಕೊಂಡು ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಇಂಟರ್ನೆಟ್‌ಗೆ ಸಂಪರ್ಕ ಹೊಂದಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ದಯವಿಟ್ಟು ಬೇರೊಂದು ನೆಟ್‌ವರ್ಕ್ ಆಯ್ಕೆಮಾಡಿ. <ph name="LEARN_MORE_LINK_START" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572"><ph name="LOCALITY" /> ಯಲ್ಲಿರುವ <ph name="ORGANIZATION" /> ಗುರುತನ್ನು <ph name="ISSUER" /> ಮೂಲಕ ಪರಿಶೀಲಿಸಲಾಗಿದೆ. ಮಾನ್ಯ ಪ್ರಮಾಣಪತ್ರ ಪಾರದರ್ಶಕತೆ ಮಾಹಿತಿಯನ್ನು ಸರ್ವರ್ ಮೂಲಕ ಪೂರೈಸಲಾಗಿದೆ.</translation>
+<translation id="4832537345877333532">ಪ್ರದರ್ಶನ ಬಣ್ಣ ಮಾಪನಾಂಕಕ್ಕೆ Quirks ಸರ್ವರ್‌ನಿಂದ icc ಪ್ರದರ್ಶನ ಫೈಲ್‌ಗಳನ್ನು ಪುನಃ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="4834912470034578916">ವೆಬ್ ಅಧಿಸೂಚನೆಗಳಿಗೆ ಕಸ್ಟಮ್ ವಿನ್ಯಾಸಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="4835836146030131423">ಸೈನ್ ಇನ್ ಮಾಡುವಲ್ಲಿ ದೋಷ.</translation>
 <translation id="4837926214103741331">ನೀವು ಈ ಸಾಧನವನ್ನು ಬಳಸಲು ಪ್ರಮಾಣಿತರಾಗಿಲ್ಲ. ಸೈನ್-ಇನ್ ಅನುಮತಿಗಾಗಿ ಸಾಧನ ಮಾಲೀಕನನ್ನು ಸಂಪರ್ಕಿಸಿ.</translation>
@@ -2849,6 +2855,7 @@
 <translation id="5120421890733714118">ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಗುರುತಿಸುವುದಕ್ಕಾಗಿ ಈ ಪ್ರಮಾಣಪತ್ರವನ್ನು ನಂಬಿರಿ.</translation>
 <translation id="5121130586824819730">ನಿಮ್ಮ ಹಾರ್ಡ್ ಡಿಸ್ಕ್ ಭರ್ತಿಯಾಗಿದೆ. ದಯವಿಟ್ಟು ಬೇರೊಂದು ಸ್ಥಳದಲ್ಲಿ ಉಳಿಸಿ ಇಲ್ಲವೇ ಹಾರ್ಡ್ ಡಿಸ್ಕ್‌ನಲ್ಲಿ ಹೆಚ್ಚಿನ ಅವಕಾಶ ಕಲ್ಪಿಸಿ.</translation>
 <translation id="5125751979347152379">ಅಮಾನ್ಯವಾದ URL.</translation>
+<translation id="5126663277159826272">ಪ್ರದರ್ಶನ ಮಾಪನಾಂಕಕ್ಕೆ Quirks ಕ್ಲೈಂಟ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="5127881134400491887">ನೆಟ್‌ವರ್ಕ್‌ ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation>
 <translation id="5128590998814119508">ಪ್ರದರ್ಶನ ಪಟ್ಟಿ 2D ಕ್ಯಾನ್ವಾಸ್</translation>
 <translation id="512903556749061217">ಲಗತ್ತಿಸಲಾಗಿದೆ</translation>
@@ -2993,9 +3000,11 @@
 <translation id="5301751748813680278">ಅತಿಥಿಯಾಗಿ ಪ್ರವೇಶಿಸಲಾಗಿದೆ.</translation>
 <translation id="5301954838959518834">ಸರಿ, ಅರ್ಥವಾಯಿತು</translation>
 <translation id="5302048478445481009">ಭಾಷೆ</translation>
+<translation id="5304039790201806037">ಪಾಯಿಂಟರ್ ಈವೆಂಟ್‌ಗಳು</translation>
 <translation id="5305688511332277257">ಯಾವುದನ್ನೂ ಸ್ಥಾಪನೆ ಮಾಡಲಾಗಿಲ್ಲ</translation>
 <translation id="5308380583665731573">ಸಂಪರ್ಕಿಸು</translation>
 <translation id="5311260548612583999">ಖಾಸಗಿ ಕೀಲಿ ಫೈಲ್ (ಐಚ್ಛಿಕ):</translation>
+<translation id="5313967007315987356">ಸೈಟ್ ಸೇರಿಸಿ</translation>
 <translation id="5316588172263354223">ಧ್ವನಿ ಹುಡುಕಾಟ; ಯಾವುದೇ ಸಮಯದಲ್ಲಿ!</translation>
 <translation id="5316716239522500219">ಪ್ರತಿಬಿಂಬಿಸುವ ಮಾನೀಟರ್‌ಗಳು</translation>
 <translation id="5317780077021120954">ಉಳಿಸು</translation>
@@ -3186,7 +3195,7 @@
 <translation id="5556459405103347317">ಮರುಲೋಡ್‌</translation>
 <translation id="555746285996217175">ಲಾಕ್ / ಪವರ್</translation>
 <translation id="5557991081552967863">ನಿದ್ರೆ ಸಮಯದಲ್ಲಿ Wi-Fi ಆನ್ ಇರಿಸಿ</translation>
-<translation id="5558129378926964177">ಜೂಮ್ &amp;ಇನ್</translation>
+<translation id="5558129378926964177">ಝೂಮ್ &amp;ಇನ್</translation>
 <translation id="556042886152191864">ಬಟನ್</translation>
 <translation id="5562781907504170924">ಈ ಟ್ಯಾಬ್ ಅನ್ನು Bluetooth ಸಾಧನಕ್ಕೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ.</translation>
 <translation id="5565871407246142825">ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್‌ಗಳು</translation>
@@ -3299,6 +3308,7 @@
 <translation id="5734362860645681824">ಸಂವಹನಗಳು</translation>
 <translation id="573719557377416048">ಕೊಪ್ರೆಸೆನ್ಸ್‌‌ ಸ್ಥಿತಿ ತೆರವುಗೊಳಿಸು</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: ಸಂಪಾದಿಸಲು ಆಯ್ಕೆಮಾಡಿ</translation>
+<translation id="5741454054957165976">ಹೊಸ ಆವೃತ್ತಿ WebFonts ಲೋಡ್ ಆಗುವಿಕೆಗೆ ಬಳಕೆದಾರ-ಏಜೆಂಟ್ ಮಧ್ಯಸ್ಥಿಕೆ ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="574392208103952083">ಮಧ್ಯಮ</translation>
 <translation id="5745056705311424885">USB ಸ್ಮರಣೆಯ ಸ್ಟಿಕ್ ಅನ್ನು ಪತ್ತೆಹಚ್ಚಲಾಗಿದೆ</translation>
 <translation id="5746169159649715125">PDF ನಂತೆ ಉಳಿಸಿ</translation>
@@ -3347,7 +3357,6 @@
 <translation id="5803531701633845775">ಕರ್ಸರ್ ಅನ್ನು ಸರಿಸದೇ, ಹಿಂದಿನಿಂದ ನುಡಿಗಟ್ಟುಗಳನ್ನು ಆರಿಸಿ</translation>
 <translation id="5804241973901381774">ಅನುಮತಿಗಳು</translation>
 <translation id="580571955903695899">ಶೀರ್ಷಿಕೆಯಂತೆ ಮರುಕ್ರಮಗೊಳಿಸಿ</translation>
-<translation id="5808982448801399019">ದೃಢೀಕರಣ ವಿಫಲವಾಗಿದೆ</translation>
 <translation id="580961539202306967">ಪುಶ್‌ ಸಂದೇಶಗಳನ್ನು ಸೈಟ್‌ಗಳು ನನಗೆ ಕಳುಹಿಸಲು ಬಯಸಿದಾಗ ನನ್ನನ್ನು ಕೇಳಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation>
 <translation id="5815645614496570556">X.400 ವಿಳಾಸ</translation>
 <translation id="5817397429773072584">ಸಾಂಪ್ರದಾಯಿಕ ಚೈನೀಸ್</translation>
@@ -3372,6 +3381,7 @@
 <translation id="5834581999798853053">ಸುಮಾರು <ph name="TIME" /> ನಿಮಿಷಗಳು ಉಳಿದಿವೆ</translation>
 <translation id="5838825566232597749">US ವರ್ಕ್‌ಮ್ಯಾನ್ ಇಂಟರ್‌ನ್ಯಾಶನಲ್</translation>
 <translation id="5839277899276241121">ಬಿಲ್ಲಿಂಗ್‌ ವಿಳಾಸದಂತೆಯೇ</translation>
+<translation id="5844550873065695788">ಇದು ಈ ಸಾಧನದಿಂದ ಖಾಯಂ ಆಗಿ ಕನಿಷ್ಟ <ph name="TOTAL_COUNT" /> ಐಟಂಗಳನ್ನು ಅಳಿಸುತ್ತದೆ. ನಂತರ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಹಿಂಪಡೆಯಲು, $2 ನಂತೆ Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation>
 <translation id="5846929185714966548">ಟ್ಯಾಬ್ 4</translation>
 <translation id="5848934677402291689">ಪ್ರಗತಿಯಲ್ಲಿರುವ PDF ಗೆ ಉಳಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="5849335628409778954">ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ನಮೂದಿಸಿ ...</translation>
@@ -3450,7 +3460,7 @@
 <translation id="5971037678316050792">Bluetooth ಅಡಾಪ್ಟರ್ ಸ್ಥಿತಿ ಮತ್ತು ಜೋಡಿಸುವಿಕೆಯನ್ನು ನಿಯಂತ್ರಿಸು</translation>
 <translation id="5972017421290582825">MIDI ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ...</translation>
 <translation id="5972826969634861500"><ph name="PRODUCT_NAME" /> ಪ್ರಾರಂಭಿಸು</translation>
-<translation id="5975083100439434680">ಜೂಮ್ ಔಟ್</translation>
+<translation id="5975083100439434680">ಝೂಮ್ ಔಟ್</translation>
 <translation id="5975792506968920132">ಬ್ಯಾಟರಿ ಚಾರ್ಜ್‌ನ ಶೇಕಡಾವಾರು</translation>
 <translation id="5976160379964388480">ಇತರರು</translation>
 <translation id="5978264784700053212">ಸಂದೇಶ ಕೇಂದ್ರ</translation>
@@ -3616,6 +3626,7 @@
 <translation id="6232017090690406397">ಬ್ಯಾಟರಿ</translation>
 <translation id="6241530762627360640">ನಿಮ್ಮ ಸಿಸ್ಟಂ ಜೊತೆಗೆ ಜೋಡಿಯಾಗಿರುವ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳ ಕುರಿತ ಮಾಹಿತಿಯನ್ನು ಪ್ರವೇಶಿಸಿ ಮತ್ತು ಹತ್ತಿರದ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳನ್ನು ಪತ್ತೆಹಚ್ಚಿ.</translation>
 <translation id="6243774244933267674">ಸರ್ವರ್ ಲಭ್ಯವಿಲ್ಲ</translation>
+<translation id="6246413617632217567">ಮೇಲ್ವಿಚಾರಣೆಯ ಬಳಕೆದಾರರನ್ನು ಆಮದು ಮಾಡಿಕೊಳ್ಳಲಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ಹಾರ್ಡ್ ಡ್ರೈವ್ ಸ್ಥಳಾವಕಾಶ ಮತ್ತು ಅನುಮತಿಗಳನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">ಅಪ್‌ಡೇಟ್‌‌ ಸಿದ್ಧವಾಗಿದೆ</translation>
 <translation id="6248400709929739064">ಉಪಶೀರ್ಷಿಕೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸು</translation>
@@ -3644,6 +3655,7 @@
 <translation id="6277518330158259200">ಸ್ಕ್ರೀ&amp;ನ್‌ಶಾಟ್‌ ತೆಗೆದುಕೊಳ್ಳಿ</translation>
 <translation id="6279183038361895380">ನಿಮ್ಮ ಕರ್ಸರ್ ತೋರಿಸಲು |<ph name="ACCELERATOR" />| ಒತ್ತಿ</translation>
 <translation id="6280215091796946657">ಬೇರೆ ಖಾತೆಯೊಂದಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">ಎಲ್ಲಾ API ಗಳು ಲೇಔಟ್ ವೀವ್‌ಪೋರ್ಟ್ ಅನ್ನು ಪ್ರತಿಬಿಂಬಿಸುವಂತೆ ಮಾಡುವ ಪ್ರಯೋಗ. ಇದು window.scroll ಗುಣಲಕ್ಷಣಗಳು ಲೇಔಟ್ ವೀವ್‌ಪೋರ್ಟ್‌ಗೆ ಸಂಬಂಧ ಹೊಂದುವಂತೆ ಮಾಡುತ್ತದೆ.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಹೊಸ ಪ್ರಿಂಟರ್}one{ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಹೊಸ ಪ್ರಿಂಟರ್‌ಗಳು}other{ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಹೊಸ ಪ್ರಿಂಟರ್‌ಗಳು}}</translation>
 <translation id="6285395082104474418">ಸ್ಥಿತಿ ಪ್ರಯತ್ನಿಸಿ ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್‌, ಬ್ಯಾಟರಿ ಮತ್ತು ಹೆಚ್ಚಿನ ಪ್ರಸ್ತುತ ಸ್ಥಿತಿಯನ್ನು ನಿಮಗೆ ತೋರಿಸುತ್ತದೆ.</translation>
@@ -3699,6 +3711,7 @@
 <translation id="6380143666419481200">ಸಮ್ಮತಿಸಿ ಮತ್ತು ಮುಂದುವರಿಯಿರಿ</translation>
 <translation id="6380224340023442078">ವಿಷಯ ಸೆಟ್ಟಿಂಗ್‌ಗಳು...</translation>
 <translation id="6383194710567510941">chrome.input.ime API ಬಳಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{ಇದು ಈ ಸಾಧನದಿಂದ ಖಾಯಂ ಆಗಿ ಕನಿಷ್ಠ $1 ಐಟಂ ಅಳಿಸುತ್ತದೆ. ನಂತರ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಹಿಂಪಡೆಯಲು, $2 ನಂತೆ Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.}one{ಇದು ಈ ಸಾಧನದಿಂದ ಖಾಯಂ ಆಗಿ ಕನಿಷ್ಠ $1 ಐಟಂಗಳನ್ನು ಅಳಿಸುತ್ತದೆ. ನಂತರ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಹಿಂಪಡೆಯಲು, $2 ನಂತೆ Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.}other{ಇದು ಈ ಸಾಧನದಿಂದ ಖಾಯಂ ಆಗಿ ಕನಿಷ್ಠ $1 ಐಟಂಗಳನ್ನು ಅಳಿಸುತ್ತದೆ. ನಂತರ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಹಿಂಪಡೆಯಲು, $2 ನಂತೆ Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.}}</translation>
 <translation id="6384275966486438344">ನಿಮ್ಮ ಹುಡುಕಾಟದ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಹೀಗೆ ಬದಲಾಯಿಸಿ: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ತೆರೆದಿರುವ ಎಲ್ಲ ಅತಿಥಿ ವಿಂಡೊಗಳನ್ನು ಮುಚ್ಚಿದ ನಂತರ ಈ ವಿಂಡೊದಲ್ಲಿ ನೀವು ವೀಕ್ಷಿಸುವ ಪುಟಗಳು ಬ್ರೌಸರ್ ಇತಿಹಾಸದಲ್ಲಿ ಗೋಚರಿಸುವುದಿಲ್ಲ ಮತ್ತು ಅವುಗಳು ಕುಕೀಗಳಂತಹ ಇತರ ಗುರುತುಗಳನ್ನು ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ಬಿಡುವುದಿಲ್ಲ. ಆದಾಗ್ಯೂ, ನೀವು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿದ ಯಾವುದೇ ಫೈಲ್‌ಗಳನ್ನು ರಕ್ಷಿಸಲಾಗುತ್ತದೆ.</translation>
 <translation id="6391538222494443604">ಇನ್‌ಪುಟ್ ಡೈರೆಕ್ಟರಿ ಅಸ್ತಿತ್ವದಲ್ಲಿರಬೇಕು.</translation>
@@ -3836,6 +3849,7 @@
 <translation id="6575134580692778371">ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿಲ್ಲ</translation>
 <translation id="6575251558004911012">ನಿಮ್ಮ ಕ್ಯಾಮರಾಗೆ ಸೈಟ್‌ನ ಪ್ರವೇಶ ಅಗತ್ಯವಿರುವಾಗ ಕೇಳಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation>
 <translation id="6579159469348633828">Brotli ವಿಷಯ-ಎನ್‌ಕೋಡ್‌ ಮಾಡುವಿಕೆ.</translation>
+<translation id="6580151766480067746">ARC ಆವೃತ್ತಿ</translation>
 <translation id="6581162200855843583">Google ಡ್ರೈವ್ ಲಿಂಕ್</translation>
 <translation id="6583070985841601920"><ph name="USER_EMAIL_ADDRESS" /> ಹೆಸರಿನಲ್ಲಿ ಸೈನ್ ಇನ್ ಮಾಡಲಾಗಿದೆ. ನಿಮ್ಮ ನಿರ್ವಾಹಕದ ಮೂಲಕ ಸಿಂಕ್ ಮಾಡುವಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.</translation>
 <translation id="65832705307647870">ಜನಪ್ರಿಯ ಸೈಟ್‌ಗಳ ಜೊತೆಗೆ ಹೊಸ ಟ್ಯಾಬ್‌ ಪುಟವನ್ನು ಪೂರ್ವ ಜನಪ್ರಿಯಗೊಳಿಸಿ.</translation>
@@ -3882,7 +3896,7 @@
 <translation id="6655190889273724601">ಡೆವೆಲಪರ್ ಮೋಡ್</translation>
 <translation id="6655458902729017087">ಖಾತೆಗಳನ್ನು ಮರೆಮಾಡು</translation>
 <translation id="6657585470893396449">ಪಾಸ್‌ವರ್ಡ್</translation>
-<translation id="6659213950629089752">ಈ ಪುಟವನ್ನು "<ph name="NAME" />" ವಿಸ್ತರಣೆಯಿಂದ  ಜೂಮ್‌ ಮಾಡಲಾಗಿದೆ</translation>
+<translation id="6659213950629089752">ಈ ಪುಟವನ್ನು "<ph name="NAME" />" ವಿಸ್ತರಣೆಯಿಂದ  ಝೂಮ್‌ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="6659594942844771486">ಟ್ಯಾಬ್</translation>
 <translation id="6662016084451426657">ಸಿಂಕ್ ದೋಷ: ಸಿಂಕ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ದಯವಿಟ್ಟು ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</translation>
 <translation id="6663792236418322902">ನಂತರ ಈ ಫೈಲ್ ಅನ್ನು ಮರುಸಂಗ್ರಹಿಸಲು ನೀವು ಆಯ್ಕೆಮಾಡಿದ ಪಾಸ್‌ವರ್ಡ್ ಅಗತ್ಯವಿದೆ. ದಯವಿಟ್ಟು ಸುರಕ್ಷಿತ ಸ್ಥಳದಲ್ಲಿ ರೆಕಾರ್ಡ್ ಮಾಡಿ.</translation>
@@ -4002,6 +4016,7 @@
 <translation id="6847758263950452722">MHTML ನಂತೆ ಪುಟವನ್ನು ಉಳಿಸಿ</translation>
 <translation id="6853388645642883916">ನವೀಕರಣವು ನಿದ್ರೆಯಲ್ಲಿದೆ</translation>
 <translation id="68541483639528434">ಇತರ ಟ್ಯಾಬ್‌ಗಳನ್ನು ಮುಚ್ಚಿ</translation>
+<translation id="6856701878604560493">ಆಫ್‌ಲೈನ್ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="6860097299815761905">ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು...</translation>
 <translation id="6860427144121307915">ಟ್ಯಾಬ್‌ನಲ್ಲಿ ತೆರೆಯಿರಿ</translation>
 <translation id="6862635236584086457">ಈ ಫೋಲ್ಡರ್‌ನಲ್ಲಿ ಉಳಿಸಲಾದ ಎಲ್ಲಾ ಫೈಲ್‌ಗಳನ್ನು ಆನ್‌ಲೈನ್‌ನಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಬ್ಯಾಕಪ್ ಮಾಡಲಾಗಿದೆ</translation>
@@ -4174,6 +4189,7 @@
 <translation id="7092106376816104">ಪಾಪ್-ಅಪ್ ವಿನಾಯಿತಿಗಳು</translation>
 <translation id="7093866338626856921">ಈ ಹೆಸರಿನ ಸಾಧನಗಳೊಂದಿಗೆ ಡೇಟಾ ವಿನಿಮಯ ಮಾಡಿ: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">ಇನ್ನಷ್ಟು ಅದ್ಭುತ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಅನ್ವೇಷಿಸಲು ಬಯಸುವಿರಾ?</translation>
+<translation id="7096108453481049031">ಮೇಲ್ವಿಚಾರಣೆಯ ಬಳಕೆದಾರರನ್ನು ಆಮದು ಮಾಡಲಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> ಐಟಂಗಳನ್ನು ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ</translation>
 <translation id="710227449793100220">ಟೋಕನ್ ಬೈಂಡಿಂಗ್.</translation>
 <translation id="7106346894903675391">ಇನ್ನಷ್ಟು ಸಂಗ್ರಹಣೆಯನ್ನು ಖರೀದಿಸಿ...</translation>
@@ -4202,6 +4218,7 @@
 <translation id="713888829801648570">ಕ್ಷಮಿಸಿ, ನೀವು ಆಫ್‌ಲೈನ್‌ನಲ್ಲಿರುವ ಕಾರಣ ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಲಾಗುವುದಿಲ್ಲ.</translation>
 <translation id="7140928199327930795">ಇತರ ಯಾವುದೇ ಲಭ್ಯ ಸಾಧನಗಳಿಲ್ಲ.</translation>
 <translation id="7141105143012495934">ನಿಮ್ಮ ಖಾತೆ ವಿವರಗಳನ್ನು ಹಿಂಪಡೆಯಲು ಸಾಧ್ಯವಾಗದಿರುವುದರಿಂದ ಸೈನ್ ಇನ್ ವಿಫಲವಾಗಿದೆ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ ಅಥವಾ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
+<translation id="7141331524324591758">ಪಾಯಿಂಟರ್ ಈವೆಂಟ್‌ಗಳ API ಗೆ ಭಾಗಶಃ ಪ್ರಾಯೋಗಿಕ ಬೆಂಬಲವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ. ಇದು ವೆಬ್ ಡೆವಲಪರ್‌ಗಳ ಪರೀಕ್ಷೆಗಾಗಿ ಮಾತ್ರ ಉದ್ದೇಶಿಸಲಾಗಿದೆ, ಇದು ಕೆಲವು ವೆಬ್‌ಸೈಟ್‌ಗಳು ಸೂಕ್ಷ್ಮವಾಗಿ ಒಡೆಯಲು ಕಾರಣವಾಗುತ್ತದೆ.</translation>
 <translation id="7143207342074048698">ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="7144878232160441200">ಮರುಪ್ರಯತ್ನಿಸಿ</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಅದನ್ನು ಮರು-ಸಕ್ರಿಯಗೊಳಿಸಲು, ದಯವಿಟ್ಟು <ph name="CHROME_PLUGINS_LINK" /> ಗೆ ಹೋಗಿ.</translation>
@@ -4847,6 +4864,7 @@
 <translation id="8119572489781388874">ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಮಾರ್ಪಡಿಸಿ</translation>
 <translation id="8119631488458759651">ಈ ಸೈಟ್ ಅನ್ನು ತೆಗೆಯಿರಿ</translation>
 <translation id="8121385576314601440">ಹಂಗುಲ್ ಇನ್‌ಪುಟ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
+<translation id="8122245494004914423">ಇದು ಈ ಸಾಧನದಿಂದ ಖಾಯಂ ಆಗಿ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ. ನಂತರ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಹಿಂಪಡೆಯಲು, $2 ನಂತೆ Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation>
 <translation id="8124313775439841391">ನಿರ್ವಹಿಸಲಾದ ONC</translation>
 <translation id="8126844665673008223">ವೆಬ್ ಬ್ಲೂಟೂತ್</translation>
 <translation id="8127322077195964840">ಸ್ಥಳೀಯಹೋಸ್ಟ್‌ನಿಂದ ಲೋಡ್ ಮಾಡಲಾದ ಸಂಪನ್ಮೂಲಗಳಿಗೆ ಅಮಾನ್ಯವಾದ ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ಅನುಮತಿಸಿ.</translation>
@@ -4931,6 +4949,7 @@
 <translation id="8226742006292257240">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ಗೆ ಹೊಂದಿಸಲಾದ, ರ‍್ಯಾಂಡಮ್‌‌ ಆಗಿ ರಚಿಸಲಾದ TPM ಪಾಸ್‌ವರ್ಡ್ ಕೆಳಗಿದೆ:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ನ ದಾಳಿಕೋರರು ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ಮಾಹಿತಿಯನ್ನು (ಉದಾಹರಣೆಗೆ, ಫೋಟೋಗಳು, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಮತ್ತು ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ಮಾಹಿತಿಗಳು) ಕದಿಯಲು ಇಲ್ಲವೇ ಅಳಿಸಲು ಅಪಾಯಕಾರಿ ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ಸ್ಥಾಪಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರಬಹುದು.</translation>
+<translation id="8233254008506535819">ಬ್ರೌಸಿಂಗ್ ಡೇಟಾ ತೆರವುಗೊಳಿಸು ಸಂವಾದದಲ್ಲಿರುವ ಪ್ರಮುಖ ಸೈಟ್‌ಗಳನ್ನು ಶ್ವೇತಪಟ್ಟಿ ಆಯ್ಕೆಗೆ ಸೇರಿಸಿ.</translation>
 <translation id="8236231079192337250">ಪ್ರಿಂಟರ್ ಡ್ರೈವರ್‌ಗಳಿಗೆ Chrome ವೆಬ್ ಅಂಗಡಿ ಗ್ಯಾಲರಿ ಅಪ್ಲಿಕೇಶನ್</translation>
 <translation id="8238649969398088015">ಸಹಾಯ ಸಲಹೆ</translation>
 <translation id="8240697550402899963">ಕ್ಲಾಸಿಕ್ ಥೀಮ್ ಬಳಸಿ</translation>
@@ -5099,7 +5118,7 @@
 <translation id="8479179092158736425">ಸಕ್ರಿಯ ನಿರ್ದೇಶನಗಳು</translation>
 <translation id="8480417584335382321">ಪುಟ ಝೂಮ್‌:</translation>
 <translation id="8481940801237642152">ಈ ಸೈಟ್‌ಗೆ ನಿಮ್ಮ ಸಂಪರ್ಕವು ಖಾಸಗಿಯಾಗಿದೆ, ಆದರೆ ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿನ ಯಾರಾದರೂ ಪುಟದ ನೋಟವನ್ನು ಬದಲಾಯಿಸಬಹುದು.</translation>
-<translation id="8487678622945914333">ಜೂಮ್ ಇನ್</translation>
+<translation id="8487678622945914333">ಝೂಮ್ ಇನ್</translation>
 <translation id="8487693399751278191">ಇದೀಗ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳನ್ನು ಆಮದು ಮಾಡಿ...</translation>
 <translation id="8487700953926739672">ಆಫ್‌ಲೈನ್ ಲಭ್ಯವಿದೆ</translation>
 <translation id="8490896350101740396">ಈ ಕೆಳಗಿನ ಕಿಯೋಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು "<ph name="UPDATED_APPS" />" ನವೀಕರಿಸಲಾಗಿದೆ. ಅಪ್‌ಡೇಟ್‌‌ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ದಯವಿಟ್ಟು ಸಾಧನವನ್ನು ರೀಬೂಟ್ ಮಾಡಿ.</translation>
@@ -5254,7 +5273,6 @@
 <translation id="8708671767545720562">&amp;ಹೆಚ್ಚಿನ ಮಾಹಿತಿ</translation>
 <translation id="8711402221661888347">ಪಿಕಲ್ಸ್</translation>
 <translation id="8711453844311572806">ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಿರುವಾಗ ಮತ್ತು ಹತ್ತಿರದಲ್ಲಿರುವಾಗ, ಪ್ರವೇಶಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ. ಇಲ್ಲದಿದ್ದರೆ, ನೀವು ಲಾಕ್ ಮಾಡಲಾದ ಐಕಾನ್ ಅನ್ನು ವೀಕ್ಷಿಸುತ್ತೀರಿ ಮತ್ತು ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಟೈಪ್ ಮಾಡಬೇಕಾದ ಅಗತ್ಯವಿರುತ್ತದೆ.</translation>
-<translation id="8712637175834984815">ಅರ್ಥವಾಯಿತು</translation>
 <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />ಸಿಸ್ಟಂ ಮಾಹಿತಿಯನ್ನು<ph name="END_LINK1" /> ಕಳುಹಿಸಿ</translation>
 <translation id="8713979477561846077">US ಕೀಬೋರ್ಡ್‌ಗೆ ಭೌತಿಕ ಕೀಬೋರ್ಡ್ ಸ್ವಯಂಸರಿಪಡಿಸುವಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ, ಇದು ಭೌತಿಕ ಕೀಬೋರ್ಡ್‌ನಲ್ಲಿ ಟೈಪ್ ಮಾಡಿದಂತೆ ಸಲಹೆಗಳನ್ನು ನೀಡುತ್ತದೆ.</translation>
 <translation id="871476437400413057">Google ಉಳಿಸಲಾದ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು</translation>
@@ -5383,7 +5401,7 @@
 <translation id="8899851313684471736">ಹೊಸ &amp;ವಿಂಡೋದಲ್ಲಿ ಲಿಂಕ್ ತೆರೆಯಿರಿ</translation>
 <translation id="8900820606136623064">ಹಂಗೇರಿಯನ್</translation>
 <translation id="8901822611024316615">ಝೆಕ್ QWERTY ಕೀಬೋರ್ಡ್</translation>
-<translation id="8903921497873541725">ಜೂಮ್ ಇನ್</translation>
+<translation id="8903921497873541725">ಝೂಮ್ ಇನ್</translation>
 <translation id="8904976895050290827">Chrome Sync</translation>
 <translation id="8908902564709148335">ಎಚ್ಚರಿಕೆ: ನೀವು ಈ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ಈ ವಿಸ್ತರಣಾ ಸಾಮರ್ಥ್ಯಗಳನ್ನು ಮಿತಿಗೊಳಿಸುವಂತಹ --ಕ್ರಮ ಅಗತ್ಯವಿರುವ ಫ್ಲ್ಯಾಗ್‌ನ ಸ್ಕ್ರಿಪ್ಟ್‌ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿರುವಿರಿ. ಆದಾಗ್ಯೂ, ಇತರ ಸಾಧನಗಳು ಈ ಫ್ಲ್ಯಾ‌ಗ್ ಅನ್ನು ಬೆಂಬಲಿಸದಿರಬಹುದು ಅಥವಾ ಸಕ್ರಿಯಗೊಳಿಸದಿರಬಹುದು. ಈ ಸಾಧನಗಳಲ್ಲಿ, ಈ ವಿಸ್ತರಣೆಯು ಹೀಗೆ ಮಾಡಬಹುದು:</translation>
 <translation id="8910146161325739742">ನಿಮ್ಮ ಪರದೆಯನ್ನು ಹಂಚಿಕೊಳ್ಳಿ</translation>
@@ -5619,6 +5637,7 @@
 <translation id="952992212772159698">ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿಲ್ಲ</translation>
 <translation id="953000875543358078">ಇದು ಒಂದು ನಿಮಿಷ ಅಥವಾ ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು</translation>
 <translation id="960987915827980018">ಸುಮಾರು 1 ಗಂಟೆ ಉಳಿದಿದೆ</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{ಇದು ಈ ಸಾಧನದಿಂದ ಖಾಯಂ ಆಗಿ $1 ಐಟಂ ಅನ್ನು ಅಳಿಸುತ್ತದೆ. ನಂತರ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಹಿಂಪಡೆಯಲು, $2 ನಂತೆ Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.}one{ಇದು ಈ ಸಾಧನದಿಂದ ಖಾಯಂ ಆಗಿ $1 ಐಟಂಗಳನ್ನು ಅಳಿಸುತ್ತದೆ. ನಂತರ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಹಿಂಪಡೆಯಲು, $2 ನಂತೆ Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.}other{ಇದು ಈ ಸಾಧನದಿಂದ ಖಾಯಂ ಆಗಿ $1 ಐಟಂಗಳನ್ನು ಅಳಿಸುತ್ತದೆ. ನಂತರ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಹಿಂಪಡೆಯಲು, $2 ನಂತೆ Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.}}</translation>
 <translation id="96421021576709873">Wi-Fi ನೆಟ್‌ವರ್ಕ್‌</translation>
 <translation id="965490406356730238">ಕ್ಯಾಪ್ಚರ್‌ ಮಾಡಲಾದ ಫ್ರೇಮ್‌ಗೆ ಲಭ್ಯವಿರುವಲ್ಲಿ ಹಾರ್ಡ್‌ವೇರ್-ವೇಗೋತ್ಕರ್ಷಿತ mjpeg ಡೀಕೋಡ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="968174221497644223">ಅಪ್ಲಿಕೇಶನ್ ಸಂಗ್ರಹ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index b535749..a8f62a0b 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -251,6 +251,7 @@
       <ph name="USER_DISPLAY_EMAIL" />와(과) 연결되어 있으며 호환되는 모든 기기의 블루투스가 사용 설정되며 일부 하드웨어 정보가 Google로 전송됩니다. &lt;a&gt;자세히 알아보기&lt;/a&gt;</translation>
 <translation id="13649080186077898">자동완성 설정 관리</translation>
 <translation id="1367951781824006909">파일 선택</translation>
+<translation id="136802136832547685">이 기기에 추가할 관리 대상 사용자가 없습니다.</translation>
 <translation id="1368265273904755308">문제 신고</translation>
 <translation id="1368832886055348810">왼쪽에서 오른쪽으로</translation>
 <translation id="1370646789215800222">이 사용자를 삭제하시겠습니까?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">검색</translation>
 <translation id="1384211230590313258">서비스 검색 핸들러</translation>
 <translation id="1386387014181100145">안녕하세요.</translation>
+<translation id="1386830813511981192">이제 <ph name="DEVICE_TYPE" />에서 백만 개 이상의 앱 및 게임을 사용할 수 있습니다.</translation>
 <translation id="1389297115360905376">이 프로그램은 <ph name="CHROME_WEB_STORE" />에서만 추가할 수 있습니다.</translation>
 <translation id="1390548061267426325">일반 탭으로 열기</translation>
 <translation id="1395262318152388157">탐색 슬라이더</translation>
@@ -894,6 +896,7 @@
 <translation id="2280486287150724112">오른쪽 여백</translation>
 <translation id="2282146716419988068">GPU 프로세스</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">WebFonts 로드용 사용자 에이전트 개입의 새 버전</translation>
 <translation id="2286454467119466181">단순</translation>
 <translation id="2286950485307333924">이제 Chrome에 로그인되었습니다.</translation>
 <translation id="2287590536030307392">모든 무선 연결을 사용하지 않습니다.</translation>
@@ -1071,6 +1074,7 @@
 <translation id="2542049655219295786">Google 표</translation>
 <translation id="2546283357679194313">쿠키 및 사이트 데이터</translation>
 <translation id="2549646943416322527">Seccomp 감지기</translation>
+<translation id="2550212893339833758">교체된 메모리</translation>
 <translation id="2553100941515833716">재시작할 때마다 앱 런처 설치 상태를 재설정합니다.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" />에서 <ph name="NETWORK_ID" />에 연결할 수 없습니다. 다른 네트워크를 선택하거나 다시 시도하세요.</translation>
 <translation id="2553440850688409052">이 플러그인 숨기기</translation>
@@ -1104,6 +1108,7 @@
 <translation id="2587203970400270934">운영자 코드:</translation>
 <translation id="2587922270115112871">관리 대상 사용자를 생성해도 Google 계정이 생성되지 않으며, 해당 사용자의 설정
     및 데이터는 Chrome 동기화를 통해 다른 기기에 동기화되지 않습니다. 관리 대상 사용자는 이 기기에만 적용됩니다.</translation>
+<translation id="2594049137847833442">인터넷 사용 기록 삭제 대화상자의 중요한 사이트 옵션</translation>
 <translation id="2594056015203442344">사용하도록 설정하면 탭 표시줄의 오디오 표시기가 탭 오디오 음소거 컨트롤의 기능도 겸하게 됩니다. 또한 선택한 여러 탭을 빠르게 음소거할 수 있도록 탭 컨텍스트 메뉴에 명령어도 추가합니다.</translation>
 <translation id="259421303766146093">축소</translation>
 <translation id="2597852038534460976">Chrome에서 배경화면에 액세스할 수 없습니다. 네트워크에 연결하세요.</translation>
@@ -1471,7 +1476,6 @@
 <translation id="3065140616557457172">검색할 키워드나 사이트 URL, 무엇이든 입력하세요.</translation>
 <translation id="3067198360141518313">이 플러그인 실행</translation>
 <translation id="307519606911195071">설정 페이지에서 추가 접근성 기능을 사용하도록 설정합니다.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" />님이 관리 대상 사용자로 생성되었습니다.</translation>
 <translation id="3075874217500066906">Powerwash 프로세스를 시작하려면 다시 시작해야 합니다. 다시 시작하면 계속 진행할 지를 확인하는 메시지가 표시됩니다.</translation>
 <translation id="3076677906922146425">누구나 사용자를 Chrome에 추가할 수 있도록 합니다.</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1488,6 +1492,7 @@
 <translation id="3088034400796962477">음역(salam ← سلام)</translation>
 <translation id="3088325635286126843">이름 바꾸기(&amp;R)...</translation>
 <translation id="308903551226753393">자동 설정</translation>
+<translation id="3089231390674410424">사용자 인증 정보에 문제가 있는 것 같습니다. 제대로 로그인했는지 확인한 후 다시 시도해 주세요.</translation>
 <translation id="3090819949319990166">외부 crx 파일을 <ph name="TEMP_CRX_FILE" />에 복사할 수 없습니다.</translation>
 <translation id="3090871774332213558">'<ph name="DEVICE_NAME" />' 페어링됨</translation>
 <translation id="3092544800441494315">다음 캡쳐화면 포함:</translation>
@@ -2015,7 +2020,6 @@
 <translation id="3790856258139356663">Chrome 동기화를 위해 테스트 서버에 연결합니다.</translation>
 <translation id="3790909017043401679">SIM 카드 PIN 입력</translation>
 <translation id="3792890930871100565">프린터 연결 해제</translation>
-<translation id="3795681127952030401"><ph name="URL" /> 페이지에서 알림을 보내려고 합니다.</translation>
 <translation id="3796648294839530037">자주 이용하는 네트워크:</translation>
 <translation id="3797900183766075808"><ph name="SEARCH_ENGINE" />에서 '<ph name="SEARCH_TERMS" />' 검색(&amp;S)</translation>
 <translation id="3798449238516105146">버전</translation>
@@ -2488,6 +2492,7 @@
 <translation id="4552678318981539154">추가 저장용량 구입</translation>
 <translation id="4554591392113183336">외부 확장 프로그램의 버전이 기존 프로그램과 동일하거나 낮습니다.</translation>
 <translation id="4554796861933393312">머티리얼 디자인 잉크 드롭 애니메이션 속도</translation>
+<translation id="4555670907822902621">북마크한 페이지를 저장하여 오프라인으로 볼 수 있도록 사용 설정</translation>
 <translation id="4555769855065597957">그림자</translation>
 <translation id="4556110439722119938">북마크, 방문 기록, 비밀번호, 기타 설정이 Google 계정에 동기화되므로 모든 기기에서 사용할 수 있습니다.</translation>
 <translation id="4557136421275541763">경고:</translation>
@@ -2664,6 +2669,7 @@
 <translation id="4824518112777153488">마우스 오버가 가능한 터치스크린 지원</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" />에서 <ph name="NETWORK_NAME" /> 네트워크를 사용하여 인터넷에 연결할 수 없습니다. 다른 네트워크를 선택하세요. <ph name="LEARN_MORE_LINK_START" />자세히 알아보기<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572"><ph name="ISSUER" />에서 <ph name="LOCALITY" /> 내 <ph name="ORGANIZATION" />의 ID를 인증했습니다. 서버가 유효한 인증서 확인 정보를 제공했습니다.</translation>
+<translation id="4832537345877333532">디스플레이 색상 보정 Quirks 서버에서 icc 디스플레이 파일 검색을 사용 중지합니다.</translation>
 <translation id="4834912470034578916">웹 알림에 맞춤 레이아웃을 사용합니다.</translation>
 <translation id="4835836146030131423">로그인하는 동안 오류가 발생했습니다.</translation>
 <translation id="4837926214103741331">더 이상 이 기기를 사용할 권한이 없습니다. 기기 소유자에게 로그인 권한에 대해 문의하세요.</translation>
@@ -2851,6 +2857,7 @@
 <translation id="5120421890733714118">웹사이트를 식별하기 위해 이 인증서를 신뢰합니다.</translation>
 <translation id="5121130586824819730">하드 디스크가 가득 찼습니다. 다른 위치에 저장하거나 하드 디스크에 더 많은 공간을 확보하시기 바랍니다.</translation>
 <translation id="5125751979347152379">잘못된 URL입니다.</translation>
+<translation id="5126663277159826272">디스플레이 보정에 Quirks 클라이언트 사용 중지</translation>
 <translation id="5127881134400491887">네트워크 연결 관리</translation>
 <translation id="5128590998814119508">디스플레이 목록 2D 캔버스</translation>
 <translation id="512903556749061217">첨부됨</translation>
@@ -2992,9 +2999,11 @@
 <translation id="5301751748813680278">손님으로 로그인 중</translation>
 <translation id="5301954838959518834">확인</translation>
 <translation id="5302048478445481009">언어</translation>
+<translation id="5304039790201806037">포인터 이벤트</translation>
 <translation id="5305688511332277257">설치된 인증서 없음</translation>
 <translation id="5308380583665731573">연결</translation>
 <translation id="5311260548612583999">비공개 키 파일(선택사항):</translation>
+<translation id="5313967007315987356">사이트 추가</translation>
 <translation id="5316588172263354223">언제든지 음성 검색</translation>
 <translation id="5316716239522500219">모니터 미러</translation>
 <translation id="5317780077021120954">저장</translation>
@@ -3297,6 +3306,7 @@
 <translation id="5734362860645681824">커뮤니케이션</translation>
 <translation id="573719557377416048">공존 상태 삭제</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: 수정하려면 선택</translation>
+<translation id="5741454054957165976">WebFonts 로딩을 위해 사용자 에이전트 개입의 새 버전을 사용합니다.</translation>
 <translation id="574392208103952083">보통</translation>
 <translation id="5745056705311424885">USB 메모리가 감지되었습니다.</translation>
 <translation id="5746169159649715125">PDF로 저장</translation>
@@ -3345,7 +3355,6 @@
 <translation id="5803531701633845775">커서를 이동하지 않고 안쪽에서 구문 선택</translation>
 <translation id="5804241973901381774">권한</translation>
 <translation id="580571955903695899">제목순으로 다시 정렬</translation>
-<translation id="5808982448801399019">승인 실패</translation>
 <translation id="580961539202306967">사이트에서 푸시 메시지를 보내려는 경우 알림(권장)</translation>
 <translation id="5815645614496570556">X.400 주소</translation>
 <translation id="5817397429773072584">중국어(번체)</translation>
@@ -3370,6 +3379,7 @@
 <translation id="5834581999798853053">약 <ph name="TIME" />분 남음</translation>
 <translation id="5838825566232597749">미국 워크맨(국제)</translation>
 <translation id="5839277899276241121">청구지 주소와 동일</translation>
+<translation id="5844550873065695788"><ph name="TOTAL_COUNT" />개 이상의 항목이 이 기기에서 완전히 삭제됩니다. 나중에 데이터를 검색하려면 $2(으)로 Chrome에 로그인하세요.</translation>
 <translation id="5846929185714966548">탭 4</translation>
 <translation id="5848934677402291689">PDF로 저장하는 중</translation>
 <translation id="5849335628409778954">신용카드 정보 입력...</translation>
@@ -3616,6 +3626,7 @@
 <translation id="6232017090690406397">배터리</translation>
 <translation id="6241530762627360640">시스템과 페어링된 블루투스 기기 관련 정보에 액세스하고 근처의 블루투스 기기를 검색합니다.</translation>
 <translation id="6243774244933267674">서버를 사용할 수 없음</translation>
+<translation id="6246413617632217567">관리 대상 사용자를 가져오지 못했습니다. 하드 드라이브 공간 및 권한을 확인한 후 다시 시도해 주세요.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">업데이트 준비 완료</translation>
 <translation id="6248400709929739064">자막 사용</translation>
@@ -3644,6 +3655,7 @@
 <translation id="6277518330158259200">스크린샷 캡쳐하기(&amp;A)</translation>
 <translation id="6279183038361895380">|<ph name="ACCELERATOR" />|을(를) 눌러 커서 표시</translation>
 <translation id="6280215091796946657">다른 계정으로 로그인</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">모든 API가 레이아웃 표시 영역을 반영하도록 하는 실험입니다. 이를 통해 window.scroll 속성이 레이아웃 표시 영역과 연관됩니다.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{네트워크에 새로운 프린터 있음}other{네트워크에 새로운 프린터 있음}}</translation>
 <translation id="6285395082104474418">상태 표시줄에 네트워크, 배터리 등의 현재 상태가 표시됩니다.</translation>
@@ -3699,6 +3711,7 @@
 <translation id="6380143666419481200">동의 및 계속</translation>
 <translation id="6380224340023442078">콘텐츠 설정...</translation>
 <translation id="6383194710567510941">chrome.input.ime API를 사용합니다.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{이 기기에서 $1개 이상의 항목이 완전히 삭제됩니다. 나중에 데이터를 검색하려면 $2(으)로 Chrome에 로그인하세요.}other{이 기기에서 $1개 이상의 항목이 완전히 삭제됩니다. 나중에 데이터를 검색하려면 $2(으)로 Chrome에 로그인하세요.}}</translation>
 <translation id="6384275966486438344">다음으로 검색 설정 변경: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">이 창에서 보는 페이지는 브라우저 기록에 나타나지 않으며 열려 있는 모든 손님 창을 닫은 후에도 컴퓨터에 쿠키와 같은 다른 흔적을 남기지 않습니다. 하지만 다운로드한 파일은 모두 저장됩니다.</translation>
 <translation id="6391538222494443604">입력 디렉토리가 있어야 합니다.</translation>
@@ -3837,6 +3850,7 @@
 <translation id="6575134580692778371">설정되지 않음</translation>
 <translation id="6575251558004911012">내 카메라에 사이트가 액세스할 때 확인(권장)</translation>
 <translation id="6579159469348633828">Brotli 콘텐츠 인코딩</translation>
+<translation id="6580151766480067746">ARC 버전</translation>
 <translation id="6581162200855843583">Google 드라이브 링크</translation>
 <translation id="6583070985841601920"><ph name="USER_EMAIL_ADDRESS" />(으)로 로그인되었습니다. 관리자가 동기화 사용을 중지했습니다.</translation>
 <translation id="65832705307647870">새 탭 페이지를 인기 사이트로 미리 채웁니다.</translation>
@@ -4002,6 +4016,7 @@
 <translation id="6847758263950452722">페이지를 MHTML로 저장</translation>
 <translation id="6853388645642883916">업데이터 절전 모드</translation>
 <translation id="68541483639528434">다른 탭 닫기</translation>
+<translation id="6856701878604560493">오프라인 북마크 사용</translation>
 <translation id="6860097299815761905">프록시 설정...</translation>
 <translation id="6860427144121307915">탭에서 열기</translation>
 <translation id="6862635236584086457">이 폴더에 저장된 모든 파일은 온라인으로 자동 백업됨</translation>
@@ -4175,6 +4190,7 @@
 <translation id="7092106376816104">팝업 예외</translation>
 <translation id="7093866338626856921">이름이 <ph name="HOSTNAMES" />인 기기와 데이터 교환</translation>
 <translation id="7096082900368329802">더 놀라운 기능에 대해 알고 싶으세요?</translation>
+<translation id="7096108453481049031">관리 대상 사용자를 가져오지 못했습니다. 네트워크 연결을 확인한 후 나중에 다시 시도해 주세요.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" />개의 항목이 선택됨</translation>
 <translation id="710227449793100220">Token Binding</translation>
 <translation id="7106346894903675391">추가 저장용량 구입...</translation>
@@ -4203,6 +4219,7 @@
 <translation id="713888829801648570">죄송합니다. 인터넷에 연결되어 있지 않아 비밀번호를 확인할 수 없습니다.</translation>
 <translation id="7140928199327930795">다른 사용 가능한 기기가 없습니다.</translation>
 <translation id="7141105143012495934">계정 세부정보를 가져올 수 없어 로그인할 수 없습니다. 관리자에게 문의하거나 다시 시도해 주세요.</translation>
+<translation id="7141331524324591758">Pointer Events API에 부분 실험 지원 기능을 사용합니다. 웹 개발자의 테스트에만 사용할 수 있으며, 이 때문에 웹사이트가 경미하게 손상될 수도 있습니다.</translation>
 <translation id="7143207342074048698">연결 중</translation>
 <translation id="7144878232160441200">다시 시도</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> 사용이 중지되었습니다. 다시 사용하도록 설정하려면 <ph name="CHROME_PLUGINS_LINK" />(으)로 이동하시기 바랍니다.</translation>
@@ -4851,6 +4868,7 @@
 <translation id="8119572489781388874">설정 수정</translation>
 <translation id="8119631488458759651">사이트 삭제</translation>
 <translation id="8121385576314601440">한글 입력 설정</translation>
+<translation id="8122245494004914423">인터넷 사용 기록이 이 기기에서 완전히 삭제됩니다. 나중에 데이터를 검색하려면 $2(으)로 Chrome에 로그인하세요.</translation>
 <translation id="8124313775439841391">관리되는 ONC</translation>
 <translation id="8126844665673008223">웹 블루투스</translation>
 <translation id="8127322077195964840">localhost에서 로드된 리소스에 유효하지 않은 인증서를 허용합니다.</translation>
@@ -4936,6 +4954,7 @@
 <translation id="8226742006292257240">다음은 컴퓨터에 임의로 생성 및 할당된 TPM 비밀번호입니다.</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">현재 <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />의 공격자가 사용자 정보(예: 사진, 비밀번호, 메시지, 신용카드)를 도용하거나 삭제하는 위험한 프로그램을 컴퓨터에 설치하려고 시도할 수 있습니다.</translation>
+<translation id="8233254008506535819">인터넷 사용 기록 삭제 대화상자에서 옵션을 중요 허용 목록 사이트에 추가합니다.</translation>
 <translation id="8236231079192337250">프린터 드라이브용 Chrome 웹 스토어 갤러리 앱</translation>
 <translation id="8238649969398088015">도움말</translation>
 <translation id="8240697550402899963">기본 테마 사용</translation>
@@ -5260,7 +5279,6 @@
 <translation id="8708671767545720562">추가 정보</translation>
 <translation id="8711402221661888347">피클</translation>
 <translation id="8711453844311572806">휴대전화가 잠금 해제된 상태로 가까이 있는 경우 클릭하기만 하면 잠금 해제됩니다. 그렇지 않은 경우 자물쇠 아이콘이 표시되며 비밀번호를 입력해야 합니다.</translation>
-<translation id="8712637175834984815">확인</translation>
 <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />시스템 정보<ph name="END_LINK1" /> 전송</translation>
 <translation id="8713979477561846077">미국식 키보드에 물리적 키보드 자동수정을 사용 설정합니다. 이렇게 하면 물리적 키보드로 입력할 때 추천 항목이 표시됩니다.</translation>
 <translation id="871476437400413057">Google에 저장된 비밀번호</translation>
@@ -5624,6 +5642,7 @@
 <translation id="952992212772159698">활성화되지 않음</translation>
 <translation id="953000875543358078">1분 정도 소요될 수 있습니다.</translation>
 <translation id="960987915827980018">약 1시간 남음</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{이 기기에서 $1개 항목이 완전히 삭제됩니다. 나중에 데이터를 검색하려면 $2(으)로 Chrome에 로그인하세요.}other{이 기기에서 $1개 항목이 완전히 삭제됩니다. 나중에 데이터를 검색하려면 $2(으)로 Chrome에 로그인하세요.}}</translation>
 <translation id="96421021576709873">Wi-Fi 네트워크</translation>
 <translation id="965490406356730238">사용 가능한 경우 캡처된 프레임에 하드웨어 가속 mjpeg 디코딩을 사용합니다.</translation>
 <translation id="968174221497644223">애플리케이션 캐시</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index c8b8da2..0ffa830 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -251,6 +251,7 @@
       Atminkite, kad „Bluetooth“ ryšys bus įjungtas visuose suderinamuose <ph name="USER_DISPLAY_EMAIL" /> įrenginiuose, o dalis aparatinės įrangos informacijos bus siunčiama „Google“. &lt;a&gt;Sužinokite daugiau&lt;/a&gt;</translation>
 <translation id="13649080186077898">Valdyti automatinio pildymo nustatymus</translation>
 <translation id="1367951781824006909">Pasirinkti failą</translation>
+<translation id="136802136832547685">Nėra prižiūrimų naudotojų, kuriuos galima pridėti prie šio įrenginio.</translation>
 <translation id="1368265273904755308">Pranešti apie problemą</translation>
 <translation id="1368832886055348810">Iš kairės į dešinę</translation>
 <translation id="1370646789215800222">Pašalinti asmenį?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Ieškoti</translation>
 <translation id="1384211230590313258">Paslaugos aptikimo doroklė</translation>
 <translation id="1386387014181100145">Sveiki!</translation>
+<translation id="1386830813511981192">Daugiau nei milijonas programų ir žaidimų dabar pasiekiami naudojant „<ph name="DEVICE_TYPE" />“.</translation>
 <translation id="1389297115360905376">Tai galima pridėti tik iš „<ph name="CHROME_WEB_STORE" />“.</translation>
 <translation id="1390548061267426325">Atidaryti kaip įprastą skirtuką</translation>
 <translation id="1395262318152388157">Paieškos šliaužiklis</translation>
@@ -893,6 +895,7 @@
 <translation id="2280486287150724112">Dešinioji paraštė</translation>
 <translation id="2282146716419988068">GPU procesas</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Nauja naudotojo priemonės įsikišimo įkeliant žiniatinklio šriftus versija.</translation>
 <translation id="2286454467119466181">Paprasta</translation>
 <translation id="2286950485307333924">Esate prisijungę prie „Chrome“</translation>
 <translation id="2287590536030307392">Išjungti visus belaidžius ryšius.</translation>
@@ -1070,6 +1073,7 @@
 <translation id="2542049655219295786">„Google“ lentelė</translation>
 <translation id="2546283357679194313">Slapukai ir svetainės duomenys</translation>
 <translation id="2549646943416322527">„Seccomp“ detektorius</translation>
+<translation id="2550212893339833758">Sukeista atmintis</translation>
 <translation id="2553100941515833716">Kiekvieną kartą paleidus iš naujo nustatyti Programų paleidimo priemonės diegimo būseną iš naujo.</translation>
 <translation id="2553340429761841190">„<ph name="PRODUCT_NAME" />“ nepavyko prisijungti prie <ph name="NETWORK_ID" />. Pasirinkite kitą tinklą arba bandykite dar kartą.</translation>
 <translation id="2553440850688409052">Slėpti šį papildinį</translation>
@@ -1103,6 +1107,7 @@
 <translation id="2587203970400270934">Operacijos ženklo kodas:</translation>
 <translation id="2587922270115112871">Sukūrus prižiūrimą naudotoją nebus sukurta „Google“ paskyra, o jo nustatymai
     ir duomenys nebus perkeliami į kitus įrenginius naudojant „Chrome“ sinchronizavimą. Prižiūrimas naudotojas taikomas tik šiame įrenginyje.</translation>
+<translation id="2594049137847833442">Svarbių svetainių parinktys naršymo duomenų išvalymo dialogo lange</translation>
 <translation id="2594056015203442344">Kai įgalinta, garso indikatorių skirtukų juostelėje padvigubėja ir jie tampa skirtukų garso nutildymo valdikliais. Tai atlikus prie skirtuko kontekstinio meniu taip pat pridedama komandų, skirtų greitai nutildyti kelis pasirinktus skirtukus.</translation>
 <translation id="259421303766146093">Grąžinti įprasto dydžio rodinį</translation>
 <translation id="2597852038534460976">„Chrome“ negali pasiekti ekrano fonų. Prisijunkite prie tinklo.</translation>
@@ -1470,7 +1475,6 @@
 <translation id="3065140616557457172">Norėdami naršyti įveskite paiešką ar URL adresą: tinka viskas.</translation>
 <translation id="3067198360141518313">Paleisti šį papildinį</translation>
 <translation id="307519606911195071">Įgalinkite papildomas pritaikymo neįgaliesiems funkcijas puslapyje „Nustatymai“.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> sukurtas kaip prižiūrimas naudotojas.</translation>
 <translation id="3075874217500066906">Norint pradėti funkcijos „Powerwash“ procesą, būtina paleisti iš naujo. Paleidus iš naujo jūsų bus paprašyta patvirtinti, kad norite tęsti.</translation>
 <translation id="3076677906922146425">Leisti bet kam pridėti asmenį prie „Chrome“</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" /> / <ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1487,6 +1491,7 @@
 <translation id="3088034400796962477">Transliteracija (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Pervardyti...</translation>
 <translation id="308903551226753393">Konfigūruoti automatiškai</translation>
+<translation id="3089231390674410424">Atrodo, kad kilo problemų dėl jūsų prisijungimo duomenų. Įsitikinkite, kad tinkamai prisijungėte, ir bandykite dar kartą.</translation>
 <translation id="3090819949319990166">Nepavyko nukopijuoti išorinio CRX failo į „<ph name="TEMP_CRX_FILE" />“.</translation>
 <translation id="3090871774332213558">Įrenginys „<ph name="DEVICE_NAME" />“ susietas</translation>
 <translation id="3092544800441494315">Įtraukti šią ekrano kopiją:</translation>
@@ -2013,7 +2018,6 @@
 <translation id="3790856258139356663">Prisijungiama prie „Chrome“ sinchronizavimo funkcijos bandymų serverio.</translation>
 <translation id="3790909017043401679">Įvesti SIM kortelės PIN kodą</translation>
 <translation id="3792890930871100565">Atjungti spausdintuvus</translation>
-<translation id="3795681127952030401"><ph name="URL" /> nori jums siųsti pranešimus.</translation>
 <translation id="3796648294839530037">Mėgstamiausi tinklai:</translation>
 <translation id="3797900183766075808">&amp;Ieškoti pagal užklausą „<ph name="SEARCH_TERMS" />“ naudojant „<ph name="SEARCH_ENGINE" />“</translation>
 <translation id="3798449238516105146">Versija</translation>
@@ -2487,6 +2491,7 @@
 <translation id="4552678318981539154">Įsigyti daugiau atminties</translation>
 <translation id="4554591392113183336">Išorinis plėtinys yra tos pačios arba senesnės versijos, palyginti su esama.</translation>
 <translation id="4554796861933393312">Trimačių objektų dizaino rašalo lašo animacijos greitis</translation>
+<translation id="4555670907822902621">Leisti išsaugoti pažymėtus puslapius, kad būtų galima juos peržiūrėti neprisijungus.</translation>
 <translation id="4555769855065597957">Šešėlis</translation>
 <translation id="4556110439722119938">Žymės, istorija, slaptažodžiai ir kiti nustatymai bus sinchronizuojami su „Google“ paskyra, kad galėtumėte juos naudoti visuose įrenginiuose</translation>
 <translation id="4557136421275541763">Įspėjimas:</translation>
@@ -2662,6 +2667,7 @@
 <translation id="4824518112777153488">Jutiklinių ekranų, kuriuose galima užvesti žymeklį, palaikymas</translation>
 <translation id="4830573902900904548">„<ph name="DEVICE_TYPE" />“ įrenginiui nepavyksta prisijungti prie interneto naudojant „<ph name="NETWORK_NAME" />“. Pasirinkite kitą tinklą. <ph name="LEARN_MORE_LINK_START" />Sužinokite daugiau<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">„<ph name="ORGANIZATION" />“ (<ph name="LOCALITY" />) tapatybę patvirtino „<ph name="ISSUER" />“. Serveris pateikė tinkamą sertifikato skaidrumo informaciją.</translation>
+<translation id="4832537345877333532">Neleisti gauti ICC vaizdo failų iš „Quirks Server“, skirtų ekrano spalvoms kalibruoti.</translation>
 <translation id="4834912470034578916">Įgalinti tinkintus žiniatinklio pranešimų išdėstymus.</translation>
 <translation id="4835836146030131423">Prisiregistravimo klaida.</translation>
 <translation id="4837926214103741331">Neturite leidimo naudoti šį įrenginį. Susisiekite su įrenginio savininku, kad gautumėte leidimą prisijungti.</translation>
@@ -2849,6 +2855,7 @@
 <translation id="5120421890733714118">Pasitikėti šiuo sertifikatu nustatant svetaines.</translation>
 <translation id="5121130586824819730">Jūsų standusis diskas pilnas. Išsaugokite kitoje vietoje arba atlaisvinkite vietos standžiajame diske.</translation>
 <translation id="5125751979347152379">Negaliojantis URL.</translation>
+<translation id="5126663277159826272">Neleisti naudoti „Quirks Server“ ekranui kalibruoti.</translation>
 <translation id="5127881134400491887">Valdyti tinklo ryšius</translation>
 <translation id="5128590998814119508">Rodomo sąrašo dvimatė matomoji tinklalapio sritis</translation>
 <translation id="512903556749061217">prijungtas</translation>
@@ -2990,9 +2997,11 @@
 <translation id="5301751748813680278">Įeina kaip svečias.</translation>
 <translation id="5301954838959518834">Gerai, supratau</translation>
 <translation id="5302048478445481009">Kalba</translation>
+<translation id="5304039790201806037">Žymeklio įvykiai</translation>
 <translation id="5305688511332277257">Nėra įdiegtų</translation>
 <translation id="5308380583665731573">Prisijungti</translation>
 <translation id="5311260548612583999">Asmeninio rakto failas (pasirenkama):</translation>
+<translation id="5313967007315987356">Pridėti svetainę</translation>
 <translation id="5316588172263354223">Ieškokite balsu bet kada</translation>
 <translation id="5316716239522500219">Dubliuoti monitorius</translation>
 <translation id="5317780077021120954">Išsaugoti</translation>
@@ -3296,6 +3305,7 @@
 <translation id="5734362860645681824">Ryšiai</translation>
 <translation id="573719557377416048">Išvalyti „Copresence“ būseną</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: pasirinkite, jei norite redaguoti</translation>
+<translation id="5741454054957165976">Įgalinti naują naudotojo priemonės įsikišimo įkeliant žiniatinklio šriftus versiją.</translation>
 <translation id="574392208103952083">Vidutinis</translation>
 <translation id="5745056705311424885">Aptikta USB atminties kortelė</translation>
 <translation id="5746169159649715125">Išsaugoti kaip PDF</translation>
@@ -3344,7 +3354,6 @@
 <translation id="5803531701633845775">Pasirinkti frazes iš galo neperkeliant žymiklio</translation>
 <translation id="5804241973901381774">Leidimai</translation>
 <translation id="580571955903695899">Pertvarkyti pagal pavadinimą</translation>
-<translation id="5808982448801399019">Nepavyko autorizuoti</translation>
 <translation id="580961539202306967">Paklausti, kai svetainė nori siųsti „Push“ pranešimus (rekomenduojama)</translation>
 <translation id="5815645614496570556">X.400 adresas</translation>
 <translation id="5817397429773072584">Tradicinė kinų k.</translation>
@@ -3369,6 +3378,7 @@
 <translation id="5834581999798853053">Liko apie <ph name="TIME" /> min.</translation>
 <translation id="5838825566232597749">JAV „Workman“ tarptautinė</translation>
 <translation id="5839277899276241121">Toks pat kaip ir atsiskaitymo adresas</translation>
+<translation id="5844550873065695788">Atlikus šį veiksmą, iš įrenginio bus visam laikui ištrinta mažiausiai tiek elementų: <ph name="TOTAL_COUNT" />. Jei vėliau norėsite gauti duomenis, prisijunkite prie „Chrome“ kaip $2.</translation>
 <translation id="5846929185714966548">4 skirtukas</translation>
 <translation id="5848934677402291689">Vykdomas išsaugojimas į PDF</translation>
 <translation id="5849335628409778954">Įveskite kredito kortelės informaciją...</translation>
@@ -3615,6 +3625,7 @@
 <translation id="6232017090690406397">Akumuliatorius</translation>
 <translation id="6241530762627360640">Pasiekti informaciją apie „Bluetooth“ įrenginius, susietus su sistema, ir aptikti netoliese esančius „Bluetooth“ įrenginius.</translation>
 <translation id="6243774244933267674">Serveris negalimas</translation>
+<translation id="6246413617632217567">Nepavyko importuoti prižiūrimo naudotojo. Patikrinkite, ar standžiajame diske yra vietos, bei leidimus ir bandykite dar kartą.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" /> %</translation>
 <translation id="624789221780392884">Naujinys paruoštas</translation>
 <translation id="6248400709929739064">Įgalinti subtitrus</translation>
@@ -3643,6 +3654,7 @@
 <translation id="6277518330158259200">S&amp;ukurti ekrano kopiją</translation>
 <translation id="6279183038361895380">Paspauskite |<ph name="ACCELERATOR" />|, kad būtų rodomas žymeklis</translation>
 <translation id="6280215091796946657">Prisijunkite naudodami kitą paskyrą</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Eksperimentuokite, kad visos API atspindėtų išdėstymo peržiūros sritį. Tada nuosavybės window.scroll bus susijusios su išdėstymo peržiūros sritimi.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Naujas spausdintuvas tinkle}one{Nauji spausdintuvai tinkle}few{Nauji spausdintuvai tinkle}many{Nauji spausdintuvai tinkle}other{Nauji spausdintuvai tinkle}}</translation>
 <translation id="6285395082104474418">Būsenos dėkle rodoma dabartinė tinklo, akumuliatoriaus ir kitų elementų būsena.</translation>
@@ -3698,6 +3710,7 @@
 <translation id="6380143666419481200">Sutikti ir tęsti</translation>
 <translation id="6380224340023442078">Turinio nustatymai...</translation>
 <translation id="6383194710567510941">Įgalinkite „chrome.input.ime“ API naudojimą.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Atlikus šį veiksmą bus visam laikui ištrintas mažiausiai $1 elementas iš šio įrenginio. Jei vėliau norėsite gauti duomenis, prisijunkite prie „Chrome“ kaip $2.}one{Atlikus šį veiksmą bus visam laikui ištrintas mažiausiai $1 elementas iš šio įrenginio. Jei vėliau norėsite gauti duomenis, prisijunkite prie „Chrome“ kaip $2.}few{Atlikus šį veiksmą bus visam laikui ištrinti mažiausiai $1 elementai iš šio įrenginio. Jei vėliau norėsite gauti duomenis, prisijunkite prie „Chrome“ kaip $2.}many{Atlikus šį veiksmą bus visam laikui ištrinta mažiausiai $1 elemento iš šio įrenginio. Jei vėliau norėsite gauti duomenis, prisijunkite prie „Chrome“ kaip $2.}other{Atlikus šį veiksmą bus visam laikui ištrinta mažiausiai $1 elementų iš šio įrenginio. Jei vėliau norėsite gauti duomenis, prisijunkite prie „Chrome“ kaip $2.}}</translation>
 <translation id="6384275966486438344">Pakeiskite paieškos nustatymus į: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Puslapiai, kuriuos peržiūrite šiame lange, nerodomi naršyklės istorijoje. Kai uždarysite visus svečio langus, kompiuteryje neliks ir kitų jų pėdsakų, pvz., slapukų, tačiau atsisiųsti failai bus išsaugoti.</translation>
 <translation id="6391538222494443604">Turi būti įvesties katalogas.</translation>
@@ -3836,6 +3849,7 @@
 <translation id="6575134580692778371">Nesukonfigūruota</translation>
 <translation id="6575251558004911012">Paklausti, kai svetainei reikalinga prieiga prie fotoaparato (rekomenduojama)</translation>
 <translation id="6579159469348633828">„Brotli“ turinio koduotė.</translation>
+<translation id="6580151766480067746">ARC versija</translation>
 <translation id="6581162200855843583">„Google“ disko nuoroda</translation>
 <translation id="6583070985841601920">Esate prisijungę kaip <ph name="USER_EMAIL_ADDRESS" />. Sinchronizavimo neleido jūsų administratorius.</translation>
 <translation id="65832705307647870">Iš anksto pateikti populiarias svetaines naujo skirtuko puslapyje.</translation>
@@ -4002,6 +4016,7 @@
 <translation id="6847758263950452722">Išsaugoti puslapį kaip MHTML</translation>
 <translation id="6853388645642883916">Atnaujinimo priemonė yra miego būsenos</translation>
 <translation id="68541483639528434">Uždaryti kitus skirtukus</translation>
+<translation id="6856701878604560493">Leisti pasiekti žymes neprisijungus</translation>
 <translation id="6860097299815761905">Įgaliotojo serverio nustatymai...</translation>
 <translation id="6860427144121307915">Atidaryti skirtuko lape</translation>
 <translation id="6862635236584086457">Visų šiame aplanke saugomų failų kopija automatiškai kuriama internete</translation>
@@ -4176,6 +4191,7 @@
 <translation id="7092106376816104">Iššokančiųjų langų išimtys</translation>
 <translation id="7093866338626856921">Keistis duomenimis su įrenginiais, kurių pavadinimai: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Norite atrasti daugiau nuostabių funkcijų?</translation>
+<translation id="7096108453481049031">Nepavyko importuoti prižiūrimo naudotojo. Patikrinkite tinklo ryšį ir vėliau bandykite dar kartą.</translation>
 <translation id="7100897339030255923">Pasirinkta elementų: <ph name="COUNT" /></translation>
 <translation id="710227449793100220">„Token Binding“.</translation>
 <translation id="7106346894903675391">Įsigyti daugiau atminties...</translation>
@@ -4204,6 +4220,7 @@
 <translation id="713888829801648570">Apgailestaujame, slaptažodžio patikrinti nepavyko, nes esate neprisijungę.</translation>
 <translation id="7140928199327930795">Nėra kitų pasiekiamų įrenginių.</translation>
 <translation id="7141105143012495934">Nepavyko prisijungti, nes negalima gauti išsamios paskyros informacijos. Susisiekite su administratoriumi arba bandykite dar kartą.</translation>
+<translation id="7141331524324591758">Bus įgalintas dalinis eksperimentinis žymeklio įvykių API palaikymas. Jis skirtas tik bandymus atliekantiems žiniatinklio kūrėjams ir dėl jo kai kurios svetainės iš dalies neveiks.</translation>
 <translation id="7143207342074048698">Jungiama</translation>
 <translation id="7144878232160441200">Bandyti dar kartą</translation>
 <translation id="7148311641502571842">„<ph name="PLUGIN_NAME" />“ neleidžiamas. Jei norite pakartotinai įgalinti, eikite šiuo adresu: <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4852,6 +4869,7 @@
 <translation id="8119572489781388874">Modifikuoti nustatymus</translation>
 <translation id="8119631488458759651">pašalinti šią svetainę</translation>
 <translation id="8121385576314601440">Hangul k. įvesties nustatymai</translation>
+<translation id="8122245494004914423">Atlikus šį veiksmą bus visam laikui ištrinti naršymo duomenys iš šio įrenginio. Jei vėliau norėsite gauti duomenis, prisijunkite prie „Chrome“ kaip $2.</translation>
 <translation id="8124313775439841391">Tvarkoma ONC</translation>
 <translation id="8126844665673008223">Žiniatinklio „Bluetooth“</translation>
 <translation id="8127322077195964840">Leisti netinkamus išteklių sertifikatus įkelti iš vietinės prieglobos.</translation>
@@ -4937,6 +4955,7 @@
 <translation id="8226742006292257240">Toliau pateikiamas kompiuteriui priskirtas atsitiktinai sugeneruotas TPM slaptažodis:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Šiuo metu svetainės <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> užpuolėjai gali jūsų kompiuteryje bandyti įdiegti pavojingas programas, kurios vagia arba ištrina informaciją (pvz., nuotraukas, slaptažodžius, pranešimus ir kredito kortelių numerius).</translation>
+<translation id="8233254008506535819">Įtraukti svarbių svetainių įtraukimo į baltąjį sąrašą parinktį į naršymo duomenų išvalymo dialogo langą.</translation>
 <translation id="8236231079192337250">„Chrome“ internetinės parduotuvės galerijos programa, skirta spausdintuvų tvarkyklėms</translation>
 <translation id="8238649969398088015">Pagalbos patarimas</translation>
 <translation id="8240697550402899963">Naudoti klasikinę temą</translation>
@@ -5261,7 +5280,6 @@
 <translation id="8708671767545720562">Daugiau informacijos</translation>
 <translation id="8711402221661888347">Marinuotos daržovės</translation>
 <translation id="8711453844311572806">Jei jūsų telefonas yra netoliese, tereikia spustelėti, kad į jį įeitumėte. Kitu atveju matysite užrakto piktogramą ir turėsite įvesti slaptažodį.</translation>
-<translation id="8712637175834984815">Supratau</translation>
 <translation id="8713570323158206935">Siųsti <ph name="BEGIN_LINK1" />sistemos informaciją<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Įgalinti JAV klaviatūrai skirtą fizinės klaviatūros automatinio taisymo funkciją, kuri gali teikti pasiūlymus vedant tekstą fizine klaviatūra.</translation>
 <translation id="871476437400413057">„Google“ išsaugotus slaptažodžius</translation>
@@ -5625,6 +5643,7 @@
 <translation id="952992212772159698">Nesuaktyvinta</translation>
 <translation id="953000875543358078">Tai gali užtrukti kelias minutes</translation>
 <translation id="960987915827980018">Liko apie 1 val.</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Atlikus šį veiksmą bus visam laikui ištrintas $1 elementas iš šio įrenginio. Jei vėliau norėsite gauti duomenis, prisijunkite prie „Chrome“ kaip $2.}one{Atlikus šį veiksmą bus visam laikui ištrintas $1 elementas iš šio įrenginio. Jei vėliau norėsite gauti duomenis, prisijunkite prie „Chrome“ kaip $2.}few{Atlikus šį veiksmą bus visam laikui ištrinti $1 elementai iš šio įrenginio. Jei vėliau norėsite gauti duomenis, prisijunkite prie „Chrome“ kaip $2.}many{Atlikus šį veiksmą bus visam laikui ištrinta $1 elemento iš šio įrenginio. Jei vėliau norėsite gauti duomenis, prisijunkite prie „Chrome“ kaip $2.}other{Atlikus šį veiksmą bus visam laikui ištrinta $1 elementų iš šio įrenginio. Jei vėliau norėsite gauti duomenis, prisijunkite prie „Chrome“ kaip $2.}}</translation>
 <translation id="96421021576709873">„Wi-Fi“ ryšio tinklas</translation>
 <translation id="965490406356730238">Įgalinti aparatinės įrangos paspartintą užfiksuoto kadro „mjpeg“ iššifravimą, jei įmanoma.</translation>
 <translation id="968174221497644223">Programos talpykla</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 3fb0c058..8883181 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -251,6 +251,7 @@
       Ņemiet vērā, ka tehnoloģija Bluetooth būs ieslēgta visās lietotāja <ph name="USER_DISPLAY_EMAIL" /> saderīgajās ierīcēs un uzņēmumam Google tiks nosūtīta informācija par aparatūru. &lt;a&gt;Uzziniet vairāk&lt;/a&gt;.</translation>
 <translation id="13649080186077898">Pārvaldīt Automātiskās aizpildes iestatījumus</translation>
 <translation id="1367951781824006909">Izvēlēties failu</translation>
+<translation id="136802136832547685">Nav neviena uzraudzīta lietotāja, ko pievienot šai ierīcei.</translation>
 <translation id="1368265273904755308">Ziņot par problēmu</translation>
 <translation id="1368832886055348810">No kreisās uz labo pusi</translation>
 <translation id="1370646789215800222">Vai noņemt lietotāju?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Meklēt</translation>
 <translation id="1384211230590313258">Pakalpojumu atrašanas apdarinātājs</translation>
 <translation id="1386387014181100145">Sveicināti!</translation>
+<translation id="1386830813511981192">Tagad jūsu <ph name="DEVICE_TYPE" /> ierīcē ir pieejams vairāk nekā miljons lietotņu un spēļu.</translation>
 <translation id="1389297115360905376">To var pievienot tikai no <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Atvērt kā parastu cilni</translation>
 <translation id="1395262318152388157">Meklēšanas slīdnis</translation>
@@ -893,6 +895,7 @@
 <translation id="2280486287150724112">Labā piemale</translation>
 <translation id="2282146716419988068">GPU process</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Lietotāja aģenta iejaukšanās WebFonts ielādei: jaunā versija</translation>
 <translation id="2286454467119466181">Vienkārša</translation>
 <translation id="2286950485307333924">Jūs esat pierakstījies pārlūkā Chrome</translation>
 <translation id="2287590536030307392">Izslēdz visus bezvadu savienojumus.</translation>
@@ -1070,6 +1073,7 @@
 <translation id="2542049655219295786">Google tabula</translation>
 <translation id="2546283357679194313">Sīkfaili un vietņu dati</translation>
 <translation id="2549646943416322527">Seccomp noteicējs</translation>
+<translation id="2550212893339833758">Apmainītā atmiņa</translation>
 <translation id="2553100941515833716">Pēc katras restartēšanas atiestatīt lietotņu palaidēja instalēšanas stāvokli</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> nevarēja pievienoties tīklam <ph name="NETWORK_ID" />. Lūdzu, izvēlieties citu tīklu vai mēģiniet vēlreiz.</translation>
 <translation id="2553440850688409052">Slēpt šo spraudni</translation>
@@ -1103,6 +1107,7 @@
 <translation id="2587203970400270934">Operatora kods:</translation>
 <translation id="2587922270115112871">Izveidojot uzraudzītu lietotāju, netiek izveidots Google konts, un lietotāja iestatījumi
     un dati netiks parādīti citās ierīcēs, kurās izmantota Chrome sinhronizācija. Pašlaik uzraudzīts lietotājs attiecas tikai uz šo ierīci.</translation>
+<translation id="2594049137847833442">Svarīgu vietņu iespējas pārlūkošanas datu notīrīšanas dialoglodziņā</translation>
 <translation id="2594056015203442344">Ja karodziņš ir iespējots, skaņas indikatori ciļņu joslā divkāršojas kā ciļņu skaņas izslēgšanas vadīklas, kā arī ciļņu kontekstizvēlnei tiek pievienotas komandas ātrai vairāku atlasīto ciļņu skaņas izslēgšanai.</translation>
 <translation id="259421303766146093">Samazināt</translation>
 <translation id="2597852038534460976">Chrome nevar piekļūt fona tapetēm. Lūdzu, izveidojiet savienojumu ar tīklu.</translation>
@@ -1470,7 +1475,6 @@
 <translation id="3065140616557457172">Rakstiet, lai meklētu, vai ievadiet URL, lai pārvietotos - viss vienkārši darbojas.</translation>
 <translation id="3067198360141518313">Izpildīt šo spraudni</translation>
 <translation id="307519606911195071">Iespējojiet papildu pieejamības funkcijas lapā Iestatījumi.</translation>
-<translation id="3075239840551149663">Ir izveidots šāds uzraudzīts lietotājs: <ph name="NEW_PROFILE_NAME" />.</translation>
 <translation id="3075874217500066906">Lai varētu sākt Powerwash procesu, ir jāveic restartēšana. Pēc tam jums tiks lūgts apstiprināt, ka vēlaties turpināt darbu.</translation>
 <translation id="3076677906922146425">Ļaut ikvienam pievienot personu pārlūkā Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1487,6 +1491,7 @@
 <translation id="3088034400796962477">Transliterācija (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Pārdēvēt...</translation>
 <translation id="308903551226753393">Automātiski konfigurēt</translation>
+<translation id="3089231390674410424">Šķiet, ka ir radusies problēma ar jūsu akreditācijas datiem. Lūdzu, pārliecinieties, vai esat pareizi pierakstījies, un mēģiniet vēlreiz.</translation>
 <translation id="3090819949319990166">Ārējo .crx failu nevar kopēt uz failu <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">Izveidots savienojums pārī ar ierīci “<ph name="DEVICE_NAME" />”.</translation>
 <translation id="3092544800441494315">Ietvert šo ekrānuzņēmumu:</translation>
@@ -2015,7 +2020,6 @@
 <translation id="3790856258139356663">Tiek izveidots savienojums ar Chrome sinhronizācijas testēšanas serveri.</translation>
 <translation id="3790909017043401679">SIM kartes PIN koda ievadīšana</translation>
 <translation id="3792890930871100565">Atvienot printerus</translation>
-<translation id="3795681127952030401">No vietnes <ph name="URL" /> tiek mēģināts nosūtīt paziņojumus.</translation>
 <translation id="3796648294839530037">Izlases tīkli:</translation>
 <translation id="3797900183766075808">&amp;Meklēt “<ph name="SEARCH_TERMS" />” meklētājprogrammā <ph name="SEARCH_ENGINE" /></translation>
 <translation id="3798449238516105146">Versija</translation>
@@ -2489,6 +2493,7 @@
 <translation id="4552678318981539154">Iegādāties papildu vietu krātuvē</translation>
 <translation id="4554591392113183336">Ārējā paplašinājuma versija ir tāda pati vai vecāka nekā pašreizējā paplašinājuma versija.</translation>
 <translation id="4554796861933393312">Materiāla dizains: tintes piliena animācijas ātrums</translation>
+<translation id="4555670907822902621">Iespējot ar grāmatzīmēm atzīmēto lapu saglabāšanu skatīšanai bezsaistē</translation>
 <translation id="4555769855065597957">Ēna</translation>
 <translation id="4556110439722119938">Jūsu grāmatzīmes, vēsture, paroles un citi iestatījumi tiks sinhronizēti ar jūsu Google kontu, lai jūs varētu tos izmantot visās savās ierīcēs.</translation>
 <translation id="4557136421275541763">Brīdinājums:</translation>
@@ -2665,6 +2670,7 @@
 <translation id="4824518112777153488">Atbalsts peles kursora novietošanai virs skārienekrāniem</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> ierīcē nevar izveidot savienojumu ar internetu, izmantojot tīklu <ph name="NETWORK_NAME" />. Lūdzu, izvēlieties citu tīklu. <ph name="LEARN_MORE_LINK_START" />Uzziniet vairāk<ph name="LEARN_MORE_LINK_END" />.</translation>
 <translation id="4830663122372455572">Organizācijas <ph name="ORGANIZATION" /> (atrašanās vieta: <ph name="LOCALITY" />) identitāti ir apstiprinājis <ph name="ISSUER" />. No servera tika iegūta derīga sertifikātu pārskatāmības informācija.</translation>
+<translation id="4832537345877333532">Atspējot icc displeja failu izguvi no Quirks servera displeja krāsas kalibrācijai</translation>
 <translation id="4834912470034578916">Tīmekļa paziņojumu pielāgoto izkārtojumu iespējošana</translation>
 <translation id="4835836146030131423">Kļūda pierakstoties.</translation>
 <translation id="4837926214103741331">Jums nav atļaujas izmantot šo ierīci. Lūdzu, sazinieties ar ierīces īpašnieku, lai saņemtu pierakstīšanās atļauju.</translation>
@@ -2852,6 +2858,7 @@
 <translation id="5120421890733714118">Uzticēties šim sertifikātam, lai identificētu vietnes.</translation>
 <translation id="5121130586824819730">Cietais disks ir pilns. Saglabājiet citā atrašanās vietā vai atbrīvojiet vietu cietajā diskā.</translation>
 <translation id="5125751979347152379">Nederīgs URL.</translation>
+<translation id="5126663277159826272">Quirks klienta atspējošana displeja kalibrācijai</translation>
 <translation id="5127881134400491887">Pārvaldīt tīkla savienojumus</translation>
 <translation id="5128590998814119508">Attēlojuma saraksta elements 2D Canvas</translation>
 <translation id="512903556749061217">pievienota</translation>
@@ -2993,9 +3000,11 @@
 <translation id="5301751748813680278">Ieiešana viesa statusā.</translation>
 <translation id="5301954838959518834">Es sapratu</translation>
 <translation id="5302048478445481009">Valoda</translation>
+<translation id="5304039790201806037">Pointer Events</translation>
 <translation id="5305688511332277257">Nav instalēts</translation>
 <translation id="5308380583665731573">Pievienošana</translation>
 <translation id="5311260548612583999">Atslēgas fails (neob.):</translation>
+<translation id="5313967007315987356">Pievienot vietni</translation>
 <translation id="5316588172263354223">Meklēšana ar balsi jebkurā laikā</translation>
 <translation id="5316716239522500219">Spoguļot monitorus</translation>
 <translation id="5317780077021120954">Saglabāt</translation>
@@ -3298,6 +3307,7 @@
 <translation id="5734362860645681824">Saziņa</translation>
 <translation id="573719557377416048">Notīrīt tuvumā esošo ierīču statusu</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: atlasiet, lai rediģētu</translation>
+<translation id="5741454054957165976">Iespējot lietotāja aģenta iejaukšanās WebFonts ielādei jauno versiju</translation>
 <translation id="574392208103952083">Vidējs</translation>
 <translation id="5745056705311424885">Noteikta USB atmiņas karte</translation>
 <translation id="5746169159649715125">Saglabāt kā PDF failu</translation>
@@ -3346,7 +3356,6 @@
 <translation id="5803531701633845775">Izvēlieties frāzes no aizmugures, nepārvietojot kursoru</translation>
 <translation id="5804241973901381774">Atļaujas</translation>
 <translation id="580571955903695899">Pārkārtot pēc nosaukuma</translation>
-<translation id="5808982448801399019">Neizdevās autorizēt</translation>
 <translation id="580961539202306967">Jautāt, ja vietne vēlas sūtīt pašpiegādes ziņojumus (ieteicams)</translation>
 <translation id="5815645614496570556">X.400 adrese</translation>
 <translation id="5817397429773072584">Ķīniešu (tradicionālā)</translation>
@@ -3371,6 +3380,7 @@
 <translation id="5834581999798853053">Atlikušas apmēram <ph name="TIME" /> minūtes</translation>
 <translation id="5838825566232597749">Workman (ASV starptautiskā)</translation>
 <translation id="5839277899276241121">Tāda pati kā norēķinu adrese</translation>
+<translation id="5844550873065695788">Veicot šo darbību, no šīs ierīces tiks neatgriezeniski izdzēsti vismaz <ph name="TOTAL_COUNT" /> vienumi. Lai izgūtu datus vēlāk, pierakstieties pārlūkā Chrome kā $2.</translation>
 <translation id="5846929185714966548">4. cilne</translation>
 <translation id="5848934677402291689">Notiek saglabāšana PDF failā</translation>
 <translation id="5849335628409778954">Ievadīt kredītkartes informāciju...</translation>
@@ -3617,6 +3627,7 @@
 <translation id="6232017090690406397">Akumulators</translation>
 <translation id="6241530762627360640">Piekļūt informācijai par Bluetooth ierīcēm, kuras savienotas pārī ar jūsu sistēmu, un atrast tuvumā esošas Bluetooth ierīces.</translation>
 <translation id="6243774244933267674">Serveris nav pieejams.</translation>
+<translation id="6246413617632217567">Nevarēja importēt uzraudzīto lietotāju. Lūdzu, pārbaudiet vietu cietajā diskā un atļaujas un mēģiniet vēlreiz.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Var veikt atjaunināšanu</translation>
 <translation id="6248400709929739064">Iespējot subtitrus</translation>
@@ -3645,6 +3656,7 @@
 <translation id="6277518330158259200">I&amp;egūt ekrānuzņēmumu</translation>
 <translation id="6279183038361895380">Lai tiktu parādīts kursors, nospiediet |<ph name="ACCELERATOR" />|</translation>
 <translation id="6280215091796946657">Pierakstīties ar citu kontu</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Eksperiments, kurā visas saskarnes API atspoguļo izkārtojuma skatvietu. Tādējādi window.scroll rekvizīti būs atkarīgi no izkārtojuma skatvietas.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Jauns printeris jūsu tīklā}zero{Jauni printeri jūsu tīklā}one{Jauni printeri jūsu tīklā}other{Jauni printeri jūsu tīklā}}</translation>
 <translation id="6285395082104474418">Statusa teknē tiek rādīts jūsu tīkla, akumulatora un citu vienumu pašreizējais statuss.</translation>
@@ -3700,6 +3712,7 @@
 <translation id="6380143666419481200">Apstiprināt un turpināt</translation>
 <translation id="6380224340023442078">Satura iestatījumi...</translation>
 <translation id="6383194710567510941">Tiek iespējota chrome.input.ime API izmantošana.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Veicot šo darbību, no šīs ierīces tiks neatgriezeniski izdzēsts vismaz $1 vienums. Lai izgūtu datus vēlāk, pierakstieties pārlūkā Chrome kā $2.}zero{Veicot šo darbību, no šīs ierīces tiks neatgriezeniski izdzēsti vismaz $1 vienumi. Lai izgūtu datus vēlāk, pierakstieties pārlūkā Chrome kā $2.}one{Veicot šo darbību, no šīs ierīces tiks neatgriezeniski izdzēsts vismaz $1 vienums. Lai izgūtu datus vēlāk, pierakstieties pārlūkā Chrome kā $2.}other{Veicot šo darbību, no šīs ierīces tiks neatgriezeniski izdzēsti vismaz $1 vienumi. Lai izgūtu datus vēlāk, pierakstieties pārlūkā Chrome kā $2.}}</translation>
 <translation id="6384275966486438344">Mainiet savus meklēšanas iestatījumus uz šiem: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Lapas, ko skatāt šajā logā, nebūs redzamas pārlūka vēsturē, un, kad aizvērsiet visus viesa režīmā atvērtos logus, datorā nepaliks nekādi vienumi, piemēram, sīkfaili. Tomēr visi lejupielādētie faili tiks saglabāti.</translation>
 <translation id="6391538222494443604">Ievades katalogam jābūt.</translation>
@@ -3838,6 +3851,7 @@
 <translation id="6575134580692778371">Nav konfigurēts</translation>
 <translation id="6575251558004911012">Vaicāt, ja vietne pieprasa piekļuvi manai kamerai (ieteicams)</translation>
 <translation id="6579159469348633828">Brotli satura kodēšana.</translation>
+<translation id="6580151766480067746">ARC versija</translation>
 <translation id="6581162200855843583">Google diska saite</translation>
 <translation id="6583070985841601920">Esat pierakstījies kā lietotājs <ph name="USER_EMAIL_ADDRESS" />. Administrators ir atspējojis sinhronizēšanu.</translation>
 <translation id="65832705307647870">Jaunas cilnes lapa iepriekš tiek aizpildīta ar populārām vietnēm.</translation>
@@ -4004,6 +4018,7 @@
 <translation id="6847758263950452722">Saglabāt lapu kā MHTML</translation>
 <translation id="6853388645642883916">Atjauninātājs darbojas miega režīmā</translation>
 <translation id="68541483639528434">Aizvērt citas cilnes</translation>
+<translation id="6856701878604560493">Bezsaistes grāmatzīmju iespējošana</translation>
 <translation id="6860097299815761905">Starpniekservera iestatījumi...</translation>
 <translation id="6860427144121307915">Atvērt cilnē</translation>
 <translation id="6862635236584086457">Visi faili, kas saglabāti šajā mapē, tiek automātiski dublēti tiešsaistē.</translation>
@@ -4177,6 +4192,7 @@
 <translation id="7092106376816104">Uznirstošo logu izņēmumi</translation>
 <translation id="7093866338626856921">apmainīties datiem ar šādām ierīcēm: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Vai vēlaties atklāt vairāk lielisku funkciju?</translation>
+<translation id="7096108453481049031">Uzraudzīto lietotāju nevarēja importēt. Lūdzu, pārbaudiet tīkla savienojumu un vēlāk mēģiniet vēlreiz.</translation>
 <translation id="7100897339030255923">Atlasīti <ph name="COUNT" /> vienumi</translation>
 <translation id="710227449793100220">Token Binding</translation>
 <translation id="7106346894903675391">Iegādāties papildu vietu krātuvē...</translation>
@@ -4205,6 +4221,7 @@
 <translation id="713888829801648570">Diemžēl jūsu paroli nevarēja verificēt, jo ierīce darbojas bezsaistes režīmā.</translation>
 <translation id="7140928199327930795">Nav citu pieejamu ierīču.</translation>
 <translation id="7141105143012495934">Neizdevās pierakstīties, jo nevarēja izgūt konta informāciju. Lūdzu, sazinieties ar administratoru vai mēģiniet vēlreiz.</translation>
+<translation id="7141331524324591758">Iespējo Pointer Events API daļēju eksperimentālu atbalstu. Paredzēts tikai tīmekļa izstrādātāju veiktai testēšanai; var radīt nelielus traucējumus noteiktās vietnēs.</translation>
 <translation id="7143207342074048698">Notiek savienojuma izveide</translation>
 <translation id="7144878232160441200">Mēģināt vēlreiz</translation>
 <translation id="7148311641502571842">Spraudnis <ph name="PLUGIN_NAME" /> ir atspējots. Lai to no jauna iespējotu, apmeklējiet <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4853,6 +4870,7 @@
 <translation id="8119572489781388874">Modificēt iestatījumus</translation>
 <translation id="8119631488458759651">noņemt šo vietni</translation>
 <translation id="8121385576314601440">Hangul ievades iestatījumi</translation>
+<translation id="8122245494004914423">Veicot šo darbību, no šīs ierīces tiks neatgriezeniski izdzēsti jūsu pārlūkošanas dati. Lai izgūtu datus vēlāk, pierakstieties pārlūkā Chrome kā $2.</translation>
 <translation id="8124313775439841391">Pārvaldītais ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Atļaut nederīgus sertifikātus resursiem, kuri ielādēti no lokālā saimniekdatora.</translation>
@@ -4938,6 +4956,7 @@
 <translation id="8226742006292257240">Tālāk redzama nejauši izveidota TPM parole, kas piešķirta jūsu datoram:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Pašlaik vietnē <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> esošie uzbrucēji jūsu datorā var mēģināt instalēt bīstamas programmas, kuras var nozagt vai dzēst jūsu informāciju (piemēram, fotoattēlus, paroles, ziņojumus un informāciju par kredītkartēm).</translation>
+<translation id="8233254008506535819">Pārlūkošanas datu notīrīšanas dialoglodziņā ietvert iespēju pievienot svarīgas vietnes baltajam sarakstam</translation>
 <translation id="8236231079192337250">Lietotne “Chrome interneta veikala galerija” printera draiveriem</translation>
 <translation id="8238649969398088015">Palīdzības padoms</translation>
 <translation id="8240697550402899963">Izmantot klasisko motīvu</translation>
@@ -5262,7 +5281,6 @@
 <translation id="8708671767545720562">&amp;Plašāka informācija</translation>
 <translation id="8711402221661888347">Hamburgers</translation>
 <translation id="8711453844311572806">Lai ieslēgtu ierīci, kad tālrunis ir atbloķēts un atrodas tuvumā, vienkārši noklikšķiniet. Pretējā gadījumā tiks rādīta bloķēšanas ikona un jums būs jāievada sava parole.</translation>
-<translation id="8712637175834984815">Sapratu!</translation>
 <translation id="8713570323158206935">Sūtīt <ph name="BEGIN_LINK1" />sistēmas informāciju<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Iespējot fiziskās tastatūras automātisko koriģēšanu atbilstoši ASV tastatūrai, kuru izmantojot tiks piedāvāti ieteikumi, kad rakstīsiet uz fiziskās tastatūras.</translation>
 <translation id="871476437400413057">Google saglabātajām parolēm</translation>
@@ -5626,6 +5644,7 @@
 <translation id="952992212772159698">Neaktivizēts</translation>
 <translation id="953000875543358078">Tas var ilgt aptuveni minūti</translation>
 <translation id="960987915827980018">Atlikusi apmēram 1 stunda</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Veicot šo darbību, no šīs ierīces tiks neatgriezeniski izdzēsts $1 vienums. Lai izgūtu datus vēlāk, pierakstieties pārlūkā Chrome kā $2.}zero{Veicot šo darbību, no šīs ierīces tiks neatgriezeniski izdzēsti $1 vienumi. Lai izgūtu datus vēlāk, pierakstieties pārlūkā Chrome kā $2.}one{Veicot šo darbību, no šīs ierīces tiks neatgriezeniski izdzēsts $1 vienums. Lai izgūtu datus vēlāk, pierakstieties pārlūkā Chrome kā $2.}other{Veicot šo darbību, no šīs ierīces tiks neatgriezeniski izdzēsti $1 vienumi. Lai izgūtu datus vēlāk, pierakstieties pārlūkā Chrome kā $2.}}</translation>
 <translation id="96421021576709873">Wi-Fi tīkls</translation>
 <translation id="965490406356730238">Iespējot ar aparatūru paātrinātu mjpeg atšifrēšanu uzņemtajam kadram (kur tas ir pieejams).</translation>
 <translation id="968174221497644223">Lietojumprogrammas kešatmiņa</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index 806b868..21e97d3 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -251,6 +251,7 @@
          <ph name="USER_DISPLAY_EMAIL" /> എന്നയാളുടെ അനുയോജ്യമായ എല്ലാ ഉപകരണങ്ങൾക്കായും Bluetooth ഓണാകുമെന്നും ചില ഹാർഡ്‌വെയർ വിവരം Google-ലേക്ക് അയയ്‌ക്കുമെന്നും ശ്രദ്ധിക്കുക. &lt;a&gt;കൂടുതലറിയുക&lt;/a&gt;</translation>
 <translation id="13649080186077898">ഓട്ടോഫില്‍ ക്രമീകരണങ്ങള്‍ കൈകാര്യം ചെയ്യുക</translation>
 <translation id="1367951781824006909">ഒരു ഫയല്‍ തിരഞ്ഞെടുക്കുക</translation>
+<translation id="136802136832547685">ഈ ഉപകരണത്തിൽ ചേർക്കാൻ സൂപ്പർവൈസുചെയ്‌ത ഉപയോക്താക്കൾ ആരുമില്ല.</translation>
 <translation id="1368265273904755308">പ്രശ്‌നം റിപ്പോര്‍ട്ടുചെയ്യുക</translation>
 <translation id="1368832886055348810">ഇടതുനിന്ന് വലത്തേക്ക്</translation>
 <translation id="1370646789215800222">ഉപയോക്താവിനെ നീക്കംചെയ്യണോ?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">തിരയൂ</translation>
 <translation id="1384211230590313258">സേവന ഡിസ്‌ക്കവറി ഹാൻഡലർ</translation>
 <translation id="1386387014181100145">ഹലോ.</translation>
+<translation id="1386830813511981192">ദശലക്ഷക്കണക്കിന് ആപ്‌സും ഗെയിമുകളും ഇപ്പോൾ നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> ഉപകരണത്തിൽ ലഭ്യമാണ്.</translation>
 <translation id="1389297115360905376"><ph name="CHROME_WEB_STORE" /> എന്നതില്‍ നിന്നുമാത്രമേ ഇത് ചേർക്കാൻ കഴിയൂ.</translation>
 <translation id="1390548061267426325">പതിവ് ടാബായി തുറക്കുക</translation>
 <translation id="1395262318152388157">സീക്ക് സ്ലൈഡർ</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">വലത് മാര്‍‌ജിന്‍‌</translation>
 <translation id="2282146716419988068">GPU പ്രോസസ്സ്</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">WebFonts ലോഡുചെയ്യുന്നതിനുള്ള ഉപയോക്തൃ ഏജന്റ് ഇടപെടലിന്റെ പുതിയ പതിപ്പ്.</translation>
 <translation id="2286454467119466181">ലളിതം</translation>
 <translation id="2286950485307333924">നിങ്ങൾ ഇപ്പോൾ Chrome-ൽ സൈൻ ഇൻ ചെയ്‌തു</translation>
 <translation id="2287590536030307392">എല്ലാ വയർലെസ്സ് കണക്ഷനുകളും ഓഫുചെയ്യുക</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">Google പട്ടിക</translation>
 <translation id="2546283357679194313">കുക്കികളും സൈറ്റ് ഡാറ്റയും</translation>
 <translation id="2549646943416322527">Seccomp ഡിറ്റക്‌റ്റർ</translation>
+<translation id="2550212893339833758">സ്വാപ്പുചെയ്‌ത മെമ്മറി</translation>
 <translation id="2553100941515833716">ഓരോ തവണ പുനരാരംഭിക്കുമ്പോഴും അപ്ലിക്കേഷൻ ലോഞ്ചർ ഇൻസ്റ്റാൾ നില പുനഃസജ്ജമാക്കുക.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> ന് <ph name="NETWORK_ID" /> ലേയ്ക്ക് ബന്ധിപ്പിക്കാന്‍ കഴിയുന്നില്ല. ദയവായി മറ്റൊരു നെറ്റ്‍വര്‍ക്ക് തിരഞ്ഞെടുക്കുക അല്ലെങ്കില്‍ വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="2553440850688409052">ഈ പ്ലഗിന്‍ മറയ്ക്കുക</translation>
@@ -1102,6 +1106,7 @@
 <translation id="2587203970400270934">ഓപ്പറേറ്റര്‍ കോഡ്:</translation>
 <translation id="2587922270115112871">ഒരു സൂപ്പർവൈസുചെയ്‌ത ഉപയോക്താവിനെ സൃഷ്‌ടിക്കുന്നത് Google അക്കൗണ്ട് സൃഷ്‌ടിക്കുന്നില്ല,  ഒപ്പം അവയുടെ ക്രമീകരണങ്ങളും
     ഡാറ്റയും Chrome സമന്വയം ഉപയോഗിച്ച് മറ്റ് ഉപകരണങ്ങളിൽ അവരെ പിന്തുടരില്ല. ഒരു സൂപ്പർവൈസുചെയ്‌ത ഉപയോക്താവ് ഈ ഉപകരണത്തിന് മാത്രം ബാധകമാണ്.</translation>
+<translation id="2594049137847833442">'ബ്രൗസിംഗ് ഡാറ്റ മായ്‌ക്കുക' ഡയലോഗിൽ പ്രധാന സൈറ്റുകളുടെ ഓപ്‌ഷനുകളുണ്ട്</translation>
 <translation id="2594056015203442344">പ്രവർത്തനക്ഷമമാക്കുമ്പോൾ, ടാബ് ഓഡിയോ മ്യൂട്ട് നിയന്ത്രണങ്ങൾക്കനുസരിച്ച് ടാബ്‌ സ്‌ട്രിപ്പിലെ ഓഡിയോ സൂചകങ്ങൾ ഇരട്ടിക്കും. തിരഞ്ഞെടുത്ത ഒന്നിലധികം ടാബുകൾ പെട്ടെന്ന് മ്യൂട്ടുചെയ്യുന്നതിനായി ടാബ് സന്ദർഭ മെനുവിലേക്ക് ഇത് കമാൻഡുകളും ചേർക്കുന്നു.</translation>
 <translation id="259421303766146093">ചെറുതാക്കുക</translation>
 <translation id="2597852038534460976">Chrome-ന് വാൾപേപ്പറുകൾ ആക്‌സസ്സുചെയ്യാനായില്ല. ഒരു നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റുചെയ്യുക.</translation>
@@ -1469,7 +1474,6 @@
 <translation id="3065140616557457172">തിരയാന്‍ ടൈപ്പുചെയ്യുക അല്ലെങ്കില്‍ നാവിഗേറ്റുചെയ്യാനായി URL നല്‍കുക - ഇപ്പോള്‍ പ്രവര്‍ത്തിച്ചവ എല്ലാം.</translation>
 <translation id="3067198360141518313">ഈ പ്ലഗിന്‍ പ്രവര്‍ത്തിപ്പിക്കുക</translation>
 <translation id="307519606911195071">ക്രമീകരണ പേജിൽ കൂടുതൽ ആക്‌സസിബിലിറ്റി ഫീച്ചറുകൾ പ്രവർത്തനക്ഷമമാക്കുക.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" />, ഒരു സൂപ്പർവൈസുചെയ്‌ത ഉപയോക്താവായി സൃഷ്‌ടിക്കപ്പെട്ടു!</translation>
 <translation id="3075874217500066906">പവർവാഷ് പ്രോസസ്സ് ആരംഭിക്കുന്നതിന് പുനരാരംഭിക്കേണ്ടതുണ്ട്. പുനരാരംഭിച്ചതിന് ശേഷം തുടരേണ്ടതുണ്ടോയെന്ന് സ്ഥിരീകരിക്കാൻ നിങ്ങളോട് ആവശ്യപ്പെടും.</translation>
 <translation id="3076677906922146425">Chrome-ൽ ഒരാളെ ചേർക്കുന്നതിന് എല്ലാവരേയും അനുവദിക്കുക</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1486,6 +1490,7 @@
 <translation id="3088034400796962477">ലിപ്യന്തരണം (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;പേരുമാറ്റുക...</translation>
 <translation id="308903551226753393">യാന്ത്രികമായി കോൺഫിഗർ ചെയ്യുക</translation>
+<translation id="3089231390674410424">ക്രെഡൻഷ്യലുകളിൽ പ്രശ്‌നമുണ്ടെന്ന് തോന്നുന്നു. നിങ്ങൾ ശരിയായ രീതിയിലാണ് സൈൻ ഇൻ ചെയ്‌തിരിക്കുന്നതെന്ന് ഉറപ്പാക്കി, വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="3090819949319990166"><ph name="TEMP_CRX_FILE" /> എന്നതിലേക്ക് ബാഹ്യ crx ഫയൽ പകർത്താനാവില്ല.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" ജോടിയാക്കി</translation>
 <translation id="3092544800441494315">ഈ സ്ക്രീന്‍ഷോട്ട് ഉള്‍പ്പെടുത്തുക:</translation>
@@ -2013,7 +2018,6 @@
 <translation id="3790856258139356663">Chrome സമന്വയത്തിനായി പരിശോധന സെർവറിലേക്ക് കണക്റ്റുചെയ്യുന്നു.</translation>
 <translation id="3790909017043401679">SIM കാര്‍ഡ് PIN നല്‍കുക</translation>
 <translation id="3792890930871100565">പ്രിന്ററുകൾ വിച്ഛേദിക്കുക</translation>
-<translation id="3795681127952030401">നിങ്ങൾക്ക് അറിയിപ്പുകൾ അയയ്‌ക്കാൻ <ph name="URL" /> താൽപ്പര്യപ്പെടുന്നു.</translation>
 <translation id="3796648294839530037">പ്രിയപ്പെട്ട നെറ്റ്‌വർക്കുകൾ:</translation>
 <translation id="3797900183766075808">&amp;'<ph name="SEARCH_TERMS" />' എന്നതിനായി <ph name="SEARCH_ENGINE" />-ൽ തിരയുക</translation>
 <translation id="3798449238516105146">പതിപ്പ്</translation>
@@ -2485,6 +2489,7 @@
 <translation id="4552678318981539154">കൂടുതൽ സംഭരണം വാങ്ങുക</translation>
 <translation id="4554591392113183336">നിലവിലുള്ള ഒന്നുമായി താരതമ്യപ്പെടുത്തുമ്പോൾ, ബാഹ്യ വിപുലീകരണത്തിന്റെ പതിപ്പ് സമാനമായതോ അതിന് മുമ്പുള്ളതോ ആണ്.</translation>
 <translation id="4554796861933393312">മെറ്റീരിയൽ രൂപകൽപ്പന ഇങ്ക് ഡ്രോപ്പ് ആനിമേഷൻ വേഗത</translation>
+<translation id="4555670907822902621">ഓഫ്‌ലൈനിൽ കാണുന്നതിന്, ബുക്ക്‌മാർക്കുചെയ്‌ത പേജുകൾ സംരക്ഷിക്കുന്നത് പ്രവർത്തനക്ഷമമാക്കുക.</translation>
 <translation id="4555769855065597957">ഷാഡോ</translation>
 <translation id="4556110439722119938">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ഉപയോഗിക്കുന്നതിന് ബുക്ക്‌മാർക്കുകൾ, ചരിത്രം, പാസ്‌വേഡുകൾ, മറ്റ് ക്രമീകരണം എന്നിവയെ Google അക്കൗണ്ടിലേക്ക് സമന്വയിപ്പിക്കുന്നതാണ്</translation>
 <translation id="4557136421275541763">മുന്നറിയിപ്പ്: </translation>
@@ -2662,6 +2667,7 @@
 <translation id="4824518112777153488">യോഗ്യതയുള്ള ടച്ച്‌സ്‌ക്രീനുകൾ ഹോവർചെയ്യുന്നതിനുള്ള പിന്തുണ</translation>
 <translation id="4830573902900904548"><ph name="NETWORK_NAME" /> ഉപയോഗിച്ച് നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> ഇന്റർനെറ്റിൽ കണ‌ക്റ്റു‌ചെയ്യാനാകുന്നില്ല. മറ്റൊരു നെറ്റ്‌വർക്ക് തിരഞ്ഞെടുക്കുക. <ph name="LEARN_MORE_LINK_START" />കൂടുതലറിയുക<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572"><ph name="LOCALITY" /> എന്നയിടത്തെ <ph name="ORGANIZATION" /> എന്നതിന്റെ ഐഡന്റിറ്റി <ph name="ISSUER" /> പരിശോധിച്ചു. സാധുവായ സർട്ടിഫിക്കറ്റ് സുതാര്യത വിവരങ്ങൾ നൽകിയത് സെർവർ ആണ്.</translation>
+<translation id="4832537345877333532">ഡിസ്‌പ്ലേ വർണ്ണ കാലിബറേഷനുവേണ്ടി Quirks സെർവറിൽ നിന്ന് icc ഡിസ്‌പ്ലേ ഫയലുകളുടെ വീണ്ടെടുക്കൽ പ്രവർത്തനരഹിതമാക്കുക.</translation>
 <translation id="4834912470034578916">വെബ് അറിയിപ്പുകൾക്കായി ഇഷ്‌ടാനുസൃത ലേ ഔട്ടുകൾ പ്രവർത്തനക്ഷമമാക്കുക.</translation>
 <translation id="4835836146030131423">പ്രവേശിക്കല്‍‌ പിശക്.</translation>
 <translation id="4837926214103741331">ഈ ഉപകരണം ഉപയോഗിക്കാൻ നിങ്ങൾക്ക് അനുമതിയില്ല. സൈൻ ഇൻ അനുമതിയ്‌ക്കായി ഉപകരണ ഉടമയെ ബന്ധപ്പെടുക.</translation>
@@ -2849,6 +2855,7 @@
 <translation id="5120421890733714118">വെബ്‌സൈറ്റുകൾ തിരിച്ചറിയുന്നതിനായി ഈ സർട്ടിഫിക്കറ്റിനെ വിശ്വസിക്കുക.</translation>
 <translation id="5121130586824819730">നിങ്ങളുടെ ഹാർഡ് ഡിസ്‌ക് നിറഞ്ഞു.  മറ്റൊരു ലൊക്കേഷനിലേക്ക് സംരക്ഷിക്കുകയോ ഹാർഡ് ഡിസ്‌കിൽ കൂടുതൽ ഇടം സൃഷ്‌ടിക്കുകയോ ചെയ്യുക.</translation>
 <translation id="5125751979347152379">URL അസാധുവാണ്.</translation>
+<translation id="5126663277159826272">ഡിസ്‌പ്ലേ കാലിബറേഷന് വേണ്ടി Quirks ക്ലയന്റ് പ്രവർത്തനരഹിതമാക്കുക.</translation>
 <translation id="5127881134400491887">നെറ്റ്‌വർക്ക് കണക്ഷനുകൾ നിയന്ത്രിക്കുക</translation>
 <translation id="5128590998814119508">ഡിസ്‌പ്ലേ ലിസ്‌റ്റ് 2D ക്യാൻവാസ്</translation>
 <translation id="512903556749061217">അറ്റാച്ചുചെയ്‌തു</translation>
@@ -2990,9 +2997,11 @@
 <translation id="5301751748813680278">അതിഥിയായി പ്രവേശിക്കുന്നു.</translation>
 <translation id="5301954838959518834">മനസിലായി</translation>
 <translation id="5302048478445481009">ഭാഷ</translation>
+<translation id="5304039790201806037">പോയിന്റർ ഇവന്റുകൾ</translation>
 <translation id="5305688511332277257">ഒന്നും ഇന്‍സ്റ്റാള്‍ ചെയ്തിട്ടില്ല</translation>
 <translation id="5308380583665731573">കണക്‌റ്റുചെയ്യുക</translation>
 <translation id="5311260548612583999">സ്വകാര്യ കീ ഫയല്‍‌ (ഐച്ഛികം):</translation>
+<translation id="5313967007315987356">സൈറ്റ് ചേർക്കുക</translation>
 <translation id="5316588172263354223">ഏതുസമയത്തും വോയ്‌സ് തിരയുക</translation>
 <translation id="5316716239522500219">മോണിറ്ററുകൾ മിറർ ചെയ്യുക</translation>
 <translation id="5317780077021120954">സംരക്ഷിക്കുക</translation>
@@ -3295,6 +3304,7 @@
 <translation id="5734362860645681824">കമ്മ്യൂണിക്കേഷനുകൾ</translation>
 <translation id="573719557377416048">സാമീപ്യ നില മായ്‌ക്കുക</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: എഡിറ്റുചെയ്യാൻ തിരഞ്ഞെടുക്കുക</translation>
+<translation id="5741454054957165976">WebFonts ലോഡുചെയ്യുന്നതിനുള്ള ഉപയോക്തൃ ഏജന്റ് ഇടപെടലിന്റെ പുതിയ പതിപ്പ് പ്രവർത്തനക്ഷമമാക്കുക.</translation>
 <translation id="574392208103952083">ഇടത്തരം</translation>
 <translation id="5745056705311424885">USB മെമ്മറി സ്റ്റിക്ക് കണ്ടെത്തി</translation>
 <translation id="5746169159649715125">PDF ആയി സംരക്ഷിക്കുക</translation>
@@ -3343,7 +3353,6 @@
 <translation id="5803531701633845775">കഴ്‌സര്‍‌ നീക്കാതെതന്നെ, പദസമുച്ചയങ്ങള്‍‌ പിന്നില്‍‌ നിന്ന് തിരഞ്ഞെടുക്കുക</translation>
 <translation id="5804241973901381774">അനുമതികൾ</translation>
 <translation id="580571955903695899">ശീര്‍‌ഷക പ്രകാരം പുനഃക്രമീകരിക്കുക</translation>
-<translation id="5808982448801399019">അംഗീകരിക്കാനായില്ല</translation>
 <translation id="580961539202306967">എനിക്ക് പുഷ് സന്ദേശങ്ങൾ അയയ്‌ക്കാൻ ഒരു സൈറ്റ് താൽപ്പര്യപ്പെടുമ്പോൾ എന്നോട് ചോദിക്കുക (ശുപാർശ ചെയ്യുന്നത്)</translation>
 <translation id="5815645614496570556">X.400 വിലാസം</translation>
 <translation id="5817397429773072584">ചൈനീസ് പരമ്പരാഗതം</translation>
@@ -3368,6 +3377,7 @@
 <translation id="5834581999798853053">ഏകദേശം <ph name="TIME" /> മിനിറ്റ് ശേഷിക്കുന്നു</translation>
 <translation id="5838825566232597749">യുഎസ് വർക്ക്‌മാൻ ഇന്റർനാഷണൽ</translation>
 <translation id="5839277899276241121">ബില്ലിംഗ് വിലാസം തന്നെ</translation>
+<translation id="5844550873065695788">ഇത്, ഈ ഉപകരണത്തിൽ നിന്ന് <ph name="TOTAL_COUNT" /> ഇനങ്ങളെയെങ്കിലും ശാശ്വതമായി ഇല്ലാതാക്കും. പിന്നീട് നിങ്ങളുടെ ഡാറ്റ വീണ്ടെടുക്കാൻ, $2 എന്നതായി chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="5846929185714966548">ടാബ് 4</translation>
 <translation id="5848934677402291689">PDF-ലേക്ക് സംരക്ഷിക്കുന്നത് പുരോഗമിക്കുന്നു</translation>
 <translation id="5849335628409778954">ക്രെഡിറ്റ് കാർഡ് നൽകുക...</translation>
@@ -3614,6 +3624,7 @@
 <translation id="6232017090690406397">ബാറ്ററി</translation>
 <translation id="6241530762627360640">നിങ്ങളുടെ സിസ്റ്റവുമായി ജോടിയാക്കിയ Bluetooth ഉപകരണങ്ങളെക്കുറിച്ചുള്ള വിവരങ്ങൾ ആക്‌സസ്സുചെയ്ത് സമീപമുള്ള Bluetooth ഉപകരണങ്ങൾ കണ്ടെത്തുക.</translation>
 <translation id="6243774244933267674">സെർവർ ലഭ്യമല്ല</translation>
+<translation id="6246413617632217567">സൂപ്പർവൈസുചെയ്‌ത ഉപയോക്താവിനെ ഇമ്പോർട്ടുചെയ്യാനായില്ല. നിങ്ങളുടെ ഹാർഡ് ഡ്രൈവിലെ ഇടവും അനുമതികളും പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">അപ്‌ഡേറ്റ് തയ്യാറാണ്</translation>
 <translation id="6248400709929739064">സബ്‌ടൈറ്റിലുകൾ പ്രവർത്തനക്ഷമമാക്കുക</translation>
@@ -3642,6 +3653,7 @@
 <translation id="6277518330158259200">സ്‌ക്രീൻഷോട്ടെടുക്കുക</translation>
 <translation id="6279183038361895380">നിങ്ങളുടെ കഴ്‌സർ കാണിക്കാൻ |<ph name="ACCELERATOR" />| അമർത്തുക</translation>
 <translation id="6280215091796946657">മറ്റൊരു അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">ലേഔട്ട് വ്യൂപോർട്ട് പ്രതിഫലിപ്പിക്കുന്ന എല്ലാ API-കളും സ്വന്തമാക്കുന്നതിനുള്ള പരീക്ഷണം. ഇത് ലേഔട്ട് വ്യൂപോർട്ടുമായി ബന്ധപ്പെട്ട് window.scroll പ്രോപ്പർട്ടികൾ സൃഷ്‌ടിക്കും.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{നിങ്ങളുടെ നെറ്റ്‌വർക്കിലെ പുതിയ പ്രിന്റർ}other{നിങ്ങളുടെ നെറ്റ്‌വർക്കിലെ പുതിയ പ്രിന്ററുകൾ}}</translation>
 <translation id="6285395082104474418">സ്റ്റാറ്റസ് ട്രേ നിങ്ങളുടെ നെറ്റ്‌വർക്കിന്റെയും ബാറ്ററിയുടെയും മറ്റ് കാര്യങ്ങളുടെയും നിലവിലെ നില ദൃശ്യമാക്കുന്നു.</translation>
@@ -3697,6 +3709,7 @@
 <translation id="6380143666419481200">അംഗീകരിച്ച് തുടരുക</translation>
 <translation id="6380224340023442078">ഉള്ളടക്ക ക്രമീകരണങ്ങള്‍...</translation>
 <translation id="6383194710567510941">chrome.input.ime API എന്നതിന്റെ ഉപയോഗം പ്രവർത്തനക്ഷമമാക്കുക.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{ഇത് ഈ ഉപകരണത്തിൽ നിന്നും $1 ഇനത്തെയെങ്കിലും ശാശ്വതമായി ഇല്ലാതാക്കും. പിന്നീട് നിങ്ങളുടെ ഡാറ്റ വീണ്ടെടുക്കാൻ, $2 എന്നതായി chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക.}other{ഇത് ഈ ഉപകരണത്തിൽ നിന്നും $1 ഇനങ്ങളെയെങ്കിലും ശാശ്വതമായി ഇല്ലാതാക്കും. പിന്നീട് നിങ്ങളുടെ ഡാറ്റ വീണ്ടെടുക്കാൻ, $2 എന്നതായി chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക.}}</translation>
 <translation id="6384275966486438344">നിങ്ങളുടെ തിരയൽ ക്രമീകരണങ്ങൾ മാറ്റുക: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">തുറന്നിരിക്കുന്ന എല്ലാ അതിഥി വിൻഡോകളും അടച്ചുകഴിഞ്ഞാൽ, ഈ വിൻഡോയിൽ നിങ്ങൾ കാണുന്ന പേജുകൾ നിങ്ങളുടെ ബ്രൗസർ ചരിത്രത്തിൽ ദൃശ്യമാകില്ല, അവ കുക്കികൾ പോലുള്ള മറ്റ് തെളിവുകൾ നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അവശേഷിപ്പിക്കുകയുമില്ല. എന്നിരുന്നാലും, നിങ്ങൾ ഡൗൺലോഡുചെയ്യുന്ന എല്ലാ ഫയലുകളും സൂക്ഷിക്കും.</translation>
 <translation id="6391538222494443604">ഇന്‍‌പുട്ട് ഡയറക്‌ടറി നിലവിലുണ്ടായിരിക്കണം.</translation>
@@ -3835,6 +3848,7 @@
 <translation id="6575134580692778371">ക്രമീകരിച്ചിട്ടില്ല</translation>
 <translation id="6575251558004911012">ഒരു സൈറ്റിന് നിങ്ങളുടെ ക്യാമറയിലേക്ക് ആക്‌സസ്സ് വേണ്ടി വരുമ്പോൾ ആവശ്യപ്പെടുക (ശുപാർശ ചെയ്‌തത്)</translation>
 <translation id="6579159469348633828">Brotli ഉള്ളടക്ക-എൻകോഡിംഗ്.</translation>
+<translation id="6580151766480067746">ARC പതിപ്പ്</translation>
 <translation id="6581162200855843583">Google ഡ്രൈവ് ലിങ്ക്</translation>
 <translation id="6583070985841601920"><ph name="USER_EMAIL_ADDRESS" /> എന്നായി സൈൻ ഇൻ ചെയ്‌തു. നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്റർ സമന്വയം പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു.</translation>
 <translation id="65832705307647870">ജനപ്രിയ സൈറ്റുകൾ ഉപയോഗിച്ച് പുതിയ ടാബ് പേജ് പ്രീപോപ്പുലേറ്റുചെയ്യുക.</translation>
@@ -4000,6 +4014,7 @@
 <translation id="6847758263950452722">MHTML ആയി പേജ് സംരക്ഷിക്കുക</translation>
 <translation id="6853388645642883916">അപ്‌ഡേറ്റർ പ്രവർത്തിക്കുന്നില്ല</translation>
 <translation id="68541483639528434">മറ്റ് ടാബുകള്‍ അടയ്ക്കുക</translation>
+<translation id="6856701878604560493">ഓഫ്‌ലൈൻ ബുക്ക്മാർക്കുകൾ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="6860097299815761905">പ്രോക്സി ക്രമീകരണങ്ങള്‍...</translation>
 <translation id="6860427144121307915">ഒരു ടാബിൽ തുറക്കുക</translation>
 <translation id="6862635236584086457">ഈ ഫോൾഡറിൽ സംരക്ഷിച്ചിരിക്കുന്ന എല്ലാ ഫയലുകളും ഓൺലൈനിൽ യാന്ത്രികമായി ബാക്കപ്പ് ചെയ്യപ്പെടുന്നതാണ്</translation>
@@ -4174,6 +4189,7 @@
 <translation id="7092106376816104">പോപ്പ്-അപ്പ് ഒഴിവാക്കലുകള്‍‌</translation>
 <translation id="7093866338626856921"><ph name="HOSTNAMES" /> പേരിലുള്ള ഉപകരണങ്ങൾ ഉപയോഗിച്ച് ഡാറ്റ എക്‌സ്‌ചേഞ്ചുചെയ്യുക</translation>
 <translation id="7096082900368329802">കൂടുതൽ ആകർഷണീയ സവിശേഷതകൾ കണ്ടെത്തണോ?</translation>
+<translation id="7096108453481049031">സൂപ്പർവൈസുചെയ്‌ത ഉപയോക്താവിനെ ഇമ്പോർട്ടുചെയ്യാനായില്ല. നിങ്ങളുടെ നെറ്റ്‌വർക്ക് കണക്ഷൻ പരിശോധിച്ച്, പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> ഇനങ്ങൾ തിരഞ്ഞെടുത്തു</translation>
 <translation id="710227449793100220">ടോക്കൺ ബൈൻഡിംഗ്.</translation>
 <translation id="7106346894903675391">കൂടുതൽ സംഭരണം വാങ്ങുക...</translation>
@@ -4202,6 +4218,7 @@
 <translation id="713888829801648570">ക്ഷമിക്കണം, നിങ്ങൾ ഓഫ്‌ലൈനിലായതിനാൽ പാസ്‌വേഡ് പരിശോധിച്ചുറപ്പിക്കാനായില്ല.</translation>
 <translation id="7140928199327930795">ലഭ്യമായ മറ്റ് ഉപകരണങ്ങളൊന്നുമില്ല.</translation>
 <translation id="7141105143012495934">നിങ്ങളുടെ അക്കൗണ്ട് വിശദാംശങ്ങൾ വീണ്ടെടുക്കാനാവാത്തതിനാൽ സൈൻ ഇൻ ചെയ്യുന്നത് പരാജയപ്പെട്ടു. നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്ററെ ബന്ധപ്പെടുക അല്ലെങ്കിൽ വീണ്ടും ശ്രമിക്കുക.</translation>
+<translation id="7141331524324591758">പോയിന്റർ ഇവന്റുകൾ  API എന്നതിനുള്ള ഭാഗികമായ പരീക്ഷണാത്മക പിന്തുണ പ്രവർത്തനക്ഷമമാക്കുന്നു.  ഇത് വെബ്‌ ഡെവലപ്പർമാർക്ക് പരിശോധിക്കാൻ വേണ്ടി മാത്രമുള്ളതാണ്, ഒപ്പം ഇത് ചില വെബ്‌സൈറ്റുകൾ തകരാനും കാരണമാകും.</translation>
 <translation id="7143207342074048698">കണക്റ്റുചെയ്യുന്നു</translation>
 <translation id="7144878232160441200">വീണ്ടും ശ്രമിക്കുക</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> അപ്രാപ്‌തമാക്കി. അത് വീണ്ടും പ്രാപ്‌തമാക്കുന്നതിന്, <ph name="CHROME_PLUGINS_LINK" /> എന്നതിലേക്ക് പോകുക.</translation>
@@ -4850,6 +4867,7 @@
 <translation id="8119572489781388874">ക്രമീകരണങ്ങൾ പരിഷ്‌ക്കരിക്കുക</translation>
 <translation id="8119631488458759651">ഈ സൈറ്റ് നീക്കം ചെയ്യുക</translation>
 <translation id="8121385576314601440">ഹംഗുള്‍‌ ഇന്‍‌പുട്ട് ക്രമീകരണങ്ങള്‍</translation>
+<translation id="8122245494004914423">ഇത് ഈ ഉപകരണത്തിൽ നിന്നും നിങ്ങളുടെ ബ്രൗസിംഗ് ഡാറ്റയെ ശാശ്വതമായി ഇല്ലാതാക്കും. പിന്നീട് നിങ്ങളുടെ ഡാറ്റ വീണ്ടെടുക്കാൻ, $2 എന്നതായി chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="8124313775439841391">നിയന്ത്രിത ONC</translation>
 <translation id="8126844665673008223">വെബ് Bluetooth</translation>
 <translation id="8127322077195964840">ലോക്കൽഹോസ്റ്റിൽ നിന്ന് ലോഡുചെയ്‌തിരിക്കുന്ന ഉറവിടങ്ങൾക്കായി അസാധുവായ സർട്ടിഫിക്കറ്റുകൾ അനുവദിക്കുക.</translation>
@@ -4935,6 +4953,7 @@
 <translation id="8226742006292257240">നിങ്ങളുടെ കമ്പ്യൂട്ടറിലേക്ക് നിര്‍ണ്ണയിച്ച ക്രമരഹിതമായി ജനറേറ്റുചെയ്ത TPM പാസ്‍വേഡ് ചുവടെ:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> എന്നതിലെ നിലവിലുള്ള ആക്രമണകാരികൾ നിങ്ങളുടെ വിവരങ്ങൾ ഇല്ലാതാക്കാനോ മോഷ്‌ടിക്കാനോ ഇടയുള്ള (ഉദാഹരണാത്തിന്, ഫോട്ടോകൾ, പാസ്‌വേഡുകൾ, സന്ദേശങ്ങൾ, ക്രെഡിറ്റ് കാർഡുകൾ മുതലായവ) അപകടകരമായ പ്രോഗ്രാമുകൾ നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ ഇൻസ്‌റ്റാളുചെയ്യാൻ ശ്രമം നടത്താനിടയുണ്ട്.</translation>
+<translation id="8233254008506535819">'ബ്രൗസിംഗ് ഡാറ്റ മായ്‌ക്കുക' ഡയലോഗിൽ പ്രധാന സൈറ്റുകൾ വൈറ്റ്‌ലിസ്‌റ്റ് ചെയ്യാനുള്ള ഓപ്‌ഷൻ ഉൾപ്പെടുത്തുക.</translation>
 <translation id="8236231079192337250">പ്രിന്റർ ഡ്രൈവറുകൾക്കായുള്ള Chrome വെബ് സ്‌റ്റോർ ഗാലറി ആപ്പ്</translation>
 <translation id="8238649969398088015">സഹായ നുറുങ്ങ്</translation>
 <translation id="8240697550402899963">ക്ലാസിക്ക് തീം ഉപയോഗിക്കുക</translation>
@@ -5259,7 +5278,6 @@
 <translation id="8708671767545720562">&amp;കൂടുതൽ വിവരങ്ങൾ</translation>
 <translation id="8711402221661888347">പിക്കിൾസ്</translation>
 <translation id="8711453844311572806">നിങ്ങളുടെ ഫോൺ അൺലോക്ക് ചെയ്‌ത് വിളിപ്പാടരികെയായിരിക്കുമ്പോൾ, പ്രവേശിക്കുന്നതിന് ക്ലിക്കുചെയ്യുക. അല്ലെങ്കിൽ നിങ്ങൾ ലോക്കുചെയ്‌ത ഒരു ഐക്കൺ കാണുകയും പാസ്‌വേഡ് ടൈപ്പുചെയ്യേണ്ടതായിവരുകയും ചെയ്യും.</translation>
-<translation id="8712637175834984815">വിജയകരം</translation>
 <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />സിസ്റ്റം വിവരങ്ങൾ<ph name="END_LINK1" /> അയയ്‌ക്കുക</translation>
 <translation id="8713979477561846077">ഫിസിക്കൽ കീബോർഡിൽ ടൈപ്പുചെയ്യുന്നതിനനുസരിച്ച് നിർദ്ദേശങ്ങൾ നൽകുന്ന US കീബോർഡിനുള്ള ഫിസിക്കൽ കീബോർഡ് സ്വയം തിരുത്തൽ പ്രവർത്തനക്ഷമമാക്കുക.</translation>
 <translation id="871476437400413057">Google സംരക്ഷിത പാസ്‌വേഡുകൾ</translation>
@@ -5622,6 +5640,7 @@
 <translation id="952992212772159698">സജീവമാക്കിയില്ല</translation>
 <translation id="953000875543358078">ഇതിന് ഒരു മിനിറ്റോ അതിൽകൂടുതലോ സമയമെടുക്കാം</translation>
 <translation id="960987915827980018">ഏകദേശം 1 മണിക്കൂർ ശേഷിക്കുന്നു</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{ഇത് ഈ ഉപകരണത്തിൽ നിന്നും $1 ഇനത്തെ ശാശ്വതമായി ഇല്ലാതാക്കും. പിന്നീട് നിങ്ങളുടെ ഡാറ്റ വീണ്ടെടുക്കാൻ, $2 എന്നതായി chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക.}other{ഇത് ഈ ഉപകരണത്തിൽ നിന്നും $1 ഇനങ്ങളെ ശാശ്വതമായി ഇല്ലാതാക്കും. പിന്നീട് നിങ്ങളുടെ ഡാറ്റ വീണ്ടെടുക്കാൻ, $2 എന്നതായി chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക.}}</translation>
 <translation id="96421021576709873">Wi-Fi നെറ്റ്‌വർക്ക്</translation>
 <translation id="965490406356730238">ക്യാപ്‌ചർ ചെയ്‌ത ഫ്രെയിമിനായി ലഭ്യമായിരിക്കുമ്പോൾ ഹാർഡ്‌വെയർ ത്വരിതപ്പെടുത്തിയ mjpeg ഡീകോഡ് പ്രവർത്തനക്ഷമമാക്കുക.</translation>
 <translation id="968174221497644223">അപ്ലിക്കേഷന്‍ കാഷെ</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 60338ba4..d6926c9 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -251,6 +251,7 @@
       लक्षात ठेवा की <ph name="USER_DISPLAY_EMAIL" /> च्या सर्व सुसंगत डिव्हाइसेससाठी Bluetooth चालू केले जाईल, आणि काही हार्डवेअर माहिती Google कडे पाठविली जाईल. &lt;a&gt;अधिक जाणून घ्या&lt;/a&gt;</translation>
 <translation id="13649080186077898">ऑटोफिल सेटिंग्ज व्यवस्थापित करा</translation>
 <translation id="1367951781824006909">फाइल निवडा</translation>
+<translation id="136802136832547685">या डिव्हाइसमध्ये जोडण्यासाठी कोणतेही पर्यवेक्ष‍ी वापरकर्ते नाहीत.</translation>
 <translation id="1368265273904755308">समस्येचा अहवाल द्या</translation>
 <translation id="1368832886055348810">डावीकडून उजवीकडे</translation>
 <translation id="1370646789215800222">व्यक्तीस काढायचे?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">शोधा</translation>
 <translation id="1384211230590313258">सेवा शोध हँडलर</translation>
 <translation id="1386387014181100145">कसे काय.</translation>
+<translation id="1386830813511981192">आपल्या <ph name="DEVICE_TYPE" /> वर आता दशलक्षांपेक्षाही अधिक अॅप्स आणि गेम उपलब्ध आहेत.</translation>
 <translation id="1389297115360905376">हे केवळ <ph name="CHROME_WEB_STORE" /> वरून जोडले जाऊ शकते.</translation>
 <translation id="1390548061267426325">नियमित टॅब म्हणून उघडा</translation>
 <translation id="1395262318152388157">स्लायाडर शोधा</translation>
@@ -891,6 +893,7 @@
 <translation id="2280486287150724112">उजवा समास</translation>
 <translation id="2282146716419988068">GPU प्रक्रिया</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">WebFonts लोड करण्यासाठीवापरकर्ता-एजंट हस्तक्षेपची नवीन आवृत्ती.</translation>
 <translation id="2286454467119466181">साधी</translation>
 <translation id="2286950485307333924">आपण आता Chrome वर साइन इन केले आहे</translation>
 <translation id="2287590536030307392">सर्व वायरलेस कनेक्शन बंद करा.</translation>
@@ -1068,6 +1071,7 @@
 <translation id="2542049655219295786">Google सारणी</translation>
 <translation id="2546283357679194313">कुकीज आणि साइट डेटा</translation>
 <translation id="2549646943416322527">Seccomp डिटेक्टर</translation>
+<translation id="2550212893339833758">स्वॅप केलेली मेमरी</translation>
 <translation id="2553100941515833716">दरवेळी रीस्टार्ट करताना अ‍ॅप लाँचर स्थापित करा स्थिती रीसेट करा.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> <ph name="NETWORK_ID" /> शी कनेक्ट करण्यात अक्षम आहे. कृपया दुसरे नेटवर्क निवडा किंवा पुन्हा प्रयत्न करा. </translation>
 <translation id="2553440850688409052">हे प्लगिन लपवा</translation>
@@ -1101,6 +1105,7 @@
 <translation id="2587203970400270934">ऑपरेटर कोड:</translation>
 <translation id="2587922270115112871">पर्यवेक्षी वापरकर्ता तयार करण्याने Google खाते तयार होत नाही आणि त्यांच्या सेटिंग्ज आणि डेटा
     Chrome Sync सह इतर डिव्हाइसवर त्यांचे अनुसरण करणार नाही. पर्यवेक्षी वापरकर्ता केवळ या डिव्हाइसवर लागू होतो.</translation>
+<translation id="2594049137847833442">ब्राउझ केलेला डेटा क्लिअर करा संवादमधील महत्वाच्या साइट पर्याय</translation>
 <translation id="2594056015203442344">सक्षम केलेले असताना, टॅब ऑडिओ नियंत्रणे निःशब्द करत असल्याने टॅब स्‍ट्रिप मधील ऑडिओ सूचक डबल करतात. हे एकाधिक निवडलेले टॅब द्रुतपणे निःशब्द करण्यासाठी टॅब संदर्भ मेनूमध्ये आज्ञा देखील जोडते.</translation>
 <translation id="259421303766146093">विशालित करू नका</translation>
 <translation id="2597852038534460976">Chrome वॉलपेपरवर प्रवेश करू शकत नाही. कृपया एका नेटवर्कशी कनेक्ट करा.</translation>
@@ -1464,7 +1469,6 @@
 <translation id="3065140616557457172">शोधण्यासाठी टाइप करा किंवा नॅव्हिगेट करण्यासाठी URL प्रविष्ट करा – काहीही चालेल.</translation>
 <translation id="3067198360141518313">हे प्लगइन चालवा</translation>
 <translation id="307519606911195071">सेटिंग्ज पृष्ठामध्ये अतिरिक्त प्रवेशक्षमता वैशिष्ट्ये सक्षम करा.</translation>
-<translation id="3075239840551149663">एक पर्यवेक्षी वापरकर्ता म्हणून <ph name="NEW_PROFILE_NAME" /> तयार केले गेले आहे!</translation>
 <translation id="3075874217500066906">Powerwash प्रक्रिया सुरु करण्‍यासाठी रीस्‍टार्ट आवश्‍यक आहे. रीस्‍टार्ट केल्‍यानंतर आपण पुढे सुरु ठेवू इच्‍छिता याची पुष्‍टी करण्‍यासाठी आपल्‍याला विचारले जाईल.</translation>
 <translation id="3076677906922146425">कोणालाही Chrome मध्ये एक व्यक्ती जोडू द्या</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1481,6 +1485,7 @@
 <translation id="3088034400796962477">लिप्यंतरण (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;पुनर्नामित करा...</translation>
 <translation id="308903551226753393">स्वयंचलितपणे कॉन्फिगर करा</translation>
+<translation id="3089231390674410424">आपल्या क्रेडेन्शियलसह समस्या असल्यासारखे दिसते आहे. कृपया आपण योग्यरितीने साइन इन केले असल्याची खात्री करा आणि पुन्हा प्रयत्न करा.</translation>
 <translation id="3090819949319990166">बाह्य crx फाईल <ph name="TEMP_CRX_FILE" /> वर कॉपी करू शकत नाही.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" जोडले</translation>
 <translation id="3092544800441494315">हा स्क्रीनशॉट समाविष्ट करा:</translation>
@@ -2008,7 +2013,6 @@
 <translation id="3790856258139356663">Chrome संकालन साठी चाचणी सर्व्हरवर कनेक्ट करते.</translation>
 <translation id="3790909017043401679">सिम कार्ड पिन प्रविष्ट करा</translation>
 <translation id="3792890930871100565">प्रिंटर डिस्कनेक्ट करा</translation>
-<translation id="3795681127952030401"><ph name="URL" /> आपल्याला सूचना पाठवू इच्छित आहे.</translation>
 <translation id="3796648294839530037">आवडीचे नेटवर्क:</translation>
 <translation id="3797900183766075808">“<ph name="SEARCH_TERMS" />” साठी <ph name="SEARCH_ENGINE" /> &amp;शोधा</translation>
 <translation id="3798449238516105146">आवृत्ती</translation>
@@ -2481,6 +2485,7 @@
 <translation id="4552678318981539154">अधिक संचयन खरेदी करा</translation>
 <translation id="4554591392113183336">बाह्य विस्‍तार अस्‍तित्वात असलेल्‍याच्या तुलनेत समान किंवा कमी आवृत्तीवर आहे.</translation>
 <translation id="4554796861933393312">वस्तू डिझाइन शाई थेंब अ‍ॅनिमेशन गती</translation>
+<translation id="4555670907822902621">ऑफलाइन पाहण्यासाठी बुकमार्क पृष्ठे जतन करणे सक्षम करा.</translation>
 <translation id="4555769855065597957">शॅडो</translation>
 <translation id="4556110439722119938">आपले बुकमार्क, इतिहास, संकेतशब्द आणि इतर सेटिंग्ज आपल्या Google खात्यात संकालित केल्या जातील जेणेकरून आपण आपल्या सर्व डिव्हाइसेसवर त्यांचा वापर करू शकता</translation>
 <translation id="4557136421275541763">चेतावणी:</translation>
@@ -2656,6 +2661,7 @@
 <translation id="4824518112777153488">फिरवा सक्षम टचस्क्रीनसाठी समर्थन</translation>
 <translation id="4830573902900904548"><ph name="NETWORK_NAME" /> वापरून इंटरनेटशी कनेक्ट करण्‍यात आपले <ph name="DEVICE_TYPE" /> अक्षम आहे. कृपया अन्य नेटवर्क वापरा. <ph name="LEARN_MORE_LINK_START" />अधिक जाणून घ्‍या<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572"><ph name="LOCALITY" /> वरील <ph name="ORGANIZATION" /> ची ओळख <ph name="ISSUER" /> द्वारे सत्यापित केली गेली आहे. वैध प्रमाणपत्र पारदर्शकता माहिती सर्व्हरद्वारे पुरविण्यात आली होती.</translation>
+<translation id="4832537345877333532">प्रदर्शन रंग मापनासाठी Quirks सर्व्हर मधून icc प्रदर्शन फायली पुनर्प्राप्त करणे अक्षम करा.</translation>
 <translation id="4834912470034578916">वेब सूचनांसाठी सानुकूल लेआउट सक्षम करा.</translation>
 <translation id="4835836146030131423">साइन इन करताना त्रुटी.</translation>
 <translation id="4837926214103741331">आपण हे डिव्हाइस वापरण्यासाठी प्राधिकृत नाही. कृपया साइन इन करण्याच्या परवानगीसाठी डिव्हाइस मालकाशी संपर्क साधा.</translation>
@@ -2844,6 +2850,7 @@
 <translation id="5120421890733714118">वेबसाइट ओळखण्‍यासाठी या प्रमाणपत्र विश्‍वास ठेवा.</translation>
 <translation id="5121130586824819730">आपली हार्ड डिस्क पूर्ण भरली आहे. कृपया दुसर्‍या स्‍थानावर जतन करा किंवा हार्ड डिस्कवर अधिक जागा तयार करा.</translation>
 <translation id="5125751979347152379">अवैध URL.</translation>
+<translation id="5126663277159826272">प्रदर्शन मापनासाठी Quirks क्लायंट अक्षम करा.</translation>
 <translation id="5127881134400491887">नेटवर्क कनेक्शन व्यवस्थापित करा</translation>
 <translation id="5128590998814119508">प्रदर्शन सूची 2D कॅनव्हास</translation>
 <translation id="512903556749061217">संलग्न केले</translation>
@@ -2985,9 +2992,11 @@
 <translation id="5301751748813680278">अतिथी म्हणून प्रविष्ट होत आहे.</translation>
 <translation id="5301954838959518834">ठीक, मला समजले</translation>
 <translation id="5302048478445481009">भाषा</translation>
+<translation id="5304039790201806037">पॉइंटर इव्हेंट</translation>
 <translation id="5305688511332277257">काहीही स्थापित केले नाही</translation>
 <translation id="5308380583665731573">कनेक्‍ट करा</translation>
 <translation id="5311260548612583999">खाजगी की फाइल (पर्यायी):</translation>
+<translation id="5313967007315987356">साइट जोडा</translation>
 <translation id="5316588172263354223">व्‍हॉइस शोध कधीही</translation>
 <translation id="5316716239522500219">मॉनिटर मिरर करा</translation>
 <translation id="5317780077021120954">जतन करा</translation>
@@ -3290,6 +3299,7 @@
 <translation id="5734362860645681824">संप्रेषणे</translation>
 <translation id="573719557377416048">सहउपस्थिती स्थिती साफ करा</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: संपादित करण्यासाठी निवडा</translation>
+<translation id="5741454054957165976">WebFonts लोड करण्यासाठी वापरकर्ता-एजंट हस्तक्षेपची नवीन आवृत्ती सक्षम करा.</translation>
 <translation id="574392208103952083">मध्यम</translation>
 <translation id="5745056705311424885">USB मेमरी स्टिक आढळली</translation>
 <translation id="5746169159649715125">PDF म्हणून जतन करा</translation>
@@ -3338,7 +3348,6 @@
 <translation id="5803531701633845775">कर्सर हलविल्याशिवाय, मागच्यामधून वाक्यांश निवडते</translation>
 <translation id="5804241973901381774">परवानग्या</translation>
 <translation id="580571955903695899">शीर्षकानुसार पुन्हा क्रमवारी लावा</translation>
-<translation id="5808982448801399019">प्राधिकृत अयशस्वी झाले</translation>
 <translation id="580961539202306967">जेव्हा एक साइट मला पुश संदेश पाठवू इच्छिते तेव्हा मला विचारा (शिफारस केलेले)</translation>
 <translation id="5815645614496570556">X.400 पत्ता</translation>
 <translation id="5817397429773072584">पारंपारिक चीनी</translation>
@@ -3363,6 +3372,7 @@
 <translation id="5834581999798853053">सुमारे <ph name="TIME" /> मिनिटे बाकी</translation>
 <translation id="5838825566232597749">यूएस कामगार आंतरराष्ट्रीय</translation>
 <translation id="5839277899276241121">बिलिंग पत्त्यासारखे</translation>
+<translation id="5844550873065695788">हे या डिव्‍हाइस वरून किमान <ph name="TOTAL_COUNT" /> आयटम कायमचे हटवेल. आपला डेटा नंतर पुनर्प्राप्त करण्यासाठी $2 म्हणून chrome मध्ये साइन इन करा.</translation>
 <translation id="5846929185714966548">टॅब 4</translation>
 <translation id="5848934677402291689">PDF मध्‍ये जतन करणे प्रगतीपथावर</translation>
 <translation id="5849335628409778954">क्रेडिट कार्ड प्रविष्ट करा...</translation>
@@ -3607,6 +3617,7 @@
 <translation id="6232017090690406397">बॅटरी</translation>
 <translation id="6241530762627360640">आपल्या सिस्टीमशी जोडलेल्या Bluetooth डिव्हाइसविषयीच्या माहितीवर प्रवेश करा आणि जवळपासचे Bluetooth डिव्हाइसेस शोधा.</translation>
 <translation id="6243774244933267674">सर्व्हर अनुपलब्ध</translation>
+<translation id="6246413617632217567">पर्यवेक्षी वापरकर्ता आयात केला जाऊ शकला नाही. कृपया आपली हार्ड ड्राइव्ह जागा आणि परवानग्या तपासा आणि पुन्हा प्रयत्न करा.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">अद्यतन सज्ज</translation>
 <translation id="6248400709929739064">उपशीर्षके सक्षम करा</translation>
@@ -3635,6 +3646,7 @@
 <translation id="6277518330158259200">स्क्रीनशॉट घ्या</translation>
 <translation id="6279183038361895380">आपला कर्सर दर्शविण्‍यासाठी |<ph name="ACCELERATOR" />| दाबा</translation>
 <translation id="6280215091796946657">एका भिन्न खात्याने साइन इन करा</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">सर्व API लेआउट व्ह्यूपोर्टवर परावर्तित होण्यासाठी प्रयोग. हे window.scroll गुणधर्म मांडणी व्ह्यूपोर्टशी संबंधित करेल.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{आपल्या नेटवर्कवरील नवीन प्रिंटर}one{आपल्या नेटवर्कवरील नवीन प्रिंटर}other{आपल्या नेटवर्कवरील नवीन प्रिंटर}}</translation>
 <translation id="6285395082104474418">स्थिती ट्रे आपल्याला आपल्या नेटवर्क, बॅटरी आणि अधिक ची वर्तमान स्थिती दर्शवितो.</translation>
@@ -3690,6 +3702,7 @@
 <translation id="6380143666419481200">स्वीकारा आणि सुरू ठेवा</translation>
 <translation id="6380224340023442078">सामग्री सेटिंग्ज...</translation>
 <translation id="6383194710567510941">chrome.input.ime API चा वापर सक्षम करा.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{हे या डिव्हाइसवरून किमान $1 आयटम कायमचा हटवेल. आपला डेटा नंतर पुनर्प्राप्त करण्यासाठी $2 म्हणून chrome मध्ये साइन इन करा.}one{हे या डिव्हाइसवरून किमान $1 आयटम कायमचा हटवेल. आपला डेटा नंतर पुनर्प्राप्त करण्यासाठी $2 म्हणून chrome मध्ये साइन इन करा.}other{हे या डिव्हाइसवरून किमान $1 आयटम कायमचे हटवेल. आपला डेटा नंतर पुनर्प्राप्त करण्यासाठी $2 म्हणून chrome मध्ये साइन इन करा.}}</translation>
 <translation id="6384275966486438344">आपल्या शोध सेटिंग्ज यावर बदला: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">या विंडोमध्ये आपण पाहत असलेली पृष्ठे ब्राउझर इतिहासात दिसणार नाहीत आणि आपण सर्व उघड्या अतिथी विंडो बंद केल्यानंतर संगणकावरील, कुकीज सारखे, अन्य ट्रेस ते सोडणार नाहीत. असे असले तरीही, आपण डाउनलोड करता त्या कोणत्याही फायली संरक्षित केल्या जातील.</translation>
 <translation id="6391538222494443604">इनपुट निर्देशिका विद्यमान असणे आवश्यक आहे.</translation>
@@ -3829,6 +3842,7 @@
 <translation id="6575134580692778371">कॉन्फिगर केले नाही</translation>
 <translation id="6575251558004911012">एखाद्या साइटला आपल्या कॅमेर्‍यावर प्रवेश करायचे असते तेव्हा विचारा (शिफारस केलेले)</translation>
 <translation id="6579159469348633828">Brotli सामग्री-संकेतन.</translation>
+<translation id="6580151766480067746">ARC आवृत्ती</translation>
 <translation id="6581162200855843583">Google ड्राइव्ह दुवा</translation>
 <translation id="6583070985841601920"><ph name="USER_EMAIL_ADDRESS" /> च्या रूपात साइन इन केले. आपल्या प्रशासकाद्वारे संकालन अक्षम केले आहे.</translation>
 <translation id="65832705307647870">लोकप्रिय साइटसह नवीन टॅब पृष्ठ पूर्वीपासून भरलेले राहू द्या.</translation>
@@ -3994,6 +4008,7 @@
 <translation id="6847758263950452722">पृष्‍ठ MHTML रुपात जतन करा</translation>
 <translation id="6853388645642883916">अद्यतनकर्ता निष्क्रिय आहे</translation>
 <translation id="68541483639528434">अन्य टॅब बंद करा</translation>
+<translation id="6856701878604560493">ऑफलाइन बुकमार्क सक्षम करा</translation>
 <translation id="6860097299815761905">प्रॉक्सी सेटिंग्ज...</translation>
 <translation id="6860427144121307915">एका टॅबमध्ये उघडा</translation>
 <translation id="6862635236584086457">या फोल्डरमध्ये जतन केलेल्या सर्व फायलींचा स्वयंचलितपणे ऑनलाइन बॅक अप घेतला जातो</translation>
@@ -4165,6 +4180,7 @@
 <translation id="7092106376816104">पॉप-अप अपवाद</translation>
 <translation id="7093866338626856921">या नावाच्या डिव्हाइसेससह डेटा अदलाबदल करा: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">अधिक अद्भुत वैशिष्ट्ये शोधू इच्छिता?</translation>
+<translation id="7096108453481049031">पर्यवेक्षी वापरकर्ता आयात केला जाऊ शकला नाही. कृपया आपले नेटवर्क कनेक्शन तपासा आणि नंतर पुन्हा प्रयत्न करा.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> आयटम निवडले</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">अधिक संचयन विकत घ्या...</translation>
@@ -4193,6 +4209,7 @@
 <translation id="713888829801648570">क्षमस्‍व, आपण ऑफलाइन असल्‍याने आपला संकेतशब्द सत्यापित करणे शक्य झाले नाही.</translation>
 <translation id="7140928199327930795">कोणतीही अन्य उपलब्ध डिव्हाइसेस नाहीत.</translation>
 <translation id="7141105143012495934">आपले खाते तपशील प्राप्त करणे शक्य झाले नसल्याने साइन-इन अयशस्वी झाले. कृपया आपल्‍या प्रशासकाशी संपर्क साधा किंवा पुन्हा प्रयत्न करा.</translation>
+<translation id="7141331524324591758">Pointer Events API साठी अंशत: प्रायोगिक समर्थन सक्षम करेल. हे वेब विकासकद्वारे चाचणी करण्याच्या हेतूसाठी आहे, यामुळे काही वेबसाइट योग्यरित्या कार्य करणार नाहीत.</translation>
 <translation id="7143207342074048698">कनेक्ट करीत आहे</translation>
 <translation id="7144878232160441200">पुन्हा प्रयत्न करा</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> अक्षम केले गेले. ते पुनर्सक्षम करण्‍यासाठी, कृपया <ph name="CHROME_PLUGINS_LINK" /> वर जा.</translation>
@@ -4840,6 +4857,7 @@
 <translation id="8119572489781388874">सेटिंग्ज सुधारित करा</translation>
 <translation id="8119631488458759651">ही साइट काढा</translation>
 <translation id="8121385576314601440">हँगल इनपुट सेटिंग्ज</translation>
+<translation id="8122245494004914423">हे या डिव्‍हाइस वरून आपला ब्राउझिंग डेटा कायमचा हटवेल. आपला डेटा नंतर पुनर्प्राप्त करण्यासाठी $2 म्हणून chrome मध्ये साइन इन करा.</translation>
 <translation id="8124313775439841391">व्यवस्‍थापित ONC</translation>
 <translation id="8126844665673008223">वेब Bluetooth</translation>
 <translation id="8127322077195964840">स्थानिकहोस्टवरून लोड केलेल्या संसाधनांसाठी अवैध प्रमाणपत्रांना अनुमती द्या.</translation>
@@ -4924,6 +4942,7 @@
 <translation id="8226742006292257240">खाली यादृच्छिकपणे व्युत्पन्न केलेला TPM संकेतशब्द आहे जो आपल्‍या संगणकासाठी नियुक्त केला गेला आहे:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> वरील आक्रमणकर्ते सध्या कदाचित आपल्या संगणकावर आपली माहिती (उदाहरणार्थ, फोटो, संकेतशब्द, संदेश आणि क्रेडिट कार्ड) चोरणारे किंवा हटविणारे धोकादायक प्रोग्राम स्थापित करण्याचा प्रयत्न करत असू शकतात.</translation>
+<translation id="8233254008506535819">ब्राउझ केलेला डेटा साफ करा संवादामधील महत्त्वाच्या साइट श्वेतसूची करण्यासाठी पर्याय समाविष्ट करा.</translation>
 <translation id="8236231079192337250">प्रिंटर ड्राइव्हरसाठी Chrome वेब स्टोअर गॅलरी अॅप</translation>
 <translation id="8238649969398088015">मदत टीप</translation>
 <translation id="8240697550402899963">क्लासिक थीम वापरा</translation>
@@ -5247,7 +5266,6 @@
 <translation id="8708671767545720562">&amp;अधिक माहिती</translation>
 <translation id="8711402221661888347">लोणचे</translation>
 <translation id="8711453844311572806">आपला फोन अनलॉक आणि जवळपास असताना, प्रविष्‍ट करण्‍यासाठी फक्त क्लिक करा. अन्यथा आपल्‍याला लॉक केलेले चिन्ह दिसेल आणि आपला संकेतशब्द टाइप करण्‍याची आवश्‍यकता असेल.</translation>
-<translation id="8712637175834984815">समजले</translation>
 <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />सिस्टम माहिती<ph name="END_LINK1" /> पाठवा</translation>
 <translation id="8713979477561846077">US कीबोर्डसाठी भौतिक कीबोर्ड स्वयंसुधारित करणे सक्षम करा, जे भौतिक कीबोर्डवर टाइप केल्यानुसार सूचना प्रदान करू शकते.</translation>
 <translation id="871476437400413057">Google ने जतन केलेले संकेतशब्द</translation>
@@ -5611,6 +5629,7 @@
 <translation id="952992212772159698">सक्रिय नाही</translation>
 <translation id="953000875543358078">यास एखादा मिनिट लागू शकतो</translation>
 <translation id="960987915827980018">सुमारे 1 तास बाकी</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{हे या डिव्‍हाइसवरून $1 आयटम कायमचा हटवेल. आपला डेटा नंतर पुनर्प्राप्त करण्यासाठी $2 म्हणून chrome मध्ये साइन इन करा.}one{हे या डिव्‍हाइसवरून $1 आयटम कायमचा हटवेल. आपला डेटा नंतर पुनर्प्राप्त करण्यासाठी $2 म्हणून chrome मध्ये साइन इन करा.}other{हे या डिव्‍हाइसवरून $1 आयटम कायमचा हटवेल. आपला डेटा नंतर पुनर्प्राप्त करण्यासाठी $2 म्हणून chrome मध्ये साइन इन करा.}}</translation>
 <translation id="96421021576709873">Wi-Fi नेटवर्क</translation>
 <translation id="965490406356730238">जिथे उपलब्ध असते तेथे कॅप्चर केलेल्या फ्रेमसाठी हार्डवेअर-त्वरित केलेले mjpeg डीकोड सक्षम करा.</translation>
 <translation id="968174221497644223">अनुप्रयोग कॅशे</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index a4b7b22..90cc300e 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -251,6 +251,7 @@
         Ambil perhatian bahawa Bluetooth akan dihidupkan untuk semua peranti <ph name="USER_DISPLAY_EMAIL" /> yang serasi dan beberapa maklumat perkakasan akan dihantar kepada Google. &lt;a&gt;Ketahui lebih lanjut&lt;/a&gt;</translation>
 <translation id="13649080186077898">Uruskan tetapan Auto Isi</translation>
 <translation id="1367951781824006909">Pilih fail</translation>
+<translation id="136802136832547685">Tiada pengguna di bawah seliaan untuk ditambahkan pada peranti ini.</translation>
 <translation id="1368265273904755308">Laporkan isu</translation>
 <translation id="1368832886055348810">Kiri ke Kanan</translation>
 <translation id="1370646789215800222">Alih keluar orang?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Carian</translation>
 <translation id="1384211230590313258">Pengendali Penemuan Perkhidmatan</translation>
 <translation id="1386387014181100145">Helo.</translation>
+<translation id="1386830813511981192">Lebih sejuta apl dan permainan kini boleh didapati pada <ph name="DEVICE_TYPE" /> anda.</translation>
 <translation id="1389297115360905376">Item ini hanya boleh ditambah dari <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Buka sebagai Tab Biasa</translation>
 <translation id="1395262318152388157">Peluncur cari</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">Jidar kanan</translation>
 <translation id="2282146716419988068">Proses GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Versi baharu Campur Tangan Ejen Pengguna untuk pemuatan WebFonts.</translation>
 <translation id="2286454467119466181">Ringkas</translation>
 <translation id="2286950485307333924">Anda kini dilog masuk ke Chrome</translation>
 <translation id="2287590536030307392">Matikan semua sambungan wayarles.</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">Jadual Google</translation>
 <translation id="2546283357679194313">Kuki dan data tapak</translation>
 <translation id="2549646943416322527">Pengesan Seccomp</translation>
+<translation id="2550212893339833758">Memori ditukar</translation>
 <translation id="2553100941515833716">Tetapkan semula keadaan pasang Pelancar Apl pada setiap mula semula.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> tidak dapat menyambung ke <ph name="NETWORK_ID" />. Sila pilih rangkaian lain atau cuba semula.</translation>
 <translation id="2553440850688409052">Sembunyikan Pemalam Ini</translation>
@@ -1103,6 +1107,7 @@
 <translation id="2587922270115112871">Penghasilan pengguna diselia tidak akan mewujudkan Akaun Google dan tetapan
     serta datanya tidak akan mengikutnya ke peranti lain dengan Penyegerakan Chrome.
     Pengguna diselia hanya dilaksanakan pada peranti ini.</translation>
+<translation id="2594049137847833442">Pilihan tapak penting dalam dialog kosongkan data semakan imbas</translation>
 <translation id="2594056015203442344">Apabila didayakan, penunjuk audio dalam jalur tab turut berfungsi sebagai kawalan redam audio tab. Ini turut menambahkan perintah dalam menu konteks tab untuk meredam berbilang tab yang dipilih dengan cepat.</translation>
 <translation id="259421303766146093">Nyahbesarkan</translation>
 <translation id="2597852038534460976">Chrome tidak dapat mengakses kertas dinding. Sila sambung ke rangkaian.</translation>
@@ -1470,7 +1475,6 @@
 <translation id="3065140616557457172">Taip untuk mencari atau memasukkan URL untuk menavigasi - semua boleh digunakan.</translation>
 <translation id="3067198360141518313">Jalankan pemalam ini</translation>
 <translation id="307519606911195071">Dayakan ciri kebolehaksesan tambahan di halaman Tetapan.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> telah dihasilkan sebagai pengguna diselia!</translation>
 <translation id="3075874217500066906">Mula semula perlu dilakukan untuk memulakan proses Powerwash. Selepas memulakan semula, anda akan diminta mengesahkan bahawa anda ingin meneruskan.</translation>
 <translation id="3076677906922146425">Benarkan orang menambahkan seseorang ke Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1487,6 +1491,7 @@
 <translation id="3088034400796962477">Pengalihan huruf (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Namakan semula...</translation>
 <translation id="308903551226753393">Konfigurasi secara automatik</translation>
+<translation id="3089231390674410424">Nampaknya ada masalah dengan bukti kelayakan anda. Sila pastikan anda telah dilog masuk dengan betul dan cuba lagi.</translation>
 <translation id="3090819949319990166">Tidak dapat menyalin fail crx luar ke <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" digandingkan</translation>
 <translation id="3092544800441494315">Termasuk tangkapan skrin ini:</translation>
@@ -2014,7 +2019,6 @@
 <translation id="3790856258139356663">Menyambung kepada pelayan ujian untuk Penyegerakan Chrome.</translation>
 <translation id="3790909017043401679">Masukkan PIN kad SIM</translation>
 <translation id="3792890930871100565">Putuskan sambungan pencetak</translation>
-<translation id="3795681127952030401"><ph name="URL" /> mahu menghantar pemberitahuan kepada anda.</translation>
 <translation id="3796648294839530037">Rangkaian Kegemaran:</translation>
 <translation id="3797900183766075808">&amp;Cari “<ph name="SEARCH_TERMS" />” di <ph name="SEARCH_ENGINE" /></translation>
 <translation id="3798449238516105146">Versi</translation>
@@ -2488,6 +2492,7 @@
 <translation id="4552678318981539154">Beli lagi storan</translation>
 <translation id="4554591392113183336">Sambungan luar ialah versi yang sama atau lebih rendah berbanding yang sedia ada.</translation>
 <translation id="4554796861933393312">Kelajuan Animasi Titisan Dakwat Reka Bentuk Bahan</translation>
+<translation id="4555670907822902621">Dayakan fungsi menyimpan halaman yang ditandai halaman untuk tontonan luar talian.</translation>
 <translation id="4555769855065597957">Bayang</translation>
 <translation id="4556110439722119938">Penanda halaman, sejarah, kata laluan dan tetapan anda yang lain akan disegerakkan ke Akaun Google supaya anda dapat menggunakannya pada semua peranti anda</translation>
 <translation id="4557136421275541763">Amaran:</translation>
@@ -2664,6 +2669,7 @@
 <translation id="4824518112777153488">Sokongan untuk skrin sentuh boleh tuding</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> anda tidak dapat menyambung ke Internet menggunakan <ph name="NETWORK_NAME" />. Sila pilih rangkaian lain. <ph name="LEARN_MORE_LINK_START" />Ketahui lebih lanjut<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Identiti <ph name="ORGANIZATION" /> di <ph name="LOCALITY" /> telah disahkan oleh <ph name="ISSUER" />. Maklumat Ketelusan Sijil yang sah telah diberikan oleh pelayan.</translation>
+<translation id="4832537345877333532">Lumpuhkan pengambilan fail paparan icc daripada Pelayan Quirks untuk penentukuran warna paparan.</translation>
 <translation id="4834912470034578916">Dayakan reka letak tersuai untuk Pemberitahuan Web.</translation>
 <translation id="4835836146030131423">Ralat melog masuk.</translation>
 <translation id="4837926214103741331">Anda tiada kebenaran untuk menggunakan peranti ini. Sila hubungi pemilik peranti untuk mendapatkan kebenaran log masuk.</translation>
@@ -2851,6 +2857,7 @@
 <translation id="5120421890733714118">Percayakan sijil ini untuk mengenal pasti laman web.</translation>
 <translation id="5121130586824819730">Cakera keras anda telah penuh. Sila simpan ke lokasi lain atau sediakan lagi ruang pada cakera keras.</translation>
 <translation id="5125751979347152379">URL tidak sah.</translation>
+<translation id="5126663277159826272">Lumpuhkan Klien Quirks untuk penentukuran paparan.</translation>
 <translation id="5127881134400491887">Urus sambungan rangkaian</translation>
 <translation id="5128590998814119508">Kanvas 2D senarai paparan</translation>
 <translation id="512903556749061217">dipasang</translation>
@@ -2992,9 +2999,11 @@
 <translation id="5301751748813680278">Masuk sebagai Tetamu</translation>
 <translation id="5301954838959518834">OK, faham</translation>
 <translation id="5302048478445481009">Bahasa</translation>
+<translation id="5304039790201806037">Acara Penuding</translation>
 <translation id="5305688511332277257">Tiada yang dipasang</translation>
 <translation id="5308380583665731573">Sambung</translation>
 <translation id="5311260548612583999">Fail kunci persendirian (pilihan):</translation>
+<translation id="5313967007315987356">Tambahkan tapak</translation>
 <translation id="5316588172263354223">Carian suara pada bila-bila masa</translation>
 <translation id="5316716239522500219">Cerminkan monitor</translation>
 <translation id="5317780077021120954">Simpan</translation>
@@ -3025,7 +3034,7 @@
 <translation id="5350480486488078311">API NaCl Socket.</translation>
 <translation id="5350965906220856151">Alamak!</translation>
 <translation id="5352033265844765294">Pengecopan Masa</translation>
-<translation id="5353252989841766347">Eksport Kata Laluan daripada Chrome</translation>
+<translation id="5353252989841766347">Eksport Kata Laluan Daripada Chrome</translation>
 <translation id="5354208417767217618">Ketekalan identiti antara penyemak imbas dan balang kuki</translation>
 <translation id="5355097969896547230">Cari lagi</translation>
 <translation id="5355351445385646029">Tekan Ruang untuk memilih calon</translation>
@@ -3297,6 +3306,7 @@
 <translation id="5734362860645681824">Komunikasi</translation>
 <translation id="573719557377416048">Hapus Keadaan Copresence</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: pilih untuk mengedit</translation>
+<translation id="5741454054957165976">Dayakan versi Baharu Campur Tangan Ejen Pengguna untuk pemuatan WebFonts.</translation>
 <translation id="574392208103952083">Sederhana</translation>
 <translation id="5745056705311424885">Batang memori USB dikesan</translation>
 <translation id="5746169159649715125">Simpan sebagai PDF</translation>
@@ -3345,7 +3355,6 @@
 <translation id="5803531701633845775">Pilih frasa dari belakang, tanpa menggerakkan kursor</translation>
 <translation id="5804241973901381774">Kebenaran</translation>
 <translation id="580571955903695899">Aturkan semula mengikut Tajuk</translation>
-<translation id="5808982448801399019">Pengesahan gagal</translation>
 <translation id="580961539202306967">Tanya saya apabila tapak mahu menghantar mesej tolak kepada saya (disyorkan)</translation>
 <translation id="5815645614496570556">Alamat X.400</translation>
 <translation id="5817397429773072584">Bahasa China Tradisional</translation>
@@ -3370,6 +3379,7 @@
 <translation id="5834581999798853053">Tinggal kira-kira <ph name="TIME" /> minit</translation>
 <translation id="5838825566232597749">US Workman international</translation>
 <translation id="5839277899276241121">Sama seperti alamat pengebilan</translation>
+<translation id="5844550873065695788">Tindakan ini akan memadamkan sekurang-kurangnya <ph name="TOTAL_COUNT" /> item daripada peranti ini selama-lamanya. Untuk mendapatkan semula data anda kemudian, log masuk ke chrome sebagai $2.</translation>
 <translation id="5846929185714966548">Tab 4</translation>
 <translation id="5848934677402291689">Sedang menyimpan ke PDF</translation>
 <translation id="5849335628409778954">Masukkan kad kredit...</translation>
@@ -3570,7 +3580,7 @@
 <translation id="6163522313638838258">Kembangkan semua...</translation>
 <translation id="6164005077879661055">Semua fail dan data setempat yang dikaitkan dengan pengguna diselia akan dipadamkan secara kekal apabila pengguna diselia ini dialih keluar. Tapak web yang dilawati dan tetapan untuk pengguna diselia ini masih boleh dilihat oleh pengurus di <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Ketahui lebih lanjut</translation>
-<translation id="6166185671393271715">Import Kata Laluan ke Chrome</translation>
+<translation id="6166185671393271715">Import Kata Laluan Ke Chrome</translation>
 <translation id="6171550060231646388">Ciri "Ok Google" perkakasan tersimulasi</translation>
 <translation id="6175314957787328458">Microsoft Domain GUID</translation>
 <translation id="6178664161104547336">Pilih sijil</translation>
@@ -3614,6 +3624,7 @@
 <translation id="6232017090690406397">Bateri</translation>
 <translation id="6241530762627360640">Akses maklumat mengenai peranti Bluetooth yang dipasangkan dengan sistem anda dan temui peranti Bluetooth berhampiran.</translation>
 <translation id="6243774244933267674">Pelayan tidak tersedia</translation>
+<translation id="6246413617632217567">Pengguna di bawah seliaan tidak dapat diimport. Sila semak ruang pemacu keras dan kebenaran anda, kemudian cuba lagi.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Kemaskini bersedia</translation>
 <translation id="6248400709929739064">Dayakan sari kata</translation>
@@ -3642,6 +3653,7 @@
 <translation id="6277518330158259200">A&amp;mbil Tangkapan Skrin</translation>
 <translation id="6279183038361895380">Tekan |<ph name="ACCELERATOR" />| untuk memaparkan kursor anda</translation>
 <translation id="6280215091796946657">Log masuk dengan akaun lain</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Buat percubaan dengan semua API mencerminkan port pandang reka letak. Ini akan membuatkan ciri window.scroll berkaitan dengan port pandang reka letak.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Pencetak baharu pada rangkaian anda}other{Pencetak baharu pada rangkaian anda}}</translation>
 <translation id="6285395082104474418">Dulang status menunjukkan kepada anda keadaan semasa rangkaian, bateri anda dan lagi.</translation>
@@ -3697,6 +3709,7 @@
 <translation id="6380143666419481200">Terima dan teruskan</translation>
 <translation id="6380224340023442078">Tetapan kandungan...</translation>
 <translation id="6383194710567510941">Dayakan penggunaan API chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Tindakan ini akan memadamkan sekurang-kurangnya $1 item daripada peranti ini selama-lamanya. Untuk mendapatkan semula data anda kemudian, log masuk ke chrome sebagai $2.}other{Tindakan ini akan memadamkan sekurang-kurangnya $1 item daripada peranti ini selama-lamanya. Untuk mendapatkan semula data anda kemudian, log masuk ke chrome sebagai $2.}}</translation>
 <translation id="6384275966486438344">Ubah tetapan carian anda kepada: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Halaman yang anda lihat dalam tetingkap ini tidak akan dipaparkan dalam sejarah penyemak imbas dan halaman ini tidak akan meninggalkan kesan lain, seperti kuki, pada komputer selepas anda menutup semua tetingkap Tetamu yang terbuka. Walau bagaimanapun, sebarang fail yang anda muat turun akan disimpan.</translation>
 <translation id="6391538222494443604">Direktori input mesti wujud.</translation>
@@ -3835,6 +3848,7 @@
 <translation id="6575134580692778371">Tidak dikonfigurasi</translation>
 <translation id="6575251558004911012">Tanya apabila tapak memerlukan akses kepada kamera anda (disyorkan)</translation>
 <translation id="6579159469348633828">Pengekodan Kandungan Brotli.</translation>
+<translation id="6580151766480067746">Versi ARC</translation>
 <translation id="6581162200855843583">Pautan Google Drive</translation>
 <translation id="6583070985841601920">Log masuk sebagai <ph name="USER_EMAIL_ADDRESS" />. Penyegerakan dilumpuhkan oleh pentadbir anda.</translation>
 <translation id="65832705307647870">Praisi halaman Tab Baharu dengan tapak popular.</translation>
@@ -4001,6 +4015,7 @@
 <translation id="6847758263950452722">Simpan Halaman MHTML</translation>
 <translation id="6853388645642883916">Pengemaskinian tidur</translation>
 <translation id="68541483639528434">Tutup tab lain</translation>
+<translation id="6856701878604560493">Dayakan penanda halaman luar talian</translation>
 <translation id="6860097299815761905">Tetapan proksi...</translation>
 <translation id="6860427144121307915">Buka dalam Tab</translation>
 <translation id="6862635236584086457">Semua fail yang disimpan di dalam folder ini disokong dalam talian secara automatik</translation>
@@ -4172,6 +4187,7 @@
 <translation id="7092106376816104">Pengecualian pop timbul</translation>
 <translation id="7093866338626856921">Bertukar data dengan peranti yang bernama: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Ingin menemui lebih banyak ciri hebat?</translation>
+<translation id="7096108453481049031">Pengguna di bawah seliaan tidak dapat diimport. Sila semak sambungan rangkaian anda dan cuba sebentar lagi.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> item dipilih</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Beli lagi storan...</translation>
@@ -4200,6 +4216,7 @@
 <translation id="713888829801648570">Maaf, kata laluan anda tidak dapat disahkan kerana anda berada di luar talian.</translation>
 <translation id="7140928199327930795">Tiada peranti lain tersedia.</translation>
 <translation id="7141105143012495934">Log masuk gagal kerana butiran akaun anda tidak boleh didapatkan semula. Sila hubungi pentadbir anda atau cuba lagi.</translation>
+<translation id="7141331524324591758">Mendayakan sokongan percubaan separa untuk API Acara Penuding.  Fungsi ini bertujuan untuk ujian oleh pembangun web sahaja, yang akan menyebabkan beberapa tapak web menjadi rosak dengan tidak ketara.</translation>
 <translation id="7143207342074048698">Menyambung</translation>
 <translation id="7144878232160441200">Cuba semula</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> telah dilumpuhkan. Untuk mendayakannya semula, sila pergi ke <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4847,6 +4864,7 @@
 <translation id="8119572489781388874">Ubah suai tetapan</translation>
 <translation id="8119631488458759651">keluarkan tapak ini</translation>
 <translation id="8121385576314601440">Tetapan input Hangul</translation>
+<translation id="8122245494004914423">Tindakan ini akan memadamkan data semakan imbas anda daripada peranti ini selama-lamanya. Untuk mendapatkan semula data anda kemudian, log masuk ke chrome sebagai $2.</translation>
 <translation id="8124313775439841391">ONC Terurus</translation>
 <translation id="8126844665673008223">Bluetooth Web</translation>
 <translation id="8127322077195964840">Benarkan sijil yang tidak sah untuk sumber yang dimuatkan daripada hos setempat.</translation>
@@ -4931,6 +4949,7 @@
 <translation id="8226742006292257240">Di bawah adalah kata laluan TPM yang dijana secara rawak yang diperuntukkan kepada komputer anda:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Penyerang yang ada di <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> pada masa ini mungkin cuba memasang program berbahaya pada komputer anda yang boleh mencuri atau memadamkan maklumat anda (contohnya foto, kata laluan, mesej dan kad kredit).</translation>
+<translation id="8233254008506535819">Sertakan pilihan untuk menyenaraiputihkan tapak penting dalam dialog kosongkan data semakan imbas.</translation>
 <translation id="8236231079192337250">Apl Galeri Gedung Web Chrome untuk pemacu pencetak</translation>
 <translation id="8238649969398088015">Petua bantuan</translation>
 <translation id="8240697550402899963">Gunakan tema Klasik</translation>
@@ -5256,7 +5275,6 @@
 <translation id="8708671767545720562">&amp;Maklumat Lanjut</translation>
 <translation id="8711402221661888347">Jeruk</translation>
 <translation id="8711453844311572806">Apabila telefon anda tidak dikunci dan berdekatan, cuma klik untuk masuk. Jika tidak, anda akan melihat ikon berkunci dan perlu menaip kata laluan anda.</translation>
-<translation id="8712637175834984815">Faham</translation>
 <translation id="8713570323158206935">Hantar <ph name="BEGIN_LINK1" />maklumat sistem<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Dayakan ciri autobetul papan kekunci fizikal untuk papan kekunci AS, yang boleh memberi cadangan semasa anda menaip pada papan kekunci fizikal.</translation>
 <translation id="871476437400413057">Kata laluan disimpan Google</translation>
@@ -5619,6 +5637,7 @@
 <translation id="952992212772159698">Tidak diaktifkan</translation>
 <translation id="953000875543358078">Pemuatan ini mungkin mengambil masa sehingga seminit atau lebih</translation>
 <translation id="960987915827980018">Tinggal kira-kira 1jam</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Tindakan ini akan memadamkan $1 item daripada peranti ini selama-lamanya. Untuk mendapatkan semula data anda kemudian, log masuk ke chrome sebagai $2.}other{Tindakan ini akan memadamkan $1 item daripada peranti ini selama-lamanya. Untuk mendapatkan semula data anda kemudian, log masuk ke chrome sebagai $2.}}</translation>
 <translation id="96421021576709873">Rangkaian Wi-Fi</translation>
 <translation id="965490406356730238">Dayakan nyahkod mjpeg yang dipercepat perkakasan untuk bingkai diabadikan jika tersedia.</translation>
 <translation id="968174221497644223">Cache aplikasi</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 65fd0eb..f08c76f 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -142,7 +142,7 @@
 <translation id="1196789802623400962">De optie voor bewerken via gebaren in-/uitschakelen op de pagina 'Instellingen' van het virtuele toetsenbord.</translation>
 <translation id="1196849605089373692">Bepaalt de kwaliteitsinstellingen voor vastgelegde afbeeldingen bij verkleinen.</translation>
 <translation id="1197199342062592414">Laten we aan de slag gaan</translation>
-<translation id="119738088725604856">Screenshotvenster</translation>
+<translation id="119738088725604856">Screenshot van venster</translation>
 <translation id="1197979282329025000">Er is een fout opgetreden tijdens het ophalen van de printermogelijkheden voor de printer <ph name="PRINTER_NAME" />. Deze printer kan niet worden geregistreerd met <ph name="CLOUD_PRINT_NAME" />.</translation>
 <translation id="1198271701881992799">Aan de slag</translation>
 <translation id="1199232041627643649">Houd <ph name="KEY_EQUIVALENT" /> ingedrukt om te stoppen.</translation>
@@ -251,6 +251,7 @@
       Bluetooth wordt ingeschakeld voor alle compatibele apparaten van <ph name="USER_DISPLAY_EMAIL" /> en er wordt informatie over de hardware verzonden naar Google. &lt;a&gt;Meer informatie&lt;/a&gt;</translation>
 <translation id="13649080186077898">Instellingen voor Automatisch aanvullen beheren</translation>
 <translation id="1367951781824006909">Een bestand selecteren</translation>
+<translation id="136802136832547685">Er zijn geen gebruikers met beperkte rechten om toe te voegen aan dit apparaat.</translation>
 <translation id="1368265273904755308">Probleem melden</translation>
 <translation id="1368832886055348810">Links naar rechts</translation>
 <translation id="1370646789215800222">Persoon verwijderen?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Zoeken</translation>
 <translation id="1384211230590313258">Service Discovery Handler</translation>
 <translation id="1386387014181100145">Hallo.</translation>
+<translation id="1386830813511981192">Er zijn nu meer dan een miljoen apps en games beschikbaar op je <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Dit pakket kan alleen worden toegevoegd via de <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Openen als normaal tabblad</translation>
 <translation id="1395262318152388157">Zoekbalk</translation>
@@ -893,6 +895,7 @@
 <translation id="2280486287150724112">Marge rechts</translation>
 <translation id="2282146716419988068">GPU-proces</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Nieuwe versie van interventie van user-agent voor het laden van weblettertypen.</translation>
 <translation id="2286454467119466181">Eenvoudig</translation>
 <translation id="2286950485307333924">Je bent nu ingelogd bij Chrome</translation>
 <translation id="2287590536030307392">Schakel alle draadloze verbindingen uit.</translation>
@@ -1070,6 +1073,7 @@
 <translation id="2542049655219295786">Google-tabel</translation>
 <translation id="2546283357679194313">Cookies en sitegegevens</translation>
 <translation id="2549646943416322527">Seccomp Detector</translation>
+<translation id="2550212893339833758">Wisselgeheugen</translation>
 <translation id="2553100941515833716">De installatiestatus van de App Launcher herstellen na opnieuw starten.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> kan geen verbinding maken met <ph name="NETWORK_ID" />. Probeer een ander netwerk of probeer het opnieuw.</translation>
 <translation id="2553440850688409052">Deze plugin verbergen</translation>
@@ -1103,6 +1107,7 @@
 <translation id="2587203970400270934">Operatorcode:</translation>
 <translation id="2587922270115112871">Als je een gebruiker met beperkte rechten maakt, maak je geen Google-account. De instellingen
     en gegevens worden niet gesynchroniseerd met andere apparaten met Chrome Sync. Een gebruiker met beperkte rechten is alleen van toepassing op dit apparaat.</translation>
+<translation id="2594049137847833442">Belangrijke opties voor sites in het dialoogvenster 'Browsegegevens wissen'</translation>
 <translation id="2594056015203442344">Wanneer ingeschakeld fungeren de audio-indicators in de tabbladstrook tevens als dempknop voor de audio op het tabblad. Hiermee worden opdrachten aan het contextmenu van het tabblad toegevoegd waarmee snel meerdere geselecteerde tabbladen kunnen worden gedempt.</translation>
 <translation id="259421303766146093">Verkleinen</translation>
 <translation id="2597852038534460976">Chrome kan geen toegang krijgen tot achtergronden. Maak verbinding met een netwerk.</translation>
@@ -1470,7 +1475,6 @@
 <translation id="3065140616557457172">Typ om te zoeken of geef een URL op om naar te navigeren: het werkt allemaal.</translation>
 <translation id="3067198360141518313">Deze plugin uitvoeren</translation>
 <translation id="307519606911195071">Aanvullende toegankelijkheidsfuncties inschakelen op de pagina Instellingen.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> is gemaakt als gebruiker met beperkte rechten.</translation>
 <translation id="3075874217500066906">Apparaat moet opnieuw worden opgestart om met het Powerwash-proces te beginnen. Na het opnieuw opstarten wordt je gevraagd om te bevestigen dat je wilt doorgaan.</translation>
 <translation id="3076677906922146425">Iedereen kan een persoon aan Chrome toevoegen</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1487,6 +1491,7 @@
 <translation id="3088034400796962477">Transliteratie (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Naam wijzigen...</translation>
 <translation id="308903551226753393">Automatisch configureren</translation>
+<translation id="3089231390674410424">Er lijkt een probleem te zijn met je inloggegevens. Zorg ervoor dat je correct bent ingelogd en probeer het opnieuw.</translation>
 <translation id="3090819949319990166">Kan extern crx-bestand niet kopiëren naar <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">'<ph name="DEVICE_NAME" />' gekoppeld</translation>
 <translation id="3092544800441494315">Dit screenshot toevoegen:</translation>
@@ -2014,7 +2019,6 @@
 <translation id="3790856258139356663">Hiermee wordt verbinding met de testserver voor Chrome-synchronisatie gemaakt.</translation>
 <translation id="3790909017043401679">Pincode simkaart invoeren</translation>
 <translation id="3792890930871100565">Printers ontkoppelen</translation>
-<translation id="3795681127952030401"><ph name="URL" /> wil jou meldingen sturen.</translation>
 <translation id="3796648294839530037">Favoriete netwerken:</translation>
 <translation id="3797900183766075808"><ph name="SEARCH_ENGINE" /> door&amp;zoeken op '<ph name="SEARCH_TERMS" />'</translation>
 <translation id="3798449238516105146">Versie</translation>
@@ -2488,6 +2492,7 @@
 <translation id="4552678318981539154">Meer opslagruimte kopen</translation>
 <translation id="4554591392113183336">Externe uitbreiding heeft dezelfde of een lagere versie dan de bestaande.</translation>
 <translation id="4554796861933393312">Animatiesnelheid voor inktdruppel van Material Design</translation>
+<translation id="4555670907822902621">Opslaan van pagina's met bladwijzers voor offline weergave inschakelen.</translation>
 <translation id="4555769855065597957">Schaduw</translation>
 <translation id="4556110439722119938">Je bladwijzers, geschiedenis, wachtwoorden en andere instellingen worden gesynchroniseerd met je Google-account, zodat je ze op al je apparaten kunt gebruiken</translation>
 <translation id="4557136421275541763">Waarschuwing:</translation>
@@ -2663,6 +2668,7 @@
 <translation id="4824518112777153488">Ondersteuning voor touchscreens met mogelijkheden voor muisaanwijzer plaatsen (hover-capable)</translation>
 <translation id="4830573902900904548">Je <ph name="DEVICE_TYPE" /> kan geen verbinding maken met internet via <ph name="NETWORK_NAME" />. Kies een ander netwerk. <ph name="LEARN_MORE_LINK_START" />Meer informatie<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">De identiteit van <ph name="ORGANIZATION" /> op <ph name="LOCALITY" /> is geverifieerd door <ph name="ISSUER" />. Er zijn geldige certificaattransparantiegegevens geleverd door de server.</translation>
+<translation id="4832537345877333532">Het ophalen van ICC-displaybestanden van de Quirks Server uitschakelen voor kleurkalibratie voor het beeldscherm.</translation>
 <translation id="4834912470034578916">Aangepaste indelingen voor webmeldingen inschakelen.</translation>
 <translation id="4835836146030131423">Fout bij inloggen.</translation>
 <translation id="4837926214103741331">Je beschikt niet over de rechten om dit apparaat te gebruiken. Neem contact op met de eigenaar van het apparaat voor toestemming om in te loggen.</translation>
@@ -2850,6 +2856,7 @@
 <translation id="5120421890733714118">Dit certificaat vertrouwen voor het identificeren van websites.</translation>
 <translation id="5121130586824819730">Je vaste schijf is vol. Sla op een andere locatie op of maak ruimte vrij op de vaste schijf.</translation>
 <translation id="5125751979347152379">Ongeldige URL.</translation>
+<translation id="5126663277159826272">Quirks Client uitschakelen voor beeldschermkalibratie.</translation>
 <translation id="5127881134400491887">Netwerkverbindingen beheren</translation>
 <translation id="5128590998814119508">2D-canvas van weergavelijst</translation>
 <translation id="512903556749061217">aangesloten</translation>
@@ -2990,9 +2997,11 @@
 <translation id="5301751748813680278">Aangemeld als gast.</translation>
 <translation id="5301954838959518834">OK</translation>
 <translation id="5302048478445481009">Taal</translation>
+<translation id="5304039790201806037">Aanwijzergebeurtenissen</translation>
 <translation id="5305688511332277257">Geen certificaten geïnstalleerd</translation>
 <translation id="5308380583665731573">Verbinding maken</translation>
 <translation id="5311260548612583999">Privésleutelbestand (optioneel):</translation>
+<translation id="5313967007315987356">Site toevoegen</translation>
 <translation id="5316588172263354223">Gesproken zoekopdrachten op elk moment</translation>
 <translation id="5316716239522500219">Monitoren spiegelen</translation>
 <translation id="5317780077021120954">Opslaan</translation>
@@ -3295,6 +3304,7 @@
 <translation id="5734362860645681824">Communicatie</translation>
 <translation id="573719557377416048">Copresence-status wissen</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: selecteer om te bewerken</translation>
+<translation id="5741454054957165976">Nieuwe versie van interventie van user-agent voor het laden van weblettertypen inschakelen.</translation>
 <translation id="574392208103952083">Gemiddeld</translation>
 <translation id="5745056705311424885">USB-stick gevonden</translation>
 <translation id="5746169159649715125">Opslaan als pdf</translation>
@@ -3343,7 +3353,6 @@
 <translation id="5803531701633845775">Selecteer woordgroepen achteraan zonder de cursor te verplaatsen</translation>
 <translation id="5804241973901381774">Rechten</translation>
 <translation id="580571955903695899">Sorteren op titel</translation>
-<translation id="5808982448801399019">Autorisatie mislukt</translation>
 <translation id="580961539202306967">Vragen als een site mij pushberichten wil sturen (aanbevolen)</translation>
 <translation id="5815645614496570556">X.400-adres</translation>
 <translation id="5817397429773072584">Traditioneel Chinees</translation>
@@ -3368,6 +3377,7 @@
 <translation id="5834581999798853053">Ongeveer <ph name="TIME" /> minuten resterend</translation>
 <translation id="5838825566232597749">Amerikaans Workman (internationaal)</translation>
 <translation id="5839277899276241121">Hetzelfde als het factuuradres</translation>
+<translation id="5844550873065695788">Hiermee worden ten minste <ph name="TOTAL_COUNT" /> items definitief van dit apparaat verwijderd. Als je je gegevens later wilt terughalen, log je in bij Chrome als $2.</translation>
 <translation id="5846929185714966548">Tabblad 4</translation>
 <translation id="5848934677402291689">Bezig met opslaan als pdf</translation>
 <translation id="5849335628409778954">Creditcard opgeven...</translation>
@@ -3614,6 +3624,7 @@
 <translation id="6232017090690406397">Accu</translation>
 <translation id="6241530762627360640">Toegang krijgen tot informatie over Bluetooth-apparaten die zijn gekoppeld met je systeem en Bluetooth-apparaten in de buurt detecteren.</translation>
 <translation id="6243774244933267674">Server is niet beschikbaar</translation>
+<translation id="6246413617632217567">De gebruiker met beperkte rechten kan niet worden geïmporteerd. Controleer de ruimte op je harde schijf en je rechten, en probeer het opnieuw.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Update gereed</translation>
 <translation id="6248400709929739064">Ondertiteling inschakelen</translation>
@@ -3642,6 +3653,7 @@
 <translation id="6277518330158259200">&amp;Screenshot maken</translation>
 <translation id="6279183038361895380">Druk op |<ph name="ACCELERATOR" />| om je cursor weer te geven</translation>
 <translation id="6280215091796946657">Inloggen met een ander account</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Experimenteer om ervoor te zorgen dat alle API's het opmaakkijkvenster reflecteren. Hiermee maak je de window.scroll-eigenschappen relatief ten opzichte van het opmaakkijkvenster.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nieuwe printer in je netwerk}other{Nieuwe printers in je netwerk}}</translation>
 <translation id="6285395082104474418">Het statusvak bevat de huidige status van je netwerk, accu en meer.</translation>
@@ -3697,6 +3709,7 @@
 <translation id="6380143666419481200">Accepteren en doorgaan</translation>
 <translation id="6380224340023442078">Instellingen voor inhoud...</translation>
 <translation id="6383194710567510941">Het gebruik van de chrome.input.ime-API inschakelen.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Hiermee wordt ten minste $1 item definitief van dit apparaat verwijderd. Als je je gegevens later wilt terughalen, log je in bij Chrome als $2.}other{Hiermee worden ten minste $1 items definitief van dit apparaat verwijderd. Als je je gegevens later wilt terughalen, log je in bij Chrome als $2.}}</translation>
 <translation id="6384275966486438344">Je zoekinstellingen wijzigen in: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">De pagina's die je in dit venster bekijkt, worden niet in de browsergeschiedenis weergegeven en laten geen sporen op de computer achter (zoals cookies) nadat je alle geopende gastvensters hebt gesloten. Bestanden die je downloadt, blijven echter wel behouden.</translation>
 <translation id="6391538222494443604">Er moet een invoerdirectory zijn.</translation>
@@ -3835,6 +3848,7 @@
 <translation id="6575134580692778371">Niet geconfigureerd</translation>
 <translation id="6575251558004911012">Goedkeuring vragen wanneer een site toegang tot je camera vereist (aanbevolen)</translation>
 <translation id="6579159469348633828">Brotli Content-Encoding.</translation>
+<translation id="6580151766480067746">ARC-versie</translation>
 <translation id="6581162200855843583">Google Drive-link</translation>
 <translation id="6583070985841601920">Ingelogd als <ph name="USER_EMAIL_ADDRESS" />. Synchronisatie is uitgeschakeld door je beheerder.</translation>
 <translation id="65832705307647870">Nieuwe tabbladpagina vooraf vullen met populaire sites.</translation>
@@ -4000,6 +4014,7 @@
 <translation id="6847758263950452722">Pagina opslaan als MHTML</translation>
 <translation id="6853388645642883916">Updater in slaapstand</translation>
 <translation id="68541483639528434">Andere tabbladen sluiten</translation>
+<translation id="6856701878604560493">Offline bladwijzers inschakelen</translation>
 <translation id="6860097299815761905">Proxyinstellingen...</translation>
 <translation id="6860427144121307915">Openen in een tabblad</translation>
 <translation id="6862635236584086457">Er wordt automatisch online een back-up gemaakt van alle bestanden die in deze map zijn opgeslagen</translation>
@@ -4174,6 +4189,7 @@
 <translation id="7092106376816104">Uitzonderingen voor pop-ups</translation>
 <translation id="7093866338626856921">Gegevens uitwisselen met de apparaten met de naam: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Wil je nog meer fantastische functies ontdekken?</translation>
+<translation id="7096108453481049031">De gebruiker met beperkte rechten kan niet worden geïmporteerd. Controleer je netwerkverbinding en probeer het later opnieuw.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> items geselecteerd</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Meer opslagruimte kopen...</translation>
@@ -4202,6 +4218,7 @@
 <translation id="713888829801648570">Sorry, je wachtwoord kan niet worden geverifieerd omdat je offline bent.</translation>
 <translation id="7140928199327930795">Geen andere beschikbare apparaten.</translation>
 <translation id="7141105143012495934">Inloggen is mislukt omdat je accountgegevens niet kunnen worden opgevraagd. Neem contact op met je beheerder of probeer het opnieuw.</translation>
+<translation id="7141331524324591758">Hiermee wordt gedeeltelijke experimentele ondersteuning voor de API voor aanwijzergebeurtenissen ingeschakeld. Dit is alleen bedoeld voor tests van webontwikkelaars. De werking van sommige websites wordt hierdoor op subtiele wijze verstoord.</translation>
 <translation id="7143207342074048698">Verbinding maken</translation>
 <translation id="7144878232160441200">Opnieuw proberen</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> is uitgeschakeld. Als je de plug-in weer wilt inschakelen, ga je naar <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4850,6 +4867,7 @@
 <translation id="8119572489781388874">Instellingen wijzigen</translation>
 <translation id="8119631488458759651">deze site verwijderen</translation>
 <translation id="8121385576314601440">Invoerinstellingen voor Hangul</translation>
+<translation id="8122245494004914423">Hiermee worden je browsergegevens definitief van dit apparaat verwijderd. Als je je gegevens later wilt terughalen, log je in bij Chrome als $2.</translation>
 <translation id="8124313775439841391">Beheerde ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Ongeldige certificaten toestaan voor bronnen die worden geladen via localhost.</translation>
@@ -4935,6 +4953,7 @@
 <translation id="8226742006292257240">Hieronder staat het willekeurig gegenereerde TPM-wachtwoord dat aan je computer is toegekend:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Cybercriminelen op <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> proberen mogelijk gevaarlijke programma's op je computer te installeren waarmee je gegevens kunnen worden gestolen of verwijderd (bijvoorbeeld foto's, wachtwoorden, berichten en creditcarddetails).</translation>
+<translation id="8233254008506535819">De optie om belangrijke sites op de witte lijst te zetten opnemen in het dialoogvenster 'Browsegegevens wissen'.</translation>
 <translation id="8236231079192337250">Chrome Web Store-galerij-app voor printerstuurprogramma's</translation>
 <translation id="8238649969398088015">Help-tip</translation>
 <translation id="8240697550402899963">Klassiek thema gebruiken</translation>
@@ -5259,7 +5278,6 @@
 <translation id="8708671767545720562">&amp;Meer informatie</translation>
 <translation id="8711402221661888347">Hammie</translation>
 <translation id="8711453844311572806">Wanneer je telefoon is ontgrendeld en zich in de buurt bevindt, klik je om door te gaan. Anders wordt er een vergrendelingspictogram weergegeven en moet je je wachtwoord typen.</translation>
-<translation id="8712637175834984815">Begrepen</translation>
 <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />Systeemgegevens<ph name="END_LINK1" /> verzenden</translation>
 <translation id="8713979477561846077">Automatische correctie voor fysiek toetsenbord inschakelen voor een VS-toetsenbord, zodat je suggesties kunt krijgen terwijl je op een fysiek toetsenbord typt.</translation>
 <translation id="871476437400413057">Door Google opgeslagen wachtwoorden</translation>
@@ -5624,6 +5642,7 @@
 <translation id="952992212772159698">Niet geactiveerd</translation>
 <translation id="953000875543358078">Dit kan een minuut duren</translation>
 <translation id="960987915827980018">Ongeveer 1 uur resterend</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Hiermee wordt $1 item definitief van dit apparaat verwijderd. Als je je gegevens later wilt terughalen, log je in bij Chrome als $2.}other{Hiermee worden $1 items definitief van dit apparaat verwijderd. Als je je gegevens later wilt terughalen, log je in bij Chrome als $2.}}</translation>
 <translation id="96421021576709873">Wifi-netwerk</translation>
 <translation id="965490406356730238">Hardware-versnelde MJPEG-decodering voor vastgelegd frame waar mogelijk inschakelen.</translation>
 <translation id="968174221497644223">Applicatiecache</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index 55c8a3a..17b78b70 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -73,7 +73,7 @@
 <translation id="1104652314727136854">Aktiver OS-integrering av filtilknytninger for Chrome-apper.</translation>
 <translation id="1105162038795579389">«<ph name="BUNDLE_NAME" />» legger til disse appene og utvidelsene for <ph name="USER_NAME" />:</translation>
 <translation id="1108600514891325577">&amp;Stopp</translation>
-<translation id="1108685299869803282">Mer enn 80 % av personene som ser denne advarselen, går tilbake til en sikker side i stedet for å risikere å utsettes for skadelig programvare. Men hvis du forstår sikkerhetsrisikoen, kan du <ph name="BEGIN_LINK" />gå til denne usikre siden<ph name="END_LINK" /> før de farlige programmene er fjernet.</translation>
+<translation id="1108685299869803282">Mer enn 80 % av personene som ser denne advarselen, går tilbake til trygg grunn i stedet for å risikere å utsettes for skadelig programvare. Men hvis du forstår sikkerhetsrisikoen, kan du <ph name="BEGIN_LINK" />gå til denne usikre siden<ph name="END_LINK" /> før de farlige programmene er fjernet.</translation>
 <translation id="110918622319006905">VPN fra tredjepart</translation>
 <translation id="1110155001042129815">Vent</translation>
 <translation id="1110753181581583968">{NUM_DOWNLOAD,plural, =1{Fortsett nedlastingen}other{Fortsett nedlastingene}}</translation>
@@ -251,6 +251,7 @@
       Merk at Bluetooth blir slått på for alle de kompatible enhetene til <ph name="USER_DISPLAY_EMAIL" />, og noe maskinvareinformasjon blir sendt til Google. &lt;a&gt;Finn ut mer&lt;/a&gt;</translation>
 <translation id="13649080186077898">Administrer innstillinger for autofyll</translation>
 <translation id="1367951781824006909">Velg en fil</translation>
+<translation id="136802136832547685">Det finnes ingen administrerte brukere som kan legges til på denne enheten.</translation>
 <translation id="1368265273904755308">Rapportér problem</translation>
 <translation id="1368832886055348810">Venstre til høyre</translation>
 <translation id="1370646789215800222">Vil du fjerne personen?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Søk</translation>
 <translation id="1384211230590313258">Service Discovery Handler</translation>
 <translation id="1386387014181100145">Heisann.</translation>
+<translation id="1386830813511981192">Over en million apper og spill er nå tilgjengelige på <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Dette kan bare legges til fra <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Åpne som vanlig fane</translation>
 <translation id="1395262318152388157">Fremdriftsbryter</translation>
@@ -889,6 +891,7 @@
 <translation id="2280486287150724112">Høyremarg</translation>
 <translation id="2282146716419988068">GPU-prosess</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Ny versjon av brukeragent-intervensjon for WebFonts-innlasting.</translation>
 <translation id="2286454467119466181">Enkel</translation>
 <translation id="2286950485307333924">Nå er du logget på Chrome</translation>
 <translation id="2287590536030307392">Slå av alle trådløse tilkoblinger.</translation>
@@ -1066,6 +1069,7 @@
 <translation id="2542049655219295786">Google-tabell</translation>
 <translation id="2546283357679194313">Informasjonskapsler og nettsteddata</translation>
 <translation id="2549646943416322527">Seccomp Detector</translation>
+<translation id="2550212893339833758">Virtuelt minne</translation>
 <translation id="2553100941515833716">Tilbakestill installeringstilstanden til appvelgeren ved hver oppstart.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> kan ikke koble til <ph name="NETWORK_ID" />. Velg et annet nettverk eller prøv på nytt senere.</translation>
 <translation id="2553440850688409052">Skjul dette programtillegget</translation>
@@ -1098,6 +1102,7 @@
 <translation id="2585300050980572691">Standardinnstillinger for søk</translation>
 <translation id="2587203970400270934">Operatørkode:</translation>
 <translation id="2587922270115112871">Når du oppretter en administrert bruker, oppretter du ikke en Google-konto, og vedkommendes innstillinger og data blir ikke kopiert til andre enheter med Chrome-synkronisering. En administrert bruker er bare tilgjengelig på denne enheten.</translation>
+<translation id="2594049137847833442">Alternativer for viktige nettsteder i dialogboksen «Tøm nettlesingsdata»</translation>
 <translation id="2594056015203442344">Når funksjonen er aktivert, fungerer lydindikatorene på faneraden også som knapper for å slå lyden av og på. Kommandoer blir også lagt til i hurtigmenyen sånn at lyden raskt kan slås av for flere valgte faner.</translation>
 <translation id="259421303766146093">Tilbakestill forstørrelsen</translation>
 <translation id="2597852038534460976">Chrome har ikke tilgang til bakgrunnsbilder. Du må koble til et nettverk.</translation>
@@ -1465,7 +1470,6 @@
 <translation id="3065140616557457172">Skriv inn det du vil søke etter – eller en nettadresse du vil gå til. Begge deler fungerer!</translation>
 <translation id="3067198360141518313">Kjør dette programtillegget</translation>
 <translation id="307519606911195071">Slå på ekstra tilgjengelighetsfunksjoner på innstillingssiden.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> er opprettet som administrert bruker.</translation>
 <translation id="3075874217500066906">Du må starte enheten på nytt for å starte powerwash-prosessen. Når enheten er startet på nytt, blir du bedt om å bekrefte at du vil fortsette.</translation>
 <translation id="3076677906922146425">La hvem som helst legge til folk i Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1482,6 +1486,7 @@
 <translation id="3088034400796962477">Translitterasjon (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Gi nytt navn</translation>
 <translation id="308903551226753393">Konfigurer automatisk</translation>
+<translation id="3089231390674410424">Det ser ut til å være et problem med legitimasjonen din. Sjekk at du er logget på riktig, og prøv på nytt.</translation>
 <translation id="3090819949319990166">Kunne ikke kopiere den eksterne crx-filen til <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">«<ph name="DEVICE_NAME" />» er tilkoblet</translation>
 <translation id="3092544800441494315">Inkluder denne skjermdumpen:</translation>
@@ -2007,7 +2012,6 @@
 <translation id="3790856258139356663">Kobler til testtjeneren for Chrome-synkronisering.</translation>
 <translation id="3790909017043401679">Angi PIN-kode for SIM-kort</translation>
 <translation id="3792890930871100565">Koble fra skrivere</translation>
-<translation id="3795681127952030401"><ph name="URL" /> ønsker å sende deg varsler.</translation>
 <translation id="3796648294839530037">Favorittnettverk:</translation>
 <translation id="3797900183766075808">&amp;Søk etter «<ph name="SEARCH_TERMS" />» på <ph name="SEARCH_ENGINE" /></translation>
 <translation id="3798449238516105146">Versjon</translation>
@@ -2479,6 +2483,7 @@
 <translation id="4552678318981539154">Kjøp mer lagringsplass</translation>
 <translation id="4554591392113183336">Den eksterne utvidelsen har samme eller lavere versjonsnummer som den eksisterende utvidelsen.</translation>
 <translation id="4554796861933393312">Animasjonshastighet for materialdesign – blekkdråpe</translation>
+<translation id="4555670907822902621">Slå på lagring av sider som er satt som bokmerker, for bruk uten nettilkobling.</translation>
 <translation id="4555769855065597957">Skygge</translation>
 <translation id="4556110439722119938">Bokmerkene, loggoppføringene, passordene og de andre innstillingene dine blir synkronisert med Google-kontoen din, slik at du kan bruke dem på alle enhetene dine.</translation>
 <translation id="4557136421275541763">Advarsel:</translation>
@@ -2654,6 +2659,7 @@
 <translation id="4824518112777153488">Støtte for berøringsfri holding over berøringsskjermer</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> kan ikke koble til Internett via <ph name="NETWORK_NAME" />. Velg et annet nettverk. <ph name="LEARN_MORE_LINK_START" />Finn ut mer<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Identiteten til <ph name="ORGANIZATION" /> på <ph name="LOCALITY" /> er verifisert av <ph name="ISSUER" />. Gyldig informasjon om sertifikatåpenhet ble mottatt fra tjeneren.</translation>
+<translation id="4832537345877333532">Slå av hentingen av icc-skjermfiler fra Quirks Server for fargekalibrering av skjermen.</translation>
 <translation id="4834912470034578916">Slå på spesialtilpassede oppsett for nettvarsler.</translation>
 <translation id="4835836146030131423">Feil ved pålogging.</translation>
 <translation id="4837926214103741331">Du er ikke autorisert til å bruke denne enheten. Ta kontakt med eieren av enheten for å få tillatelse til å logge på.</translation>
@@ -2840,6 +2846,7 @@
 <translation id="5120421890733714118">Stol på dette sertifikatet for  identifisering av nettsteder.</translation>
 <translation id="5121130586824819730">Harddisken din er full. Lagre på et annet sted, eller frigjør plass på harddisken.</translation>
 <translation id="5125751979347152379">Ugyldig nettadresse.</translation>
+<translation id="5126663277159826272">Slå av Quirks Client for skjermkalibrering.</translation>
 <translation id="5127881134400491887">administrere nettverkstilkoblinger</translation>
 <translation id="5128590998814119508">Visningsliste for 2D-lerret</translation>
 <translation id="512903556749061217">vedlagt</translation>
@@ -2979,9 +2986,11 @@
 <translation id="5301751748813680278">Går inn som gjest.</translation>
 <translation id="5301954838959518834">OK, skjønner</translation>
 <translation id="5302048478445481009">Språk</translation>
+<translation id="5304039790201806037">Pointer Events</translation>
 <translation id="5305688511332277257">Ingen installert</translation>
 <translation id="5308380583665731573">Koble til</translation>
 <translation id="5311260548612583999">Privat nøkkelfil (valgfritt):</translation>
+<translation id="5313967007315987356">Legg til et nettsted</translation>
 <translation id="5316588172263354223">Talesøk når som helst</translation>
 <translation id="5316716239522500219">Speil skjermer</translation>
 <translation id="5317780077021120954">Lagre</translation>
@@ -3284,6 +3293,7 @@
 <translation id="5734362860645681824">Kommunikasjon</translation>
 <translation id="573719557377416048">Fjern «copresence»-tilstand</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: Velg for å redigere</translation>
+<translation id="5741454054957165976">Slå på den nye versjonen av brukeragent-intervensjon for WebFonts-innlasting.</translation>
 <translation id="574392208103952083">Medium</translation>
 <translation id="5745056705311424885">Oppdaget USB-minnepinne</translation>
 <translation id="5746169159649715125">Lagre som PDF</translation>
@@ -3332,7 +3342,6 @@
 <translation id="5803531701633845775">Velg fraser fra baksiden, uten å bevege markøren</translation>
 <translation id="5804241973901381774">Tillatelser</translation>
 <translation id="580571955903695899">Sortér etter tittel</translation>
-<translation id="5808982448801399019">Autorisasjonen mislyktes</translation>
 <translation id="580961539202306967">Spør meg når et nettsted vil sende meg pushmeldinger (anbefales)</translation>
 <translation id="5815645614496570556">X.400-adresse</translation>
 <translation id="5817397429773072584">Kinesisk (tradisjonell)</translation>
@@ -3357,6 +3366,7 @@
 <translation id="5834581999798853053">Omtrent <ph name="TIME" /> minutter igjen</translation>
 <translation id="5838825566232597749">Internasjonalt Workman (USA)</translation>
 <translation id="5839277899276241121">Samme som faktureringsadressen</translation>
+<translation id="5844550873065695788">Dette fører til at minst <ph name="TOTAL_COUNT" /> elementer slettes permanent fra denne enheten. For å hente dataene dine igjen, logg på Chrome som $2.</translation>
 <translation id="5846929185714966548">Fane 4</translation>
 <translation id="5848934677402291689">Lagring til PDF pågår</translation>
 <translation id="5849335628409778954">Legg til kredittkort</translation>
@@ -3601,6 +3611,7 @@
 <translation id="6232017090690406397">Batteri</translation>
 <translation id="6241530762627360640">bruke informasjon om Bluetooth-enheter tilkoblet systemet ditt og oppdage Bluetooth-enheter i nærheten.</translation>
 <translation id="6243774244933267674">Tjeneren er ikke tilgjengelig</translation>
+<translation id="6246413617632217567">Den administrerte brukeren kunne ikke importeres. Sjekk hvor mye plass du har på harddisken, og hvilke tillatelser som er aktive, og prøv på nytt.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" /> %</translation>
 <translation id="624789221780392884">Oppdateringen er klar</translation>
 <translation id="6248400709929739064">Slå på undertekster</translation>
@@ -3616,7 +3627,7 @@
 <translation id="6263541650532042179">tilbakestill synkronisering</translation>
 <translation id="6264347891387618177">Translitterasjon (selam → ሰላም)</translation>
 <translation id="6264365405983206840">Velg &amp;alle</translation>
-<translation id="6264485186158353794">Til trygg havn</translation>
+<translation id="6264485186158353794">Tilbake til trygg grunn</translation>
 <translation id="626568068055008686">Feil passord eller skadet fil.</translation>
 <translation id="6267166720438879315">Velg sertifikat for å autentisere deg selv til <ph name="HOST_NAME" /></translation>
 <translation id="6267909379545953750">Eksperimentell JavaScript</translation>
@@ -3629,6 +3640,7 @@
 <translation id="6277518330158259200">Ta en skjermdump</translation>
 <translation id="6279183038361895380">Trykk på |<ph name="ACCELERATOR" />| for å se markøren</translation>
 <translation id="6280215091796946657">Logg på med en annen konto</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Eksperiment der alle API-ene gjenspeiler layout-visningsområdet. Dette gjør at vinduets rulleegenskaper fungerer relativt til layout-visningsområdet.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Ny skriver på nettverket}other{Nye skrivere på nettverket}}</translation>
 <translation id="6285395082104474418">Statusfeltet viser deg status for nettverket, batteriet og mer.</translation>
@@ -3684,6 +3696,7 @@
 <translation id="6380143666419481200">Godta og fortsett</translation>
 <translation id="6380224340023442078">Innstillinger for innhold</translation>
 <translation id="6383194710567510941">Slå på bruk av chrome.input.ime API.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Dette fører til at minst $1 element slettes permanent fra denne enheten. For å hente dataene dine igjen senere, logg på Chrome som $2.}other{Dette fører til at minst $1 elementer slettes permanent fra denne enheten. For å hente dataene dine igjen senere, logg på Chrome som $2.}}</translation>
 <translation id="6384275966486438344">endre søkeinnstillingene dine til: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Sider du åpner i dette vinduet, vises ikke i nettloggen og de etterlater ingen andre spor (f.eks. informasjonskapsler) på datamaskinen etter at du har lukket alle åpne gjestevinduer. Filer du laster ned, blir imidlertid lagret.</translation>
 <translation id="6391538222494443604">Inndatakatalogen må eksistere.</translation>
@@ -3821,6 +3834,7 @@
 <translation id="6575134580692778371">Ikke konfigurert</translation>
 <translation id="6575251558004911012">Spør når et nettsted krever tilgang til kameraet (anbefales)</translation>
 <translation id="6579159469348633828">Brotli-innholdskoding.</translation>
+<translation id="6580151766480067746">ARC-versjon</translation>
 <translation id="6581162200855843583">Google Disk-link</translation>
 <translation id="6583070985841601920">Pålogget som <ph name="USER_EMAIL_ADDRESS" />. Synkronisering er deaktivert av administratoren din.</translation>
 <translation id="65832705307647870">Forhåndsfyll Ny fane-siden med populære nettsteder.</translation>
@@ -3986,6 +4000,7 @@
 <translation id="6847758263950452722">Lagre siden som MHTML</translation>
 <translation id="6853388645642883916">Oppdatereringsprogrammet er i hvilemodus</translation>
 <translation id="68541483639528434">Lukk andre faner</translation>
+<translation id="6856701878604560493">Slå på bokmerker for bruk uten nettilkobling</translation>
 <translation id="6860097299815761905">Innstillinger for proxy-tjener</translation>
 <translation id="6860427144121307915">Åpne i en fane</translation>
 <translation id="6862635236584086457">Alle filene som lagres i denne mappen, blir automatisk sikkerhetskopiert på nettet</translation>
@@ -4158,6 +4173,7 @@
 <translation id="7092106376816104">Unntak for forgrunnsvinduer</translation>
 <translation id="7093866338626856921">Utveksle data med enhetene <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Har du lyst til å oppdage flere fantastiske funksjoner?</translation>
+<translation id="7096108453481049031">Den administrerte brukeren kunne ikke importeres. Kontrollér nettverkstilkoblingen din, og prøv igjen senere.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> elementer er valgt</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Kjøp mer lagringsplass</translation>
@@ -4186,6 +4202,7 @@
 <translation id="713888829801648570">Beklager. Passordet ditt kunne ikke bekreftes fordi du ikke har nettilkobling.</translation>
 <translation id="7140928199327930795">Ingen andre tilgjengelige enheter.</translation>
 <translation id="7141105143012495934">Påloggingen mislyktes fordi kontoopplysningene dine ikke kunne hentes ut. Kontakt administratoren din, eller prøv på nytt.</translation>
+<translation id="7141331524324591758">Slår på delvis eksperimentell støtte for Pointer Events API. Dette er bare beregnet brukt av nettutviklere til testformål og kommer til å føre til at enkelte nettsteder ikke fungerer som de skal.</translation>
 <translation id="7143207342074048698">Kobler til</translation>
 <translation id="7144878232160441200">Prøv på nytt</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> er deaktivert. Gå til <ph name="CHROME_PLUGINS_LINK" /> for å aktivere det på nytt.</translation>
@@ -4826,6 +4843,7 @@
 <translation id="8119572489781388874">Endre innstillingene</translation>
 <translation id="8119631488458759651">fjern dette nettstedet</translation>
 <translation id="8121385576314601440">Inndatainnstillinger for hangul</translation>
+<translation id="8122245494004914423">Dette fører til at nettlesingsdataene dine slettes permanent fra denne enheten. For å hente dataene dine igjen senere, logg på Chrome som $2.</translation>
 <translation id="8124313775439841391">Administrert ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Tillat ugyldige sertifikater for ressurser som er lastet inn fra den lokale verten.</translation>
@@ -4910,6 +4928,7 @@
 <translation id="8226742006292257240">Nedenfor ser du et tilfeldig generert TPM-passord som er tildelt datamaskinen din:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Hackere som for øyeblikket er på <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />, prøver kanskje å installere farlige programmer på datamaskinen din. Disse kan stjele eller slette informasjonen din (for eksempel bilder, passord, e-post og kredittkortinformasjon).</translation>
+<translation id="8233254008506535819">Inkluder alternativet om å godkjenne viktige nettsteder i dialogboksen «Tøm nettlesingsdata».</translation>
 <translation id="8236231079192337250">Chrome Nettmarked Galleri-appen for skriverdrivere</translation>
 <translation id="8238649969398088015">Tips for Hjelp</translation>
 <translation id="8240697550402899963">Bruk klassisk tema</translation>
@@ -5233,7 +5252,6 @@
 <translation id="8708671767545720562">Mer informasjon</translation>
 <translation id="8711402221661888347">Burger</translation>
 <translation id="8711453844311572806">Når telefonen er låst opp og i nærheten, klikker du bare for å få tilgang. Ellers kommer du til å se et låst-ikon, og du må skrive inn passordet ditt.</translation>
-<translation id="8712637175834984815">Skjønner</translation>
 <translation id="8713570323158206935">Send <ph name="BEGIN_LINK1" />systeminformasjon<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Aktivér autokorrektur for fysisk, amerikansk tastatur, som kan gi forslag mens det skrives på det fysiske tastaturet.</translation>
 <translation id="871476437400413057">Google-lagrede passord</translation>
@@ -5597,6 +5615,7 @@
 <translation id="952992212772159698">Ikke aktivert</translation>
 <translation id="953000875543358078">Dette kan ta omtrent et minutt</translation>
 <translation id="960987915827980018">Omtrent én time igjen</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Dette fører til at $1 element slettes permanent fra denne enheten. For å hente dataene dine igjen senere, logg på Chrome som $2.}other{Dette fører til at $1 elementer slettes permanent fra denne enheten. For å hente dataene dine igjen senere, logg på Chrome som $2.}}</translation>
 <translation id="96421021576709873">Wi-Fi-nettverk</translation>
 <translation id="965490406356730238">Slå på maskinvareakselerert MJPEG-dekoding for skjermdumper der dette er tilgjengelig.</translation>
 <translation id="968174221497644223">Programbuffer</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 5d030884..1a4b965 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -251,6 +251,7 @@
       Na wszystkich zgodnych urządzeniach powiązanych z kontem <ph name="USER_DISPLAY_EMAIL" /> zostanie włączony Bluetooth, a niektóre informacje o sprzęcie będą przesyłane do Google. &lt;a&gt;Więcej informacji&lt;/a&gt;.</translation>
 <translation id="13649080186077898">Zarządzaj ustawieniami autouzupełniania</translation>
 <translation id="1367951781824006909">Wybierz plik</translation>
+<translation id="136802136832547685">Brak nadzorowanych użytkowników, których można by dodać do tego urządzenia.</translation>
 <translation id="1368265273904755308">Zgłoś problem</translation>
 <translation id="1368832886055348810">Od lewej do prawej</translation>
 <translation id="1370646789215800222">Usunąć osobę?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Szukaj</translation>
 <translation id="1384211230590313258">Moduł obsługi wykrywania usług</translation>
 <translation id="1386387014181100145">Cześć.</translation>
+<translation id="1386830813511981192">Na Twoim urządzeniu <ph name="DEVICE_TYPE" /> jest teraz dostępnych ponad milion aplikacji i gier.</translation>
 <translation id="1389297115360905376">Możesz to pobrać tylko z <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Otwórz jako zwykłą kartę</translation>
 <translation id="1395262318152388157">Suwak wyszukiwania</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">Prawy margines</translation>
 <translation id="2282146716419988068">Proces GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Nowa wersja interwencji klienta użytkownika podczas ładowania czcionek WebFonts.</translation>
 <translation id="2286454467119466181">Prosty</translation>
 <translation id="2286950485307333924">Jesteś teraz zalogowany w Chrome</translation>
 <translation id="2287590536030307392">Wyłącz wszystkie połączenia bezprzewodowe.</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">Tabela Google</translation>
 <translation id="2546283357679194313">Pliki cookie i dane stron</translation>
 <translation id="2549646943416322527">Wykrywacz obsługi trybu seccomp</translation>
+<translation id="2550212893339833758">Zamieniona pamięć</translation>
 <translation id="2553100941515833716">Resetuj stan instalacji Menu z aplikacjami przy każdym ponownym uruchomieniu.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> nie może nawiązać połączenia z siecią <ph name="NETWORK_ID" />. Wybierz inną sieć lub spróbuj ponownie.</translation>
 <translation id="2553440850688409052">Ukryj wtyczkę</translation>
@@ -1102,6 +1106,7 @@
 <translation id="2587203970400270934">Kod operatora:</translation>
 <translation id="2587922270115112871">Utworzenie użytkownika nadzorowanego nie powoduje utworzenia konta Google, a jego ustawienia
     ani dane nie są przenoszone na inne urządzenia przez funkcje synchronizacji w Chrome. Jego zasięg działania jest ograniczony tylko do tego urządzenia.</translation>
+<translation id="2594049137847833442">Opcje ważnych witryn w oknie dialogowym Wyczyść historię przeglądania</translation>
 <translation id="2594056015203442344">Po włączeniu tej funkcji wskaźniki dźwięku na pasku kart pozwalają wyciszać dźwięk z karty. W menu kontekstowym kart pojawiają się też polecenia do szybkiego wyciszania wielu wybranych kart.</translation>
 <translation id="259421303766146093">Pomniejsz</translation>
 <translation id="2597852038534460976">Chrome nie może uzyskać dostępu do tapet. Połącz się z siecią.</translation>
@@ -1469,7 +1474,6 @@
 <translation id="3065140616557457172">Wpisz zapytanie lub wprowadź adres URL – wszystko po prostu działa.</translation>
 <translation id="3067198360141518313">Uruchom wtyczkę</translation>
 <translation id="307519606911195071">Włącz dodatkowe ułatwienia dostępu na stronie Ustawienia.</translation>
-<translation id="3075239840551149663">Użytkownik nadzorowany o nazwie <ph name="NEW_PROFILE_NAME" /> został utworzony.</translation>
 <translation id="3075874217500066906">Aby rozpocząć procedurę Powerwash, musisz ponownie uruchomić urządzenie. Po ponownym uruchomieniu poprosimy Cię o potwierdzenie, że chcesz kontynuować.</translation>
 <translation id="3076677906922146425">Zezwalaj każdemu na dodawanie osób do Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1486,6 +1490,7 @@
 <translation id="3088034400796962477">Transliteracja (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Zmień nazwę</translation>
 <translation id="308903551226753393">Skonfiguruj automatycznie</translation>
+<translation id="3089231390674410424">Wygląda na to, że z Twoimi poświadczeniami jest coś nie tak. Sprawdź, czy zalogowałeś się prawidłowo, i spróbuj ponownie.</translation>
 <translation id="3090819949319990166">Nie można skopiować zewnętrznego pliku CRX jako <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">Sparowano „<ph name="DEVICE_NAME" />”</translation>
 <translation id="3092544800441494315">Dołącz następujący zrzut ekranu:</translation>
@@ -2013,7 +2018,6 @@
 <translation id="3790856258139356663">Łączy się z serwerem testowania na potrzeby Synchronizacji Chrome.</translation>
 <translation id="3790909017043401679">Wpisz PIN karty SIM</translation>
 <translation id="3792890930871100565">Odłącz drukarki</translation>
-<translation id="3795681127952030401"><ph name="URL" /> chce wysyłać Ci powiadomienia.</translation>
 <translation id="3796648294839530037">Ulubione sieci:</translation>
 <translation id="3797900183766075808">Wy&amp;szukaj „<ph name="SEARCH_TERMS" />” w <ph name="SEARCH_ENGINE" /></translation>
 <translation id="3798449238516105146">Wersja</translation>
@@ -2487,6 +2491,7 @@
 <translation id="4552678318981539154">Kup więcej miejsca</translation>
 <translation id="4554591392113183336">Wersja rozszerzenia zewnętrznego jest starsza lub taka sama jak wersja obecna.</translation>
 <translation id="4554796861933393312">Szybkość animacji kropli tuszu Material Design</translation>
+<translation id="4555670907822902621">Włącz zapisywanie stron dodanych do zakładek, by umożliwić oglądanie ich w trybie offline.</translation>
 <translation id="4555769855065597957">Cień</translation>
 <translation id="4556110439722119938">Zakładki, historia, hasła i inne ustawienia zostaną zsynchronizowane z kontem Google, by można było z nich korzystać na dowolnym urządzeniu.</translation>
 <translation id="4557136421275541763">Ostrzeżenie:</translation>
@@ -2660,6 +2665,7 @@
 <translation id="4824518112777153488">Obsługa ekranów dotykowych z funkcją najeżdżania kursorem</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> nie może się połączyć z internetem przez sieć <ph name="NETWORK_NAME" />. Wybierz inną sieć. <ph name="LEARN_MORE_LINK_START" />Więcej informacji<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Tożsamość organizacji <ph name="ORGANIZATION" /> w lokalizacji <ph name="LOCALITY" /> została zweryfikowana przez <ph name="ISSUER" />. Serwer przekazał prawidłowe informacje o przejrzystości certyfikatu.</translation>
+<translation id="4832537345877333532">Wyłącz pobieranie plików icc z Quirks Server do kalibracji kolorów wyświetlacza.</translation>
 <translation id="4834912470034578916">Włącz układy niestandardowe w powiadomieniach internetowych.</translation>
 <translation id="4835836146030131423">Błąd podczas logowania.</translation>
 <translation id="4837926214103741331">Nie masz uprawnień do korzystania z tego urządzenia. Aby uzyskać pozwolenie na logowanie się, skontaktuj się z jego właścicielem.</translation>
@@ -2847,6 +2853,7 @@
 <translation id="5120421890733714118">Ufaj temu certyfikatowi przy identyfikowaniu witryn.</translation>
 <translation id="5121130586824819730">Dysk twardy jest pełny. Zapisz w innej lokalizacji lub zwolnij miejsce na dysku.</translation>
 <translation id="5125751979347152379">Nieprawidłowy adres URL.</translation>
+<translation id="5126663277159826272">Wyłącz Quirks Client do kalibracji wyświetlacza.</translation>
 <translation id="5127881134400491887">Zarządzać połączeniami sieciowymi</translation>
 <translation id="5128590998814119508">Kanwy 2D list wyświetlania</translation>
 <translation id="512903556749061217">podłączone</translation>
@@ -2989,9 +2996,11 @@
 <translation id="5301751748813680278">Logowanie jako Gość</translation>
 <translation id="5301954838959518834">OK, rozumiem</translation>
 <translation id="5302048478445481009">Język</translation>
+<translation id="5304039790201806037">Zdarzenia wskaźnika</translation>
 <translation id="5305688511332277257">Brak zainstalowanych</translation>
 <translation id="5308380583665731573">Połącz</translation>
 <translation id="5311260548612583999">Plik kluczy (opcjonalnie):</translation>
+<translation id="5313967007315987356">Dodaj stronę</translation>
 <translation id="5316588172263354223">Wyszukuj głosowo w dowolnej chwili</translation>
 <translation id="5316716239522500219">Wyświetl na monitorach odbicie lustrzane</translation>
 <translation id="5317780077021120954">Zapisz</translation>
@@ -3294,6 +3303,7 @@
 <translation id="5734362860645681824">Komunikacja</translation>
 <translation id="573719557377416048">Wyczyść stan współobecności</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: wybierz, by edytować</translation>
+<translation id="5741454054957165976">Włącz nową wersję interwencji klienta użytkownika podczas ładowania czcionek WebFonts.</translation>
 <translation id="574392208103952083">Średni</translation>
 <translation id="5745056705311424885">Wykryto pamięć USB</translation>
 <translation id="5746169159649715125">Zapisz jako PDF</translation>
@@ -3342,7 +3352,6 @@
 <translation id="5803531701633845775">Wybierz wyrażenia z tyłu, bez przesuwania kursora</translation>
 <translation id="5804241973901381774">Uprawnienia</translation>
 <translation id="580571955903695899">Uporządkuj według tytułu</translation>
-<translation id="5808982448801399019">Autoryzacja nie udała się</translation>
 <translation id="580961539202306967">Pytaj mnie, gdy strona chce wysyłać mi wiadomości push (zalecane)</translation>
 <translation id="5815645614496570556">Adres X.400</translation>
 <translation id="5817397429773072584">chiński tradycyjny</translation>
@@ -3367,6 +3376,7 @@
 <translation id="5834581999798853053">Zostało około <ph name="TIME" /> min</translation>
 <translation id="5838825566232597749">Amerykańska klawiatura międzynarodowa Workman</translation>
 <translation id="5839277899276241121">Taki sam jak adres rozliczeniowy</translation>
+<translation id="5844550873065695788">Spowoduje to trwałe usunięcie co najmniej <ph name="TOTAL_COUNT" /> pozycji z tego urządzenia. Aby później odzyskać dane, zaloguj się w Chrome jako $2.</translation>
 <translation id="5846929185714966548">Karta 4</translation>
 <translation id="5848934677402291689">Zapisuję jako PDF...</translation>
 <translation id="5849335628409778954">Dodaj kartę kredytową...</translation>
@@ -3611,6 +3621,7 @@
 <translation id="6232017090690406397">Bateria</translation>
 <translation id="6241530762627360640">Uzyskiwać dostęp do informacji o urządzeniach Bluetooth sparowanych z systemem oraz wykrywać urządzenia Bluetooth w pobliżu.</translation>
 <translation id="6243774244933267674">Serwer niedostępny</translation>
+<translation id="6246413617632217567">Nie udało się zaimportować użytkownika nadzorowanego. Sprawdź miejsce na dysku twardym i uprawnienia, a potem spróbuj ponownie.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Aktualizacja jest gotowa</translation>
 <translation id="6248400709929739064">Włącz napisy</translation>
@@ -3639,6 +3650,7 @@
 <translation id="6277518330158259200">Wykon&amp;aj zrzut ekranu</translation>
 <translation id="6279183038361895380">Naciśnij |<ph name="ACCELERATOR" />|, by wyświetlić kursor</translation>
 <translation id="6280215091796946657">Zaloguj się na inne konto</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Eksperyment, w którym wszystkie interfejsy API odzwierciedlają widoczny obszar układu. Powoduje to, że właściwości window.scroll są zależne od widocznego obszaru układu.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nowa drukarka w Twojej sieci}few{Nowe drukarki w Twojej sieci}many{Nowe drukarki w Twojej sieci}other{Nowe drukarki w Twojej sieci}}</translation>
 <translation id="6285395082104474418">W zasobniku stanu możesz sprawdzić aktualny stan swojej sieci, baterii i innych rzeczy.</translation>
@@ -3694,6 +3706,7 @@
 <translation id="6380143666419481200">Zaakceptuj i kontynuuj</translation>
 <translation id="6380224340023442078">Ustawienia treści...</translation>
 <translation id="6383194710567510941">Włącza używanie interfejsu API chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Spowoduje to trwałe usunięcie co najmniej $1 elementu z tego urządzenia. Aby później odzyskać dane, zaloguj się w Chrome jako $2.}few{Spowoduje to trwałe usunięcie co najmniej $1 elementów z tego urządzenia. Aby później odzyskać dane, zaloguj się w Chrome jako $2.}many{Spowoduje to trwałe usunięcie co najmniej $1 elementów z tego urządzenia. Aby później odzyskać dane, zaloguj się w Chrome jako $2.}other{Spowoduje to trwałe usunięcie co najmniej $1 elementu z tego urządzenia. Aby później odzyskać dane, zaloguj się w Chrome jako $2.}}</translation>
 <translation id="6384275966486438344">Zmień ustawienia wyszukiwania na: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Strony wyświetlane w tym oknie nie pojawią się w historii przeglądarki. Po zamknięciu wszystkich okien otwartych w trybie gościa nie zostanie po nich na komputerze żaden ślad (np. w postaci plików cookie). Pobrane pliki zostaną jednak zachowane.</translation>
 <translation id="6391538222494443604">Katalog wejściowy musi istnieć.</translation>
@@ -3832,6 +3845,7 @@
 <translation id="6575134580692778371">Nie skonfigurowano</translation>
 <translation id="6575251558004911012">Pytaj, gdy strona żąda dostępu do kamery (zalecane)</translation>
 <translation id="6579159469348633828">Kodowanie typu Brotli.</translation>
+<translation id="6580151766480067746">Wersja ARC</translation>
 <translation id="6581162200855843583">Link Dysku Google</translation>
 <translation id="6583070985841601920">Zalogowany jako <ph name="USER_EMAIL_ADDRESS" />. Administrator wyłączył synchronizację.</translation>
 <translation id="65832705307647870">Wyświetla popularne witryny na stronie Nowa karta.</translation>
@@ -3997,6 +4011,7 @@
 <translation id="6847758263950452722">Zapisz stronę jako MHTML</translation>
 <translation id="6853388645642883916">Aktualizator jest uśpiony</translation>
 <translation id="68541483639528434">Zamknij inne karty</translation>
+<translation id="6856701878604560493">Włącz zakładki offline</translation>
 <translation id="6860097299815761905">Ustawienia serwera proxy...</translation>
 <translation id="6860427144121307915">Otwórz na karcie</translation>
 <translation id="6862635236584086457">Wszystkie pliki przechowywane w tym folderze są automatycznie zapisywane online</translation>
@@ -4167,6 +4182,7 @@
 <translation id="7092106376816104">Wyjątki dla wyskakujących okienek</translation>
 <translation id="7093866338626856921">Wymiana danych z urządzeniami o nazwach: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Chcesz poznać więcej przydatnych funkcji?</translation>
+<translation id="7096108453481049031">Nie udało się zaimportować nadzorowanego użytkownika. Sprawdź połączenie sieciowe i spróbuj ponownie później.</translation>
 <translation id="7100897339030255923">Wybrane elementy: <ph name="COUNT" /></translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Kup więcej miejsca...</translation>
@@ -4195,6 +4211,7 @@
 <translation id="713888829801648570">Nie można zweryfikować Twojego hasła, bo jesteś offline.</translation>
 <translation id="7140928199327930795">Nie ma żadnych innych dostępnych urządzeń.</translation>
 <translation id="7141105143012495934">Nie udało się zalogować, bo nie można pobrać informacji o koncie. Skontaktuj się z administratorem lub spróbuj ponownie.</translation>
+<translation id="7141331524324591758">Włącza częściową, eksperymentalną obsługę interfejsu API zdarzeń wskaźnika. Przeznaczona tylko do testowania przez twórców stron internetowych. W niewielkim stopniu uszkadza niektóre strony internetowe.</translation>
 <translation id="7143207342074048698">Łączenie</translation>
 <translation id="7144878232160441200">Ponów próbę</translation>
 <translation id="7148311641502571842">Wtyczka <ph name="PLUGIN_NAME" /> została wyłączona. Aby ją włączyć, otwórz <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4836,6 +4853,7 @@
 <translation id="8119572489781388874">Zmień ustawienia</translation>
 <translation id="8119631488458759651">usuń tę witrynę</translation>
 <translation id="8121385576314601440">Ustawienia wprowadzania znaków hangul</translation>
+<translation id="8122245494004914423">Spowoduje to trwałe usunięcie danych przeglądania z tego urządzenia. Aby później odzyskać dane, zaloguj się w Chrome jako $2.</translation>
 <translation id="8124313775439841391">Zarządzana konfiguracja ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Zezwalaj na nieprawidłowe certyfikaty w przypadku zasobów ładowanych z hosta lokalnego.</translation>
@@ -4920,6 +4938,7 @@
 <translation id="8226742006292257240">Poniżej znajduje się losowo wygenerowane hasło modułu TPM, które zostało przypisane do Twojego komputera:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Osoby atakujące stronę <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> mogą spróbować zainstalować na Twoim komputerze niebezpieczne programy, których celem jest wykradzenie lub usunięcie Twoich danych (na przykład zdjęć, haseł, wiadomości czy numerów kart kredytowych).</translation>
+<translation id="8233254008506535819">Włącza opcję dodawania ważnych stron internetowych do białej listy w oknie dialogowym Wyczyść historię przeglądania.</translation>
 <translation id="8236231079192337250">Aplikacja Galeria Chrome Web Store do znajdowania sterowników drukarek</translation>
 <translation id="8238649969398088015">Wskazówka pomocy</translation>
 <translation id="8240697550402899963">Użyj motywu klasycznego</translation>
@@ -5243,7 +5262,6 @@
 <translation id="8708671767545720562">&amp;Więcej informacji</translation>
 <translation id="8711402221661888347">Pikle</translation>
 <translation id="8711453844311572806">Gdy Twój telefon jest odblokowany i znajduje się w pobliżu, po prostu kliknij, by uzyskać dostęp do urządzenia. Jeśli nie, zobaczysz ikonę blokady i trzeba będzie wpisać hasło.</translation>
-<translation id="8712637175834984815">Rozumiem</translation>
 <translation id="8713570323158206935">Wyślij <ph name="BEGIN_LINK1" />informacje o systemie<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Włącz autokorektę klawiatury fizycznej dla klawiatury USA – sugestie będą wyświetlane podczas pisania na klawiaturze fizycznej.</translation>
 <translation id="871476437400413057">Zapisane hasła Google</translation>
@@ -5606,6 +5624,7 @@
 <translation id="952992212772159698">Nie aktywowano</translation>
 <translation id="953000875543358078">To może potrwać około minuty</translation>
 <translation id="960987915827980018">Zostało około 1 godziny</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Spowoduje to trwałe usunięcie $1 elementu z tego urządzenia. Aby później odzyskać dane, zaloguj się w Chrome jako $2.}few{Spowoduje to trwałe usunięcie $1 elementów z tego urządzenia. Aby później odzyskać dane, zaloguj się w Chrome jako $2.}many{Spowoduje to trwałe usunięcie $1 elementów z tego urządzenia. Aby później odzyskać dane, zaloguj się w Chrome jako $2.}other{Spowoduje to trwałe usunięcie $1 elementu z tego urządzenia. Aby później odzyskać dane, zaloguj się w Chrome jako $2.}}</translation>
 <translation id="96421021576709873">Sieć Wi-Fi</translation>
 <translation id="965490406356730238">Włącz wspomagane sprzętowo dekodowanie przechwyconych klatek w formacie MJPEG (gdy to możliwe).</translation>
 <translation id="968174221497644223">Pamięć podręczna aplikacji</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index 43108a6..0600e7d 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -1469,7 +1469,6 @@
 <translation id="3065140616557457172">Digite para pesquisar ou insira um URL para navegar - o que você preferir.</translation>
 <translation id="3067198360141518313">Executar este plug-in</translation>
 <translation id="307519606911195071">Permite recursos de acessibilidade adicionais na página de configurações.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> foi criado como um usuário supervisionado.</translation>
 <translation id="3075874217500066906">É necessária uma reinicialização para iniciar o processo Powerwash. Após a reinicialização, solicitaremos que você confirme que deseja continuar.</translation>
 <translation id="3076677906922146425">Deixar qualquer um adicionar uma pessoa ao Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -2013,7 +2012,6 @@
 <translation id="3790856258139356663">Conecta-se ao servidor de testes para o recurso Sincronização do Google Chrome.</translation>
 <translation id="3790909017043401679">Insira o PIN do cartão SIM</translation>
 <translation id="3792890930871100565">Desconectar impressoras</translation>
-<translation id="3795681127952030401"><ph name="URL" /> deseja enviar notificações a você.</translation>
 <translation id="3796648294839530037">Redes favoritas:</translation>
 <translation id="3797900183766075808">&amp;Pesquisar “<ph name="SEARCH_TERMS" />” no <ph name="SEARCH_ENGINE" /></translation>
 <translation id="3798449238516105146">Versão</translation>
@@ -2991,6 +2989,7 @@
 <translation id="5305688511332277257">Nenhum instalado</translation>
 <translation id="5308380583665731573">Conectar-se</translation>
 <translation id="5311260548612583999">Arq. de chave privada (opcional):</translation>
+<translation id="5313967007315987356">Adicionar site</translation>
 <translation id="5316588172263354223">Pesquisa por voz a qualquer momento</translation>
 <translation id="5316716239522500219">Espelhar monitores</translation>
 <translation id="5317780077021120954">Salvar</translation>
@@ -3342,7 +3341,6 @@
 <translation id="5803531701633845775">Escolher frases do fundo, sem mover o cursor</translation>
 <translation id="5804241973901381774">Permissões</translation>
 <translation id="580571955903695899">Reordenar por título</translation>
-<translation id="5808982448801399019">Falha na autorização</translation>
 <translation id="580961539202306967">Perguntar quando um site quiser me enviar mensagens push (recomendado)</translation>
 <translation id="5815645614496570556">Endereço X.400</translation>
 <translation id="5817397429773072584">Chinês tradicional</translation>
@@ -5254,7 +5252,6 @@
 <translation id="8708671767545720562">&amp;Mais informações</translation>
 <translation id="8711402221661888347">Xis</translation>
 <translation id="8711453844311572806">Quando o smartphone está desbloqueado e nas proximidades, basta clicar para entrar. Caso contrário, você verá um ícone de bloqueio e precisará digitar sua senha.</translation>
-<translation id="8712637175834984815">Entendi</translation>
 <translation id="8713570323158206935">Enviar <ph name="BEGIN_LINK1" />informações do sistema<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Ative a correção automática do teclado físico para o teclado americano, que pode fornecer sugestões enquanto você digita no teclado físico.</translation>
 <translation id="871476437400413057">Senhas salvas do Google</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 66696d8..0ff945c3 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -251,6 +251,7 @@
       Tenha em atenção que o Bluetooth está ativado para todos os dispositivos compatíveis com <ph name="USER_DISPLAY_EMAIL" /> e que algumas informações acerca do hardware são enviadas para a Google. &lt;a&gt;Saiba mais&lt;/a&gt;</translation>
 <translation id="13649080186077898">Gerir definições de Preenchimento automático</translation>
 <translation id="1367951781824006909">Selecione um ficheiro</translation>
+<translation id="136802136832547685">Não existem utilizadores supervisionados para adicionar a este dispositivo.</translation>
 <translation id="1368265273904755308">Comunicar problema</translation>
 <translation id="1368832886055348810">Da esquerda para a direita</translation>
 <translation id="1370646789215800222">Remover a pessoa?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Pesquisar</translation>
 <translation id="1384211230590313258">Controlador do serviço de descoberta</translation>
 <translation id="1386387014181100145">Olá.</translation>
+<translation id="1386830813511981192">Mais de um milhão de aplicações e de jogos agora disponíveis no seu <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Só é possível adicionar a partir da <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Abrir como Separador Normal</translation>
 <translation id="1395262318152388157">Controlo de deslize da procura</translation>
@@ -893,6 +895,7 @@
 <translation id="2280486287150724112">Margem direita</translation>
 <translation id="2282146716419988068">Processo GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Nova versão da Intervenção de agente do utilizador para carregamento de WebFonts.</translation>
 <translation id="2286454467119466181">Simples</translation>
 <translation id="2286950485307333924">Tem agora sessão iniciada no Chrome</translation>
 <translation id="2287590536030307392">Desligar todas as ligações sem fios.</translation>
@@ -1070,6 +1073,7 @@
 <translation id="2542049655219295786">Tabela do Google</translation>
 <translation id="2546283357679194313">Cookies e dados de Web sites</translation>
 <translation id="2549646943416322527">Detetor de Seccomp</translation>
+<translation id="2550212893339833758">Memória trocada</translation>
 <translation id="2553100941515833716">Repor o estado da instalação do App Launcher em cada reinício.</translation>
 <translation id="2553340429761841190">O <ph name="PRODUCT_NAME" /> não conseguiu estabelecer ligação a <ph name="NETWORK_ID" />. Seleccione outra rede ou tente novamente.</translation>
 <translation id="2553440850688409052">Ocultar este plug-in</translation>
@@ -1103,6 +1107,7 @@
 <translation id="2587203970400270934">Código do operador:</translation>
 <translation id="2587922270115112871">Criar utilizadores supervisionados não cria Contas Google e as definições
     e os dados desses utilizadores não serão transmitidos a outros dispositivos com a Sincronização do Google Chrome. Atualmente, os utilizadores supervisionados aplicam-se apenas a esta instalação do Chrome, neste dispositivo.</translation>
+<translation id="2594049137847833442">Opções de sites importantes na caixa de diálogo Limpar dados de navegação</translation>
 <translation id="2594056015203442344">Se ativada, os indicadores de áudio na faixa de separadores têm também a função de controlo de desativação de som dos separadores. São igualmente adicionados comandos ao menu de contexto dos separadores para a desativação rápida do som de vários separadores selecionados.</translation>
 <translation id="259421303766146093">Reduzir</translation>
 <translation id="2597852038534460976">O Chrome não consegue aceder às imagens de fundo. Ligue-se a uma rede.</translation>
@@ -1471,7 +1476,6 @@
 <translation id="3065140616557457172">Escreva para pesquisar ou introduza um URL para navegar, tudo resulta aqui.</translation>
 <translation id="3067198360141518313">Executar este plug-in</translation>
 <translation id="307519606911195071">Ative funcionalidades de acessibilidade adicionais na página Definições.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> foi criado como utilizador supervisionado!</translation>
 <translation id="3075874217500066906">É necessário reiniciar para começar o processo Powerwash. Depois do reinício, terá de confirmar que pretende prosseguir.</translation>
 <translation id="3076677906922146425">Permitir que qualquer pessoa adicione alguém ao Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1488,6 +1492,7 @@
 <translation id="3088034400796962477">Transliteração (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Mudar o nome...</translation>
 <translation id="308903551226753393">Configurar automaticamente</translation>
+<translation id="3089231390674410424">Parece que existe um problema com as suas credenciais. Certifique-se de que iniciou sessão corretamente e tente de novo.</translation>
 <translation id="3090819949319990166">Não é possível copiar o ficheiro crx externo para <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" sincronizado</translation>
 <translation id="3092544800441494315">Incluir esta captura de ecrã:</translation>
@@ -2014,7 +2019,6 @@
 <translation id="3790856258139356663">Liga ao servidor de testes para a Sincronização do Chrome.</translation>
 <translation id="3790909017043401679">Introduzir código PIN do cartão SIM</translation>
 <translation id="3792890930871100565">Desligar impressoras</translation>
-<translation id="3795681127952030401"><ph name="URL" /> pretende enviar-lhe notificações.</translation>
 <translation id="3796648294839530037">Redes favoritas:</translation>
 <translation id="3797900183766075808">Pe&amp;squisar no <ph name="SEARCH_ENGINE" /> por "<ph name="SEARCH_TERMS" />"</translation>
 <translation id="3798449238516105146">Versão</translation>
@@ -2488,6 +2492,7 @@
 <translation id="4552678318981539154">Comprar mais armazenamento</translation>
 <translation id="4554591392113183336">A extensão externa tem a mesma versão ou uma versão inferior à existente.</translation>
 <translation id="4554796861933393312">Velocidade de animação da gota de tinta do material design</translation>
+<translation id="4555670907822902621">Ativar a gravação de páginas adicionadas aos marcadores para visualização offline.</translation>
 <translation id="4555769855065597957">Sombra</translation>
 <translation id="4556110439722119938">Os marcadores, o histórico, as palavras-passe e outras definições são sincronizados com a sua Conta Google para que os possa utilizar em todos os dispositivos</translation>
 <translation id="4557136421275541763">Aviso:</translation>
@@ -2663,6 +2668,7 @@
 <translation id="4824518112777153488">Suporte para ecrãs táteis compatíveis com colocação do rato</translation>
 <translation id="4830573902900904548">O seu <ph name="DEVICE_TYPE" /> não consegue estabelecer ligação à Internet através de <ph name="NETWORK_NAME" />. Escolha outra rede. <ph name="LEARN_MORE_LINK_START" />Saiba mais<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">A identidade de <ph name="ORGANIZATION" /> em <ph name="LOCALITY" /> foi validada por <ph name="ISSUER" />. O servidor forneceu informações válidas de Transparência do certificado.</translation>
+<translation id="4832537345877333532">Desativar a obtenção de ficheiros de visualização icc a partir do Quirks Server para calibração da cor do ecrã.</translation>
 <translation id="4834912470034578916">Ativar esquemas personalizados para Notificações Web.</translation>
 <translation id="4835836146030131423">Erro ao iniciar sessão.</translation>
 <translation id="4837926214103741331">Não está autorizado a utilizar este dispositivo. Contacte o proprietário do dispositivo para obter autorização de início de sessão.</translation>
@@ -2850,6 +2856,7 @@
 <translation id="5120421890733714118">Confiar neste certificado para identificar Web sites.</translation>
 <translation id="5121130586824819730">O seu disco rígido está cheio. Guarde noutra localização ou liberte espaço no disco rígido.</translation>
 <translation id="5125751979347152379">URL inválido.</translation>
+<translation id="5126663277159826272">Desativar Quirks Client para calibração do ecrã.</translation>
 <translation id="5127881134400491887">Gerir ligações de rede</translation>
 <translation id="5128590998814119508">Lista de apresentação para telas 2D</translation>
 <translation id="512903556749061217">ligação estabelecida</translation>
@@ -2991,9 +2998,11 @@
 <translation id="5301751748813680278">Entrar como Convidado.</translation>
 <translation id="5301954838959518834">OK, já percebi</translation>
 <translation id="5302048478445481009">Idioma</translation>
+<translation id="5304039790201806037">Eventos do ponteiro</translation>
 <translation id="5305688511332277257">Nenhum instalado</translation>
 <translation id="5308380583665731573">Ligar</translation>
 <translation id="5311260548612583999">Ficheiro chave privada (opcional):</translation>
+<translation id="5313967007315987356">Adicionar site</translation>
 <translation id="5316588172263354223">Pesquisa por voz a qualquer altura</translation>
 <translation id="5316716239522500219">Espelhar monitores</translation>
 <translation id="5317780077021120954">Guardar</translation>
@@ -3297,6 +3306,7 @@
 <translation id="5734362860645681824">Comunicações</translation>
 <translation id="573719557377416048">Limpar estado de copresença</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: selecionar para editar</translation>
+<translation id="5741454054957165976">Ativar nova versão da Intervenção de agente do utilizador para carregamento de WebFonts.</translation>
 <translation id="574392208103952083">Médio</translation>
 <translation id="5745056705311424885">Memory stick USB detetado</translation>
 <translation id="5746169159649715125">Guardar como PDF</translation>
@@ -3345,7 +3355,6 @@
 <translation id="5803531701633845775">Escolher expressões anteriores, sem mover o cursor</translation>
 <translation id="5804241973901381774">Permissões</translation>
 <translation id="580571955903695899">Reordenar por título</translation>
-<translation id="5808982448801399019">Falha na autorização</translation>
 <translation id="580961539202306967">Perguntar-me quando um site pretender enviar-me mensagens push (recomendado)</translation>
 <translation id="5815645614496570556">Endereço X.400</translation>
 <translation id="5817397429773072584">Chinês Tradicional</translation>
@@ -3370,6 +3379,7 @@
 <translation id="5834581999798853053">Faltam cerca de <ph name="TIME" /> minutos</translation>
 <translation id="5838825566232597749">Workman internacional dos EUA</translation>
 <translation id="5839277899276241121">Igual ao endereço de faturação</translation>
+<translation id="5844550873065695788">Esta ação elimina permanentemente, no mínimo, <ph name="TOTAL_COUNT" /> itens deste dispositivo. Para recuperar os seus dados mais tarde, inicie sessão no Chrome como $2.</translation>
 <translation id="5846929185714966548">Separador 4</translation>
 <translation id="5848934677402291689">Gravação para PDF em curso</translation>
 <translation id="5849335628409778954">Introduzir cartão de crédito...</translation>
@@ -3614,6 +3624,7 @@
 <translation id="6232017090690406397">Bateria</translation>
 <translation id="6241530762627360640">Aceder às informações acerca dos dispositivos Bluetooth sincronizados com o seu sistema e descobrir dispositivos Bluetooth nas proximidades.</translation>
 <translation id="6243774244933267674">Servidor indisponível</translation>
+<translation id="6246413617632217567">Não foi possível importar o utilizador supervisionado. Verifique o espaço disponível no disco rígido e as autorizações e tente novamente.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Atualização pronta</translation>
 <translation id="6248400709929739064">Ativar legendas</translation>
@@ -3642,6 +3653,7 @@
 <translation id="6277518330158259200">C&amp;riar captura de ecrã</translation>
 <translation id="6279183038361895380">Premir |<ph name="ACCELERATOR" />| para mostrar o cursor</translation>
 <translation id="6280215091796946657">Iniciar sessão com uma conta diferente</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Experiência para que todas as APIs reflitam a área visível do esquema. Esta opção torna as propriedades window.scroll relativas à área visível do esquema.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nova impressora na rede}other{Novas impressoras na rede}}</translation>
 <translation id="6285395082104474418">O tabuleiro de estado mostra o estado atual da rede e da bateria, entre outros.</translation>
@@ -3697,6 +3709,7 @@
 <translation id="6380143666419481200">Aceitar e continuar</translation>
 <translation id="6380224340023442078">Definições de conteúdo...</translation>
 <translation id="6383194710567510941">Ative a utilização da API chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Esta ação elimina permanentemente, no mínimo, $1 item deste dispositivo. Para recuperar os seus dados mais tarde, inicie sessão no Chrome como $2.}other{Esta ação elimina permanentemente, no mínimo, $1 itens deste dispositivo. Para recuperar os seus dados mais tarde, inicie sessão no Chrome como $2.}}</translation>
 <translation id="6384275966486438344">Alterar as definições de pesquisa para: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">As páginas visualizadas nesta janela não serão apresentadas no histórico do navegador e não deixarão outros vestígios, como cookies, no computador depois de fechar todas as janelas de Convidado abertas. No entanto, todos os ficheiros transferidos serão preservados.</translation>
 <translation id="6391538222494443604">O directório de entrada tem de existir.</translation>
@@ -3835,6 +3848,7 @@
 <translation id="6575134580692778371">Não configurado</translation>
 <translation id="6575251558004911012">Perguntar quando um site pretender aceder à sua câmara (recomendado)</translation>
 <translation id="6579159469348633828">Codificação de conteúdo Brotli.</translation>
+<translation id="6580151766480067746">Versão do ARC</translation>
 <translation id="6581162200855843583">Link do Google Drive</translation>
 <translation id="6583070985841601920">Com sessão iniciada em <ph name="USER_EMAIL_ADDRESS" />. A sincronização foi desativada pelo seu administrador.</translation>
 <translation id="65832705307647870">Preencher automaticamente a página Novo separador com sites populares.</translation>
@@ -4001,6 +4015,7 @@
 <translation id="6847758263950452722">Guardar Página como MHTML</translation>
 <translation id="6853388645642883916">Atualizador em suspensão</translation>
 <translation id="68541483639528434">Fechar os outros separadores</translation>
+<translation id="6856701878604560493">Ativar marcadores offline</translation>
 <translation id="6860097299815761905">Definições de proxy...</translation>
 <translation id="6860427144121307915">Abrir num separador</translation>
 <translation id="6862635236584086457">Será efetuada automaticamente uma cópia de segurança online de todos os ficheiros guardados nesta pasta</translation>
@@ -4171,6 +4186,7 @@
 <translation id="7092106376816104">Exceções de pop-up</translation>
 <translation id="7093866338626856921">Trocar dados com os seguintes dispositivos: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Pretende descobrir mais funcionalidades fantásticas?</translation>
+<translation id="7096108453481049031">Não foi possível importar o utilizador supervisionado. Verifique a ligação de rede e tente novamente mais tarde.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> itens selecionados</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Comprar mais armazenamento...</translation>
@@ -4199,6 +4215,7 @@
 <translation id="713888829801648570">Lamentamos, mas não foi possível verificar a sua palavra-passe por se encontrar offline.</translation>
 <translation id="7140928199327930795">Não existem outros dispositivos disponíveis.</translation>
 <translation id="7141105143012495934">O início de sessão falhou porque não foi possível obter os detalhes da sua conta. Contacte o administrador ou tente novamente.</translation>
+<translation id="7141331524324591758">Ativa a compatibilidade experimental parcial com a API de Eventos do ponteiro. Esta ação destina-se apenas a testes por parte de programadores da Web, pelo que pode fazer com que alguns Websites fiquem ligeiramente inoperacionais.</translation>
 <translation id="7143207342074048698">A ligar</translation>
 <translation id="7144878232160441200">Repetir</translation>
 <translation id="7148311641502571842">O <ph name="PLUGIN_NAME" /> foi desativado. Para o reativar, aceda a <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4847,6 +4864,7 @@
 <translation id="8119572489781388874">Modificar definições</translation>
 <translation id="8119631488458759651">remover este Web site</translation>
 <translation id="8121385576314601440">Definições de introdução Hangul</translation>
+<translation id="8122245494004914423">Esta ação elimina permanentemente os dados de navegação deste dispositivo. Para recuperar os seus dados mais tarde, inicie sessão no Chrome como $2.</translation>
 <translation id="8124313775439841391">ONC gerido</translation>
 <translation id="8126844665673008223">Bluetooth Web</translation>
 <translation id="8127322077195964840">Permitir certificados inválidos para recursos carregados a partir do localhost.</translation>
@@ -4931,6 +4949,7 @@
 <translation id="8226742006292257240">A palavra-passe TPM abaixo foi gerada aleatoriamente e atribuída ao seu computador:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Os hackers que se encontram em <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> podem tentar instalar programas perigosos no seu computador que roubam ou eliminam as suas informações (por exemplo, fotografias, palavras-passe, mensagens e cartões de crédito).</translation>
+<translation id="8233254008506535819">Incluir a opção para adicionar sites importantes à lista de autorizações na caixa de diálogo Limpar dados de navegação.</translation>
 <translation id="8236231079192337250">Aplicação Galeria da Web Store do Chrome para controladores de impressora</translation>
 <translation id="8238649969398088015">Sugestão de ajuda</translation>
 <translation id="8240697550402899963">Utilizar o tema Clássico</translation>
@@ -5254,7 +5273,6 @@
 <translation id="8708671767545720562">&amp;Mais Informações</translation>
 <translation id="8711402221661888347">Picles</translation>
 <translation id="8711453844311572806">Quando o telemóvel estiver desbloqueado e próximo, basta clicar para aceder; caso contrário, vê um ícone de bloqueio e tem de introduzir a palavra-passe.</translation>
-<translation id="8712637175834984815">Entendido</translation>
 <translation id="8713570323158206935">Enviar <ph name="BEGIN_LINK1" />informações do sistema<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Ative a correção automática do teclado físico para teclado dos EUA, o qual pode fornecer sugestões à medida que escreve no teclado físico.</translation>
 <translation id="871476437400413057">Palavras-passe guardadas do Google</translation>
@@ -5617,6 +5635,7 @@
 <translation id="952992212772159698">Não activado</translation>
 <translation id="953000875543358078">Esta ação pode demorar até cerca de um minuto</translation>
 <translation id="960987915827980018">Falta cerca de 1 hora</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Esta ação elimina permanentemente $1 item deste dispositivo. Para recuperar os seus dados mais tarde, inicie sessão no Chrome como $2.}other{Esta ação elimina permanentemente $1 itens deste dispositivo. Para recuperar os seus dados mais tarde, inicie sessão no Chrome como $2.}}</translation>
 <translation id="96421021576709873">Rede Wi-Fi</translation>
 <translation id="965490406356730238">Ative a descodificação de mjpeg acelerada por hardware para frame capturado quando disponível.</translation>
 <translation id="968174221497644223">Cache da aplicação</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 4f90390..86af0165 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -142,7 +142,7 @@
 <translation id="1196789802623400962">Activează/Dezactivează opțiunea de editare gestuală în pagina de setări pentru tastatura virtuală.</translation>
 <translation id="1196849605089373692">Specifică setarea de calitate pentru imaginile capturate, în cazul în care se reduce calitatea.</translation>
 <translation id="1197199342062592414">Să începem</translation>
-<translation id="119738088725604856">Fereastra cu captura de ecran</translation>
+<translation id="119738088725604856">Face o captură de ecran a ferestrei</translation>
 <translation id="1197979282329025000">A apărut o eroare la preluarea caracteristicilor imprimantei <ph name="PRINTER_NAME" />. Această imprimantă nu a putut fi înregistrată la <ph name="CLOUD_PRINT_NAME" />.</translation>
 <translation id="1198271701881992799">Să începem</translation>
 <translation id="1199232041627643649">Pentru a ieși, ține apăsată tasta <ph name="KEY_EQUIVALENT" />.</translation>
@@ -251,6 +251,7 @@
       Reține că funcția Bluetooth va fi activată pentru toate dispozitivele compatibile ale utilizatorului <ph name="USER_DISPLAY_EMAIL" />, iar unele informații despre hardware vor fi trimise către Google. &lt;a&gt;Află mai multe&lt;/a&gt;</translation>
 <translation id="13649080186077898">Gestionează setările de completare automată</translation>
 <translation id="1367951781824006909">Alege un fișier</translation>
+<translation id="136802136832547685">Nu există niciun utilizator monitorizat de adăugat pe acest dispozitiv.</translation>
 <translation id="1368265273904755308">Semnalați o problemă</translation>
 <translation id="1368832886055348810">De la stânga la dreapta</translation>
 <translation id="1370646789215800222">Elimini persoana?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Caută</translation>
 <translation id="1384211230590313258">Handler de descoperire a serviciului</translation>
 <translation id="1386387014181100145">Bună ziua.</translation>
+<translation id="1386830813511981192">Peste un milion de aplicații și jocuri sunt disponibile acum pe <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Aceasta poate fi adăugată numai din <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Deschideți ca filă obișnuită</translation>
 <translation id="1395262318152388157">Glisor pentru căutare</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">Margine la dreapta</translation>
 <translation id="2282146716419988068">Proces GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">O versiune nouă pentru Intervenția user agent pentru încărcarea WebFonts.</translation>
 <translation id="2286454467119466181">Simplă</translation>
 <translation id="2286950485307333924">Acum te-ai conectat la Chrome</translation>
 <translation id="2287590536030307392">Dezactivați toate conexiunile wireless.</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">Tabel Google</translation>
 <translation id="2546283357679194313">Cookie-uri și date privind site-ul</translation>
 <translation id="2549646943416322527">Detectorul Seccomp</translation>
+<translation id="2550212893339833758">Dimensiunea memoriei de swap</translation>
 <translation id="2553100941515833716">Resetați starea de instalare a Lansatorului de aplicații la fiecare repornire.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> nu s-a putut conecta la <ph name="NETWORK_ID" />. Selectează altă rețea sau încearcă din nou.</translation>
 <translation id="2553440850688409052">Ascunde acest plugin</translation>
@@ -1102,6 +1106,7 @@
 <translation id="2587203970400270934">Cod operator:</translation>
 <translation id="2587922270115112871">Prin crearea unui utilizator monitorizat, nu se creează un Cont Google, iar setările și datele acestuia
     nu vor fi preluate pe alte dispozitive cu Sincronizarea Chrome. Un utilizator monitorizat se aplică numai pentru acest dispozitiv.</translation>
+<translation id="2594049137847833442">Opțiuni pentru site-uri importante în caseta de dialog Șterge datele de navigare</translation>
 <translation id="2594056015203442344">Când este activat, indicatorii audio din bara de file au și rol de comenzi de dezactivare a sunetului filei. Această opțiune adaugă, de asemenea, comenzi în meniul contextual al filei pentru dezactivarea rapidă a sunetelor multiplelor file selectate.</translation>
 <translation id="259421303766146093">Micșorează</translation>
 <translation id="2597852038534460976">Chrome nu poate accesa imaginile de fundal. Conectați-vă la o rețea.</translation>
@@ -1469,7 +1474,6 @@
 <translation id="3065140616557457172">Tastează pentru a căuta sau introdu o adresă URL pentru a naviga. Orice variantă funcționează.</translation>
 <translation id="3067198360141518313">Rulează acest plugin</translation>
 <translation id="307519606911195071">Activează funcții suplimentare de accesibilitate pe pagina Setări.</translation>
-<translation id="3075239840551149663">Utilizatorul monitorizat <ph name="NEW_PROFILE_NAME" /> a fost creat!</translation>
 <translation id="3075874217500066906">Este necesară o repornire pentru a începe procesul de Powerwash. După repornire, ți se va solicita să confirmi dacă dorești să continui.</translation>
 <translation id="3076677906922146425">Permite oricui să adauge o persoană în Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1486,6 +1490,7 @@
 <translation id="3088034400796962477">Transliterație (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Redenumiți...</translation>
 <translation id="308903551226753393">Configurați automat</translation>
+<translation id="3089231390674410424">Se pare că a apărut o problemă privind datele de conectare. Asigură-te că te-ai conectat corect și încearcă din nou.</translation>
 <translation id="3090819949319990166">Fișierul crx extern nu se poate copia în <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">„<ph name="DEVICE_NAME" />” conectată</translation>
 <translation id="3092544800441494315">Include această captură de ecran:</translation>
@@ -2012,7 +2017,6 @@
 <translation id="3790856258139356663">Se conectează la serverul de testare pentru Sincronizare Chrome.</translation>
 <translation id="3790909017043401679">Introdu codul PIN al cardului SIM</translation>
 <translation id="3792890930871100565">Deconectați imprimantele</translation>
-<translation id="3795681127952030401"><ph name="URL" /> dorește să îți trimită notificări.</translation>
 <translation id="3796648294839530037">Rețele preferate:</translation>
 <translation id="3797900183766075808">&amp;Caută „<ph name="SEARCH_TERMS" />” pe <ph name="SEARCH_ENGINE" /></translation>
 <translation id="3798449238516105146">Versiune</translation>
@@ -2486,6 +2490,7 @@
 <translation id="4552678318981539154">Cumpărați mai mult spațiu de stocare</translation>
 <translation id="4554591392113183336">Extensia externă este în aceeași versiune sau într-o versiune inferioară celei existente.</translation>
 <translation id="4554796861933393312">Viteza animației pentru picătura de cerneală în designul material</translation>
+<translation id="4555670907822902621">Activează salvarea paginilor marcate pentru vizualizarea offline.</translation>
 <translation id="4555769855065597957">Umbră</translation>
 <translation id="4556110439722119938">Marcajele, istoricul, parolele și alte setări vor fi sincronizate cu Contul Google, pentru a le putea folosi pe toate dispozitivele</translation>
 <translation id="4557136421275541763">Avertisment:</translation>
@@ -2661,6 +2666,7 @@
 <translation id="4824518112777153488">Compatibilitatea cu ecranele tactile care acceptă plasarea cursorului asupra elementelor active</translation>
 <translation id="4830573902900904548">Dispozitivul <ph name="DEVICE_TYPE" /> nu se poate conecta la internet folosind <ph name="NETWORK_NAME" />. Alege altă rețea. <ph name="LEARN_MORE_LINK_START" />Află mai multe<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Identitatea organizației <ph name="ORGANIZATION" /> din <ph name="LOCALITY" /> a fost confirmată de <ph name="ISSUER" />. Serverul a oferit informații valide privind Certificate Transparency.</translation>
+<translation id="4832537345877333532">Dezactivează preluarea fișierelor de afișare icc din Quirks Server pentru calibrarea culorilor afișajului.</translation>
 <translation id="4834912470034578916">Activează aspectele personalizate pentru Notificările web.</translation>
 <translation id="4835836146030131423">Eroare la accesarea contului.</translation>
 <translation id="4837926214103741331">Nu ești autorizat(ă) să folosești acest dispozitiv. Contactează proprietarul dispozitivului pentru permisiunea de conectare.</translation>
@@ -2848,6 +2854,7 @@
 <translation id="5120421890733714118">Aveți încredere în acest certificat pentru identificarea site-urilor web.</translation>
 <translation id="5121130586824819730">Hard diskul este plin. Salvați în altă locație sau eliberați mai mult spațiu pe hard disk.</translation>
 <translation id="5125751979347152379">Adresă URL nevalidă.</translation>
+<translation id="5126663277159826272">Dezactivează Quirks Client pentru calibrarea afișajului.</translation>
 <translation id="5127881134400491887">Gestionează conexiunile de rețea</translation>
 <translation id="5128590998814119508">Obiectele Canvas 2D pentru listele de afișare</translation>
 <translation id="512903556749061217">conectat</translation>
@@ -2989,9 +2996,11 @@
 <translation id="5301751748813680278">Se conectează ca invitat.</translation>
 <translation id="5301954838959518834">OK, am înțeles</translation>
 <translation id="5302048478445481009">Limbă</translation>
+<translation id="5304039790201806037">Pointer Events</translation>
 <translation id="5305688511332277257">Niciunul instalat</translation>
 <translation id="5308380583665731573">Conectează-te</translation>
 <translation id="5311260548612583999">Fișier cheie privată (opțional):</translation>
+<translation id="5313967007315987356">Adaugă un site</translation>
 <translation id="5316588172263354223">Căutare vocală, oricând</translation>
 <translation id="5316716239522500219">Oglindiți monitoarele</translation>
 <translation id="5317780077021120954">Salvează</translation>
@@ -3294,6 +3303,7 @@
 <translation id="5734362860645681824">Comunicații</translation>
 <translation id="573719557377416048">Șterge starea de coprezență</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: selectează pentru a edita</translation>
+<translation id="5741454054957165976">Activează noua versiune pentru Intervenția user agent pentru încărcarea WebFonts.</translation>
 <translation id="574392208103952083">Medie</translation>
 <translation id="5745056705311424885">A fost detectat un stick de memorie USB</translation>
 <translation id="5746169159649715125">Salvați ca PDF</translation>
@@ -3342,7 +3352,6 @@
 <translation id="5803531701633845775">Alege expresii din fundal, fără să miști cursorul</translation>
 <translation id="5804241973901381774">Permisiuni</translation>
 <translation id="580571955903695899">Reordonați după titlu</translation>
-<translation id="5808982448801399019">Autorizarea nu a reușit</translation>
 <translation id="580961539202306967">Notifică-mă dacă un site dorește să trimită mesaje push (recomandat)</translation>
 <translation id="5815645614496570556">Adresă X.400</translation>
 <translation id="5817397429773072584">Chineză tradițională</translation>
@@ -3367,6 +3376,7 @@
 <translation id="5834581999798853053">Au mai rămas aproape <ph name="TIME" /> min.</translation>
 <translation id="5838825566232597749">Tastatură S.U.A. Workman internațională</translation>
 <translation id="5839277899276241121">La fel ca adresa de facturare</translation>
+<translation id="5844550873065695788">Astfel, vor fi șterse definitiv cel puțin <ph name="TOTAL_COUNT" /> (de) elemente de pe acest dispozitiv. Pentru a recupera datele mai târziu, conectează-te la Chrome ca $2.</translation>
 <translation id="5846929185714966548">Fila 4</translation>
 <translation id="5848934677402291689">Se salvează în format PDF</translation>
 <translation id="5849335628409778954">Introduceți informațiile cardului de credit...</translation>
@@ -3611,6 +3621,7 @@
 <translation id="6232017090690406397">Baterie</translation>
 <translation id="6241530762627360640">Accesează informațiile despre dispozitivele Bluetooth conectate cu sistemul dvs. și descoperă dispozitivele Bluetooth din apropiere.</translation>
 <translation id="6243774244933267674">Server indisponibil</translation>
+<translation id="6246413617632217567">Utilizatorul monitorizat nu a putut fi importat. Verifică spațiul de pe hard disk și permisiunile, apoi încearcă din nou.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" /> %</translation>
 <translation id="624789221780392884">Actualizarea este pregătită</translation>
 <translation id="6248400709929739064">Activează subtitrările</translation>
@@ -3639,6 +3650,7 @@
 <translation id="6277518330158259200">F&amp;aceți o captură de ecran</translation>
 <translation id="6279183038361895380">Apasă pe |<ph name="ACCELERATOR" />| pentru a fi afișat cursorul</translation>
 <translation id="6280215091796946657">Conectează-te cu alt cont</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Un experiment prin care toate API-urile reflectă spațiul vizibil înconjurător. Astfel, proprietățile de derulare a ferestrei vor fi definite în raport cu spațiul vizibil înconjurător.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Imprimantă nouă în rețea}few{Imprimante noi în rețea}other{Imprimante noi în rețea}}</translation>
 <translation id="6285395082104474418">Bara de stare vă arată starea actuală a rețelei, a bateriei și alte informații.</translation>
@@ -3694,6 +3706,7 @@
 <translation id="6380143666419481200">Acceptați și continuați</translation>
 <translation id="6380224340023442078">Setări privind conținutul...</translation>
 <translation id="6383194710567510941">Activează folosirea API-ului chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Astfel, va fi șters definitiv cel puțin $1 element de pe acest dispozitiv. Pentru a recupera datele mai târziu, conectează-te la Chrome ca $2.}few{Astfel, vor fi șterse definitiv cel puțin $1 elemente de pe acest dispozitiv. Pentru a recupera datele mai târziu, conectează-te la Chrome ca $2.}other{Astfel, vor fi șterse definitiv cel puțin $1 de elemente de pe acest dispozitiv. Pentru a recupera datele mai târziu, conectează-te la Chrome ca $2.}}</translation>
 <translation id="6384275966486438344">Schimbați setările de căutare la: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Paginile pe care le accesați în această fereastră nu vor apărea în istoricul browserului și nu vor lăsa alte urme pe computer (de ex., cookie-uri) după ce închideți toate ferestrele deschise în modul Invitat. Cu toate acestea, fișierele pe care le descărcați vor fi păstrate.</translation>
 <translation id="6391538222494443604">Directorul de intrare trebuie să existe.</translation>
@@ -3832,6 +3845,7 @@
 <translation id="6575134580692778371">Nu este configurată</translation>
 <translation id="6575251558004911012">Notifică-mă dacă un site solicită acces la cameră (recomandat)</translation>
 <translation id="6579159469348633828">Brotli Content-Encoding.</translation>
+<translation id="6580151766480067746">Versiunea ARC</translation>
 <translation id="6581162200855843583">Link Disc Google</translation>
 <translation id="6583070985841601920">Sunteți conectat(ă) ca <ph name="USER_EMAIL_ADDRESS" />. Sincronizarea este dezactivată de administrator.</translation>
 <translation id="65832705307647870">Populează anticipat pagina Filă nouă cu site-uri populare.</translation>
@@ -3997,6 +4011,7 @@
 <translation id="6847758263950452722">Salvați pagina ca MHTML</translation>
 <translation id="6853388645642883916">Utilitarul de actualizare este inactiv</translation>
 <translation id="68541483639528434">Închide celelalte file</translation>
+<translation id="6856701878604560493">Activează marcajele offline</translation>
 <translation id="6860097299815761905">Setări proxy...</translation>
 <translation id="6860427144121307915">Deschideți într-o filă</translation>
 <translation id="6862635236584086457">Pentru toate fișierele salvate în acest dosar se creează copii de rezervă online în mod automat</translation>
@@ -4168,6 +4183,7 @@
 <translation id="7092106376816104">Excepții privind ferestrele de tip pop-up</translation>
 <translation id="7093866338626856921">Fă schimb de date cu dispozitivele numite: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Doriți să descoperiți mai multe funcții extraordinare?</translation>
+<translation id="7096108453481049031">Utilizatorul monitorizat nu a putut fi importat. Verifică conexiunea la rețea și încearcă din nou mai târziu.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> (de) elemente selectate</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Cumpărați mai mult spațiu de stocare...</translation>
@@ -4196,6 +4212,7 @@
 <translation id="713888829801648570">Ne pare rău. Parola nu a putut fi verificată pentru că ești offline.</translation>
 <translation id="7140928199327930795">Nu există alte dispozitive disponibile.</translation>
 <translation id="7141105143012495934">Nu s-a conectat, deoarece nu s-au putut prelua detaliile contului. Contactează administratorul sau încearcă din nou.</translation>
+<translation id="7141331524324591758">Activează compatibilitatea experimentală parțială pentru API-ul Pointer Events. Acțiune indicată numai pentru testarea de dezvoltatorii web. Aceasta va cauza probleme ușoare unor site-uri.</translation>
 <translation id="7143207342074048698">Se conectează</translation>
 <translation id="7144878232160441200">Reîncearcă</translation>
 <translation id="7148311641502571842">Pluginul <ph name="PLUGIN_NAME" /> a fost dezactivat. Pentru a-l reactiva, accesați <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4844,6 +4861,7 @@
 <translation id="8119572489781388874">Modifică setările</translation>
 <translation id="8119631488458759651">elimină acest site</translation>
 <translation id="8121385576314601440">Setări de introducere Hangul</translation>
+<translation id="8122245494004914423">Astfel, vor fi șterse definitiv datele de navigare de pe acest dispozitiv. Pentru a recupera datele mai târziu, conectează-te la Chrome ca $2.</translation>
 <translation id="8124313775439841391">Proprietăți ONC gestionate</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Permite certificate nevalide pentru resurse încărcate din gazda locală.</translation>
@@ -4928,6 +4946,7 @@
 <translation id="8226742006292257240">Mai jos se află parola TPM generată aleatoriu, care a fost atribuită computerului tău:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Atacatorii de pe <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> pot încerca să instaleze programe periculoase pe computerul dvs., care să vă fure sau să vă șteargă informațiile (de exemplu, fotografiile, parolele, mesajele sau informațiile despre cardurile de credit).</translation>
+<translation id="8233254008506535819">Include opțiunea de a trece în lista albă site-uri importante în caseta de dialog Șterge datele de navigare.</translation>
 <translation id="8236231079192337250">Aplicația Galeria Magazinului web Chrome pentru driverele de imprimantă</translation>
 <translation id="8238649969398088015">Sfat de ajutor</translation>
 <translation id="8240697550402899963">Folosește tema clasică</translation>
@@ -5251,7 +5270,6 @@
 <translation id="8708671767545720562">&amp;Mai multe informații</translation>
 <translation id="8711402221661888347">Murături</translation>
 <translation id="8711453844311572806">Când telefonul este deblocat și în apropiere, pentru acces, trebuie doar să dai clic. În caz contrar, se va afișa o pictogramă blocată și va trebui să introduci parola.</translation>
-<translation id="8712637175834984815">Am înțeles</translation>
 <translation id="8713570323158206935">Trimiteți <ph name="BEGIN_LINK1" />informații de sistem<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Activează corectarea automată pentru tastatura fizică S.U.A., care poate oferi sugestii pe măsură ce tastezi pe tastatura fizică.</translation>
 <translation id="871476437400413057">Parole Google salvate</translation>
@@ -5614,6 +5632,7 @@
 <translation id="952992212772159698">Neactivat</translation>
 <translation id="953000875543358078">Poate dura câteva minute</translation>
 <translation id="960987915827980018">A mai rămas aproape 1 oră</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Astfel, va fi șters definitiv $1 element de pe acest dispozitiv. Pentru a recupera datele mai târziu, conectează-te la Chrome ca $2.}few{Astfel, vor fi șterse definitiv $1 elemente de pe acest dispozitiv. Pentru a recupera datele mai târziu, conectează-te la Chrome ca $2.}other{Astfel, vor fi șterse definitiv $1 de elemente de pe acest dispozitiv. Pentru a recupera datele mai târziu, conectează-te la Chrome ca $2.}}</translation>
 <translation id="96421021576709873">Rețea Wi-Fi</translation>
 <translation id="965490406356730238">Activează decodificarea mjpeg cu accelerare hardware pentru cadrul capturat, unde este disponibilă.</translation>
 <translation id="968174221497644223">Memoria cache a aplicației</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 186f9f2..00efd1c1 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -251,6 +251,7 @@
         Учтите, что Bluetooth будет включен на всех устройствах, связанных с аккаунтом <ph name="USER_DISPLAY_EMAIL" />, а некоторые аппаратные данные будут переданы в Google. &lt;a&gt;Подробнее...&lt;/a&gt;</translation>
 <translation id="13649080186077898">Настроить</translation>
 <translation id="1367951781824006909">Выберите файл</translation>
+<translation id="136802136832547685">Контролируемых профилей нет.</translation>
 <translation id="1368265273904755308">Сообщить о проблеме</translation>
 <translation id="1368832886055348810">Слева направо</translation>
 <translation id="1370646789215800222">Удалить пользователя?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Поиск</translation>
 <translation id="1384211230590313258">Обработчик обнаружения сервисов</translation>
 <translation id="1386387014181100145">Привет!</translation>
+<translation id="1386830813511981192">Более миллиона приложений и игр теперь доступны на вашем устройстве <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Это приложение или расширение можно установить только из сервиса "<ph name="CHROME_WEB_STORE" />".</translation>
 <translation id="1390548061267426325">Открыть в обычной вкладке</translation>
 <translation id="1395262318152388157">Ползунок воспроизведения</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">Правое поле</translation>
 <translation id="2282146716419988068">Процесс GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Разрешить агенту пользователя вмешиваться в загрузку WebFonts (функция обновлена)</translation>
 <translation id="2286454467119466181">Упрощенный интерфейс</translation>
 <translation id="2286950485307333924">Вы вошли в Chrome</translation>
 <translation id="2287590536030307392">Отключить все беспроводные подключения.</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">Таблица Google</translation>
 <translation id="2546283357679194313">Файлы сookie и данные сайтов</translation>
 <translation id="2549646943416322527">Детектор Seccomp</translation>
+<translation id="2550212893339833758">Память подкачки</translation>
 <translation id="2553100941515833716">Сбрасывать состояние установки Панели запуска приложений при каждом перезапуске</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> не удалось подключиться к <ph name="NETWORK_ID" />. Выберите другую сеть или повторите попытку.</translation>
 <translation id="2553440850688409052">Скрыть подключаемый модуль</translation>
@@ -1104,6 +1108,7 @@
     Данные и настройки профиля нельзя перенести на другие устройства с
     помощью функции Chrome Sync. Контролируемый профиль можно
     использовать только на этом устройстве.</translation>
+<translation id="2594049137847833442">Разрешить выбирать важные сайты в окне очистки истории</translation>
 <translation id="2594056015203442344">Отключение и включение звука при помощи аудиоиндикаторов на панели вкладок, а также добавление в контекстное меню команд для отключения звука на выбранных вкладках.</translation>
 <translation id="259421303766146093">Уменьшение</translation>
 <translation id="2597852038534460976">Chrome не может открыть список обоев. Подключитесь к сети.</translation>
@@ -1471,7 +1476,6 @@
 <translation id="3065140616557457172">Введите поисковый запрос или напечатайте URL, по которому надо перейти, – все просто работает.</translation>
 <translation id="3067198360141518313">Запустить подключаемый модуль</translation>
 <translation id="307519606911195071">Включает дополнительные специальные возможности на странице "Настройки".</translation>
-<translation id="3075239840551149663">Создан новый контролируемый профиль: <ph name="NEW_PROFILE_NAME" />!</translation>
 <translation id="3075874217500066906">Для запуска процесса Powerwash необходимо перезагрузить устройство. После этого появится запрос подтверждения.</translation>
 <translation id="3076677906922146425">Разрешить всем создавать профили пользователей в Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1488,6 +1492,7 @@
 <translation id="3088034400796962477">Транслитерация (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Переименовать</translation>
 <translation id="308903551226753393">Настраивать автоматически</translation>
+<translation id="3089231390674410424">Похоже, вы указали недействительные учетные данные. Проверьте их и повторите попытку.</translation>
 <translation id="3090819949319990166">Не удалось скопировать внешний файл CRX в <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">Подключено устройство: <ph name="DEVICE_NAME" /></translation>
 <translation id="3092544800441494315">Включить этот снимок экрана:</translation>
@@ -2014,7 +2019,6 @@
 <translation id="3790856258139356663">Подключиться к тестовому серверу для синхронизации Chrome.</translation>
 <translation id="3790909017043401679">Введите PIN-код SIM-карты</translation>
 <translation id="3792890930871100565">Удалить принтеры</translation>
-<translation id="3795681127952030401"><ph name="URL" /> собирается отправлять вам оповещения.</translation>
 <translation id="3796648294839530037">Избранные сети:</translation>
 <translation id="3797900183766075808">&amp;Найти "<ph name="SEARCH_TERMS" />" в <ph name="SEARCH_ENGINE" /></translation>
 <translation id="3798449238516105146">Версия</translation>
@@ -2488,6 +2492,7 @@
 <translation id="4552678318981539154">Приобретите дополнительное пространство</translation>
 <translation id="4554591392113183336">Внешнее расширение не новее существующего.</translation>
 <translation id="4554796861933393312">Скорость анимации для чернильного пятна в Material Design</translation>
+<translation id="4555670907822902621">Разрешить сохранять закладки для просмотра в офлайн-режиме</translation>
 <translation id="4555769855065597957">Тень</translation>
 <translation id="4556110439722119938">Пароли, закладки, история и другие параметры будут синхронизированы с аккаунтом Google, чтобы у вас был доступ к ним на любом устройстве.</translation>
 <translation id="4557136421275541763">Внимание!</translation>
@@ -2664,6 +2669,7 @@
 <translation id="4824518112777153488">Поддержка сенсорных экранов, на которых доступна функция наведения</translation>
 <translation id="4830573902900904548">Устройству <ph name="DEVICE_TYPE" /> не удается подключиться к Интернету по сети <ph name="NETWORK_NAME" />. Выберите другую сеть. <ph name="LEARN_MORE_LINK_START" />Подробнее…<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Идентификационные данные компании <ph name="ORGANIZATION" /> (<ph name="LOCALITY" />) подтверждены <ph name="ISSUER" />. Сведения о временных метках сертификатов предоставлены сервером и являются действительными.</translation>
+<translation id="4832537345877333532">Запретить получение ICC-файлов от Quirks Server для цветовой калибровки дисплея</translation>
 <translation id="4834912470034578916">Включить пользовательские раскладки для Web Notifications</translation>
 <translation id="4835836146030131423">Ошибка при входе.</translation>
 <translation id="4837926214103741331">У вас нет доступа к этому устройству. Свяжитесь с его владельцем.</translation>
@@ -2851,6 +2857,7 @@
 <translation id="5120421890733714118">Доверять этому сертификату при идентификации сайтов.</translation>
 <translation id="5121130586824819730">Недостаточно места на диске. Выберите другой каталог или освободите место на диске.</translation>
 <translation id="5125751979347152379">Недопустимый URL.</translation>
+<translation id="5126663277159826272">Запретить использование Quirks Client для калибровки дисплея</translation>
 <translation id="5127881134400491887">Управление сетевыми подключениями</translation>
 <translation id="5128590998814119508">Список отображения двухмерных элементов canvas</translation>
 <translation id="512903556749061217">подключено</translation>
@@ -2992,9 +2999,11 @@
 <translation id="5301751748813680278">Вы входите как гость.</translation>
 <translation id="5301954838959518834">ОК</translation>
 <translation id="5302048478445481009">Язык</translation>
+<translation id="5304039790201806037">События, связанные с указателем</translation>
 <translation id="5305688511332277257">Не установлено</translation>
 <translation id="5308380583665731573">Подключение</translation>
 <translation id="5311260548612583999">Файл закрытого ключа (необязательно):</translation>
+<translation id="5313967007315987356">Добавить сайт</translation>
 <translation id="5316588172263354223">Удобное управление голосом</translation>
 <translation id="5316716239522500219">Дублировать изображения на мониторах</translation>
 <translation id="5317780077021120954">Сохранить</translation>
@@ -3297,6 +3306,7 @@
 <translation id="5734362860645681824">Оборудование</translation>
 <translation id="573719557377416048">Удалить данные об устройствах поблизости</translation>
 <translation id="5741245087700236983">Редактировать профиль "<ph name="PROFILE_NAME" />"</translation>
+<translation id="5741454054957165976">Разрешать агенту пользователя вмешиваться в загрузку WebFonts (функция обновлена)</translation>
 <translation id="574392208103952083">Средний</translation>
 <translation id="5745056705311424885">Обнаружен USB-накопитель</translation>
 <translation id="5746169159649715125">Сохранить как PDF</translation>
@@ -3345,7 +3355,6 @@
 <translation id="5803531701633845775">Выбрать фразы в конце без перемещения курсора</translation>
 <translation id="5804241973901381774">Разрешения</translation>
 <translation id="580571955903695899">Упорядочить по заголовкам</translation>
-<translation id="5808982448801399019">Ошибка авторизации</translation>
 <translation id="580961539202306967">Спрашивать, если сайт собирается отправлять push-сообщения (рекомендуется)</translation>
 <translation id="5815645614496570556">Адрес X.400</translation>
 <translation id="5817397429773072584">Китайский (традиционный)</translation>
@@ -3370,6 +3379,7 @@
 <translation id="5834581999798853053">Осталось <ph name="TIME" /> мин.</translation>
 <translation id="5838825566232597749">США (Workman, международная)</translation>
 <translation id="5839277899276241121">Совпадает с платежным адресом</translation>
+<translation id="5844550873065695788">С устройства будет удалено несколько объектов (не менее <ph name="TOTAL_COUNT" />). Чтобы впоследствии загрузить данные, войдите в Chrome как $2.</translation>
 <translation id="5846929185714966548">Вкладка 4</translation>
 <translation id="5848934677402291689">Сохранение...</translation>
 <translation id="5849335628409778954">Ввести данные карты…</translation>
@@ -3614,6 +3624,7 @@
 <translation id="6232017090690406397">Аккумулятор</translation>
 <translation id="6241530762627360640">Доступ к информации об устройствах Bluetooth, связанных с вашей системой, и обнаружение устройств Bluetooth рядом с вами.</translation>
 <translation id="6243774244933267674">Сервер недоступен</translation>
+<translation id="6246413617632217567">Не удалось импортировать контролируемый профиль. Убедитесь, что у вас есть необходимые разрешения и свободное место на жестком диске, а затем повторите попытку.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Обновление готово</translation>
 <translation id="6248400709929739064">Включить субтитры</translation>
@@ -3642,6 +3653,7 @@
 <translation id="6277518330158259200">С&amp;делать снимок экрана</translation>
 <translation id="6279183038361895380">Чтобы показать курсор, нажмите |<ph name="ACCELERATOR" />|</translation>
 <translation id="6280215091796946657">Войти в другой аккаунт</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Экспериментальная функция. Позволяет всем API учитывать размер области просмотра, вследствие чего свойства window.scroll будут соотноситься с областью просмотра макета.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Новый принтер в сети}one{Новые принтеры в сети}few{Новые принтеры в сети}many{Новые принтеры в сети}other{Новые принтеры в сети}}</translation>
 <translation id="6285395082104474418">В строке состояния отображаются статус подключения к сети, уровень заряда батареи и другие сведения.</translation>
@@ -3697,6 +3709,7 @@
 <translation id="6380143666419481200">Принять условия и продолжить</translation>
 <translation id="6380224340023442078">Настройки контента...</translation>
 <translation id="6383194710567510941">Включить API chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{С устройства будет удалено не менее $1 объекта. Чтобы впоследствии загрузить данные, войдите в Chrome как $2.}one{С устройства будет удалено не менее $1 объекта. Чтобы впоследствии загрузить данные, войдите в Chrome как $2.}few{С устройства будет удалено не менее $1 объектов. Чтобы впоследствии загрузить данные, войдите в Chrome как $2.}many{С устройства будет удалено не менее $1 объектов. Чтобы впоследствии загрузить данные, войдите в Chrome как $2.}other{С устройства будет удалено не менее $1 объекта. Чтобы впоследствии загрузить данные, войдите в Chrome как $2.}}</translation>
 <translation id="6384275966486438344">Использование поисковой системы <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Страницы, открытые в гостевом режиме, не сохранятся в истории браузера и не оставят на компьютере следов, таких как файлы cookie. После того как вы их закроете, будут сохранены только скачанные вами файлы.</translation>
 <translation id="6391538222494443604">Каталог входа должен существовать.</translation>
@@ -3835,6 +3848,7 @@
 <translation id="6575134580692778371">Не настроено</translation>
 <translation id="6575251558004911012">Спрашивать, если сайт пытается получить доступ к камере (рекомендуется)</translation>
 <translation id="6579159469348633828">Алгоритм Brotli для кодирования контента</translation>
+<translation id="6580151766480067746">Версия ARC</translation>
 <translation id="6581162200855843583">Ссылка на Google Диск</translation>
 <translation id="6583070985841601920">Выполнен вход в аккаунт <ph name="USER_EMAIL_ADDRESS" />. Синхронизация отключена администратором.</translation>
 <translation id="65832705307647870">Показывать популярные сайты на странице быстрого доступа.</translation>
@@ -4000,6 +4014,7 @@
 <translation id="6847758263950452722">Сохранить страницу в формате MHTML</translation>
 <translation id="6853388645642883916">Программа обновлений перешла в спящий режим</translation>
 <translation id="68541483639528434">Закрыть другие вкладки</translation>
+<translation id="6856701878604560493">Разрешить офлайн-просмотр закладок</translation>
 <translation id="6860097299815761905">Настройки прокси-сервера...</translation>
 <translation id="6860427144121307915">Открыть в новой вкладке</translation>
 <translation id="6862635236584086457">Для всех файлов, сохраненных в этой папке, автоматически создается резервная копия в Интернете</translation>
@@ -4172,6 +4187,7 @@
 <translation id="7092106376816104">Исключения для всплывающих окон</translation>
 <translation id="7093866338626856921">Обмен данными с устройствами <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Хотите узнать больше о функциях Chrome?</translation>
+<translation id="7096108453481049031">Не удалось импортировать контролируемый профиль. Проверьте подключение к сети и повторите попытку позже.</translation>
 <translation id="7100897339030255923">Выбрано элементов: <ph name="COUNT" /></translation>
 <translation id="710227449793100220">Token Binding</translation>
 <translation id="7106346894903675391">Приобрести дополнительное пространство…</translation>
@@ -4200,6 +4216,7 @@
 <translation id="713888829801648570">Невозможно подтвердить пароль в офлайн-режиме.</translation>
 <translation id="7140928199327930795">Нет других доступных устройств.</translation>
 <translation id="7141105143012495934">Ошибка входа: не удалось получить данные аккаунта. Обратитесь к администратору или повторите попытку.</translation>
+<translation id="7141331524324591758">Включить частичную экспериментальную поддержку Pointer Events API. Функция предназначена только для веб-разработчиков и может повлиять на работу некоторых веб-сайтов.</translation>
 <translation id="7143207342074048698">Подключение</translation>
 <translation id="7144878232160441200">Повторить попытку</translation>
 <translation id="7148311641502571842">Плагин <ph name="PLUGIN_NAME" /> отключен. Чтобы включить его, перейдите по ссылке <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4848,6 +4865,7 @@
 <translation id="8119572489781388874">Изменить настройки</translation>
 <translation id="8119631488458759651">удалить этот сайт</translation>
 <translation id="8121385576314601440">Настройки для способа ввода хангыль</translation>
+<translation id="8122245494004914423">Все данные о работе в браузере будут удалены с устройства. Чтобы впоследствии загрузить их, войдите в Chrome как $2.</translation>
 <translation id="8124313775439841391">Управляемый ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Разрешить использовать недействительные сертификаты для ресурсов, загруженных с сервера localhost</translation>
@@ -4932,6 +4950,7 @@
 <translation id="8226742006292257240">Этот модуль случайным образом сгенерировал для вашего компьютера следующий пароль:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" /> и <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Сайт <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> может установить на ваш компьютер вредоносное ПО, которое крадет или удаляет личную информацию (например, фотографии, пароли, сообщения и реквизиты банковских карт).</translation>
+<translation id="8233254008506535819">Добавить функцию создания белого списка сайтов в окне очистки истории</translation>
 <translation id="8236231079192337250">Приложение "Галерея Интернет-магазина Chrome" для драйверов принтеров</translation>
 <translation id="8238649969398088015">Совет</translation>
 <translation id="8240697550402899963">Использовать стандартную тему</translation>
@@ -5255,7 +5274,6 @@
 <translation id="8708671767545720562">&amp;Дополнительная информация</translation>
 <translation id="8711402221661888347">Гамбургер</translation>
 <translation id="8711453844311572806">Если телефон разблокирован и находится у вас под рукой, просто нажмите на правую кнопку мыши, чтобы войти. В противном случае вы увидите значок блокировки, и вам потребуется ввести пароль.</translation>
-<translation id="8712637175834984815">Готово</translation>
 <translation id="8713570323158206935">Отправлять <ph name="BEGIN_LINK1" />сведения о системе<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Включает автозамену и предлагает варианты слов во время ввода на аппаратной клавиатуре с раскладкой "США".</translation>
 <translation id="871476437400413057">Сохраненные пароли Google</translation>
@@ -5618,6 +5636,7 @@
 <translation id="952992212772159698">Не активировано</translation>
 <translation id="953000875543358078">Это может занять около минуты</translation>
 <translation id="960987915827980018">Осталось около часа</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{С устройства будет удален $1 объект. Чтобы впоследствии загрузить данные, войдите в Chrome как $2.}one{С устройства будет удален $1 объект. Чтобы впоследствии загрузить данные, войдите в Chrome как $2.}few{С устройства будет удалено $1 объекта. Чтобы впоследствии загрузить данные, войдите в Chrome как $2.}many{С устройства будет удалено $1 объектов. Чтобы впоследствии загрузить данные, войдите в Chrome как $2.}other{С устройства будет удалено $1 объекта. Чтобы впоследствии загрузить данные, войдите в Chrome как $2.}}</translation>
 <translation id="96421021576709873">Сеть Wi-Fi</translation>
 <translation id="965490406356730238">Включает аппаратное ускорение для декодирования MJPEG при захвате кадра (если возможно).</translation>
 <translation id="968174221497644223">Кеш приложения</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index e9236e0b..56877e00 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -251,6 +251,7 @@
       Upozorňujeme, že na všetkých kompatibilných zariadeniach používateľa <ph name="USER_DISPLAY_EMAIL" /> bude zapnuté rozhranie Bluetooth a niektoré informácie o hardvéri budú odoslané Googlu. &lt;a&gt;Ďalšie informácie&lt;/a&gt;</translation>
 <translation id="13649080186077898">Spravovať nastavenia Automatického dopĺňania</translation>
 <translation id="1367951781824006909">Vybrať súbor</translation>
+<translation id="136802136832547685">Na pridanie do tohto zariadenia nie sú k dispozícii žiadni kontrolovaní používatelia.</translation>
 <translation id="1368265273904755308">Nahlásiť problém</translation>
 <translation id="1368832886055348810">Zľava doprava</translation>
 <translation id="1370646789215800222">Chcete odstrániť túto osobu?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Vyhľadávanie</translation>
 <translation id="1384211230590313258">Service Discovery Handler</translation>
 <translation id="1386387014181100145">Dobrý deň!</translation>
+<translation id="1386830813511981192">Viac ako milión aplikácií a hier – teraz k dispozícii na vašom zariadení <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Dá sa pridať iba zo služby <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Otvoriť ako bežnú kartu</translation>
 <translation id="1395262318152388157">Posúvač hľadania</translation>
@@ -894,6 +896,7 @@
 <translation id="2280486287150724112">Pravý okraj</translation>
 <translation id="2282146716419988068">Proces GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Nová verzia Intervencie používateľského agenta pri načítavaní webového písma WebFonts.</translation>
 <translation id="2286454467119466181">Jednoduché</translation>
 <translation id="2286950485307333924">Ste prihlásený/-á do prehliadača Chrome</translation>
 <translation id="2287590536030307392">Vypne všetky bezdrôtové pripojenia</translation>
@@ -1071,6 +1074,7 @@
 <translation id="2542049655219295786">Tabuľka Google</translation>
 <translation id="2546283357679194313">Súbory cookie a dáta webov</translation>
 <translation id="2549646943416322527">Seccomp Detector</translation>
+<translation id="2550212893339833758">Swapovaná pamäť</translation>
 <translation id="2553100941515833716">Obnoviť stav inštalácie Spúšťača aplikácii pri každom reštartovaní.</translation>
 <translation id="2553340429761841190">Systém <ph name="PRODUCT_NAME" /> sa nemohol pripojiť k sieti <ph name="NETWORK_ID" />. Vyberte inú sieť alebo to skúste znova.</translation>
 <translation id="2553440850688409052">Skryť tento doplnok</translation>
@@ -1104,6 +1108,7 @@
 <translation id="2587203970400270934">Kód operátora:</translation>
 <translation id="2587922270115112871">Pri vytvorení kontrolovaného používateľa sa nevytvorí účet Google a jeho nastavenia
     a údaje sa neprenesú na ďalšie zariadenia pomocou Synchronizácie Chrome. Kontrolovaný používateľ sa vzťahuje iba na toto zariadenie.</translation>
+<translation id="2594049137847833442">Dôležité možnosti webov v dialógovom okne Vymazanie dát prehliadania</translation>
 <translation id="2594056015203442344">Keď je tento príznak povolený, indikátory zvuku na paneli kariet budú fungovať aj ako ovládacie prvky na stlmenie zvuku kariet. Tiež sa pridajú príkazy v kontextovej ponuke kariet umožňujúce rýchle stlmenie viacerých vybratých kariet.</translation>
 <translation id="259421303766146093">Zrušiť zväčšenie</translation>
 <translation id="2597852038534460976">Chrome nemá prístup k tapetám. Pripojte sa k sieti.</translation>
@@ -1471,7 +1476,6 @@
 <translation id="3065140616557457172">Zadajte text na vyhľadávanie alebo webovú adresu – funguje všetko.</translation>
 <translation id="3067198360141518313">Spustiť tento doplnok</translation>
 <translation id="307519606911195071">Táto možnosť povolí ďalšie funkcie dostupnosti na stránke Nastavenia.</translation>
-<translation id="3075239840551149663">Vytvoril sa nový kontrolovaný používateľ <ph name="NEW_PROFILE_NAME" />.</translation>
 <translation id="3075874217500066906">Spustenie procesu úplného obnovenia (Powerwash) vyžaduje reštartovanie. Po reštartovaní budete musieť potvrdiť, že chcete pokračovať.</translation>
 <translation id="3076677906922146425">Umožniť každému pridať osobu do prehliadača Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1488,6 +1492,7 @@
 <translation id="3088034400796962477">Prepis (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Premenovať...</translation>
 <translation id="308903551226753393">Konfigurovať automaticky</translation>
+<translation id="3089231390674410424">Zdá sa, že došlo k problému s vašimi povereniami. Uistite sa, že ste správne prihlásený/-á, a skúste to znova.</translation>
 <translation id="3090819949319990166">Externý súbor crx nie je možné skopírovať do súboru <ph name="TEMP_CRX_FILE" /></translation>
 <translation id="3090871774332213558">Zariadenie „<ph name="DEVICE_NAME" />“ bolo spárované</translation>
 <translation id="3092544800441494315">Zahrnúť túto snímku obrazovky:</translation>
@@ -2014,7 +2019,6 @@
 <translation id="3790856258139356663">Pripojenie k testovaciemu serveru pre synchronizáciu Chrome.</translation>
 <translation id="3790909017043401679">Zadajte kód PIN SIM karty</translation>
 <translation id="3792890930871100565">Odpojiť tlačiarne</translation>
-<translation id="3795681127952030401">Stránky <ph name="URL" /> vám chcú posielať upozornenia.</translation>
 <translation id="3796648294839530037">Obľúbené siete:</translation>
 <translation id="3797900183766075808">Pomocou &amp;služby <ph name="SEARCH_ENGINE" /> vyhľadať text „<ph name="SEARCH_TERMS" />“</translation>
 <translation id="3798449238516105146">Verzia</translation>
@@ -2488,6 +2492,7 @@
 <translation id="4552678318981539154">Kúpiť väčší ukladací priestor</translation>
 <translation id="4554591392113183336">Verzia externého rozšírenia je rovnaká alebo nižšia ako existujúca verzia</translation>
 <translation id="4554796861933393312">Rýchlosť animácie vzhľadu Material Design Ink Drop</translation>
+<translation id="4555670907822902621">Povolenie ukladania stránok pridaných medzi záložky na prehliadanie offline.</translation>
 <translation id="4555769855065597957">Tieň</translation>
 <translation id="4556110439722119938">Záložky, história, heslá a ďalšie nastavenia budú synchronizované s vaším účtom Google a budete ich môcť použiť na všetkých zariadeniach</translation>
 <translation id="4557136421275541763">Upozornenie:</translation>
@@ -2663,6 +2668,7 @@
 <translation id="4824518112777153488">Podpora dotykových obrazoviek s možnosťou umiestnenia kurzora</translation>
 <translation id="4830573902900904548">Vaše zariadenie <ph name="DEVICE_TYPE" /> sa nedokáže pripojiť k internetu pomocou siete <ph name="NETWORK_NAME" />. Vyberte inú sieť. <ph name="LEARN_MORE_LINK_START" />Ďalšie informácie<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Identitu organizácie <ph name="ORGANIZATION" /> so sídlom na mieste <ph name="LOCALITY" /> overil vydavateľ <ph name="ISSUER" />. Server poskytol platné informácie o transparentnosti certifikátu.</translation>
+<translation id="4832537345877333532">Zakázanie načítavania súborov obrazovky icc zo servera Quirks na farebnú kalibráciu obrazoviek.</translation>
 <translation id="4834912470034578916">Povoliť vlastné rozloženia pre webové upozornenia</translation>
 <translation id="4835836146030131423">Chyba prihlásenia.</translation>
 <translation id="4837926214103741331">Nemáte oprávnenie používať toto zariadenie. Ak chcete získať povolenie na prihlásenie, kontaktujte majiteľa zariadenia.</translation>
@@ -2850,6 +2856,7 @@
 <translation id="5120421890733714118">Dôverovať tomuto certifikátu na identifikáciu webových stránok.</translation>
 <translation id="5121130586824819730">Pevný disk je plný. Uložte inde alebo uvoľnite viac miesta na pevnom disku. </translation>
 <translation id="5125751979347152379">Neplatná webová adresa.</translation>
+<translation id="5126663277159826272">Zakázanie klienta Quirks na kalibráciu obrazoviek</translation>
 <translation id="5127881134400491887">Spravovať sieťové pripojenia</translation>
 <translation id="5128590998814119508">Zoznam zobrazenia prvkov canvas 2D</translation>
 <translation id="512903556749061217">pripojené</translation>
@@ -2991,9 +2998,11 @@
 <translation id="5301751748813680278">Vstupujete ako hosť.</translation>
 <translation id="5301954838959518834">Áno, rozumiem</translation>
 <translation id="5302048478445481009">Jazyk</translation>
+<translation id="5304039790201806037">Udalosti ukazovateľa</translation>
 <translation id="5305688511332277257">Žiadne nainštalované</translation>
 <translation id="5308380583665731573">Pripojenie</translation>
 <translation id="5311260548612583999">Súkromný kľúč (nepovinné):</translation>
+<translation id="5313967007315987356">Pridať stránky</translation>
 <translation id="5316588172263354223">Hlasové vyhľadávanie kedykoľvek</translation>
 <translation id="5316716239522500219">Zrkadliť monitory</translation>
 <translation id="5317780077021120954">Uložiť</translation>
@@ -3071,7 +3080,7 @@
 <translation id="5417998409611691946">Vaše zariadenie <ph name="DEVICE_TYPE" /> môže:</translation>
 <translation id="5418923334382419584">Klávesnica pre mjanmarčinu</translation>
 <translation id="5419294236999569767">Čas systému</translation>
-<translation id="5421136146218899937">Odstrániť údaje prehliadania...</translation>
+<translation id="5421136146218899937">Odstrániť dáta prehliadania…</translation>
 <translation id="5422781158178868512">Je nám ľúto, ale externé pamäťové zariadenie sa nepodarilo rozpoznať.</translation>
 <translation id="542318722822983047">Automaticky posunúť kurzor na ďalší znak</translation>
 <translation id="5423849171846380976">Aktivované</translation>
@@ -3296,6 +3305,7 @@
 <translation id="5734362860645681824">Komunikácia</translation>
 <translation id="573719557377416048">Vymazať stav vzájomnej prítomnosti</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: vybrať a upraviť</translation>
+<translation id="5741454054957165976">Povolenie novej verzie intervencie používateľského agenta pri načítavaní webového písma WebFonts.</translation>
 <translation id="574392208103952083">Stredné</translation>
 <translation id="5745056705311424885">Zistila sa prítomnosť pamäťového kľúča USB</translation>
 <translation id="5746169159649715125">Uložiť ako PDF</translation>
@@ -3344,7 +3354,6 @@
 <translation id="5803531701633845775">Vybrať frázy zozadu bez pohnutia kurzorom</translation>
 <translation id="5804241973901381774">Povolenia</translation>
 <translation id="580571955903695899">Zoradiť podľa názvu</translation>
-<translation id="5808982448801399019">Autorizácia zlyhala</translation>
 <translation id="580961539202306967">Opýtať sa, keď mi budú chcieť stránky posielať správy push (odporúčané)</translation>
 <translation id="5815645614496570556">Adresa X.400</translation>
 <translation id="5817397429773072584">tradičná čínština</translation>
@@ -3369,6 +3378,7 @@
 <translation id="5834581999798853053">Zostáva približne <ph name="TIME" /> min.</translation>
 <translation id="5838825566232597749">US Workman international – medzinárodná</translation>
 <translation id="5839277899276241121">Rovnaká ako fakturačná adresa</translation>
+<translation id="5844550873065695788">Táto akcia natrvalo odstráni niekoľko položiek (najmenej <ph name="TOTAL_COUNT" />) z tohto zariadenia. Ak budete chcieť tieto dáta neskôr opäť získať, prihláste sa do Chromu ako $2.</translation>
 <translation id="5846929185714966548">Karta 4</translation>
 <translation id="5848934677402291689">Prebieha ukladanie do súboru PDF</translation>
 <translation id="5849335628409778954">Zadať kreditnú kartu...</translation>
@@ -3615,6 +3625,7 @@
 <translation id="6232017090690406397">Batéria</translation>
 <translation id="6241530762627360640">Prístup k informáciám o zariadeniach Bluetooth spárovaných s vaším systémom a objavovanie zariadení Bluetooth v blízkosti.</translation>
 <translation id="6243774244933267674">Server je nedostupný</translation>
+<translation id="6246413617632217567">Kontrolovaný používateľ sa nedá importovať. Skontrolujte priestor na pevnom disku a povolenia a skúste to znova.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" /> %</translation>
 <translation id="624789221780392884">Aktualizácia je pripravená</translation>
 <translation id="6248400709929739064">Povoliť titulky</translation>
@@ -3643,6 +3654,7 @@
 <translation id="6277518330158259200">&amp;Vytvoriť snímku obrazovky</translation>
 <translation id="6279183038361895380">Stlačením klávesa |<ph name="ACCELERATOR" />| zobrazíte kurzor</translation>
 <translation id="6280215091796946657">Prihlásiť sa pomocou iného účtu</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Experiment, v ktorom všetky rozhrania API budú odzrkadlovať oblasť zobrazenia rozloženia. Vlastnosti window.scroll sa tak stanú relatívnymi k oblasti zobrazenia rozloženia.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nová tlačiareň v sieti}few{Nové tlačiarne v sieti}many{Nové tlačiarne v sieti}other{Nové tlačiarne v sieti}}</translation>
 <translation id="6285395082104474418">Na stavovom paneli je zobrazený aktuálny stav siete, batérie a ďalších položiek.</translation>
@@ -3698,6 +3710,7 @@
 <translation id="6380143666419481200">Súhlasím, pokračovať</translation>
 <translation id="6380224340023442078">Nastavenia obsahu...</translation>
 <translation id="6383194710567510941">Povoľte používanie rozhrania chrome.input.ime API.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Táto akcia natrvalo odstráni minimálne $1 položku z tohto zariadenia. Ak budete chcieť tieto dáta neskôr opäť získať, prihláste sa do Chromu ako $2.}few{Táto akcia natrvalo odstráni minimálne $1 položky z tohto zariadenia. Ak budete chcieť tieto dáta neskôr opäť získať, prihláste sa do Chromu ako $2.}many{Táto akcia natrvalo odstráni minimálne $1 položky z tohto zariadenia. Ak budete chcieť tieto dáta neskôr opäť získať, prihláste sa do Chromu ako $2.}other{Táto akcia natrvalo odstráni minimálne $1 položiek z tohto zariadenia. Ak budete chcieť tieto dáta neskôr opäť získať, prihláste sa do Chromu ako $2.}}</translation>
 <translation id="6384275966486438344">Zmeniť nastavenia vyhľadávania na: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Stránky otvorené v tomto okne sa nezobrazia v histórii prehliadača. Po zavretí všetkých otvorených okien režimu hosťa nezanechajú na počítači žiadne ďalšie stopy, ako napríklad súbory cookie. Všetky stiahnuté súbory však zostanú zachované.</translation>
 <translation id="6391538222494443604">Vstupný adresár musí existovať.</translation>
@@ -3836,6 +3849,7 @@
 <translation id="6575134580692778371">Nenakonfigurované</translation>
 <translation id="6575251558004911012">Opýtať sa, keď stránky požadujú prístup k vašej kamere (odporúčané)</translation>
 <translation id="6579159469348633828">Kódovanie obsahu Brotli</translation>
+<translation id="6580151766480067746">Verzia ARC</translation>
 <translation id="6581162200855843583">Odkaz na službu Disk Google</translation>
 <translation id="6583070985841601920">Prihlásený/-á ako <ph name="USER_EMAIL_ADDRESS" />. Synchronizáciu zakázal váš správca.</translation>
 <translation id="65832705307647870">Vložte populárne weby na stránku na novej karte</translation>
@@ -4001,6 +4015,7 @@
 <translation id="6847758263950452722">Uložiť stránku vo formáte MHTML</translation>
 <translation id="6853388645642883916">Služba Updater je v režime spánku</translation>
 <translation id="68541483639528434">Zatvoriť ostatné karty</translation>
+<translation id="6856701878604560493">Povolenie offline záložiek</translation>
 <translation id="6860097299815761905">Nastavenia servera proxy...</translation>
 <translation id="6860427144121307915">Otvoriť na karte</translation>
 <translation id="6862635236584086457">Všetky súbory uložené v tomto priečinku sa automaticky zálohujú online</translation>
@@ -4174,6 +4189,7 @@
 <translation id="7092106376816104">Výnimky kontextových okien</translation>
 <translation id="7093866338626856921">Vymieňať údaje so zariadeniami s nasledujúcimi názvami: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Chcete objaviť viac skvelých funkcií?</translation>
+<translation id="7096108453481049031">Nepodarilo sa importovať kontrolovaného používateľa. Skontrolujte sieťové pripojenie a skúste to znova neskôr.</translation>
 <translation id="7100897339030255923">Počet vybratých položiek: <ph name="COUNT" /></translation>
 <translation id="710227449793100220">Viazanie tokenov</translation>
 <translation id="7106346894903675391">Kúpiť väčší ukladací priestor...</translation>
@@ -4202,6 +4218,7 @@
 <translation id="713888829801648570">Je nám to ľúto, ale vaše heslo nemohlo byť overené, pretože ste offline</translation>
 <translation id="7140928199327930795">Žiadne ďalšie dostupné zariadenia.</translation>
 <translation id="7141105143012495934">Prihlásenie zlyhalo, pretože podrobnosti účtu sa nepodarilo načítať. Kontaktujte svojho správcu alebo to skúste znova.</translation>
+<translation id="7141331524324591758">Povoľuje čiastočnú experimentálnu podporu pre rozhranie Pointer Events API. Táto funkcia je určená iba na testovanie vývojármi webu a na niektorých weboch môže spôsobiť mierne problémy.</translation>
 <translation id="7143207342074048698">Pripája sa</translation>
 <translation id="7144878232160441200">Skúsiť znova</translation>
 <translation id="7148311641502571842">Doplnok <ph name="PLUGIN_NAME" /> bol zakázaný. Ak ho chcete znova povoliť, prejdite na stránku <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4850,6 +4867,7 @@
 <translation id="8119572489781388874">Upraviť nastavenia</translation>
 <translation id="8119631488458759651">odstrániť tieto stránky</translation>
 <translation id="8121385576314601440">Nastavenia vstupu Hangul</translation>
+<translation id="8122245494004914423">Táto akcia natrvalo odstráni vaše dáta prehliadania z tohto zariadenia. Ak budete chcieť tieto dáta neskôr opäť získať, prihláste sa do Chromu ako $2.</translation>
 <translation id="8124313775439841391">Spravovaná konfigurácia ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Povolenie neplatných certifikátov pre zdroje načítané z lokálneho hostenia (localhost)</translation>
@@ -4934,6 +4952,7 @@
 <translation id="8226742006292257240">Nižšie je uvedené náhodne vygenerované heslo modulu TPM, ktoré bolo priradené k vášmu počítaču:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Útočníci, ktorý sa momentálne nachádzajú na stránkach <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />, sa môžu pokúsiť nainštalovať nebezpečné programy na váš počítač, ktoré ukradnú alebo odstránia vaše informácie (napríklad fotky, heslá, správy alebo kreditné karty).</translation>
+<translation id="8233254008506535819">Zahrnutie možnosti na pridanie dôležitých webov na bielu listinu v dialógovom okne Vymazanie dát prehliadania.</translation>
 <translation id="8236231079192337250">Aplikácia Galéria Internetového obchodu Chrome pre ovládače tlačiarní</translation>
 <translation id="8238649969398088015">Tip pomocníka</translation>
 <translation id="8240697550402899963">Použiť klasický motív</translation>
@@ -5258,7 +5277,6 @@
 <translation id="8708671767545720562">&amp;Viac informácií</translation>
 <translation id="8711402221661888347">Kyslé uhorky</translation>
 <translation id="8711453844311572806">Keď je váš telefón odomknutý a v okolí, stačí pre vstup iba kliknúť. V opačnom prípade sa zobrazí ikona uzamknutia a bude potrebné zadať heslo.</translation>
-<translation id="8712637175834984815">Dobre</translation>
 <translation id="8713570323158206935">Odoslať <ph name="BEGIN_LINK1" />informácie o systéme<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Povoliť automatické opravy fyzickej klávesnice pre americkú klávesnicu, ktorá môže poskytovať návrhy počas písania na fyzickej klávesnici.</translation>
 <translation id="871476437400413057">uloženým heslám Google</translation>
@@ -5621,6 +5639,7 @@
 <translation id="952992212772159698">Neaktivované</translation>
 <translation id="953000875543358078">Môže to trvať približne minútu</translation>
 <translation id="960987915827980018">Zostáva približne 1 hodina</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Táto akcia natrvalo odstráni $1 položku z tohto zariadenia. Ak budete chcieť tieto dáta neskôr opäť získať, prihláste sa do Chromu ako $2.}few{Táto akcia natrvalo odstráni minimálne $1 položky z tohto zariadenia. Ak budete chcieť tieto dáta neskôr opäť získať, prihláste sa do Chromu ako $2.}many{Táto akcia natrvalo odstráni minimálne $1 položky z tohto zariadenia. Ak budete chcieť tieto dáta neskôr opäť získať, prihláste sa do Chromu ako $2.}other{Táto akcia natrvalo odstráni minimálne $1 položiek z tohto zariadenia. Ak budete chcieť tieto dáta neskôr opäť získať, prihláste sa do Chromu ako $2.}}</translation>
 <translation id="96421021576709873">Sieť Wi-Fi</translation>
 <translation id="965490406356730238">Táto možnosť povolí hardvérovo akcelerované dekódovanie formátu mjpeg pre zaznamenaný rámec (podľa dostupnosti).</translation>
 <translation id="968174221497644223">Vyrovnávacia pamäť aplikácie</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index f322c225..30c8b1cac 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -251,6 +251,7 @@
       Upoštevajte, da bo Bluetooth vklopljen za vse združljive naprave uporabnika <ph name="USER_DISPLAY_EMAIL" /> in bodo Googlu poslani nekateri podatki o strojni opremi. &lt;a&gt;Več o tem&lt;/a&gt;</translation>
 <translation id="13649080186077898">Upravljanje nastavitve samodejnega izpolnjevanja</translation>
 <translation id="1367951781824006909">Izberite datoteko</translation>
+<translation id="136802136832547685">Ni zaščitenih uporabnikov, ki bi jih bilo mogoče dodati v to napravo.</translation>
 <translation id="1368265273904755308">Prijava težave</translation>
 <translation id="1368832886055348810">Od leve proti desni</translation>
 <translation id="1370646789215800222">Želite odstraniti osebo?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Išči</translation>
 <translation id="1384211230590313258">Rutina za obravnavo odkrivanja storitev</translation>
 <translation id="1386387014181100145">Zdravo.</translation>
+<translation id="1386830813511981192">Več kot milijon aplikacij in iger je zdaj na voljo v vaši napravi <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Dodati ga je mogoče samo z mesta <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Odpri v navadnem zavihku</translation>
 <translation id="1395262318152388157">Drsnik za iskanje</translation>
@@ -894,6 +896,7 @@
 <translation id="2280486287150724112">Desni rob</translation>
 <translation id="2282146716419988068">Proces GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Nova različica posredovanja uporabnikovega posrednika za nalaganje spletnih pisav.</translation>
 <translation id="2286454467119466181">Preprosti</translation>
 <translation id="2286950485307333924">Prijavljeni ste v Chrome</translation>
 <translation id="2287590536030307392">Izklopite vse brezžične povezave.</translation>
@@ -1071,6 +1074,7 @@
 <translation id="2542049655219295786">Googlova tabela</translation>
 <translation id="2546283357679194313">Piškotki in podatki o spletnih mestih</translation>
 <translation id="2549646943416322527">Detektor za Seccomp</translation>
+<translation id="2550212893339833758">Zamenjan pomnilnik</translation>
 <translation id="2553100941515833716">Ob vsakem vnovičnem zagonu ponastavi namestitveno stanje zaganjalnika aplikacij.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> ni uspel vzpostaviti povezave z omrežjem <ph name="NETWORK_ID" />. Izberite drugo omrežje ali poskusite znova.</translation>
 <translation id="2553440850688409052">Skrij ta vtičnik</translation>
@@ -1104,6 +1108,7 @@
 <translation id="2587203970400270934">Koda operaterja:</translation>
 <translation id="2587922270115112871">Z ustvarjanjem zaščitenega uporabnika ne ustvarite Google Računa ter
     njegovih nastavitev in podatkov ne boste mogli sinhronizirati z drugimi napravami z uporabo funkcije Chrome Sync. Zaščiteni uporabnik se lahko uporablja samo v tej napravi.</translation>
+<translation id="2594049137847833442">Možnosti pomembnih spletnih mest v pogovornem oknu za brisanje podatkov brskanja.</translation>
 <translation id="2594056015203442344">Ko je ta možnost omogočena, kazalniki zvoka na zavihkih delujejo tudi kot kontrolniki za izklop zvoka. V priročni meni zavihkov doda tudi ukaze za hiter izklop zvoka več izbranih zavihkov.</translation>
 <translation id="259421303766146093">Zmanjšanje povečave</translation>
 <translation id="2597852038534460976">Chrome ne more dostopati do ozadij. Povežite se z omrežjem.</translation>
@@ -1471,7 +1476,6 @@
 <translation id="3065140616557457172">Brskate lahko prek funkcije za iskanje ali vnosom URL-ja - prav vse deluje.</translation>
 <translation id="3067198360141518313">Zaženi vtičnik</translation>
 <translation id="307519606911195071">Omogočanje dodatnih funkcij za ljudi s posebnimi potrebami na strani z nastavitvami.</translation>
-<translation id="3075239840551149663">Profil <ph name="NEW_PROFILE_NAME" /> je uspešno ustvarjen kot zaščiteni uporabnik.</translation>
 <translation id="3075874217500066906">Za začetek postopka Powerwash je potreben vnovični zagon. Po vnovičnem zagonu boste morali potrditi, da želite nadaljevati.</translation>
 <translation id="3076677906922146425">Dovoli vsakomur dodati osebo v Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1488,6 +1492,7 @@
 <translation id="3088034400796962477">Prečrkovanje (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Preimenuj ...</translation>
 <translation id="308903551226753393">Samodejna nastavitev</translation>
+<translation id="3089231390674410424">Videti je, da je prišlo do težave z vašimi poverilnicami. Poskrbite, da boste pravilno prijavljeni in poskusite znova.</translation>
 <translation id="3090819949319990166">Zunanje datoteke crx ni mogoče kopirati v <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">Naprava »<ph name="DEVICE_NAME" />« je seznanjena</translation>
 <translation id="3092544800441494315">Vključi ta posnetek zaslona:</translation>
@@ -2015,7 +2020,6 @@
 <translation id="3790856258139356663">Vzpostavi povezavo s preskusnim strežnikom za Chrome Sync.</translation>
 <translation id="3790909017043401679">Vnos kode PIN za kartico SIM</translation>
 <translation id="3792890930871100565">Prekinite povezave s tiskalniki</translation>
-<translation id="3795681127952030401"><ph name="URL" /> vam želi pošiljati obvestila.</translation>
 <translation id="3796648294839530037">Priljubljena omrežja:</translation>
 <translation id="3797900183766075808">&amp;V iskalniku <ph name="SEARCH_ENGINE" /> poišči »<ph name="SEARCH_TERMS" />«</translation>
 <translation id="3798449238516105146">Različica</translation>
@@ -2489,6 +2493,7 @@
 <translation id="4552678318981539154">Nakup dodatnega prostora za shranjevanje ...</translation>
 <translation id="4554591392113183336">Zunanja razširitev je iste ali starejše različice kot trenutna.</translation>
 <translation id="4554796861933393312">Hitrost animacije kapljice črnila z materialnim oblikovanjem</translation>
+<translation id="4555670907822902621">Omogočanje shranjevanja strani, dodanih med zaznamke, za ogled brez povezave.</translation>
 <translation id="4555769855065597957">Senca</translation>
 <translation id="4556110439722119938">Vaši zaznamki, zgodovina, gesla in druge nastavitve bodo sinhronizirani z Google Računom, tako da jih boste lahko uporabljali v vseh svojih napravah.</translation>
 <translation id="4557136421275541763">Opozorilo:</translation>
@@ -2665,6 +2670,7 @@
 <translation id="4824518112777153488">Podpora za zaslone na dotik, ki podpirajo izbiranje s kazanjem</translation>
 <translation id="4830573902900904548">Naprava <ph name="DEVICE_TYPE" /> se ne more povezati v internet prek omrežja <ph name="NETWORK_NAME" />. Izberite drugo omrežje. <ph name="LEARN_MORE_LINK_START" />Več o tem<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Identiteto organizacije <ph name="ORGANIZATION" /> v kraju <ph name="LOCALITY" /> je potrdil izdajatelj <ph name="ISSUER" />. Strežnik je poslal veljavne podatke o preglednosti potrdila.</translation>
+<translation id="4832537345877333532">Onemogočanje pridobivanja datotek za prikaz icc iz strežnika Quirks Server za umerjanje barv zaslona.</translation>
 <translation id="4834912470034578916">Omogočanje postavitev po meri za spletna obvestila</translation>
 <translation id="4835836146030131423">Napaka pri prijavi.</translation>
 <translation id="4837926214103741331">Nimate dovoljenja za uporabo te naprave. Za dovoljenje za prijavo se obrnite na lastnika naprave.</translation>
@@ -2852,6 +2858,7 @@
 <translation id="5120421890733714118">Zaupaj temu potrdilu za prepoznavanje spletnih mest.</translation>
 <translation id="5121130586824819730">Trdi disk je poln. Shranite na drugo mesto ali sprostite prostor na trdem disku.</translation>
 <translation id="5125751979347152379">Neveljaven spletni naslov.</translation>
+<translation id="5126663277159826272">Onemogočanje odjemalca Quirks Client za umerjanje zaslona.</translation>
 <translation id="5127881134400491887">Upravljanje omrežnih povezav</translation>
 <translation id="5128590998814119508">Prikazni seznami za platno 2D</translation>
 <translation id="512903556749061217">priključena</translation>
@@ -2993,9 +3000,11 @@
 <translation id="5301751748813680278">Vstopate kot gost.</translation>
 <translation id="5301954838959518834">V redu, razumem</translation>
 <translation id="5302048478445481009">Jezik</translation>
+<translation id="5304039790201806037">Dogodki kazalca</translation>
 <translation id="5305688511332277257">Ni nameščenih</translation>
 <translation id="5308380583665731573">Povezovanje</translation>
 <translation id="5311260548612583999">Dat. z zaseb. klj. (neobv.)</translation>
+<translation id="5313967007315987356">Dodajanje mesta</translation>
 <translation id="5316588172263354223">Glasovno iskanje kadar koli</translation>
 <translation id="5316716239522500219">Zrcaljenje monitorjev</translation>
 <translation id="5317780077021120954">Shrani</translation>
@@ -3299,6 +3308,7 @@
 <translation id="5734362860645681824">Komunikacije</translation>
 <translation id="573719557377416048">Izbriši stanje soprisotnosti</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: izberite, če želite urejati</translation>
+<translation id="5741454054957165976">Omogočanje nove različice posredovanja uporabnikovega posrednika za nalaganje spletnih pisav.</translation>
 <translation id="574392208103952083">Srednja</translation>
 <translation id="5745056705311424885">Zaznan je pomnilnik USB</translation>
 <translation id="5746169159649715125">Shrani kot PDF</translation>
@@ -3347,7 +3357,6 @@
 <translation id="5803531701633845775">Izberite besedne zveze iz ozadja, ne da bi premikali kazalec</translation>
 <translation id="5804241973901381774">Dovoljenja</translation>
 <translation id="580571955903695899">Razvrsti po naslovu</translation>
-<translation id="5808982448801399019">Avtorizacija ni uspela.</translation>
 <translation id="580961539202306967">Vprašaj me, ko mi želi spletno mesto poslati potisna sporočila (priporočeno)</translation>
 <translation id="5815645614496570556">Naslov X.400</translation>
 <translation id="5817397429773072584">tradicionalna kitajščina</translation>
@@ -3372,6 +3381,7 @@
 <translation id="5834581999798853053">Še približno <ph name="TIME" /> min</translation>
 <translation id="5838825566232597749">Združene države – mednarodna (Workman)</translation>
 <translation id="5839277899276241121">Enako kot naslov za izstavitev računa</translation>
+<translation id="5844550873065695788">S tem bo iz te naprave izbrisanih vsaj toliko elementov: <ph name="TOTAL_COUNT" />. Če želite pozneje prenesti podatke, se v Chrome prijavite kot $2.</translation>
 <translation id="5846929185714966548">Zavihek 4</translation>
 <translation id="5848934677402291689">Poteka shranjevanje v PDF</translation>
 <translation id="5849335628409778954">Vnos podatkov kreditne kartice ...</translation>
@@ -3618,6 +3628,7 @@
 <translation id="6232017090690406397">Baterija</translation>
 <translation id="6241530762627360640">Dostop do podatkov o napravah Bluetooth, ki so seznanjene z vašim sistemom, in odkrivanje naprav Bluetooth v bližini.</translation>
 <translation id="6243774244933267674">Strežnik ni na voljo</translation>
+<translation id="6246413617632217567">Novega uporabnika ni bilo mogoče uvoziti. Preverite prostor na trdem disku in dovoljenja ter poskusite znova.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" /> %</translation>
 <translation id="624789221780392884">Posodobitev je pripravljena</translation>
 <translation id="6248400709929739064">Omogoči podnapise</translation>
@@ -3646,6 +3657,7 @@
 <translation id="6277518330158259200">N&amp;aredi posnetek zaslona</translation>
 <translation id="6279183038361895380">Pritisnite |<ph name="ACCELERATOR" />| za prikaz kazalca</translation>
 <translation id="6280215091796946657">Prijava z drugim računom</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Poskus, s katerim vsi API-ji odražajo vidno območje postavitve. Tako so lastnosti  window.scroll povezane z vidnim območjem postavitve.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Nov tiskalnik v vašem omrežju}one{Novi tiskalniki v vašem omrežju}two{Novi tiskalniki v vašem omrežju}few{Novi tiskalniki v vašem omrežju}other{Novi tiskalniki v vašem omrežju}}</translation>
 <translation id="6285395082104474418">V vrstici stanja je prikazano trenutno stanje omrežja, akumulatorja in drugo.</translation>
@@ -3701,6 +3713,7 @@
 <translation id="6380143666419481200">Sprejmite in nadaljujte</translation>
 <translation id="6380224340023442078">Nastavitve vsebine ...</translation>
 <translation id="6383194710567510941">Omogoči uporabo API-ja chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{S tem bo iz te naprave trajno izbrisan vsaj $1 element. Če želite pozneje prenesti podatke, se v Chrome prijavite kot $2.}one{S tem bo iz te naprave trajno izbrisan vsaj $1 element. Če želite pozneje prenesti podatke, se v Chrome prijavite kot $2.}two{S tem bosta iz te naprave trajno izbrisana vsaj $1 elementa. Če želite pozneje prenesti podatke, se v Chrome prijavite kot $2.}few{S tem bodo iz te naprave trajno izbrisani vsaj $1 elementi. Če želite pozneje prenesti podatke, se v Chrome prijavite kot $2.}other{S tem bo iz te naprave trajno izbrisanih vsaj $1 elementov. Če želite pozneje prenesti podatke, se v Chrome prijavite kot $2.}}</translation>
 <translation id="6384275966486438344">Sprememba nastavitev iskanja na: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Strani, ki si jih ogledujete v tem oknu, ne bodo prikazane v zgodovini brskalnika in v računalniku ne bodo pustile drugih sledi, na primer piškotkov, ko boste zaprli vsa odprta okna gostujočih sej. Datoteke, ki jih prenesete, se bodo ohranile.</translation>
 <translation id="6391538222494443604">Obstajati mora imenik vnosa.</translation>
@@ -3838,6 +3851,7 @@
 <translation id="6575134580692778371">Naprava ni konfigurirana</translation>
 <translation id="6575251558004911012">Vprašaj, če spletno mesto zahteva dostop do kamere (priporočeno)</translation>
 <translation id="6579159469348633828">Kodiranje vsebine Brotli.</translation>
+<translation id="6580151766480067746">Različica ARC</translation>
 <translation id="6581162200855843583">Povezava Google Drive</translation>
 <translation id="6583070985841601920">Prijavljeni ste kot <ph name="USER_EMAIL_ADDRESS" />. Skrbnik je onemogočil sinhronizacijo.</translation>
 <translation id="65832705307647870">Na strani »Nov zavihek« pokaže priljubljena spletna mesta.</translation>
@@ -4003,6 +4017,7 @@
 <translation id="6847758263950452722">Shrani stran kot MHTML</translation>
 <translation id="6853388645642883916">Orodje za posodabljanje je v stanju pripravljenosti</translation>
 <translation id="68541483639528434">Zapri druge zavihke</translation>
+<translation id="6856701878604560493">Omogočanje zaznamkov brez povezave</translation>
 <translation id="6860097299815761905">Nastavitve proxyja ...</translation>
 <translation id="6860427144121307915">Odpri na zavihku</translation>
 <translation id="6862635236584086457">Datoteke, shranjene v teh mapi, se samodejno varnostno kopirajo v splet</translation>
@@ -4174,6 +4189,7 @@
 <translation id="7092106376816104">Izjeme za pojavna okna</translation>
 <translation id="7093866338626856921">Izmenjava podatkov z napravami, imenovanimi: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Želite odkriti več super funkcij?</translation>
+<translation id="7096108453481049031">Zaščitenega uporabnika ni bilo mogoče uvoziti. Preverite omrežno povezavo in poskusite znova pozneje.</translation>
 <translation id="7100897339030255923">Št. izbranih elementov: <ph name="COUNT" /></translation>
 <translation id="710227449793100220">Token Binding</translation>
 <translation id="7106346894903675391">Nakup dodatnega prostora za shranjevanje ...</translation>
@@ -4202,6 +4218,7 @@
 <translation id="713888829801648570">Oprostite, gesla ni bilo mogoče preveriti, ker nimate internetne povezave.</translation>
 <translation id="7140928199327930795">Ni drugih razpoložljivih naprav.</translation>
 <translation id="7141105143012495934">Prijava ni uspela, ker ni bilo mogoče pridobiti podrobnosti o računu. Obrnite se na skrbnika in poskusite znova.</translation>
+<translation id="7141331524324591758">Omogoči delno poskusno podporo za API za dogodke kazalca. To je namenjeno samo spletnim razvijalcem za preskušanje in nekatera spletna mesta bodo nekoliko okvarjena.</translation>
 <translation id="7143207342074048698">Vzpostavljanje povezave</translation>
 <translation id="7144878232160441200">Poskusi znova</translation>
 <translation id="7148311641502571842">Vtičnik <ph name="PLUGIN_NAME" /> je onemogočen. Znova ga lahko omogočite na <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4850,6 +4867,7 @@
 <translation id="8119572489781388874">Spreminjanje nastavitev</translation>
 <translation id="8119631488458759651">odstrani to mesto</translation>
 <translation id="8121385576314601440">Nastavitve vnosa hangul</translation>
+<translation id="8122245494004914423">S tem bodo iz te naprave trajno izbrisani podatki brskanja. Če želite pozneje prenesti podatke, se v Chrome prijavite kot $2.</translation>
 <translation id="8124313775439841391">Upravljan ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Dovoli neveljavna potrdila za sredstva, naložena iz gostitelja »localhost«.</translation>
@@ -4934,6 +4952,7 @@
 <translation id="8226742006292257240">Spodaj je prikazano naključno ustvarjeno geslo za TPM, dodeljeno vašemu računalniku:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Napadalci, ki so trenutno na spletnem mestu <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />, lahko poskusijo v vašem računalniku namestiti nevarne programe, ki kradejo ali brišejo podatke (na primer fotografije, gesla, sporočila in podatke kreditnih kartic).</translation>
+<translation id="8233254008506535819">Vključitev možnosti uvrščanja pomembnih spletnih mest na seznam dovoljenih v pogovornem oknu za brisanje podatkov brskanja.</translation>
 <translation id="8236231079192337250">Aplikacija Galerija za Spletno trgovino Chrome za gonilnike tiskalnikov</translation>
 <translation id="8238649969398088015">Namig za pomoč</translation>
 <translation id="8240697550402899963">Uporabi klasično temo</translation>
@@ -5259,7 +5278,6 @@
 <translation id="8708671767545720562">&amp;Več informacij</translation>
 <translation id="8711402221661888347">Kumarice</translation>
 <translation id="8711453844311572806">Ko je telefon odklenjen in v bližini, samo kliknite za dostop. V nasprotnem primeru je prikazana ikona zaklenjenega načina in morate vnesti geslo.</translation>
-<translation id="8712637175834984815">Razumem</translation>
 <translation id="8713570323158206935">Pošlji <ph name="BEGIN_LINK1" />podatke o sistemu<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Omogočanje samodejnega popravljanja za fizično angleško tipkovnico (Združene države), ki ponuja takšne predloge, kot bi tipkali na fizično tipkovnico.</translation>
 <translation id="871476437400413057">Gesla, ki jih je shranil Google</translation>
@@ -5623,6 +5641,7 @@
 <translation id="952992212772159698">Ni aktivirano</translation>
 <translation id="953000875543358078">To lahko traja kakšno minuto</translation>
 <translation id="960987915827980018">Še približno ena ura</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{S tem bo iz te naprave trajno izbrisan $1 element. Če želite pozneje prenesti podatke, se v Chrome prijavite kot $2.}one{S tem bo iz te naprave trajno izbrisan $1 element. Če želite pozneje prenesti podatke, se v Chrome prijavite kot $2.}two{S tem bosta iz te naprave trajno izbrisana $1 elementa. Če želite pozneje prenesti podatke, se v Chrome prijavite kot $2.}few{S tem bodo iz te naprave trajno izbrisani $1 elementi. Če želite pozneje prenesti podatke, se v Chrome prijavite kot $2.}other{S tem bo iz te naprave trajno izbrisanih $1 elementov. Če želite pozneje prenesti podatke, se v Chrome prijavite kot $2.}}</translation>
 <translation id="96421021576709873">Omrežje Wi-Fi</translation>
 <translation id="965490406356730238">Omogoči strojno pospešeno dekodiranje vsebine mjpeg za zajete sličice, kjer je to na voljo.</translation>
 <translation id="968174221497644223">Predpomnilnik aplikacij</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index a6cfe05..fded53f 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -251,6 +251,7 @@
       Имајте на уму да ће Bluetooth бити укључен за све компатибилне уређаје корисника <ph name="USER_DISPLAY_EMAIL" /> и да ће се неке информације о хардверу слати Google-у. &lt;a&gt;Сазнајте више&lt;/a&gt;</translation>
 <translation id="13649080186077898">Управљај подешавањима Аутоматског попуњавања</translation>
 <translation id="1367951781824006909">Изабери датотеку</translation>
+<translation id="136802136832547685">Нема корисника под надзором за додавање овом уређају.</translation>
 <translation id="1368265273904755308">Пријављивање проблема</translation>
 <translation id="1368832886055348810">Слева надесно</translation>
 <translation id="1370646789215800222">Желите ли да уклоните особу?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Претражи</translation>
 <translation id="1384211230590313258">Обрађивач откривања услуга</translation>
 <translation id="1386387014181100145">Здраво.</translation>
+<translation id="1386830813511981192">Преко милион апликација и игара је сада доступно на вашем уређају <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Ово може да се дода само из услуге <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Отвори као уобичајену картицу</translation>
 <translation id="1395262318152388157">Клизач за тражење</translation>
@@ -890,6 +892,7 @@
 <translation id="2280486287150724112">Десна маргина</translation>
 <translation id="2282146716419988068">GPU процес</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Нова верзија интервенције корисничког агента за учитавање веб-фонтова.</translation>
 <translation id="2286454467119466181">Једноставан</translation>
 <translation id="2286950485307333924">Сада сте пријављени у Chrome</translation>
 <translation id="2287590536030307392">Искључите све бежичне везе.</translation>
@@ -1067,6 +1070,7 @@
 <translation id="2542049655219295786">Google табела</translation>
 <translation id="2546283357679194313">Колачићи и подаци о сајтовима</translation>
 <translation id="2549646943416322527">Откривање Seccomp-а</translation>
+<translation id="2550212893339833758">Замењена меморија</translation>
 <translation id="2553100941515833716">Ресетуј стање инсталације Покретача апликација при сваком поновном покретању.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> није успео да се повеже са мрежом <ph name="NETWORK_ID" />. Изаберите другу мрежу или покушајте поново.</translation>
 <translation id="2553440850688409052">Сакриј овај додатак</translation>
@@ -1099,6 +1103,7 @@
 <translation id="2585300050980572691">Подразумевана подешавања претраге</translation>
 <translation id="2587203970400270934">Кôд оператора:</translation>
 <translation id="2587922270115112871">Прављење корисника под надзором не подразумева отварање Google налога, па подешавања и подаци тих корисника неће бити доступни на другим уређајима на којима је омогућена Chrome синхронизација. Корисник под надзором постоји само на овом уређају.</translation>
+<translation id="2594049137847833442">Важна опција за сајтове у дијалогу за брисање података о прегледању</translation>
 <translation id="2594056015203442344">Када је омогућено, индикатори звука на траци са картицама добијају двоструку функцију контроле за искључивање звука картица. То такође додаје команде у контекстуални мени за картице за брзо искључивање звука више изабраних картица.</translation>
 <translation id="259421303766146093">Умањивање приказа</translation>
 <translation id="2597852038534460976">Chrome не може да приступа позадинама. Повежите са мрежом.</translation>
@@ -1466,7 +1471,6 @@
 <translation id="3065140616557457172">Откуцајте текст за претрагу или унесите URL адресу за навигацију – све функционише.</translation>
 <translation id="3067198360141518313">Покрени овај додатак</translation>
 <translation id="307519606911195071">Омогућите додатне функције приступачности на страници Подешавања.</translation>
-<translation id="3075239840551149663">Направљен је корисник под надзором по имену <ph name="NEW_PROFILE_NAME" />!</translation>
 <translation id="3075874217500066906">Потребно је да поново покренете уређај да би започео процес Powerwash-а. Када поново покренете уређај, затражићемо да потврдите да ли желите да наставите.</translation>
 <translation id="3076677906922146425">Дозволи сваком да додаје особе у Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1483,6 +1487,7 @@
 <translation id="3088034400796962477">Транслитерација (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Преименуј...</translation>
 <translation id="308903551226753393">Аутоматски конфигуриши</translation>
+<translation id="3089231390674410424">Изгледа да постоји проблем са акредитивима. Проверите да ли сте исправно пријављени и покушајте поново.</translation>
 <translation id="3090819949319990166">Није успело копирање спољне crx датотеке у датотеку <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">Упарили сте „<ph name="DEVICE_NAME" />“</translation>
 <translation id="3092544800441494315">Укључи овај снимак екрана:</translation>
@@ -2010,7 +2015,6 @@
 <translation id="3790856258139356663">Повезује се са сервером за тестирање за Chrome синхронизацију.</translation>
 <translation id="3790909017043401679">Унос PIN-а SIM картице</translation>
 <translation id="3792890930871100565">Прекини везу са штампачима</translation>
-<translation id="3795681127952030401"><ph name="URL" /> жели да вам шаље обавештења.</translation>
 <translation id="3796648294839530037">Омиљене мреже:</translation>
 <translation id="3797900183766075808">&amp;Претражи „<ph name="SEARCH_TERMS" />“ на претраживачу <ph name="SEARCH_ENGINE" /></translation>
 <translation id="3798449238516105146">Верзија</translation>
@@ -2484,6 +2488,7 @@
 <translation id="4552678318981539154">Купи још меморијског простора</translation>
 <translation id="4554591392113183336">Верзија спољног додатка је иста или старија од постојећег.</translation>
 <translation id="4554796861933393312">Брзина анимације капљице за материјални дизајн</translation>
+<translation id="4555670907822902621">Омогућава чување обележених страница за офлајн гледање.</translation>
 <translation id="4555769855065597957">Нови профил</translation>
 <translation id="4556110439722119938">Обележивачи, историја, лозинке и друга подешавања ће се синхронизовати са Google налогом да бисте могли да их користите на свим уређајима</translation>
 <translation id="4557136421275541763">Упозорење:</translation>
@@ -2660,6 +2665,7 @@
 <translation id="4824518112777153488">Подршка за додирне екране на којима је омогућено прелажење курсором</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> не може да се повеже на интернет помоћу мреже <ph name="NETWORK_NAME" />. Изаберите неку другу мрежу. <ph name="LEARN_MORE_LINK_START" />Сазнајте више<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Идентитет организације <ph name="ORGANIZATION" /> на локацији <ph name="LOCALITY" /> верификовао је <ph name="ISSUER" />. Сервер је послао важеће информације о транспарентности сертификата.</translation>
+<translation id="4832537345877333532">Онемогућава преузимање icc датотека за екран са Quirks сервера ради калибрације боја екрана.</translation>
 <translation id="4834912470034578916">Омогући прилагођене изгледе за Веб-обавештења.</translation>
 <translation id="4835836146030131423">Грешка у пријављивању.</translation>
 <translation id="4837926214103741331">Немате овлашћење за коришћење овог уређаја. Контактирајте власника уређаја да бисте добили дозволу за пријављивање.</translation>
@@ -2847,6 +2853,7 @@
 <translation id="5120421890733714118">Веруј овом сертификату за идентификацију веб сајтова.</translation>
 <translation id="5121130586824819730">Хард-диск је пун. Сачувајте на другу локацију или направите више простора на хард-диску.</translation>
 <translation id="5125751979347152379">Неважећа URL адреса.</translation>
+<translation id="5126663277159826272">Онемогући Quirks клијент за калибрацију екрана.</translation>
 <translation id="5127881134400491887">Управљање мрежним везама</translation>
 <translation id="5128590998814119508">2D проширени приказ листа екрана</translation>
 <translation id="512903556749061217">прикључено</translation>
@@ -2988,9 +2995,11 @@
 <translation id="5301751748813680278">Приступате као гост.</translation>
 <translation id="5301954838959518834">Важи</translation>
 <translation id="5302048478445481009">Језик</translation>
+<translation id="5304039790201806037">Догађаји показивача</translation>
 <translation id="5305688511332277257">Ништа није инсталирано</translation>
 <translation id="5308380583665731573">Повезивање</translation>
 <translation id="5311260548612583999">Приватни кључ (опционално)</translation>
+<translation id="5313967007315987356">Додај сајт</translation>
 <translation id="5316588172263354223">Гласовна претрага у сваком тренутку</translation>
 <translation id="5316716239522500219">Пресликавање монитора</translation>
 <translation id="5317780077021120954">Сачувај</translation>
@@ -3295,6 +3304,7 @@
 <translation id="5734362860645681824">Комуникације</translation>
 <translation id="573719557377416048">Обриши Copresence стање</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: изабери за измене</translation>
+<translation id="5741454054957165976">Омогућава нову верзију интервенције корисничког агента за учитавање веб-фонтова.</translation>
 <translation id="574392208103952083">Средња</translation>
 <translation id="5745056705311424885">Регистрован је USB меморијски уређај</translation>
 <translation id="5746169159649715125">Сачувај као PDF</translation>
@@ -3343,7 +3353,6 @@
 <translation id="5803531701633845775">Одаберите фразе отпозади, без померања курсора</translation>
 <translation id="5804241973901381774">Дозволе</translation>
 <translation id="580571955903695899">Поређај према наслову</translation>
-<translation id="5808982448801399019">Давање овлашћења није успело</translation>
 <translation id="580961539202306967">Питај ме када сајт жели да ми шаље искачуће поруке (препоручено)</translation>
 <translation id="5815645614496570556">X.400 адреса</translation>
 <translation id="5817397429773072584">кинески (традиционални)</translation>
@@ -3368,6 +3377,7 @@
 <translation id="5834581999798853053">Остало је око <ph name="TIME" /> минута</translation>
 <translation id="5838825566232597749">Америчка Workman интернационална</translation>
 <translation id="5839277899276241121">Исто као адреса за обрачун</translation>
+<translation id="5844550873065695788">То ће трајно избрисати бар <ph name="TOTAL_COUNT" /> ставке(и) са овог уређаја. Да бисте вратили податке касније, пријавите се у Chrome као $2.</translation>
 <translation id="5846929185714966548">4. картица</translation>
 <translation id="5848934677402291689">Чување у PDF формату је у току</translation>
 <translation id="5849335628409778954">Унесите кредитну картицу...</translation>
@@ -3614,6 +3624,7 @@
 <translation id="6232017090690406397">Батерија</translation>
 <translation id="6241530762627360640">Приступање информацијама о Bluetooth уређајима упареним са вашим системом и откривање оближњих Bluetooth уређаја.</translation>
 <translation id="6243774244933267674">Сервер је недоступан</translation>
+<translation id="6246413617632217567">Није могуће увести корисника под надзором. Проверите простор на хард-диску и дозволе и покушајте поново.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Ажурирање је спремно</translation>
 <translation id="6248400709929739064">Омогући титлове</translation>
@@ -3642,6 +3653,7 @@
 <translation id="6277518330158259200">С&amp;ними екран</translation>
 <translation id="6279183038361895380">Притисните |<ph name="ACCELERATOR" />| да бисте приказали показивач</translation>
 <translation id="6280215091796946657">Пријави ме на други налог</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Обавите експеримент у ком ће сви API-ји приказивати целокупну област приказа. На тај начин ће window.scroll својства бити повезана са целокупном облашћу приказа.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Нов штампач на мрежи}one{Нови штампачи на мрежи}few{Нови штампачи на мрежи}other{Нови штампачи на мрежи}}</translation>
 <translation id="6285395082104474418">Палета статуса вам приказује актуелни статус мреже, батерије и других ствари.</translation>
@@ -3697,6 +3709,7 @@
 <translation id="6380143666419481200">Прихвати и настави</translation>
 <translation id="6380224340023442078">Подешавања садржаја...</translation>
 <translation id="6383194710567510941">Омогућава коришћење API-ја chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{То ће трајно избрисати бар $1 ставку са овог уређаја. Да бисте вратили податке касније, пријавите се у Chrome као $2.}one{То ће трајно избрисати бар $1 ставку са овог уређаја. Да бисте вратили податке касније, пријавите се у Chrome као $2.}few{То ће трајно избрисати бар $1 ставке са овог уређаја. Да бисте вратили податке касније, пријавите се у Chrome као $2.}other{То ће трајно избрисати бар $1 ставки са овог уређаја. Да бисте вратили податке касније, пријавите се у Chrome као $2.}}</translation>
 <translation id="6384275966486438344">Промените подешавања претраге на: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Странице које видите у овом прозору се неће појављивати у историји прегледача и неће остављати друге трагове, попут колачића, на рачунару када затворите све отворене прозоре режима госта. Међутим, све датотеке које преузмете ће бити сачуване.</translation>
 <translation id="6391538222494443604">Улазни каталог мора да постоји.</translation>
@@ -3834,6 +3847,7 @@
 <translation id="6575134580692778371">Није конфигурисан</translation>
 <translation id="6575251558004911012">Питај када сајт захтева приступ мојој камери (препоручено)</translation>
 <translation id="6579159469348633828">Brotli кодирање садржаја</translation>
+<translation id="6580151766480067746">Верзија ARC.</translation>
 <translation id="6581162200855843583">Веза Google диска</translation>
 <translation id="6583070985841601920">Пријављени сте као <ph name="USER_EMAIL_ADDRESS" />. Администратор је онемогућио синхронизацију.</translation>
 <translation id="65832705307647870">Унапред попуњава страницу нове картице популарним сајтовима.</translation>
@@ -3999,6 +4013,7 @@
 <translation id="6847758263950452722">Сачувај страницу као MHTML</translation>
 <translation id="6853388645642883916">Програм за ажурирање је у стању спавања</translation>
 <translation id="68541483639528434">Затвори друге картице</translation>
+<translation id="6856701878604560493">Омогући офлајн обележиваче</translation>
 <translation id="6860097299815761905">Подешавања проксија...</translation>
 <translation id="6860427144121307915">Отвори на картици</translation>
 <translation id="6862635236584086457">За све датотеке сачуване у овом директоријуму аутоматски се прави резервна копија на мрежи</translation>
@@ -4172,6 +4187,7 @@
 <translation id="7092106376816104">Изузеци за искачуће прозоре</translation>
 <translation id="7093866338626856921">Размена података са уређајима следећих назива: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Желите ли да откријете још сјајних функција?</translation>
+<translation id="7096108453481049031">Није могуће увести корисника под надзором. Проверите мрежну везу и покушајте поново касније.</translation>
 <translation id="7100897339030255923">Изабраних ставки: <ph name="COUNT" /></translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Купи још меморијског простора...</translation>
@@ -4200,6 +4216,7 @@
 <translation id="713888829801648570">Жао нам је, нисмо успели да потврдимо лозинку јер сте офлајн.</translation>
 <translation id="7140928199327930795">Нема других доступних уређаја.</translation>
 <translation id="7141105143012495934">Пријављивање није успело јер нисмо успели да преузмемо детаље о налогу. Контактирајте администратора или покушајте поново.</translation>
+<translation id="7141331524324591758">Омогућава делимичну експерименталну подршку за API догађаја показивача. Намењено је веб-програмерима ради тестирања и довешће до једва приметног квара неких веб-сајтова.</translation>
 <translation id="7143207342074048698">Повезивање</translation>
 <translation id="7144878232160441200">Покушај поново</translation>
 <translation id="7148311641502571842">Додатна компонента<ph name="PLUGIN_NAME" /> је онемогућена. Да бисте је поново омогућили, идите на <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4842,6 +4859,7 @@
 <translation id="8119572489781388874">Измени подешавања</translation>
 <translation id="8119631488458759651">уклони овај сајт</translation>
 <translation id="8121385576314601440">Подешавања Хангул метода уноса</translation>
+<translation id="8122245494004914423">То ће трајно избрисати податке прегледања са овог уређаја. Да бисте вратили податке касније, пријавите се у Chrome као $2.</translation>
 <translation id="8124313775439841391">Управљани ONC</translation>
 <translation id="8126844665673008223">Bluetooth за веб</translation>
 <translation id="8127322077195964840">Дозволи неважеће сертификате за ресурсе који се учитавају са локалног хоста.</translation>
@@ -4927,6 +4945,7 @@
 <translation id="8226742006292257240">У наставку је насумично генерисана TPM лозинка која је додељена рачунару:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Нападачи који су тренутно на <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ће можда покушати да инсталирају опасне програме на рачунару који краду или бришу податке (на пример, слике, лозинке, поруке и бројеве кредитних картица).</translation>
+<translation id="8233254008506535819">Додаје опцију за стављање важних сајтова на белу листу у дијалогу за брисање података прегледања.</translation>
 <translation id="8236231079192337250">Апликација Галерија Chrome веб-продавнице за управљачке програме за штампаче</translation>
 <translation id="8238649969398088015">Савет за помоћ</translation>
 <translation id="8240697550402899963">Користи класичну тему</translation>
@@ -4972,7 +4991,7 @@
 <translation id="8284279544186306258">сви <ph name="WEBSITE_1" /> сајтови</translation>
 <translation id="8286227656784970313">Користи системски речник</translation>
 <translation id="8286817579635702504">Омогућава неколико безбедносних функција које ће највероватније блокирати једну или више страница које свакодневно посећујете. На пример, то су строга провера мешовитог садржаја и закључавање моћних функција ради безбедности контекста. Ова ознака ће вас вероватно нервирати.</translation>
-<translation id="8288342810474863437">Функција увоза и извоза и подешавањима лозинки.</translation>
+<translation id="8288342810474863437">Функција увоза и извоза у подешавањима лозинки.</translation>
 <translation id="8297012244086013755">Хангул, 3 реда (No Shift)</translation>
 <translation id="8298115750975731693">Wi-Fi мрежа коју користите (<ph name="WIFI_NAME" />) ће можда захтевати да посетите <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation>
 <translation id="8299269255470343364">јапански</translation>
@@ -5251,7 +5270,6 @@
 <translation id="8708671767545720562">&amp;Више информација</translation>
 <translation id="8711402221661888347">Краставчић</translation>
 <translation id="8711453844311572806">Када је телефон откључан и у околини, само кликните да бисте приступили. У супротном, видећете закључану икону и морате да унесете лозинку.</translation>
-<translation id="8712637175834984815">Важи</translation>
 <translation id="8713570323158206935">Шаљи <ph name="BEGIN_LINK1" />информације о систему<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Омогућите аутоматско исправљање за физичку тастатуру са америчким распоредом тастера. Ова функција може да вам даје предлоге док куцате на физичкој тастатури.</translation>
 <translation id="871476437400413057">Лозинке сачуване на Google-у</translation>
@@ -5615,6 +5633,7 @@
 <translation id="952992212772159698">Није активирано</translation>
 <translation id="953000875543358078">Ово ће потрајати отприлике један минут</translation>
 <translation id="960987915827980018">Остало је око сат времена</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{То ће трајно избрисати $1 ставку са овог уређаја. Да бисте вратили податке касније, пријавите се у Chrome као $2.}one{То ће трајно избрисати $1 ставку са овог уређаја. Да бисте вратили податке касније, пријавите се у Chrome као $2.}few{То ће трајно избрисати $1 ставке са овог уређаја. Да бисте вратили податке касније, пријавите се у Chrome као $2.}other{То ће трајно избрисати $1 ставки са овог уређаја. Да бисте вратили податке касније, пријавите се у Chrome као $2.}}</translation>
 <translation id="96421021576709873">Wi-Fi мрежа</translation>
 <translation id="965490406356730238">Омогућите декодирање mjpeg формата уз хардверско убрзање за снимљене кадрове када је то доступно.</translation>
 <translation id="968174221497644223">Кеш апликације</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 3b74086f..241cc3dc 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -251,6 +251,7 @@
       Observera att Bluetooth kommer att vara på för alla kompatibla enheter som tillhör <ph name="USER_DISPLAY_EMAIL" /> och att viss maskinvaruinformation skickas till Google. &lt;a&gt;Läs mer&lt;/a&gt;</translation>
 <translation id="13649080186077898">Hantera inställningar för Autofyll</translation>
 <translation id="1367951781824006909">Välj fil</translation>
+<translation id="136802136832547685">Det finns inga kontrollerade användare att lägga till på enheten.</translation>
 <translation id="1368265273904755308">Rapportera problem</translation>
 <translation id="1368832886055348810">Vänster till höger</translation>
 <translation id="1370646789215800222">Vill du ta bort personen?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Sök</translation>
 <translation id="1384211230590313258">Hanterare för tjänstidentifiering</translation>
 <translation id="1386387014181100145">Hejsan.</translation>
+<translation id="1386830813511981192">Över en miljon appar och spel finns nu tillgängliga på <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Kan endast installeras från <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Öppna som en vanlig flik</translation>
 <translation id="1395262318152388157">Sökningsreglage</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">Högermarginal</translation>
 <translation id="2282146716419988068">GPU-bearbetning</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Ny version av Åtgärd från användaragent för inläsning av WebFonts.</translation>
 <translation id="2286454467119466181">Enkel</translation>
 <translation id="2286950485307333924">Du är nu inloggad i Chrome</translation>
 <translation id="2287590536030307392">Inaktivera alla trådlösa anslutningar.</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">Tabell i Google Dokument</translation>
 <translation id="2546283357679194313">Cookies och webbplatsdata</translation>
 <translation id="2549646943416322527">Seccomp-identifiering</translation>
+<translation id="2550212893339833758">Växlingsminne</translation>
 <translation id="2553100941515833716">Återställ installationsläget för startprogrammet för appar vid varje omstart.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> kunde inte ansluta till <ph name="NETWORK_ID" />. Välj ett annat nätverk eller försök igen.</translation>
 <translation id="2553440850688409052">Dölj det här plugin-programmet</translation>
@@ -1102,6 +1106,7 @@
 <translation id="2587203970400270934">Operatörskod:</translation>
 <translation id="2587922270115112871">Inget Google-konto skapas när en övervakad användare skapas och användarens inställningar
     och data är inte tillgängliga på andra enheter via Chrome Sync. För närvarande gäller den övervakade användaren endast på den här enheten.</translation>
+<translation id="2594049137847833442">Alternativ för viktiga webbplatser i dialogrutan Rensa sökdata</translation>
 <translation id="2594056015203442344">När det här alternativet är aktiverat fungerar ljudindikatorerna i flikfältet även som ljudkontroller för flikarna. Dessutom läggs kommandon till i flikarnas snabbmenyer så att det går att stänga av ljudet från flera valda flikar snabbt.</translation>
 <translation id="259421303766146093">Förminska</translation>
 <translation id="2597852038534460976">Chrome kan inte komma åt bakgrunder. Anslut till ett nätverk.</translation>
@@ -1471,7 +1476,6 @@
 <translation id="3065140616557457172">Skriv för att söka eller skriv in en webbadress för att navigera – båda fungerar bra.</translation>
 <translation id="3067198360141518313">Kör det här plugin-programmet</translation>
 <translation id="307519606911195071">Aktivera fler tillgänglighetsfunktioner på sidan Inställningar.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> har skapats som en övervakad användare!</translation>
 <translation id="3075874217500066906">En omstart krävs för att Powerwash-processen ska inledas. Efter omstarten får du bekräfta att du vill fortsätta.</translation>
 <translation id="3076677906922146425">Låt vem som helst lägga till en person i Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1488,6 +1492,7 @@
 <translation id="3088034400796962477">Translitterering (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Byt namn ...</translation>
 <translation id="308903551226753393">Konfigurera automatiskt</translation>
+<translation id="3089231390674410424">Det verkar vara problem med användaruppgifterna. Kontrollera att inloggningen är rätt och försök igen.</translation>
 <translation id="3090819949319990166">Det går inte att kopiera den externa CRX-filen till <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558"><ph name="DEVICE_NAME" /> har kopplats</translation>
 <translation id="3092544800441494315">Ta med skärmdump:</translation>
@@ -2015,7 +2020,6 @@
 <translation id="3790856258139356663">Ansluter till testservern för Chrome Sync.</translation>
 <translation id="3790909017043401679">Ange SIM-kortets PIN</translation>
 <translation id="3792890930871100565">Koppla från skrivare</translation>
-<translation id="3795681127952030401"><ph name="URL" /> vill skicka aviseringar.</translation>
 <translation id="3796648294839530037">Favoritnätverk:</translation>
 <translation id="3797900183766075808">&amp;Sök på <ph name="SEARCH_ENGINE" /> efter ”<ph name="SEARCH_TERMS" />”</translation>
 <translation id="3798449238516105146">Version</translation>
@@ -2489,6 +2493,7 @@
 <translation id="4552678318981539154">Köp mer lagringsutrymme</translation>
 <translation id="4554591392113183336">Det externa tillägget har samma eller lägre version än det som redan finns.</translation>
 <translation id="4554796861933393312">Animeringshastighet för bläckdroppen i Material Design</translation>
+<translation id="4555670907822902621">Aktivera möjligheten att spara sidor med bokmärken för visning offline.</translation>
 <translation id="4555769855065597957">Skugga</translation>
 <translation id="4556110439722119938">Bokmärken, historik, lösenord och andra inställningar synkroniseras med ditt Google-konto så att du kan använda dem på alla enheter.</translation>
 <translation id="4557136421275541763">Varning:</translation>
@@ -2665,6 +2670,7 @@
 <translation id="4824518112777153488">Stöd för pekskärmar som känner av om du håller fingret alldeles ovanför skärmen</translation>
 <translation id="4830573902900904548">Din <ph name="DEVICE_TYPE" /> kan inte ansluta till internet med <ph name="NETWORK_NAME" />. Välj ett annat nätverk. <ph name="LEARN_MORE_LINK_START" />Läs mer<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Identiteten för <ph name="ORGANIZATION" /> på <ph name="LOCALITY" /> har verifierats av<ph name="ISSUER" />. Giltiga certifikattransparensuppgifter skickades från servern.</translation>
+<translation id="4832537345877333532">Inaktivera hämtning av ICC-skärmfiler för färgkalibrering av skärmen från Quirks-servern med enhetsspecifik kod.</translation>
 <translation id="4834912470034578916">Aktivera anpassade layouter för webbaviseringar.</translation>
 <translation id="4835836146030131423">Inloggningsfel.</translation>
 <translation id="4837926214103741331">Du har inte behörighet att använda den här enheten. Kontakta enhetens ägare om du vill ha behörighet att logga in.</translation>
@@ -2852,6 +2858,7 @@
 <translation id="5120421890733714118">Lita på detta certifikat för identifiering av webbplatser.</translation>
 <translation id="5121130586824819730">Hårddisken är full. Spara på en annan plats eller gör mer plats på hårddisken.</translation>
 <translation id="5125751979347152379">Ogiltig webbadress.</translation>
+<translation id="5126663277159826272">Inaktivera Quirks-klienten för skärmkalibrering.</translation>
 <translation id="5127881134400491887">Hantera nätverksanslutningar</translation>
 <translation id="5128590998814119508">Visningslista för 2D-canvas</translation>
 <translation id="512903556749061217">ansluten</translation>
@@ -2993,9 +3000,11 @@
 <translation id="5301751748813680278">Loggar in som gäst.</translation>
 <translation id="5301954838959518834">OK, jag fattar</translation>
 <translation id="5302048478445481009">Språk</translation>
+<translation id="5304039790201806037">Pekarhändelser</translation>
 <translation id="5305688511332277257">Ingen installerad</translation>
 <translation id="5308380583665731573">Ansluta</translation>
 <translation id="5311260548612583999">Privat nyckelfil (valfritt):</translation>
+<translation id="5313967007315987356">Lägg till webbplats</translation>
 <translation id="5316588172263354223">Röstsökning när som helst</translation>
 <translation id="5316716239522500219">Speglar monitorer</translation>
 <translation id="5317780077021120954">Spara</translation>
@@ -3298,6 +3307,7 @@
 <translation id="5734362860645681824">Kommunikation</translation>
 <translation id="573719557377416048">Radera data om samtidig närvaro</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: välj för att redigera</translation>
+<translation id="5741454054957165976">Aktivera den nya versionen av Åtgärd från användaragent för inläsning av WebFonts.</translation>
 <translation id="574392208103952083">Medium</translation>
 <translation id="5745056705311424885">Ett USB-minne har upptäckts</translation>
 <translation id="5746169159649715125">Spara som PDF</translation>
@@ -3346,7 +3356,6 @@
 <translation id="5803531701633845775">Välj fraser längst bak utan att flytta markören</translation>
 <translation id="5804241973901381774">Behörigheter</translation>
 <translation id="580571955903695899">Ordna efter titel</translation>
-<translation id="5808982448801399019">Auktoriseringen misslyckades</translation>
 <translation id="580961539202306967">Fråga mig när en webbplats vill skicka push-meddelanden (rekommenderas)</translation>
 <translation id="5815645614496570556">X.400-adress</translation>
 <translation id="5817397429773072584">kinesiska (traditionell)</translation>
@@ -3371,6 +3380,7 @@
 <translation id="5834581999798853053">Ca <ph name="TIME" /> minuter kvar</translation>
 <translation id="5838825566232597749">US Workman (internationellt)</translation>
 <translation id="5839277899276241121">Samma som faktureringsadressen</translation>
+<translation id="5844550873065695788">Det här innebär att minst <ph name="TOTAL_COUNT" /> objekt raderas från enheten. Logga in i Chrome som $2 om du vill kunna återställa data senare.</translation>
 <translation id="5846929185714966548">Flik 4</translation>
 <translation id="5848934677402291689">PDF-filen sparas</translation>
 <translation id="5849335628409778954">Ange kreditkort ...</translation>
@@ -3617,6 +3627,7 @@
 <translation id="6232017090690406397">Batteri</translation>
 <translation id="6241530762627360640">Få åtkomst till information om Bluetooth-enheter som är kopplade till ditt system och upptäck Bluetooth-enheter i närheten.</translation>
 <translation id="6243774244933267674">Servern är inte tillgänglig</translation>
+<translation id="6246413617632217567">Det gick inte att importera den hanterade användaren. Kontrollera hårddiskutrymmet och dina behörigheter och försök igen.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" /> %</translation>
 <translation id="624789221780392884">Uppdateringen är klar</translation>
 <translation id="6248400709929739064">Aktivera undertexter</translation>
@@ -3645,6 +3656,7 @@
 <translation id="6277518330158259200">T&amp;a en skärmdump</translation>
 <translation id="6279183038361895380">Tryck på |<ph name="ACCELERATOR" />| om du vill visa markören</translation>
 <translation id="6280215091796946657">Logga in med ett annat konto</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Experiment med att låta alla API:er spegla layoutens visningsområde. Då fungerar fönstrets rullningsegenskaper (window.scroll) relativt visningsområdet i layouten.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Ny skrivare i nätverket}other{Nya skrivare i nätverket}}</translation>
 <translation id="6285395082104474418">I statusfältet visas aktuell status för bland annat nätverk och batteri.</translation>
@@ -3700,6 +3712,7 @@
 <translation id="6380143666419481200">Godkänn och fortsätt</translation>
 <translation id="6380224340023442078">Innehållsinställningar...</translation>
 <translation id="6383194710567510941">Aktivera användning av API:et chrome.input.ime</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Det här innebär att minst $1 objekt raderas permanent från enheten. Logga in i Chrome som $2 om du vill kunna återställa data senare.}other{Det här innebär att minst $1 objekt raderas permanent från enheten. Logga in i Chrome som $2 om du vill kunna återställa data senare.}}</translation>
 <translation id="6384275966486438344">Ändra sökinställningarna till: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Sidorna du visar i den här fliken visas inte i webbläsarhistoriken och lämnar inga andra spår, till exempel cookies, på datorn när du har stängt alla öppna gästfönster. Filer som du laddar ned kommer dock att sparas.</translation>
 <translation id="6391538222494443604">Indatakatalog måste finnas.</translation>
@@ -3838,6 +3851,7 @@
 <translation id="6575134580692778371">Inte konfigurerat</translation>
 <translation id="6575251558004911012">Fråga när en webbplats begär åtkomst till kameran (rekommenderas)</translation>
 <translation id="6579159469348633828">Innehållskodning med Brotli.</translation>
+<translation id="6580151766480067746">ARC-version</translation>
 <translation id="6581162200855843583">Google Drive-länk</translation>
 <translation id="6583070985841601920">Inloggad som <ph name="USER_EMAIL_ADDRESS" />. Synkronisering har inaktiverats av administratören.</translation>
 <translation id="65832705307647870">Visa en första uppsättning populära webbplatser på sidan Ny flik.</translation>
@@ -4003,6 +4017,7 @@
 <translation id="6847758263950452722">Spara sidan som MHTML</translation>
 <translation id="6853388645642883916">Uppdateringstjänsten är i viloläge</translation>
 <translation id="68541483639528434">Stäng andra flikar</translation>
+<translation id="6856701878604560493">Aktivera offline-bokmärken</translation>
 <translation id="6860097299815761905">Proxyinställningar...</translation>
 <translation id="6860427144121307915">Öppna i en flik</translation>
 <translation id="6862635236584086457">Alla filer som sparas i den här mappen säkerhetskopieras online automatiskt</translation>
@@ -4174,6 +4189,7 @@
 <translation id="7092106376816104">Undantag för popup-fönster</translation>
 <translation id="7093866338626856921">Utväxla data med enheterna <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Vill du hitta fler grymma funktioner?</translation>
+<translation id="7096108453481049031">Det gick inte att importera den hanterade användaren. Kontrollera nätverksanslutningen och försök igen senare.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> markerade objekt</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Köp mer lagringsutrymme ...</translation>
@@ -4202,6 +4218,7 @@
 <translation id="713888829801648570">Ditt lösenord kunde tyvärr inte verifieras eftersom du är offline.</translation>
 <translation id="7140928199327930795">Det finns inga andra tillgängliga enheter.</translation>
 <translation id="7141105143012495934">Inloggningen misslyckades eftersom det inte gick att hämta dina kontouppgifter. Kontakta administratören eller försök igen.</translation>
+<translation id="7141331524324591758">Aktiverar ett experimentellt och partiellt stöd för API:et för pekarhändelser. Detta är endast avsett för webbutvecklares tester. Vissa webbplatser kommer inte att fungera helt korrekt.</translation>
 <translation id="7143207342074048698">Ansluter</translation>
 <translation id="7144878232160441200">Försök igen</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> har inaktiverats. Besök <ph name="CHROME_PLUGINS_LINK" /> om du vill aktivera det igen.</translation>
@@ -4849,6 +4866,7 @@
 <translation id="8119572489781388874">Ändra inställningar</translation>
 <translation id="8119631488458759651">ta bort webbplatsen</translation>
 <translation id="8121385576314601440">Inmatningsinställningar för hangul</translation>
+<translation id="8122245494004914423">All webbinformation raderas permanent från enheten. Logga in i Chrome som $2 om du vill kunna återställa data senare.</translation>
 <translation id="8124313775439841391">Hanterad ONC</translation>
 <translation id="8126844665673008223">Webb-Bluetooth</translation>
 <translation id="8127322077195964840">Tillåt ogiltiga certifikat för resurser som har lästs in från lokalvärden.</translation>
@@ -4933,6 +4951,7 @@
 <translation id="8226742006292257240">Nedan visas det slumpmässigt genererade lösenordet för TPM som har tilldelats din dator:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Det kan hända att angripare som för närvarande finns på <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> försöker installera skadliga program på datorn som stjäl eller raderar dina uppgifter (t.ex. foton, lösenord, meddelanden och kreditkort).</translation>
+<translation id="8233254008506535819">Ta med alternativet att lägga till viktiga webbplatser i en vitlista i dialogrutan Rensa sökdata.</translation>
 <translation id="8236231079192337250">Appen Chrome Web Store Gallery för skrivardrivrutiner</translation>
 <translation id="8238649969398088015">Hjälptips</translation>
 <translation id="8240697550402899963">Använd klassiskt tema</translation>
@@ -5256,7 +5275,6 @@
 <translation id="8708671767545720562">Mer information</translation>
 <translation id="8711402221661888347">Burgare</translation>
 <translation id="8711453844311572806">När din mobil är olåst och i närheten klickar du bara för att öppna den. I annat fall visas en låsikon och du måste ange lösenordet.</translation>
-<translation id="8712637175834984815">Uppfattat</translation>
 <translation id="8713570323158206935">Skicka <ph name="BEGIN_LINK1" />systeminformation<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Aktivera autokorrigering för fysiska amerikanska tangentbord så att du får förslag när du skriver på ett fysiskt tangentbord.</translation>
 <translation id="871476437400413057">Lösenord som Google sparat</translation>
@@ -5620,6 +5638,7 @@
 <translation id="952992212772159698">Inte aktiverat</translation>
 <translation id="953000875543358078">Det här kan ta en liten stund</translation>
 <translation id="960987915827980018">Ca 1 timme kvar</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Det här innebär att minst $1 objekt raderas permanent från enheten. Logga in i Chrome som $2 om du vill kunna återställa data senare.}other{Det här innebär att minst $1 objekt raderas permanent från enheten. Logga in i Chrome som $2 om du vill kunna återställa data senare.}}</translation>
 <translation id="96421021576709873">Wi-Fi-nätverk</translation>
 <translation id="965490406356730238">Aktivera maskinvaruaccelererad MJPEG-avkodning för bilder där detta är tillgängligt.</translation>
 <translation id="968174221497644223">Programmets cacheminne</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 8e52683..f8d6198 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -251,6 +251,7 @@
         Fahamu kuwa Bluetooth itawashwa kwa vifaa vyote vya <ph name="USER_DISPLAY_EMAIL" /> vinavyotumika, na baadhi ya maelezo ya maunzi yatatumwa kwenye Google. &lt;a&gt;Pata maelezo zaidi&lt;/a&gt;</translation>
 <translation id="13649080186077898">Dhibiti mipangilio ya Kujaza Kiotomatiki</translation>
 <translation id="1367951781824006909">Chagua faili</translation>
+<translation id="136802136832547685">Hakuna watumiaji wanaosimamiwa wa kuongeza kwenye kifaa hiki.</translation>
 <translation id="1368265273904755308">Ripoti tatizo</translation>
 <translation id="1368832886055348810">Kushoto hadi Kulia</translation>
 <translation id="1370646789215800222">Ungependa kumwondoa mtu?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Tafuta</translation>
 <translation id="1384211230590313258">Kishikilizi cha Ugunduaji wa Huduma</translation>
 <translation id="1386387014181100145">Hujambo.</translation>
+<translation id="1386830813511981192">Zaidi ya programu na michezo milioni moja sasa inapatikana kwenye kifaa chako cha <ph name="DEVICE_TYPE" />.</translation>
 <translation id="1389297115360905376">Hii inaweza tu kuongezwa kutoka kwenye <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Fungua kama Kichupo cha Kawaida</translation>
 <translation id="1395262318152388157">Tafuta Kitelezi</translation>
@@ -344,7 +346,7 @@
 <translation id="1493263392339817010">Badilisha fonti upendavyo...</translation>
 <translation id="1493492096534259649">Lugha hii haiwezi kutumika kwa kukagua tajahia</translation>
 <translation id="1493892686965953381">Inasubiri <ph name="LOAD_STATE_PARAMETER" /> ...</translation>
-<translation id="1493974697212162251"><ph name="ORIGIN" /> anataka kuunganisha kwenye:</translation>
+<translation id="1493974697212162251"><ph name="ORIGIN" /> inataka kuunganisha kwenye:</translation>
 <translation id="1495486559005647033">Vifaa vingine <ph name="NUM_PRINTERS" /> vinapatikana.</translation>
 <translation id="1497296278783728207">Sehemu ya majaribio ya Seccomp-BPF inatumia TSYNC</translation>
 <translation id="1497522201463361063">Haiwezi kulipa jina jipya "<ph name="FILE_NAME" />". <ph name="ERROR_MESSAGE" /></translation>
@@ -891,6 +893,7 @@
 <translation id="2280486287150724112">Pambizo la kulia</translation>
 <translation id="2282146716419988068">Mchakato wa GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Toleo jipya la Suluhu ya Ala ya Mtumiaji ya upakiaji wa WebFonts.</translation>
 <translation id="2286454467119466181">Rahisi</translation>
 <translation id="2286950485307333924">Sasa umeingia katika Chrome</translation>
 <translation id="2287590536030307392">Zima miunganisho yote pasiwaya.</translation>
@@ -1068,6 +1071,7 @@
 <translation id="2542049655219295786">Jedwali la Google</translation>
 <translation id="2546283357679194313">Data ya vidakuzi na tovuti</translation>
 <translation id="2549646943416322527">Kigunduzi cha Seccomp</translation>
+<translation id="2550212893339833758">Hifadhi iliyobadilishwa</translation>
 <translation id="2553100941515833716">Weka upya hali ya kusakinisha kizindua programu kila inapoanzishwa upya.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> haikuweza kuunganisha kwenye <ph name="NETWORK_ID" />. Tafadhali chagua mtandao mwingine au ujaribu tena.</translation>
 <translation id="2553440850688409052">Ficha Programu-jalizi Hii</translation>
@@ -1100,6 +1104,7 @@
 <translation id="2585300050980572691">Mipangilio chaguo-msingi ya utafutaji</translation>
 <translation id="2587203970400270934">Msimbo wa mtoa huduma:</translation>
 <translation id="2587922270115112871">Kuongeza mtumiaji anayesimamiwa hakufungui Akaunti ya Google, na mipangilio na data yake haitamfuata kwenye vifaa vingine vilivyo na Usawazishaji wa Chrome. Mtumiaji anayesimamiwa ameongezwa kwenye kifaa hiki tu.</translation>
+<translation id="2594049137847833442">Chaguo muhimu za tovuti katika kidirisha cha kufuta data ya kuvinjari</translation>
 <translation id="2594056015203442344">Vinapowashwa, viashiria sauti katika ukanda wa vichupo hutumika pia kama vidhibiti vya kunyamazisha. Hii pia huongeza amri katika menyu ya maudhui ya kichupo kwa ajili ya kuzima kwa haraka vichupo vingi vilivyochaguliwa.</translation>
 <translation id="259421303766146093">Punguza</translation>
 <translation id="2597852038534460976">Chrome haiwezi kufikia mandhari. Tafadhali unganisha mtandao.</translation>
@@ -1467,7 +1472,6 @@
 <translation id="3065140616557457172">Chapa ili kutafuta au uweke URL ili upitie - yote yanafanya kazi.</translation>
 <translation id="3067198360141518313">Tekeleza programu-jalizi hii</translation>
 <translation id="307519606911195071">Washa vipengele vya ufikiaji wa ziada katika ukurasa wa Mipangilio.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> ameongezwa kama mtumiaji anayesimamiwa!</translation>
 <translation id="3075874217500066906">Inahitaji kuanzishwa upya ili mchakato wa Powerwash uanze. Baada ya kuanzisha upya utaombwa uthibitishe kwamba unataka kuendelea.</translation>
 <translation id="3076677906922146425">Ruhusu yeyote aongeze wasifu kwenye Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1484,6 +1488,7 @@
 <translation id="3088034400796962477">Unukuzi wa mfumo wa kuandika (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Badilisha jina...</translation>
 <translation id="308903551226753393">Sanidi kiotomatiki</translation>
+<translation id="3089231390674410424">Inaonekana kitambulisho chako kina hitilafu. Tafadhali hakikisha kuwa umeingia katika akaunti kwa njia sahihi kisha ujaribu tena.</translation>
 <translation id="3090819949319990166">Haiwezi kunakili faili ya CRX kwenye <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" imeoanishwa</translation>
 <translation id="3092544800441494315">Jumuisha picha hii ya skrini:</translation>
@@ -2007,7 +2012,6 @@
 <translation id="3790856258139356663">Huunganisha kwenye seva ya kujaribu ya Usawazishaji wa Chrome.</translation>
 <translation id="3790909017043401679">Weka PIN ya SIM kadi</translation>
 <translation id="3792890930871100565">Kata muunganisho wa printa</translation>
-<translation id="3795681127952030401"><ph name="URL" /> inataka kukutumia arifa.</translation>
 <translation id="3796648294839530037">Vipendeleo vya Mitandao:</translation>
 <translation id="3797900183766075808">&amp;Tafuta <ph name="SEARCH_ENGINE" /> upate “<ph name="SEARCH_TERMS" />”</translation>
 <translation id="3798449238516105146">Toleo</translation>
@@ -2478,6 +2482,7 @@
 <translation id="4552678318981539154">Nunua hifadhi zaidi</translation>
 <translation id="4554591392113183336">Kiendelezi cha nje ni sawa na au toleo la chini likilinganishwa na toleo lililopo.</translation>
 <translation id="4554796861933393312">Kasi ya Uhuishaji wa Kuweka Wino wa Usanifu Bora</translation>
+<translation id="4555670907822902621">Washa kipengele cha kuhifadhi kurasa zilizoalamishwa kwa ajili ya kutazama nje ya mtandao.</translation>
 <translation id="4555769855065597957">Kivuli</translation>
 <translation id="4556110439722119938">Alamisho, historia, manenosiri na mipangilio yako mingine itasawazishwa kwenye Akaunti yako ya Google ili uitumie katika vifaa vyako vyote</translation>
 <translation id="4557136421275541763">Ilani</translation>
@@ -2652,6 +2657,7 @@
 <translation id="4824518112777153488">Matumizi ya skrini za kugusa zenye uwezo wa kuelea juu</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> yako haiwezi kuunganisha kwenye Intaneti kwa kutumia <ph name="NETWORK_NAME" />. Tafadhali chagua mtandao mwingine. <ph name="LEARN_MORE_LINK_START" />Pata maelezo zaidi<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Utambulisho wa <ph name="ORGANIZATION" /> <ph name="LOCALITY" /> umethibitishwa na <ph name="ISSUER" />. Maelezo ya Uwazi wa Cheti Sahihi yalisambazwa na seva.</translation>
+<translation id="4832537345877333532">Zima kipengee cha kurejesha faili za mwonekano za icc kutoka Seva ya Quirks kwa ajili ya upimaji wa rangi ya mwonekano.</translation>
 <translation id="4834912470034578916">Washa kipengee cha miundo maalum kwa Arifa za Wavuti.</translation>
 <translation id="4835836146030131423">Hitilafu katika kuingia.</translation>
 <translation id="4837926214103741331">Huruhusiwi kukitumia kifaa hiki. Tafadhali wasiliana na mmiliki wa kifaa kwa ruhusa ya kuingia katika akaunti.</translation>
@@ -2839,6 +2845,7 @@
 <translation id="5120421890733714118">Amini cheti hiki kwa ajili ya kutambua tovuti.</translation>
 <translation id="5121130586824819730">Diski yako kuu imejaa. Tafadhali hifadhi kwenye eneo jingine au utafute nafasi zaidi kwenye diski kuu.</translation>
 <translation id="5125751979347152379">URL batili.</translation>
+<translation id="5126663277159826272">Zima kipengele cha Quirks Client kwa ajili ya upimaji wa mwonekano.</translation>
 <translation id="5127881134400491887">Dhibiti miunganisho ya mtandao</translation>
 <translation id="5128590998814119508">Mkusanyiko wa 2D wa orodha ya kuonyesha</translation>
 <translation id="512903556749061217">kimeambatishwa</translation>
@@ -2980,9 +2987,11 @@
 <translation id="5301751748813680278">Unaingia kama Mgeni.</translation>
 <translation id="5301954838959518834">Sawa, nimeelewa</translation>
 <translation id="5302048478445481009">Lugha</translation>
+<translation id="5304039790201806037">Matukio ya Vielekezi</translation>
 <translation id="5305688511332277257">Hakuna iliyosakinishwa</translation>
 <translation id="5308380583665731573">Unganisha</translation>
 <translation id="5311260548612583999">Faili ya ufunguo wa kibinafsi (hiari):</translation>
+<translation id="5313967007315987356">Ongeza tovuti</translation>
 <translation id="5316588172263354223">Tafuta kwa kutamka wakati wowote</translation>
 <translation id="5316716239522500219">Viwambo vya kioo</translation>
 <translation id="5317780077021120954">Hifadhi</translation>
@@ -3285,6 +3294,7 @@
 <translation id="5734362860645681824">Mawasiliano</translation>
 <translation id="573719557377416048">Futa Hali ya Uwepo</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: chagua ili kubadilisha</translation>
+<translation id="5741454054957165976">Washa kipengele cha Toleo jipya la Suluhu ya Ala ya Mtumiaji kwa ajili ya upakiaji wa WebFonts.</translation>
 <translation id="574392208103952083">Wastani</translation>
 <translation id="5745056705311424885">Hifadhi ya USB imegunduliwa</translation>
 <translation id="5746169159649715125">Hifadhi kama PDF</translation>
@@ -3333,7 +3343,6 @@
 <translation id="5803531701633845775">Chagua vifungu kutoka nyuma, bila kusogeza kishale</translation>
 <translation id="5804241973901381774">Idhini</translation>
 <translation id="580571955903695899">Panga upya kwa Kichwa</translation>
-<translation id="5808982448801399019">Imeshindwa Kuidhinisha</translation>
 <translation id="580961539202306967">Niulize tovuti inapotaka kunitumia ujumbe wa programu hata wakati siitumii (imependekezwa)</translation>
 <translation id="5815645614496570556">Anwani X.400</translation>
 <translation id="5817397429773072584">Kichina cha Jadi</translation>
@@ -3358,6 +3367,7 @@
 <translation id="5834581999798853053">Zimesalia karibu dakika <ph name="TIME" /></translation>
 <translation id="5838825566232597749">Kibodi ya US Workman ya kimataifa</translation>
 <translation id="5839277899276241121">Sawa na anwani ya kutoza ada</translation>
+<translation id="5844550873065695788">Hatua hii itafuta kabisa angalau vipengee <ph name="TOTAL_COUNT" /> kwenye kifaa hiki. Ili urejeshe data yako baadaye, ingia katika chrome ukitumia $2.</translation>
 <translation id="5846929185714966548">Kichupo cha 4</translation>
 <translation id="5848934677402291689">Kuhifadhi kwenye PDF kunaendelea</translation>
 <translation id="5849335628409778954">Chapa maelezo ya kadi ya mkopo...</translation>
@@ -3604,6 +3614,7 @@
 <translation id="6232017090690406397">Betri</translation>
 <translation id="6241530762627360640">Fikia maelezo kuhusu vifaa vya Bluetooth vilivyooanishwa na mfumo wako na ugundue vifaa vya karibu vya Bluetooth.</translation>
 <translation id="6243774244933267674">Seva haipatikani.</translation>
+<translation id="6246413617632217567">Mtumiaji anayesimamiwa hakuweza kuletwa. Tafadhali angalia ruhusa na nafasi ya hifadhi ya diski kuu kisha ujaribu tena.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Sasisho iko tayari</translation>
 <translation id="6248400709929739064">Washa manukuu</translation>
@@ -3632,6 +3643,7 @@
 <translation id="6277518330158259200">Piga Picha ya Skrini</translation>
 <translation id="6279183038361895380">Bonyeza |<ph name="ACCELERATOR" />| ili kishale kionekane</translation>
 <translation id="6280215091796946657">Ingia kwa kutumia akaunti tofauti</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Jaribio la API kuakisi sehemu ya kutazamia muundo. Hii itafanya sifa za window.scroll kulingana na muundo wa sehemu ya kutazamia.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Printa mpya kwenye mtandao wako}other{Printa mpya kwenye mtandao wako}}</translation>
 <translation id="6285395082104474418">Treya ya hali inakuonyesha hali ya sasa ya mtandao wako, betri, na mambo mengine.</translation>
@@ -3687,6 +3699,7 @@
 <translation id="6380143666419481200">Kubali na uendelee</translation>
 <translation id="6380224340023442078">Mipangilio ya maudhui...</translation>
 <translation id="6383194710567510941">Washa matumizi ya API ya chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Hatua hii itafuta kabisa angalau kipengee $1 kwenye kifaa hiki. Ili kurejesha data yako baadaye, ingia katika akaunti ukitumia $2.}other{Hatua hii itafuta kabisa angalau vipengee $1 kwenye kifaa hiki. Ili kurejesha data yako baadaye, ingia katika akaunti ukitumia $2.}}</translation>
 <translation id="6384275966486438344">Badilisha mipangilio yako ya kutafuta iwe: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Kurasa unazoangalia katika dirisha hili hazitaonekana katika historia ya kivinjari na hazitaacha alama nyingine, kama vile vidakuzi, kwenye kompyuta baada ya wewe kufunga madirisha yote Geni yaliyo wazi. Hata hivyo, faili zozote unazopakua zitahifadhiwa.</translation>
 <translation id="6391538222494443604">Lazima kuwe na saraka ya uingizaji.</translation>
@@ -3825,6 +3838,7 @@
 <translation id="6575134580692778371">Haijasanidiwa</translation>
 <translation id="6575251558004911012">Uliza wakati tovuti inahitaji kufikia kamera yako (inapendekezwa)</translation>
 <translation id="6579159469348633828">Usimbaji Maudhui wa Brotli.</translation>
+<translation id="6580151766480067746">Toleo la ARC</translation>
 <translation id="6581162200855843583">Kiungo cha Hifadhi ya Google</translation>
 <translation id="6583070985841601920">Uliingia kama <ph name="USER_EMAIL_ADDRESS" />. Usawazishaji umefungwa na msimamizi wako.</translation>
 <translation id="65832705307647870">Jaza ukurasa wa Kichupo Kipya mapema kwa tovuti maarufu.</translation>
@@ -3990,6 +4004,7 @@
 <translation id="6847758263950452722">Hifadhi Ukurasa kama MHTML</translation>
 <translation id="6853388645642883916">Kisasishaji kimetulia</translation>
 <translation id="68541483639528434">Funga vichupo vingine</translation>
+<translation id="6856701878604560493">Washa kipengele cha alamisho za nje ya mtandao</translation>
 <translation id="6860097299815761905">Mipangilio ya proksi...</translation>
 <translation id="6860427144121307915">Fungua katika Kichupo</translation>
 <translation id="6862635236584086457">Faili zote zilizohifadhiwa kwenye folda hii zinachelezwa kiotomatiki mtandaoni</translation>
@@ -4163,6 +4178,7 @@
 <translation id="7092106376816104">Vighairi madirisha ibukizi</translation>
 <translation id="7093866338626856921">Badilisha data kwa vifaa viitwavyo: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Je, unataka kugundua vipengee maridadi zaidi?</translation>
+<translation id="7096108453481049031">Mtumiaji anayesimamiwa hakuweza kuletwa. Tafadhali angalia muunganisho wako wa mtandao kisha ujaribu tena baadaye.</translation>
 <translation id="7100897339030255923">Vipengee vilivyoteuliwa<ph name="COUNT" /></translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Nunua hifadhi zaidi...</translation>
@@ -4191,6 +4207,7 @@
 <translation id="713888829801648570">Samahani, nenosiri lako halikuweza kuthibitishwa kwa sababu uko nje ya mtandao.</translation>
 <translation id="7140928199327930795">Hakuna vifaa vingine vinapatikana.</translation>
 <translation id="7141105143012495934">Haikufaulu kuingia katika akaunti kwa sababu maelezo ya akaunti yako hayakupatikana. Tafadhali wasiliana na msimamizi wako au jaribu tena.</translation>
+<translation id="7141331524324591758">Huwasha matumizi ya jaribio la muda kwa ajili ya API ya Matukio ya Kielekezi. Hii inalenga majaribio pekee yanayofanywa na wasanidi wa wavuti, itasababisha baadhi ya tovuti kuharibika kwa namna ambayo ni ngumu kugundua.</translation>
 <translation id="7143207342074048698">Inaunganisha</translation>
 <translation id="7144878232160441200">Jaribu tena</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> imelemazwa. Ili kuiwezesha upya, tafadhali nenda kwenye <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4840,6 +4857,7 @@
 <translation id="8119572489781388874">Rekebisha mipangilio</translation>
 <translation id="8119631488458759651">ondoa tovuti hii</translation>
 <translation id="8121385576314601440">Mipangilio ya Hangul ya uingizaji</translation>
+<translation id="8122245494004914423">Hatua hii itafuta kabisa data yako ya kuvinjari kwenye kifaa hiki. Ili urejeshe data yako baadaye, ingia katika chrome ukitumia $2.</translation>
 <translation id="8124313775439841391">ONC Inayodhibitiwa</translation>
 <translation id="8126844665673008223">Bluetooth ya Wavuti</translation>
 <translation id="8127322077195964840">Ruhusu vyeti visivyo sahihi kwa rasilimali zilizopakiwa kutoka kwenye seva pangishi ya karibu nawe.</translation>
@@ -4925,6 +4943,7 @@
 <translation id="8226742006292257240">Hapa chini kuna nenosiri la TPM lililoundwa kinasibu ambalo limetolewa kwa kompyuta yako:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Wavamizi walio kwenye <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> kwa sasa huenda wakajaribu kusakinisha programu hatari ambazo zinaiba au kufuta maelezo kwenye kifaa chako (kwa mfano, picha, manenosiri, ujumbe, na kadi za malipo).</translation>
+<translation id="8233254008506535819">Jumuisha chaguo za kuidhinisha tovuti muhimu katika kidirisha cha kufuta data ya kuvinjari.</translation>
 <translation id="8236231079192337250">Programu ya Ghala la Duka la Chrome kwenye Wavuti kwa viendeshaji vya printa</translation>
 <translation id="8238649969398088015">Dokezo la msaada</translation>
 <translation id="8240697550402899963">Tumia mandhari Msingi</translation>
@@ -5249,7 +5268,6 @@
 <translation id="8708671767545720562">&amp;Maelezo Zaidi</translation>
 <translation id="8711402221661888347">Achali</translation>
 <translation id="8711453844311572806">Simu yako ikiwa imefunguliwa na iwe karibu, bofya tu ili kuingia. Vinginevyo, utaona aikoni iliyofungwa na uhitaji kucharaza nenosiri lako.</translation>
-<translation id="8712637175834984815">Nimeelewa</translation>
 <translation id="8713570323158206935">Tuma <ph name="BEGIN_LINK1" />maelezo ya mfumo<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Washa kibodi inayoonekana ya kurekebisha kiotomatiki kwa kibodi ya Marekani, inayoweza kutoa mapendekezo kama kucharaza kwenye kibodi inayoonekana.</translation>
 <translation id="871476437400413057">Manenosiri yaliyohifadhiwa kwenye Google</translation>
@@ -5613,6 +5631,7 @@
 <translation id="952992212772159698">Haijaamilishwa</translation>
 <translation id="953000875543358078">Huenda hatua hii ikachukua takribani dakika moja</translation>
 <translation id="960987915827980018">Takriban saa 1 imesalia</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Hatua hii itafuta kabisa kipengee $1 kwenye kifaa hiki. Ili urejeshe data yako baadaye, ingia katika akaunti ukitumia $2.}other{Hatua hii itafuta kabisa vipengee $1 kwenye kifaa hiki. Ili urejeshe data yako baadaye, ingia katika akaunti ukitumia $2.}}</translation>
 <translation id="96421021576709873">Mtandao wa Wi-Fi</translation>
 <translation id="965490406356730238">Washa mjpeg iliyoongezwa kasi kwa maunzi kusimbua fremu iliyopigwa picha inapopatikana.</translation>
 <translation id="968174221497644223">Akiba ya programu</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 5bf49a8..f7c9f8e 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -251,6 +251,7 @@
       <ph name="USER_DISPLAY_EMAIL" /> இன் இணங்கக்கூடிய எல்லா சாதனங்களிலும் புளூடூத் இயக்கப்படும் என்பதையும், சில வன்பொருள் தகவல் Googleக்கு அனுப்பப்படும் என்பதையும் நினைவில்கொள்ளவும். &lt;a&gt;மேலும் அறிக&lt;/a&gt;</translation>
 <translation id="13649080186077898">தானியங்குநிரப்பு அமைப்புகளை நிர்வகி</translation>
 <translation id="1367951781824006909">கோப்பைத் தேர்வுசெய்க</translation>
+<translation id="136802136832547685">இந்தச் சாதனத்தில் சேர்ப்பதற்கு, கண்காணிக்கப்படும் பயனர்கள் எவருமில்லை.</translation>
 <translation id="1368265273904755308">சிக்கலைப் புகார் செய்க</translation>
 <translation id="1368832886055348810">இடமிருந்து வலம்</translation>
 <translation id="1370646789215800222">பயனரை அகற்றவா?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">தேடல்</translation>
 <translation id="1384211230590313258">சர்வீஸ் டிஸ்கவரி ஹேண்ட்லர்</translation>
 <translation id="1386387014181100145">நலமா.</translation>
+<translation id="1386830813511981192">இப்போது <ph name="DEVICE_TYPE" /> இல் லட்சக்கணக்கான பயன்பாடுகளும் கேம்களும் கிடைக்கின்றன.</translation>
 <translation id="1389297115360905376"><ph name="CHROME_WEB_STORE" /> இலிருந்து மட்டுமே இதைச் சேர்க்க முடியும்.</translation>
 <translation id="1390548061267426325">வழக்கமான தாவலாகத் திற</translation>
 <translation id="1395262318152388157">தேடுவதற்கான ஸ்லைடர்</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">வலது ஓரஇடம்</translation>
 <translation id="2282146716419988068">GPU செயல்முறை</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">WebFontsஐ ஏற்றுவதற்கான, பயனர் ஏஜென்ட் குறுக்கீட்டின் புதிய பதிப்பு.</translation>
 <translation id="2286454467119466181">எளிதானது</translation>
 <translation id="2286950485307333924">இப்போது Chrome இல் உள்நுழைந்துள்ளீர்கள்</translation>
 <translation id="2287590536030307392">எல்லா கம்பியில்லா இணைப்புகளையும் நிறுத்து.</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">Google அட்டவணை</translation>
 <translation id="2546283357679194313">குக்கீகளும் தள தரவும்</translation>
 <translation id="2549646943416322527">செக்கம்ப் டிடெக்டர்</translation>
+<translation id="2550212893339833758">ஸ்வாப்டு மெமரி</translation>
 <translation id="2553100941515833716">ஒவ்வொரு மறுதுவக்கத்தின்போதும் பயன்பாட்டுத் துவக்கியின் நிறுவல் நிலையை மீட்டமை.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> ஆல் <ph name="NETWORK_ID" /> உடன் இணைய முடியவில்லை. தயவுசெய்து மற்றொரு பிணையத்தைத் தேர்ந்தெடுங்கள் அல்லது மீண்டும் முயற்சி செய்யுங்கள்.</translation>
 <translation id="2553440850688409052">இந்தச் செருகுநிரலை மறை</translation>
@@ -1103,6 +1107,7 @@
 <translation id="2587922270115112871">கண்காணிக்கப்படும் பயனரை உருவாக்குவது Google கணக்கை உருவாக்காது, மேலும் அதன் அமைப்புகளும் தரவும்
     Chrome ஒத்திசைவு மூலம் பிற சாதனங்களில் அவர்களைப் பின்தொடராது.
     இந்தச் சாதனத்தில் மட்டுமே கண்காணிக்கப்படும் பயனர் பயன்படுத்தப்படுவார்.</translation>
+<translation id="2594049137847833442">"உலாவல் தரவை அழி" எனும் உரையாடலில் முக்கியமான தளங்கள் எனும் விருப்பங்கள்</translation>
 <translation id="2594056015203442344">இயக்கப்பட்டதும், தாவல்நாடாவில் உள்ள ஆடியோ குறிப்பான்கள், தாவல் ஆடியோ ஒலியடக்கு கட்டுப்பாடுகளைப் போன்று இருமடங்காகும்.  இது தேர்ந்தெடுத்த பல தாவல்களின் ஒலியை வேகமாக முடக்க, தாவல் சூழல் மெனுவில் கருத்துகளையும் சேர்க்கும்.</translation>
 <translation id="259421303766146093">சிறிதாக்கு</translation>
 <translation id="2597852038534460976">Chrome ஆல் வால்பேப்பர்களை அணுக முடியவில்லை. பிணையத்துடன் இணைக்கவும்.</translation>
@@ -1470,7 +1475,6 @@
 <translation id="3065140616557457172">தேடுவதற்கு டைப் செய்க அல்லது வழிசெலுத்துவதற்கு ஒரு URL ஐ உள்ளிடுக – அனைத்தும் இயங்குகிறது.</translation>
 <translation id="3067198360141518313">இந்தச் செருகுநிரலை இயக்கு</translation>
 <translation id="307519606911195071">அமைப்புகள் பக்கத்தில் கூடுதல் அணுகல்தன்மை அம்சங்களை இயக்கு.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> கண்காணிக்கப்படும் பயனராக உருவாக்கப்பட்டார்!</translation>
 <translation id="3075874217500066906">பவர்வாஷ் செயல்முறையைத் தொடங்க மறுதுவக்கம் தேவை. மீண்டும் துவக்கிய பின், தொடர்வதை உறுதிபடுத்தக் கேட்கப்படுவீர்கள்.</translation>
 <translation id="3076677906922146425">யார் வேண்டுமானாலும் Chromeக்கு புதிய நபரைச் சேர்க்கலாம்</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1487,6 +1491,7 @@
 <translation id="3088034400796962477">ஒலிபெயர்ப்பு (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;மறுபெயரிடுக...</translation>
 <translation id="308903551226753393">தானாக உள்ளமை</translation>
+<translation id="3089231390674410424">உங்கள் நற்சான்றிதழில் சிக்கல் இருப்பது போல் தெரிகிறது. சரியாக உள்நுழைந்துள்ளீர்கள் என்பதை உறுதிசெய்து, மீண்டும் முயலவும்.</translation>
 <translation id="3090819949319990166">வெளிப்புற crx கோப்பை <ph name="TEMP_CRX_FILE" />க்கு நகலெடுக்க முடியாது.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" இணைக்கப்பட்டது</translation>
 <translation id="3092544800441494315">இந்த திரைபிடிப்பைச் சேர்:</translation>
@@ -2013,7 +2018,6 @@
 <translation id="3790856258139356663">Chrome ஒத்திசைவுக்காகச் சோதனை சேவையகத்துடன் இணைக்கும்.</translation>
 <translation id="3790909017043401679">சிம் கார்டு PIN ஐ உள்ளிடவும்</translation>
 <translation id="3792890930871100565">பிரிண்டர்களைத் துண்டி</translation>
-<translation id="3795681127952030401">உங்களுக்கு அறிவிப்புகளை அனுப்ப <ph name="URL" /> விழைகிறது.</translation>
 <translation id="3796648294839530037">பிடித்த நெட்வொர்க்குகள்:</translation>
 <translation id="3797900183766075808"><ph name="SEARCH_ENGINE" /> இல் “<ph name="SEARCH_TERMS" />” எனத் &amp;தேடு</translation>
 <translation id="3798449238516105146">பதிப்பு</translation>
@@ -2055,7 +2059,8 @@
 <translation id="3838543471119263078">குக்கீகள், பிற தளம் மற்றும் செருகுநிரல் தரவு</translation>
 <translation id="3839497635014791588">UI கூறுகளில் தொடுதலுக்கான கூடுதல் பதிலளிப்பு</translation>
 <translation id="3840053866656739575">Chromebox இன் இணைப்பு துண்டிக்கப்பட்டது. அருகில் நகர்த்தவும் அல்லது நாங்கள் மீண்டும் இணைக்க முயற்சிக்கும் போது சாதனத்தைச் சரிபார்க்கவும்.</translation>
-<translation id="3840055807562919428">document.write வழியாக மெயின் ஃபிரேமில் மூன்றாம் தரப்புப் பாகுபடுத்தித் தடுப்பு ஸ்கிரிப்ட்டுகள் செருகப்படுவதைத் தடுக்கும்.</translation>
+<translation id="3840055807562919428">document.write வழியாக மெயின் ஃபிரேமில் மூன்றாம் தரப்புப் பாகுபடுத்தித் தடுப்பு ஸ்கிரிப்ட்டுகள் செ
+ருகப்படுவதைத் தடுக்கும்.</translation>
 <translation id="3842552989725514455">Serif எழுத்துரு</translation>
 <translation id="3846593650622216128">இந்த அமைப்புகள் நீட்டிப்பால் செயல்படுத்தப்படும்.</translation>
 <translation id="3846833722648675493">முதல் வண்ணம்தீட்டுதலுக்குப் பிறகு பயன்பாடுகளின் சாளரங்களைக் காட்டும். அதிக அளவுள்ள பயன்பாடுகள் ஒத்திசைத்த ஆதாரங்களை ஏற்றும்போது சாளரங்கள் அவ்வப்போது காண்பிக்கப்படும், ஆனால் ஒத்திசைவின்றி அதன் பெரும்பாலான ஆதாரங்கள் ஏற்றப்பட்ட பயன்பாடுகளுக்கு அது தொடர்ந்து காண்பிக்கப்படும்.</translation>
@@ -2487,6 +2492,7 @@
 <translation id="4552678318981539154">கூடுதல் சேமிப்பிடத்தை வாங்கு</translation>
 <translation id="4554591392113183336">ஏற்கனவே இருப்பதுடன் ஒப்பிடும் போது வெளிப்புற நீட்டிப்பு ஒரே அல்லது குறைவான பதிப்பைக் கொண்டுள்ளது.</translation>
 <translation id="4554796861933393312">மெட்டீரியல் வடிவத்தில் மைத்துளியின் அனிமேஷன் வேகம்</translation>
+<translation id="4555670907822902621">ஆஃப்லைனில் பார்ப்பதற்காக, புத்தகக்குறியிட்ட பக்கங்களைச் சேமிப்பதை இயக்கு.</translation>
 <translation id="4555769855065597957">நிழல்</translation>
 <translation id="4556110439722119938">புக்மார்க்குகள், வரலாறு, கடவுச்சொற்கள் மற்றும் பிற அமைப்புகள் ஆகியவை உங்கள் Google கணக்குடன் ஒத்திசைக்கப்படும் என்பதால் அவற்றை எல்லா சாதனங்களிலும் பயன்படுத்தலாம்</translation>
 <translation id="4557136421275541763">எச்சரிக்கை: </translation>
@@ -2660,6 +2666,7 @@
 <translation id="4824518112777153488">மேலே வட்டமிடும் திறன்கொண்ட டச்ஸ்கிரீன்களுக்கான ஆதரவு</translation>
 <translation id="4830573902900904548">உங்கள் <ph name="DEVICE_TYPE" /> ஆல் <ph name="NETWORK_NAME" /> மூலம் இணையத்துடன் இணைய முடியவில்லை. வேறு நெட்வொர்க்கைத் தேர்வுசெய்யவும். <ph name="LEARN_MORE_LINK_START" />மேலும் அறிக<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572"><ph name="ORGANIZATION" /> இன் அடையாளம் <ph name="LOCALITY" /> இல் <ph name="ISSUER" /> ஆல் சரிபார்க்கப்பட்டது. சேவையகம் சரியான சான்றிதழ் வெளிப்படைத்தன்மை தகவலை வழங்கியது.</translation>
+<translation id="4832537345877333532">திரையின் வண்ண அளவுத்திருத்தத்திற்காக, க்விர்க்ஸ் சேவையகத்திலிருந்து icc திரைக் கோப்புகளை மீட்டெடுப்பதை முடக்கும்.</translation>
 <translation id="4834912470034578916">இணைய அறிவிப்புகளுக்கான தனிப்பயன் தளவமைப்புகளை இயக்கு.</translation>
 <translation id="4835836146030131423">உள்நுழைவதில் பிழை.</translation>
 <translation id="4837926214103741331">இந்தச் சாதனத்தைப் பயன்படுத்த, உங்களுக்கு அங்கீகாரம் இல்லை. உள்நுழைவு அனுமதியைப் பெற, சாதன உரிமையாளரைத் தொடர்பு கொள்ளவும்.</translation>
@@ -2847,6 +2854,7 @@
 <translation id="5120421890733714118">வலைத்தளங்களை அடையாளம் காண இந்தச் சான்றிதழை நம்புக.</translation>
 <translation id="5121130586824819730">உங்கள் ஹார்டு டிஸ்க் நிரம்பியது. மற்றொரு இடத்தில் சேமிக்கவும் அல்லது ஹார்டு டிஸ்க்கில் கூடுதல் அறைகளை உருவாக்கவும்.</translation>
 <translation id="5125751979347152379">செல்லுபடியாகாத URL.</translation>
+<translation id="5126663277159826272">திரையின் அளவுத்திருத்தத்திற்காக, க்விர்க்ஸ் க்ளையன்ட்டை முடக்கு.</translation>
 <translation id="5127881134400491887">நெட்வொர்க் இணைப்புகளை நிர்வகி</translation>
 <translation id="5128590998814119508">காட்சிப் பட்டியல் 2D கேன்வாஸ்</translation>
 <translation id="512903556749061217">இணைக்கப்பட்டது</translation>
@@ -2986,9 +2994,11 @@
 <translation id="5301751748813680278">விருந்தினராக உள்நுழைவு.</translation>
 <translation id="5301954838959518834">சரி, புரிந்தது</translation>
 <translation id="5302048478445481009">மொழி</translation>
+<translation id="5304039790201806037">பாயிண்டர் ஈவென்ட்ஸ்</translation>
 <translation id="5305688511332277257">எதுவும் நிறுவப்படவில்லை</translation>
 <translation id="5308380583665731573">இணை</translation>
 <translation id="5311260548612583999">தனிப்பட்ட விசை கோப்பு (விரும்பினால்):</translation>
+<translation id="5313967007315987356">தளத்தைச் சேர்</translation>
 <translation id="5316588172263354223">எந்த நேரத்திலும் குரல் தேடல் இயங்கும்</translation>
 <translation id="5316716239522500219">மானிட்டர்களைப் பிரதிபலி</translation>
 <translation id="5317780077021120954">சேமி</translation>
@@ -3292,6 +3302,7 @@
 <translation id="5734362860645681824">தகவல்தொடர்புகள்</translation>
 <translation id="573719557377416048">சாதனங்களின் இருப்பு நிலையை அழி</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: மாற்ற, தேர்ந்தெடுக்கவும்</translation>
+<translation id="5741454054957165976">WebFontsஐ ஏற்றுவதற்கான, பயனர் ஏஜென்ட் குறுக்கீட்டின் புதிய பதிப்பை இயக்கு.</translation>
 <translation id="574392208103952083">நடுநிலை</translation>
 <translation id="5745056705311424885">USB நினைவகம் கண்டறியப்பட்டது</translation>
 <translation id="5746169159649715125">PDFஆக சேமி</translation>
@@ -3340,7 +3351,6 @@
 <translation id="5803531701633845775">குறிப்பானை நகர்த்தாமல், பின்புறமிருந்து சொற்றொடர்களைத் தேர்வுசெய்க</translation>
 <translation id="5804241973901381774">அனுமதிகள்</translation>
 <translation id="580571955903695899">தலைப்பின்படி மறுவரிசைப்படுத்து</translation>
-<translation id="5808982448801399019">அங்கீகரிக்க முடியவில்லை</translation>
 <translation id="580961539202306967">தளம் எனக்கு புஷ் செய்திகளை அனுப்ப விழையும் போது என்னிடம் கேள் (பரிந்துரைக்கப்பட்டது)</translation>
 <translation id="5815645614496570556">X.400 முகவரி</translation>
 <translation id="5817397429773072584">பாரம்பரிய சீனம்</translation>
@@ -3365,6 +3375,7 @@
 <translation id="5834581999798853053"><ph name="TIME" /> நிமிடங்கள் உள்ளன</translation>
 <translation id="5838825566232597749">யுஎஸ் ஒர்க்மேன் இன்டர்நேஷனல்</translation>
 <translation id="5839277899276241121">பில்லிங் முகவரியே பயன்படுத்தப்படும்</translation>
+<translation id="5844550873065695788">அகற்றினால், இந்தச் சாதனத்திலிருந்து குறைந்தது <ph name="TOTAL_COUNT" /> உருப்படிகள் நிரந்தரமாக நீக்கப்படும். பின்னர் உங்கள் தரவை மீட்டெடுக்க, $2 ஆக chrome இல் உள்நுழையவும்.</translation>
 <translation id="5846929185714966548">தாவல் 4</translation>
 <translation id="5848934677402291689">PDF ஆக சேமிப்பது செயல்பாட்டில் உள்ளது</translation>
 <translation id="5849335628409778954">கிரெடிட் கார்டை உள்ளிடுக...</translation>
@@ -3609,6 +3620,7 @@
 <translation id="6232017090690406397">பேட்டரி</translation>
 <translation id="6241530762627360640">உங்கள் கணினியுடன் இணைக்கப்பட்ட புளூடூத் சாதனங்கள் பற்றிய தகவலை அணுகுதல் மற்றும் அருகிலுள்ள புளூடூத் சாதனங்களைக் கண்டறிதல்.</translation>
 <translation id="6243774244933267674">சேவையகம் கிடைக்கவில்லை</translation>
+<translation id="6246413617632217567">கண்காணிக்கப்படும் பயனரை இறக்க முடியவில்லை. உங்கள் வட்டு இயக்ககத்தின் இடத்தையும் அனுமதிகளையும் சரிபார்த்து மீண்டும் முயலவும்.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">புதுப்பிப்பு தயார்</translation>
 <translation id="6248400709929739064">வசனங்களை இயக்கு</translation>
@@ -3637,6 +3649,7 @@
 <translation id="6277518330158259200">ஸ்கிரீன் ஷாட்டை எடு</translation>
 <translation id="6279183038361895380">உங்கள் சுட்டியைக் காட்ட |<ph name="ACCELERATOR" />| என்பதை அழுத்தவும்</translation>
 <translation id="6280215091796946657">வேறொரு கணக்கு மூலம் உள்நுழைக</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">எல்லா APIகளும் தளவமைப்புக் காட்சிப்பகுதியைக் காட்டுவதற்கான பரிசோதனை. இது window.scroll பண்புகளை தளவமைப்புக் காட்சிப் பகுதியுடன் தொடர்புடையதாக்கும்.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{உங்கள் நெட்வொர்க்கில் புதிய பிரிண்டர் உள்ளது}other{உங்கள் நெட்வொர்க்கில் புதிய பிரிண்டர்கள் உள்ளன}}</translation>
 <translation id="6285395082104474418">நிலைத் தட்டானது உங்கள் பிணையம், பேட்டரி, மேலும் பலவற்றின் தற்போதைய நிலையைக் காட்டுகிறது.</translation>
@@ -3692,6 +3705,7 @@
 <translation id="6380143666419481200">ஏற்றுக்கொண்டு தொடர்க</translation>
 <translation id="6380224340023442078">உள்ளடக்க அமைப்புகள்...</translation>
 <translation id="6383194710567510941">chrome.input.ime API இன் பயன்பாட்டை இயக்கும்.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{அகற்றினால், இந்தச் சாதனத்திலிருந்து குறைந்தது $1 உருப்படி நிரந்தரமாக நீக்கப்படும். பின்னர் உங்கள் தரவை மீட்டெடுக்க, $2 ஆக chrome இல் உள்நுழையவும்.}other{அகற்றினால், இந்தச் சாதனத்திலிருந்து குறைந்தது $1 உருப்படிகள் நிரந்தரமாக நீக்கப்படும். பின்னர் உங்கள் தரவை மீட்டெடுக்க, $2 ஆக chrome இல் உள்நுழையவும்.}}</translation>
 <translation id="6384275966486438344">உங்கள் தேடல் அமைப்புகளை இதற்கு மாற்றவும்: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">இந்தச் சாளரத்தில் பார்க்கும் பக்கங்கள் உங்களின் உலாவி வரலாற்றில் தோன்றாது, மேலும் திறக்கப்பட்டிருக்கும் எல்லா விருந்தினர் சாளரங்களையும் மூடிய பிறகு, பிற தடங்களான குக்கீகள் போன்றவற்றைக் கணினியில் விட்டுச் செல்லாது. எனினும், நீங்கள் பதிவிறக்கிய எல்லா கோப்புகளும் பாதுகாக்கப்படும்.</translation>
 <translation id="6391538222494443604">உள்ளீட்டுக் கோப்பகம் இருப்பது அவசியம்.</translation>
@@ -3830,6 +3844,7 @@
 <translation id="6575134580692778371">உள்ளமைக்கப்படவில்லை</translation>
 <translation id="6575251558004911012">எனது கேமராவைத் தளம் அணுக வேண்டிய அவசியம் ஏற்படும்போது கேள் (பரிந்துரைக்கப்பட்டது)</translation>
 <translation id="6579159469348633828">ப்ராட்லி உள்ளடக்கக்-குறியீட்டு முறை.</translation>
+<translation id="6580151766480067746">ARC பதிப்பு</translation>
 <translation id="6581162200855843583">Google இயக்கக இணைப்பு</translation>
 <translation id="6583070985841601920"><ph name="USER_EMAIL_ADDRESS" /> ஆக உள்நுழைந்துள்ளார். உங்கள் நிர்வாகியால் ஒத்திசைவு முடக்கப்பட்டது.</translation>
 <translation id="65832705307647870">புதிய தாவல் பக்கங்களைப் பிரபலமான தளங்களுடன் ஏற்றும்.</translation>
@@ -3995,6 +4010,7 @@
 <translation id="6847758263950452722">MHTML பக்கமாகச் சேமி</translation>
 <translation id="6853388645642883916">புதுப்பிப்பான் செயலில் இல்லை</translation>
 <translation id="68541483639528434">பிற தாவல்களை மூடுக</translation>
+<translation id="6856701878604560493">ஆஃப்லைன் புத்தகக்குறிகளை இயக்கு</translation>
 <translation id="6860097299815761905">ப்ராக்ஸி அமைப்புகள்...</translation>
 <translation id="6860427144121307915">தாவலில் திற</translation>
 <translation id="6862635236584086457">இந்த கோப்புறையில் சேமிக்கப்பட்ட எல்லா கோப்புகளும் ஆன்லைனில் தானாகவே காப்புபிரதி எடுக்கப்படுகின்றன</translation>
@@ -4145,7 +4161,7 @@
 <translation id="7065534935986314333">முறைமையைப் பற்றி</translation>
 <translation id="7066944511817949584">"<ph name="DEVICE_NAME" />" க்கு இணைப்பதில் தோல்வி.</translation>
 <translation id="7067725467529581407">இதை ஒருபோதும் காட்டாதே.</translation>
-<translation id="7068609958927777019">இயக்கப்பட்டால், பொருத்தமற்ற URLகளைப் பாதுகாப்பான தேடலில் புகாரளிக்கும்.</translation>
+<translation id="7068609958927777019">இயக்கப்பட்டால், பொருத்தமற்ற URLகள் குறித்து மீண்டும் பாதுகாப்பான தேடலுக்குப் புகாரளிக்கலாம்.</translation>
 <translation id="7070804685954057874">நேரடி உள்ளீடு</translation>
 <translation id="7072010813301522126">குறுக்குவழி பெயர்</translation>
 <translation id="7072025625456903686">அனைத்தையும் அனுமதிக்கவும் அல்லது தனிப்பயனாக்கவும்</translation>
@@ -4166,6 +4182,7 @@
 <translation id="7092106376816104">பாப்-அப் விதிவிலக்குகள்</translation>
 <translation id="7093866338626856921">பின்வரும் பெயரிடப்பட்ட எந்தச் சாதனங்களுடனும் தரவைப் பரிமாறவும்: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">சிறந்த அற்புதமான அம்சங்களைக் கண்டறிய விரும்புகிறீர்களா?</translation>
+<translation id="7096108453481049031">கண்காணிக்கப்படும் பயனரை இறக்க முடியவில்லை. உங்கள் நெட்வொர்க் இணைப்பைச் சரிபார்த்து, பிறகு முயலவும்.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> உருப்படிகள் தேர்ந்தெடுக்கப்பட்டுள்ளன.</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">கூடுதல் சேமிப்பிடத்தை வாங்கு...</translation>
@@ -4194,6 +4211,7 @@
 <translation id="713888829801648570">நீங்கள் ஆஃப்லைனில் இருப்பதால், கடவுச்சொல்லை சரிபார்க்க முடியவில்லை.</translation>
 <translation id="7140928199327930795">பிற கிடைக்கும் சாதனங்கள் இல்லை.</translation>
 <translation id="7141105143012495934">உங்கள் கணக்கு விவரங்களை மீட்டெடுக்க முடியாததால் உள்நுழைவு தோல்வியானது. உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும் அல்லது மீண்டும் முயலவும்.</translation>
+<translation id="7141331524324591758">பாயிண்டர் ஈவென்ட்ஸ் APIக்கான பகுதியளவு பரிசோதனை ஆதரவை இயக்கும். இது இணைய டெவெலப்பர்கள் சோதனை செய்யும் நோக்கத்திற்காக மட்டுமே. மேலும் சில இணையதளங்களுக்குச் சிறிய பாதிப்புகளை (ஆனால் முக்கியமானவை) ஏற்படுத்தும்.</translation>
 <translation id="7143207342074048698">இணைத்தல்</translation>
 <translation id="7144878232160441200">மீண்டும் முயலவும்</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> முடக்கப்பட்டுள்ளது. இதை மீண்டும் இயக்க, <ph name="CHROME_PLUGINS_LINK" /> க்குச் செல்க.</translation>
@@ -4834,6 +4852,7 @@
 <translation id="8119572489781388874">அமைப்புகளை மாற்று</translation>
 <translation id="8119631488458759651">இந்த தளத்தை அகற்று</translation>
 <translation id="8121385576314601440">ஹங்குல் உள்ளீட்டு அமைப்புகள்</translation>
+<translation id="8122245494004914423">அகற்றினால், இந்தச் சாதனத்திலிருந்து உலாவல் தரவு நிரந்தரமாக நீக்கப்படும். பின்னர் உங்கள் தரவை மீட்டெடுக்க, $2 ஆக chrome இல் உள்நுழையவும்.</translation>
 <translation id="8124313775439841391">நிர்வகிக்கப்படும் ONC</translation>
 <translation id="8126844665673008223">இணைய புளூடூத்</translation>
 <translation id="8127322077195964840">லோக்கல் ஹோஸ்டிலிருந்து ஏற்றப்பட்ட ஆதாரங்களுக்காகத் தவறான சான்றிதழ்களை அனுமதிக்கவும்.</translation>
@@ -4918,6 +4937,7 @@
 <translation id="8226742006292257240">உங்கள் கணினிக்கு ஒதுக்கப்பட்ட, தோராயமாக உருவாக்கப்பட்ட TPM கடவுச்சொல் பின்வருமாறு:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> தளத்திலிருக்கும் தாக்குபவர்கள், உங்கள் தகவலைத் (எடுத்துக்காட்டாக, படங்கள், கடவுச்சொற்கள், செய்திகள் மற்றும் கிரெடிட் கார்டுகள்) திருடக்கூடிய அல்லது நீக்கக்கூடிய தீங்கிழைக்கும் நிரல்களை உங்கள் கணினியில் நிறுவ முயற்சித்திருக்கலாம்.</translation>
+<translation id="8233254008506535819">"உலாவல் தரவை அழி" எனும் உரையாடலில் முக்கியமான தளங்களை ஏற்புப்பட்டியலில் சேர்ப்பதற்கான விருப்பத்தைச் சேர்.</translation>
 <translation id="8236231079192337250">பிரிண்டர் இயக்கிகளுக்கான Chrome இணைய அங்காடி கேலரி பயன்பாடு</translation>
 <translation id="8238649969398088015">உதவிக்குறிப்பு</translation>
 <translation id="8240697550402899963">கிளாசிக் தீம் பயன்படுத்து</translation>
@@ -5138,7 +5158,7 @@
 <translation id="8571108619753148184">சேவையகம் 4</translation>
 <translation id="8572832761467613633">ஃப்ளாஷ் மட்டும்</translation>
 <translation id="8572981282494768930">எனது கேமரா அல்லது மைக்ரோஃபோனை அணுக, தளங்களை அனுமதிக்க வேண்டாம்</translation>
-<translation id="8574234089711453001">மீடியா url மூலம் பக்கத்தைத் திறக்கும் போது காட்டப்பட, பதிவிறக்குப் பொத்தானை இயக்கும்.</translation>
+<translation id="8574234089711453001">மீடியா url கொண்டுள்ள பக்கத்தைத் திறக்கும் போது "பதிவிறக்கு" பொத்தானைக் காண்பிக்க அனுமதிக்கும்.</translation>
 <translation id="857779305329188634">பரிசோதனை QUIC நெறிமுறை ஆதரவை இயக்கு.</translation>
 <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> உருப்படிகளை ஒத்திசைக்கிறது...</translation>
 <translation id="8579549103199280730">இயல்புநிலையில் கேள்</translation>
@@ -5242,7 +5262,6 @@
 <translation id="8708671767545720562">&amp;மேலும் தகவல்</translation>
 <translation id="8711402221661888347">பிக்கிள்ஸ்</translation>
 <translation id="8711453844311572806">ஃபோன் திறக்கப்பட்டு அருகில் இருக்கும் போது, நுழைவதற்குக் கிளிக் செய்தால் போதும். இல்லையெனில், பூட்டப்பட்ட ஐகானைப் பார்ப்பீர்கள், கடவுச்சொல்லை உள்ளிட வேண்டியிருக்கும்.</translation>
-<translation id="8712637175834984815">புரிந்தது</translation>
 <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />கணினியின் தகவலை<ph name="END_LINK1" /> அனுப்பு</translation>
 <translation id="8713979477561846077">US விசைப்பலகைக்கான கைமுறை விசைப்பலகை தானியங்கு திருத்தத்தை இயக்கவும், அதன் மூலம் கைமுறை விசைப்பலகையில் உள்ளிடுவதில் பரிந்துரைகளைப் பெறலாம்.</translation>
 <translation id="871476437400413057">Google சேமித்துள்ள கடவுச்சொற்கள்</translation>
@@ -5605,6 +5624,7 @@
 <translation id="952992212772159698">செயலாக்கப்படவில்லை</translation>
 <translation id="953000875543358078">இதற்கு ஒரு நிமிடம் அல்லது அதற்கும் மேல் ஆகக்கூடும்</translation>
 <translation id="960987915827980018">1 மணிநேரம் உள்ளது</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{அகற்றினால், இந்தச் சாதனத்திலிருந்து $1 உருப்படி நிரந்தரமாக நீக்கப்படும். பின்னர் உங்கள் தரவை மீட்டெடுக்க, $2 ஆக chrome இல் உள்நுழையவும்.}other{அகற்றினால், இந்தச் சாதனத்திலிருந்து $1 உருப்படிகள் நிரந்தரமாக நீக்கப்படும். பின்னர் உங்கள் தரவை மீட்டெடுக்க, $2 ஆக chrome இல் உள்நுழையவும்.}}</translation>
 <translation id="96421021576709873">வைஃபை நெட்வொர்க்</translation>
 <translation id="965490406356730238">கிடைக்கும் இடங்களில், படமெடுக்கப்பட்ட ஃப்ரேமுக்கு வன்பொருள் விரைவுப்படுத்தப்பட்ட mjpeg குறியிறக்கத்தை இயக்கவும்.</translation>
 <translation id="968174221497644223">பயன்பாட்டு தற்காலிக சேமிப்பு</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index dd7616f..f48806d1 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -251,6 +251,7 @@
         అన్ని <ph name="USER_DISPLAY_EMAIL" /> అనుకూల పరికరాలకు బ్లూటూత్ ఆన్ చేయబడుతుందని మరియు కొంత హార్డ్‌వేర్ సమాచారం Googleకి పంపబడుతుందని గుర్తుంచుకోండి. &lt;a&gt;మరింత తెలుసుకోండి&lt;/a&gt;</translation>
 <translation id="13649080186077898">స్వీయపూర్తి సెట్టింగ్‌లను నిర్వహించండి</translation>
 <translation id="1367951781824006909">ఒక ఫైల్‌ని ఎంచుకోండి</translation>
+<translation id="136802136832547685">ఈ పరికరానికి జోడించేందుకు పర్యవేక్షిత వినియోగదారులు ఎవరూ లేరు.</translation>
 <translation id="1368265273904755308">సమస్యను నివేదించు</translation>
 <translation id="1368832886055348810">ఎడమ నుండి కుడికి</translation>
 <translation id="1370646789215800222">వ్యక్తిని తీసివేయాలా?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">శోధించు</translation>
 <translation id="1384211230590313258">సర్వీస్ డిస్కవరీ హ్యాండ్లర్</translation>
 <translation id="1386387014181100145">హాయ్.</translation>
+<translation id="1386830813511981192">ఇప్పుడు మీ <ph name="DEVICE_TYPE" />లో మిలియన్‌కు పైగా అనువర్తనాలు మరియు గేమ్‌లు అందుబాటులో ఉన్నాయి.</translation>
 <translation id="1389297115360905376">ఇది <ph name="CHROME_WEB_STORE" /> నుండి మాత్రమే జోడించబడుతుంది.</translation>
 <translation id="1390548061267426325">సాధారణ ట్యాబ్‌ వలె తెరువు</translation>
 <translation id="1395262318152388157">సీక్ స్లయిడర్</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">కుడి అంచు</translation>
 <translation id="2282146716419988068">GPU ప్రాసెస్</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">WebFonts లోడింగ్ కోసం వినియోగదారు ఏజెంట్ మధ్యవర్తిత్వం కొత్త సంస్కరణ.</translation>
 <translation id="2286454467119466181">సరళం</translation>
 <translation id="2286950485307333924">మీరు ఇప్పుడు Chromeకి సైన్ ఇన్ చేసారు</translation>
 <translation id="2287590536030307392">అన్ని వైర్‌లెస్ కనెక్షన్‌లను ఆపివేయండి.</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">Google పట్టిక</translation>
 <translation id="2546283357679194313">కుక్కీలు మరియు సైట్ డేటా</translation>
 <translation id="2549646943416322527">Seccomp డిటెక్టర్</translation>
+<translation id="2550212893339833758">వినిమయం చేసిన మెమరీ</translation>
 <translation id="2553100941515833716">పునఃప్రారంభించే ప్రతిసారి అనువర్తన లాంచర్ ఇన్‌స్టాల్ స్థితిని రీసెట్ చేయండి.</translation>
 <translation id="2553340429761841190"><ph name="NETWORK_ID" />కు కనెక్ట్ చెయ్యడానికి <ph name="PRODUCT_NAME" />కి సాధ్యం కాలేదు. దయచేసి మరొక నెట్‌వర్క్‌ని ఎంచుకోండి లేదా మళ్ళీ ప్రయత్నిచండి.</translation>
 <translation id="2553440850688409052">ఈ ప్లగ్ఇన్‌ని దాచిపెట్టు</translation>
@@ -1102,6 +1106,7 @@
 <translation id="2587203970400270934">ఆపరేషన్ కోడ్:</translation>
 <translation id="2587922270115112871">పర్యవేక్షించబడే వినియోగదారుని సృష్టించడం వలన Google ఖాతా సృష్టించబడదు మరియు వాటి సెట్టింగ్‌లు
     మరియు డేటా Chrome సమకాలీకరణతో ఇతర పరికరాలకు అనుసరించబడవు. పర్యవేక్షించబడే వినియోగదారు ఈ పరికరానికి మాత్రమే వర్తింపజేయబడతారు.</translation>
+<translation id="2594049137847833442">బ్రౌజింగ్ డేటాను తీసివేయి డైలాగ్‌లో ముఖ్యమైన సైట్‌ల ఎంపికలు</translation>
 <translation id="2594056015203442344">ప్రారంభించినప్పుడు, ట్యాబ్ స్ట్రిప్‌లోని ఆడియో సూచికలు ట్యాబ్ ఆడియో మ్యూట్ నియంత్రణల్లాగా రెట్టింపు అవుతాయి.  అలాగే, ఎంచుకున్న బహుళ ట్యాబ్‌లను శీఘ్రంగా మ్యూట్ చేయడానికి ఇది ట్యాబ్ సందర్భ మెనులో ఆదేశాలను జోడిస్తుంది.</translation>
 <translation id="259421303766146093">చిన్నదిగా చూపండి</translation>
 <translation id="2597852038534460976">Chrome వాల్‌పేపర్‌లను ప్రాప్యత చేయలేదు. దయచేసి నెట్‌వర్క్‌కి కనెక్ట్ చేయండి.</translation>
@@ -1469,7 +1474,6 @@
 <translation id="3065140616557457172">శోధించడానికి టైప్ చెయ్యండి లేదా నావిగేట్ చెయ్యడానికి URLను ఎంటర్ చెయ్యండి – ప్రతిది చక్కగా పని చేస్తుంది.</translation>
 <translation id="3067198360141518313">ఈ ప్లగ్ఇన్‌ని అమలు చెయ్యి</translation>
 <translation id="307519606911195071">సెట్టింగ్‌ల పేజీలో అదనపు ప్రాప్యత లక్షణాలను ప్రారంభిస్తుంది.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> పర్యవేక్షించబడే వినియోగదారుగా సృష్టించబడ్డారు!</translation>
 <translation id="3075874217500066906">పవర్‌వాష్ ప్రక్రియను మొదలుపెట్టడానికి పునఃప్రారంభించడం అవసరం. పునఃప్రారంభించిన తర్వాత మీరు కొనసాగించాలనుకుంటున్నారో లేదో నిర్ధారించమని మిమ్మల్ని అడగడం జరుగుతుంది.</translation>
 <translation id="3076677906922146425">Chromeకి వ్యక్తిని జోడించడానికి ఎవరినైనా అనుమతించు</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1486,6 +1490,7 @@
 <translation id="3088034400796962477">లిప్యంతరీకరణ (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;పేరుమార్చు...</translation>
 <translation id="308903551226753393">స్వయంచాలకంగా కాన్ఫిగర్ చేయి</translation>
+<translation id="3089231390674410424">మీ ఆధారాలతో సమస్య ఉన్నట్లుగా కనిపిస్తోంది. దయచేసి మీరు సరిగ్గా సైన్ ఇన్ చేసినట్లు నిర్ధారించుకుని, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="3090819949319990166">బాహ్య crx ఫైల్‌ను <ph name="TEMP_CRX_FILE" />కి కాపీ చేయడం సాధ్యపడదు.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" జత చేయబడింది</translation>
 <translation id="3092544800441494315">ఈ స్క్రీన్‌షాట్‌ని చేర్చు:</translation>
@@ -2013,7 +2018,6 @@
 <translation id="3790856258139356663">Chrome సమకాలీకరణ కోసం పరీక్ష సర్వర్‌కు కనెక్ట్ చేస్తుంది.</translation>
 <translation id="3790909017043401679">SIM కార్డ్ PINని నమోదు చేయండి</translation>
 <translation id="3792890930871100565">ముద్రకాలను డిస్‌కనెక్ట్ చేయి</translation>
-<translation id="3795681127952030401"><ph name="URL" /> మీకు నోటిఫికేషన్‌లను పంపాలనుకుంటోంది.</translation>
 <translation id="3796648294839530037">ఇష్టమైన నెట్‌వర్క్‌లు:</translation>
 <translation id="3797900183766075808">“<ph name="SEARCH_TERMS" />” కోసం <ph name="SEARCH_ENGINE" />లో &amp;శోధించండి</translation>
 <translation id="3798449238516105146">సంస్కరణ</translation>
@@ -2487,6 +2491,7 @@
 <translation id="4552678318981539154">మరింత నిల్వని కొనుగోలు చేయండి</translation>
 <translation id="4554591392113183336">బాహ్య పొడిగింపు ప్రస్తుతం ఉన్న సంస్కరణతో పోలిస్తే అదేలాంటి సంస్కరణ లేదా తక్కువ సంస్కరణ.</translation>
 <translation id="4554796861933393312">విశేష రూపకల్పన సిరా చుక్క యానిమేషన్ వేగం</translation>
+<translation id="4555670907822902621">ఆఫ్‌లైన్ వీక్షణ కోసం బుక్‌మార్క్ చేసిన పేజీలను సేవ్ చేయడం ప్రారంభిస్తుంది.</translation>
 <translation id="4555769855065597957">నీడ</translation>
 <translation id="4556110439722119938">మీ బుక్‌మార్క్‌లు, చరిత్ర, పాస్‌వర్డ్‌లు మరియు ఇతర సెట్టింగ్‌లు మీ Google ఖాతాకు సమకాలీకరించబడతాయి, కాబట్టి మీరు వీటిని మీ అన్ని పరికరాల్లో ఉపయోగించవచ్చు</translation>
 <translation id="4557136421275541763">హెచ్చరిక:</translation>
@@ -2663,6 +2668,7 @@
 <translation id="4824518112777153488">వేలిని స్క్రీన్‌కు తాకించకుండా ఆపరేట్ చేయగల టచ్‌స్క్రీన్‌లకు మద్దతు</translation>
 <translation id="4830573902900904548">మీ <ph name="DEVICE_TYPE" />ను <ph name="NETWORK_NAME" /> ఉపయోగించి ఇంటర్నెట్‌కి కనెక్ట్ చేయలేకపోయింది. దయచేసి మరో నెట్‌వర్క్‌ను ఎంచుకోండి. <ph name="LEARN_MORE_LINK_START" />మరింత తెలుసుకోండి<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572"><ph name="LOCALITY" /> ప్రాంతంలో ఉన్న <ph name="ORGANIZATION" /> గుర్తింపు <ph name="ISSUER" /> ద్వారా ధృవీకరించబడింది. చెల్లుబాటు అయ్యే ప్రమాణపత్రం పారదర్శకత సమాచారం సర్వర్ ద్వారా సరఫరా చేయబడింది.</translation>
+<translation id="4832537345877333532">డిస్‌ప్లే రంగు క్రమాంకనం కోసం Quirks సర్వర్ నుండి icc డిస్‌ప్లే ఫైల్‌లను తిరిగి పొందడాన్ని నిలిపివేస్తుంది.</translation>
 <translation id="4834912470034578916">వెబ్ నోటిఫికేషన్‌ల కోసం అనుకూల లేఅవుట్‌లను ప్రారంభించండి.</translation>
 <translation id="4835836146030131423">సైన్ ఇన్ చేయడంలో లోపం.</translation>
 <translation id="4837926214103741331">ఈ పరికరాన్ని ఉపయోగించడానికి మీకు అధికారం లేదు. దయచేసి సైన్-ఇన్ అనుమతి కోసం పరికర యజమానిని సంప్రదించండి.</translation>
@@ -2850,6 +2856,7 @@
 <translation id="5120421890733714118">వెబ్‌సైట్‌లను గుర్తించడానికి ఈ ప్రమాణపత్రాన్ని విశ్వసించండి.</translation>
 <translation id="5121130586824819730">మీ హార్డ్ డిస్క్ నిండింది. దయచేసి మరొక స్థానానికి సేవ్ చేయండి లేదా హార్డ్ డిస్క్‌లో ఎక్కువ ఖాళీ చేయండి.</translation>
 <translation id="5125751979347152379">చెల్లని URL.</translation>
+<translation id="5126663277159826272">డిస్‌ప్లే క్రమాంకనం కోసం Quirks క్లయింట్‌ను నిలిపివేయండి.</translation>
 <translation id="5127881134400491887">నెట్‌వర్క్ కనెక్షన్‌లను నిర్వహించండి</translation>
 <translation id="5128590998814119508">ప్రదర్శన జాబితా 2D కాన్వాస్</translation>
 <translation id="512903556749061217">జోడించబడింది</translation>
@@ -2991,9 +2998,11 @@
 <translation id="5301751748813680278">అతిథిగా ప్రవేశిస్తున్నారు.</translation>
 <translation id="5301954838959518834">సరే, అర్థమైంది</translation>
 <translation id="5302048478445481009">భాష</translation>
+<translation id="5304039790201806037">పాయింటర్ ఈవెంట్‌లు</translation>
 <translation id="5305688511332277257">ఏవి వ్యవస్థాపించబడలేదు</translation>
 <translation id="5308380583665731573">కనెక్ట్ చేయండి</translation>
 <translation id="5311260548612583999">వ్యక్తిగత కీ ఫైల్ (ఇచ్ఛాపూరితం):</translation>
+<translation id="5313967007315987356">సైట్‌ను జోడించు</translation>
 <translation id="5316588172263354223">ఎప్పుడైనా వాయిస్ శోధన చేయండి</translation>
 <translation id="5316716239522500219">మానిటర్‌లను ప్రతిబింబించు</translation>
 <translation id="5317780077021120954">సేవ్ చేయి</translation>
@@ -3296,6 +3305,7 @@
 <translation id="5734362860645681824">కమ్యూనికేషన్‌లు</translation>
 <translation id="573719557377416048">సముఖ స్థితిని తీసివేయి</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: సవరించడానికి ఎంచుకోండి</translation>
+<translation id="5741454054957165976">WebFonts లోడింగ్ కోసం వినియోగదారు ఏజెంట్ మధ్యవర్తిత్వం కొత్త సంస్కరణను ప్రారంభిస్తుంది.</translation>
 <translation id="574392208103952083">మధ్యస్థం</translation>
 <translation id="5745056705311424885">USB మెమరీ స్టిక్ కనుగొనబడింది</translation>
 <translation id="5746169159649715125">PDF వలె సేవ్ చేయి</translation>
@@ -3344,7 +3354,6 @@
 <translation id="5803531701633845775">కర్సర్ కదలకుండా, వెనుక నుండి పదబంధాలను ఎంచుకోండి</translation>
 <translation id="5804241973901381774">అనుమతులు</translation>
 <translation id="580571955903695899">శీర్షిక ద్వారా క్రమాన్ని మార్చు</translation>
-<translation id="5808982448801399019">ప్రామాణీకరణ విఫలమైంది</translation>
 <translation id="580961539202306967">సైట్ నాకు పుష్ సందేశాలను పంపాలనుకున్నప్పుడు నన్ను అడుగు (సిఫార్సు చేయబడింది)</translation>
 <translation id="5815645614496570556">X.400 చిరునామా</translation>
 <translation id="5817397429773072584">సాంప్రదాయ చైనీస్</translation>
@@ -3369,6 +3378,7 @@
 <translation id="5834581999798853053">సుమారు <ph name="TIME" /> నిమిషాలు మిగిలి ఉన్నాయి</translation>
 <translation id="5838825566232597749">US వర్క్‌మాన్ అంతర్జాతీయం</translation>
 <translation id="5839277899276241121">బిల్లింగ్ చిరునామానే ఉపయోగించు</translation>
+<translation id="5844550873065695788">దీని వలన ఈ పరికరం నుండి కనీసం <ph name="TOTAL_COUNT" /> అంశాలు శాశ్వతంగా తొలగించబడతాయి. మీ డేటాను తర్వాత తిరిగి పొందడానికి, chromeకి $2 వలె సైన్ ఇన్ చేయండి.</translation>
 <translation id="5846929185714966548">ట్యాబ్‌ 4</translation>
 <translation id="5848934677402291689">PDFకు సేవ్ చేయడం ప్రోగ్రెస్‌లో ఉంది</translation>
 <translation id="5849335628409778954">క్రెడిట్ కార్డ్‌ను నమోదు చేయండి...</translation>
@@ -3613,6 +3623,7 @@
 <translation id="6232017090690406397">బ్యాటరీ</translation>
 <translation id="6241530762627360640">మీ సిస్టమ్‌తో జత చేయబడిన బ్లూటూత్ పరికరాలకు సంబంధించిన సమాచారాన్ని ప్రాప్యత చేయడానికి మరియు సమీపంలోని బ్లూటూత్ పరికరాలను కనుగొనడానికి అనుమతి.</translation>
 <translation id="6243774244933267674">సర్వర్ అందుబాటులో లేదు</translation>
+<translation id="6246413617632217567">పర్యవేక్షిత వినియోగదారుని దిగుమతి చేయడం సాధ్యపడలేదు. దయచేసి మీ హార్డ్ డ్రైవ్ స్థలం మరియు అనుమతులను తనిఖీ చేసి, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">నవీకరణ సిద్ధంగా ఉంది</translation>
 <translation id="6248400709929739064">ఉపశీర్షికలను ప్రారంభించు</translation>
@@ -3641,6 +3652,7 @@
 <translation id="6277518330158259200">స్క్రీన్‌షాట్‌ను తీ&amp;యి</translation>
 <translation id="6279183038361895380">మీ కర్సర్‌ను చూపడానికి |<ph name="ACCELERATOR" />| నొక్కండి</translation>
 <translation id="6280215091796946657">వేరొక ఖాతాతో సైన్ ఇన్ చేయండి</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">అన్ని APIలు లేఅవుట్ వీక్షణపోర్ట్‌ను ప్రతిబింబించడానికి ప్రయోగం. ఇది window.scroll లక్షణాలను లేఅవుట్ వీక్షణపోర్ట్‌కు అనుగుణంగా చేస్తుంది.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{మీ నెట్‌వర్క్‌లో కొత్త ప్రింటర్}other{మీ నెట్‌వర్క్‌లో కొత్త ప్రింటర్‌లు}}</translation>
 <translation id="6285395082104474418">స్థితి ట్రే మీ నెట్‌వర్క్, బ్యాటరీ మరియు మరిన్ని అంశాల యొక్క ప్రస్తుత స్థితిని మీకు చూపుతుంది.</translation>
@@ -3696,6 +3708,7 @@
 <translation id="6380143666419481200">అంగీకరించి, కొనసాగండి</translation>
 <translation id="6380224340023442078">కంటెంట్ సెట్టింగ్‌లు...</translation>
 <translation id="6383194710567510941">chrome.input.ime API వినియోగాన్ని ప్రారంభిస్తుంది.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{దీని వలన ఈ పరికరం నుండి కనీసం $1 అంశం శాశ్వతంగా తొలగించబడుతుంది. మీ డేటాను తర్వాత తిరిగి పొందడానికి, chromeకి $2 వలె సైన్ ఇన్ చేయండి.}other{దీని వలన ఈ పరికరం నుండి కనీసం $1 అంశాలు శాశ్వతంగా తొలగించబడతాయి. మీ డేటాను తర్వాత తిరిగి పొందడానికి, chromeకి $2 వలె సైన్ ఇన్ చేయండి.}}</translation>
 <translation id="6384275966486438344">మీ శోధన సెట్టింగ్‌లను దీనికి మార్చండి: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">మీరు ఈ విండో‌లో వీక్షించే పేజీలు బ్రౌజర్ చరిత్రలో కనిపించవు మరియు తెరవబడిన అన్ని అతిథి విండోలను మీరు మూసివేసిన తర్వాత అవి కంప్యూటర్‌లో కుక్కీల వంటి ఇతర జాడలను వదిలిపెట్టవు. అయితే, మీరు డౌన్‌లోడ్ చేసే ఫైల్‌లు భద్రపరచబడతాయి.</translation>
 <translation id="6391538222494443604">ఇన్‌పుట్ డైరెక్టరీ తప్పనిసరిగా ఉనికిలో ఉండాలి.</translation>
@@ -3834,6 +3847,7 @@
 <translation id="6575134580692778371">కాన్ఫిగర్ చెయ్యలేదు</translation>
 <translation id="6575251558004911012">సైట్ మీ కెమెరాకు ప్రాప్యత కావాలనుకున్నప్పుడు అడగాలి (సిఫార్సు చేయబడింది)</translation>
 <translation id="6579159469348633828">Brotli కంటెంట్-ఎన్‌కోడింగ్.</translation>
+<translation id="6580151766480067746">ARC సంస్కరణ</translation>
 <translation id="6581162200855843583">Google డిస్క్ లింక్</translation>
 <translation id="6583070985841601920"><ph name="USER_EMAIL_ADDRESS" />గా సైన్ ఇన్ చేసారు. మీ నిర్వాహకుడు సమకాలీకరణను నిలిపివేసారు.</translation>
 <translation id="65832705307647870">కొత్త ట్యాబ్ పేజీని జనాదరణ పొందిన సైట్‌లతో ముందే నింపేస్తుంది.</translation>
@@ -4000,6 +4014,7 @@
 <translation id="6847758263950452722">పేజీని MHTML వలె సేవ్ చేయండి</translation>
 <translation id="6853388645642883916">అప్‌డేటర్ నిద్రావస్థలో ఉంది</translation>
 <translation id="68541483639528434">ఇతర ట్యాబ్‌లను మూసివేయి</translation>
+<translation id="6856701878604560493">ఆఫ్‌లైన్ బుక్‌మార్క్‌లను ప్రారంభించండి</translation>
 <translation id="6860097299815761905">ప్రాక్సీ సెట్టింగ్‌లు...</translation>
 <translation id="6860427144121307915">ట్యాబ్‌లో తెరువు</translation>
 <translation id="6862635236584086457">ఈ ఫోల్డర్‌లో సేవ్ చేసిన అన్ని ఫైల్‌లు ఆన్‌లైన్‌లో స్వయంచాలకంగా బ్యాకప్ చేయబడతాయి</translation>
@@ -4171,6 +4186,7 @@
 <translation id="7092106376816104">పాప్-అప్ మినహాయింపులు</translation>
 <translation id="7093866338626856921">ఈ పేర్లు గల పరికరాలతో డేటాను ఇచ్చిపుచ్చుకోవడానికి అనుమతి: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">మరిన్ని అద్భుతమైన లక్షణాలను కనుగొనాలనుకుంటున్నారా?</translation>
+<translation id="7096108453481049031">పర్యవేక్షిత వినియోగదారును దిగుమతి చేయడం సాధ్యపడలేదు. దయచేసి మీ నెట్‌వర్క్ కనెక్షన్‌ను తనిఖీ చేసి, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> అంశాలు ఎంచుకోబడ్డాయి</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">మరింత నిల్వని కొనుగోలు చేయండి...</translation>
@@ -4199,6 +4215,7 @@
 <translation id="713888829801648570">క్షమించండి, మీరు ఆఫ్‌లైన్‌లో ఉన్నందున మీ పాస్‌వర్డ్ ధృవీకరించబడలేదు.</translation>
 <translation id="7140928199327930795">అందుబాటులో ఉన్న ఇతర పరికరాలు ఏవీ లేవు.</translation>
 <translation id="7141105143012495934">మీ ఖాతా వివరాలను తిరిగి పొందలేనందున సైన్-ఇన్ విఫలమైంది. దయచేసి మీ నిర్వాహకుడిని సంప్రదించండి లేదా మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="7141331524324591758">పాయింటర్ ఈవెంట్‌ల API కోసం పాక్షిక ప్రయోగాత్మక మద్దతును ప్రారంభిస్తుంది.  ఇది వెబ్ డెవలపర్‌లు పరీక్షించడం కోసం మాత్రమే ఉద్దేశించినది, దీని వలన కొన్ని వెబ్‌సైట్‌లు మధ్యమధ్యలో పాడయ్యే అవకాశం ఉంది.</translation>
 <translation id="7143207342074048698">కనెక్ట్ అవుతోంది</translation>
 <translation id="7144878232160441200">మళ్లీ ప్రయత్నించండి</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> నిలిపివేయబడింది. దీన్ని మళ్లీ ప్రారంభించడానికి, దయచేసి <ph name="CHROME_PLUGINS_LINK" />కు వెళ్లండి.</translation>
@@ -4844,6 +4861,7 @@
 <translation id="8119572489781388874">సెట్టింగ్‌లను సవరించు</translation>
 <translation id="8119631488458759651">ఈ సైట్‌ను తొలగించు</translation>
 <translation id="8121385576314601440">హంగుల్ ఇన్‌పుట్ సెట్టింగ్‌లు</translation>
+<translation id="8122245494004914423">దీని వలన ఈ పరికరం నుండి మీ బ్రౌజింగ్ డేటా శాశ్వతంగా తొలగించబడుతుంది. మీ డేటాను తర్వాత తిరిగి పొందడానికి, chromeకి $2 వలె సైన్ ఇన్ చేయండి.</translation>
 <translation id="8124313775439841391">నిర్వహిత ONC</translation>
 <translation id="8126844665673008223">వెబ్ బ్లూటూత్</translation>
 <translation id="8127322077195964840">localhost నుండి లోడ్ చేసిన వనరుల కోసం చెల్లని ప్రమాణపత్రాలను అనుమతించండి.</translation>
@@ -4928,6 +4946,7 @@
 <translation id="8226742006292257240">క్రింద యాదృచ్ఛికంగా సృష్టించబడిన TPM పాస్‌వర్డ్‌లు మీ కంప్యూటర్‌కు సూచించబడ్డాయి:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">ప్రస్తుతం <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />పై దాడి చేసినవారు మీ సమాచారాన్ని (ఉదాహరణకు, ఫోటోలు, పాస్‌వర్డ్‌లు, సందేశాలు మరియు క్రెడిట్ కార్డ్‌లు) దొంగిలించడం కోసం లేదా తొలగించడం కోసం మీ కంప్యూటర్‌లో ప్రమాదకరమైన ప్రోగ్రామ్‌లను ఇన్‌స్టాల్ చేయడానికి ప్రయత్నించి ఉండవచ్చు.</translation>
+<translation id="8233254008506535819">బ్రౌజింగ్ డేటాను తీసివేయి డైలాగ్‌లో ముఖ్యమైన సైట్‌లను అనుమతి జాబితాకు జోడించే ఎంపికను చేర్చుతుంది.</translation>
 <translation id="8236231079192337250">ప్రింటర్ డ్రైవర్‌ల కోసం Chrome వెబ్ స్టోర్ గ్యాలరీ అనువర్తనం</translation>
 <translation id="8238649969398088015">సహాయ చిట్కా</translation>
 <translation id="8240697550402899963">క్లాసిక్ థీమ్‌ని ఉపయోగించు</translation>
@@ -5251,7 +5270,6 @@
 <translation id="8708671767545720562">&amp;మరింత సమాచారం</translation>
 <translation id="8711402221661888347">ఊరగాయలు</translation>
 <translation id="8711453844311572806">మీ ఫోన్ అన్‌లాక్ చేయబడి, సమీపంలో ఉన్నప్పుడు, ప్రవేశించడానికి కేవలం క్లిక్ చేస్తే సరిపోతుంది. లేదంటే, మీకు లాక్ చేసిన చిహ్నం కనిపిస్తుంది, అప్పుడు మీ పాస్‌వర్డ్‌ను టైప్ చేయాలి.</translation>
-<translation id="8712637175834984815">అర్థమైంది</translation>
 <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />సిస్టమ్ సమాచారాన్ని<ph name="END_LINK1" /> పంపు</translation>
 <translation id="8713979477561846077">US కీబోర్డ్ కోసం భౌతిక కీబోర్డ్ స్వీయ సవరణను ప్రారంభించండి, దీని వలన భౌతిక కీబోర్డ్‌పై టైప్ చేస్తున్నప్పుడు సూచనలు అందించబడతాయి.</translation>
 <translation id="871476437400413057">Google సేవ్ చేసిన పాస్‌వర్డ్‌లు</translation>
@@ -5614,6 +5632,7 @@
 <translation id="952992212772159698">సక్రియం చెయ్యబడలేదు</translation>
 <translation id="953000875543358078">దీనికి సుమారు ఒక నిమిషం పట్టవచ్చు</translation>
 <translation id="960987915827980018">సుమారు 1 గంట మిగిలి ఉంది</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{దీని వలన ఈ పరికరం నుండి $1 అంశం శాశ్వతంగా తొలగించబడుతుంది. మీ డేటాను తర్వాత తిరిగి పొందడానికి, chromeకి $2 వలె సైన్ ఇన్ చేయండి.}other{దీని వలన ఈ పరికరం నుండి $1 అంశాలు శాశ్వతంగా తొలగించబడతాయి. మీ డేటాను తర్వాత తిరిగి పొందడానికి, chromeకి $2 వలె సైన్ ఇన్ చేయండి.}}</translation>
 <translation id="96421021576709873">Wi-Fi నెట్‌వర్క్</translation>
 <translation id="965490406356730238">క్యాప్చర్ చేసిన ఫ్రేమ్ కోసం అందుబాటులో ఉన్నప్పుడు హార్డ్‌వేర్ వేగవంతం చేసే mjpeg డీకోడ్‌ను ప్రారంభిస్తుంది.</translation>
 <translation id="968174221497644223">అనువర్తన కాష్</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 8d475e5..ce85341f 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -251,6 +251,7 @@
         โปรดทราบว่าระบบจะเปิดบลูทูธสำหรับอุปกรณ์ทั้งหมดที่เข้ากันได้ของ <ph name="USER_DISPLAY_EMAIL" /> และจะส่งข้อมูลฮาร์ดแวร์บางอย่างไปยัง Google &lt;a&gt;เรียนรู้เพิ่มเติม&lt;/a&gt;</translation>
 <translation id="13649080186077898">จัดการการตั้งค่าป้อนอัตโนมัติ</translation>
 <translation id="1367951781824006909">เลือกไฟล์</translation>
+<translation id="136802136832547685">ไม่มีผู้ใช้ภายใต้การดูแลที่จะเพิ่มลงในอุปกรณ์เครื่องนี้</translation>
 <translation id="1368265273904755308">รายงานปัญหา</translation>
 <translation id="1368832886055348810">ซ้ายไปขวา</translation>
 <translation id="1370646789215800222">นำบุคคลนี้ออกใช่ไหม</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">ค้นหา</translation>
 <translation id="1384211230590313258">เครื่องจัดการการสำรวจบริการ</translation>
 <translation id="1386387014181100145">สวัสดี</translation>
+<translation id="1386830813511981192">แอปและเกมนับล้านรายการพร้อมให้บริการแล้วบน <ph name="DEVICE_TYPE" /> ของคุณ</translation>
 <translation id="1389297115360905376">ต้องเพิ่มจาก <ph name="CHROME_WEB_STORE" /> เท่านั้น</translation>
 <translation id="1390548061267426325">เปิดเป็นแท็บทั่วไป</translation>
 <translation id="1395262318152388157">แถบเลื่อนเพื่อค้นหา</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">ขอบขวา</translation>
 <translation id="2282146716419988068">การประมวลผลของ GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">การแทรกแซงของ user agent เวอร์ชันใหม่สำหรับการโหลด WebFonts</translation>
 <translation id="2286454467119466181">ง่าย</translation>
 <translation id="2286950485307333924">คุณได้ลงชื่อเข้าใช้ Chrome แล้ว</translation>
 <translation id="2287590536030307392">ปิดการเชื่อมต่อไร้สายทั้งหมด</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">ตารางของ Google</translation>
 <translation id="2546283357679194313">คุกกี้และข้อมูลไซต์</translation>
 <translation id="2549646943416322527">ตัวตรวจหา Seccomp</translation>
+<translation id="2550212893339833758">หน่วยความจำสว็อป</translation>
 <translation id="2553100941515833716">รีเซ็ตสถานะการติดตั้งเครื่องเรียกใช้งานแอปทุกครั้งที่รีสตาร์ท</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> ไม่สามารถเชื่อมต่อกับ <ph name="NETWORK_ID" /> โปรดเลือกเครือข่ายอื่นหรือลองอีกครั้ง</translation>
 <translation id="2553440850688409052">ซ่อนปลั๊กอินนี้</translation>
@@ -1102,6 +1106,7 @@
 <translation id="2587203970400270934">รหัสผู้ให้บริการ:</translation>
 <translation id="2587922270115112871">การสร้างผู้ใช้ภายใต้การดูแลไม่ได้สร้างบัญชี Google และการตั้งค่า
     และข้อมูลของพวกเขาจะไม่ตามพวกเขาไปยังอุปกรณ์อื่นๆ ที่มีการซิงค์ของ Chrome ผู้ใช้ภายใต้การดูแลใช้เฉพาะกับอุปกรณ์นี้เท่านั้น</translation>
+<translation id="2594049137847833442">ตัวเลือกสำคัญของเว็บไซต์ในกล่องโต้ตอบ "ล้างข้อมูลการท่องเว็บ"</translation>
 <translation id="2594056015203442344">เมื่อเปิดใช้ สัญญาณบอกสถานะเสียงในแนวแท็บจะทำงานเป็นส่วนควบคุมการปิดเสียงแท็บด้วย  นี่ยังเป็นการเพิ่มคำสั่งในเมนูบริบทของแท็บเพื่อให้สามารถปิดเสียงแท็บที่เลือกหลายๆ แท็บได้อย่างรวดเร็ว</translation>
 <translation id="259421303766146093">ย่อ</translation>
 <translation id="2597852038534460976">Chrome ไม่สามารถเข้าถึงวอลเปเปอร์ โปรดเชื่อมต่อกับเครือข่าย</translation>
@@ -1469,7 +1474,6 @@
 <translation id="3065140616557457172">พิมพ์เพื่อค้นหาหรือป้อน URL เพื่อไปยังทุกๆ เรื่องที่สามารถแสดงผลได้</translation>
 <translation id="3067198360141518313">เรียกใช้ปลั๊กอินนี้</translation>
 <translation id="307519606911195071">เปิดใช้คุณลักษณะการเข้าถึงเพิ่มเติมในหน้าการตั้งค่า</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> ถูกสร้างขึ้นเป็นผู้ใช้ภายใต้การดูแล!</translation>
 <translation id="3075874217500066906">จำเป็นต้องรีสตาร์ทเพื่อเริ่มดำเนินการ Powerwash เมื่อรีสตาร์ทแล้ว ระบบจะขอให้คุณยืนยันว่าคุณต้องการดำเนินการ</translation>
 <translation id="3076677906922146425">อนุญาตให้ทุกคนเพิ่มบุคคลไปยัง Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1486,6 +1490,7 @@
 <translation id="3088034400796962477">การทับศัพท์ (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;เปลี่ยนชื่อ...</translation>
 <translation id="308903551226753393">กำหนดค่าโดยอัตโนมัติ</translation>
+<translation id="3089231390674410424">ดูเหมือนว่าข้อมูลรับรองมีปัญหา โปรดตรวจสอบว่าคุณได้ลงชื่อเข้าใช้อย่างถูกต้องแล้วลองอีกครั้ง</translation>
 <translation id="3090819949319990166">ไม่สามารถคัดลอกไฟล์ crx ภายนอกไปยัง <ph name="TEMP_CRX_FILE" /></translation>
 <translation id="3090871774332213558">จับคู่ "<ph name="DEVICE_NAME" />" แล้ว</translation>
 <translation id="3092544800441494315">รวมภาพหน้าจอนี้:</translation>
@@ -2012,7 +2017,6 @@
 <translation id="3790856258139356663">เชื่อมต่อเซิร์ฟเวอร์ทดสอบสำหรับการซิงค์ของ Chrome</translation>
 <translation id="3790909017043401679">ป้อน PIN ของซิมการ์ด</translation>
 <translation id="3792890930871100565">ยกเลิกการเชื่อมต่อเครื่องพิมพ์</translation>
-<translation id="3795681127952030401"><ph name="URL" /> ต้องการส่งการแจ้งเตือนให้กับคุณ</translation>
 <translation id="3796648294839530037">เครือข่ายที่ชื่นชอบ:</translation>
 <translation id="3797900183766075808">&amp;ค้นหา “<ph name="SEARCH_TERMS" />” ด้วย <ph name="SEARCH_ENGINE" /></translation>
 <translation id="3798449238516105146">รุ่น</translation>
@@ -2486,6 +2490,7 @@
 <translation id="4552678318981539154">ซื้อพื้นที่เก็บข้อมูลเพิ่ม</translation>
 <translation id="4554591392113183336">ส่วนขยายภายนอกเป็นเวอร์ชันเดียวกันหรือต่ำกว่าเมื่อเปรียบเทียบกับส่วนขยายที่มีอยู่</translation>
 <translation id="4554796861933393312">ความเร็วของภาพเคลื่อนไหวรูปหยดหมึกของดีไซน์ Material</translation>
+<translation id="4555670907822902621">เปิดใช้การบันทึกหน้าที่บุ๊กมาร์กไว้เพื่อดูแบบออฟไลน์</translation>
 <translation id="4555769855065597957">เงา</translation>
 <translation id="4556110439722119938">บุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ จะซิงค์กับบัญชี Google เพื่อให้คุณสามารถใช้ข้อมูลเหล่านี้ได้กับอุปกรณ์ทุกเครื่อง</translation>
 <translation id="4557136421275541763">คำเตือน:</translation>
@@ -2661,6 +2666,7 @@
 <translation id="4824518112777153488">การสนับสนุนหน้าจอสัมผัสที่ตรวจจับการวางนิ้วได้</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> ของคุณไม่สามารถเชื่อมต่ออินเทอร์เน็ตโดยใช้ <ph name="NETWORK_NAME" /> โปรดเลือกเครือข่ายอื่น <ph name="LEARN_MORE_LINK_START" />เรียนรู้เพิ่มเติม<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">ข้อมูลประจำตัวของ <ph name="ORGANIZATION" /> ที่ <ph name="LOCALITY" /> ได้รับการยืนยันโดย <ph name="ISSUER" /> เซิร์ฟเวอร์นำส่งข้อมูลประกาศนียบัตรความโปร่งใสที่ถูกต้องแล้ว</translation>
+<translation id="4832537345877333532">ปิดใช้การดึงข้อมูลไฟล์จอแสดงผล ICC จากเซิร์ฟเวอร์ Quirks สำหรับการปรับเทียบสีจอแสดงผล</translation>
 <translation id="4834912470034578916">เปิดใช้รูปแบบที่กำหนดเองสำหรับการแจ้งเตือนในเว็บ</translation>
 <translation id="4835836146030131423">เกิดข้อผิดพลาดในการลงชื่อเข้าใช้</translation>
 <translation id="4837926214103741331">คุณไม่ได้รับอนุญาตให้ใช้อุปกรณ์นี้ โปรดติดต่อเจ้าของอุปกรณ์เพื่อขออนุญาตลงชื่อเข้าใช้</translation>
@@ -2848,6 +2854,7 @@
 <translation id="5120421890733714118">เชื่อถือใบรับรองนี้ในการระบุเว็บไซต์</translation>
 <translation id="5121130586824819730">ฮาร์ดดิสก์ของคุณเต็ม โปรดบันทึกลงในตำแหน่งอื่นหรือเพิ่มเนื้อที่ว่างในฮาร์ดดิสก์</translation>
 <translation id="5125751979347152379">URL ไม่ถูกต้อง</translation>
+<translation id="5126663277159826272">ปิดใช้ไคลเอ็นต์ Quirks สำหรับการปรับเทียบจอแสดงผล</translation>
 <translation id="5127881134400491887">จัดการการเชื่อมต่อเครือข่าย</translation>
 <translation id="5128590998814119508">รายการคำสั่งในการแสดง Canvas แบบ 2D</translation>
 <translation id="512903556749061217">ที่แนบมา</translation>
@@ -2989,9 +2996,11 @@
 <translation id="5301751748813680278">เข้าสู่ระบบในฐานะผู้มาเยือน</translation>
 <translation id="5301954838959518834">ตกลง เข้าใจแล้ว</translation>
 <translation id="5302048478445481009">ภาษา </translation>
+<translation id="5304039790201806037">Pointer Events</translation>
 <translation id="5305688511332277257">ไม่มีการติดตั้ง</translation>
 <translation id="5308380583665731573">เชื่อมต่อ</translation>
 <translation id="5311260548612583999">ไฟล์กุญแจส่วนตัว (ตัวเลือก):</translation>
+<translation id="5313967007315987356">เพิ่มเว็บไซต์</translation>
 <translation id="5316588172263354223">ค้นหาด้วยเสียงได้ทุกเมื่อ</translation>
 <translation id="5316716239522500219">แสดงผลบนหน้าจอ</translation>
 <translation id="5317780077021120954">บันทึก</translation>
@@ -3294,6 +3303,7 @@
 <translation id="5734362860645681824">การสื่อสาร</translation>
 <translation id="573719557377416048">ล้างสถานะ Copresence</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: เลือกเพื่อแก้ไข</translation>
+<translation id="5741454054957165976">เปิดใช้การแทรกแซงของ user agent เวอร์ชันใหม่สำหรับการโหลด WebFonts</translation>
 <translation id="574392208103952083">ขนาดกลาง</translation>
 <translation id="5745056705311424885">ตรวจพบอุปกรณ์หน่วยความจำ USB</translation>
 <translation id="5746169159649715125">บันทึกเป็น PDF</translation>
@@ -3342,7 +3352,6 @@
 <translation id="5803531701633845775">เลือกวลีจากด้านหลัง โดยไม่ต้องย้ายเคอร์เซอร์ </translation>
 <translation id="5804241973901381774">การอนุญาต</translation>
 <translation id="580571955903695899">จัดลำดับใหม่ตามชื่อ</translation>
-<translation id="5808982448801399019">การอนุญาตล้มเหลว</translation>
 <translation id="580961539202306967">ถามฉันเมื่อไซต์ต้องการส่งข้อความพุชให้ฉัน (แนะนำ)</translation>
 <translation id="5815645614496570556">ที่อยู่ X.400</translation>
 <translation id="5817397429773072584">จีนตัวเต็ม</translation>
@@ -3367,6 +3376,7 @@
 <translation id="5834581999798853053">เหลือเวลาอีกประมาณ <ph name="TIME" /> นาที</translation>
 <translation id="5838825566232597749">Workman สหรัฐฯ แบบสากล</translation>
 <translation id="5839277899276241121">เช่นเดียวกับที่อยู่สำหรับการเรียกเก็บเงิน</translation>
+<translation id="5844550873065695788">การดำเนินการนี้จะลบรายการอย่างน้อย <ph name="TOTAL_COUNT" /> รายการออกจากอุปกรณ์เครื่องนี้ หากต้องการดึงข้อมูลภายหลัง ให้ลงชื่อเข้าใช้ Chrome เป็น $2</translation>
 <translation id="5846929185714966548">แท็บ 4</translation>
 <translation id="5848934677402291689">กำลังบันทึกเป็นไฟล์ PDF</translation>
 <translation id="5849335628409778954">ป้อนบัตรเครดิต...</translation>
@@ -3611,6 +3621,7 @@
 <translation id="6232017090690406397">แบตเตอรี่</translation>
 <translation id="6241530762627360640">เข้าถึงข้อมูลเกี่ยวกับอุปกรณ์บลูทูธที่จับคู่กับระบบของคุณ และสำรวจอุปกรณ์บลูทูธใกล้เคียง</translation>
 <translation id="6243774244933267674">เซิร์ฟเวอร์ไม่พร้อมใช้งาน</translation>
+<translation id="6246413617632217567">ไม่สามารถนำเข้าผู้ใช้ภายใต้การดูแล โปรดตรวจสอบพื้นที่ว่างในฮาร์ดไดรฟ์และสิทธิ์ แล้วลองอีกครั้ง</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">พร้อมอัปเดต</translation>
 <translation id="6248400709929739064">เปิดคำบรรยาย</translation>
@@ -3639,6 +3650,7 @@
 <translation id="6277518330158259200">จับ&amp;ภาพหน้าจอ</translation>
 <translation id="6279183038361895380">กด |<ph name="ACCELERATOR" />| เพื่อแสดงเคอร์เซอร์ของคุณ</translation>
 <translation id="6280215091796946657">ลงชื่อเข้าใช้ด้วยบัญชีอื่น</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">การทดสอบให้ API ทั้งหมดแสดงถึงวิวพอร์ตแบบเค้าโครงซึ่งจะทำให้คุณสมบัติในการเลื่อนหน้าต่างสัมพันธ์กับวิวพอร์ตแบบเค้าโครง</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{เครื่องพิมพ์ใหม่บนเครือข่ายของคุณ}other{เครื่องพิมพ์ใหม่บนเครือข่ายของคุณ}}</translation>
 <translation id="6285395082104474418">ถาดสถานะแสดงสถานะปัจจุบันของเครือข่าย แบตเตอรี่ และอื่นๆ</translation>
@@ -3694,6 +3706,7 @@
 <translation id="6380143666419481200">ยอมรับและดำเนินการต่อ</translation>
 <translation id="6380224340023442078">การตั้งค่าเนื้อหา...</translation>
 <translation id="6383194710567510941">เปิดการใช้งาน chrome.input.ime API</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{การดำเนินการนี้จะลบอย่างน้อย $1 รายการจากอุปกรณ์นี้อย่างถาวร หากต้องการดึงข้อมูลภายหลัง ให้ลงชื่อเข้าใช้เป็น $2}other{การดำเนินการนี้จะลบอย่างน้อย $1 รายการจากอุปกรณ์นี้อย่างถาวร หากต้องการดึงข้อมูลภายหลัง ให้ลงชื่อเข้าใช้เป็น $2}}</translation>
 <translation id="6384275966486438344">เปลี่ยนการตั้งค่าการค้นหาของคุณเป็น: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">หน้าที่คุณดูในหน้าต่างนี้จะไม่ปรากฏในประวัติเบราว์เซอร์และจะไม่ทิ้งร่องรอยอื่นๆ เช่น คุกกี้ ไว้ในคอมพิวเตอร์หลังจากที่คุณปิดหน้าต่างผู้เยี่ยมชมที่เปิดไว้ทั้งหมด อย่างไรก็ตาม ไฟล์ที่คุณดาวน์โหลดจะได้รับการเก็บรักษาไว้</translation>
 <translation id="6391538222494443604">ไดเรกทอรีที่ป้อนต้องมีอยู่จริง</translation>
@@ -3832,6 +3845,7 @@
 <translation id="6575134580692778371">ไม่ได้กำหนดค่า</translation>
 <translation id="6575251558004911012">ถามเมื่อไซต์ต้องการเข้าถึงกล้องของคุณ (แนะนำ)</translation>
 <translation id="6579159469348633828">การเข้ารหัสเนื้อหาของ Brotli</translation>
+<translation id="6580151766480067746">เวอร์ชัน ARC</translation>
 <translation id="6581162200855843583">ลิงก์ Google ไดรฟ์</translation>
 <translation id="6583070985841601920">ลงชื่อเข้าใช้ในชื่อ <ph name="USER_EMAIL_ADDRESS" /> การซิงค์ถูกปิดใช้งานโดยผู้ดูแลระบบของคุณ</translation>
 <translation id="65832705307647870">แสดงเว็บไซต์ยอดนิยมล่วงหน้าในหน้าแท็บใหม่</translation>
@@ -3997,6 +4011,7 @@
 <translation id="6847758263950452722">บันทึกหน้าเว็บเป็น MHTML</translation>
 <translation id="6853388645642883916">โปรแกรมอัปเดตอยู่ในโหมดสลีป</translation>
 <translation id="68541483639528434">ปิดแท็บอื่นๆ</translation>
+<translation id="6856701878604560493">เปิดใช้บุ๊กมาร์กแบบออฟไลน์</translation>
 <translation id="6860097299815761905">การตั้งค่าพร็อกซี...</translation>
 <translation id="6860427144121307915">เปิดในแท็บ</translation>
 <translation id="6862635236584086457">ไฟล์ทั้งหมดที่บันทึกไว้ในโฟลเดอร์นี้จะถูกสำรองข้อมูลแบบออนไลน์โดยอัตโนมัติ</translation>
@@ -4168,6 +4183,7 @@
 <translation id="7092106376816104">ข้อยกเว้นป๊อปอัป</translation>
 <translation id="7093866338626856921">แลกเปลี่ยนข้อมูลกับอุปกรณ์ชื่อ <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">หากต้องการค้นพบคุณลักษณะที่ยอดเยี่ยมอื่นๆ</translation>
+<translation id="7096108453481049031">ไม่สามารถนำเข้าผู้ใช้ภายใต้การดูแล โปรดตรวจสอบการเชื่อมต่อเครือข่ายแล้วลองอีกครั้งในภายหลัง</translation>
 <translation id="7100897339030255923">รายการที่เลือก <ph name="COUNT" /> รายการ</translation>
 <translation id="710227449793100220">Token Binding</translation>
 <translation id="7106346894903675391">ซื้อพื้นที่เก็บข้อมูลเพิ่มเติม...</translation>
@@ -4196,6 +4212,7 @@
 <translation id="713888829801648570">ขออภัย ไม่สามารถยืนยันรหัสผ่านของคุณได้เพราะคุณออฟไลน์อยู่</translation>
 <translation id="7140928199327930795">ไม่มีอุปกรณ์อื่นๆ ที่พร้อมใช้งาน</translation>
 <translation id="7141105143012495934">การลงชื่อเข้าใช้ล้มเหลวเนื่องจากไม่สามารถเรียกคืนรายละเอียดบัญชีของคุณได้ โปรดติดต่อผู้ดูแลระบบของคุณหรือลองอีกครั้ง</translation>
+<translation id="7141331524324591758">เปิดใช้การสนับสนุนการทดสอบบางส่วนสำหรับ Pointer Events API โดยมีวัตถุประสงค์เพื่อทดสอบโดยนักพัฒนาเว็บเท่านั้น อาจทำให้เว็บไซต์บางแห่งไม่ทำงานโดยไม่ทราบสาเหตุ</translation>
 <translation id="7143207342074048698">กำลังเชื่อมต่อ</translation>
 <translation id="7144878232160441200">ลองอีกครั้ง</translation>
 <translation id="7148311641502571842">ปลั๊กอิน <ph name="PLUGIN_NAME" /> ถูกปิดใช้งานแล้ว หากต้องการเปิดใช้งานใหม่ โปรดไปที่ <ph name="CHROME_PLUGINS_LINK" /></translation>
@@ -4844,6 +4861,7 @@
 <translation id="8119572489781388874">แก้ไขการตั้งค่า</translation>
 <translation id="8119631488458759651">นำไซต์นี้ออก</translation>
 <translation id="8121385576314601440">การตั้งค่าการป้อนข้อมูลฮันกึล</translation>
+<translation id="8122245494004914423">การดำเนินการนี้จะลบข้อมูลการท่องเว็บของคุณจากอุปกรณ์เครื่องนี้ หากต้องการดึงข้อมูลภายหลัง ให้ลงชื่อเข้าใช้ Chrome เป็น $2</translation>
 <translation id="8124313775439841391">ONC ที่มีการจัดการ</translation>
 <translation id="8126844665673008223">เว็บบลูทูธ</translation>
 <translation id="8127322077195964840">อนุญาตใบรับรองที่ไม่ถูกต้องสำหรับทรัพยากรที่โหลดจาก localhost</translation>
@@ -4928,6 +4946,7 @@
 <translation id="8226742006292257240">ด้านล่างนี้คือรหัสผ่าน TPM ที่สร้างขึ้นโดยการสุ่มและได้รับการกำหนดให้กับคอมพิวเตอร์ของคุณ:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">ผู้บุกรุกที่กำลังอยู่ใน <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> อาจพยายามติดตั้งโปรแกรมอันตรายซึ่งจะขโมยหรือลบข้อมูล (ตัวอย่างเช่น รูปภาพ รหัสผ่าน ข้อความ และบัตรเครดิต) ลงในคอมพิวเตอร์ของคุณ</translation>
+<translation id="8233254008506535819">รวมตัวเลือกเพื่ออนุญาตเว็บไซต์สำคัญเป็นกรณีพิเศษในกล่องโต้ตอบ "ล้างข้อมูลการท่องเว็บ"</translation>
 <translation id="8236231079192337250">แอปแกลเลอรี Chrome เว็บสโตร์สำหรับไดรเวอร์เครื่องพิมพ์</translation>
 <translation id="8238649969398088015">เคล็ดลับวิธีใช้</translation>
 <translation id="8240697550402899963">ใช้ธีมคลาสสิก</translation>
@@ -5251,7 +5270,6 @@
 <translation id="8708671767545720562">&amp;ข้อมูลเพิ่มเติม</translation>
 <translation id="8711402221661888347">พิกเคิลส์</translation>
 <translation id="8711453844311572806">เมื่อโทรศัพท์ไม่ได้ล็อกและอยู่ใกล้ๆ ให้คลิกเพื่อเข้าใช้งาน หากเป็นกรณีอื่น คุณจะเห็นไอคอนล็อกและต้องพิมพ์รหัสผ่าน</translation>
-<translation id="8712637175834984815">สำเร็จ</translation>
 <translation id="8713570323158206935">ส่ง<ph name="BEGIN_LINK1" />ข้อมูลระบบ<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">เปิดใช้การแก้ไขอัตโนมัติบนแป้นพิมพ์จริงสำหรับแป้นพิมพ์สหรัฐฯ ซึ่งสามารถให้คำแนะนำเมื่อพิมพ์บนแป้นพิมพ์จริงได้</translation>
 <translation id="871476437400413057">รหัสผ่านที่ Google บันทึกไว้</translation>
@@ -5614,6 +5632,7 @@
 <translation id="952992212772159698">ไม่ได้เปิดการใช้งาน</translation>
 <translation id="953000875543358078">อาจใช้เวลาไม่เกิน 1 นาทีโดยประมาณ</translation>
 <translation id="960987915827980018">เหลือเวลาอีกประมาณ 1 ชั่วโมง</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{การดำเนินการนี้จะลบ $1 รายการจากอุปกรณ์นี้อย่างถาวร หากต้องการดึงข้อมูลภายหลัง ให้ลงชื่อเข้าใช้เป็น $2}other{การดำเนินการนี้จะลบ $1 รายการจากอุปกรณ์นี้อย่างถาวร หากต้องการดึงข้อมูลภายหลัง ให้ลงชื่อเข้าใช้เป็น $2}}</translation>
 <translation id="96421021576709873">เครือข่าย WiFi</translation>
 <translation id="965490406356730238">เปิดใช้การถอดรหัส mjpeg ที่เร่งการแสดงผลด้วยฮาร์ดแวร์สำหรับเฟรมที่จับภาพซึ่งมีอยู่</translation>
 <translation id="968174221497644223">แคชของแอปพลิเคชัน</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index f86412b..91c1124 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -251,6 +251,7 @@
       açık tutun. <ph name="USER_DISPLAY_EMAIL" /> kullanıcısının uyumlu tüm cihazları için Bluetooth'un açık olacağını ve bazı donanım bilgilerinin Google'a gönderileceğini unutmayın. &lt;a&gt;Daha fazla bilgi edinin&lt;/a&gt;</translation>
 <translation id="13649080186077898">Otomatik Doldurma ayarlarını düzenleyin</translation>
 <translation id="1367951781824006909">Dosya seç</translation>
+<translation id="136802136832547685">Bu cihaza eklenebilecek denetlenen kullanıcı yok.</translation>
 <translation id="1368265273904755308">Sorun bildir</translation>
 <translation id="1368832886055348810">Soldan Sağa</translation>
 <translation id="1370646789215800222">Kişi kaldırılsın mı?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Ara</translation>
 <translation id="1384211230590313258">Service Discovery Handler</translation>
 <translation id="1386387014181100145">Merhaba.</translation>
+<translation id="1386830813511981192">Bir milyondan fazla uygulama ve oyun şimdi <ph name="DEVICE_TYPE" /> cihazınızda.</translation>
 <translation id="1389297115360905376">Bu yalnızca <ph name="CHROME_WEB_STORE" /> kullanılarak eklenebilir.</translation>
 <translation id="1390548061267426325">Normal Sekme Olarak Aç</translation>
 <translation id="1395262318152388157">Arama kaydırma çubuğu</translation>
@@ -893,6 +895,7 @@
 <translation id="2280486287150724112">Sağ kenar boşluğu</translation>
 <translation id="2282146716419988068">GPU İşlemi</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">WebFonts yüklemesi için Kullanıcı Aracısı Müdahalesi'nin yeni sürümü.</translation>
 <translation id="2286454467119466181">Basit</translation>
 <translation id="2286950485307333924">Şu anda Chrome'da oturum açmış bulunmaktasınız</translation>
 <translation id="2287590536030307392">Tüm kablosuz bağlantıları devre dışı bırakın.</translation>
@@ -1070,6 +1073,7 @@
 <translation id="2542049655219295786">Google tablosu</translation>
 <translation id="2546283357679194313">Çerezler ve site verileri</translation>
 <translation id="2549646943416322527">Seccomp Algılayıcı</translation>
+<translation id="2550212893339833758">Değiştirilmiş bellek</translation>
 <translation id="2553100941515833716">Her yeniden başlatmada Uygulama Başlatıcı yükleme durumunu sıfırla.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" />, <ph name="NETWORK_ID" /> ağına bağlanamadı. Lütfen başka bir ağ seçin veya tekrar deneyin.</translation>
 <translation id="2553440850688409052">Bu Eklentiyi Gizle</translation>
@@ -1103,6 +1107,7 @@
 <translation id="2587203970400270934">Operatör kodu:</translation>
 <translation id="2587922270115112871">Denetlenen bir kullanıcı oluşturulduğunda bir Google Hesabı oluşturulmaz. Yeni kullanıcının
     ayarları ve verileri Chrome Senkronizasyonuyla diğer cihazlarda kullanılamaz. Denetlenen bir kullanıcı yalnızca bu cihazda geçerlidir.</translation>
+<translation id="2594049137847833442">Tarama verilerini temizle iletişim kutusundaki önemli site seçenekleri</translation>
 <translation id="2594056015203442344">Etkinleştirildiğinde, sekme şeridindeki ses göstergeleri de sekme sesini kapatma kontrolleri gibi iki tane olur. Bu aynı zamanda, seçili birden fazla sekmenin sesini hızlı şekilde kapatmak için sekmenin bağlam menüsüne komutlar ekler.</translation>
 <translation id="259421303766146093">Küçült</translation>
 <translation id="2597852038534460976">Chrome duvar kağıtlarına erişemiyor. Lütfen bir ağa bağlanın.</translation>
@@ -1470,7 +1475,6 @@
 <translation id="3065140616557457172">İstediğiniz sorguyu girerek arama yapın veya gitmek istediğiniz URL'yi girin - tüm işlevlerin sorunsuz çalıştığını göreceksiniz.</translation>
 <translation id="3067198360141518313">Bu eklentiyi çalıştır</translation>
 <translation id="307519606911195071">Ayarlar sayfasından ek erişilebilirlik özelliklerini etkinleştirin.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> denetlenen kullanıcı olarak oluşturuldu.</translation>
 <translation id="3075874217500066906">Powerwash işleminin başlaması için cihazın tekrar başlatılması gerekiyor. Tekrar başlattıktan sonra devam etmek istediğinizi onaylamanız istenecektir.</translation>
 <translation id="3076677906922146425">Herhangi birinin Chrome'a kişi eklemesine izin ver</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1487,6 +1491,7 @@
 <translation id="3088034400796962477">Harf çevirisi (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Yeniden adlandır…</translation>
 <translation id="308903551226753393">Otomatik yapılandır</translation>
+<translation id="3089231390674410424">Kimlik bilgilerinizde bir sorun olduğu anlaşılıyor. Lütfen düzgün şekilde oturum açtığınızdan emin olun ve tekrar deneyin.</translation>
 <translation id="3090819949319990166">Harici crx dosyası <ph name="TEMP_CRX_FILE" /> hedefine kopyalanamıyor.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" eşlendi</translation>
 <translation id="3092544800441494315">Bu ekran görüntüsünü ekle:</translation>
@@ -2014,7 +2019,6 @@
 <translation id="3790856258139356663">Chrome Eşitlemesi için test sunucusuna bağlanır.</translation>
 <translation id="3790909017043401679">SIM kart PIN'ini girme</translation>
 <translation id="3792890930871100565">Yazıcıların bağlantısını kes</translation>
-<translation id="3795681127952030401"><ph name="URL" /> size bildirimler göndermek istiyor.</translation>
 <translation id="3796648294839530037">Sık Kullanılan Ağlar:</translation>
 <translation id="3797900183766075808">"<ph name="SEARCH_TERMS" />" İçin <ph name="SEARCH_ENGINE" /> &amp;Arama Motorunda Arama Yap</translation>
 <translation id="3798449238516105146">Sürüm</translation>
@@ -2488,6 +2492,7 @@
 <translation id="4552678318981539154">Daha fazla depolama alanı satın alın</translation>
 <translation id="4554591392113183336">Harici uzantı, mevcut bir uzantıyla aynı veya daha eski sürümde.</translation>
 <translation id="4554796861933393312">Malzeme Tasarımı Mürekkep Damlası Animasyon Hızı</translation>
+<translation id="4555670907822902621">Yer işareti koyulan sayfaların çevrimdışı olarak görüntülenebilmeleri için kaydedilmelerini etkinleştirin.</translation>
 <translation id="4555769855065597957">Gölge</translation>
 <translation id="4556110439722119938">Yer işaretleriniz, geçmişiniz, şifreleriniz ve diğer ayarlarınız tüm cihazlarınızda kullanabilmeniz için Google Hesabınızla senkronize edilecek</translation>
 <translation id="4557136421275541763">Uyarı:</translation>
@@ -2664,6 +2669,7 @@
 <translation id="4824518112777153488">Üzerine gelme özellikli dokunmatik ekranları destekleme</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> cihazınız <ph name="NETWORK_NAME" /> ile İnternet'e bağlanamıyor. Lütfen başka bir ağ seçin. <ph name="LEARN_MORE_LINK_START" />Daha fazla bilgi edinin<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572"><ph name="LOCALITY" /> konumundaki <ph name="ORGANIZATION" /> kuruluşunun kimliği <ph name="ISSUER" /> tarafından doğrulandı. Geçerli Sertifika Şeffaflığı bilgileri sunucu tarafından sağlandı.</translation>
+<translation id="4832537345877333532">Ekran rengi kalibrasyonu için Quirks Sunucusu'ndan icc ekran dosyalarının alınmasını devre dışı bırakın.</translation>
 <translation id="4834912470034578916">Web Bildirimleri için özel düzenleri etkinleştir.</translation>
 <translation id="4835836146030131423">Oturum açma hatası.</translation>
 <translation id="4837926214103741331">Bu cihazı kullanma yetkiniz yok. Oturum açma izni almak için lütfen cihaz sahibiyle iletişime geçin.</translation>
@@ -2851,6 +2857,7 @@
 <translation id="5120421890733714118">Web sitelerini tanımlamada bu sertifikaya güvenin.</translation>
 <translation id="5121130586824819730">Sabit diskiniz dolu. Lütfen başka bir yere kaydedin veya sabit diskinizde yer açın.</translation>
 <translation id="5125751979347152379">Geçersiz URL.</translation>
+<translation id="5126663277159826272">Ekran kalibrasyonu için Quirks Client'ı devre dışı bırak.</translation>
 <translation id="5127881134400491887">Ağ bağlantılarını yönetma</translation>
 <translation id="5128590998814119508">2D tuval ekran listesi</translation>
 <translation id="512903556749061217">eklendi</translation>
@@ -2992,9 +2999,11 @@
 <translation id="5301751748813680278">Misafir olarak giriliyor.</translation>
 <translation id="5301954838959518834">Evet, anladım</translation>
 <translation id="5302048478445481009">Dil</translation>
+<translation id="5304039790201806037">İşaretçi Etkinlikleri</translation>
 <translation id="5305688511332277257">Hiç sertifika yüklenmedi</translation>
 <translation id="5308380583665731573">Bağlan</translation>
 <translation id="5311260548612583999">Özel anahtar dosyası (isteğe bağlı):</translation>
+<translation id="5313967007315987356">Site ekle</translation>
 <translation id="5316588172263354223">İstediğiniz zaman sesli arama yapın</translation>
 <translation id="5316716239522500219">Monitörleri yansıt</translation>
 <translation id="5317780077021120954">Kaydet</translation>
@@ -3025,7 +3034,7 @@
 <translation id="5350480486488078311">NaCl Yuva API'sı.</translation>
 <translation id="5350965906220856151">Hata!</translation>
 <translation id="5352033265844765294">Zaman Damgası</translation>
-<translation id="5353252989841766347">Şifreleri Chrome'dan Dışa Aktar</translation>
+<translation id="5353252989841766347">Şifreleri Chrome'dan Aktar</translation>
 <translation id="5354208417767217618">Tarayıcı ile çerez bölümü arasında kimlik tutarlığı</translation>
 <translation id="5355097969896547230">Tekrar bul</translation>
 <translation id="5355351445385646029">Adayı seçmek için Boşluk tuşuna basın</translation>
@@ -3298,6 +3307,7 @@
 <translation id="5734362860645681824">İletişim</translation>
 <translation id="573719557377416048">Copresence Durumunu Temizle</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: Düzenlemek için seçin</translation>
+<translation id="5741454054957165976">WebFonts yüklemesi için Kullanıcı Aracısı Müdahalesi'nin yeni sürümünü etkinleştirin.</translation>
 <translation id="574392208103952083">Orta</translation>
 <translation id="5745056705311424885">USB bellek çubuğu algılandı</translation>
 <translation id="5746169159649715125">PDF olarak kaydet</translation>
@@ -3346,7 +3356,6 @@
 <translation id="5803531701633845775">Kelime öbeklerini, imleci hareket ettirmeden arkadan seç</translation>
 <translation id="5804241973901381774">İzinler</translation>
 <translation id="580571955903695899">Başlığa Göre Yeniden Sırala</translation>
-<translation id="5808982448801399019">Yetkilendirme başarısız oldu</translation>
 <translation id="580961539202306967">Bir site push mesajları göndermek istediğinde bana sor (önerilen)</translation>
 <translation id="5815645614496570556">X.400 Adresi</translation>
 <translation id="5817397429773072584">Geleneksel Çince</translation>
@@ -3371,6 +3380,7 @@
 <translation id="5834581999798853053">Yaklaşık <ph name="TIME" /> dakika kaldı</translation>
 <translation id="5838825566232597749">ABD Workman uluslararası</translation>
 <translation id="5839277899276241121">Fatura adresiyle aynı</translation>
+<translation id="5844550873065695788">Bu işlem, en az <ph name="TOTAL_COUNT" /> öğeyi bu cihazdan kalıcı olarak silecektir. Verilerinizi daha sonra geri almak için Chrome'da $2 olarak oturum açın.</translation>
 <translation id="5846929185714966548">Sekme 4</translation>
 <translation id="5848934677402291689">PDF olarak kaydetme işlemi sürüyor</translation>
 <translation id="5849335628409778954">Kredi kartı girin...</translation>
@@ -3615,6 +3625,7 @@
 <translation id="6232017090690406397">Pil</translation>
 <translation id="6241530762627360640">Sisteminizle eşlenen Bluetooth cihazlarıyla ilgili bilgilere erişme ve yakındaki Bluetooth cihazlarını keşfetme.</translation>
 <translation id="6243774244933267674">Sunucu kullanılamıyor</translation>
+<translation id="6246413617632217567">Denetlenen kullanıcı içe aktarılamadı. Lütfen sabit disk alanınızı ve izinlerinizi kontrol edip tekrar deneyin.</translation>
 <translation id="6247708409970142803">%<ph name="PERCENTAGE" /></translation>
 <translation id="624789221780392884">Güncelleme hazır</translation>
 <translation id="6248400709929739064">Altyazıları etkinleştir</translation>
@@ -3643,6 +3654,7 @@
 <translation id="6277518330158259200">Ekr&amp;an Görüntüsü Al</translation>
 <translation id="6279183038361895380">İmlecinizi göstermek için |<ph name="ACCELERATOR" />| tuşuna basın</translation>
 <translation id="6280215091796946657">Farklı bir hesapla oturum aç</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Tüm API'ların, düzenin görüntü alanını yansıtacağı denemeler yapın. Bu, window.scroll özelliklerini düzen görüntü alanına uygun hale getirir.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Ağınızda yeni yazıcı}other{Ağınızda yeni yazıcılar}}</translation>
 <translation id="6285395082104474418">Durum tepsisi ağınızın, pilinizin ve diğer şeylerin geçerli durumunu gösterir.</translation>
@@ -3698,6 +3710,7 @@
 <translation id="6380143666419481200">Kabul et ve devam et</translation>
 <translation id="6380224340023442078">İçerik ayarları...</translation>
 <translation id="6383194710567510941">chrome.input.ime API'sını kullanmayı etkinleştirin.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Bu işlem en az $1 öğeyi bu cihazdan kalıcı olarak silecektir. Verilerinizi daha sonra geri almak için Chrome'da $2 olarak oturum açın.}other{Bu işlem en az $1 öğeyi bu cihazdan kalıcı olarak silecektir. Verilerinizi daha sonra geri almak için Chrome'da $2 olarak oturum açın.}}</translation>
 <translation id="6384275966486438344">Arama ayarlarınızı <ph name="SEARCH_HOST" /> olarak değiştirme</translation>
 <translation id="6390799748543157332">Bu pencerede görüntülediğiniz sayfalar, göz atma geçmişinde görünmez ve açık olan tüm Misafir pencerelerini kapattığınızda bilgisayarda çerez gibi başka izler bırakmaz. Ancak indirdiğiniz dosyalar saklanır.</translation>
 <translation id="6391538222494443604">Giriş dizininin olması gerekir.</translation>
@@ -3836,6 +3849,7 @@
 <translation id="6575134580692778371">Yapılandırılmadı</translation>
 <translation id="6575251558004911012">Bir sitenin kamerama erişmesi gerektiğinde bana sor (önerilen)</translation>
 <translation id="6579159469348633828">Brotli İçerik Şifrelemesi.</translation>
+<translation id="6580151766480067746">ARC Sürümü</translation>
 <translation id="6581162200855843583">Google Drive bağlantısı</translation>
 <translation id="6583070985841601920"><ph name="USER_EMAIL_ADDRESS" /> olarak oturum açıldı. Senkronizasyon, yöneticiniz tarafından devre dışı bırakıldı.</translation>
 <translation id="65832705307647870">Yeni Sekme sayfasını popüler sitelerle önceden doldurun.</translation>
@@ -4001,6 +4015,7 @@
 <translation id="6847758263950452722">Sayfayı MHTML olarak kaydet</translation>
 <translation id="6853388645642883916">Güncelleyici uyku modunda</translation>
 <translation id="68541483639528434">Diğer sekmeleri kapat</translation>
+<translation id="6856701878604560493">Çevrimdışı yer işaretlerini etkinleştir</translation>
 <translation id="6860097299815761905">Proxy ayarları...</translation>
 <translation id="6860427144121307915">Sekmede aç</translation>
 <translation id="6862635236584086457">Bu klasöre kaydedilen tüm dosyalar otomatik bir şekilde çevrimiçi olarak yedeklenir</translation>
@@ -4172,6 +4187,7 @@
 <translation id="7092106376816104">Pop-up istisnaları</translation>
 <translation id="7093866338626856921"><ph name="HOSTNAMES" /> adlı cihazlarla veri alışverişi</translation>
 <translation id="7096082900368329802">Başka harika özellikler keşfetmek ister misiniz?</translation>
+<translation id="7096108453481049031">Denetlenen kullanıcı içe aktarılamadı. Lütfen ağ bağlantınızı kontrol edin ve daha sonra tekrar deneyin.</translation>
 <translation id="7100897339030255923"><ph name="COUNT" /> öğe seçildi</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Daha fazla depolama alanı satın alın...</translation>
@@ -4200,6 +4216,7 @@
 <translation id="713888829801648570">Çevrimdışı olduğunuz için maalesef şifreniz doğrulanamadı.</translation>
 <translation id="7140928199327930795">Başka kullanılabilir cihaz yok.</translation>
 <translation id="7141105143012495934">Hesap ayrıntılarınız alınamadığı için oturum açma işlemi başarısız oldu. Lütfen yöneticinizle iletişime geçin veya tekrar deneyin.</translation>
+<translation id="7141331524324591758">İşaretçi Etkinlikleri API'sı için kısmi deneysel desteği etkinleştirir. Bu seçenek yalnızca web geliştiricilerinin test yapması için tasarlanmıştır, bazı web sitelerinin, sorunun kolayca anlaşılamayacağı şekilde bozulmasına neden olur.</translation>
 <translation id="7143207342074048698">Bağlanıyor</translation>
 <translation id="7144878232160441200">Yeniden Dene</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> eklentisi devre dışı bırakıldı. Yeniden etkinleştirmek için lütfen <ph name="CHROME_PLUGINS_LINK" /> adresine gidin.</translation>
@@ -4848,6 +4865,7 @@
 <translation id="8119572489781388874">Ayarları değiştir</translation>
 <translation id="8119631488458759651">bu siteyi kaldır</translation>
 <translation id="8121385576314601440">Hangul giriş ayarları</translation>
+<translation id="8122245494004914423">Bu işlem tarama verilerinizi bu cihazdan kalıcı olarak silecektir. Verilerinizi daha sonra geri almak için Chrome'da $2 olarak oturum açın.</translation>
 <translation id="8124313775439841391">Yönetilen ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">localhost'tan yüklenen kaynaklar için geçersiz sertifikalara izin ver.</translation>
@@ -4933,6 +4951,7 @@
 <translation id="8226742006292257240">Aşağıda bilgisayarınıza atanmış ve rastgele oluşturulmuş TPM şifresini görebilirsiniz:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Şu anda <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> sitesinde bulunan saldırganlar, bilgilerinizi (örneğin fotoğraflar, şifreler, mesajlar ve kredi kartları) çalacak veya silecek tehlikeli programları bilgisayarınıza yüklemeyi deneyebilirler.</translation>
+<translation id="8233254008506535819">Tarama verilerini temizle iletişim kutusuna önemli siteleri beyaz listeye ekleme seçeneği görüntüleyin.</translation>
 <translation id="8236231079192337250">Yazıcı sürücüleri için Chrome Web Mağazası Galeri uygulaması</translation>
 <translation id="8238649969398088015">Yardım ipucu</translation>
 <translation id="8240697550402899963">Klasik temayı kullan</translation>
@@ -4978,7 +4997,7 @@
 <translation id="8284279544186306258">tüm <ph name="WEBSITE_1" /> siteleri</translation>
 <translation id="8286227656784970313">Sistem sözlüğünü kullan</translation>
 <translation id="8286817579635702504">Günlük olarak ziyaret ettiğiniz bir veya daha fazla sayfada soruna neden olabilecek bazı güvenlik özelliklerini etkinleştirir. Örneğin, karma içeriğe ilişkin katı denetim ve güçlü özelliklerin güvenli içeriklere kilitlenmesi gibi özellikler etkinleştirilir.</translation>
-<translation id="8288342810474863437">Şifre ayarlarındaki İçe ve Dışa Aktarma işlevselliği.</translation>
+<translation id="8288342810474863437">Şifre ayarlarındaki İçe ve Dışa Aktarma işlevi.</translation>
 <translation id="8297012244086013755">Hangul 3 Grubu (Üst Karakter Yok)</translation>
 <translation id="8298115750975731693">Kullandığınız kablosuz bağlantı ağı (<ph name="WIFI_NAME" />) <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> adresini ziyaret etmenizi gerektiriyor olabilir.</translation>
 <translation id="8299269255470343364">Japonca</translation>
@@ -5257,7 +5276,6 @@
 <translation id="8708671767545720562">&amp;Daha Fazla Bilgi</translation>
 <translation id="8711402221661888347">Hamburger</translation>
 <translation id="8711453844311572806">Telefonunuzun kilidi açık ve yakınınızdaysa giriş yapmak için tıklamanız yeterlidir. Aksi takdirde, kilitli simgesini görürsünüz ve şifrenizi yazmanız gerekir.</translation>
-<translation id="8712637175834984815">Anlaşıldı</translation>
 <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />Sistem bilgilerini<ph name="END_LINK1" /> gönder</translation>
 <translation id="8713979477561846077">ABD klavye için, siz fiziksel klavyede yazdıkça öneri sunabilen fiziksel klavye otomatik düzeltme özelliğini etkinleştirin.</translation>
 <translation id="871476437400413057">Google tarafından kaydedilen şifreler</translation>
@@ -5621,6 +5639,7 @@
 <translation id="952992212772159698">Etkin değil</translation>
 <translation id="953000875543358078">Bu işlem bir dakika kadar sürebilir</translation>
 <translation id="960987915827980018">Yaklaşık 1 saat kaldı</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Bu işlem, bu cihazdan $1 öğeyi kalıcı olarak silecektir. Verilerinizi daha sonra geri almak için Chrome'da $2 olarak oturum açın.}other{Bu işlem, bu cihazdan $1 öğeyi kalıcı olarak silecektir. Verilerinizi daha sonra geri almak için Chrome'da $2 olarak oturum açın.}}</translation>
 <translation id="96421021576709873">Kablosuz ağ</translation>
 <translation id="965490406356730238">Uygun olduğunda, yakalanan çerçevenin donanımla hızlandırılmış mjpeg kod çözümlemesini etkinleştirin.</translation>
 <translation id="968174221497644223">Uygulama önbelleği</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 8f379bc..0bf0e820 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -142,7 +142,7 @@
 <translation id="1196789802623400962">Увімкнути або вимкнути опцію редагування жестами на сторінці налаштувань віртуальної клавіатури.</translation>
 <translation id="1196849605089373692">Указує налаштування якості для знімків, зроблених у зменшеному масштабі.</translation>
 <translation id="1197199342062592414">Почнімо!</translation>
-<translation id="119738088725604856">Вікно знімка екрана</translation>
+<translation id="119738088725604856">Зробити знімок екрана з вікна</translation>
 <translation id="1197979282329025000">Під час отримання характеристик принтера для принтера <ph name="PRINTER_NAME" /> сталася помилка. Цей принтер неможливо зареєструвати в <ph name="CLOUD_PRINT_NAME" />.</translation>
 <translation id="1198271701881992799">Розпочнімо</translation>
 <translation id="1199232041627643649">Утримуйте <ph name="KEY_EQUIVALENT" />, щоб вийти.</translation>
@@ -251,6 +251,7 @@
         Зверніть увагу, що Bluetooth буде ввімкнено на всіх сумісних пристроях користувача <ph name="USER_DISPLAY_EMAIL" />. Окрім того, у Google надсилатимуться певні дані про апаратне забезпечення. &lt;a&gt;Докладніше&lt;/a&gt;</translation>
 <translation id="13649080186077898">Керувати налаштуваннями автозаповнення</translation>
 <translation id="1367951781824006909">Вибрати файл</translation>
+<translation id="136802136832547685">Немає контрольованих користувачів, яких можна додати на цей пристрій.</translation>
 <translation id="1368265273904755308">Повідомити про проблему</translation>
 <translation id="1368832886055348810">Зліва направо</translation>
 <translation id="1370646789215800222">Видалити користувача?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Пошук</translation>
 <translation id="1384211230590313258">Обробник виявлення сервісів</translation>
 <translation id="1386387014181100145">Вітаємо!</translation>
+<translation id="1386830813511981192">Для вашого пристрою <ph name="DEVICE_TYPE" /> зараз доступні понад мільйон додатків та ігор.</translation>
 <translation id="1389297115360905376">Можна додати лише з: <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Відкрити як звичайну вкладку</translation>
 <translation id="1395262318152388157">Повзунок пошуку</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">Праве поле</translation>
 <translation id="2282146716419988068">Процес GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Нова версія функції втручання агента користувача для завантаження WebFonts.</translation>
 <translation id="2286454467119466181">Простий</translation>
 <translation id="2286950485307333924">Ви ввійшли в Chrome</translation>
 <translation id="2287590536030307392">Вимкнути всі бездротові з’єднання.</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">Таблиця Google</translation>
 <translation id="2546283357679194313">Файли cookie та дані із сайтів</translation>
 <translation id="2549646943416322527">Детектор Seccomp</translation>
+<translation id="2550212893339833758">Змінна пам’ять</translation>
 <translation id="2553100941515833716">Відновлювати стан встановлення панелі запуску додатків під час кожного перезапуску.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> не вдалося з'єднатися з <ph name="NETWORK_ID" />. Виберіть іншу мережу або повторіть спробу.</translation>
 <translation id="2553440850688409052">Сховати цей плагін</translation>
@@ -1102,6 +1106,7 @@
 <translation id="2587203970400270934">Код оператора:</translation>
 <translation id="2587922270115112871">Створюючи користувача, яким керує адміністратор, ви не створюєте обліковий запис Google, а налаштування
     й дані цього користувача не переносяться на інші пристрої за допомогою синхронізації Chrome. Користувач, яким керує адміністратор, пов’язаний лише з цим пристроєм.</translation>
+<translation id="2594049137847833442">Параметри важливих сайтів у діалоговому вікні "Очистити дані веб-перегляду"</translation>
 <translation id="2594056015203442344">Якщо ввімкнути цей параметр, індикатори звуку на панелі вкладок дублюються як елементи вимкнення звуку на вкладках. Також додаються команди в контекстне меню вкладки для швидкого вимкнення звуку на декількох вибраних вкладках.</translation>
 <translation id="259421303766146093">Зменшити</translation>
 <translation id="2597852038534460976">Chrome не може отримати доступ до фонових малюнків. Під’єднайтеся до мережі.</translation>
@@ -1469,7 +1474,6 @@
 <translation id="3065140616557457172">Введіть пошуковий запит або URL-адресу – усе працює чудово.</translation>
 <translation id="3067198360141518313">Запустити цей плагін</translation>
 <translation id="307519606911195071">Увімкнути додаткові спеціальні можливості на сторінці налаштувань.</translation>
-<translation id="3075239840551149663">Контрольованого користувача (<ph name="NEW_PROFILE_NAME" />) створено.</translation>
 <translation id="3075874217500066906">Щоб почати виконання Powerwash, потрібно перезавантажити пристрій. Після цього вам буде запропоновано підтвердити виконання Powerwash.</translation>
 <translation id="3076677906922146425">Дозволити всім додавати користувачів у Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1486,6 +1490,7 @@
 <translation id="3088034400796962477">Транслітерація (salam ← سلام)</translation>
 <translation id="3088325635286126843">&amp;Перейменувати...</translation>
 <translation id="308903551226753393">Налаштувати автоматично</translation>
+<translation id="3089231390674410424">Схоже, виникла проблема з вашими обліковими даними. Переконайтеся, що ви ввійшли правильно, і повторіть спробу.</translation>
 <translation id="3090819949319990166">Не вдається скопіювати зовнішній файл .crx у файл <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558"><ph name="DEVICE_NAME" />: підключено</translation>
 <translation id="3092544800441494315">Включити цей знімок екрана:</translation>
@@ -2012,7 +2017,6 @@
 <translation id="3790856258139356663">З’єднується із сервером для перевірки синхронізації Chrome.</translation>
 <translation id="3790909017043401679">Введіть PIN-код SIM-карти</translation>
 <translation id="3792890930871100565">Від’єднати принтери</translation>
-<translation id="3795681127952030401"><ph name="URL" /> хоче надсилати вам сповіщення.</translation>
 <translation id="3796648294839530037">Улюблені мережі:</translation>
 <translation id="3797900183766075808">&amp;Шукати "<ph name="SEARCH_TERMS" />" у <ph name="SEARCH_ENGINE" />.</translation>
 <translation id="3798449238516105146">Версія</translation>
@@ -2486,6 +2490,7 @@
 <translation id="4552678318981539154">Придбати більше об’єму пам’яті</translation>
 <translation id="4554591392113183336">Зовнішнє розширення має таку саму або нижчу версію порівняно з наявним.</translation>
 <translation id="4554796861933393312">Швидкість анімації чорнильної плями матеріального дизайну</translation>
+<translation id="4555670907822902621">Дозволити зберігати закладки для перегляду в режимі офлайн.</translation>
 <translation id="4555769855065597957">Shadow</translation>
 <translation id="4556110439722119938">Ваші закладки, історія, паролі й інші налаштування синхронізуватимуться з обліковим записом Google, щоб ви могли користуватися ними на всіх своїх пристроях</translation>
 <translation id="4557136421275541763">Застереження:</translation>
@@ -2662,6 +2667,7 @@
 <translation id="4824518112777153488">Підтримка для сенсорних екранів із можливістю наведення курсора</translation>
 <translation id="4830573902900904548">Ваш <ph name="DEVICE_TYPE" /> не може під’єднатися до Інтернету через мережу "<ph name="NETWORK_NAME" />". Виберіть іншу. <ph name="LEARN_MORE_LINK_START" />Докладніше<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572"><ph name="ISSUER" /> підтверджує ідентифікатор організації <ph name="ORGANIZATION" /> (<ph name="LOCALITY" />). Сервер надав дійсну інформацію про прозорість сертифіката.</translation>
+<translation id="4832537345877333532">Не отримувати файли .icc з Quirks Server для калібрування кольорів дисплея.</translation>
 <translation id="4834912470034578916">Увімкнути спеціальні макети для веб-сповіщень.</translation>
 <translation id="4835836146030131423">Помилка входу.</translation>
 <translation id="4837926214103741331">Ви не маєте права використовувати цей пристрій. Зверніться до його власника, щоб отримати дозвіл на вхід.</translation>
@@ -2849,6 +2855,7 @@
 <translation id="5120421890733714118">Довіряйте цьому сертифікату для ідентифікації веб-сайтів.</translation>
 <translation id="5121130586824819730">Ваш жорсткий диск заповнено. Збережіть в іншому місці чи звільніть місце на цьому жорстоку диску.</translation>
 <translation id="5125751979347152379">Недійсна URL-адреса.</translation>
+<translation id="5126663277159826272">Вимкнути Quirks Client для калібрування дисплея.</translation>
 <translation id="5127881134400491887">Керувати мережевими з’єднаннями</translation>
 <translation id="5128590998814119508">Графічний список Canvas 2D</translation>
 <translation id="512903556749061217">підключено</translation>
@@ -2990,9 +2997,11 @@
 <translation id="5301751748813680278">Вхід у режимі гостя.</translation>
 <translation id="5301954838959518834">OK</translation>
 <translation id="5302048478445481009">Мова</translation>
+<translation id="5304039790201806037">Pointer Events</translation>
 <translation id="5305688511332277257">Не встановлено жодного</translation>
 <translation id="5308380583665731573">Під’єднатися</translation>
 <translation id="5311260548612583999">Файл секретного ключа (необов'язково):</translation>
+<translation id="5313967007315987356">Додати сайт</translation>
 <translation id="5316588172263354223">Голосовий пошук у будь-який час</translation>
 <translation id="5316716239522500219">Дбулювати зображення на моніторах</translation>
 <translation id="5317780077021120954">Зберегти</translation>
@@ -3295,6 +3304,7 @@
 <translation id="5734362860645681824">Зв’язок</translation>
 <translation id="573719557377416048">Очистити дані про пристрої поблизу</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: виберіть, щоб редагувати</translation>
+<translation id="5741454054957165976">Увімкнути нову версію функції втручання агента користувача для завантаження WebFonts.</translation>
 <translation id="574392208103952083">Середній</translation>
 <translation id="5745056705311424885">Виявлено карту флеш-пам’яті USB</translation>
 <translation id="5746169159649715125">Зберегти у форматі PDF</translation>
@@ -3343,7 +3353,6 @@
 <translation id="5803531701633845775">Вибирати фрази позаду без переміщення курсора</translation>
 <translation id="5804241973901381774">Дозволи</translation>
 <translation id="580571955903695899">Переупорядкувати за назвою</translation>
-<translation id="5808982448801399019">Не вдалося авторизувати</translation>
 <translation id="580961539202306967">Запитувати, якщо сайт хоче надсилати мені push-повідомлення (рекомендовано)</translation>
 <translation id="5815645614496570556">Адреса каталогу X.400</translation>
 <translation id="5817397429773072584">китайська (традиційна)</translation>
@@ -3368,6 +3377,7 @@
 <translation id="5834581999798853053">Залишилося приблизно <ph name="TIME" /> хв.</translation>
 <translation id="5838825566232597749">US Workman, міжнародна</translation>
 <translation id="5839277899276241121">Така ж, як платіжна адреса</translation>
+<translation id="5844550873065695788">З цього пристрою буде назавжди видалено принаймні стільки елементів: <ph name="TOTAL_COUNT" />. Щоб відновити дані пізніше, увійдіть в обліковий запис Chrome як $2.</translation>
 <translation id="5846929185714966548">Вкладка 4</translation>
 <translation id="5848934677402291689">Триває збереження у форматі PDF</translation>
 <translation id="5849335628409778954">Введіть дані кредитної картки…</translation>
@@ -3612,6 +3622,7 @@
 <translation id="6232017090690406397">Акумулятор</translation>
 <translation id="6241530762627360640">Переглядати інформацію про пристрої Bluetooth, підключені до вашої системи, і знаходити пристрої Bluetooth поблизу.</translation>
 <translation id="6243774244933267674">Сервер недоступний</translation>
+<translation id="6246413617632217567">Не вдалось імпортувати контрольованого користувача. Перевірте, чи у вас є дозволи й вільне місце на жорсткому диску, і повторіть спробу.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Оновлення завершено</translation>
 <translation id="6248400709929739064">Увімкнути субтитри</translation>
@@ -3640,6 +3651,7 @@
 <translation id="6277518330158259200">З&amp;робити знімок екрана</translation>
 <translation id="6279183038361895380">Натисніть |<ph name="ACCELERATOR" />|, щоб побачити курсор</translation>
 <translation id="6280215091796946657">Увійти в інший обліковий запис</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Увімкнути експеримент, під час якого всі API відображатимуть область перегляду макета. Властивості window.scroll застосовуватимуться до області перегляду макета.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Новий принтер у вашій мережі}one{Нові принтери у вашій мережі}few{Нові принтери у вашій мережі}many{Нові принтери у вашій мережі}other{Нові принтери у вашій мережі}}</translation>
 <translation id="6285395082104474418">Панель статусу показує поточний стан мережі, акумулятора тощо.</translation>
@@ -3695,6 +3707,7 @@
 <translation id="6380143666419481200">Прийняти та продовжити</translation>
 <translation id="6380224340023442078">Налаштування вмісту...</translation>
 <translation id="6383194710567510941">Увімкнути API chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Принаймні $1 елемент буде видалено з цього пристрою назавжди. Щоб відновити дані пізніше, увійдіть в обліковий запис Chrome як $2.}one{Принаймні $1 елемент буде видалено з цього пристрою назавжди. Щоб відновити дані пізніше, увійдіть в обліковий запис Chrome як $2.}few{Принаймні $1 елементи буде видалено з цього пристрою назавжди. Щоб відновити дані пізніше, увійдіть в обліковий запис Chrome як $2.}many{Принаймні $1 елементів буде видалено з цього пристрою назавжди. Щоб відновити дані пізніше, увійдіть в обліковий запис Chrome як $2.}other{Принаймні $1 елемента буде видалено з цього пристрою назавжди. Щоб відновити дані пізніше, увійдіть в обліковий запис Chrome як $2.}}</translation>
 <translation id="6384275966486438344">Використовувати пошукову систему <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Сторінки, які ви переглядаєте в цьому вікні, не відображатимуться в історії веб-переглядача, а після закривання всіх вікон, відкритих у гостьовому режимі, не залишать у комп’ютері інших слідів, наприклад файлів cookie. Однак завантажені файли зберігаються.</translation>
 <translation id="6391538222494443604">Має бути каталог введення.</translation>
@@ -3833,6 +3846,7 @@
 <translation id="6575134580692778371">Не налаштовано</translation>
 <translation id="6575251558004911012">Запитувати, якщо сайту потрібен доступ до вашої камери (рекомендовано)</translation>
 <translation id="6579159469348633828">Кодування вмісту за допомогою алгоритму Brotli.</translation>
+<translation id="6580151766480067746">Версія ARC</translation>
 <translation id="6581162200855843583">Посилання Google Диска</translation>
 <translation id="6583070985841601920">Ви ввійшли як <ph name="USER_EMAIL_ADDRESS" />. Синхронізацію вимкнено вашим адміністратором.</translation>
 <translation id="65832705307647870">Додавати популярні сайти на сторінку нової вкладки.</translation>
@@ -3999,6 +4013,7 @@
 <translation id="6847758263950452722">Збереження сторінки як MHTML</translation>
 <translation id="6853388645642883916">Оновлення в режимі сну</translation>
 <translation id="68541483639528434">Закрити інші вкладки</translation>
+<translation id="6856701878604560493">Дозволити закладки в режимі офлайн</translation>
 <translation id="6860097299815761905">Налаштування проксі-сервера...</translation>
 <translation id="6860427144121307915">Відкрити у вкладці</translation>
 <translation id="6862635236584086457">Для всіх файлів, збережених у цій папці, автоматично зберігаються резервні копії онлайн</translation>
@@ -4170,6 +4185,7 @@
 <translation id="7092106376816104">Винятки для спливаючих вікон</translation>
 <translation id="7093866338626856921">Обмінюватися даними з пристроями з назвами: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Хочете дізнатися про інші корисні функції?</translation>
+<translation id="7096108453481049031">Не вдалось імпортувати контрольованого користувача. Перевірте з’єднання з мережею та спробуйте пізніше.</translation>
 <translation id="7100897339030255923">Вибрано елементів: <ph name="COUNT" /></translation>
 <translation id="710227449793100220">Token Binding</translation>
 <translation id="7106346894903675391">Придбати більше місця...</translation>
@@ -4198,6 +4214,7 @@
 <translation id="713888829801648570">На жаль, неможливо підтвердити ваш пароль, оскільки ви не під’єднані до Інтернету.</translation>
 <translation id="7140928199327930795">Немає інших доступних пристроїв.</translation>
 <translation id="7141105143012495934">Помилка входу. Не вдалось отримати дані вашого облікового запису. Зв’яжіться з адміністратором або повторіть спробу.</translation>
+<translation id="7141331524324591758">Вмикається часткова експериментальна підтримка API Pointer Events. Призначено лише для тестування веб-розробниками. Деякі веб-сайти можуть відкриватися неправильно.</translation>
 <translation id="7143207342074048698">Під’єднання</translation>
 <translation id="7144878232160441200">Повторити спробу</translation>
 <translation id="7148311641502571842">Плагін <ph name="PLUGIN_NAME" /> вимкнено. Щоб знову його активувати, перейдіть на сторінку <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4846,6 +4863,7 @@
 <translation id="8119572489781388874">Змінити налаштування</translation>
 <translation id="8119631488458759651">видалити цей сайт</translation>
 <translation id="8121385576314601440">Налаштування введення даних для стандарту хангиль</translation>
+<translation id="8122245494004914423">Дані веб-перегляду буде видалено з цього пристрою назавжди. Щоб відновити дані пізніше, увійдіть в обліковий запис Chrome як $2.</translation>
 <translation id="8124313775439841391">Керований ONC</translation>
 <translation id="8126844665673008223">Web Bluetooth</translation>
 <translation id="8127322077195964840">Дозволити завантаження недійсних сертифікатів для ресурсів із локального хосту.</translation>
@@ -4930,6 +4948,7 @@
 <translation id="8226742006292257240">Нижче наведено навмання створений пароль для модуля TPM, присвоєний вашому комп'ютеру:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Зловмисники, які зараз перебувають на сайті <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />, можуть намагатися встановити на ваш комп’ютер небезпечні програми, що викрадають або видаляють інформацію (як-от фотографії, паролі, повідомлення чи кредитні картки).</translation>
+<translation id="8233254008506535819">Включити в діалогове вікно "Очистити дані веб-перегляду" опцію додавання важливих сайтів у білий список.</translation>
 <translation id="8236231079192337250">Додаток Галерея Веб-магазину Chrome для драйверів принтера</translation>
 <translation id="8238649969398088015">Порада щодо довідки</translation>
 <translation id="8240697550402899963">Використати класичну тему</translation>
@@ -5253,7 +5272,6 @@
 <translation id="8708671767545720562">&amp;Докладніше</translation>
 <translation id="8711402221661888347">Гамбургер</translation>
 <translation id="8711453844311572806">Коли ваш телефон розблоковано та розташовано поблизу, просто натисніть, щоб увійти. Інакше відображатиметься значок закритого замка, і вам потрібно буде ввести пароль.</translation>
-<translation id="8712637175834984815">Виконано</translation>
 <translation id="8713570323158206935">Надсилати <ph name="BEGIN_LINK1" />інформацію про систему<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Увімкнути автоматичне виправлення для американської клавіатури, щоб отримувати пропозиції під час введення на фізичній клавіатурі.</translation>
 <translation id="871476437400413057">Збережені паролі Google</translation>
@@ -5616,6 +5634,7 @@
 <translation id="952992212772159698">Не активовано</translation>
 <translation id="953000875543358078">Це може зайняти близько хвилини</translation>
 <translation id="960987915827980018">Залишилася приблизно 1 год.</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{$1 елемент буде видалено з цього пристрою назавжди. Щоб відновити дані пізніше, увійдіть в обліковий запис Chrome як $2.}one{$1 елемент буде видалено з цього пристрою назавжди. Щоб відновити дані пізніше, увійдіть в обліковий запис Chrome як $2.}few{$1 елементи буде видалено з цього пристрою назавжди. Щоб відновити дані пізніше, увійдіть в обліковий запис Chrome як $2.}many{$1 елементів буде видалено з цього пристрою назавжди. Щоб відновити дані пізніше, увійдіть в обліковий запис Chrome як $2.}other{$1 елемента буде видалено з цього пристрою назавжди. Щоб відновити дані пізніше, увійдіть в обліковий запис Chrome як $2.}}</translation>
 <translation id="96421021576709873">Мережа Wi-Fi</translation>
 <translation id="965490406356730238">Коли доступно, вмикати для записаного кадру декодер mjpeg з апаратним прискоренням.</translation>
 <translation id="968174221497644223">Кеш програми</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index fcb43639..6de00285 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -251,6 +251,7 @@
       Lưu ý rằng Bluetooth sẽ được bật cho tất cả các thiết bị tương thích của <ph name="USER_DISPLAY_EMAIL" /> và một số thông tin về phần cứng sẽ được gửi tới Google. &lt;a&gt;Tìm hiểu thêm&lt;/a&gt;</translation>
 <translation id="13649080186077898">Quản lý cài đặt Tự động điền</translation>
 <translation id="1367951781824006909">Chọn tệp</translation>
+<translation id="136802136832547685">Không có người dùng được giám sát nào để thêm vào thiết bị này.</translation>
 <translation id="1368265273904755308">Báo cáo sự cố</translation>
 <translation id="1368832886055348810">Trái sang Phải</translation>
 <translation id="1370646789215800222">Bạn muốn xóa người này?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">Tìm kiếm</translation>
 <translation id="1384211230590313258">Trình xử lý khám phá dịch vụ</translation>
 <translation id="1386387014181100145">Xin chào!</translation>
+<translation id="1386830813511981192">Hiện đã có hơn một triệu ứng dụng và trò chơi trên <ph name="DEVICE_TYPE" /> của bạn.</translation>
 <translation id="1389297115360905376">Chỉ có thể thêm ứng dụng/tiện ích này từ <ph name="CHROME_WEB_STORE" />.</translation>
 <translation id="1390548061267426325">Mở dưới dạng tab thông thường</translation>
 <translation id="1395262318152388157">Thanh trượt tìm kiếm</translation>
@@ -894,6 +896,7 @@
 <translation id="2280486287150724112">Lề phải</translation>
 <translation id="2282146716419988068">Quá trình GPU</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">Phiên bản mới của Can thiệp tác nhân người dùng để tải WebFonts.</translation>
 <translation id="2286454467119466181">Đơn giản</translation>
 <translation id="2286950485307333924">Bạn hiện đã đăng nhập vào Chrome</translation>
 <translation id="2287590536030307392">Tắt tất cả các kết nối không dây.</translation>
@@ -1071,6 +1074,7 @@
 <translation id="2542049655219295786">Bảng Google</translation>
 <translation id="2546283357679194313">Cookie và dữ liệu trang web</translation>
 <translation id="2549646943416322527">Trình phát hiện Seccomp</translation>
+<translation id="2550212893339833758">Đã hoán đổi bộ nhớ</translation>
 <translation id="2553100941515833716">Đặt lại trạng thái cài đặt Trình chạy ứng dụng mỗi lần khởi động lại.</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> không thể kết nối đến <ph name="NETWORK_ID" />. Vui lòng chọn một mạng khác hoặc thử lại.</translation>
 <translation id="2553440850688409052">Ẩn plugin này</translation>
@@ -1104,6 +1108,7 @@
 <translation id="2587203970400270934">Mã nhà cung cấp:</translation>
 <translation id="2587922270115112871">Việc tạo người dùng được giám sát không tạo tài khoản Google cũng như các cài đặt
     và dữ liệu của họ sẽ không đồng bộ hóa với các thiết bị khác bằng Chrome Sync. Người dùng được giám sát chỉ áp dụng cho thiết bị này.</translation>
+<translation id="2594049137847833442">Tùy chọn trang web quan trọng trong hộp thoại xóa dữ liệu duyệt web</translation>
 <translation id="2594056015203442344">Khi được bật, chỉ báo âm thanh trong thanh tab gấp đôi điều khiển tắt âm thanh tab.  Thao tác này cũng thêm các lệnh trong menu ngữ cảnh tab để nhanh chóng tắt tiếng nhiều tab được chọn.</translation>
 <translation id="259421303766146093">Thu nhỏ</translation>
 <translation id="2597852038534460976">Chrome không thể truy cập hình nền. Vui lòng kết nối với mạng.</translation>
@@ -1471,7 +1476,6 @@
 <translation id="3065140616557457172">Nhập để tìm kiếm hoặc nhập URL để điều hướng - mọi thứ chỉ hoạt động.</translation>
 <translation id="3067198360141518313">Chạy plugin này</translation>
 <translation id="307519606911195071">Bật các tính năng khác về trợ năng trong trang Cài đặt.</translation>
-<translation id="3075239840551149663"><ph name="NEW_PROFILE_NAME" /> đã được tạo làm người dùng bị giám sát!</translation>
 <translation id="3075874217500066906">Bạn cần khởi động lại để bắt đầu quy trình Powerwash. Sau khi khởi động lại, bạn sẽ được yêu cầu xác nhận rằng bạn muốn tiếp tục.</translation>
 <translation id="3076677906922146425">Cho phép mọi người thêm người vào Chrome</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1488,6 +1492,7 @@
 <translation id="3088034400796962477">Chuyển ngữ (salam ← سلام)</translation>
 <translation id="3088325635286126843">Đổ&amp;i tên...</translation>
 <translation id="308903551226753393">Tự động định cấu hình</translation>
+<translation id="3089231390674410424">Có vẻ như đã xảy ra sự cố với thông tin đăng nhập của bạn. Hãy đảm bảo bạn đăng nhập đúng cách và thử lại.</translation>
 <translation id="3090819949319990166">Không thể sao chép tệp crx bên ngoài sang <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">Đã ghép nối "<ph name="DEVICE_NAME" />"</translation>
 <translation id="3092544800441494315">Kèm ảnh chụp màn hình này:</translation>
@@ -2015,7 +2020,6 @@
 <translation id="3790856258139356663">Kết nối với máy chủ kiểm tra cho Chrome Sync.</translation>
 <translation id="3790909017043401679">Nhập mã PIN của thẻ SIM</translation>
 <translation id="3792890930871100565">Ngắt kết nối máy in</translation>
-<translation id="3795681127952030401"><ph name="URL" /> muốn gửi thông báo cho bạn.</translation>
 <translation id="3796648294839530037">Mạng yêu thích:</translation>
 <translation id="3797900183766075808">&amp;Tìm kiếm trên <ph name="SEARCH_ENGINE" /> cho “<ph name="SEARCH_TERMS" />”</translation>
 <translation id="3798449238516105146">Phiên bản</translation>
@@ -2489,6 +2493,7 @@
 <translation id="4552678318981539154">Mua thêm dung lượng lưu trữ</translation>
 <translation id="4554591392113183336">Tiện ích bên ngoài có cùng phiên bản hoặc phiên bản thấp hơn so với tiện ích hiện có.</translation>
 <translation id="4554796861933393312">Tốc độ hoạt ảnh giọt mực trong thiết kế material design</translation>
+<translation id="4555670907822902621">Bật lưu trang đã đánh dấu để xem ngoại tuyến.</translation>
 <translation id="4555769855065597957">Bóng</translation>
 <translation id="4556110439722119938">Dấu trang, lịch sử, mật khẩu và các cài đặt khác sẽ được đồng bộ hóa với Tài khoản Google của bạn để bạn có thể sử dụng chúng trên tất cả thiết bị của mình.</translation>
 <translation id="4557136421275541763">Cảnh báo:</translation>
@@ -2665,6 +2670,7 @@
 <translation id="4824518112777153488">Hỗ trợ cho màn hình cảm ứng hỗ trợ di chuột</translation>
 <translation id="4830573902900904548"><ph name="DEVICE_TYPE" /> của bạn không thể kết nối Internet bằng cách sử dụng <ph name="NETWORK_NAME" />. Vui lòng chọn mạng khác. <ph name="LEARN_MORE_LINK_START" />Tìm hiểu thêm<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">Thông tin nhận dạng của <ph name="ORGANIZATION" /> tại <ph name="LOCALITY" /> đã được <ph name="ISSUER" /> xác minh. Thông tin hợp lệ về Tính rõ ràng của chứng chỉ đã được máy chủ cung cấp.</translation>
+<translation id="4832537345877333532">Tắt truy xuất tệp hiển thị icc từ Máy chủ Quirks để hiệu chỉnh màu hiển thị.</translation>
 <translation id="4834912470034578916">Bật bố cục tùy chỉnh cho Thông báo trên web.</translation>
 <translation id="4835836146030131423">Lỗi khi đăng nhập.</translation>
 <translation id="4837926214103741331">Bạn không được phép sử dụng thiết bị này. Vui lòng liên hệ với chủ sở hữu thiết bị để có quyền đăng nhập.</translation>
@@ -2852,6 +2858,7 @@
 <translation id="5120421890733714118">Tin tưởng vào chứng chỉ này khi nhận dạng trang web.</translation>
 <translation id="5121130586824819730">Đĩa cứng của bạn đã đầy.  Hãy lưu vào một vị trí khác hoặc tạo thêm dung lượng trống trên đĩa cứng.</translation>
 <translation id="5125751979347152379">URL không hợp lệ.</translation>
+<translation id="5126663277159826272">Tắt Ứng dụng Quirks để hiệu chỉnh màn hình.</translation>
 <translation id="5127881134400491887">Quản lý kết nối mạng</translation>
 <translation id="5128590998814119508">Danh sách hiển thị canvas 2D</translation>
 <translation id="512903556749061217">được đính kèm</translation>
@@ -2993,9 +3000,11 @@
 <translation id="5301751748813680278">Đăng nhập với tư cách khách.</translation>
 <translation id="5301954838959518834">OK</translation>
 <translation id="5302048478445481009">Ngôn ngữ</translation>
+<translation id="5304039790201806037">Sự kiện con trỏ</translation>
 <translation id="5305688511332277257">Chưa cài đặt chứng chỉ nào</translation>
 <translation id="5308380583665731573">Kết nối</translation>
 <translation id="5311260548612583999">Tệp khóa cá nhân (tùy chọn):</translation>
+<translation id="5313967007315987356">Thêm trang web</translation>
 <translation id="5316588172263354223">Tìm kiếm bằng giọng nói bất kỳ lúc nào</translation>
 <translation id="5316716239522500219">Phản chiếu màn hình</translation>
 <translation id="5317780077021120954">Lưu</translation>
@@ -3298,6 +3307,7 @@
 <translation id="5734362860645681824">Truyền thông</translation>
 <translation id="573719557377416048">Xóa trạng thái đồng hiện diện</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: chọn để chỉnh sửa</translation>
+<translation id="5741454054957165976">Bật Phiên bản mới của Can thiệp tác nhân người dùng để tải WebFonts.</translation>
 <translation id="574392208103952083">Trung bình</translation>
 <translation id="5745056705311424885">Đã phát hiện thấy thẻ nhớ USB</translation>
 <translation id="5746169159649715125">Lưu dưới dạng PDF</translation>
@@ -3346,7 +3356,6 @@
 <translation id="5803531701633845775">Chọn cụm từ từ phía sau, mà không cần di chuyển con trỏ</translation>
 <translation id="5804241973901381774">Giấy phép</translation>
 <translation id="580571955903695899">Sắp xếp lại theo Tiêu đề</translation>
-<translation id="5808982448801399019">Ủy quyền không thành công</translation>
 <translation id="580961539202306967">Hỏi tôi khi một trang web muốn gửi thông báo đẩy cho tôi (nên chọn)</translation>
 <translation id="5815645614496570556">Địa chỉ X.400</translation>
 <translation id="5817397429773072584">Tiếng Trung phồn thể</translation>
@@ -3371,6 +3380,7 @@
 <translation id="5834581999798853053">Còn khoảng <ph name="TIME" /> phút</translation>
 <translation id="5838825566232597749">Bàn phím quốc tế Workman Hoa Kỳ</translation>
 <translation id="5839277899276241121">Giống địa chỉ thanh toán</translation>
+<translation id="5844550873065695788">Thao tác này sẽ xóa vĩnh viễn ít nhất <ph name="TOTAL_COUNT" /> mục khỏi thiết bị này. Để truy xuất dữ liệu của bạn sau, hãy đăng nhập vào Chrome dưới dạng $2.</translation>
 <translation id="5846929185714966548">Tab 4</translation>
 <translation id="5848934677402291689">Đang lưu dưới dạng PDF</translation>
 <translation id="5849335628409778954">Nhập thẻ tín dụng...</translation>
@@ -3617,6 +3627,7 @@
 <translation id="6232017090690406397">Pin</translation>
 <translation id="6241530762627360640">Truy cập thông tin về thiết bị Bluetooth được ghép nối với hệ thống của bạn và khám phá các thiết bị Bluetooth lân cận.</translation>
 <translation id="6243774244933267674">Máy chủ không khả dụng</translation>
+<translation id="6246413617632217567">Không thể nhập người dùng được giám sát. Vui lòng kiểm tra dung lượng ổ đĩa cứng và quyền của bạn rồi thử lại.</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">Bản cập nhật đã sẵn sàng</translation>
 <translation id="6248400709929739064">Bật phụ đề</translation>
@@ -3645,6 +3656,7 @@
 <translation id="6277518330158259200">Chụp ảnh màn hình</translation>
 <translation id="6279183038361895380">Nhấn |<ph name="ACCELERATOR" />| để hiển thị con trỏ của bạn</translation>
 <translation id="6280215091796946657">Đăng nhập bằng tài khoản khác</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">Hãy thử nghiệm để tất cả các API phản ánh chế độ xem bố cục. Điều này sẽ giúp thuộc tính window.scroll tương ứng với chế độ xem bố cục.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{Máy in mới trên mạng của bạn}other{Máy in mới trên mạng của bạn}}</translation>
 <translation id="6285395082104474418">Khay trạng thái hiển thị cho bạn trạng thái hiện tại của mạng, pin và các thông tin khác.</translation>
@@ -3700,6 +3712,7 @@
 <translation id="6380143666419481200">Đồng ý và tiếp tục</translation>
 <translation id="6380224340023442078">Cài đặt nội dung...</translation>
 <translation id="6383194710567510941">Cho phép sử dụng API chrome.input.ime.</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{Thao tác này sẽ xóa vĩnh viễn ít nhất $1 mục khỏi thiết bị này. Để truy xuất dữ liệu của bạn sau, hãy đăng nhập vào Chrome dưới dạng $2.}other{Thao tác này sẽ xóa vĩnh viễn ít nhất $1 mục khỏi thiết bị này. Để truy xuất dữ liệu của bạn sau, hãy đăng nhập vào Chrome dưới dạng $2.}}</translation>
 <translation id="6384275966486438344">Thay đổi cài đặt tìm kiếm của bạn thành: <ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">Những trang bạn xem trong cửa sổ này sẽ không xuất hiện trong lịch sử trình duyệt và sẽ không để lại các dấu vết khác như cookie trên máy tính sau khi bạn đóng tất cả cửa sổ Khách đang mở. Tuy nhiên, bất kỳ tệp nào bạn tải xuống cũng sẽ được giữ nguyên.</translation>
 <translation id="6391538222494443604">Thư mục dữ liệu nhập phải tồn tại.</translation>
@@ -3838,6 +3851,7 @@
 <translation id="6575134580692778371">Chưa được định cấu hình</translation>
 <translation id="6575251558004911012">Hỏi khi một trang web yêu cầu quyền truy cập vào máy ảnh của bạn (được đề xuất)</translation>
 <translation id="6579159469348633828">Mã hóa nội dung Brotli.</translation>
+<translation id="6580151766480067746">Phiên bản ARC</translation>
 <translation id="6581162200855843583">Liên kết Google Drive</translation>
 <translation id="6583070985841601920">Đã đăng nhập là <ph name="USER_EMAIL_ADDRESS" />. Đồng bộ hóa bị tắt bởi quản trị viên của bạn.</translation>
 <translation id="65832705307647870">Điền trước những trang web phổ biến vào trang Tab mới.</translation>
@@ -4004,6 +4018,7 @@
 <translation id="6847758263950452722">Lưu trang dưới dạng MHTML</translation>
 <translation id="6853388645642883916">Trình cập nhật đang ở chế độ ngủ</translation>
 <translation id="68541483639528434">Đóng các tab khác</translation>
+<translation id="6856701878604560493">Bật dấu trang ngoại tuyến</translation>
 <translation id="6860097299815761905">Cài đặt proxy...</translation>
 <translation id="6860427144121307915">Mở trong một tab</translation>
 <translation id="6862635236584086457">Tất cả tệp được lưu trong thư mục này đều tự động được sao lưu trực tuyến</translation>
@@ -4176,6 +4191,7 @@
 <translation id="7092106376816104">Ngoại lệ cho cửa sổ bật lên</translation>
 <translation id="7093866338626856921">Trao đổi dữ liệu với thiết bị có tên: <ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">Bạn muốn khám phá thêm những tính năng tuyệt vời?</translation>
+<translation id="7096108453481049031">Không thể nhập người dùng được giám sát. Vui lòng kiểm tra kết nối mạng của bạn rồi thử lại sau.</translation>
 <translation id="7100897339030255923">Đã chọn <ph name="COUNT" /> mục</translation>
 <translation id="710227449793100220">Token Binding.</translation>
 <translation id="7106346894903675391">Mua thêm dung lượng lưu trữ...</translation>
@@ -4204,6 +4220,7 @@
 <translation id="713888829801648570">Rất tiếc, không thể xác minh mật khẩu của bạn vì bạn hiện ngoại tuyến.</translation>
 <translation id="7140928199327930795">Hiện không có thiết bị nào khác.</translation>
 <translation id="7141105143012495934">Đăng nhập không thành công vì không thể truy xuất chi tiết tài khoản của bạn. Vui lòng liên hệ với quản trị viên của bạn hoặc thử lại.</translation>
+<translation id="7141331524324591758">Bật hỗ trợ thử nghiệm một phần cho API Sự kiện con trỏ.  Tính năng này chỉ dành cho mục đích thử nghiệm bởi nhà phát triển web và sẽ khiến một số trang web bị hỏng.</translation>
 <translation id="7143207342074048698">Đang kết nối</translation>
 <translation id="7144878232160441200">Thử lại</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> đã bị tắt. Để bật lại plugin này, hãy truy cập vào <ph name="CHROME_PLUGINS_LINK" />.</translation>
@@ -4852,6 +4869,7 @@
 <translation id="8119572489781388874">Sửa đổi cài đặt</translation>
 <translation id="8119631488458759651">xóa trang web này</translation>
 <translation id="8121385576314601440">Cài đặt phương thức nhập Hangul</translation>
+<translation id="8122245494004914423">Thao tác này sẽ xóa vĩnh viễn dữ liệu duyệt web của bạn khỏi thiết bị này. Để truy xuất dữ liệu của bạn sau, hãy đăng nhập vào Chrome dưới dạng $2.</translation>
 <translation id="8124313775439841391">ONC được quản lý</translation>
 <translation id="8126844665673008223">Bluetooth cho web</translation>
 <translation id="8127322077195964840">Cho phép các chứng chỉ không hợp lệ đối với tài nguyên được tải từ máy chủ cục bộ.</translation>
@@ -4936,6 +4954,7 @@
 <translation id="8226742006292257240">Dưới đây là mật khẩu TPM được tạo ngẫu nhiên đã được gán cho máy tính của bạn:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">Những kẻ tấn công hiện đang truy cập <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> có thể cố gắng cài đặt các chương trình nguy hiểm trên máy tính của bạn. Các chương trình này sẽ đánh cắp hoặc xóa thông tin của bạn (ví dụ: ảnh, mật khẩu, thư và thẻ tín dụng).</translation>
+<translation id="8233254008506535819">Đưa tùy chọn này vào trang web quan trọng thuộc danh sách trắng trong hộp thoại xóa dữ liệu duyệt web.</translation>
 <translation id="8236231079192337250">Ứng dụng Thư viện của Cửa hàng Chrome trực tuyến cho trình điều khiển máy in</translation>
 <translation id="8238649969398088015">Mẹo trợ giúp</translation>
 <translation id="8240697550402899963">Sử dụng chủ đề cổ điển</translation>
@@ -5259,7 +5278,6 @@
 <translation id="8708671767545720562">&amp;Thông tin khác</translation>
 <translation id="8711402221661888347">Đồ chua</translation>
 <translation id="8711453844311572806">Khi điện thoại của bạn được mở khóa và ở gần đó, bạn chỉ cần nhấp để truy cập. Nếu không, bạn sẽ thấy biểu tượng khóa và cần phải nhập mật khẩu của mình.</translation>
-<translation id="8712637175834984815">Bỏ qua</translation>
 <translation id="8713570323158206935">Gửi <ph name="BEGIN_LINK1" />thông tin hệ thống<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">Bật tự động sửa bàn phím thực đối với bàn phím tiếng Anh (Mỹ). Tính năng này có thể đưa ra đề xuất khi nhập trên bàn phím thực.</translation>
 <translation id="871476437400413057">Các mật khẩu đã lưu trên Google</translation>
@@ -5623,6 +5641,7 @@
 <translation id="952992212772159698">Chưa được kích hoạt</translation>
 <translation id="953000875543358078">Quá trình này có thể mất một vài phút</translation>
 <translation id="960987915827980018">Còn khoảng 1 giờ</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{Thao tác này sẽ xóa vĩnh viễn $1 mục khỏi thiết bị này. Để truy xuất dữ liệu của bạn sau, hãy đăng nhập vào Chrome dưới dạng $2.}other{Thao tác này sẽ xóa vĩnh viễn $1 mục khỏi thiết bị này. Để truy xuất dữ liệu của bạn sau, hãy đăng nhập vào Chrome dưới dạng $2.}}</translation>
 <translation id="96421021576709873">Mạng Wi-Fi</translation>
 <translation id="965490406356730238">Bật giải mã mjpeg được tăng tốc bởi phần cứng cho khung đã chụp nếu có.</translation>
 <translation id="968174221497644223">Bộ nhớ cache của ứng dụng</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index f5dee39..ae678cb 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -142,7 +142,7 @@
 <translation id="1196789802623400962">在虚拟键盘设置页面中启用/停用手势编辑选项。</translation>
 <translation id="1196849605089373692">指定截取的图片按比例缩小时的品质设置。</translation>
 <translation id="1197199342062592414">现在开始吧</translation>
-<translation id="119738088725604856">截取窗口的屏幕截图</translation>
+<translation id="119738088725604856">窗口的屏幕截图</translation>
 <translation id="1197979282329025000">检索打印机“<ph name="PRINTER_NAME" />”的打印功能时发生错误。此打印机无法使用“<ph name="CLOUD_PRINT_NAME" />”进行注册。</translation>
 <translation id="1198271701881992799">让我们开始吧</translation>
 <translation id="1199232041627643649">按住 <ph name="KEY_EQUIVALENT" /> 键退出。</translation>
@@ -251,6 +251,7 @@
           请注意,<ph name="USER_DISPLAY_EMAIL" /> 的所有兼容设备都将开启蓝牙功能,并且系统还会将部分硬件信息发送给 Google。&lt;a&gt;了解详情&lt;/a&gt;</translation>
 <translation id="13649080186077898">管理自动填充设置</translation>
 <translation id="1367951781824006909">选择文件</translation>
+<translation id="136802136832547685">没有任何可添加到此设备中的受监管用户。</translation>
 <translation id="1368265273904755308">报告问题</translation>
 <translation id="1368832886055348810">从左向右</translation>
 <translation id="1370646789215800222">要移除用户吗?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">搜索</translation>
 <translation id="1384211230590313258">服务发现处理程序</translation>
 <translation id="1386387014181100145">您好!</translation>
+<translation id="1386830813511981192">目前,您可以在 <ph name="DEVICE_TYPE" /> 上体验超过一百万款应用和游戏。</translation>
 <translation id="1389297115360905376">只能通过 <ph name="CHROME_WEB_STORE" />添加该程序。</translation>
 <translation id="1390548061267426325">在常规标签页中打开</translation>
 <translation id="1395262318152388157">进度滑块</translation>
@@ -888,6 +890,7 @@
 <translation id="2280486287150724112">右侧页边距</translation>
 <translation id="2282146716419988068">GPU 进程</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">加载 WebFonts 时启用新版用户代理干预。</translation>
 <translation id="2286454467119466181">简单</translation>
 <translation id="2286950485307333924">现在您已登录到Chrome</translation>
 <translation id="2287590536030307392">停用所有无线连接。</translation>
@@ -1065,6 +1068,7 @@
 <translation id="2542049655219295786">Google 表格</translation>
 <translation id="2546283357679194313">Cookie 和网站数据</translation>
 <translation id="2549646943416322527">Seccomp 检测器</translation>
+<translation id="2550212893339833758">已交换的内存</translation>
 <translation id="2553100941515833716">每次重新启动时均重置应用启动器安装状态。</translation>
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" />无法连接到<ph name="NETWORK_ID" />。请选择其他网络或重试。</translation>
 <translation id="2553440850688409052">隐藏此插件</translation>
@@ -1097,6 +1101,7 @@
 <translation id="2585300050980572691">默认搜索设置</translation>
 <translation id="2587203970400270934">运算符代码:</translation>
 <translation id="2587922270115112871">创建受监管用户不会随之创建 Google 帐户,因此这些受监管用户无法借助 Chrome 同步功能将其设置和数据同步到其他设备。受监管用户的设置只能应用于此设备。</translation>
+<translation id="2594049137847833442">“清除浏览数据”对话框中的重要网站选项</translation>
 <translation id="2594056015203442344">启用此项后,标签栏中的音频指示器还可用作标签页静音控件。此外,标签页上下文菜单中还会添加一些命令,以便您将多个所选标签页快速静音。</translation>
 <translation id="259421303766146093">缩小</translation>
 <translation id="2597852038534460976">Chrome 无法访问壁纸,请连接到网络。</translation>
@@ -1464,7 +1469,6 @@
 <translation id="3065140616557457172">地址栏、搜索框合二为一,更方便!</translation>
 <translation id="3067198360141518313">运行此插件</translation>
 <translation id="307519606911195071">在“设置”页面中启用其他无障碍功能。</translation>
-<translation id="3075239840551149663">已创建受监管用户“<ph name="NEW_PROFILE_NAME" />”!</translation>
 <translation id="3075874217500066906">必须重启才能开始 Powerwash 操作。重启后,系统将提示您确认是否要继续。</translation>
 <translation id="3076677906922146425">允许任何人向 Chrome 添加用户</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1481,6 +1485,7 @@
 <translation id="3088034400796962477">音译(salam ← سلام)</translation>
 <translation id="3088325635286126843">重命名(&amp;R)...</translation>
 <translation id="308903551226753393">自动配置</translation>
+<translation id="3089231390674410424">您的凭据似乎有问题。请确保您已成功登录,然后重试。</translation>
 <translation id="3090819949319990166">无法将外部 crx 文件复制到 <ph name="TEMP_CRX_FILE" />。</translation>
 <translation id="3090871774332213558">“<ph name="DEVICE_NAME" />”已配对</translation>
 <translation id="3092544800441494315">包括此屏幕截图:</translation>
@@ -2005,7 +2010,6 @@
 <translation id="3790856258139356663">连接到 Chrome 同步功能对应的测试服务器。</translation>
 <translation id="3790909017043401679">输入 SIM 卡 PIN</translation>
 <translation id="3792890930871100565">断开打印机连接</translation>
-<translation id="3795681127952030401"><ph name="URL" />想向您发送通知。</translation>
 <translation id="3796648294839530037">收藏的网络:</translation>
 <translation id="3797900183766075808">使用<ph name="SEARCH_ENGINE" />搜索“<ph name="SEARCH_TERMS" />”(&amp;S)</translation>
 <translation id="3798449238516105146">版本</translation>
@@ -2478,6 +2482,7 @@
 <translation id="4552678318981539154">购买更多存储空间</translation>
 <translation id="4554591392113183336">外部扩展程序的版本与现有版本相同或更低。</translation>
 <translation id="4554796861933393312">Material Design 墨滴动画速度</translation>
+<translation id="4555670907822902621">允许在离线浏览时保存已添加标签的网页。</translation>
 <translation id="4555769855065597957">阴影</translation>
 <translation id="4556110439722119938">您的书签、历史记录、密码及其他设置均将同步到您的 Google 帐户,以便您在自己的任意设备上使用</translation>
 <translation id="4557136421275541763">警告:</translation>
@@ -2650,6 +2655,7 @@
 <translation id="4824518112777153488">支持具有悬停功能的触摸屏</translation>
 <translation id="4830573902900904548">您的<ph name="DEVICE_TYPE" />无法通过<ph name="NETWORK_NAME" />连接到互联网,请选择其他网络。<ph name="LEARN_MORE_LINK_START" />了解详情<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572">位于<ph name="LOCALITY" />的<ph name="ORGANIZATION" />的身份已通过了<ph name="ISSUER" />的验证。服务器已提供有效的 Certificate Transparency 信息。</translation>
+<translation id="4832537345877333532">禁止通过从 Quirks Server 中检索 icc 显示文件来对显示屏颜色进行校准。</translation>
 <translation id="4834912470034578916">为网页通知启用自定义布局。</translation>
 <translation id="4835836146030131423">登录发生错误。</translation>
 <translation id="4837926214103741331">您无权使用此设备。请向此设备的所有者申请登录权限。</translation>
@@ -2836,6 +2842,7 @@
 <translation id="5120421890733714118">信任该证书,以标识网站的身份。</translation>
 <translation id="5121130586824819730">您的硬盘已满。请保存到其他位置或在硬盘上腾出更多空间。</translation>
 <translation id="5125751979347152379">网址无效。</translation>
+<translation id="5126663277159826272">禁止使用 Quirks Client 对显示屏进行校准。</translation>
 <translation id="5127881134400491887">管理网络连接</translation>
 <translation id="5128590998814119508">显示列表 2D 画布</translation>
 <translation id="512903556749061217">已连接</translation>
@@ -2975,9 +2982,11 @@
 <translation id="5301751748813680278">以访客身份登录。</translation>
 <translation id="5301954838959518834">知道了</translation>
 <translation id="5302048478445481009">语言</translation>
+<translation id="5304039790201806037">指针活动</translation>
 <translation id="5305688511332277257">未安装任何证书</translation>
 <translation id="5308380583665731573">连接</translation>
 <translation id="5311260548612583999">私有密钥文件(可选):</translation>
+<translation id="5313967007315987356">添加网站</translation>
 <translation id="5316588172263354223">随时进行语音搜索</translation>
 <translation id="5316716239522500219">镜像显示器</translation>
 <translation id="5317780077021120954">保存</translation>
@@ -3280,6 +3289,7 @@
 <translation id="5734362860645681824">通讯</translation>
 <translation id="573719557377416048">清除共存状态</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />:选择以进行修改</translation>
+<translation id="5741454054957165976">加载 WebFonts 时启用新版用户代理干预。</translation>
 <translation id="574392208103952083">中</translation>
 <translation id="5745056705311424885">检测到 USB 记忆棒</translation>
 <translation id="5746169159649715125">另存为 PDF</translation>
@@ -3328,7 +3338,6 @@
 <translation id="5803531701633845775">不移动光标,从以前输入的内容中选词。</translation>
 <translation id="5804241973901381774">权限</translation>
 <translation id="580571955903695899">按标题重新排序</translation>
-<translation id="5808982448801399019">授权失败</translation>
 <translation id="580961539202306967">在网站要向我发送推送消息时询问我(推荐)</translation>
 <translation id="5815645614496570556">X.400 地址</translation>
 <translation id="5817397429773072584">繁体中文</translation>
@@ -3353,6 +3362,7 @@
 <translation id="5834581999798853053">约剩 <ph name="TIME" /> 分钟</translation>
 <translation id="5838825566232597749">美式 Workman 国际</translation>
 <translation id="5839277899276241121">与帐单邮寄地址相同</translation>
+<translation id="5844550873065695788">这会将至少 <ph name="TOTAL_COUNT" /> 项内容从这台设备上永久删除。要想日后检索您的数据,请以“$2”的身份登录 Chrome。</translation>
 <translation id="5846929185714966548">标签页 4</translation>
 <translation id="5848934677402291689">正在保存为 PDF 格式</translation>
 <translation id="5849335628409778954">输入信用卡信息…</translation>
@@ -3597,6 +3607,7 @@
 <translation id="6232017090690406397">电池</translation>
 <translation id="6241530762627360640">获取与您的系统配对的蓝牙设备的相关信息,以及发现附近的蓝牙设备。</translation>
 <translation id="6243774244933267674">服务器不可用</translation>
+<translation id="6246413617632217567">无法导入该受监管用户。请检查您的硬盘空间和权限,然后重试。</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">有可用的更新</translation>
 <translation id="6248400709929739064">启用字幕</translation>
@@ -3625,6 +3636,7 @@
 <translation id="6277518330158259200">屏幕截图(&amp;A)</translation>
 <translation id="6279183038361895380">按 |<ph name="ACCELERATOR" />| 可显示鼠标光标</translation>
 <translation id="6280215091796946657">使用其他帐户登录</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">一项实验性功能,可让所有 API 都反映布局视口。启用此项后,系统会将 window.scroll 属性的值视为相对于布局视口的值。</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{您的网络中有 1 台新打印机}other{您的网络中有多台新打印机}}</translation>
 <translation id="6285395082104474418">状态栏会显示网络、电池等的当前状态。</translation>
@@ -3680,6 +3692,7 @@
 <translation id="6380143666419481200">接受并继续</translation>
 <translation id="6380224340023442078">内容设置…</translation>
 <translation id="6383194710567510941">允许使用 chrome.input.ime API。</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{这会将至少 $1 项内容从这台设备上永久删除。要想日后检索您的数据,请以“$2”的身份登录 Chrome。}other{这会将至少 $1 项内容从这台设备上永久删除。要想日后检索您的数据,请以“$2”的身份登录 Chrome。}}</translation>
 <translation id="6384275966486438344">将您的搜索设置更改为:<ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">当您关闭以访客身份打开的所有窗口后,您在此窗口中浏览的网页将不会显示在浏览器历史记录中,也不会在计算机上留下其他痕迹(例如Cookie)。不过,您下载的所有文件均会保留下来。</translation>
 <translation id="6391538222494443604">必须存在输入目录。</translation>
@@ -3817,6 +3830,7 @@
 <translation id="6575134580692778371">未配置</translation>
 <translation id="6575251558004911012">当网站要求使用您的摄像头时询问您(推荐)</translation>
 <translation id="6579159469348633828">Brotli 内容编码。</translation>
+<translation id="6580151766480067746">ARC 版本</translation>
 <translation id="6581162200855843583">Google 云端硬盘链接</translation>
 <translation id="6583070985841601920">您已经以 <ph name="USER_EMAIL_ADDRESS" /> 的身份登录,但同步已被管理员阻止。</translation>
 <translation id="65832705307647870">在“打开新的标签页”页面中预先显示热门网站。</translation>
@@ -3982,6 +3996,7 @@
 <translation id="6847758263950452722">将网页另存为 MHTML</translation>
 <translation id="6853388645642883916">更新程序处于休眠模式</translation>
 <translation id="68541483639528434">关闭其他标签页</translation>
+<translation id="6856701878604560493">启用离线书签</translation>
 <translation id="6860097299815761905">代理设置...</translation>
 <translation id="6860427144121307915">在标签页中打开</translation>
 <translation id="6862635236584086457">系统会自动在线备份保存在此文件夹中的所有文件</translation>
@@ -4153,6 +4168,7 @@
 <translation id="7092106376816104">弹出式窗口例外情况</translation>
 <translation id="7093866338626856921">与具有下列名称的设备交换数据:<ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">想了解更多超棒的功能?</translation>
+<translation id="7096108453481049031">无法导入该受监管用户。请检查您的网络连接,然后稍后重试。</translation>
 <translation id="7100897339030255923">已选择 <ph name="COUNT" /> 项</translation>
 <translation id="710227449793100220">Token Binding。</translation>
 <translation id="7106346894903675391">购买更多存储空间...</translation>
@@ -4181,6 +4197,7 @@
 <translation id="713888829801648570">抱歉,您目前处于离线状态,因此系统无法验证您的密码。</translation>
 <translation id="7140928199327930795">没有其他可用的设备。</translation>
 <translation id="7141105143012495934">由于无法获取您的帐户详情,因此登录失败了。请与管理员联系或重试。</translation>
+<translation id="7141331524324591758">允许针对 Pointer Events API 提供部分实验性支持。此选项仅供网络开发者进行测试所用,且会导致部分网站遭到细微的破坏。</translation>
 <translation id="7143207342074048698">正在连接</translation>
 <translation id="7144878232160441200">重试</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> 已停用。要重新启用该插件,请访问 <ph name="CHROME_PLUGINS_LINK" />。</translation>
@@ -4820,6 +4837,7 @@
 <translation id="8119572489781388874">修改设置</translation>
 <translation id="8119631488458759651">删除该网站</translation>
 <translation id="8121385576314601440">朝鲜文输入设置</translation>
+<translation id="8122245494004914423">这会将您的浏览数据从这台设备上永久删除。要想日后检索您的数据,请以“$2”的身份登录 Chrome。</translation>
 <translation id="8124313775439841391">受管理的 ONC</translation>
 <translation id="8126844665673008223">网络蓝牙</translation>
 <translation id="8127322077195964840">对于从本地主机加载的资源,允许使用无效的证书。</translation>
@@ -4904,6 +4922,7 @@
 <translation id="8226742006292257240">以下是一个分配给您计算机的、随机生成的 TPM 密码:</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />、<ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">目前<ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />上的攻击程序可能会试图在您的计算机上安装危险程序来窃取或删除您的信息(例如:照片、密码、通讯内容和信用卡信息)。</translation>
+<translation id="8233254008506535819">包含在“清除浏览数据”对话框中将重要网站加入白名单的选项。</translation>
 <translation id="8236231079192337250">专门搜索打印机驱动程序的“Chrome 网上应用店扩展程序列表”应用</translation>
 <translation id="8238649969398088015">帮助提示</translation>
 <translation id="8240697550402899963">使用经典主题背景</translation>
@@ -5227,7 +5246,6 @@
 <translation id="8708671767545720562">详细信息(&amp;M)</translation>
 <translation id="8711402221661888347">汉堡包</translation>
 <translation id="8711453844311572806">当配对手机未锁定并且在附近时,只需点击即可进入。否则,您将会看到一个挂锁图标,并且需要输入密码才能解锁。</translation>
-<translation id="8712637175834984815">知道了</translation>
 <translation id="8713570323158206935">发送<ph name="BEGIN_LINK1" />系统信息<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">启用针对美式键盘的物理键盘自动更正功能(启用该功能后,当您在物理键盘上输入内容时,系统会提供字词建议)。</translation>
 <translation id="871476437400413057">Google 保存的密码</translation>
@@ -5590,6 +5608,7 @@
 <translation id="952992212772159698">未激活</translation>
 <translation id="953000875543358078">这可能需要 1 分钟左右的时间</translation>
 <translation id="960987915827980018">约剩 1 小时</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{这会将 $1 项内容从这台设备上永久删除。要想日后检索您的数据,请以“$2”的身份登录 Chrome。}other{这会将 $1 项内容从这台设备上永久删除。要想日后检索您的数据,请以“$2”的身份登录 Chrome。}}</translation>
 <translation id="96421021576709873">Wi-Fi 网络</translation>
 <translation id="965490406356730238">为捕获的帧启用硬件加速 mjpeg 解码功能(若适用)。</translation>
 <translation id="968174221497644223">应用缓存</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index e3e9bfc..8bdf634 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -251,6 +251,7 @@
         請注意,<ph name="USER_DISPLAY_EMAIL" /> 的所有相容裝置都會開啟藍牙功能,系統也會將部分硬體資訊傳送給 Google。&lt;a&gt;瞭解詳情&lt;/a&gt;</translation>
 <translation id="13649080186077898">管理自動填入設定</translation>
 <translation id="1367951781824006909">選擇檔案</translation>
+<translation id="136802136832547685">沒有受監管的使用者可以新增至這部裝置。</translation>
 <translation id="1368265273904755308">回報問題</translation>
 <translation id="1368832886055348810">由左至右</translation>
 <translation id="1370646789215800222">是否移除使用者?</translation>
@@ -264,6 +265,7 @@
 <translation id="1383876407941801731">搜尋</translation>
 <translation id="1384211230590313258">服務探索處理常式</translation>
 <translation id="1386387014181100145">您好!</translation>
+<translation id="1386830813511981192">現在起,您可以在 <ph name="DEVICE_TYPE" /> 上體驗超過百萬款的應用程式和遊戲。</translation>
 <translation id="1389297115360905376">只能從 <ph name="CHROME_WEB_STORE" /> 新增這個套件。</translation>
 <translation id="1390548061267426325">在一般分頁中開啟</translation>
 <translation id="1395262318152388157">播放進度控制滑桿</translation>
@@ -892,6 +894,7 @@
 <translation id="2280486287150724112">右邊界</translation>
 <translation id="2282146716419988068">GPU 處理程序</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2286407726708507314">載入 WebFonts 時中斷新版使用者代理程式。</translation>
 <translation id="2286454467119466181">簡單</translation>
 <translation id="2286950485307333924">您現在已登入 Chrome</translation>
 <translation id="2287590536030307392">關閉所有無線連線。</translation>
@@ -1069,6 +1072,7 @@
 <translation id="2542049655219295786">Google 表格</translation>
 <translation id="2546283357679194313">Cookie 和網站資料</translation>
 <translation id="2549646943416322527">Seccomp 偵測工具</translation>
+<translation id="2550212893339833758">交換的記憶體</translation>
 <translation id="2553100941515833716">每次重新啟動時,重設應用程式啟動器的安裝狀態。</translation>
 <translation id="2553340429761841190">「<ph name="PRODUCT_NAME" />」無法連線至<ph name="NETWORK_ID" />,請選取其他網路,或再試一次。</translation>
 <translation id="2553440850688409052">隱藏這個外掛程式</translation>
@@ -1102,6 +1106,7 @@
 <translation id="2587203970400270934">行動電話網路業者代碼:</translation>
 <translation id="2587922270115112871">建立受監管的使用者時並不會建立 Google 帳戶,且該使用者的設定
     及資料都不會同步處理至使用 Chrome 同步功能的其他裝置。目前,受監管的使用者只適用於這個裝置上所安裝的 Chrome。</translation>
+<translation id="2594049137847833442">「清除瀏覽資料」對話方塊中的重要網站選項</translation>
 <translation id="2594056015203442344">啟用後,分頁列中的音訊指示器會兼做分頁音訊開關控制項。同時,分頁內容選單中也會加入新指令,方便您快速將多個指定分頁靜音。</translation>
 <translation id="259421303766146093">縮小</translation>
 <translation id="2597852038534460976">Chrome 無法存取桌布,請請連線至網路。</translation>
@@ -1469,7 +1474,6 @@
 <translation id="3065140616557457172">輸入搜尋網址或內容,什麼都行。</translation>
 <translation id="3067198360141518313">執行這個外掛程式</translation>
 <translation id="307519606911195071">在「設定」頁面中啟用額外的協助工具功能。</translation>
-<translation id="3075239840551149663">已建立受監管的使用者「<ph name="NEW_PROFILE_NAME" />」!</translation>
 <translation id="3075874217500066906">Powerwash 程序必須重新啟動才能開始執行。重新啟動後,系統將向您確認是否繼續程序。</translation>
 <translation id="3076677906922146425">允許所有人在 Chrome 中新增使用者</translation>
 <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation>
@@ -1486,6 +1490,7 @@
 <translation id="3088034400796962477">音譯 (salam ← سلام)</translation>
 <translation id="3088325635286126843">重新命名(&amp;R)...</translation>
 <translation id="308903551226753393">自動設定</translation>
+<translation id="3089231390674410424">您的憑證似乎發生問題。請確認您已登入系統,然後再試一次。</translation>
 <translation id="3090819949319990166">無法將外部 crx 檔案複製到 <ph name="TEMP_CRX_FILE" />。</translation>
 <translation id="3090871774332213558">「<ph name="DEVICE_NAME" />」已配對</translation>
 <translation id="3092544800441494315">包含這個螢幕擷取畫面:</translation>
@@ -2012,7 +2017,6 @@
 <translation id="3790856258139356663">連線至 Chrome 同步的測試伺服器。</translation>
 <translation id="3790909017043401679">輸入 SIM 卡 PIN</translation>
 <translation id="3792890930871100565">中斷印表機連線</translation>
-<translation id="3795681127952030401"><ph name="URL" /> 要求傳送通知給您。</translation>
 <translation id="3796648294839530037">慣用的網路:</translation>
 <translation id="3797900183766075808">透過 <ph name="SEARCH_ENGINE" /> 搜尋「<ph name="SEARCH_TERMS" />」(&amp;S)</translation>
 <translation id="3798449238516105146">版本</translation>
@@ -2485,6 +2489,7 @@
 <translation id="4552678318981539154">購買更多儲存空間</translation>
 <translation id="4554591392113183336">外部擴充功能與現有擴充功能的版本相同,或版本較低。</translation>
 <translation id="4554796861933393312">質感設計墨滴動畫速度</translation>
+<translation id="4555670907822902621">允許在離線瀏覽時儲存已標記書籤的頁面。</translation>
 <translation id="4555769855065597957">陰影</translation>
 <translation id="4556110439722119938">您的書籤、歷史紀錄、密碼和其他設定都會在您的 Google 帳戶中保持同步,讓您在所有個人裝置上使用。</translation>
 <translation id="4557136421275541763">警告:</translation>
@@ -2658,6 +2663,7 @@
 <translation id="4824518112777153488">懸停操作式觸控螢幕支援功能</translation>
 <translation id="4830573902900904548">您的 <ph name="DEVICE_TYPE" /> 無法透過 <ph name="NETWORK_NAME" /> 連線至網際網路,請選擇其他網路。<ph name="LEARN_MORE_LINK_START" />瞭解詳情<ph name="LEARN_MORE_LINK_END" /></translation>
 <translation id="4830663122372455572"><ph name="ORGANIZATION" /> (所在地:<ph name="LOCALITY" />) 的身分已通過 <ph name="ISSUER" /> 驗證,且伺服器提供了有效的 Certificate Transparency 資訊。</translation>
+<translation id="4832537345877333532">禁止從 Quirks Server 擷取 ICC 顯示檔案,用於校正顯示色彩。</translation>
 <translation id="4834912470034578916">為網路通知啟用自訂版面配置。</translation>
 <translation id="4835836146030131423">登入發生錯誤。</translation>
 <translation id="4837926214103741331">您未獲得授權,無法使用這個裝置。如需登入權限,請與裝置擁有者聯絡。</translation>
@@ -2844,6 +2850,7 @@
 <translation id="5120421890733714118">信任這個用來識別網站的憑證。</translation>
 <translation id="5121130586824819730">您的硬碟已滿。請選擇其他儲存位置,或清出足夠的硬碟空間。</translation>
 <translation id="5125751979347152379">網址無效。</translation>
+<translation id="5126663277159826272">禁止使用 Quirks Client 校正顯示色彩。</translation>
 <translation id="5127881134400491887">管理網路連線</translation>
 <translation id="5128590998814119508">顯示清單 2D Canvas</translation>
 <translation id="512903556749061217">已附加</translation>
@@ -2984,9 +2991,11 @@
 <translation id="5301751748813680278">正在以訪客身分登入。</translation>
 <translation id="5301954838959518834">好,我瞭解了</translation>
 <translation id="5302048478445481009">語言</translation>
+<translation id="5304039790201806037">指標活動</translation>
 <translation id="5305688511332277257">未安裝任何憑證</translation>
 <translation id="5308380583665731573">連線</translation>
 <translation id="5311260548612583999">秘密金鑰檔案 (選擇性):</translation>
+<translation id="5313967007315987356">新增網站</translation>
 <translation id="5316588172263354223">隨時進行語音搜尋</translation>
 <translation id="5316716239522500219">建立顯示器鏡像</translation>
 <translation id="5317780077021120954">儲存</translation>
@@ -3289,6 +3298,7 @@
 <translation id="5734362860645681824">通訊</translation>
 <translation id="573719557377416048">清除共存狀態</translation>
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />:選取即可編輯</translation>
+<translation id="5741454054957165976">允許在載入 WebFonts 時中斷新版使用者代理程式。</translation>
 <translation id="574392208103952083">中</translation>
 <translation id="5745056705311424885">偵測到 USB 隨身碟</translation>
 <translation id="5746169159649715125">另存為 PDF</translation>
@@ -3337,7 +3347,6 @@
 <translation id="5803531701633845775">從後面選擇詞組而無需移動游標</translation>
 <translation id="5804241973901381774">權限</translation>
 <translation id="580571955903695899">按標題重新排序</translation>
-<translation id="5808982448801399019">驗證失敗</translation>
 <translation id="580961539202306967">每當有網站要傳送推送訊息時詢問我 (建議使用)</translation>
 <translation id="5815645614496570556">X.400 地址</translation>
 <translation id="5817397429773072584">繁體中文</translation>
@@ -3362,6 +3371,7 @@
 <translation id="5834581999798853053">剩下 <ph name="TIME" /> 分鐘</translation>
 <translation id="5838825566232597749">美式 Workman 國際</translation>
 <translation id="5839277899276241121">與帳單地址相同</translation>
+<translation id="5844550873065695788">這至少會將 <ph name="TOTAL_COUNT" /> 個項目從這個裝置上永久刪除。如果日後想要擷取資料,請以「$2」的身分登入 Chrome。</translation>
 <translation id="5846929185714966548">分頁 4</translation>
 <translation id="5848934677402291689">正在儲存為 PDF</translation>
 <translation id="5849335628409778954">輸入信用卡資訊...</translation>
@@ -3606,6 +3616,7 @@
 <translation id="6232017090690406397">電池</translation>
 <translation id="6241530762627360640">存取與系統配對的藍牙裝置資訊並搜尋附近的藍牙裝置。</translation>
 <translation id="6243774244933267674">無法與伺服器連線</translation>
+<translation id="6246413617632217567">無法匯入受監管的使用者。請檢查您的硬碟空間和權限,然後再試一次。</translation>
 <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
 <translation id="624789221780392884">可進行更新</translation>
 <translation id="6248400709929739064">啟用字幕</translation>
@@ -3634,6 +3645,7 @@
 <translation id="6277518330158259200">擷取螢幕畫面(&amp;A)</translation>
 <translation id="6279183038361895380">按下 |<ph name="ACCELERATOR" />| 即可顯示游標</translation>
 <translation id="6280215091796946657">以其他帳戶登入</translation>
+<translation id="6280912520669706465">ARC</translation>
 <translation id="6281743458679673853">這個實驗會讓所有 API 都反映版面配置檢視區。這會讓 window.scroll 屬性與版面配置檢視區關聯。</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{您的網路上有一台新印表機}other{您的網路上有多台新印表機}}</translation>
 <translation id="6285395082104474418">狀態匣會顯示目前的網路狀態、電池狀態和其他項目的狀態。</translation>
@@ -3689,6 +3701,7 @@
 <translation id="6380143666419481200">接受並繼續</translation>
 <translation id="6380224340023442078">內容設定...</translation>
 <translation id="6383194710567510941">允許使用 chrome.input.ime API。</translation>
+<translation id="6383618109990544268">{NUM_ITEMS,plural, =1{這至少會將 $1 個項目從這個裝置上永久刪除。如果日後想要擷取資料,請以「$2」的身分登入 Chrome。}other{這至少會將 $1 個項目從這個裝置上永久刪除。如果日後想要擷取資料,請以「$2」的身分登入 Chrome。}}</translation>
 <translation id="6384275966486438344">將您的搜尋設定變更為:<ph name="SEARCH_HOST" /></translation>
 <translation id="6390799748543157332">您在這個視窗瀏覽的網頁不會顯示在瀏覽器紀錄中,而且在您關閉所有開啟的訪客視窗後,電腦也不會留下 Cookie 等其他紀錄。不過,系統將會保留您下載的所有檔案。</translation>
 <translation id="6391538222494443604">輸入項目目錄必須存在</translation>
@@ -3826,6 +3839,7 @@
 <translation id="6575134580692778371">未設定</translation>
 <translation id="6575251558004911012">當網站需要使用您的攝影機時,必須先詢問您 (建議)</translation>
 <translation id="6579159469348633828">Brotli 內容編碼。</translation>
+<translation id="6580151766480067746">ARC 版本</translation>
 <translation id="6581162200855843583">Google 雲端硬碟連結</translation>
 <translation id="6583070985841601920">您使用了 <ph name="USER_EMAIL_ADDRESS" /> 的身分登入,但管理員已關閉同步功能。</translation>
 <translation id="65832705307647870">讓新分頁顯示預設的熱門網站。</translation>
@@ -3991,6 +4005,7 @@
 <translation id="6847758263950452722">將網頁另存為 MHTML</translation>
 <translation id="6853388645642883916">更新程式休眠中</translation>
 <translation id="68541483639528434">關閉其他分頁</translation>
+<translation id="6856701878604560493">啟用離線書籤</translation>
 <translation id="6860097299815761905">Proxy 設定...</translation>
 <translation id="6860427144121307915">在分頁中開啟</translation>
 <translation id="6862635236584086457">所有儲存在這個資料夾的檔案都會自動在線上備份</translation>
@@ -4162,6 +4177,7 @@
 <translation id="7092106376816104">彈出式視窗例外</translation>
 <translation id="7093866338626856921">與下列名稱的裝置交換資料:<ph name="HOSTNAMES" /></translation>
 <translation id="7096082900368329802">想要探索更多超讚功能嗎?</translation>
+<translation id="7096108453481049031">無法匯入受監管的使用者。請檢查您的網路連線,然後再試一次。</translation>
 <translation id="7100897339030255923">已選取 <ph name="COUNT" /> 個項目</translation>
 <translation id="710227449793100220">Token Binding。</translation>
 <translation id="7106346894903675391">購買更多儲存空間...</translation>
@@ -4190,6 +4206,7 @@
 <translation id="713888829801648570">很抱歉,您目前處於離線狀態,因此無法驗證密碼。</translation>
 <translation id="7140928199327930795">沒有其他可用裝置。</translation>
 <translation id="7141105143012495934">無法擷取您的帳戶詳細資料,導致登入失敗。請與您的管理員聯絡或再試一次。</translation>
+<translation id="7141331524324591758">允許針對指標活動 API 提供部分實驗性支援。這僅供網站開發人員測試之用,且會導致部分網站輕微毀損。</translation>
 <translation id="7143207342074048698">連線中</translation>
 <translation id="7144878232160441200">重試</translation>
 <translation id="7148311641502571842"><ph name="PLUGIN_NAME" /> 已停用。如要重新啟用外掛程式,請前往 <ph name="CHROME_PLUGINS_LINK" />。</translation>
@@ -4835,6 +4852,7 @@
 <translation id="8119572489781388874">修改設定</translation>
 <translation id="8119631488458759651">移除這個網站</translation>
 <translation id="8121385576314601440">韓文輸入法設定</translation>
+<translation id="8122245494004914423">這會將您的瀏覽資料從這個裝置上永久刪除。如果日後想要擷取資料,請以「$2」的身分登入 Chrome。</translation>
 <translation id="8124313775439841391">管理化 ONC</translation>
 <translation id="8126844665673008223">網路藍牙</translation>
 <translation id="8127322077195964840">允許從本機主機載入無效的資源憑證。</translation>
@@ -4919,6 +4937,7 @@
 <translation id="8226742006292257240">以下是您的電腦專用的 TPM 密碼 (由系統隨機產生):</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />、<ph name="TYPE_2" /></translation>
 <translation id="8230421197304563332">攻擊者目前可能會試圖透過 <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> 在您的電腦上安裝危險程式,藉此竊取或刪除您的資訊 (例如相片、密碼、郵件或信用卡資料)。</translation>
+<translation id="8233254008506535819">包含在「清除瀏覽資料」對話方塊中將重要網站新增至許可清單的選項。</translation>
 <translation id="8236231079192337250">專門尋找印表機驅動程式的「Chrome 線上應用程式商店擴充功能庫」應用程式</translation>
 <translation id="8238649969398088015">說明提示</translation>
 <translation id="8240697550402899963">使用傳統主題</translation>
@@ -5242,7 +5261,6 @@
 <translation id="8708671767545720562">更多資訊(&amp;M)</translation>
 <translation id="8711402221661888347">漢堡</translation>
 <translation id="8711453844311572806">當您的手機在附近並已解鎖時,直接點選即可繼續操作。否則,您會看到已鎖定圖示,且必須輸入密碼。</translation>
-<translation id="8712637175834984815">我瞭解了</translation>
 <translation id="8713570323158206935">傳送<ph name="BEGIN_LINK1" />系統資訊<ph name="END_LINK1" /></translation>
 <translation id="8713979477561846077">啟用美式鍵盤的實體鍵盤自動更正功能,讓系統在您使用實體鍵盤輸入時提供建議字詞。</translation>
 <translation id="871476437400413057">Google 儲存的密碼</translation>
@@ -5605,6 +5623,7 @@
 <translation id="952992212772159698">未啟用</translation>
 <translation id="953000875543358078">請稍候幾分鐘</translation>
 <translation id="960987915827980018">剩下約 1 個小時</translation>
+<translation id="963785807426584567">{NUM_ITEMS,plural, =1{這會將 $1 個項目從這個裝置上永久刪除。如果日後想要擷取資料,請以「$2」的身分登入 Chrome。}other{這會將 $1 個項目從這個裝置上永久刪除。如果日後想要擷取資料,請以「$2」的身分登入 Chrome。}}</translation>
 <translation id="96421021576709873">Wi-Fi 網路</translation>
 <translation id="965490406356730238">針對擷取的影格啟用硬體加速 mjpeg 解碼功能 (如適用)。</translation>
 <translation id="968174221497644223">應用程式快取</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb
index 157d8ad..d10d6ce 100644
--- a/chrome/app/resources/google_chrome_strings_fa.xtb
+++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -42,7 +42,7 @@
 <translation id="2286950485307333924">‏اکنون در سیستم Chrome هستید</translation>
 <translation id="2290014774651636340">‏کلیدهای Google API وجود ندارد. برخی از عملکردهای Google Chrome از کار خواهد افتاد.</translation>
 <translation id="2290095356545025170">‏آیا می‌خواهید Google Chrome را غیر فعال کنید؟</translation>
-<translation id="2316129865977710310">نه سپاسگزارم</translation>
+<translation id="2316129865977710310">نه متشکرم</translation>
 <translation id="2334084861041072223">‏حق نسخه‌برداری ‪<ph name="YEAR" />‏ Google Inc.‬ کلیه حقوق محفوظ است.</translation>
 <translation id="2346876346033403680">‏شخصی قبلاً بعنوان <ph name="ACCOUNT_EMAIL_LAST" /> وارد Chrome در این رایانه شده است. اگر این حساب شما نیست، کاربر جدید Chrome را ایجاد کنید تا اطلاعات خود را جدا نگهدارید.
 
@@ -193,7 +193,7 @@
 <translation id="7436949144778751379">‏Google Chrome به Windows XP یا نسخه بالاتر آن نیاز دارد. برخی از ویژگی‌ها ممکن است کار نکند.</translation>
 <translation id="7459554271817304652">‏برای ذخیره ویژگی‌های مرورگر سفارشی شده خود در وب و دسترسی به آن‌ها از Google Chrome از هر رایانه دیگری، همگام‌سازی را راه‌اندازی کنید.</translation>
 <translation id="7473136999113284234">‏Chrome به صورت خودکار به‌روزرسانی می‌شود بنابراین همیشه جدیدترین نسخه را دارید.</translation>
-<translation id="7473891865547856676">نه سپاسگزارم</translation>
+<translation id="7473891865547856676">نه متشکرم</translation>
 <translation id="7494905215383356681">‏مجوزهای منبع باز Chrome</translation>
 <translation id="7592736734348559088">‏Google Chrome قادر به همگام‌سازی داده‌های شما نبود زیرا جزئیات ورود به حساب شما به‌روز نیست.</translation>
 <translation id="7626032353295482388">‏به Chrome خوش آمدید</translation>
diff --git a/chrome/app/resources/locale_settings.grd b/chrome/app/resources/locale_settings.grd
index d26d899..c71d1bb 100644
--- a/chrome/app/resources/locale_settings.grd
+++ b/chrome/app/resources/locale_settings.grd
@@ -307,6 +307,16 @@
           https://support.google.com/chromebook/answer/183084?hl=[GRITLANGCODE]
         </message>
       </if>
+
+      <!-- Links from the Clear Browsing Data dialog. -->
+      <message name="IDS_SETTINGS_CLEAR_DATA_LEARN_MORE_URL" translateable="false">
+        https://support.google.com/chrome/?p=settings_clear_browsing_data
+      </message>
+
+      <message name="IDS_SETTINGS_CLEAR_DATA_WEB_HISTORY_URL_IN_FOOTER" translateable="false">
+        https://history.google.com/history/?utm_source=chrome_cbd
+      </message>
+
     </messages>
   </release>
 </grit>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index c244874..37eb60d 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -1048,6 +1048,12 @@
   <message name="IDS_SETTINGS_CANCEL_BUTTON" desc="Text for the button which, when clicked, discards changes made to sync settings and navigates away from the sync settings page.">
     Cancel
   </message>
+  <message name="IDS_SETTINGS_PERSONALIZE_GOOGLE_SERVICES_TITLE" desc="Title of the personalize Google services section. When clicked, takes the user to the Google Activity Controls.">
+    Personalize Google services
+  </message>
+  <message name="IDS_SETTINGS_PERSONALIZE_GOOGLE_SERVICES_TEXT" desc="Text of the personalize Google services section. When clicked, takes the user to the Google Activity Controls.">
+    Control how your browsing history personalizes Search and other Google services
+  </message>
 
   <!-- Users Page -->
   <message name="IDS_SETTINGS_USERS" desc="Name of the settings page which manages users on the device.">
diff --git a/chrome/app/theme/default_100_percent/common/chat.png b/chrome/app/theme/default_100_percent/common/chat.png
deleted file mode 100644
index 6c5961e..0000000
--- a/chrome/app/theme/default_100_percent/common/chat.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/chat_hover.png b/chrome/app/theme/default_100_percent/common/chat_hover.png
deleted file mode 100644
index f9c83eb..0000000
--- a/chrome/app/theme/default_100_percent/common/chat_hover.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/chat_pressed.png b/chrome/app/theme/default_100_percent/common/chat_pressed.png
deleted file mode 100644
index fee6bdde..0000000
--- a/chrome/app/theme/default_100_percent/common/chat_pressed.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/mail.png b/chrome/app/theme/default_100_percent/common/mail.png
deleted file mode 100644
index 0db5f1d..0000000
--- a/chrome/app/theme/default_100_percent/common/mail.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/mail_hover.png b/chrome/app/theme/default_100_percent/common/mail_hover.png
deleted file mode 100644
index b778ba0..0000000
--- a/chrome/app/theme/default_100_percent/common/mail_hover.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_100_percent/common/mail_pressed.png b/chrome/app/theme/default_100_percent/common/mail_pressed.png
deleted file mode 100644
index 21b6161..0000000
--- a/chrome/app/theme/default_100_percent/common/mail_pressed.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/chat.png b/chrome/app/theme/default_200_percent/common/chat.png
deleted file mode 100644
index 4305b9f..0000000
--- a/chrome/app/theme/default_200_percent/common/chat.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/chat_hover.png b/chrome/app/theme/default_200_percent/common/chat_hover.png
deleted file mode 100644
index e643ec5..0000000
--- a/chrome/app/theme/default_200_percent/common/chat_hover.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/chat_pressed.png b/chrome/app/theme/default_200_percent/common/chat_pressed.png
deleted file mode 100644
index da902b1..0000000
--- a/chrome/app/theme/default_200_percent/common/chat_pressed.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/mail.png b/chrome/app/theme/default_200_percent/common/mail.png
deleted file mode 100644
index 5d9a348..0000000
--- a/chrome/app/theme/default_200_percent/common/mail.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/mail_hover.png b/chrome/app/theme/default_200_percent/common/mail_hover.png
deleted file mode 100644
index a81db90e..0000000
--- a/chrome/app/theme/default_200_percent/common/mail_hover.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/mail_pressed.png b/chrome/app/theme/default_200_percent/common/mail_pressed.png
deleted file mode 100644
index e5b8c42..0000000
--- a/chrome/app/theme/default_200_percent/common/mail_pressed.png
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/find_next_Template.pdf b/chrome/app/theme/find_next_Template.pdf
deleted file mode 100644
index e272fc9eef6..0000000
--- a/chrome/app/theme/find_next_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/find_prev_Template.pdf b/chrome/app/theme/find_prev_Template.pdf
deleted file mode 100644
index a9d41d6..0000000
--- a/chrome/app/theme/find_prev_Template.pdf
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/menu_overflow_down.pdf b/chrome/app/theme/menu_overflow_down.pdf
deleted file mode 100644
index a2082fc..0000000
--- a/chrome/app/theme/menu_overflow_down.pdf
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/menu_overflow_up.pdf b/chrome/app/theme/menu_overflow_up.pdf
deleted file mode 100644
index 2677757..0000000
--- a/chrome/app/theme/menu_overflow_up.pdf
+++ /dev/null
Binary files differ
diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resources.grd
index 94c321ad5..fe05705 100644
--- a/chrome/app/theme/theme_resources.grd
+++ b/chrome/app/theme/theme_resources.grd
@@ -942,16 +942,6 @@
         <structure type="chrome_scaled_image" name="IDR_ZOOM_PLUS" file="legacy/zoom_plus.png" />
         <structure type="chrome_scaled_image" name="IDR_ZOOM_NORMAL" file="legacy/zoom_reset.png" />
       </if>
-
-      <!-- People search images -->
-      <if expr="enable_app_list">
-        <structure type="chrome_scaled_image" name="IDR_PEOPLE_SEARCH_ACTION_EMAIL" file="common/mail.png" />
-        <structure type="chrome_scaled_image" name="IDR_PEOPLE_SEARCH_ACTION_EMAIL_HOVER" file="common/mail_hover.png" />
-        <structure type="chrome_scaled_image" name="IDR_PEOPLE_SEARCH_ACTION_EMAIL_PRESSED" file="common/mail_pressed.png" />
-        <structure type="chrome_scaled_image" name="IDR_PEOPLE_SEARCH_ACTION_CHAT" file="common/chat.png" />
-        <structure type="chrome_scaled_image" name="IDR_PEOPLE_SEARCH_ACTION_CHAT_HOVER" file="common/chat_hover.png" />
-        <structure type="chrome_scaled_image" name="IDR_PEOPLE_SEARCH_ACTION_CHAT_PRESSED" file="common/chat_pressed.png" />
-      </if>
     </structures>
   </release>
 </grit>
diff --git a/chrome/app_shim/BUILD.gn b/chrome/app_shim/BUILD.gn
index 74bca93..141bf72 100644
--- a/chrome/app_shim/BUILD.gn
+++ b/chrome/app_shim/BUILD.gn
@@ -2,6 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/mac/rules.gni")
+
 # This is the part of the shim process compiled into Chrome. It runs only
 # in the shim process, after the shim finds and loads the Chrome
 # Framework bundle.
@@ -15,3 +17,24 @@
     "//chrome/common:app_mode_app_support",
   ]
 }
+
+mac_app_bundle("app_mode_loader") {
+  extra_configs = [ "//build/config/compiler:wexit_time_destructors" ]
+
+  info_plist = "app_mode-Info.plist"
+
+  sources = [
+    "app_mode_loader_mac.mm",
+  ]
+
+  deps = [
+    "//chrome/common:app_mode_app_support",
+  ]
+
+  # TODO(rsesek): extra_substitutions = [ APP_MODE_APP_BUNDLE_ID ... ]
+
+  libs = [
+    "CoreFoundation.framework",
+    "Foundation.framework",
+  ]
+}
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 92157b9..214ae85 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -151,6 +151,7 @@
     "//components/ntp_snippets",
     "//components/ntp_tiles",
     "//components/offline_pages",
+    "//components/offline_pages/background:background_offliner",
     "//components/omnibox/browser",
     "//components/os_crypt",
     "//components/packed_ct_ev_whitelist",
@@ -598,8 +599,6 @@
     # These files are only built in a GN build because they bring in
     # dependencies that don't build with GYP.
     sources += [
-      "ui/ash/launcher/chrome_mash_shelf_controller.cc",
-      "ui/ash/launcher/chrome_mash_shelf_controller.h",
       "ui/views/frame/browser_frame_mus.cc",
       "ui/views/frame/browser_frame_mus.h",
       "ui/views/frame/browser_non_client_frame_view_mus.cc",
@@ -607,15 +606,9 @@
     ]
     deps += [
       "//components/mus/public/cpp",
-      "//components/prefs",
       "//content/public/common",
-      "//mash/shelf/public/interfaces",
-      "//services/shell/runner/common",
-      "//skia/public",
       "//ui/aura",
       "//ui/compositor",
-      "//ui/keyboard",
-      "//ui/keyboard:keyboard_with_content",
       "//ui/views/mus:for_component",
     ]
     defines += [ "MOJO_SHELL_CLIENT" ]
diff --git a/chrome/browser/OWNERS b/chrome/browser/OWNERS
index dad0bb1..b5c6cdd 100644
--- a/chrome/browser/OWNERS
+++ b/chrome/browser/OWNERS
@@ -2,10 +2,11 @@
 # usual OWNERS rules.
 per-file about_flags.cc=*
 
-per-file browser_resources.grd=achuith@chromium.org
 per-file browser_resources.grd=bauerb@chromium.org
 per-file browser_resources.grd=dbeam@chromium.org
+per-file browser_resources.grd=dpapad@chromium.org
 per-file browser_resources.grd=estade@chromium.org
+per-file browser_resources.grd=michaelpg@chromium.org
 per-file browser_resources.grd=pam@chromium.org
 per-file browser_resources.grd=xiyuan@chromium.org
 
@@ -50,9 +51,7 @@
 
 per-file media_router_resources.grdp*=apacible@chromium.org
 per-file media_router_resources.grdp*=imcheng@chromium.org
-per-file media_router_resources.grdp*=kmarshall@chromium.org
 per-file media_router_resources.grdp*=mfoltz@chromium.org
-per-file media_router_resources.grdp*=wez@chromium.org
 
 per-file shell_integration_win*=gab@chromium.org
 per-file shell_integration_win*=grt@chromium.org
diff --git a/chrome/browser/android/chrome_jni_registrar.cc b/chrome/browser/android/chrome_jni_registrar.cc
index cb5af8b..80c8a273 100644
--- a/chrome/browser/android/chrome_jni_registrar.cc
+++ b/chrome/browser/android/chrome_jni_registrar.cc
@@ -79,6 +79,7 @@
 #include "chrome/browser/android/rappor/rappor_service_bridge.h"
 #include "chrome/browser/android/recently_closed_tabs_bridge.h"
 #include "chrome/browser/android/rlz/revenue_stats.h"
+#include "chrome/browser/android/safe_browsing/safe_browsing_api_handler_bridge.h"
 #include "chrome/browser/android/sessions/session_tab_helper_android.h"
 #include "chrome/browser/android/shortcut_helper.h"
 #include "chrome/browser/android/signin/account_management_screen_helper.h"
@@ -353,6 +354,7 @@
     {"RemoteMediaPlayerBridge",
      remote_media::RemoteMediaPlayerBridge::RegisterRemoteMediaPlayerBridge},
     {"RevenueStats", RegisterRevenueStats},
+    {"SafeBrowsingApiBridge", safe_browsing::RegisterSafeBrowsingApiBridge},
     {"SavePasswordInfoBar", SavePasswordInfoBar::Register},
     {"SceneLayer", chrome::android::RegisterSceneLayer},
     {"ScreenshotTask", RegisterScreenshotTask},
diff --git a/chrome/browser/android/compositor/decoration_title.h b/chrome/browser/android/compositor/decoration_title.h
index 71fe6e8..12056ec 100644
--- a/chrome/browser/android/compositor/decoration_title.h
+++ b/chrome/browser/android/compositor/decoration_title.h
@@ -12,7 +12,6 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "cc/resources/ui_resource_client.h"
-#include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/transform.h"
 
diff --git a/chrome/browser/android/compositor/layer/crushed_sprite_layer.cc b/chrome/browser/android/compositor/layer/crushed_sprite_layer.cc
index e583ad7..5c3dae2 100644
--- a/chrome/browser/android/compositor/layer/crushed_sprite_layer.cc
+++ b/chrome/browser/android/compositor/layer/crushed_sprite_layer.cc
@@ -7,6 +7,7 @@
 #include "cc/layers/layer.h"
 #include "cc/layers/ui_resource_layer.h"
 #include "content/public/browser/android/compositor.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
 #include "ui/android/resources/crushed_sprite_resource.h"
 #include "ui/android/resources/resource_manager.h"
 #include "ui/gfx/canvas.h"
@@ -53,7 +54,7 @@
     SkBitmap bitmap;
     bitmap.allocN32Pixels(resource->GetUnscaledSpriteSize().width(),
                           resource->GetUnscaledSpriteSize().height());
-    skia::RefPtr<SkCanvas> canvas = skia::AdoptRef(new SkCanvas(bitmap));
+    sk_sp<SkCanvas> canvas = sk_make_sp<SkCanvas>(bitmap);
 
     if (previous_frame_ == -1 ||
         sprite_frame == resource->GetFrameCount() - 1) {
@@ -103,7 +104,7 @@
 void CrushedSpriteLayer::DrawRectanglesForFrame(
     ui::CrushedSpriteResource* resource,
     int frame,
-    skia::RefPtr<SkCanvas> canvas) {
+    sk_sp<SkCanvas> canvas) {
   ui::CrushedSpriteResource::FrameSrcDstRects src_dst_rects =
        resource->GetRectanglesForFrame(frame);
   for (const auto& rect : src_dst_rects) {
diff --git a/chrome/browser/android/compositor/layer/crushed_sprite_layer.h b/chrome/browser/android/compositor/layer/crushed_sprite_layer.h
index ea7676a..28a0d2e 100644
--- a/chrome/browser/android/compositor/layer/crushed_sprite_layer.h
+++ b/chrome/browser/android/compositor/layer/crushed_sprite_layer.h
@@ -7,6 +7,10 @@
 
 #include "base/macros.h"
 #include "chrome/browser/android/compositor/layer/layer.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
+
+class SkCanvas;
 
 namespace cc {
 class UIResourceLayer;
@@ -46,7 +50,7 @@
   // Draws the rectangles for |frame| to |canvas|.
   void DrawRectanglesForFrame(ui::CrushedSpriteResource* resource,
                               int frame,
-                              skia::RefPtr<SkCanvas> canvas);
+                              sk_sp<SkCanvas> canvas);
 
   scoped_refptr<cc::UIResourceLayer> layer_;
   int frame_count_;
diff --git a/chrome/browser/android/compositor/layer_title_cache.h b/chrome/browser/android/compositor/layer_title_cache.h
index 722924f6..9133ba89 100644
--- a/chrome/browser/android/compositor/layer_title_cache.h
+++ b/chrome/browser/android/compositor/layer_title_cache.h
@@ -13,7 +13,6 @@
 #include "base/id_map.h"
 #include "base/macros.h"
 #include "cc/resources/ui_resource_client.h"
-#include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/transform.h"
 
diff --git a/chrome/browser/android/data_usage/external_data_use_observer_bridge.cc b/chrome/browser/android/data_usage/external_data_use_observer_bridge.cc
index 04e6807..a91566e2 100644
--- a/chrome/browser/android/data_usage/external_data_use_observer_bridge.cc
+++ b/chrome/browser/android/data_usage/external_data_use_observer_bridge.cc
@@ -78,7 +78,7 @@
       reinterpret_cast<intptr_t>(this)));
   DCHECK(!j_external_data_use_observer_.is_null());
 
-  Java_ExternalDataUseObserver_setControlAppPackageName(
+  Java_ExternalDataUseObserver_initControlAppManager(
       env, j_external_data_use_observer_.obj(),
       ConvertUTF8ToJavaString(env, GetControlAppPackageName()).obj());
 }
diff --git a/chrome/browser/android/logo_service.h b/chrome/browser/android/logo_service.h
index de9f551..ffb0459 100644
--- a/chrome/browser/android/logo_service.h
+++ b/chrome/browser/android/logo_service.h
@@ -10,7 +10,6 @@
 #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/search_provider_logos/logo_tracker.h"
-#include "third_party/skia/include/core/SkBitmap.h"
 
 class Profile;
 
diff --git a/chrome/browser/android/ntp/most_visited_sites.cc b/chrome/browser/android/ntp/most_visited_sites.cc
index ac625b2a..3c8c78f 100644
--- a/chrome/browser/android/ntp/most_visited_sites.cc
+++ b/chrome/browser/android/ntp/most_visited_sites.cc
@@ -177,8 +177,11 @@
 MostVisitedSites::Suggestion&
 MostVisitedSites::Suggestion::operator=(Suggestion&&) = default;
 
-MostVisitedSites::MostVisitedSites(Profile* profile)
-    : profile_(profile), top_sites_(TopSitesFactory::GetForProfile(profile)),
+MostVisitedSites::MostVisitedSites(
+    Profile* profile,
+    variations::VariationsService* variations_service)
+    : profile_(profile), variations_service_(variations_service),
+      top_sites_(TopSitesFactory::GetForProfile(profile)),
       suggestions_service_(SuggestionsServiceFactory::GetForProfile(profile_)),
       observer_(nullptr), num_sites_(0),
       received_most_visited_sites_(false), received_popular_sites_(false),
@@ -209,6 +212,7 @@
     popular_sites_.reset(new PopularSites(
         profile_->GetPrefs(),
         TemplateURLServiceFactory::GetForProfile(profile_),
+        variations_service_,
         profile_->GetRequestContext(),
         GetPopularSitesCountry(),
         GetPopularSitesVersion(),
diff --git a/chrome/browser/android/ntp/most_visited_sites.h b/chrome/browser/android/ntp/most_visited_sites.h
index 86b0927..f34ebe4c 100644
--- a/chrome/browser/android/ntp/most_visited_sites.h
+++ b/chrome/browser/android/ntp/most_visited_sites.h
@@ -33,8 +33,9 @@
 class PrefRegistrySyncable;
 }
 
-class PopularSites;
-class Profile;
+namespace variations {
+class VariationsService;
+}
 
 // Tracks the list of most visited sites and their thumbnails.
 //
@@ -85,7 +86,8 @@
     DISALLOW_COPY_AND_ASSIGN(Suggestion);
   };
 
-  explicit MostVisitedSites(Profile* profile);
+  MostVisitedSites(Profile* profile,
+                   variations::VariationsService* variations_service);
 
   ~MostVisitedSites() override;
 
@@ -212,6 +214,7 @@
   // The profile whose most visited sites will be queried.
   Profile* profile_;
 
+  variations::VariationsService* variations_service_;
   scoped_refptr<history::TopSites> top_sites_;
   suggestions::SuggestionsService* suggestions_service_;
 
diff --git a/chrome/browser/android/ntp/most_visited_sites_bridge.cc b/chrome/browser/android/ntp/most_visited_sites_bridge.cc
index 44b5a62f..75f6a24 100644
--- a/chrome/browser/android/ntp/most_visited_sites_bridge.cc
+++ b/chrome/browser/android/ntp/most_visited_sites_bridge.cc
@@ -13,6 +13,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "chrome/browser/android/ntp/popular_sites.h"
+#include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile_android.h"
 #include "jni/MostVisitedSites_jni.h"
 #include "ui/gfx/android/java_bitmap.h"
@@ -99,7 +100,8 @@
 }
 
 MostVisitedSitesBridge::MostVisitedSitesBridge(Profile* profile)
-    : most_visited_(profile) {}
+    : most_visited_(profile,
+                    g_browser_process->variations_service()) {}
 
 MostVisitedSitesBridge::~MostVisitedSitesBridge() {}
 
diff --git a/chrome/browser/android/ntp/popular_sites.cc b/chrome/browser/android/ntp/popular_sites.cc
index a434991..293de40 100644
--- a/chrome/browser/android/ntp/popular_sites.cc
+++ b/chrome/browser/android/ntp/popular_sites.cc
@@ -17,7 +17,6 @@
 #include "base/task_runner_util.h"
 #include "base/time/time.h"
 #include "base/values.h"
-#include "chrome/browser/browser_process.h"
 #include "chrome/common/chrome_paths.h"
 #include "components/google/core/browser/google_util.h"
 #include "components/ntp_tiles/switches.h"
@@ -30,6 +29,7 @@
 #include "content/public/browser/browser_thread.h"
 
 using content::BrowserThread;
+using variations::VariationsService;
 
 namespace {
 
@@ -75,21 +75,12 @@
   return std::string();
 }
 
-// Get the country that the experiment is running under
-std::string GetVariationsServiceCountry() {
-  DCHECK(g_browser_process);
-  variations::VariationsService* variations_service =
-      g_browser_process->variations_service();
-  if (variations_service)
-    return variations_service->GetStoredPermanentCountry();
-  return std::string();
-}
-
 // Find out the country code of the user by using the Google country code if
 // Google is the default search engine set. If Google is not the default search
 // engine use the country provided by VariationsService. Fallback to a default
 // if we can't make an educated guess.
 std::string GetCountryToUse(const TemplateURLService* template_url_service,
+                            VariationsService* variations_service,
                             const std::string& override_country) {
   if (!override_country.empty())
     return override_country;
@@ -97,8 +88,9 @@
   std::string country_code = GetDefaultSearchEngineCountryCode(
       template_url_service);
 
-  if (country_code.empty())
-    country_code = GetVariationsServiceCountry();
+  // Get the country that the experiment is running under
+  if (country_code.empty() && variations_service)
+    country_code = variations_service->GetStoredPermanentCountry();
 
   if (country_code.empty())
     country_code = kPopularSitesDefaultCountryCode;
@@ -178,6 +170,7 @@
 
 PopularSites::PopularSites(PrefService* prefs,
                            const TemplateURLService* template_url_service,
+                           VariationsService* variations_service,
                            net::URLRequestContextGetter* download_context,
                            const std::string& override_country,
                            const std::string& override_version,
@@ -186,7 +179,9 @@
     : PopularSites(prefs,
                    template_url_service,
                    download_context,
-                   GetCountryToUse(template_url_service, override_country),
+                   GetCountryToUse(template_url_service,
+                                   variations_service,
+                                   override_country),
                    GetVersionToUse(override_version),
                    GURL(),
                    force_download,
diff --git a/chrome/browser/android/ntp/popular_sites.h b/chrome/browser/android/ntp/popular_sites.h
index 41523c5b..1e81b81 100644
--- a/chrome/browser/android/ntp/popular_sites.h
+++ b/chrome/browser/android/ntp/popular_sites.h
@@ -25,6 +25,10 @@
 class PrefRegistrySyncable;
 }
 
+namespace variations {
+class VariationsService;
+}
+
 class PrefService;
 class TemplateURLService;
 
@@ -59,6 +63,7 @@
   // if it already exists on disk.
   PopularSites(PrefService* prefs,
                const TemplateURLService* template_url_service,
+               variations::VariationsService* variations_service,
                net::URLRequestContextGetter* download_context,
                const std::string& override_country,
                const std::string& override_version,
diff --git a/chrome/browser/android/offline_pages/offline_page_bridge.cc b/chrome/browser/android/offline_pages/offline_page_bridge.cc
index ded2d9c8..830d91d 100644
--- a/chrome/browser/android/offline_pages/offline_page_bridge.cc
+++ b/chrome/browser/android/offline_pages/offline_page_bridge.cc
@@ -68,9 +68,10 @@
       env, j_callback_obj.obj(), j_result_array.obj());
 }
 
-void GetAllPagesCallback(const ScopedJavaGlobalRef<jobject>& j_result_obj,
-                         const ScopedJavaGlobalRef<jobject>& j_callback_obj,
-                         const OfflinePageModel::GetAllPagesResult& result) {
+void GetAllPagesCallback(
+    const ScopedJavaGlobalRef<jobject>& j_result_obj,
+    const ScopedJavaGlobalRef<jobject>& j_callback_obj,
+    const OfflinePageModel::MultipleOfflinePageItemResult& result) {
   JNIEnv* env = base::android::AttachCurrentThread();
   ToJavaOfflinePageList(env, j_result_obj.obj(), result);
 
@@ -246,7 +247,7 @@
   client_id.id = ConvertJavaStringToUTF8(env, j_client_id);
 
   std::vector<int64_t> results =
-      offline_page_model_->GetOfflineIdsForClientId(client_id);
+      offline_page_model_->MaybeGetOfflineIdsForClientId(client_id);
 
   return base::android::ToJavaLongArray(env, results);
 }
@@ -256,7 +257,7 @@
     const JavaParamRef<jobject>& obj,
     jlong offline_id) {
   const OfflinePageItem* offline_page =
-      offline_page_model_->GetPageByOfflineId(offline_id);
+      offline_page_model_->MaybeGetPageByOfflineId(offline_id);
   if (!offline_page)
     return ScopedJavaLocalRef<jobject>();
   return CreateOfflinePageItem(env, *offline_page);
@@ -266,8 +267,9 @@
     JNIEnv* env,
     const JavaParamRef<jobject>& obj,
     const JavaParamRef<jstring>& online_url) {
-  const OfflinePageItem* offline_page = offline_page_model_->GetPageByOnlineURL(
-      GURL(ConvertJavaStringToUTF8(env, online_url)));
+  const OfflinePageItem* offline_page =
+      offline_page_model_->MaybeGetPageByOnlineURL(
+          GURL(ConvertJavaStringToUTF8(env, online_url)));
   if (!offline_page)
     return ScopedJavaLocalRef<jobject>();
   return CreateOfflinePageItem(env, *offline_page);
@@ -278,7 +280,7 @@
     const JavaParamRef<jobject>& obj,
     const JavaParamRef<jstring>& j_offline_url) {
   const OfflinePageItem* offline_page =
-      offline_page_model_->GetPageByOfflineURL(
+      offline_page_model_->MaybeGetPageByOfflineURL(
           GURL(ConvertJavaStringToUTF8(env, j_offline_url)));
   if (!offline_page)
     return ScopedJavaLocalRef<jobject>();
diff --git a/chrome/browser/android/offline_pages/offline_page_tab_helper_unittest.cc b/chrome/browser/android/offline_pages/offline_page_tab_helper_unittest.cc
index ccf12738..9248617 100644
--- a/chrome/browser/android/offline_pages/offline_page_tab_helper_unittest.cc
+++ b/chrome/browser/android/offline_pages/offline_page_tab_helper_unittest.cc
@@ -184,7 +184,7 @@
 
   OfflinePageModel* model =
       OfflinePageModelFactory::GetForBrowserContext(browser_context());
-  const OfflinePageItem* page = model->GetPageByOfflineId(offline_id());
+  const OfflinePageItem* page = model->MaybeGetPageByOfflineId(offline_id());
   GURL offline_url = page->GetOfflineURL();
   GURL online_url = page->url;
 
@@ -198,7 +198,7 @@
 
   OfflinePageModel* model =
       OfflinePageModelFactory::GetForBrowserContext(browser_context());
-  const OfflinePageItem* page = model->GetPageByOfflineId(offline_id());
+  const OfflinePageItem* page = model->MaybeGetPageByOfflineId(offline_id());
   GURL offline_url = page->GetOfflineURL();
   GURL online_url = page->url;
 
diff --git a/chrome/browser/android/offline_pages/offline_page_utils.cc b/chrome/browser/android/offline_pages/offline_page_utils.cc
index 8763619..cd2f8e0 100644
--- a/chrome/browser/android/offline_pages/offline_page_utils.cc
+++ b/chrome/browser/android/offline_pages/offline_page_utils.cc
@@ -33,7 +33,7 @@
   if (!offline_page_model)
     return nullptr;
 
-  return offline_page_model->GetPageByOnlineURL(online_url);
+  return offline_page_model->MaybeGetPageByOnlineURL(online_url);
 }
 
 // Returns an offline page that is stored as the |offline_url|.
@@ -57,7 +57,7 @@
   if (!offline_page_model)
     return nullptr;
 
-  return offline_page_model->GetPageByOfflineURL(offline_url);
+  return offline_page_model->MaybeGetPageByOfflineURL(offline_url);
 }
 
 }  // namespace
diff --git a/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc b/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc
index 3f96ae69..c1021548 100644
--- a/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc
+++ b/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc
@@ -158,8 +158,10 @@
   int64_t offline2 = offline_id();
 
   // Make a copy of local paths of the two pages stored in the model.
-  offline_url_page_1_ = model->GetPageByOfflineId(offline1)->GetOfflineURL();
-  offline_url_page_2_ = model->GetPageByOfflineId(offline2)->GetOfflineURL();
+  offline_url_page_1_ =
+      model->MaybeGetPageByOfflineId(offline1)->GetOfflineURL();
+  offline_url_page_2_ =
+      model->MaybeGetPageByOfflineId(offline2)->GetOfflineURL();
   // Create a file path that is not associated with any offline page.
   offline_url_missing_ = net::FilePathToFileURL(
       profile()
diff --git a/chrome/browser/android/preferences/pref_service_bridge.cc b/chrome/browser/android/preferences/pref_service_bridge.cc
index d691661..f0303b2 100644
--- a/chrome/browser/android/preferences/pref_service_bridge.cc
+++ b/chrome/browser/android/preferences/pref_service_bridge.cc
@@ -208,6 +208,11 @@
   return IsContentSettingManaged(CONTENT_SETTINGS_TYPE_COOKIES);
 }
 
+static jboolean GetAutoplayEnabled(JNIEnv* env,
+                                   const JavaParamRef<jobject>& obj) {
+  return GetBooleanForContentSetting(CONTENT_SETTINGS_TYPE_AUTOPLAY);
+}
+
 static jboolean GetBackgroundSyncEnabled(JNIEnv* env,
                                          const JavaParamRef<jobject>& obj) {
   return GetBooleanForContentSetting(CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC);
@@ -675,6 +680,16 @@
                  base::Owned(new ScopedJavaGlobalRef<jobject>(env, listener))));
 }
 
+static void SetAutoplayEnabled(JNIEnv* env,
+                               const JavaParamRef<jobject>& obj,
+                               jboolean allow) {
+  HostContentSettingsMap* host_content_settings_map =
+      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
+  host_content_settings_map->SetDefaultContentSetting(
+      CONTENT_SETTINGS_TYPE_AUTOPLAY,
+      allow ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK);
+}
+
 static void SetAllowCookiesEnabled(JNIEnv* env,
                                    const JavaParamRef<jobject>& obj,
                                    jboolean allow) {
diff --git a/chrome/browser/android/safe_browsing/safe_browsing_api_handler_bridge.cc b/chrome/browser/android/safe_browsing/safe_browsing_api_handler_bridge.cc
new file mode 100644
index 0000000..a279b52
--- /dev/null
+++ b/chrome/browser/android/safe_browsing/safe_browsing_api_handler_bridge.cc
@@ -0,0 +1,199 @@
+// Copyright 2016 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/android/safe_browsing/safe_browsing_api_handler_bridge.h"
+
+#include <memory>
+#include <string>
+
+#include "base/android/context_utils.h"
+#include "base/android/jni_android.h"
+#include "base/android/jni_array.h"
+#include "base/android/jni_string.h"
+#include "base/metrics/histogram_macros.h"
+#include "chrome/browser/safe_browsing/safe_browsing_util.h"
+#include "components/safe_browsing_db/safe_browsing_api_handler_util.h"
+#include "content/public/browser/browser_thread.h"
+#include "jni/SafeBrowsingApiBridge_jni.h"
+
+using base::android::AttachCurrentThread;
+using base::android::ConvertJavaStringToUTF8;
+using base::android::ConvertUTF8ToJavaString;
+using base::android::GetApplicationContext;
+using base::android::ScopedJavaLocalRef;
+using base::android::ToJavaIntArray;
+using content::BrowserThread;
+
+namespace safe_browsing {
+
+namespace {
+// Takes ownership of callback ptr.
+void RunCallbackOnIOThread(
+    SafeBrowsingApiHandler::URLCheckCallbackMeta* callback,
+    SBThreatType threat_type,
+    const ThreatMetadata& metadata) {
+  BrowserThread::PostTask(
+      BrowserThread::IO, FROM_HERE,
+      base::Bind(&SafeBrowsingApiHandler::URLCheckCallbackMeta::Run,
+                 base::Owned(callback), threat_type, metadata));
+}
+
+void ReportUmaResult(safe_browsing::UmaRemoteCallResult result) {
+  UMA_HISTOGRAM_ENUMERATION("SB2.RemoteCall.Result", result,
+                            safe_browsing::UMA_STATUS_MAX_VALUE);
+}
+
+// Convert a SBThreatType to a Java threat type.  We only support a few.
+int SBThreatTypeToJavaThreatType(const SBThreatType& sb_threat_type) {
+  switch (sb_threat_type) {
+    case SB_THREAT_TYPE_URL_PHISHING:
+      return safe_browsing::JAVA_THREAT_TYPE_SOCIAL_ENGINEERING;
+    case SB_THREAT_TYPE_URL_MALWARE:
+      return safe_browsing::JAVA_THREAT_TYPE_POTENTIALLY_HARMFUL_APPLICATION;
+    default:
+      NOTREACHED();
+      return 0;
+  }
+}
+
+// Convert a vector of SBThreatTypes to JavaIntArray of Java threat types.
+ScopedJavaLocalRef<jintArray> SBThreatTypesToJavaArray(
+    JNIEnv* env,
+    const std::vector<SBThreatType>& threat_types) {
+  DCHECK(threat_types.size() > 0);
+  int int_threat_types[threat_types.size()];
+  int* itr = &int_threat_types[0];
+  for (auto threat_type : threat_types) {
+    *itr++ = SBThreatTypeToJavaThreatType(threat_type);
+  }
+  return ToJavaIntArray(env, int_threat_types, threat_types.size());
+}
+
+}  // namespace
+
+
+bool RegisterSafeBrowsingApiBridge(JNIEnv* env) {
+  return RegisterNativesImpl(env);
+}
+
+// Java->Native call, invoked when a check is done.
+//   |callback_id| is an int form of pointer to a URLCheckCallbackMeta
+//                 that will be called and then deleted here.
+//   |result_status| is one of those from SafeBrowsingApiHandler.java
+//   |metadata| is a JSON string classifying the threat if there is one.
+void OnUrlCheckDone(JNIEnv* env,
+                    const JavaParamRef<jclass>& context,
+                    jlong callback_id,
+                    jint result_status,
+                    const JavaParamRef<jstring>& metadata) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(callback_id);
+
+  const std::string metadata_str =
+      (metadata ? ConvertJavaStringToUTF8(env, metadata) : "");
+
+  DVLOG(1) << "OnURLCheckDone invoked for check " << callback_id
+           << " with status=" << result_status << " and metadata=["
+           << metadata_str << "]";
+
+  // Convert java long long int to c++ pointer, take ownership.
+  std::unique_ptr<SafeBrowsingApiHandler::URLCheckCallbackMeta> callback(
+      reinterpret_cast<SafeBrowsingApiHandlerBridge::URLCheckCallbackMeta*>(
+          callback_id));
+
+  if (result_status != RESULT_STATUS_SUCCESS) {
+    // TODO(nparker): If the API is consistently failing, we might want to
+    // turn it off altogether and retest periodically. This would
+    // alleviate a bad experience if GMSCore is somehow busted.
+    if (result_status == RESULT_STATUS_TIMEOUT) {
+      ReportUmaResult(UMA_STATUS_TIMEOUT);
+      VLOG(1) << "Safe browsing API call timed-out";
+    } else {
+      DCHECK_EQ(result_status, RESULT_STATUS_INTERNAL_ERROR);
+      ReportUmaResult(UMA_STATUS_INTERNAL_ERROR);
+      LOG(WARNING) << "Safe browsing API had internal error";
+    }
+    RunCallbackOnIOThread(callback.release(), SB_THREAT_TYPE_SAFE,
+                          ThreatMetadata());
+    return;
+  }
+
+  // Shortcut for safe, so we don't have to parse JSON.
+  if (metadata_str == "{}") {
+    ReportUmaResult(UMA_STATUS_SAFE);
+    RunCallbackOnIOThread(callback.release(), SB_THREAT_TYPE_SAFE,
+                          ThreatMetadata());
+  } else {
+    // Unsafe, assuming we can parse the JSON.
+    SBThreatType worst_threat;
+    ThreatMetadata threat_metadata;
+    ReportUmaResult(
+        ParseJsonFromGMSCore(metadata_str, &worst_threat, &threat_metadata));
+    if (worst_threat != SB_THREAT_TYPE_SAFE) {
+      DVLOG(1) << "Check " << callback_id << " marked as UNSAFE";
+    }
+
+    RunCallbackOnIOThread(callback.release(), worst_threat, threat_metadata);
+  }
+}
+
+//
+// SafeBrowsingApiHandlerBridge
+//
+SafeBrowsingApiHandlerBridge::SafeBrowsingApiHandlerBridge()
+    : checked_api_support_(false) {}
+
+SafeBrowsingApiHandlerBridge::~SafeBrowsingApiHandlerBridge() {
+}
+
+bool SafeBrowsingApiHandlerBridge::CheckApiIsSupported() {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  if (!checked_api_support_) {
+    DVLOG(1) << "Checking API support.";
+    j_api_handler_ = Java_SafeBrowsingApiBridge_create(
+        AttachCurrentThread(), GetApplicationContext());
+    checked_api_support_ = true;
+  }
+  return j_api_handler_.obj() != nullptr;
+}
+
+void SafeBrowsingApiHandlerBridge::StartURLCheck(
+    const SafeBrowsingApiHandler::URLCheckCallbackMeta& callback,
+    const GURL& url,
+    const std::vector<SBThreatType>& threat_types) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+  if (!CheckApiIsSupported()) {
+    // Mark all requests as safe. Only users who have an old, broken GMSCore or
+    // have sideloaded Chrome w/o PlayStore should land here.
+    RunCallbackOnIOThread(new URLCheckCallbackMeta(callback),
+                          SB_THREAT_TYPE_SAFE, ThreatMetadata());
+    ReportUmaResult(UMA_STATUS_UNSUPPORTED);
+    return;
+  }
+
+  // Make copy on the heap so we can pass the pointer through JNI.
+  intptr_t callback_id =
+      reinterpret_cast<intptr_t>(new URLCheckCallbackMeta(callback));
+
+  DVLOG(1) << "Starting check " << callback_id << " for URL " << url;
+
+  // Default threat types, to support upstream code that doesn't yet set them.
+  std::vector<SBThreatType> local_threat_types(threat_types);
+  if (local_threat_types.empty()) {
+    local_threat_types.push_back(SB_THREAT_TYPE_URL_PHISHING);
+    local_threat_types.push_back(SB_THREAT_TYPE_URL_MALWARE);
+  }
+
+  JNIEnv* env = AttachCurrentThread();
+  ScopedJavaLocalRef<jstring> j_url = ConvertUTF8ToJavaString(env, url.spec());
+  ScopedJavaLocalRef<jintArray> j_threat_types =
+      SBThreatTypesToJavaArray(env, local_threat_types);
+
+  Java_SafeBrowsingApiBridge_startUriLookup(env, j_api_handler_.obj(),
+                                             callback_id, j_url.obj(),
+                                             j_threat_types.obj());
+}
+
+}  // namespace safe_browsing
diff --git a/chrome/browser/android/safe_browsing/safe_browsing_api_handler_bridge.h b/chrome/browser/android/safe_browsing/safe_browsing_api_handler_bridge.h
new file mode 100644
index 0000000..ce5f0c58
--- /dev/null
+++ b/chrome/browser/android/safe_browsing/safe_browsing_api_handler_bridge.h
@@ -0,0 +1,48 @@
+// Copyright 2016 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.
+//
+// Glue to pass Safe Browsing API requests between Chrome and GMSCore
+
+#ifndef CHROME_BROWSER_ANDROID_SAFE_BROWSING_SAFE_BROWSING_API_HANDLER_BRIDGE_H_
+#define CHROME_BROWSER_ANDROID_SAFE_BROWSING_SAFE_BROWSING_API_HANDLER_BRIDGE_H_
+
+#include <jni.h>
+
+#include <string>
+#include <vector>
+
+#include "base/android/jni_android.h"
+#include "base/macros.h"
+#include "components/safe_browsing_db/safe_browsing_api_handler.h"
+#include "url/gurl.h"
+
+namespace safe_browsing {
+bool RegisterSafeBrowsingApiBridge(JNIEnv* env);
+
+class SafeBrowsingApiHandlerBridge : public SafeBrowsingApiHandler {
+ public:
+  SafeBrowsingApiHandlerBridge();
+  ~SafeBrowsingApiHandlerBridge() override;
+
+  // Makes Native->Java call to check the URL against Safe Browsing lists.
+  void StartURLCheck(const URLCheckCallbackMeta& callback,
+                     const GURL& url,
+                     const std::vector<SBThreatType>& threat_types) override;
+
+ private:
+  // Creates the j_api_handler_ if it hasn't been already.  If the API is not
+  // supported, this will return false and j_api_handler_ will remain NULL.
+  bool CheckApiIsSupported();
+
+  // The Java-side SafeBrowsingApiHandler. Must call CheckApiIsSupported first.
+  base::android::ScopedJavaLocalRef<jobject> j_api_handler_;
+
+  // True if we've once tried to create the above object.
+  bool checked_api_support_;
+
+  DISALLOW_COPY_AND_ASSIGN(SafeBrowsingApiHandlerBridge);
+};
+
+}  // namespace safe_browsing
+#endif  // CHROME_BROWSER_ANDROID_SAFE_BROWSING_SAFE_BROWSING_API_HANDLER_BRIDGE_H_
diff --git a/chrome/browser/bitmap_fetcher/bitmap_fetcher.h b/chrome/browser/bitmap_fetcher/bitmap_fetcher.h
index 38542767..f6058cf0 100644
--- a/chrome/browser/bitmap_fetcher/bitmap_fetcher.h
+++ b/chrome/browser/bitmap_fetcher/bitmap_fetcher.h
@@ -12,9 +12,10 @@
 #include "chrome/browser/image_decoder.h"
 #include "net/url_request/url_fetcher_delegate.h"
 #include "net/url_request/url_request.h"
-#include "third_party/skia/include/core/SkBitmap.h"
 #include "url/gurl.h"
 
+class SkBitmap;
+
 namespace net {
 class URLFetcher;
 class URLRequestContextGetter;
diff --git a/chrome/browser/bitmap_fetcher/bitmap_fetcher_service_unittest.cc b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service_unittest.cc
index 74c1906b..87f566a 100644
--- a/chrome/browser/bitmap_fetcher/bitmap_fetcher_service_unittest.cc
+++ b/chrome/browser/bitmap_fetcher/bitmap_fetcher_service_unittest.cc
@@ -12,6 +12,7 @@
 #include "chrome/test/base/testing_profile.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/skia/include/core/SkBitmap.h"
 
 namespace {
 
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index 8735ed4..974cc32b 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -404,10 +404,8 @@
         <include name="IDR_USER_MANAGER_HTML" file="resources\user_manager\user_manager.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
       </if>
       <if expr="not is_android and not is_ios and not chromeos">
-        <include name="IDR_MD_CONTROL_BAR_CSS" file="resources\md_user_manager\control_bar.css" flattenhtml="true" type="BINDATA" />
         <include name="IDR_MD_CONTROL_BAR_HTML" file="resources\md_user_manager\control_bar.html" flattenhtml="true" type="BINDATA" />
         <include name="IDR_MD_CONTROL_BAR_JS" file="resources\md_user_manager\control_bar.js" type="BINDATA" />
-        <include name="IDR_MD_CREATE_PROFILE_CSS" file="resources\md_user_manager\create_profile.css" flattenhtml="true" type="BINDATA" />
         <include name="IDR_MD_CREATE_PROFILE_HTML" file="resources\md_user_manager\create_profile.html" flattenhtml="true" type="BINDATA" />
         <include name="IDR_MD_CREATE_PROFILE_JS" file="resources\md_user_manager\create_profile.js" type="BINDATA" />
         <include name="IDR_MD_IMPORT_SUPERVISED_USER_HTML" file="resources\md_user_manager\import_supervised_user.html" flattenhtml="true" type="BINDATA" />
@@ -416,18 +414,15 @@
         <include name="IDR_MD_PROFILE_BROWSER_PROXY_JS" file="resources\md_user_manager\profile_browser_proxy.js" type="BINDATA" />
         <include name="IDR_MD_SUPERVISED_USER_CREATE_CONFIRM_HTML" file="resources\md_user_manager\supervised_user_create_confirm.html" flattenhtml="true" type="BINDATA" />
         <include name="IDR_MD_SUPERVISED_USER_CREATE_CONFIRM_JS" file="resources\md_user_manager\supervised_user_create_confirm.js" type="BINDATA" />
-        <include name="IDR_MD_SUPERVISED_USER_LEARN_MORE_CSS" file="resources\md_user_manager\supervised_user_learn_more.css" flattenhtml="true" type="BINDATA" />
         <include name="IDR_MD_SUPERVISED_USER_LEARN_MORE_HTML" file="resources\md_user_manager\supervised_user_learn_more.html" flattenhtml="true" type="BINDATA" />
         <include name="IDR_MD_SUPERVISED_USER_LEARN_MORE_JS" file="resources\md_user_manager\supervised_user_learn_more.js" type="BINDATA" />
         <include name="IDR_MD_USER_MANAGER_HTML" file="resources\md_user_manager\user_manager.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
         <include name="IDR_MD_USER_MANAGER_JS" file="resources\md_user_manager\user_manager.js" flattenhtml="true" type="BINDATA" />
-        <include name="IDR_MD_USER_MANAGER_PAGES_CSS" file="resources\md_user_manager\user_manager_pages.css" flattenhtml="true" type="BINDATA" />
         <include name="IDR_MD_USER_MANAGER_PAGES_HTML" file="resources\md_user_manager\user_manager_pages.html" flattenhtml="true" type="BINDATA" />
         <include name="IDR_MD_USER_MANAGER_PAGES_JS" file="resources\md_user_manager\user_manager_pages.js" type="BINDATA" />
         <include name="IDR_MD_USER_MANAGER_SHARED_STYLES_HTML" file="resources\md_user_manager\shared_styles.html" flattenhtml="true" type="BINDATA" />
         <include name="IDR_MD_USER_MANAGER_STRINGS_HTML" file="resources\md_user_manager\strings.html" flattenhtml="true" type="BINDATA" />
         <include name="IDR_MD_USER_MANAGER_STYLES_HTML" file="resources\md_user_manager\user_manager_styles.html" flattenhtml="true" type="BINDATA" />
-        <include name="IDR_MD_USER_MANAGER_TUTORIAL_CSS" file="resources\md_user_manager\user_manager_tutorial.css" flattenhtml="true" type="BINDATA" />
         <include name="IDR_MD_USER_MANAGER_TUTORIAL_HTML" file="resources\md_user_manager\user_manager_tutorial.html" flattenhtml="true" type="BINDATA" />
         <include name="IDR_MD_USER_MANAGER_TUTORIAL_JS" file="resources\md_user_manager\user_manager_tutorial.js" type="BINDATA" />
       </if>
diff --git a/chrome/browser/browsing_data/browsing_data_filter_builder.h b/chrome/browser/browsing_data/browsing_data_filter_builder.h
index 74b2149..a3141dd 100644
--- a/chrome/browser/browsing_data/browsing_data_filter_builder.h
+++ b/chrome/browser/browsing_data/browsing_data_filter_builder.h
@@ -62,6 +62,11 @@
   virtual base::Callback<bool(const net::CanonicalCookie& pattern)>
       BuildCookieFilter() const = 0;
 
+  // Builds a filter that matches channel IDs whose server identifiers are in
+  // the whitelist, or aren't in the blacklist.
+  virtual base::Callback<bool(const std::string& server_id)>
+      BuildChannelIDFilter() const = 0;
+
   // A convenience method to produce an empty blacklist, a filter that matches
   // everything.
   static base::Callback<bool(const GURL&)> BuildNoopFilter();
diff --git a/chrome/browser/browsing_data/browsing_data_helper_unittest.cc b/chrome/browser/browsing_data/browsing_data_helper_unittest.cc
index 401bb32..2d4eb08 100644
--- a/chrome/browser/browsing_data/browsing_data_helper_unittest.cc
+++ b/chrome/browser/browsing_data/browsing_data_helper_unittest.cc
@@ -79,8 +79,6 @@
   EXPECT_FALSE(IsWebScheme(content::kChromeUIScheme));
   EXPECT_FALSE(IsWebScheme(url::kJavaScriptScheme));
   EXPECT_FALSE(IsWebScheme(url::kMailToScheme));
-  EXPECT_FALSE(IsWebScheme(content::kMetadataScheme));
-  EXPECT_FALSE(IsWebScheme(content::kSwappedOutScheme));
   EXPECT_FALSE(IsWebScheme(content::kViewSourceScheme));
 }
 
@@ -103,8 +101,6 @@
   EXPECT_FALSE(IsExtensionScheme(content::kChromeUIScheme));
   EXPECT_FALSE(IsExtensionScheme(url::kJavaScriptScheme));
   EXPECT_FALSE(IsExtensionScheme(url::kMailToScheme));
-  EXPECT_FALSE(IsExtensionScheme(content::kMetadataScheme));
-  EXPECT_FALSE(IsExtensionScheme(content::kSwappedOutScheme));
   EXPECT_FALSE(IsExtensionScheme(content::kViewSourceScheme));
 }
 
diff --git a/chrome/browser/browsing_data/browsing_data_remover.cc b/chrome/browser/browsing_data/browsing_data_remover.cc
index 05e0c2e..e7d98cd 100644
--- a/chrome/browser/browsing_data/browsing_data_remover.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover.cc
@@ -247,6 +247,7 @@
 }
 
 void ClearChannelIDsOnIOThread(
+    const base::Callback<bool(const std::string&)>& domain_predicate,
     base::Time delete_begin,
     base::Time delete_end,
     scoped_refptr<net::URLRequestContextGetter> rq_context,
@@ -254,8 +255,8 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   net::ChannelIDService* channel_id_service =
       rq_context->GetURLRequestContext()->channel_id_service();
-  channel_id_service->GetChannelIDStore()->DeleteAllCreatedBetween(
-      delete_begin, delete_end,
+  channel_id_service->GetChannelIDStore()->DeleteForDomainsCreatedBetween(
+      domain_predicate, delete_begin, delete_end,
       base::Bind(&OnClearedChannelIDsOnIOThread,
                  base::RetainedRef(std::move(rq_context)), callback));
 }
@@ -688,9 +689,10 @@
     waiting_for_clear_channel_ids_ = true;
     BrowserThread::PostTask(
         BrowserThread::IO, FROM_HERE,
-        base::Bind(&ClearChannelIDsOnIOThread, delete_begin_, delete_end_,
-                    std::move(rq_context),
-                    base::Bind(&BrowsingDataRemover::OnClearedChannelIDs,
+        base::Bind(&ClearChannelIDsOnIOThread,
+                   filter_builder.BuildChannelIDFilter(),
+                   delete_begin_, delete_end_, std::move(rq_context),
+                   base::Bind(&BrowsingDataRemover::OnClearedChannelIDs,
                               weak_ptr_factory_.GetWeakPtr())));
   }
 
@@ -879,6 +881,14 @@
 
     storage_partition_remove_mask |=
         content::StoragePartition::REMOVE_DATA_MASK_WEBRTC_IDENTITY;
+
+    // When clearing cache, wipe accumulated network related data
+    // (TransportSecurityState and HttpServerPropertiesManager data).
+    waiting_for_clear_networking_history_ = true;
+    profile_->ClearNetworkingHistorySince(
+        delete_begin_,
+        base::Bind(&BrowsingDataRemover::OnClearedNetworkingHistory,
+                   weak_ptr_factory_.GetWeakPtr()));
   }
 
   if (remove_mask & REMOVE_WEBRTC_IDENTITY) {
@@ -956,14 +966,6 @@
   if ((remove_mask & (REMOVE_CACHE | REMOVE_COOKIES)))
     prefs->SetString(omnibox::kZeroSuggestCachedResults, std::string());
 
-  // Always wipe accumulated network related data (TransportSecurityState and
-  // HttpServerPropertiesManager data).
-  waiting_for_clear_networking_history_ = true;
-  profile_->ClearNetworkingHistorySince(
-      delete_begin_,
-      base::Bind(&BrowsingDataRemover::OnClearedNetworkingHistory,
-                 weak_ptr_factory_.GetWeakPtr()));
-
   if (remove_mask & (REMOVE_COOKIES | REMOVE_HISTORY)) {
     domain_reliability::DomainReliabilityService* service =
       domain_reliability::DomainReliabilityServiceFactory::
@@ -1014,6 +1016,9 @@
     choice = ONLY_CACHE;
   }
 
+  // Notify in case all actions taken were synchronous.
+  NotifyIfDone();
+
   UMA_HISTOGRAM_ENUMERATION(
       "History.ClearBrowsingData.UserDeletedCookieOrCache",
       choice, MAX_CHOICE_VALUE);
diff --git a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
index 840d1e2..a70fcd800 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
@@ -25,7 +25,10 @@
 #include "content/public/common/content_paths.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/download_test_observer.h"
+#include "net/http/transport_security_state.h"
 #include "net/test/url_request/url_request_mock_http_job.h"
+#include "net/url_request/url_request_context.h"
+#include "net/url_request/url_request_context_getter.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 using content::BrowserThread;
@@ -97,6 +100,43 @@
   }
 };
 
+class BrowsingDataRemoverTransportSecurityStateBrowserTest
+    : public BrowsingDataRemoverBrowserTest {
+ public:
+  BrowsingDataRemoverTransportSecurityStateBrowserTest() {}
+
+  void SetUpOnMainThread() override {
+    BrowserThread::PostTask(
+        BrowserThread::IO, FROM_HERE,
+        base::Bind(&BrowsingDataRemoverTransportSecurityStateBrowserTest::
+                       SetUpTransportSecurityState,
+                   this, base::RetainedRef(
+                             browser()->profile()->GetRequestContext())));
+  }
+
+  void CheckTransportSecurityState(
+      scoped_refptr<net::URLRequestContextGetter> context_getter,
+      bool should_be_cleared) {
+    net::TransportSecurityState* state =
+        context_getter->GetURLRequestContext()->transport_security_state();
+    if (should_be_cleared)
+      EXPECT_FALSE(state->ShouldUpgradeToSSL("example.test"));
+    else
+      EXPECT_TRUE(state->ShouldUpgradeToSSL("example.test"));
+  }
+
+ protected:
+  void SetUpTransportSecurityState(
+      scoped_refptr<net::URLRequestContextGetter> context_getter) {
+    net::TransportSecurityState* state =
+        context_getter->GetURLRequestContext()->transport_security_state();
+    base::Time expiry = base::Time::Now() + base::TimeDelta::FromDays(1000);
+    EXPECT_FALSE(state->ShouldUpgradeToSSL("example.test"));
+    state->AddHSTS("example.test", expiry, false);
+    EXPECT_TRUE(state->ShouldUpgradeToSSL("example.test"));
+  }
+};
+
 // Test BrowsingDataRemover for downloads.
 IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, Download) {
   DownloadAnItem();
@@ -136,7 +176,33 @@
   RunScriptAndCheckResult("getRecords()", "text2");
 }
 
-// Profile::ClearNetworkingHistorySince should be exercised here too see whether
-// the call gets delegated through ProfileIO[Impl]Data properly, which is hard
-// to write unit-tests for. Currently this is done by both of the above tests.
-// Add standalone test if this changes.
+// Verify that TransportSecurityState data is cleared for REMOVE_CACHE.
+IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverTransportSecurityStateBrowserTest,
+                       ClearTransportSecurityState) {
+  RemoveAndWait(BrowsingDataRemover::REMOVE_CACHE);
+  base::RunLoop run_loop;
+  BrowserThread::PostTaskAndReply(
+      BrowserThread::IO, FROM_HERE,
+      base::Bind(&BrowsingDataRemoverTransportSecurityStateBrowserTest::
+                     CheckTransportSecurityState,
+                 this,
+                 base::RetainedRef(browser()->profile()->GetRequestContext()),
+                 true /* should be cleared */),
+      run_loop.QuitClosure());
+}
+
+// Verify that TransportSecurityState data is not cleared if REMOVE_CACHE is not
+// set.
+IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverTransportSecurityStateBrowserTest,
+                       PreserveTransportSecurityState) {
+  RemoveAndWait(BrowsingDataRemover::REMOVE_SITE_DATA);
+  base::RunLoop run_loop;
+  BrowserThread::PostTaskAndReply(
+      BrowserThread::IO, FROM_HERE,
+      base::Bind(&BrowsingDataRemoverTransportSecurityStateBrowserTest::
+                     CheckTransportSecurityState,
+                 this,
+                 base::RetainedRef(browser()->profile()->GetRequestContext()),
+                 false /* should not be cleared */),
+      run_loop.QuitClosure());
+}
diff --git a/chrome/browser/browsing_data/browsing_data_remover_unittest.cc b/chrome/browser/browsing_data/browsing_data_remover_unittest.cc
index 309177a8..bf52d17 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_unittest.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover_unittest.cc
@@ -1329,6 +1329,26 @@
   EXPECT_EQ(kTestOrigin2, channel_ids.front().server_identifier());
 }
 
+TEST_F(BrowsingDataRemoverTest, RemoveChannelIDsForServerIdentifiers) {
+  RemoveChannelIDTester tester(GetProfile());
+
+  tester.AddChannelID(kTestRegisterableDomain1);
+  tester.AddChannelID(kTestRegisterableDomain3);
+  EXPECT_EQ(2, tester.ChannelIDCount());
+
+  RegistrableDomainFilterBuilder filter_builder(
+      RegistrableDomainFilterBuilder::WHITELIST);
+  filter_builder.AddRegisterableDomain(kTestRegisterableDomain1);
+
+  BlockUntilOriginDataRemoved(BrowsingDataRemover::EVERYTHING,
+      BrowsingDataRemover::REMOVE_CHANNEL_IDS, filter_builder);
+
+  EXPECT_EQ(1, tester.ChannelIDCount());
+  net::ChannelIDStore::ChannelIDList channel_ids;
+  tester.GetChannelIDList(&channel_ids);
+  EXPECT_EQ(kTestRegisterableDomain3, channel_ids.front().server_identifier());
+}
+
 TEST_F(BrowsingDataRemoverTest, RemoveUnprotectedLocalStorageForever) {
 #if defined(ENABLE_EXTENSIONS)
   MockExtensionSpecialStoragePolicy* policy = CreateMockPolicy();
diff --git a/chrome/browser/browsing_data/origin_filter_builder.cc b/chrome/browser/browsing_data/origin_filter_builder.cc
index 26a5c2f..2562569 100644
--- a/chrome/browser/browsing_data/origin_filter_builder.cc
+++ b/chrome/browser/browsing_data/origin_filter_builder.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/browsing_data/origin_filter_builder.h"
 
-#include <string>
 #include <vector>
 
 #include "base/bind.h"
@@ -14,7 +13,7 @@
 
 namespace {
 
-bool DontDeleteCookiesFilter(const net::CanonicalCookie& cookie) {
+template<typename T> bool DontDeleteAnythingFilter(const T& data) {
   return false;
 }
 
@@ -74,7 +73,15 @@
   NOTREACHED() <<
       "Origin-based deletion is not suitable for cookies. Please use "
       "different scoping, such as RegistrableDomainFilterBuilder.";
-  return base::Bind(DontDeleteCookiesFilter);
+  return base::Bind(DontDeleteAnythingFilter<net::CanonicalCookie>);
+}
+
+base::Callback<bool(const std::string& channel_id_server_id)>
+OriginFilterBuilder::BuildChannelIDFilter() const {
+  NOTREACHED() <<
+      "Origin-based deletion is not suitable for channel IDs. Please use "
+      "different scoping, such as RegistrableDomainFilterBuilder.";
+  return base::Bind(DontDeleteAnythingFilter<std::string>);
 }
 
 bool OriginFilterBuilder::IsEmpty() const {
diff --git a/chrome/browser/browsing_data/origin_filter_builder.h b/chrome/browser/browsing_data/origin_filter_builder.h
index 565f78d..6ca42bd 100644
--- a/chrome/browser/browsing_data/origin_filter_builder.h
+++ b/chrome/browser/browsing_data/origin_filter_builder.h
@@ -7,6 +7,7 @@
 
 #include <ostream>
 #include <set>
+#include <string>
 #include <vector>
 
 #include "base/callback.h"
@@ -17,10 +18,11 @@
 // A class that constructs URL deletion filters (represented as GURL->bool
 // predicates) that match certain origins.
 //
-// IMPORTANT NOTE: While this class does define a cookie filtering method, as
-// required by the BrowsingDataFilterBuilder interface, it is not suitable for
-// cookie deletion (BrowsingDataRemover::REMOVE_COOKIES). Instead, use
-// RegistrableDomainFilterBuilder and see its documenation for more details.
+// IMPORTANT NOTE: While this class does define cookie and channel IDs filtering
+// methods, as required by the BrowsingDataFilterBuilder interface, it is not
+// suitable for deletion of those data types, as they are scoped to eTLD+1.
+// Instead, use RegistrableDomainFilterBuilder and see its documenation for
+// more details.
 class OriginFilterBuilder : public BrowsingDataFilterBuilder {
  public:
   // Constructs a filter with the given |mode| - whitelist or blacklist.
@@ -51,6 +53,12 @@
   base::Callback<bool(const net::CanonicalCookie& cookie)>
       BuildCookieFilter() const override;
 
+  // Channel ID filter is not implemented in this subclasss. Please use
+  // a BrowsingDataFilterBuilder with different scoping,
+  // such as RegistrableDomainFilterBuilder.
+  base::Callback<bool(const std::string& channel_id_server_id)>
+      BuildChannelIDFilter() const override;
+
  protected:
   bool IsEmpty() const override;
 
diff --git a/chrome/browser/browsing_data/registrable_domain_filter_builder.cc b/chrome/browser/browsing_data/registrable_domain_filter_builder.cc
index 209c2ee..78fe5b4 100644
--- a/chrome/browser/browsing_data/registrable_domain_filter_builder.cc
+++ b/chrome/browser/browsing_data/registrable_domain_filter_builder.cc
@@ -78,6 +78,16 @@
       base::Owned(domains_and_ips), mode());
 }
 
+base::Callback<bool(const std::string& cookie)>
+RegistrableDomainFilterBuilder::BuildChannelIDFilter() const {
+  std::set<std::string>* domains_and_ips =
+      new std::set<std::string>(domain_list_);
+  return base::Bind(
+      &RegistrableDomainFilterBuilder
+          ::MatchesChannelIDForRegisterableDomainsAndIPs,
+      base::Owned(domains_and_ips), mode());
+}
+
 bool RegistrableDomainFilterBuilder::IsEmpty() const {
   return domain_list_.empty();
 }
@@ -128,3 +138,13 @@
   return (mode == WHITELIST) == (domains_and_ips->find(parsed_cookie_domain) !=
                                  domains_and_ips->end());
 }
+
+// static
+bool
+RegistrableDomainFilterBuilder::MatchesChannelIDForRegisterableDomainsAndIPs(
+    std::set<std::string>* domains_and_ips,
+    Mode mode,
+    const std::string& channel_id_server_id) {
+  return ((mode == WHITELIST) == (domains_and_ips->find(channel_id_server_id) !=
+                                  domains_and_ips->end()));
+}
diff --git a/chrome/browser/browsing_data/registrable_domain_filter_builder.h b/chrome/browser/browsing_data/registrable_domain_filter_builder.h
index 5a6a73a..c7501af 100644
--- a/chrome/browser/browsing_data/registrable_domain_filter_builder.h
+++ b/chrome/browser/browsing_data/registrable_domain_filter_builder.h
@@ -12,7 +12,6 @@
 #include "base/callback.h"
 #include "chrome/browser/browsing_data/browsing_data_filter_builder.h"
 #include "url/gurl.h"
-#include "url/origin.h"
 
 // A class that constructs URL deletion filters (represented as GURL->bool
 // predicates) that match registerable domains - which is basically an eTLD + 1.
@@ -46,8 +45,8 @@
   // net::registry_controlled_domains::GetDomainAndRegistry.
   void AddRegisterableDomain(const std::string& domain);
 
-  // Builds a filter that matches URLs whose origins or domains are in the
-  // whitelist, or aren't in the blacklist.
+  // Builds a filter that matches URLs whose domains are in the whitelist,
+  // or aren't in the blacklist.
   base::Callback<bool(const GURL&)> BuildGeneralFilter() const override;
 
   // Builds a filter that calls ContentSettingsPattern::Compare on the given
@@ -66,33 +65,47 @@
   base::Callback<bool(const net::CanonicalCookie& cookie)>
       BuildCookieFilter() const override;
 
+  // Builds a filter that matches channel IDs whose server identifiers are
+  // identical to one of the registrable domains that are in the whitelist,
+  // or are not in the blacklist.
+  base::Callback<bool(const std::string& cookie)>
+      BuildChannelIDFilter() const override;
+
  protected:
   bool IsEmpty() const override;
 
  private:
-  // True if the origin or domain of |url| is in the whitelist, or isn't in the
-  // blacklist.
-  // The whitelist or blacklist is represented as |origins| and |mode|.
+  // True if the domain of |url| is in the whitelist, or isn't in the blacklist.
+  // The whitelist or blacklist is represented as |registerable_domains|
+  // and |mode|.
   static bool MatchesURL(std::set<std::string>* registerable_domains,
                          Mode mode,
                          const GURL& url);
 
   // True if the pattern something in the whitelist, or doesn't match something
   // in the blacklist.
-  // The whitelist or blacklist is represented as |origins|,  and |mode|.
+  // The whitelist or blacklist is represented as |patterns|,  and |mode|.
   static bool MatchesWebsiteSettingsPattern(
       std::vector<ContentSettingsPattern>* patterns,
       Mode mode,
       const ContentSettingsPattern& pattern);
 
-  // True if no origins can see the given cookie and we're a blacklist, or any
-  // origins can see the cookie and we're a whitelist.
-  // The whitelist or blacklist is represented as |origins| and |mode|.
+  // True if no domains can see the given cookie and we're a blacklist, or any
+  // domains can see the cookie and we're a whitelist.
+  // The whitelist or blacklist is represented as |domains_and_ips| and |mode|.
   static bool MatchesCookieForRegisterableDomainsAndIPs(
       std::set<std::string>* domains_and_ips,
       Mode mode,
       const net::CanonicalCookie& cookie);
 
+  // True if none of the supplied domains matches this Channel ID's server ID
+  // and we're a blacklist, or one of them does and we're a whitelist.
+  // The whitelist or blacklist is represented as |domains_and_ips| and |mode|.
+  static bool MatchesChannelIDForRegisterableDomainsAndIPs(
+      std::set<std::string>* domains_and_ips,
+      Mode mode,
+      const std::string& channel_id_server_id);
+
   // The list of domains and whether they should be interpreted as a whitelist
   // or blacklist.
   std::set<std::string> domain_list_;
diff --git a/chrome/browser/browsing_data/registrable_domain_filter_builder_unittest.cc b/chrome/browser/browsing_data/registrable_domain_filter_builder_unittest.cc
index f6f2bd07..9880ad6 100644
--- a/chrome/browser/browsing_data/registrable_domain_filter_builder_unittest.cc
+++ b/chrome/browser/browsing_data/registrable_domain_filter_builder_unittest.cc
@@ -83,6 +83,15 @@
         << cookie->DebugString();
 }
 
+void RunTestCase(
+    TestCase test_case,
+    const base::Callback<bool(const std::string&)>& filter) {
+  std::string channel_id_server_id = test_case.url;
+  EXPECT_EQ(test_case.should_match, filter.Run(channel_id_server_id))
+      << channel_id_server_id << " should "
+      << (test_case.should_match ? "" : "NOT ") << "be matched by the filter.";
+}
+
 }  // namespace
 
 TEST(RegistrableDomainFilterBuilderTest, Noop) {
@@ -340,3 +349,55 @@
   for (TestCase test_case : test_cases)
     RunTestCase(test_case, filter);
 }
+
+TEST(RegistrableDomainFilterBuilderTest, MatchesChannelIDsWhitelist) {
+  RegistrableDomainFilterBuilder builder(
+      RegistrableDomainFilterBuilder::WHITELIST);
+  builder.AddRegisterableDomain(std::string(kGoogleDomain));
+  builder.AddRegisterableDomain(std::string(kLongETLDDomain));
+  builder.AddRegisterableDomain(std::string(kIPAddress));
+  base::Callback<bool(const std::string&)> filter =
+      builder.BuildChannelIDFilter();
+
+  TestCase test_cases[] = {
+      // Channel ID server identifiers can be top-level domains...
+      {"google.com", true},
+      {"website.sp.nom.br", true},
+
+      // or IP addresses.
+      {"192.168.1.1", true},
+
+      // Channel IDs not in the whitelist are not matched.
+      {"example.com", false},
+      {"192.168.1.2", false},
+  };
+
+  for (TestCase test_case : test_cases)
+    RunTestCase(test_case, filter);
+}
+
+TEST(RegistrableDomainFilterBuilderTest, MatchesChannelIDsBlacklist) {
+  RegistrableDomainFilterBuilder builder(
+      RegistrableDomainFilterBuilder::BLACKLIST);
+  builder.AddRegisterableDomain(std::string(kGoogleDomain));
+  builder.AddRegisterableDomain(std::string(kLongETLDDomain));
+  builder.AddRegisterableDomain(std::string(kIPAddress));
+  base::Callback<bool(const std::string&)> filter =
+      builder.BuildChannelIDFilter();
+
+  TestCase test_cases[] = {
+      // Channel ID server identifiers can be top-level domains...
+      {"google.com", false},
+      {"website.sp.nom.br", false},
+
+      // or IP addresses.
+      {"192.168.1.1", false},
+
+      // Channel IDs that are not blacklisted are matched.
+      {"example.com", true},
+      {"192.168.1.2", true},
+  };
+
+  for (TestCase test_case : test_cases)
+    RunTestCase(test_case, filter);
+}
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index fe29846..6b0ed55c 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -1279,7 +1279,12 @@
 #endif  // defined(ENABLE_WEBRTC)
 
 #if !defined(OS_ANDROID)
-  if (base::FeatureList::IsEnabled(features::kWebUsb)) {
+  // WebUSB is an experimental web API. The sites these notifications will link
+  // to will only work if the experiment is enabled and WebUSB feature is
+  // enabled.
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kEnableExperimentalWebPlatformFeatures) &&
+      base::FeatureList::IsEnabled(features::kWebUsb)) {
     webusb_browser_client_.reset(new ChromeWebUsbBrowserClient());
     webusb_detector_.reset(
         new webusb::WebUsbDetector(webusb_browser_client_.get()));
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 9bd60b90..12464312 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -2773,7 +2773,11 @@
 void ChromeContentBrowserClient::RegisterRenderFrameMojoServices(
     content::ServiceRegistry* registry,
     content::RenderFrameHost* render_frame_host) {
-  if (base::FeatureList::IsEnabled(features::kWebUsb)) {
+  // WebUSB is an experimental web API. It will only work if the experiment
+  // is enabled and WebUSB feature is enabled.
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kEnableExperimentalWebPlatformFeatures) &&
+      base::FeatureList::IsEnabled(features::kWebUsb)) {
     registry->AddService(
         base::Bind(&CreateUsbDeviceManager, render_frame_host));
     registry->AddService(
diff --git a/chrome/browser/chrome_select_file_dialog_factory_win.cc b/chrome/browser/chrome_select_file_dialog_factory_win.cc
index 41a3b0a..4fa8892 100644
--- a/chrome/browser/chrome_select_file_dialog_factory_win.cc
+++ b/chrome/browser/chrome_select_file_dialog_factory_win.cc
@@ -50,7 +50,7 @@
 
   // UtilityProcessHostClient implementation
   void OnProcessCrashed(int exit_code) override;
-  void OnProcessLaunchFailed() override;
+  void OnProcessLaunchFailed(int error_code) override;
   bool OnMessageReceived(const IPC::Message& message) override;
 
  protected:
@@ -79,7 +79,7 @@
   event_.Signal();
 }
 
-void GetOpenFileNameClient::OnProcessLaunchFailed() {
+void GetOpenFileNameClient::OnProcessLaunchFailed(int error_code) {
   event_.Signal();
 }
 
@@ -180,7 +180,7 @@
 
   // UtilityProcessHostClient implementation
   void OnProcessCrashed(int exit_code) override;
-  void OnProcessLaunchFailed() override;
+  void OnProcessLaunchFailed(int error_code) override;
   bool OnMessageReceived(const IPC::Message& message) override;
 
  protected:
@@ -209,7 +209,7 @@
   event_.Signal();
 }
 
-void GetSaveFileNameClient::OnProcessLaunchFailed() {
+void GetSaveFileNameClient::OnProcessLaunchFailed(int error_code) {
   event_.Signal();
 }
 
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 6baa36f7..19b3aab 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -111,6 +111,7 @@
     "//third_party/re2",
     "//third_party/zlib",
     "//ui/app_list",
+    "//ui/app_list/presenter:mojom",
     "//ui/aura",
     "//ui/base",
     "//ui/chromeos:ui_chromeos",
diff --git a/chrome/browser/chromeos/chrome_interface_factory.cc b/chrome/browser/chromeos/chrome_interface_factory.cc
index a33f339..06311b86 100644
--- a/chrome/browser/chromeos/chrome_interface_factory.cc
+++ b/chrome/browser/chromeos/chrome_interface_factory.cc
@@ -6,6 +6,7 @@
 
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/ash/app_list/app_list_presenter_service.h"
 #include "chrome/browser/ui/ash/keyboard_ui_service.h"
 #include "chrome/browser/ui/browser_commands.h"
 #include "services/shell/public/cpp/connection.h"
@@ -62,6 +63,7 @@
 bool ChromeInterfaceFactory::AcceptConnection(shell::Connection* connection) {
   connection->AddInterface<keyboard::mojom::Keyboard>(this);
   connection->AddInterface<mash::mojom::Launchable>(this);
+  connection->AddInterface<app_list::mojom::AppListPresenter>(this);
   return true;
 }
 
@@ -80,4 +82,13 @@
   launchable_->ProcessRequest(std::move(request));
 }
 
+void ChromeInterfaceFactory::Create(
+    shell::Connection* connection,
+    mojo::InterfaceRequest<app_list::mojom::AppListPresenter> request) {
+  if (!app_list_presenter_service_)
+    app_list_presenter_service_.reset(new AppListPresenterService);
+  app_list_presenter_bindings_.AddBinding(app_list_presenter_service_.get(),
+                                          std::move(request));
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/chrome_interface_factory.h b/chrome/browser/chromeos/chrome_interface_factory.h
index b1f9d263..a56e617 100644
--- a/chrome/browser/chromeos/chrome_interface_factory.h
+++ b/chrome/browser/chromeos/chrome_interface_factory.h
@@ -9,8 +9,10 @@
 #include "mash/public/interfaces/launchable.mojom.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "services/shell/public/cpp/interface_factory.h"
+#include "ui/app_list/presenter/app_list_presenter.mojom.h"
 #include "ui/keyboard/keyboard.mojom.h"
 
+class AppListPresenterService;
 class ChromeLaunchable;
 class KeyboardUIService;
 
@@ -20,6 +22,7 @@
 class ChromeInterfaceFactory
     : public content::MojoShellConnection::Listener,
       public shell::InterfaceFactory<mash::mojom::Launchable>,
+      public shell::InterfaceFactory<app_list::mojom::AppListPresenter>,
       public shell::InterfaceFactory<keyboard::mojom::Keyboard> {
  public:
   ChromeInterfaceFactory();
@@ -38,9 +41,17 @@
   void Create(shell::Connection* connection,
               mash::mojom::LaunchableRequest request) override;
 
+  // mojo::InterfaceFactory<app_list::AppListPresenter>:
+  void Create(shell::Connection* connection,
+              mojo::InterfaceRequest<app_list::mojom::AppListPresenter> request)
+      override;
+
   std::unique_ptr<KeyboardUIService> keyboard_ui_service_;
   mojo::BindingSet<keyboard::mojom::Keyboard> keyboard_bindings_;
   std::unique_ptr<ChromeLaunchable> launchable_;
+  std::unique_ptr<AppListPresenterService> app_list_presenter_service_;
+  mojo::BindingSet<app_list::mojom::AppListPresenter>
+      app_list_presenter_bindings_;
 
   DISALLOW_COPY_AND_ASSIGN(ChromeInterfaceFactory);
 };
diff --git a/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.cc b/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.cc
index 6c7045f2..507796c 100644
--- a/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.cc
+++ b/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.cc
@@ -432,11 +432,13 @@
 // Returns true for platform apps that are considered safe for Public Sessions,
 // which among other things requires the manifest top-level entries to be
 // contained in the |kSafeManifestEntries| whitelist and all permissions to be
-// contained in |kSafePermissionStrings| or |kSafePermissionDicts|.
+// contained in |kSafePermissionStrings| or |kSafePermissionDicts|.  Otherwise
+// returns false and logs all reasons for failure.
 bool IsPlatformAppSafeForPublicSession(const extensions::Extension* extension) {
+  bool safe = true;
   if (extension->GetType() != extensions::Manifest::TYPE_PLATFORM_APP) {
     LOG(ERROR) << extension->id() << " is not a platform app.";
-    return false;
+    safe = false;
   }
 
   for (base::DictionaryValue::Iterator it(*extension->manifest()->value());
@@ -452,7 +454,8 @@
       const base::ListValue* list_value;
       if (!it.value().GetAsList(&list_value)) {
         LOG(ERROR) << extension->id() << ": " << it.key() << " is not a list.";
-        return false;
+        safe = false;
+        continue;
       }
       for (auto it2 = list_value->begin(); it2 != list_value->end(); ++it2) {
         // Try to read as dictionary.
@@ -462,7 +465,8 @@
             LOG(ERROR) << extension->id()
                        << " has dict in permission list with size "
                        << dict_value->size() << ".";
-            return false;
+            safe = false;
+            continue;
           }
           for (base::DictionaryValue::Iterator it3(*dict_value);
                !it3.IsAtEnd(); it3.Advance()) {
@@ -470,7 +474,8 @@
               LOG(ERROR) << extension->id()
                          << " has non-whitelisted dict in permission list: "
                          << it3.key();
-              return false;
+              safe = false;
+              continue;
             }
           }
           continue;
@@ -480,7 +485,8 @@
         if (!(*it2)->GetAsString(&permission_string)) {
           LOG(ERROR) << extension->id() << ": " << it.key()
                      << " contains a token that's neither a string nor a dict.";
-          return false;
+          safe = false;
+          continue;
         }
         // Accept whitelisted permissions.
         if (ArrayContains(kSafePermissionStrings, permission_string)) {
@@ -496,14 +502,15 @@
         LOG(ERROR) << extension->id()
                    << " requested non-whitelisted permission: "
                    << permission_string;
-        return false;
+        safe = false;
       }
     // "app" may only contain "background".
     } else if (it.key() == emk::kApp) {
       const base::DictionaryValue *dict_value;
       if (!it.value().GetAsDictionary(&dict_value)) {
         LOG(ERROR) << extension->id() << ": app is not a dictionary.";
-        return false;
+        safe = false;
+        continue;
       }
       for (base::DictionaryValue::Iterator it2(*dict_value);
            !it2.IsAtEnd(); it2.Advance()) {
@@ -511,7 +518,8 @@
           LOG(ERROR) << extension->id()
                      << " has non-whitelisted manifest entry: "
                      << it.key() << "." << it2.key();
-          return false;
+          safe = false;
+          continue;
         }
       }
     // Require v2 because that's the only version we understand.
@@ -520,29 +528,32 @@
       if (!it.value().GetAsInteger(&version)) {
         LOG(ERROR) << extension->id() << ": " << emk::kManifestVersion
                    << " is not an integer.";
-        return false;
+        safe = false;
+        continue;
       }
       if (version != 2) {
         LOG(ERROR) << extension->id()
                    << " has non-whitelisted manifest version.";
-        return false;
+        safe = false;
+        continue;
       }
     // URL handlers depend on the web store to confirm ownership of the domain.
     } else if (it.key() == emk::kUrlHandlers) {
       if (!extension->from_webstore()) {
         LOG(ERROR) << extension->id() << " uses emk::kUrlHandlers but was not "
             "installed through the web store.";
-        return false;
+        safe = false;
+        continue;
       }
     // Everything else is an error.
     } else {
       LOG(ERROR) << extension->id()
                  << " has non-whitelisted manifest entry: " << it.key();
-      return false;
+      safe = false;
     }
   }
 
-  return true;
+  return safe;
 }
 
 }  // namespace
diff --git a/chrome/browser/chromeos/extensions/wallpaper_api.cc b/chrome/browser/chromeos/extensions/wallpaper_api.cc
index 8cb46e56..5d16b28 100644
--- a/chrome/browser/chromeos/extensions/wallpaper_api.cc
+++ b/chrome/browser/chromeos/extensions/wallpaper_api.cc
@@ -16,6 +16,7 @@
 #include "base/threading/worker_pool.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/extensions/wallpaper_private_api.h"
+#include "chrome/browser/chromeos/file_manager/app_id.h"
 #include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
@@ -171,9 +172,11 @@
       user_manager::User::CUSTOMIZED, image, update_wallpaper);
   unsafe_wallpaper_decoder_ = NULL;
 
-  // Save current extenion name. It will be displayed in the component
+  // Save current extension name. It will be displayed in the component
   // wallpaper picker app. If current extension is the component wallpaper
   // picker, set an empty string.
+  // TODO(xdai): This preference is unused now. For compatiblity concern, we
+  // need to keep it until it's safe to clean it up.
   Profile* profile = Profile::FromBrowserContext(browser_context());
   if (extension()->id() == extension_misc::kWallpaperManagerId) {
     profile->GetPrefs()->SetString(prefs::kCurrentWallpaperAppName,
@@ -248,7 +251,17 @@
     event_args->Append(thumbnail_result);
     event_args->Append(new base::StringValue(
         extensions::api::wallpaper::ToString(params_->details.layout)));
-    event_args->Append(new base::StringValue(extension()->name()));
+    // Setting wallpaper from right click menu in 'Files' app is a feature that
+    // was implemented in crbug.com/578935. Since 'Files' app is a built-in v1
+    // app in ChromeOS, we should treat it slightly differently with other third
+    // party apps: the wallpaper set by the 'Files' app should still be syncable
+    // and it should not appear in the wallpaper grid in the Wallpaper Picker.
+    // But we should not display the 'wallpaper-set-by-mesage' since it might
+    // introduce confusion as shown in crbug.com/599407.
+    event_args->Append(new base::StringValue(
+        (extension()->id() == file_manager::kFileManagerAppId)
+            ? std::string()
+            : extension()->name()));
     std::unique_ptr<extensions::Event> event(new extensions::Event(
         extensions::events::WALLPAPER_PRIVATE_ON_WALLPAPER_CHANGED_BY_3RD_PARTY,
         extensions::api::wallpaper_private::OnWallpaperChangedBy3rdParty::
diff --git a/chrome/browser/chromeos/login/screenshot_testing/login_screen_areas.h b/chrome/browser/chromeos/login/screenshot_testing/login_screen_areas.h
index 2c0ebc8..ad32d7ae 100644
--- a/chrome/browser/chromeos/login/screenshot_testing/login_screen_areas.h
+++ b/chrome/browser/chromeos/login/screenshot_testing/login_screen_areas.h
@@ -5,7 +5,6 @@
 #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SCREENSHOT_TESTING_LOGIN_SCREEN_AREAS_H_
 #define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENSHOT_TESTING_LOGIN_SCREEN_AREAS_H_
 
-#include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkRect.h"
 
 namespace chromeos {
diff --git a/chrome/browser/chromeos/login/ui/webui_login_view.cc b/chrome/browser/chromeos/login/ui/webui_login_view.cc
index 27c42e22..343ae793 100644
--- a/chrome/browser/chromeos/login/ui/webui_login_view.cc
+++ b/chrome/browser/chromeos/login/ui/webui_login_view.cc
@@ -9,6 +9,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/i18n/rtl.h"
+#include "base/logging.h"
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/trace_event/trace_event.h"
@@ -19,6 +20,7 @@
 #include "chrome/browser/chromeos/login/ui/proxy_settings_dialog.h"
 #include "chrome/browser/chromeos/login/ui/webui_login_display.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/chromeos/settings/cros_settings.h"
 #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
 #include "chrome/browser/media/media_capture_devices_dispatcher.h"
 #include "chrome/browser/media/media_stream_devices_controller.h"
@@ -31,6 +33,8 @@
 #include "chromeos/dbus/session_manager_client.h"
 #include "chromeos/network/network_state.h"
 #include "chromeos/network/network_state_handler.h"
+#include "chromeos/settings/cros_settings_names.h"
+#include "components/content_settings/core/common/content_settings_pattern.h"
 #include "components/password_manager/core/browser/password_manager.h"
 #include "components/web_modal/web_contents_modal_dialog_manager.h"
 #include "content/public/browser/notification_service.h"
@@ -435,8 +439,42 @@
     const content::MediaStreamRequest& request,
     const content::MediaResponseCallback& callback) {
   MediaStreamDevicesController controller(web_contents, request, callback);
-  if (controller.IsAskingForVideo() || controller.IsAskingForAudio())
-    NOTREACHED() << "Media stream not allowed for WebUI";
+  if (controller.IsAskingForAudio() || !controller.IsAskingForVideo()) {
+    controller.PermissionDenied();
+    return;
+  }
+
+  const CrosSettings* const settings = CrosSettings::Get();
+  if (!settings) {
+    controller.PermissionDenied();
+    return;
+  }
+
+  const base::Value* const raw_list_value =
+      settings->GetPref(kLoginVideoCaptureAllowedUrls);
+  if (!raw_list_value) {
+    controller.PermissionDenied();
+    return;
+  }
+
+  const base::ListValue* list_value;
+  CHECK(raw_list_value->GetAsList(&list_value));
+  for (base::Value* base_value : *list_value) {
+    std::string value;
+    if (base_value->GetAsString(&value)) {
+      ContentSettingsPattern pattern =
+          ContentSettingsPattern::FromString(value);
+      if (pattern == ContentSettingsPattern::Wildcard()) {
+        LOG(WARNING) << "Ignoring wildcard URL pattern: " << value;
+        continue;
+      }
+      if (pattern.IsValid() && pattern.Matches(request.security_origin)) {
+        controller.PermissionGranted();
+        return;
+      }
+    }
+  }
+  controller.PermissionDenied();
 }
 
 bool WebUILoginView::CheckMediaAccessPermission(
@@ -462,10 +500,6 @@
   VLOG(1) << "WebUILoginView loading progress updated to " << progress;
 }
 
-void WebUILoginView::SwappedOut(content::WebContents* source) {
-  VLOG(1) << "WebUILoginView got swapped out";
-}
-
 void WebUILoginView::BeforeUnloadFired(content::WebContents* tab,
                                        bool proceed,
                                        bool* proceed_to_fire_unload) {
diff --git a/chrome/browser/chromeos/login/ui/webui_login_view.h b/chrome/browser/chromeos/login/ui/webui_login_view.h
index 629709d2..0b4705a 100644
--- a/chrome/browser/chromeos/login/ui/webui_login_view.h
+++ b/chrome/browser/chromeos/login/ui/webui_login_view.h
@@ -134,12 +134,11 @@
                                   content::MediaStreamType type) override;
   bool PreHandleGestureEvent(content::WebContents* source,
                              const blink::WebGestureEvent& event) override;
-  // TODO(jdufault): Remove LoadProgressChanged, SwappedOut, BeforeUnloadFired,
+  // TODO(jdufault): Remove LoadProgressChanged, BeforeUnloadFired,
   // RendererUnresponsive, RendererResponsive, DidNavigateMainFramePostCommit
   // overrides once crbug.com/452599 is resolved.
   void LoadProgressChanged(content::WebContents* source,
                            double progress) override;
-  void SwappedOut(content::WebContents* source) override;
   void BeforeUnloadFired(content::WebContents* tab,
                          bool proceed,
                          bool* proceed_to_fire_unload) override;
diff --git a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
index c5d155f9..0cc212c3 100644
--- a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
+++ b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
@@ -325,6 +325,18 @@
                     nullptr);
     }
   }
+
+  if (policy.has_login_video_capture_allowed_urls()) {
+    const em::LoginVideoCaptureAllowedUrlsProto& container(
+        policy.login_video_capture_allowed_urls());
+    std::unique_ptr<base::ListValue> urls(new base::ListValue());
+    for (const auto& entry : container.urls()) {
+      urls->Append(new base::StringValue(entry));
+    }
+    policies->Set(key::kLoginVideoCaptureAllowedUrls, POLICY_LEVEL_MANDATORY,
+                  POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, urls.release(),
+                  nullptr);
+  }
 }
 
 void DecodeNetworkPolicies(const em::ChromeDeviceSettingsProto& policy,
diff --git a/chrome/browser/chromeos/policy/proto/chrome_device_policy.proto b/chrome/browser/chromeos/policy/proto/chrome_device_policy.proto
index 60a8e80..8ba0e7c4 100644
--- a/chrome/browser/chromeos/policy/proto/chrome_device_policy.proto
+++ b/chrome/browser/chromeos/policy/proto/chrome_device_policy.proto
@@ -704,6 +704,13 @@
   optional bool quirks_download_enabled = 1;
 }
 
+// A list of security origins for SAML login pages that are allowed to
+// access the webcam.  No login pages will be allowed to access the
+// webcam if the list is empty.
+message LoginVideoCaptureAllowedUrlsProto {
+  repeated string urls = 1;
+}
+
 message ChromeDeviceSettingsProto {
   optional DevicePolicyRefreshRateProto device_policy_refresh_rate = 1;
   optional UserWhitelistProto user_whitelist = 2;
@@ -754,4 +761,6 @@
   optional UsbDetachableWhitelistProto usb_detachable_whitelist = 42;
   optional AllowBluetoothProto allow_bluetooth = 43;
   optional DeviceQuirksDownloadEnabledProto quirks_download_enabled = 44;
+  optional LoginVideoCaptureAllowedUrlsProto login_video_capture_allowed_urls =
+      45;
 }
diff --git a/chrome/browser/chromeos/settings/device_settings_provider.cc b/chrome/browser/chromeos/settings/device_settings_provider.cc
index be2bb1e..393f7982 100644
--- a/chrome/browser/chromeos/settings/device_settings_provider.cc
+++ b/chrome/browser/chromeos/settings/device_settings_provider.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/chromeos/settings/device_settings_provider.h"
 
+#include <memory.h>
 #include <stddef.h>
 #include <utility>
 
@@ -70,6 +71,7 @@
     kHeartbeatEnabled,
     kHeartbeatFrequency,
     kLoginAuthenticationBehavior,
+    kLoginVideoCaptureAllowedUrls,
     kPolicyMissingMitigationMode,
     kRebootOnShutdown,
     kReleaseChannel,
@@ -270,6 +272,17 @@
         kLoginAuthenticationBehavior,
         policy.login_authentication_behavior().login_authentication_behavior());
   }
+
+  if (policy.has_login_video_capture_allowed_urls()) {
+    std::unique_ptr<base::ListValue> list(new base::ListValue());
+    const em::LoginVideoCaptureAllowedUrlsProto&
+        login_video_capture_allowed_urls_proto =
+            policy.login_video_capture_allowed_urls();
+    for (const auto& value : login_video_capture_allowed_urls_proto.urls()) {
+      list->Append(new base::StringValue(value));
+    }
+    new_values_cache->SetValue(kLoginVideoCaptureAllowedUrls, std::move(list));
+  }
 }
 
 void DecodeNetworkPolicies(
@@ -576,7 +589,6 @@
       return;
     }
   }
-
 }
 
 void DeviceSettingsProvider::OwnershipStatusChanged() {
diff --git a/chrome/browser/download/notification/download_item_notification.h b/chrome/browser/download/notification/download_item_notification.h
index f47e131c..9b98465 100644
--- a/chrome/browser/download/notification/download_item_notification.h
+++ b/chrome/browser/download/notification/download_item_notification.h
@@ -15,12 +15,13 @@
 #include "chrome/browser/notifications/notification_test_util.h"
 #include "content/public/browser/download_item.h"
 #include "grit/theme_resources.h"
-#include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/message_center/message_center.h"
 #include "ui/message_center/message_center_observer.h"
 #include "ui/native_theme/native_theme.h"
 
+class SkBitmap;
+
 namespace test {
 class DownloadItemNotificationTest;
 }
diff --git a/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.h b/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.h
index a573f8b..8a20cf8 100644
--- a/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.h
+++ b/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.h
@@ -15,9 +15,9 @@
 #include "chrome/browser/extensions/webstore_install_helper.h"
 #include "chrome/common/extensions/api/dashboard_private.h"
 #include "extensions/browser/extension_function.h"
-#include "third_party/skia/include/core/SkBitmap.h"
 
 class GURL;
+class SkBitmap;
 
 namespace chrome {
 class BitmapFetcher;
diff --git a/chrome/browser/extensions/api/developer_private/extension_info_generator.cc b/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
index bfa6946..d49104d 100644
--- a/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
+++ b/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
@@ -47,6 +47,7 @@
 #include "extensions/common/manifest_url_handlers.h"
 #include "extensions/common/permissions/permissions_data.h"
 #include "extensions/grit/extensions_browser_resources.h"
+#include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/gfx/codec/png_codec.h"
diff --git a/chrome/browser/extensions/api/feedback_private/feedback_private_api.cc b/chrome/browser/extensions/api/feedback_private/feedback_private_api.cc
index 5edd22b..2ff360a 100644
--- a/chrome/browser/extensions/api/feedback_private/feedback_private_api.cc
+++ b/chrome/browser/extensions/api/feedback_private/feedback_private_api.cc
@@ -24,12 +24,17 @@
 #include "chrome/grit/generated_resources.h"
 #include "components/feedback/tracing_manager.h"
 #include "components/signin/core/browser/signin_manager.h"
+#include "content/public/browser/user_metrics.h"
 #include "extensions/browser/event_router.h"
 #include "grit/components_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/webui/web_ui_util.h"
 #include "url/url_util.h"
 
+#if defined(OS_WIN)
+#include "chrome/browser/safe_browsing/srt_fetcher_win.h"
+#endif
+
 using extensions::api::feedback_private::SystemInformation;
 using feedback::FeedbackData;
 
@@ -81,6 +86,17 @@
     const std::string& description_template,
     const std::string& category_tag,
     const GURL& page_url) {
+#if defined(OS_WIN)
+  // Show prompt for Software Removal Tool if the Reporter component has found
+  // unwanted software, and the user has never run the cleaner before.
+  if (safe_browsing::ReporterFoundUws() &&
+      !safe_browsing::UserHasRunCleaner()) {
+    RequestFeedbackForFlow(description_template, category_tag, page_url,
+                           FeedbackFlow::FEEDBACK_FLOW_SHOWSRTPROMPT);
+    return;
+  }
+#endif
+
   RequestFeedbackForFlow(description_template, category_tag, page_url,
                          FeedbackFlow::FEEDBACK_FLOW_REGULAR);
 }
@@ -154,6 +170,11 @@
   SET_STRING("sysinfoPageExpandBtn", IDS_ABOUT_SYS_EXPAND);
   SET_STRING("sysinfoPageCollapseBtn", IDS_ABOUT_SYS_COLLAPSE);
   SET_STRING("sysinfoPageStatusLoading", IDS_FEEDBACK_SYSINFO_PAGE_LOADING);
+  // And the localized strings needed for the SRT Download Prompt.
+  SET_STRING("srtPromptBody", IDS_FEEDBACK_SRT_PROMPT_BODY);
+  SET_STRING("srtPromptAcceptButton", IDS_FEEDBACK_SRT_PROMPT_ACCEPT_BUTTON);
+  SET_STRING("srtPromptDeclineButton",
+             IDS_FEEDBACK_SRT_PROMPT_DECLINE_BUTTON);
 #undef SET_STRING
 
   const std::string& app_locale = g_browser_process->GetApplicationLocale();
@@ -269,4 +290,31 @@
   SendResponse(true);
 }
 
+AsyncExtensionFunction::ResponseAction
+FeedbackPrivateLogSrtPromptResultFunction::Run() {
+  std::unique_ptr<feedback_private::LogSrtPromptResult::Params> params(
+      feedback_private::LogSrtPromptResult::Params::Create(*args_));
+  EXTENSION_FUNCTION_VALIDATE(params.get());
+
+  const feedback_private::SrtPromptResult result = params->result;
+
+  switch (result) {
+    case feedback_private::SRT_PROMPT_RESULT_ACCEPTED:
+      content::RecordAction(
+          base::UserMetricsAction("Feedback.SrtPromptAccepted"));
+      break;
+    case feedback_private::SRT_PROMPT_RESULT_DECLINED:
+      content::RecordAction(
+          base::UserMetricsAction("Feedback.SrtPromptDeclined"));
+      break;
+    case feedback_private::SRT_PROMPT_RESULT_CLOSED:
+      content::RecordAction(
+          base::UserMetricsAction("Feedback.SrtPromptClosed"));
+      break;
+    default:
+      return RespondNow(Error("Invalid arugment."));
+  }
+  return RespondNow(NoArguments());
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/feedback_private/feedback_private_api.h b/chrome/browser/extensions/api/feedback_private/feedback_private_api.h
index bab1831..b3c7d61 100644
--- a/chrome/browser/extensions/api/feedback_private/feedback_private_api.h
+++ b/chrome/browser/extensions/api/feedback_private/feedback_private_api.h
@@ -8,6 +8,7 @@
 #include "chrome/browser/extensions/chrome_extension_function.h"
 #include "chrome/common/extensions/api/feedback_private.h"
 #include "extensions/browser/browser_context_keyed_api_factory.h"
+#include "extensions/browser/extension_function.h"
 #include "ui/gfx/geometry/rect.h"
 
 namespace extensions {
@@ -108,6 +109,17 @@
   void OnCompleted(bool success);
 };
 
+class FeedbackPrivateLogSrtPromptResultFunction
+    : public UIThreadExtensionFunction {
+ public:
+  DECLARE_EXTENSION_FUNCTION("feedbackPrivate.logSrtPromptResult",
+                             FEEDBACKPRIVATE_LOGSRTPROMPTRESULT);
+
+ protected:
+  ~FeedbackPrivateLogSrtPromptResultFunction() override {}
+  AsyncExtensionFunction::ResponseAction Run() override;
+};
+
 }  // namespace extensions
 
 #endif  // CHROME_BROWSER_EXTENSIONS_API_FEEDBACK_PRIVATE_FEEDBACK_PRIVATE_API_H_
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc b/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc
index d60993f8..1c64b4a 100644
--- a/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc
+++ b/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc
@@ -4,6 +4,7 @@
 
 #include "base/bind.h"
 #include "base/location.h"
+#include "base/strings/stringprintf.h"
 #include "base/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
@@ -109,12 +110,18 @@
 
 void ImageWriterUtilityClient::OnProcessCrashed(int exit_code) {
   task_runner_->PostTask(
-      FROM_HERE, base::Bind(error_callback_, "Utility process crashed."));
+      FROM_HERE,
+      base::Bind(error_callback_,
+                 base::StringPrintf("Utility process crashed with code %08x.",
+                                    exit_code)));
 }
 
-void ImageWriterUtilityClient::OnProcessLaunchFailed() {
+void ImageWriterUtilityClient::OnProcessLaunchFailed(int error_code) {
   task_runner_->PostTask(
-      FROM_HERE, base::Bind(error_callback_, "Process launch failed."));
+      FROM_HERE,
+      base::Bind(error_callback_,
+                 base::StringPrintf("Process launch failed with code %08x.",
+                                    error_code)));
 }
 
 bool ImageWriterUtilityClient::OnMessageReceived(const IPC::Message& message) {
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.h b/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.h
index 796faee..62a9a28 100644
--- a/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.h
+++ b/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.h
@@ -66,7 +66,7 @@
 
   // UtilityProcessHostClient implementation.
   void OnProcessCrashed(int exit_code) override;
-  void OnProcessLaunchFailed() override;
+  void OnProcessLaunchFailed(int error_code) override;
   bool OnMessageReceived(const IPC::Message& message) override;
   virtual bool Send(IPC::Message* msg);
 
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_win.cc b/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_win.cc
index 891cd44..fb624e2 100644
--- a/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_win.cc
+++ b/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_win.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/macros.h"
 #include "base/strings/string_piece.h"
+#include "base/strings/stringprintf.h"
 #include "base/thread_task_runner_handle.h"
 #include "base/threading/sequenced_worker_pool.h"
 #include "chrome/common/extensions/api/networking_private/networking_private_crypto.h"
@@ -34,7 +35,7 @@
   // UtilityProcessHostClient
   bool OnMessageReceived(const IPC::Message& message) override;
   void OnProcessCrashed(int exit_code) override;
-  void OnProcessLaunchFailed() override;
+  void OnProcessLaunchFailed(int error_code) override;
 
   // IPC message handlers.
   void OnGotCredentials(const std::string& key_data, bool success);
@@ -72,11 +73,13 @@
 }
 
 void CredentialsGetterHostClient::OnProcessCrashed(int exit_code) {
-  callback_.Run("", "Process Crashed");
+  callback_.Run(
+      "", base::StringPrintf("Process Crashed with code %08x.", exit_code));
 }
 
-void CredentialsGetterHostClient::OnProcessLaunchFailed() {
-  callback_.Run("", "Process Launch Failed");
+void CredentialsGetterHostClient::OnProcessLaunchFailed(int error_code) {
+  callback_.Run("", base::StringPrintf("Process Launch Failed with code %08x.",
+                                       error_code));
 }
 
 void CredentialsGetterHostClient::OnGotCredentials(const std::string& key_data,
diff --git a/chrome/browser/extensions/api/storage/policy_value_store_unittest.cc b/chrome/browser/extensions/api/storage/policy_value_store_unittest.cc
index c740358..de089d4 100644
--- a/chrome/browser/extensions/api/storage/policy_value_store_unittest.cc
+++ b/chrome/browser/extensions/api/storage/policy_value_store_unittest.cc
@@ -161,7 +161,7 @@
   const base::StringValue value("111");
   {
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange("aaa", NULL, value.DeepCopy()));
+    changes.push_back(ValueStoreChange("aaa", nullptr, value.CreateDeepCopy()));
     EXPECT_CALL(observer_,
                 OnSettingsChanged(kTestExtensionId,
                                   settings_namespace::MANAGED,
@@ -178,7 +178,7 @@
   // Notify when new policies are added.
   {
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange("bbb", NULL, value.DeepCopy()));
+    changes.push_back(ValueStoreChange("bbb", nullptr, value.CreateDeepCopy()));
     EXPECT_CALL(observer_,
                 OnSettingsChanged(kTestExtensionId,
                                   settings_namespace::MANAGED,
@@ -195,8 +195,8 @@
   const base::StringValue new_value("222");
   {
     ValueStoreChangeList changes;
-    changes.push_back(
-        ValueStoreChange("bbb", value.DeepCopy(), new_value.DeepCopy()));
+    changes.push_back(ValueStoreChange("bbb", value.CreateDeepCopy(),
+                                       new_value.CreateDeepCopy()));
     EXPECT_CALL(observer_,
                 OnSettingsChanged(kTestExtensionId,
                                   settings_namespace::MANAGED,
@@ -212,7 +212,8 @@
   // Notify when policies are removed.
   {
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange("bbb", new_value.DeepCopy(), NULL));
+    changes.push_back(
+        ValueStoreChange("bbb", new_value.CreateDeepCopy(), nullptr));
     EXPECT_CALL(observer_,
                 OnSettingsChanged(kTestExtensionId,
                                   settings_namespace::MANAGED,
diff --git a/chrome/browser/extensions/api/storage/syncable_settings_storage.cc b/chrome/browser/extensions/api/storage/syncable_settings_storage.cc
index 543d2b44..1626ff3 100644
--- a/chrome/browser/extensions/api/storage/syncable_settings_storage.cc
+++ b/chrome/browser/extensions/api/storage/syncable_settings_storage.cc
@@ -194,7 +194,7 @@
     std::string key = base::DictionaryValue::Iterator(*local_state).key();
     std::unique_ptr<base::Value> value;
     local_state->RemoveWithoutPathExpansion(key, &value);
-    changes.push_back(ValueStoreChange(key, nullptr, value.release()));
+    changes.push_back(ValueStoreChange(key, nullptr, std::move(value)));
   }
 
   syncer::SyncError error = sync_processor_->SendChanges(changes);
@@ -295,32 +295,32 @@
     switch ((*it)->change_type()) {
       case syncer::SyncChange::ACTION_ADD:
         if (!current_value.get()) {
-          error = OnSyncAdd(key, change_value.release(), &changes);
+          error = OnSyncAdd(key, std::move(change_value), &changes);
         } else {
           // Already a value; hopefully a local change has beaten sync in a
           // race and change's not a bug, so pretend change's an update.
           LOG(WARNING) << "Got add from sync for existing setting " <<
               extension_id_ << "/" << key;
-          error = OnSyncUpdate(key, current_value.release(),
-                               change_value.release(), &changes);
+          error = OnSyncUpdate(key, std::move(current_value),
+                               std::move(change_value), &changes);
         }
         break;
 
       case syncer::SyncChange::ACTION_UPDATE:
         if (current_value.get()) {
-          error = OnSyncUpdate(key, current_value.release(),
-                               change_value.release(), &changes);
+          error = OnSyncUpdate(key, std::move(current_value),
+                               std::move(change_value), &changes);
         } else {
           // Similarly, pretend change's an add.
           LOG(WARNING) << "Got update from sync for nonexistent setting" <<
               extension_id_ << "/" << key;
-          error = OnSyncAdd(key, change_value.release(), &changes);
+          error = OnSyncAdd(key, std::move(change_value), &changes);
         }
         break;
 
       case syncer::SyncChange::ACTION_DELETE:
         if (current_value.get()) {
-          error = OnSyncDelete(key, current_value.release(), &changes);
+          error = OnSyncDelete(key, std::move(current_value), &changes);
         } else {
           // Similarly, ignore change.
           LOG(WARNING) << "Got delete from sync for nonexistent setting " <<
@@ -349,7 +349,7 @@
 
 syncer::SyncError SyncableSettingsStorage::OnSyncAdd(
     const std::string& key,
-    base::Value* new_value,
+    std::unique_ptr<base::Value> new_value,
     ValueStoreChangeList* changes) {
   DCHECK(new_value);
   WriteResult result =
@@ -361,14 +361,14 @@
                            result->status().message.c_str()),
         sync_processor_->type());
   }
-  changes->push_back(ValueStoreChange(key, NULL, new_value));
+  changes->push_back(ValueStoreChange(key, nullptr, std::move(new_value)));
   return syncer::SyncError();
 }
 
 syncer::SyncError SyncableSettingsStorage::OnSyncUpdate(
     const std::string& key,
-    base::Value* old_value,
-    base::Value* new_value,
+    std::unique_ptr<base::Value> old_value,
+    std::unique_ptr<base::Value> new_value,
     ValueStoreChangeList* changes) {
   DCHECK(old_value);
   DCHECK(new_value);
@@ -381,13 +381,14 @@
                            result->status().message.c_str()),
         sync_processor_->type());
   }
-  changes->push_back(ValueStoreChange(key, old_value, new_value));
+  changes->push_back(
+      ValueStoreChange(key, std::move(old_value), std::move(new_value)));
   return syncer::SyncError();
 }
 
 syncer::SyncError SyncableSettingsStorage::OnSyncDelete(
     const std::string& key,
-    base::Value* old_value,
+    std::unique_ptr<base::Value> old_value,
     ValueStoreChangeList* changes) {
   DCHECK(old_value);
   WriteResult result = HandleResult(delegate_->Remove(key));
@@ -398,7 +399,7 @@
                            result->status().message.c_str()),
         sync_processor_->type());
   }
-  changes->push_back(ValueStoreChange(key, old_value, NULL));
+  changes->push_back(ValueStoreChange(key, std::move(old_value), nullptr));
   return syncer::SyncError();
 }
 
diff --git a/chrome/browser/extensions/api/storage/syncable_settings_storage.h b/chrome/browser/extensions/api/storage/syncable_settings_storage.h
index c49b49e..24456e15 100644
--- a/chrome/browser/extensions/api/storage/syncable_settings_storage.h
+++ b/chrome/browser/extensions/api/storage/syncable_settings_storage.h
@@ -98,21 +98,17 @@
       std::unique_ptr<base::DictionaryValue> sync_state,
       std::unique_ptr<base::DictionaryValue> local_state);
 
-  // Called when an Add/Update/Remove comes from sync. Ownership of Value*s
-  // are taken.
-  syncer::SyncError OnSyncAdd(
-      const std::string& key,
-      base::Value* new_value,
-      ValueStoreChangeList* changes);
-  syncer::SyncError OnSyncUpdate(
-      const std::string& key,
-      base::Value* old_value,
-      base::Value* new_value,
-      ValueStoreChangeList* changes);
-  syncer::SyncError OnSyncDelete(
-      const std::string& key,
-      base::Value* old_value,
-      ValueStoreChangeList* changes);
+  // Called when an Add/Update/Remove comes from sync.
+  syncer::SyncError OnSyncAdd(const std::string& key,
+                              std::unique_ptr<base::Value> new_value,
+                              ValueStoreChangeList* changes);
+  syncer::SyncError OnSyncUpdate(const std::string& key,
+                                 std::unique_ptr<base::Value> old_value,
+                                 std::unique_ptr<base::Value> new_value,
+                                 ValueStoreChangeList* changes);
+  syncer::SyncError OnSyncDelete(const std::string& key,
+                                 std::unique_ptr<base::Value> old_value,
+                                 ValueStoreChangeList* changes);
 
   // List of observers to settings changes.
   const scoped_refptr<SettingsObserverList> observers_;
diff --git a/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc b/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc
index c94f9c6..eb2714f 100644
--- a/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc
+++ b/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc
@@ -8,7 +8,6 @@
 #include "base/sys_info.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "chrome/common/channel_info.h"
@@ -171,9 +170,6 @@
 
 void ChromeInternalLogSource::PopulateExtensionInfoLogs(
     SystemLogsResponse* response) {
-  if (!ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled())
-    return;
-
   Profile* primary_profile =
       g_browser_process->profile_manager()->GetPrimaryUserProfile();
   if (!primary_profile)
diff --git a/chrome/browser/history/chrome_history_backend_client.cc b/chrome/browser/history/chrome_history_backend_client.cc
index 7159c12..d41df80e 100644
--- a/chrome/browser/history/chrome_history_backend_client.cc
+++ b/chrome/browser/history/chrome_history_backend_client.cc
@@ -9,6 +9,7 @@
 #include "chrome/common/features.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/version_info/version_info.h"
+#include "content/public/browser/child_process_security_policy.h"
 #include "url/gurl.h"
 
 #if BUILDFLAG(ANDROID_JAVA_UI)
@@ -72,6 +73,11 @@
          channel != version_info::Channel::BETA;
 }
 
+bool ChromeHistoryBackendClient::IsWebSafe(const GURL& url) {
+  return content::ChildProcessSecurityPolicy::GetInstance()->IsWebSafeScheme(
+      url.scheme());
+}
+
 #if BUILDFLAG(ANDROID_JAVA_UI)
 void ChromeHistoryBackendClient::OnHistoryBackendInitialized(
     history::HistoryBackend* history_backend,
diff --git a/chrome/browser/history/chrome_history_backend_client.h b/chrome/browser/history/chrome_history_backend_client.h
index 0a332ad..7d689f5 100644
--- a/chrome/browser/history/chrome_history_backend_client.h
+++ b/chrome/browser/history/chrome_history_backend_client.h
@@ -24,6 +24,7 @@
   bool IsBookmarked(const GURL& url) override;
   void GetBookmarks(std::vector<history::URLAndTitle>* bookmarks) override;
   bool ShouldReportDatabaseError() override;
+  bool IsWebSafe(const GURL& url) override;
 #if defined(OS_ANDROID)
   void OnHistoryBackendInitialized(
       history::HistoryBackend* history_backend,
diff --git a/chrome/browser/image_decoder.cc b/chrome/browser/image_decoder.cc
index 0d4e14d..a2384bf 100644
--- a/chrome/browser/image_decoder.cc
+++ b/chrome/browser/image_decoder.cc
@@ -237,7 +237,7 @@
   FailAllRequests();
 }
 
-void ImageDecoder::OnProcessLaunchFailed() {
+void ImageDecoder::OnProcessLaunchFailed(int error_code) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   FailAllRequests();
 }
diff --git a/chrome/browser/image_decoder.h b/chrome/browser/image_decoder.h
index 5e2845d..1808eac 100644
--- a/chrome/browser/image_decoder.h
+++ b/chrome/browser/image_decoder.h
@@ -129,7 +129,7 @@
 
   // Overidden from UtilityProcessHostClient.
   void OnProcessCrashed(int exit_code) override;
-  void OnProcessLaunchFailed() override;
+  void OnProcessLaunchFailed(int error_code) override;
   bool OnMessageReceived(const IPC::Message& message) override;
 
   // IPC message handlers.
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc
index 0351b5c..b78faf7 100644
--- a/chrome/browser/io_thread.cc
+++ b/chrome/browser/io_thread.cc
@@ -412,7 +412,8 @@
     globals_->system_request_context->AssertNoURLRequests();
 }
 
-IOThread::Globals::Globals() : system_request_context_leak_checker(this) {}
+IOThread::Globals::Globals() : system_request_context_leak_checker(this),
+                               enable_brotli(false) {}
 
 IOThread::Globals::~Globals() {}
 
@@ -802,7 +803,7 @@
           switches::kEnableUserAlternateProtocolPorts)) {
     params_.enable_user_alternate_protocol_ports = true;
   }
-  params_.enable_brotli =
+  globals_->enable_brotli =
       base::FeatureList::IsEnabled(features::kBrotliEncoding);
   params_.enable_token_binding =
       base::FeatureList::IsEnabled(features::kTokenBinding);
@@ -1669,6 +1670,8 @@
   context->set_http_server_properties(
       globals->http_server_properties->GetWeakPtr());
 
+  context->set_enable_brotli(globals->enable_brotli);
+
   net::HttpNetworkSession::Params system_params(params);
   net::URLRequestContextBuilder::SetHttpNetworkSessionComponents(
       context, &system_params);
@@ -1718,6 +1721,8 @@
   context->set_http_server_properties(
       globals->http_server_properties->GetWeakPtr());
 
+  context->set_enable_brotli(globals->enable_brotli);
+
   net::HttpNetworkSession::Params session_params(params);
   net::URLRequestContextBuilder::SetHttpNetworkSessionComponents(
       context, &session_params);
diff --git a/chrome/browser/io_thread.h b/chrome/browser/io_thread.h
index 2922a2b..9dad42f 100644
--- a/chrome/browser/io_thread.h
+++ b/chrome/browser/io_thread.h
@@ -183,6 +183,9 @@
     // main frame load fails with a DNS error in order to provide more useful
     // information to the renderer so it can show a more specific error page.
     std::unique_ptr<chrome_browser_net::DnsProbeService> dns_probe_service;
+
+    // Enables Brotli Content-Encoding support
+    bool enable_brotli;
   };
 
   // Helper class to configure HttpNetworkSession::Params and
diff --git a/chrome/browser/manifest/manifest_icon_downloader.h b/chrome/browser/manifest/manifest_icon_downloader.h
index 4967ad5..ec7a66a 100644
--- a/chrome/browser/manifest/manifest_icon_downloader.h
+++ b/chrome/browser/manifest/manifest_icon_downloader.h
@@ -9,7 +9,8 @@
 
 #include "base/callback_forward.h"
 #include "base/macros.h"
-#include "third_party/skia/include/core/SkBitmap.h"
+
+class SkBitmap;
 
 namespace content {
 class WebContents;
diff --git a/chrome/browser/manifest/manifest_icon_downloader_unittest.cc b/chrome/browser/manifest/manifest_icon_downloader_unittest.cc
index 18d69d1..8835095 100644
--- a/chrome/browser/manifest/manifest_icon_downloader_unittest.cc
+++ b/chrome/browser/manifest/manifest_icon_downloader_unittest.cc
@@ -9,6 +9,7 @@
 
 #include "base/macros.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/skia/include/core/SkBitmap.h"
 
 class ManifestIconDownloaderTest : public testing::Test  {
  protected:
diff --git a/chrome/browser/media/cast_transport_host_filter.cc b/chrome/browser/media/cast_transport_host_filter.cc
index 33d7f2e..7c5ac3e 100644
--- a/chrome/browser/media/cast_transport_host_filter.cc
+++ b/chrome/browser/media/cast_transport_host_filter.cc
@@ -58,6 +58,44 @@
       new CastMsg_ReceivedPacket(channel_id_, *packet));
 }
 
+class RtcpClient : public media::cast::RtcpObserver {
+ public:
+  RtcpClient(
+      int32_t channel_id,
+      uint32_t rtp_sender_ssrc,
+      base::WeakPtr<cast::CastTransportHostFilter> cast_transport_host_filter)
+      : channel_id_(channel_id),
+        rtp_sender_ssrc_(rtp_sender_ssrc),
+        cast_transport_host_filter_(cast_transport_host_filter) {}
+
+  void OnReceivedCastMessage(
+      const media::cast::RtcpCastMessage& cast_message) override {
+    if (cast_transport_host_filter_)
+      cast_transport_host_filter_->Send(new CastMsg_RtcpCastMessage(
+          channel_id_, rtp_sender_ssrc_, cast_message));
+  }
+
+  void OnReceivedRtt(base::TimeDelta round_trip_time) override {
+    if (cast_transport_host_filter_)
+      cast_transport_host_filter_->Send(
+          new CastMsg_Rtt(channel_id_, rtp_sender_ssrc_, round_trip_time));
+  }
+
+  void OnReceivedPli() override {
+    if (cast_transport_host_filter_)
+      cast_transport_host_filter_->Send(
+          new CastMsg_Pli(channel_id_, rtp_sender_ssrc_));
+  }
+
+ private:
+  const int32_t channel_id_;
+  const uint32_t rtp_sender_ssrc_;
+  const base::WeakPtr<cast::CastTransportHostFilter>
+      cast_transport_host_filter_;
+
+  DISALLOW_COPY_AND_ASSIGN(RtcpClient);
+};
+
 }  // namespace
 
 namespace cast {
@@ -103,24 +141,6 @@
   return handled;
 }
 
-void CastTransportHostFilter::SendRtt(int32_t channel_id,
-                                      uint32_t rtp_sender_ssrc,
-                                      base::TimeDelta rtt) {
-  Send(new CastMsg_Rtt(channel_id, rtp_sender_ssrc, rtt));
-}
-
-void CastTransportHostFilter::SendCastMessage(
-    int32_t channel_id,
-    uint32_t rtp_sender_ssrc,
-    const media::cast::RtcpCastMessage& cast_message) {
-  Send(new CastMsg_RtcpCastMessage(channel_id, rtp_sender_ssrc, cast_message));
-}
-
-void CastTransportHostFilter::SendReceivedPli(int32_t channel_id,
-                                              uint32_t rtp_sender_ssrc) {
-  Send(new CastMsg_Pli(channel_id, rtp_sender_ssrc));
-}
-
 void CastTransportHostFilter::OnNew(int32_t channel_id,
                                     const net::IPEndPoint& local_end_point,
                                     const net::IPEndPoint& remote_end_point,
@@ -171,18 +191,16 @@
   }
 }
 
+// TODO(xjz): Replace all the separate "init/start audio" and "init/start video"
+// methods with a single "init/start rtp stream" that handles either media type.
 void CastTransportHostFilter::OnInitializeAudio(
     int32_t channel_id,
     const media::cast::CastTransportRtpConfig& config) {
   media::cast::CastTransport* sender = id_map_.Lookup(channel_id);
   if (sender) {
     sender->InitializeAudio(
-        config, base::Bind(&CastTransportHostFilter::SendCastMessage,
-                           weak_factory_.GetWeakPtr(), channel_id, config.ssrc),
-        base::Bind(&CastTransportHostFilter::SendRtt,
-                   weak_factory_.GetWeakPtr(), channel_id, config.ssrc),
-        base::Bind(&CastTransportHostFilter::SendReceivedPli,
-                   weak_factory_.GetWeakPtr(), channel_id, config.ssrc));
+        config, base::WrapUnique(new RtcpClient(channel_id, config.ssrc,
+                                                weak_factory_.GetWeakPtr())));
   } else {
     DVLOG(1)
         << "CastTransportHostFilter::OnInitializeAudio on non-existing channel";
@@ -195,12 +213,8 @@
   media::cast::CastTransport* sender = id_map_.Lookup(channel_id);
   if (sender) {
     sender->InitializeVideo(
-        config, base::Bind(&CastTransportHostFilter::SendCastMessage,
-                           weak_factory_.GetWeakPtr(), channel_id, config.ssrc),
-        base::Bind(&CastTransportHostFilter::SendRtt,
-                   weak_factory_.GetWeakPtr(), channel_id, config.ssrc),
-        base::Bind(&CastTransportHostFilter::SendReceivedPli,
-                   weak_factory_.GetWeakPtr(), channel_id, config.ssrc));
+        config, base::WrapUnique(new RtcpClient(channel_id, config.ssrc,
+                                                weak_factory_.GetWeakPtr())));
   } else {
     DVLOG(1)
         << "CastTransportHostFilter::OnInitializeVideo on non-existing channel";
diff --git a/chrome/browser/media/cast_transport_host_filter.h b/chrome/browser/media/cast_transport_host_filter.h
index 2fde3c49..ad9818e0 100644
--- a/chrome/browser/media/cast_transport_host_filter.h
+++ b/chrome/browser/media/cast_transport_host_filter.h
@@ -35,13 +35,6 @@
   // Status callback to create UdpTransport.
   void OnStatusChanged(int32_t channel_id,
                        media::cast::CastTransportStatus status);
-  void SendRtt(int32_t channel_id,
-               uint32_t rtp_sender_ssrc,
-               base::TimeDelta rtt);
-  void SendCastMessage(int32_t channel_id,
-                       uint32_t rtp_sender_ssrc,
-                       const media::cast::RtcpCastMessage& cast_message);
-  void SendReceivedPli(int32_t channel_id, uint32_t rtp_sender_ssrc);
 
   // BrowserMessageFilter implementation.
   bool OnMessageReceived(const IPC::Message& message) override;
diff --git a/chrome/browser/media/router/OWNERS b/chrome/browser/media/router/OWNERS
index 6de7ca9..14c8ad2a 100644
--- a/chrome/browser/media/router/OWNERS
+++ b/chrome/browser/media/router/OWNERS
@@ -1,7 +1,6 @@
-# Until upstreaming is complete, substantial changes should also be reviewed by
-# someone in chrome/browser/media/OWNERS.
-
 imcheng@chromium.org
-kmarshall@chromium.org
+apacible@chromium.org
 mfoltz@chromium.org
+
+# Fallback OWNER, if others are not available.
 wez@chromium.org
diff --git a/chrome/browser/media/webrtc_browsertest.cc b/chrome/browser/media/webrtc_browsertest.cc
index 8d6398b..c7defc6 100644
--- a/chrome/browser/media/webrtc_browsertest.cc
+++ b/chrome/browser/media/webrtc_browsertest.cc
@@ -23,6 +23,12 @@
 static const char kMainWebrtcTestHtmlPage[] =
     "/webrtc/webrtc_jsep01_test.html";
 
+static const char kKeygenAlgorithmRsa[] =
+    "{ name: \"RSASSA-PKCS1-v1_5\", modulusLength: 2048, publicExponent: "
+    "new Uint8Array([1, 0, 1]), hash: \"SHA-256\" }";
+static const char kKeygenAlgorithmEcdsa[] =
+    "{ name: \"ECDSA\", namedCurve: \"P-256\" }";
+
 // Top-level integration test for WebRTC. It always uses fake devices; see
 // WebRtcWebcamBrowserTest for a test that acquires any real webcam on the
 // system.
@@ -44,8 +50,11 @@
   }
 
   void RunsAudioVideoWebRTCCallInTwoTabs(
-      std::string certificate_keygen_algorithm,
-      std::string video_codec) {
+      const std::string& video_codec = WebRtcTestBase::kUseDefaultVideoCodec,
+      const std::string& offer_cert_keygen_alg =
+          WebRtcTestBase::kUseDefaultCertKeygen,
+      const std::string& answer_cert_keygen_alg =
+          WebRtcTestBase::kUseDefaultCertKeygen) {
     if (OnWinXp()) return;
 
     ASSERT_TRUE(embedded_test_server()->Start());
@@ -55,8 +64,8 @@
     content::WebContents* right_tab =
         OpenTestPageAndGetUserMediaInNewTab(kMainWebrtcTestHtmlPage);
 
-    SetupPeerconnectionWithLocalStream(left_tab, certificate_keygen_algorithm);
-    SetupPeerconnectionWithLocalStream(right_tab, certificate_keygen_algorithm);
+    SetupPeerconnectionWithLocalStream(left_tab, offer_cert_keygen_alg);
+    SetupPeerconnectionWithLocalStream(right_tab, answer_cert_keygen_alg);
 
     NegotiateCall(left_tab, right_tab, video_codec);
 
@@ -75,30 +84,41 @@
 };
 
 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest,
-                       RunsAudioVideoWebRTCCallInTwoTabsRSACertificate) {
-  RunsAudioVideoWebRTCCallInTwoTabs(
-      "{ name: \"RSASSA-PKCS1-v1_5\", modulusLength: 2048, publicExponent: "
-      "new Uint8Array([1, 0, 1]), hash: \"SHA-256\" }",
-      WebRtcTestBase::kUseDefaultVideoCodec);
+                       RunsAudioVideoWebRTCCallInTwoTabsOfferRsaAnswerRsa) {
+  RunsAudioVideoWebRTCCallInTwoTabs(WebRtcTestBase::kUseDefaultVideoCodec,
+                                    kKeygenAlgorithmRsa,
+                                    kKeygenAlgorithmRsa);
 }
 
 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest,
-                       RunsAudioVideoWebRTCCallInTwoTabsECDSACertificate) {
-  RunsAudioVideoWebRTCCallInTwoTabs(
-      "{ name: \"ECDSA\", namedCurve: \"P-256\" }",
-      WebRtcTestBase::kUseDefaultVideoCodec);
+                       RunsAudioVideoWebRTCCallInTwoTabsOfferEcdsaAnswerEcdsa) {
+  RunsAudioVideoWebRTCCallInTwoTabs(WebRtcTestBase::kUseDefaultVideoCodec,
+                                    kKeygenAlgorithmEcdsa,
+                                    kKeygenAlgorithmEcdsa);
+}
+
+IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest,
+                       RunsAudioVideoWebRTCCallInTwoTabsOfferRsaAnswerEcdsa) {
+  RunsAudioVideoWebRTCCallInTwoTabs(WebRtcTestBase::kUseDefaultVideoCodec,
+                                    kKeygenAlgorithmRsa,
+                                    kKeygenAlgorithmEcdsa);
+}
+
+IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest,
+                       RunsAudioVideoWebRTCCallInTwoTabsOfferEcdsaAnswerRsa) {
+  RunsAudioVideoWebRTCCallInTwoTabs(WebRtcTestBase::kUseDefaultVideoCodec,
+                                    kKeygenAlgorithmEcdsa,
+                                    kKeygenAlgorithmRsa);
 }
 
 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest,
                        RunsAudioVideoWebRTCCallInTwoTabsVP8) {
-  RunsAudioVideoWebRTCCallInTwoTabs(
-      WebRtcTestBase::kUseDefaultCertKeygen, "VP8");
+  RunsAudioVideoWebRTCCallInTwoTabs("VP8");
 }
 
 IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest,
                        RunsAudioVideoWebRTCCallInTwoTabsVP9) {
-  RunsAudioVideoWebRTCCallInTwoTabs(
-      WebRtcTestBase::kUseDefaultCertKeygen, "VP9");
+  RunsAudioVideoWebRTCCallInTwoTabs("VP9");
 }
 
 #if BUILDFLAG(RTC_USE_H264)
@@ -112,8 +132,7 @@
         "(test \"OK\")";
     return;
   }
-  RunsAudioVideoWebRTCCallInTwoTabs(
-      WebRtcTestBase::kUseDefaultCertKeygen, "H264");
+  RunsAudioVideoWebRTCCallInTwoTabs("H264");
 }
 
 #endif  // BUILDFLAG(RTC_USE_H264)
diff --git a/chrome/browser/ntp_snippets/ntp_snippets_service_factory.cc b/chrome/browser/ntp_snippets/ntp_snippets_service_factory.cc
index 779cc2d5..13b8c4c 100644
--- a/chrome/browser/ntp_snippets/ntp_snippets_service_factory.cc
+++ b/chrome/browser/ntp_snippets/ntp_snippets_service_factory.cc
@@ -75,7 +75,7 @@
       profile->GetPrefs(), suggestions_service, task_runner,
       g_browser_process->GetApplicationLocale(), scheduler,
       base::WrapUnique(new ntp_snippets::NTPSnippetsFetcher(
-          task_runner, request_context,
+          request_context,
           chrome::GetChannel() == version_info::Channel::STABLE)),
       base::Bind(&safe_json::SafeJsonParser::Parse));
 }
diff --git a/chrome/browser/page_load_metrics/observers/document_write_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/document_write_page_load_metrics_observer.cc
index a26c8ba..87cd9e5 100644
--- a/chrome/browser/page_load_metrics/observers/document_write_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/document_write_page_load_metrics_observer.cc
@@ -61,13 +61,15 @@
     const page_load_metrics::PageLoadExtraInfo& info) {
   bool foreground_paint = WasStartedInForegroundEventInForeground(
       timing.first_contentful_paint, info);
-  if (foreground_paint) {
-    PAGE_LOAD_HISTOGRAM(internal::kHistogramDocWriteFirstContentfulPaint,
-                        timing.first_contentful_paint);
-  } else {
-    PAGE_LOAD_HISTOGRAM(
-        internal::kBackgroundHistogramDocWriteFirstContentfulPaint,
-        timing.first_contentful_paint);
+  if (!timing.first_contentful_paint.is_zero()) {
+    if (foreground_paint) {
+      PAGE_LOAD_HISTOGRAM(internal::kHistogramDocWriteFirstContentfulPaint,
+                          timing.first_contentful_paint);
+    } else {
+      PAGE_LOAD_HISTOGRAM(
+          internal::kBackgroundHistogramDocWriteFirstContentfulPaint,
+          timing.first_contentful_paint);
+    }
   }
 
   // Log parse based metrics.
diff --git a/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer.cc
index 97bc2d2..8a47c21 100644
--- a/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer.cc
@@ -34,14 +34,16 @@
 void ServiceWorkerPageLoadMetricsObserver::LogServiceWorkerHistograms(
     const page_load_metrics::PageLoadTiming& timing,
     const page_load_metrics::PageLoadExtraInfo& info) {
-  bool foreground_paint = WasStartedInForegroundEventInForeground(
-      timing.first_contentful_paint, info);
-  if (foreground_paint) {
-    PAGE_LOAD_HISTOGRAM(internal::kHistogramServiceWorkerFirstContentfulPaint,
-                        timing.first_contentful_paint);
-  } else {
-    PAGE_LOAD_HISTOGRAM(
-        internal::kBackgroundHistogramServiceWorkerFirstContentfulPaint,
-        timing.first_contentful_paint);
+  if (!timing.first_contentful_paint.is_zero()) {
+    bool foreground_paint = WasStartedInForegroundEventInForeground(
+        timing.first_contentful_paint, info);
+    if (foreground_paint) {
+      PAGE_LOAD_HISTOGRAM(internal::kHistogramServiceWorkerFirstContentfulPaint,
+                          timing.first_contentful_paint);
+    } else {
+      PAGE_LOAD_HISTOGRAM(
+          internal::kBackgroundHistogramServiceWorkerFirstContentfulPaint,
+          timing.first_contentful_paint);
+    }
   }
 }
diff --git a/chrome/browser/platform_util.h b/chrome/browser/platform_util.h
index 81cb4b8..596232f 100644
--- a/chrome/browser/platform_util.h
+++ b/chrome/browser/platform_util.h
@@ -37,7 +37,13 @@
 };
 
 // Type of item that is the target of the OpenItem() call.
-enum OpenItemType { OPEN_FILE, OPEN_FOLDER };
+enum OpenItemType {
+  OPEN_FILE,
+  OPEN_FOLDER,
+#if defined(OS_LINUX)
+  SHOW_ITEM_IN_FOLDER
+#endif
+};
 
 // Callback used with OpenFile and OpenFolder.
 typedef base::Callback<void(OpenOperationResult)> OpenOperationCallback;
diff --git a/chrome/browser/platform_util_linux.cc b/chrome/browser/platform_util_linux.cc
index 5fd8fbbb..340d8ab 100644
--- a/chrome/browser/platform_util_linux.cc
+++ b/chrome/browser/platform_util_linux.cc
@@ -5,10 +5,13 @@
 #include "chrome/browser/platform_util.h"
 
 #include "base/bind.h"
+#include "base/command_line.h"
 #include "base/files/file_util.h"
 #include "base/process/kill.h"
 #include "base/process/launch.h"
+#include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/version.h"
 #include "chrome/browser/platform_util_internal.h"
 #include "content/public/browser/browser_thread.h"
 #include "url/gurl.h"
@@ -19,11 +22,15 @@
 
 namespace {
 
-void XDGUtil(const std::string& util,
-             const base::FilePath& working_directory,
-             const std::string& arg) {
+const char kNautilusKey[] = "nautilus.desktop";
+const char kNautilusCmd[] = "nautilus";
+const char kSupportedNautilusVersion[] = "3.0.2";
+
+void RunCommand(const std::string& command,
+                const base::FilePath& working_directory,
+                const std::string& arg) {
   std::vector<std::string> argv;
-  argv.push_back(util);
+  argv.push_back(command);
   argv.push_back(arg);
 
   base::LaunchOptions options;
@@ -49,11 +56,76 @@
 }
 
 void XDGOpen(const base::FilePath& working_directory, const std::string& path) {
-  XDGUtil("xdg-open", working_directory, path);
+  RunCommand("xdg-open", working_directory, path);
 }
 
 void XDGEmail(const std::string& email) {
-  XDGUtil("xdg-email", base::FilePath(), email);
+  RunCommand("xdg-email", base::FilePath(), email);
+}
+
+void ShowFileInNautilus(const base::FilePath& working_directory,
+                        const std::string& path) {
+  RunCommand(kNautilusCmd, working_directory, path);
+}
+
+std::string GetNautilusVersion() {
+  std::string output;
+  std::string found_version;
+
+  base::CommandLine nautilus_cl((base::FilePath(kNautilusCmd)));
+  nautilus_cl.AppendArg("--version");
+
+  if (base::GetAppOutputAndError(nautilus_cl, &output)) {
+    // It is assumed that "nautilus --version" returns something like
+    // "GNOME nautilus 3.14.2". First, find the position of the first char of
+    // "nautilus " and skip the whole string to get the position of
+    // version in the |output| string.
+    size_t nautilus_position = output.find("nautilus ");
+    size_t version_position = nautilus_position + strlen("nautilus ");
+    if (nautilus_position != std::string::npos) {
+      found_version = output.substr(version_position);
+      base::TrimWhitespaceASCII(found_version,
+                                base::TRIM_TRAILING,
+                                &found_version);
+    }
+  }
+  return found_version;
+}
+
+bool CheckNautilusIsDefault() {
+  std::string file_browser;
+
+  base::CommandLine xdg_mime(base::FilePath("xdg-mime"));
+  xdg_mime.AppendArg("query");
+  xdg_mime.AppendArg("default");
+  xdg_mime.AppendArg("inode/directory");
+
+  bool success = base::GetAppOutputAndError(xdg_mime, &file_browser);
+  base::TrimWhitespaceASCII(file_browser,
+                            base::TRIM_TRAILING,
+                            &file_browser);
+
+  if (!success || file_browser != kNautilusKey)
+    return false;
+
+  const base::Version supported_version(kSupportedNautilusVersion);
+  DCHECK(supported_version.IsValid());
+  const base::Version current_version(GetNautilusVersion());
+  return current_version.IsValid() && current_version >= supported_version;
+}
+
+void ShowItem(Profile* profile,
+              const base::FilePath& full_path,
+              bool use_nautilus_file_browser) {
+  if (use_nautilus_file_browser) {
+    OpenItem(profile, full_path, SHOW_ITEM_IN_FOLDER, OpenOperationCallback());
+  } else {
+    // TODO(estade): It would be nice to be able to select the file in other
+    // file managers, but that probably requires extending xdg-open.
+    // For now just show the folder for non-Nautilus users.
+    OpenItem(profile, full_path.DirName(), OPEN_FOLDER,
+             OpenOperationCallback());
+  }
 }
 
 }  // namespace
@@ -75,16 +147,20 @@
       // time the application invoked by xdg-open inspects the path by name.
       XDGOpen(path, ".");
       break;
+    case SHOW_ITEM_IN_FOLDER:
+      ShowFileInNautilus(path.DirName(), path.value());
+      break;
   }
 }
+
 }  // namespace internal
 
 void ShowItemInFolder(Profile* profile, const base::FilePath& full_path) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  // TODO(estade): It would be nice to be able to select the file in the file
-  // manager, but that probably requires extending xdg-open. For now just show
-  // the folder.
-  OpenItem(profile, full_path.DirName(), OPEN_FOLDER, OpenOperationCallback());
+  base::PostTaskAndReplyWithResult(content::BrowserThread::GetBlockingPool(),
+                                   FROM_HERE,
+                                   base::Bind(&CheckNautilusIsDefault),
+                                   base::Bind(&ShowItem, profile, full_path));
 }
 
 void OpenExternal(Profile* profile, const GURL& url) {
diff --git a/chrome/browser/platform_util_win.cc b/chrome/browser/platform_util_win.cc
index 8632681c..73701047 100644
--- a/chrome/browser/platform_util_win.cc
+++ b/chrome/browser/platform_util_win.cc
@@ -16,7 +16,6 @@
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/metrics/field_trial.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/win/registry.h"
@@ -25,11 +24,8 @@
 #include "base/win/windows_version.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
 #include "chrome/browser/platform_util_internal.h"
-#include "chrome/common/chrome_utility_messages.h"
 #include "chrome/grit/generated_resources.h"
 #include "content/public/browser/browser_thread.h"
-#include "content/public/browser/utility_process_host.h"
-#include "content/public/browser/utility_process_host_client.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/win/shell.h"
 #include "ui/gfx/native_widget_types.h"
@@ -41,8 +37,6 @@
 
 namespace {
 
-// TODO(asanka): Move this to ui/base/win/shell.{h,cc} and invoke it from the
-// utility process.
 void ShowItemInFolderOnFileThread(const base::FilePath& full_path) {
   DCHECK_CURRENTLY_ON(BrowserThread::FILE);
   base::FilePath dir = full_path.DirName().AsEndingWithSeparator();
@@ -167,26 +161,6 @@
   }
 }
 
-void OpenItemViaShellInUtilityProcess(const base::FilePath& full_path,
-                                      OpenItemType type) {
-  base::WeakPtr<content::UtilityProcessHost> utility_process_host(
-      content::UtilityProcessHost::Create(NULL, NULL)->AsWeakPtr());
-  utility_process_host->SetName(l10n_util::GetStringUTF16(
-      IDS_UTILITY_PROCESS_FILE_DIALOG_NAME));
-  utility_process_host->DisableSandbox();
-  switch (type) {
-    case OPEN_FILE:
-      utility_process_host->Send(
-          new ChromeUtilityMsg_OpenFileViaShell(full_path));
-      return;
-
-    case OPEN_FOLDER:
-      utility_process_host->Send(
-          new ChromeUtilityMsg_OpenFolderViaShell(full_path));
-      return;
-  }
-}
-
 }  // namespace
 
 void ShowItemInFolder(Profile* profile, const base::FilePath& full_path) {
@@ -197,21 +171,14 @@
 namespace internal {
 
 void PlatformOpenVerifiedItem(const base::FilePath& path, OpenItemType type) {
-  if (base::FieldTrialList::FindFullName("IsolateShellOperations") ==
-      "Enabled") {
-    BrowserThread::PostTask(
-        BrowserThread::IO, FROM_HERE,
-        base::Bind(&OpenItemViaShellInUtilityProcess, path, type));
-  } else {
-    switch (type) {
-      case OPEN_FILE:
-        ui::win::OpenFileViaShell(path);
-        break;
+  switch (type) {
+    case OPEN_FILE:
+      ui::win::OpenFileViaShell(path);
+      break;
 
-      case OPEN_FOLDER:
-        ui::win::OpenFolderViaShell(path);
-        break;
-    }
+    case OPEN_FOLDER:
+      ui::win::OpenFolderViaShell(path);
+      break;
   }
 }
 
diff --git a/chrome/browser/printing/pdf_to_emf_converter.cc b/chrome/browser/printing/pdf_to_emf_converter.cc
index bcc4e3a..70f0cb86 100644
--- a/chrome/browser/printing/pdf_to_emf_converter.cc
+++ b/chrome/browser/printing/pdf_to_emf_converter.cc
@@ -113,7 +113,7 @@
 
   // UtilityProcessHostClient implementation.
   void OnProcessCrashed(int exit_code) override;
-  void OnProcessLaunchFailed() override;
+  void OnProcessLaunchFailed(int exit_code) override;
   bool OnMessageReceived(const IPC::Message& message) override;
 
  private:
@@ -425,7 +425,7 @@
   OnFailed();
 }
 
-void PdfToEmfUtilityProcessHostClient::OnProcessLaunchFailed() {
+void PdfToEmfUtilityProcessHostClient::OnProcessLaunchFailed(int exit_code) {
   OnFailed();
 }
 
diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc
index f6f2233..7dafaaf 100644
--- a/chrome/browser/profiles/profile_io_data.cc
+++ b/chrome/browser/profiles/profile_io_data.cc
@@ -1033,6 +1033,8 @@
   main_request_context_.reset(new net::URLRequestContext());
   extensions_request_context_.reset(new net::URLRequestContext());
 
+  main_request_context_->set_enable_brotli(io_thread_globals->enable_brotli);
+
   std::unique_ptr<ChromeNetworkDelegate> network_delegate(
       new ChromeNetworkDelegate(
 #if defined(ENABLE_EXTENSIONS)
diff --git a/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc b/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc
index d42d630..73cf08b 100644
--- a/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc
+++ b/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc
@@ -13,6 +13,7 @@
 #include "base/guid.h"
 #include "base/logging.h"
 #include "base/metrics/field_trial.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
@@ -32,6 +33,8 @@
 #include "chrome/browser/renderer_host/safe_browsing_resource_throttle.h"
 #include "chrome/browser/renderer_host/thread_hop_resource_throttle.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
+#include "chrome/browser/search/search.h"
+#include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/browser/signin/chrome_signin_helper.h"
 #include "chrome/browser/tab_contents/tab_util.h"
 #include "chrome/browser/ui/login/login_handler.h"
@@ -42,6 +45,8 @@
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h"
 #include "components/google/core/browser/google_util.h"
 #include "components/policy/core/common/cloud/policy_header_io_helper.h"
+#include "components/search_engines/template_url_prepopulate_data.h"
+#include "components/search_engines/template_url_service.h"
 #include "components/variations/net/variations_http_headers.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_service.h"
@@ -263,6 +268,68 @@
 }
 #endif  // !defined(DISABLE_NACL)
 
+// This function is called in RequestComplete to log metrics about main frame
+// resources.
+void LogMainFrameMetricsOnUIThread(
+    const GURL& url,
+    int net_error,
+    base::TimeDelta request_loading_time,
+    const content::ResourceRequestInfo::WebContentsGetter&
+        web_contents_getter) {
+  content::WebContents* web_contents = web_contents_getter.Run();
+  if (!web_contents)
+    return;
+  Profile* profile =
+      Profile::FromBrowserContext(web_contents->GetBrowserContext());
+
+  // The rest of the function is only concerned about NTP metrics.
+  if (!profile || !search::IsNTPURL(url, profile))
+    return;
+
+  // A http/s scheme implies that the new tab page is remote. The local NTP is
+  // served from chrome-search://. To segment out remote NTPs, use the
+  // TemplateURLService to find the default search engine. Note that if the
+  // default search engine does not have a remote NTP, then the local NTP will
+  // be shown. As of April 2016, only Bing and Google have remote NTPs.
+  if (url.SchemeIsHTTPOrHTTPS()) {
+    TemplateURLService* template_url_service =
+        TemplateURLServiceFactory::GetForProfile(profile);
+    if (!template_url_service)
+      return;
+    TemplateURL* default_provider =
+        template_url_service->GetDefaultSearchProvider();
+    if (!default_provider)
+      return;
+    if (TemplateURLPrepopulateData::GetEngineType(
+            *default_provider, template_url_service->search_terms_data()) ==
+        SearchEngineType::SEARCH_ENGINE_GOOGLE) {
+      if (net_error == net::OK) {
+        UMA_HISTOGRAM_LONG_TIMES("Net.NTP.Google.RequestTime2.Success",
+                                 request_loading_time);
+      } else if (net_error == net::ERR_ABORTED) {
+        UMA_HISTOGRAM_LONG_TIMES("Net.NTP.Google.RequestTime2.ErrAborted",
+                                 request_loading_time);
+      }
+    } else {
+      if (net_error == net::OK) {
+        UMA_HISTOGRAM_LONG_TIMES("Net.NTP.ThirdParty.RequestTime2.Success",
+                                 request_loading_time);
+      } else if (net_error == net::ERR_ABORTED) {
+        UMA_HISTOGRAM_LONG_TIMES("Net.NTP.ThirdParty.RequestTime2.ErrAborted",
+                                 request_loading_time);
+      }
+    }
+  } else {
+    if (net_error == net::OK) {
+      UMA_HISTOGRAM_LONG_TIMES("Net.NTP.Local.RequestTime2.Success",
+                               request_loading_time);
+    } else if (net_error == net::ERR_ABORTED) {
+      UMA_HISTOGRAM_LONG_TIMES("Net.NTP.Local.RequestTime2.ErrAborted",
+                               request_loading_time);
+    }
+  }
+}
+
 }  // namespace
 
 ChromeResourceDispatcherHostDelegate::ChromeResourceDispatcherHostDelegate()
@@ -702,6 +769,16 @@
                                        info->GetWebContentsGetterForRequest(),
                                        url_request->GetTotalReceivedBytes()));
   }
+
+  if (url_request &&
+      info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME) {
+    BrowserThread::PostTask(
+        BrowserThread::UI, FROM_HERE,
+        base::Bind(&LogMainFrameMetricsOnUIThread, url_request->url(),
+                   url_request->status().error(),
+                   base::TimeTicks::Now() - url_request->creation_time(),
+                   info->GetWebContentsGetterForRequest()));
+  }
 }
 
 bool ChromeResourceDispatcherHostDelegate::ShouldEnableLoFiMode(
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox.gni b/chrome/browser/resources/chromeos/chromevox/chromevox.gni
index b5535cb19..fa6490bb 100644
--- a/chrome/browser/resources/chromeos/chromevox/chromevox.gni
+++ b/chrome/browser/resources/chromeos/chromevox/chromevox.gni
@@ -123,6 +123,7 @@
   "common/traverse_table.js",
   "common/traverse_util.js",
   "common/xpath_util.js",
+  "cvox2/background/automation_object_constructor_installer.js",
   "cvox2/background/automation_predicate.js",
   "cvox2/background/automation_util.js",
   "cvox2/background/background.js",
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/background.js b/chrome/browser/resources/chromeos/chromevox/chromevox/background/background.js
index 1f1fbfb..c638a80 100644
--- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/background.js
+++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/background.js
@@ -160,8 +160,7 @@
   if (!cvox.ChromeVox.earcons)
     cvox.ChromeVox.earcons = new cvox.ClassicEarcons();
 
-  if (cvox.ChromeVox.isChromeOS &&
-      chrome.accessibilityPrivate.onIntroduceChromeVox) {
+  if (cvox.ChromeVox.isChromeOS) {
     chrome.accessibilityPrivate.onIntroduceChromeVox.addListener(
         this.onIntroduceChromeVox);
   }
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/tabs_api_handler.js b/chrome/browser/resources/chromeos/chromevox/chromevox/background/tabs_api_handler.js
index 2b07f2f..e9e9e4f 100644
--- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/tabs_api_handler.js
+++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/tabs_api_handler.js
@@ -199,7 +199,7 @@
 
     chrome.automation.getTree(tabId, function(node) {
       if (this.handler_)
-        this.handler_.unregister();
+        this.handler_.removeAllListeners();
 
       this.handler_ = new TabsAutomationHandler(node);
     }.bind(this));
diff --git a/chrome/browser/resources/chromeos/chromevox/common/chrome_extension_externs.js b/chrome/browser/resources/chromeos/chromevox/common/chrome_extension_externs.js
index 59f47e8a..a4ed705 100644
--- a/chrome/browser/resources/chromeos/chromevox/common/chrome_extension_externs.js
+++ b/chrome/browser/resources/chromeos/chromevox/common/chrome_extension_externs.js
@@ -285,8 +285,10 @@
 
 /**
  * @constructor
+ * @param {chrome.automation.EventType} type
+ * @param {chrome.automation.AutomationNode} node
  */
-chrome.automation.AutomationEvent = function() {};
+chrome.automation.AutomationEvent = function(type, node) {};
 
 /**
  * @type {!chrome.automation.AutomationNode}
@@ -603,5 +605,10 @@
  */
 chrome.automation.focusOffset;
 
+/**
+ * @type {(chrome.automation.AutomationNode|undefined)}
+ */
+chrome.automation.AutomationNode.prototype.activeDescendant;
+
 /** @type {function() : !Object} */
 chrome.app.getDetails;
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_object_constructor_installer.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_object_constructor_installer.js
new file mode 100644
index 0000000..cdb5e93e
--- /dev/null
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_object_constructor_installer.js
@@ -0,0 +1,37 @@
+// Copyright 2016 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.
+
+/**
+ * @fileoverview Provides bindings to instantiate objects in the automation API.
+ *
+ * Due to restrictions in the extension system, it is not ordinarily possible to
+ * construct an object defined by the extension API. However, given an instance
+ * of that object, we can save its constructor for future use.
+ */
+
+goog.provide('AutomationObjectConstructorInstaller');
+
+/**
+ * Installs the AutomationNode and AutomationEvent classes based on an
+ * AutomationNode instance.
+ * @param {chrome.automation.AutomationNode} node
+ * @param {function()} callback Called when installation finishes.
+ */
+AutomationObjectConstructorInstaller.init = function(node, callback) {
+  chrome.automation.AutomationNode =
+      /** @type {function (new:chrome.automation.AutomationNode)} */(
+          node.constructor);
+  node.addEventListener(chrome.automation.EventType.childrenChanged,
+      function installAutomationEvent(e) {
+        chrome.automation.AutomationEvent =
+            /** @type {function (new:chrome.automation.AutomationEvent)} */(
+                e.constructor);
+        node.removeEventListener(
+            chrome.automation.EventType.childrenChanged,
+            installAutomationEvent,
+            true);
+        callback();
+      },
+      true);
+};
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/base_automation_handler.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/base_automation_handler.js
index ae19aa5..7aaa8015 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/base_automation_handler.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/base_automation_handler.js
@@ -24,53 +24,31 @@
    */
   this.node_ = node;
 
-  /**
-   * Maps an automation event to its listener.
-   * @type {!Object<EventType, function(!AutomationEvent) : void>}
-   */
-  this.listenerMap_ = {
-    alert: this.onAlert,
-    ariaAttributeChanged: this.onEventIfInRange,
-    checkedStateChanged: this.onEventIfInRange,
-    focus: this.onFocus,
-    hover: this.onEventWithFlushedOutput,
-    loadComplete: this.onLoadComplete,
-    menuListItemSelected: this.onEventDefault,
-    menuStart: this.onMenuStart,
-    menuEnd: this.onMenuEnd,
-    scrollPositionChanged: this.onScrollPositionChanged,
-    selection: this.onEventWithFlushedOutput,
-    textChanged: this.onTextChanged,
-    textSelectionChanged: this.onTextSelectionChanged,
-    valueChanged: this.onValueChanged
-  };
-
-  /** @type {!Object<string, function(!AutomationEvent): void>} @private */
+  /** @type {!Object<EventType, function(!AutomationEvent): void>} @private */
   this.listeners_ = {};
-
-  this.register_();
 };
 
 BaseAutomationHandler.prototype = {
   /**
-   * Registers event listeners. Can be called repeatedly without duplicate
-   * listeners.
-   * @private
+   * Adds an event listener to this handler.
+   * @param {chrome.automation.EventType} eventType
+   * @param {!function(!AutomationEvent): void} eventCallback
+   * @protected
    */
-  register_: function() {
-    for (var eventType in this.listenerMap_) {
-      var listener =
-          this.makeListener_(this.listenerMap_[eventType].bind(this));
-      this.node_.addEventListener(eventType, listener, true);
-      this.listeners_[eventType] = listener;
-    }
+  addListener_: function(eventType, eventCallback) {
+    if (this.listeners_[eventType])
+      throw 'Listener already added: ' + eventType;
+
+    var listener = this.makeListener_(eventCallback.bind(this));
+    this.node_.addEventListener(eventType, listener, true);
+    this.listeners_[eventType] = listener;
   },
 
   /**
-   * Unregisters listeners.
+   * Removes all listeners from this handler.
    */
-  unregister: function() {
-    for (var eventType in this.listenerMap_) {
+  removeAllListeners: function() {
+    for (var eventType in this.listeners_) {
       this.node_.removeEventListener(
           eventType, this.listeners_[eventType], true);
     }
@@ -103,76 +81,7 @@
    * @protected
    */
   didHandleEvent_: function(evt) {
-  },
-
-  /**
-   * @param {!AutomationEvent} evt
-   */
-  onAlert: function(evt) {},
-
-  /**
-   * @param {!AutomationEvent} evt
-   */
-  onFocus: function(evt) {},
-
-  /**
-   * @param {!AutomationEvent} evt
-   */
-  onLoadComplete: function(evt) {},
-
-  /**
-   * @param {!AutomationEvent} evt
-   */
-  onEventDefault: function(evt) {},
-
-  /**
-   * @param {!AutomationEvent} evt
-   */
-  onEventIfInRange: function(evt) {
-    // TODO(dtseng): Consider the end of the current range as well.
-    if (AutomationUtil.isDescendantOf(
-        global.backgroundObj.currentRange.start.node, evt.target) ||
-            evt.target.state.focused)
-      this.onEventDefault(evt);
-  },
-
-  /**
-   * @param {!AutomationEvent} evt
-   */
-  onEventWithFlushedOutput: function(evt) {
-    Output.flushNextSpeechUtterance();
-    this.onEventDefault(evt);
-  },
-
-  /**
-   * @param {!AutomationEvent} evt
-   */
-  onMenuStart: function(evt) {},
-
-  /**
-   * @param {!AutomationEvent} evt
-   */
-  onMenuEnd: function(evt) {},
-
-  /**
-   * @param {!AutomationEvent} evt
-   */
-  onScrollPositionChanged: function(evt) {},
-
-  /**
-   * @param {!AutomationEvent} evt
-   */
-  onTextChanged: function(evt) {},
-
-  /**
-   * @param {!AutomationEvent} evt
-   */
-  onTextSelectionChanged: function(evt) {},
-
-  /**
-   * @param {!AutomationEvent} evt
-   */
-  onValueChanged: function(evt) {}
+  }
 };
 
 });  // goog.scope
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js
index 266ff6a..f7c5a73a 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js
@@ -8,6 +8,7 @@
 
 goog.provide('DesktopAutomationHandler');
 
+goog.require('AutomationObjectConstructorInstaller');
 goog.require('BaseAutomationHandler');
 goog.require('ChromeVoxState');
 goog.require('editing.TextEditHandler');
@@ -16,6 +17,7 @@
 var AutomationEvent = chrome.automation.AutomationEvent;
 var AutomationNode = chrome.automation.AutomationNode;
 var Dir = constants.Dir;
+var EventType = chrome.automation.EventType;
 var RoleType = chrome.automation.RoleType;
 
 /**
@@ -39,21 +41,34 @@
    */
   this.lastValueChanged_ = new Date(0);
 
-  // The focused state gets set on the containing webView node.
-  var webView = node.find({role: RoleType.webView, state: {focused: true}});
-  if (webView) {
-    var root = webView.find({role: RoleType.rootWebArea});
-    if (root) {
-      this.onLoadComplete(
-          {target: root,
-           type: chrome.automation.EventType.loadComplete});
-    }
-  }
+  var e = EventType;
+  this.addListener_(e.activedescendantchanged, this.onActiveDescendantChanged);
+  this.addListener_(e.alert, this.onAlert);
+  this.addListener_(e.ariaAttributeChanged, this.onEventIfInRange);
+  this.addListener_(e.checkedStateChanged, this.onEventIfInRange);
+  this.addListener_(e.focus, this.onFocus);
+  this.addListener_(e.hover, this.onEventWithFlushedOutput);
+  this.addListener_(e.loadComplete, this.onLoadComplete);
+  this.addListener_(e.menuEnd, this.onMenuEnd);
+  this.addListener_(e.menuListItemSelected, this.onEventDefault);
+  this.addListener_(e.menuStart, this.onMenuStart);
+  this.addListener_(e.scrollPositionChanged, this.onScrollPositionChanged);
+  this.addListener_(e.selection, this.onEventWithFlushedOutput);
+  this.addListener_(e.textChanged, this.onTextChanged);
+  this.addListener_(e.textSelectionChanged, this.onTextSelectionChanged);
+  this.addListener_(e.valueChanged, this.onValueChanged);
 
-  chrome.automation.getFocus((function(focus) {
-    if (focus)
-      this.onFocus({target: focus, type: 'focus'});
-  }).bind(this));
+  AutomationObjectConstructorInstaller.init(node, function() {
+    chrome.automation.getFocus((function(focus) {
+      if (ChromeVoxState.instance.mode != ChromeVoxMode.FORCE_NEXT)
+        return;
+
+      if (focus) {
+        this.onFocus(
+            new chrome.automation.AutomationEvent(EventType.focus, focus));
+      }
+    }).bind(this));
+  }.bind(this));
 };
 
 /**
@@ -118,8 +133,38 @@
   },
 
   /**
+   * @param {!AutomationEvent} evt
+   */
+  onEventIfInRange: function(evt) {
+    // TODO(dtseng): Consider the end of the current range as well.
+    if (AutomationUtil.isDescendantOf(
+        global.backgroundObj.currentRange.start.node, evt.target) ||
+            evt.target.state.focused)
+      this.onEventDefault(evt);
+  },
+
+  /**
+   * @param {!AutomationEvent} evt
+   */
+  onEventWithFlushedOutput: function(evt) {
+    Output.flushNextSpeechUtterance();
+    this.onEventDefault(evt);
+  },
+
+  /**
    * Makes an announcement without changing focus.
-   * @param {Object} evt
+   * @param {!AutomationEvent} evt
+   */
+  onActiveDescendantChanged: function(evt) {
+    if (!evt.target.activeDescendant)
+      return;
+    this.onEventDefault(new chrome.automation.AutomationEvent(
+        EventType.focus, evt.target.activeDescendant));
+  },
+
+  /**
+   * Makes an announcement without changing focus.
+   * @param {!AutomationEvent} evt
    */
   onAlert: function(evt) {
     var node = evt.target;
@@ -139,7 +184,7 @@
 
   /**
    * Provides all feedback once a focus event fires.
-   * @param {Object} evt
+   * @param {!AutomationEvent} evt
    */
   onFocus: function(evt) {
     // Invalidate any previous editable text handler state.
@@ -160,13 +205,12 @@
       Output.flushNextSpeechUtterance();
 
     this.onEventDefault(
-        /** @type {!AutomationEvent} */
-        ({target: node, type: chrome.automation.EventType.focus}));
+        new chrome.automation.AutomationEvent(EventType.focus, node));
   },
 
   /**
    * Provides all feedback once a load complete event fires.
-   * @param {Object} evt
+   * @param {!AutomationEvent} evt
    */
   onLoadComplete: function(evt) {
     ChromeVoxState.instance.refreshMode(evt.target.docUrl);
@@ -193,13 +237,20 @@
     }).bind(this));
   },
 
-  /** @override */
+
+    /**
+   * Provides all feedback once a text changed event fires.
+   * @param {!AutomationEvent} evt
+   */
   onTextChanged: function(evt) {
     if (evt.target.state.editable)
       this.onEditableChanged_(evt);
   },
 
-  /** @override */
+  /**
+   * Provides all feedback once a text selection changed event fires.
+   * @param {!AutomationEvent} evt
+   */
   onTextSelectionChanged: function(evt) {
     if (evt.target.state.editable)
       this.onEditableChanged_(evt);
@@ -266,7 +317,7 @@
 
   /**
    * Handle updating the active indicator when the document scrolls.
-   * @override
+   * @param {!AutomationEvent} evt
    */
   onScrollPositionChanged: function(evt) {
     if (ChromeVoxState.instance.mode === ChromeVoxMode.CLASSIC)
@@ -277,13 +328,19 @@
       new Output().withLocation(currentRange, null, evt.type).go();
   },
 
-  /** @override */
+  /**
+   * Provides all feedback once a menu start event fires.
+   * @param {!AutomationEvent} evt
+   */
   onMenuStart: function(evt) {
     global.backgroundObj.startExcursion();
     this.onEventDefault(evt);
   },
 
-  /** @override */
+  /**
+   * Provides all feedback once a menu end event fires.
+   * @param {!AutomationEvent} evt
+   */
   onMenuEnd: function(evt) {
     this.onEventDefault(evt);
     global.backgroundObj.endExcursion();
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/tabs_automation_handler.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/tabs_automation_handler.js
index 943e0cb..87fba15 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/tabs_automation_handler.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/tabs_automation_handler.js
@@ -26,8 +26,10 @@
     throw new Error('Expected rootWebArea node but got ' + tabRoot.role);
 
   // When the root is focused, simulate what happens on a load complete.
-  if (tabRoot.state.focused)
-    this.onLoadComplete({target: tabRoot, type: EventType.loadComplete});
+  if (tabRoot.state.focused) {
+    this.onLoadComplete(
+        new chrome.automation.AutomationEvent(EventType.loadComplete, tabRoot));
+  }
 };
 
 TabsAutomationHandler.prototype = {
@@ -42,7 +44,8 @@
   onLoadComplete: function(evt) {
     ChromeVoxState.instance.refreshMode(evt.target.docUrl);
     var focused = evt.target.find({state: {focused: true}}) || evt.target;
-    this.onFocus({target: focused, type: EventType.focus});
+    this.onFocus(new chrome.automation.AutomationEvent(
+        EventType.focus, focused));
   }
 };
 
diff --git a/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js b/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js
index d8e3454c..1e00add 100644
--- a/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js
+++ b/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js
@@ -432,8 +432,6 @@
         // to be deleted.
         chrome.wallpaperPrivate.resetWallpaper();
         this.onWallpaperChanged_(null, null);
-        WallpaperUtil.saveWallpaperInfo(
-            '', '', Constants.WallpaperSourceEnum.Default, '');
       } else {
         selectedIndex = Math.min(selectedIndex, customWallpaperCount - 1);
         wallpaperGrid.selectionModel.selectedIndex = selectedIndex;
@@ -555,7 +553,8 @@
 
   /**
    * Moves the check mark to |activeItem| and hides the wallpaper set by third
-   * party message if any. Called when wallpaper changed successfully.
+   * party message if any. And saves the wallpaper's information to local & sync
+   * storage. Called when wallpaper changed successfully.
    * @param {?Object} activeItem The active item in WallpaperThumbnailsGrid's
    *     data model.
    * @param {?string} currentWallpaperURL The URL or filename of current
@@ -568,6 +567,14 @@
     // Hides the wallpaper set by message.
     $('wallpaper-set-by-message').textContent = '';
     $('wallpaper-grid').classList.remove('small');
+
+    if (activeItem) {
+      WallpaperUtil.saveWallpaperInfo(
+          currentWallpaperURL, activeItem.layout, activeItem.source, '');
+    } else {
+      WallpaperUtil.saveWallpaperInfo(
+          '', '', Constants.WallpaperSourceEnum.Default, '');
+    }
   };
 
   /**
@@ -595,7 +602,7 @@
                     false, selectedItem.baseURL,
                     function(thumbnailData) {
                       self.onWallpaperChanged_(selectedItem,
-                          selectedItem.baseURL, thumbnailData);
+                                               selectedItem.baseURL);
                       WallpaperUtil.storeWallpaperToSyncFS(
                           selectedItem.baseURL, e.target.result);
                       WallpaperUtil.storeWallpaperToSyncFS(
@@ -615,8 +622,6 @@
         // Resets back to default wallpaper.
         chrome.wallpaperPrivate.resetWallpaper();
         this.onWallpaperChanged_(selectedItem, selectedItem.baseURL);
-        WallpaperUtil.saveWallpaperInfo(
-            wallpaperURL, selectedItem.layout, selectedItem.source, '');
         break;
       case Constants.WallpaperSourceEnum.Online:
         var wallpaperURL = selectedItem.baseURL +
@@ -628,8 +633,6 @@
                                                      function(exists) {
           if (exists) {
             self.onWallpaperChanged_(selectedItem, wallpaperURL);
-            WallpaperUtil.saveWallpaperInfo(
-                wallpaperURL, selectedItem.layout, selectedItem.source, '');
             return;
           }
 
@@ -655,8 +658,6 @@
                     self.onWallpaperChanged_(selectedItem, wallpaperURL);
                   }
                 });
-            WallpaperUtil.saveWallpaperInfo(
-                wallpaperURL, selectedItem.layout, selectedItem.source, '');
             self.wallpaperRequest_ = null;
           };
           var onFailure = function(status) {
@@ -985,10 +986,6 @@
         failure();
       } else {
         success(opt_thumbnail);
-        // Custom wallpapers are not synced yet. If login on a different
-        // computer after set a custom wallpaper, wallpaper wont change by sync.
-        WallpaperUtil.saveWallpaperInfo(
-            fileName, layout, Constants.WallpaperSourceEnum.Custom, '');
       }
     };
 
diff --git a/chrome/browser/resources/feedback/css/feedback.css b/chrome/browser/resources/feedback/css/feedback.css
index 7270cf6d..19ee53c 100644
--- a/chrome/browser/resources/feedback/css/feedback.css
+++ b/chrome/browser/resources/feedback/css/feedback.css
@@ -126,8 +126,12 @@
 }
 
 .content .buttons-pane {
+  bottom: 20px;
   display: -webkit-flex;
-  justify-content: flex-end
+  justify-content: flex-end;
+  left: 20px;
+  position: absolute;
+  right: 20px;
 }
 
 .content .remove-file-button {
@@ -176,3 +180,18 @@
   color: #fff;
   text-shadow: 1px sharp drop shadow rgb(45, 106, 218);
 }
+
+.srt-image {
+  -webkit-margin-end: auto;
+  -webkit-margin-start: 40px;
+  display: block;
+  height: 50px;
+  margin-bottom: 20px;
+  margin-top: 120px;
+}
+
+.srt-body {
+  font-size: 14px;
+  line-height: 24px;
+  margin: 0 40px;
+}
diff --git a/chrome/browser/resources/feedback/html/default.html b/chrome/browser/resources/feedback/html/default.html
index 204850a36..1716896 100644
--- a/chrome/browser/resources/feedback/html/default.html
+++ b/chrome/browser/resources/feedback/html/default.html
@@ -24,6 +24,18 @@
       </button>
     </span>
   </div>
+  <div id="srt-prompt" class="content">
+    <img src="../../../../../components/resources/sadtab.svg" class="srt-image">
+    <p i18n-content="srtPromptBody" class="srt-body"></p>
+    <div class="buttons-pane">
+      <button id="srt-decline-button" class="white-button"
+          i18n-content="srtPromptDeclineButton">
+      </button>
+      <button id="srt-accept-button" class="blue-button"
+          i18n-content="srtPromptAcceptButton">
+      </button>
+    </div>
+  </div>
   <div id="content-pane" class="content">
     <textarea id="description-text" aria-labelledby="title-bar"></textarea>
     <div id="page-url" class="text-field-container">
@@ -67,7 +79,7 @@
       </a>
     </div>
 </if>
-    <!-- Privacy node -->
+    <!-- Privacy note -->
     <div id="privacy-note" i18n-values=".innerHTML:privacy-note"></div>
     <!-- Buttons -->
     <div class="buttons-pane">
diff --git a/chrome/browser/resources/feedback/js/feedback.js b/chrome/browser/resources/feedback/js/feedback.js
index 065081e..0b929ac 100644
--- a/chrome/browser/resources/feedback/js/feedback.js
+++ b/chrome/browser/resources/feedback/js/feedback.js
@@ -8,6 +8,12 @@
 var FEEDBACK_LANDING_PAGE =
     'https://support.google.com/chrome/go/feedback_confirmation';
 
+/**
+ * @type {string}
+ * @const
+ */
+var SRT_DOWNLOAD_PAGE = 'https://www.google.com/chrome/cleanup-tool/';
+
 /** @type {number}
  * @const
  */
@@ -57,7 +63,18 @@
  */
 var FeedbackFlow = {
   REGULAR: 'regular',  // Flow in a regular user session.
-  LOGIN: 'login'       // Flow on the login screen.
+  LOGIN: 'login',       // Flow on the login screen.
+  SHOW_SRT_PROMPT: 'showSrtPrompt'  // Prompt user to try Software Removal Tool
+};
+
+/**
+ * SRT Prompt Result defined in feedback_private.idl.
+ * @enum {string}
+ */
+var SrtPromptResult = {
+  ACCEPTED: 'accepted',  // User accepted prompt.
+  DECLINED: 'declined',  // User declined prompt.
+  CLOSED: 'closed',      // User closed window without responding to prompt.
 };
 
 var attachedFileBlob = null;
@@ -71,6 +88,12 @@
 var isSystemInfoReady = false;
 
 /**
+ * Indicates whether the SRT Prompt is currently being displayed.
+ * @type {boolean}
+ */
+var isShowingSrtPrompt = false;
+
+/**
  * The callback used by the sys_info_page to receive the event that the system
  * information is ready.
  * @type {function(sysInfo)}
@@ -284,6 +307,32 @@
       if (!feedbackInfo.flow)
         feedbackInfo.flow = FeedbackFlow.REGULAR;
 
+      if (feedbackInfo.flow == FeedbackFlow.SHOW_SRT_PROMPT) {
+        isShowingSrtPrompt = true;
+        $('content-pane').hidden = true;
+
+        $('srt-decline-button').onclick = function() {
+          isShowingSrtPrompt = false;
+          chrome.feedbackPrivate.logSrtPromptResult(SrtPromptResult.DECLINED);
+          $('srt-prompt').hidden = true;
+          $('content-pane').hidden = false;
+        };
+
+        $('srt-accept-button').onclick = function() {
+          chrome.feedbackPrivate.logSrtPromptResult(SrtPromptResult.ACCEPTED);
+          window.open(SRT_DOWNLOAD_PAGE, '_blank');
+          window.close();
+        };
+
+        $('close-button').addEventListener('click', function() {
+          if (isShowingSrtPrompt) {
+            chrome.feedbackPrivate.logSrtPromptResult(SrtPromptResult.CLOSED);
+          }
+        });
+      } else {
+        $('srt-prompt').hidden = true;
+      }
+
       $('description-text').textContent = feedbackInfo.description;
       if (feedbackInfo.pageUrl)
         $('page-url-text').value = feedbackInfo.pageUrl;
@@ -335,7 +384,6 @@
         $('performance-info-link').onclick = openSlowTraceWindow;
       }
 </if>
-
       chrome.feedbackPrivate.getStrings(function(strings) {
         loadTimeData.data = strings;
         i18nTemplate.process(document, loadTimeData);
diff --git a/chrome/browser/resources/gaia_auth_host/saml_handler.js b/chrome/browser/resources/gaia_auth_host/saml_handler.js
index 9b6ceb9..70486c7 100644
--- a/chrome/browser/resources/gaia_auth_host/saml_handler.js
+++ b/chrome/browser/resources/gaia_auth_host/saml_handler.js
@@ -147,6 +147,14 @@
         'loadabort', this.onLoadAbort_.bind(this));
     this.webview_.addEventListener(
         'loadcommit', this.onLoadCommit_.bind(this));
+    this.webview_.addEventListener(
+        'permissionrequest', function(e) {
+          if (e.permission === 'media') {
+            // The actual permission check happens in
+            // WebUILoginView::RequestMediaAccessPermission().
+            e.request.allow();
+          }
+        });
 
     this.webview_.request.onBeforeRequest.addListener(
         this.onInsecureRequest.bind(this),
diff --git a/chrome/browser/resources/md_history/history_item.js b/chrome/browser/resources/md_history/history_item.js
index c8403eb..e2593bf 100644
--- a/chrome/browser/resources/md_history/history_item.js
+++ b/chrome/browser/resources/md_history/history_item.js
@@ -16,42 +16,35 @@
     // True if the website is a bookmarked page.
     starred: {
       type: Boolean,
-      value: false,
       reflectToAttribute: true
     },
 
     // Search term used to obtain this history-item.
     searchTerm: {
-      type: String,
-      value: '',
+      type: String
     },
 
     selected: {
       type: Boolean,
-      value: false,
       notify: true
     },
 
     isCardStart: {
       type: Boolean,
-      value: false,
       reflectToAttribute: true
     },
 
     isCardEnd: {
       type: Boolean,
-      value: false,
       reflectToAttribute: true
     },
 
     hasTimeGap: {
-      type: Boolean,
-      value: false,
+      type: Boolean
     },
 
     numberOfItems: {
-      type: Number,
-      value: 0
+      type: Number
     }
   },
 
diff --git a/chrome/browser/resources/md_history/history_list.html b/chrome/browser/resources/md_history/history_list.html
index d6f048c..9642694 100644
--- a/chrome/browser/resources/md_history/history_list.html
+++ b/chrome/browser/resources/md_history/history_list.html
@@ -1,7 +1,6 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-list/iron-list.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-item/paper-item.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_shared_menu/cr_shared_menu.html">
 <link rel="import" href="chrome://history/constants.html">
 <link rel="import" href="chrome://history/history_item.html">
@@ -21,15 +20,6 @@
         padding-top: var(--first-card-padding-top);
       }
 
-      #loading-spinner {
-        bottom: 20px;
-        left: 0;
-        margin: 0 auto;
-        position: absolute;
-        right: 0;
-        width: 28px;
-      }
-
       paper-item {
         -webkit-user-select: none;
         cursor: pointer;
@@ -59,9 +49,6 @@
         </history-item>
       </template>
     </iron-list>
-    <paper-spinner id="loading-spinner" alt="$i18n{loading}"
-        active="[[loading_]]">
-    </paper-spinner>
     <cr-shared-menu id="sharedMenu">
       <paper-item id="menuMoreButton" on-tap="onMoreFromSiteTap_">
         $i18n{moreFromSite}
diff --git a/chrome/browser/resources/md_user_manager/control_bar.css b/chrome/browser/resources/md_user_manager/control_bar.css
deleted file mode 100644
index 3b2489e9..0000000
--- a/chrome/browser/resources/md_user_manager/control_bar.css
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Copyright 2016 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. */
-
-#container {
-  padding-bottom: 12px;
-  padding-top: 12px;
-}
-
-paper-button {
-  border-radius: 2px;
-  color: var(--paper-grey-600);
-  font-weight: 500;
-  line-height: 32px;
-  margin: 0;
-  min-width: 52px;
-  padding: 0 16px;
-}
-
-#addUser {
-  margin: 0 8px;
-}
-
-#logo {
-  content: -webkit-image-set(
-      url(../../../app/theme/default_100_percent/%DISTRIBUTION%/product_logo_name_48.png) 1x,
-      url(../../../app/theme/default_200_percent/%DISTRIBUTION%/product_logo_name_48.png) 2x);
-  height: 18px;
-  left: 24px;
-  position: absolute;
-  top: 19px;
-}
-
-:host-context([dir='rtl']) #logo {
-  left: auto;
-  right: 24px;
-}
diff --git a/chrome/browser/resources/md_user_manager/control_bar.html b/chrome/browser/resources/md_user_manager/control_bar.html
index 94591e35..9a15c67b 100644
--- a/chrome/browser/resources/md_user_manager/control_bar.html
+++ b/chrome/browser/resources/md_user_manager/control_bar.html
@@ -5,11 +5,42 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
 
 <dom-module id="control-bar">
-  <!-- TODO(mahmadi): this format is deprecated. Change to the new
-       "shared styles" format. -->
-  <link rel="import" type="css" href="chrome://md-user-manager/control_bar.css">
   <template>
-    <style include="shared-styles"></style>
+    <style include="shared-styles">
+      #container {
+        padding-bottom: 12px;
+        padding-top: 12px;
+      }
+
+      paper-button {
+        border-radius: 2px;
+        color: var(--paper-grey-600);
+        font-weight: 500;
+        line-height: 32px;
+        margin: 0;
+        min-width: 52px;
+        padding: 0 16px;
+      }
+
+      #addUser {
+        margin: 0 8px;
+      }
+
+      #logo {
+        content: -webkit-image-set(
+            url(../../../app/theme/default_100_percent/%DISTRIBUTION%/product_logo_name_48.png) 1x,
+            url(../../../app/theme/default_200_percent/%DISTRIBUTION%/product_logo_name_48.png) 2x);
+        height: 18px;
+        left: 24px;
+        position: absolute;
+        top: 19px;
+      }
+
+      :host-context([dir='rtl']) #logo {
+        left: auto;
+        right: 24px;
+      }
+    </style>
     <div id="container" class="layout horizontal end-justified">
       <div id="logo"></div>
       <paper-button id="launchGuest" on-tap="onLaunchGuestTap_"
diff --git a/chrome/browser/resources/md_user_manager/create_profile.css b/chrome/browser/resources/md_user_manager/create_profile.css
deleted file mode 100644
index 4ea6bc4..0000000
--- a/chrome/browser/resources/md_user_manager/create_profile.css
+++ /dev/null
@@ -1,163 +0,0 @@
-/* Copyright 2016 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. */
-
-.container {
-  color: var(--paper-grey-800);
-  margin: 0 auto;
-  width: 624px;
-}
-
-#message-container {
-  background-color: var(--google-red-700);
-  color: white;
-  left: 0;
-  overflow: hidden;
-  padding: 10px 16px;
-  position: absolute;
-  right: 0;
-  top: 0;
-}
-
-#message-container iron-icon {
-  --iron-icon-height: 20px;
-  --iron-icon-width: 20px;
-}
-
-#message-container #message {
-  -webkit-margin-start: 16px;
-}
-
-#message-container #supervised-user-import-existing {
-  color: inherit;
-  text-decoration: underline;
-}
-
-#title-bar {
-  border-bottom: 1px solid rgba(0, 0, 0, .12);
-  font-size: 16px;
-  font-weight: 500;
-  padding: 104px 0 16px;
-}
-
-#nameInput,
-paper-dropdown-menu {
-  --paper-input-container: {
-    padding: 0;
-  };
-  --paper-input-container-input: {
-    color: inherit;
-    font-size: inherit;
-  };
-}
-
-#nameInput {
-  margin-bottom: 24px;
-  margin-top: 32px;
-  width: 300px;
-}
-
-paper-dropdown-menu {
-  margin-top: 12px;
-  width: 200px;
-}
-
-paper-menu {
-  --paper-menu: {
-    color: inherit;
-    padding: 0;
-  };
-  --paper-menu-selected-item: {
-    font-weight: normal;
-  }
-}
-
-paper-menu paper-item {
-  font-size: inherit;
-  min-height: 40px;
-}
-
-#icons #wrapper {
-  display: flex;
-  flex-wrap: wrap;
-  margin: -12px;
-}
-
-#icons paper-button {
-  background: var(--paper-grey-300);
-  border: 1px solid rgba(0, 0, 0, .12);
-  margin: 12px;
-  min-width: 0;
-  padding: 6px 4px;
-}
-
-#icons paper-button[active] {
-  border-color: var(--google-blue-500);
-}
-
-#icons paper-button:focus:not([active]) {
-  outline: 1px dotted #666;
-}
-
-#supervised-user-container {
-  margin-top: 24px;
-}
-
-#supervised-user-container paper-checkbox {
-  --paper-checkbox-label-spacing: 16px;
-  --paper-checkbox-size: 20px;
-}
-
-#supervised-user-container #learn-more-accounts {
-  -webkit-margin-start: 36px;
-}
-
-#supervised-user-container #learn-more {
-  display: block;
-  line-height: 20px;
-}
-
-#supervised-user-container #import-user {
-  -webkit-margin-start: 16px;
-}
-
-#actions {
-  bottom: 16px;
-  display: flex;
-  position: absolute;
-  right: 16px;
-}
-
-:host-context([dir='rtl']) #actions {
-  left: 16px;
-  right: auto;
-}
-
-#actions paper-button {
-  border-radius: 2px;
-  font-weight: 500;
-  line-height: 32px;
-  margin: 0;
-  min-width: 52px;
-  padding: 0 16px;
-}
-
-#actions paper-spinner {
-  align-self: center;
-  height: 20px;
-  width: 20px;
-}
-
-#actions #cancel {
-  color: var(--paper-grey-600);
-}
-
-#actions #save {
-  -webkit-margin-start: 8px;
-  background: var(--google-blue-500);
-  color: white;
-}
-
-#actions #save[disabled] {
-  background: rgba(66, 133, 244, .5);
-}
diff --git a/chrome/browser/resources/md_user_manager/create_profile.html b/chrome/browser/resources/md_user_manager/create_profile.html
index 296a6aa..19c76b97 100644
--- a/chrome/browser/resources/md_user_manager/create_profile.html
+++ b/chrome/browser/resources/md_user_manager/create_profile.html
@@ -17,11 +17,169 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner.html">
 
 <dom-module id="create-profile">
-  <link rel="import" type="css"
-      href="chrome://md-user-manager/create_profile.css">
   <link rel="import" type="css" href="chrome://resources/css/action_link.css">
   <template>
-    <style include="shared-styles"></style>
+    <style include="shared-styles">
+      .container {
+        color: var(--paper-grey-800);
+        margin: 0 auto;
+        width: 624px;
+      }
+
+      #message-container {
+        background-color: var(--google-red-700);
+        color: white;
+        left: 0;
+        overflow: hidden;
+        padding: 10px 16px;
+        position: absolute;
+        right: 0;
+        top: 0;
+      }
+
+      #message-container iron-icon {
+        --iron-icon-height: 20px;
+        --iron-icon-width: 20px;
+      }
+
+      #message-container #message {
+        -webkit-margin-start: 16px;
+      }
+
+      #message-container #supervised-user-import-existing {
+        color: inherit;
+        text-decoration: underline;
+      }
+
+      #title-bar {
+        border-bottom: 1px solid rgba(0, 0, 0, .12);
+        font-size: 16px;
+        font-weight: 500;
+        padding: 104px 0 16px;
+      }
+
+      #nameInput,
+      paper-dropdown-menu {
+        --paper-input-container: {
+          padding: 0;
+        };
+        --paper-input-container-input: {
+          color: inherit;
+          font-size: inherit;
+        };
+      }
+
+      #nameInput {
+        margin-bottom: 24px;
+        margin-top: 32px;
+        width: 300px;
+      }
+
+      paper-dropdown-menu {
+        margin-top: 12px;
+        width: 200px;
+      }
+
+      paper-menu {
+        --paper-menu: {
+          color: inherit;
+          padding: 0;
+        };
+        --paper-menu-selected-item: {
+          font-weight: normal;
+        }
+      }
+
+      paper-menu paper-item {
+        font-size: inherit;
+        min-height: 40px;
+      }
+
+      #icons #wrapper {
+        display: flex;
+        flex-wrap: wrap;
+        margin: -12px;
+      }
+
+      #icons paper-button {
+        background: var(--paper-grey-300);
+        border: 1px solid rgba(0, 0, 0, .12);
+        margin: 12px;
+        min-width: 0;
+        padding: 6px 4px;
+      }
+
+      #icons paper-button[active] {
+        border-color: var(--google-blue-500);
+      }
+
+      #icons paper-button:focus:not([active]) {
+        outline: 1px dotted #666;
+      }
+
+      #supervised-user-container {
+        margin-top: 24px;
+      }
+
+      #supervised-user-container paper-checkbox {
+        --paper-checkbox-label-spacing: 16px;
+        --paper-checkbox-size: 20px;
+      }
+
+      #supervised-user-container #learn-more-accounts {
+        -webkit-margin-start: 36px;
+      }
+
+      #supervised-user-container #learn-more {
+        display: block;
+        line-height: 20px;
+      }
+
+      #supervised-user-container #import-user {
+        -webkit-margin-start: 16px;
+      }
+
+      #actions {
+        bottom: 16px;
+        display: flex;
+        position: absolute;
+        right: 16px;
+      }
+
+      :host-context([dir='rtl']) #actions {
+        left: 16px;
+        right: auto;
+      }
+
+      #actions paper-button {
+        border-radius: 2px;
+        font-weight: 500;
+        line-height: 32px;
+        margin: 0;
+        min-width: 52px;
+        padding: 0 16px;
+      }
+
+      #actions paper-spinner {
+        align-self: center;
+        height: 20px;
+        width: 20px;
+      }
+
+      #actions #cancel {
+        color: var(--paper-grey-600);
+      }
+
+      #actions #save {
+        -webkit-margin-start: 8px;
+        background: var(--google-blue-500);
+        color: white;
+      }
+
+      #actions #save[disabled] {
+        background: rgba(66, 133, 244, .5);
+      }
+    </style>
     <div id="message-container" hidden="[[!message_]]">
       <iron-icon icon="warning"></iron-icon>
       <span id="message" inner-h-t-m-l="[[message_]]"></span>
diff --git a/chrome/browser/resources/md_user_manager/import_supervised_user.js b/chrome/browser/resources/md_user_manager/import_supervised_user.js
index 84cede4c..f2c2802 100644
--- a/chrome/browser/resources/md_user_manager/import_supervised_user.js
+++ b/chrome/browser/resources/md_user_manager/import_supervised_user.js
@@ -130,10 +130,10 @@
   onImportTap_: function() {
     var supervisedUser = this.supervisedUsers_[this.supervisedUserIndex_];
     if (this.signedInUser_ && supervisedUser) {
+      this.popupHidden_ = true;
       // Event is caught by create-profile.
       this.fire('import', {supervisedUser: supervisedUser,
                            signedInUser: this.signedInUser_});
-      this.popupHidden_ = true;
     }
   }
 });
diff --git a/chrome/browser/resources/md_user_manager/supervised_user_learn_more.css b/chrome/browser/resources/md_user_manager/supervised_user_learn_more.css
deleted file mode 100644
index d2bdcd62..0000000
--- a/chrome/browser/resources/md_user_manager/supervised_user_learn_more.css
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Copyright 2016 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. */
-
-:host {
-  align-self: center;
-}
-
-#container {
-  color: var(--paper-grey-800);
-  line-height: 20px;
-  width: 624px;
-}
-
-#title-area {
-  border-bottom: 1px solid rgba(0, 0, 0, .12);
-  font-size: 16px;
-  padding-bottom: 16px;
-}
-
-#title-area iron-icon {
-  --iron-icon-height: 20px;
-  --iron-icon-width: 20px;
-  color: var(--google-grey-500);
-}
-
-.content-area {
-  padding-top: 32px;
-  white-space: pre-wrap;
-  word-wrap: break-word;
-}
-
-#actions {
-  bottom: 16px;
-  position: absolute;
-  right: 16px;
-}
-
-:host-context([dir='rtl']) #actions {
-  left: 16px;
-  right: auto;
-}
-
-#actions paper-button {
-  border-radius: 2px;
-  font-weight: 500;
-  line-height: 32px;
-  margin: 0;
-  min-width: 52px;
-  padding: 0 16px;
-}
-
-#actions #done {
-  background: var(--google-blue-500);
-  color: white;
-}
diff --git a/chrome/browser/resources/md_user_manager/supervised_user_learn_more.html b/chrome/browser/resources/md_user_manager/supervised_user_learn_more.html
index 531fdb8c..432bb1e 100644
--- a/chrome/browser/resources/md_user_manager/supervised_user_learn_more.html
+++ b/chrome/browser/resources/md_user_manager/supervised_user_learn_more.html
@@ -5,10 +5,61 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
 
 <dom-module id="supervised-user-learn-more">
-  <link rel="import" type="css"
-      href="chrome://md-user-manager/supervised_user_learn_more.css">
   <template>
-    <style include="shared-styles"></style>
+    <style include="shared-styles">
+      :host {
+        align-self: center;
+      }
+
+      #container {
+        color: var(--paper-grey-800);
+        line-height: 20px;
+        width: 624px;
+      }
+
+      #title-area {
+        border-bottom: 1px solid rgba(0, 0, 0, .12);
+        font-size: 16px;
+        padding-bottom: 16px;
+      }
+
+      #title-area iron-icon {
+        --iron-icon-height: 20px;
+        --iron-icon-width: 20px;
+        color: var(--google-grey-500);
+      }
+
+      .content-area {
+        padding-top: 32px;
+        white-space: pre-wrap;
+        word-wrap: break-word;
+      }
+
+      #actions {
+        bottom: 16px;
+        position: absolute;
+        right: 16px;
+      }
+
+      :host-context([dir='rtl']) #actions {
+        left: 16px;
+        right: auto;
+      }
+
+      #actions paper-button {
+        border-radius: 2px;
+        font-weight: 500;
+        line-height: 32px;
+        margin: 0;
+        min-width: 52px;
+        padding: 0 16px;
+      }
+
+      #actions #done {
+        background: var(--google-blue-500);
+        color: white;
+      }
+    </style>
     <div id="container">
       <div id="title-area" class="horizontal justified layout">
         <span id="title" i18n-content="supervisedUserLearnMoreTitle"></span>
diff --git a/chrome/browser/resources/md_user_manager/user_manager_pages.css b/chrome/browser/resources/md_user_manager/user_manager_pages.css
deleted file mode 100644
index 385e3ee..0000000
--- a/chrome/browser/resources/md_user_manager/user_manager_pages.css
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Copyright 2016 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. */
-
-neon-animated-pages {
-  height: 100%;
-}
-
-neon-animated-pages > div {
-  display: flex;
-  justify-content: center;
-}
diff --git a/chrome/browser/resources/md_user_manager/user_manager_pages.html b/chrome/browser/resources/md_user_manager/user_manager_pages.html
index 5446da4e1..9e5276f1 100644
--- a/chrome/browser/resources/md_user_manager/user_manager_pages.html
+++ b/chrome/browser/resources/md_user_manager/user_manager_pages.html
@@ -7,9 +7,17 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animated-pages.html">
 
 <dom-module id="user-manager-pages">
-  <link rel="import" type="css"
-      href="chrome://md-user-manager/user_manager_pages.css">
   <template>
+    <style>
+      neon-animated-pages {
+        height: 100%;
+      }
+
+      neon-animated-pages > div {
+        display: flex;
+        justify-content: center;
+      }
+    </style>
     <neon-animated-pages id="animatedPages" attr-for-selected="id"
         selected="[[selectedPage_]]" entry-animation="slide-from-left-animation"
         exit-animation="slide-right-animation">
diff --git a/chrome/browser/resources/md_user_manager/user_manager_tutorial.css b/chrome/browser/resources/md_user_manager/user_manager_tutorial.css
deleted file mode 100644
index 625d78dd..0000000
--- a/chrome/browser/resources/md_user_manager/user_manager_tutorial.css
+++ /dev/null
@@ -1,160 +0,0 @@
-/* Copyright 2016 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. */
-
-.tutorial-slide {
-  -webkit-transition: opacity 200ms ease-in-out;
-  background-color: white;
-  border-radius: 2px;
-  bottom: 0;
-  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);
-  height: 408px;
-  left: 0;
-  margin: auto;
-  position: absolute;
-  right: 0;
-  top: 0;
-  width: 320px;
-  z-index: 100;
-}
-
-:host.single-pod #yourChrome,
-:host.single-pod #complete {
-  -webkit-margin-start: 30px;
-}
-
-#guests {
-  bottom: 20px;
-  left: auto;
-  margin: 0;
-  right: 100px;
-  top: auto;
-}
-
-:host-context([dir='rtl']) #guests {
-  left: 100px;
-  right: auto;
-}
-
-#friends,
-#notYou {
-  bottom: 20px;
-  left: auto;
-  margin: 0;
-  right: 20px;
-  top: auto;
-}
-
-:host-context([dir='rtl']) #friends,
-:host-context([dir='rtl']) #notYou {
-  left: 20px;
-  right: auto;
-}
-
-#notYou {
-  height: 100px;
-  width: 240px;
-}
-
-.slide-contents {
-  padding: 0 20px;
-  text-align: center;
-}
-
-.slide-title {
-  color: black;
-  font-size: 20px;
-  line-height: 20px;
-  margin: 30px 0;
-}
-
-.slide-text {
-  color: var(--google-grey-600);
-  font-size: 15px;
-  line-height: 20px;
-}
-
-.slide-buttons {
-  bottom: 20px;
-  position: absolute;
-  text-align: center;
-  width: 100%;
-}
-
-.slide-buttons [is='action-link'] {
-  width: 100%;
-}
-
-.slide-buttons button {
-  bottom: 0;
-  height: 35px;
-  padding: 0 15px;
-  width: 138px;
-}
-
-.arrow-down {
-  border-left: 15px solid transparent;
-  border-right: 15px solid transparent;
-  border-top: 15px solid white;
-  bottom: -15px;
-  height: 0;
-  position: absolute;
-  right: 40px;
-  width: 0;
-}
-
-:host-context([dir='rtl']) .arrow-down {
-  left: 40px;
-  right: auto;
-}
-
-#guests .arrow-down {
-  right: 110px;
-}
-
-:host-context([dir='rtl']) #guests .arrow-down {
-  left: 110px;
-  right: auto;
-}
-
-.slide-image {
-  height: 182px;
-}
-
-#yourChrome .slide-image {
-  background-color: rgb(241, 202, 58);
-  background-image:
-      url(chrome://theme/IDR_ICON_USER_MANAGER_TUTORIAL_YOUR_CHROME);
-}
-
-#guests .slide-image {
-  background-color: rgb(90, 196, 144);
-  background-image: url(chrome://theme/IDR_ICON_USER_MANAGER_TUTORIAL_GUESTS);
-}
-
-#friends .slide-image {
-  background-color: var(--paper-light-blue-100);
-  background-image:
-      url(chrome://theme/IDR_ICON_USER_MANAGER_TUTORIAL_FRIENDS);
-}
-
-#complete .slide-image {
-  background-color: white;
-  background-image:
-      url(chrome://theme/IDR_ICON_USER_MANAGER_TUTORIAL_COMPLETE);
-}
-
-#notYou #dismiss {
-  position: absolute;
-  right: 5px;
-  top: 5px;
-}
-
-#notYou #slide-add-user {
-  margin-top: 10px;
-}
-
-:host-context([dir='rtl']) #notYou #dismiss {
-  left: 5px;
-  right: auto;
-}
diff --git a/chrome/browser/resources/md_user_manager/user_manager_tutorial.html b/chrome/browser/resources/md_user_manager/user_manager_tutorial.html
index c0716b8..b5540be 100644
--- a/chrome/browser/resources/md_user_manager/user_manager_tutorial.html
+++ b/chrome/browser/resources/md_user_manager/user_manager_tutorial.html
@@ -5,11 +5,166 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
 
 <dom-module id="user-manager-tutorial">
-  <link rel="import" type="css"
-      href="chrome://md-user-manager/user_manager_tutorial.css">
   <link rel="import" type="css" href="chrome://resources/css/action_link.css">
   <template>
-    <style include="shared-styles"></style>
+    <style include="shared-styles">
+      .tutorial-slide {
+        -webkit-transition: opacity 200ms ease-in-out;
+        background-color: white;
+        border-radius: 2px;
+        bottom: 0;
+        box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);
+        height: 408px;
+        left: 0;
+        margin: auto;
+        position: absolute;
+        right: 0;
+        top: 0;
+        width: 320px;
+        z-index: 100;
+      }
+
+      :host.single-pod #yourChrome,
+      :host.single-pod #complete {
+        -webkit-margin-start: 30px;
+      }
+
+      #guests {
+        bottom: 20px;
+        left: auto;
+        margin: 0;
+        right: 100px;
+        top: auto;
+      }
+
+      :host-context([dir='rtl']) #guests {
+        left: 100px;
+        right: auto;
+      }
+
+      #friends,
+      #notYou {
+        bottom: 20px;
+        left: auto;
+        margin: 0;
+        right: 20px;
+        top: auto;
+      }
+
+      :host-context([dir='rtl']) #friends,
+      :host-context([dir='rtl']) #notYou {
+        left: 20px;
+        right: auto;
+      }
+
+      #notYou {
+        height: 100px;
+        width: 240px;
+      }
+
+      .slide-contents {
+        padding: 0 20px;
+        text-align: center;
+      }
+
+      .slide-title {
+        color: black;
+        font-size: 20px;
+        line-height: 20px;
+        margin: 30px 0;
+      }
+
+      .slide-text {
+        color: var(--google-grey-600);
+        font-size: 15px;
+        line-height: 20px;
+      }
+
+      .slide-buttons {
+        bottom: 20px;
+        position: absolute;
+        text-align: center;
+        width: 100%;
+      }
+
+      .slide-buttons [is='action-link'] {
+        width: 100%;
+      }
+
+      .slide-buttons button {
+        bottom: 0;
+        height: 35px;
+        padding: 0 15px;
+        width: 138px;
+      }
+
+      .arrow-down {
+        border-left: 15px solid transparent;
+        border-right: 15px solid transparent;
+        border-top: 15px solid white;
+        bottom: -15px;
+        height: 0;
+        position: absolute;
+        right: 40px;
+        width: 0;
+      }
+
+      :host-context([dir='rtl']) .arrow-down {
+        left: 40px;
+        right: auto;
+      }
+
+      #guests .arrow-down {
+        right: 110px;
+      }
+
+      :host-context([dir='rtl']) #guests .arrow-down {
+        left: 110px;
+        right: auto;
+      }
+
+      .slide-image {
+        height: 182px;
+      }
+
+      #yourChrome .slide-image {
+        background-color: rgb(241, 202, 58);
+        background-image:
+            url(chrome://theme/IDR_ICON_USER_MANAGER_TUTORIAL_YOUR_CHROME);
+      }
+
+      #guests .slide-image {
+        background-color: rgb(90, 196, 144);
+        background-image: url(chrome://theme/IDR_ICON_USER_MANAGER_TUTORIAL_GUESTS);
+      }
+
+      #friends .slide-image {
+        background-color: var(--paper-light-blue-100);
+        background-image:
+            url(chrome://theme/IDR_ICON_USER_MANAGER_TUTORIAL_FRIENDS);
+      }
+
+      #complete .slide-image {
+        background-color: white;
+        background-image:
+            url(chrome://theme/IDR_ICON_USER_MANAGER_TUTORIAL_COMPLETE);
+      }
+
+      #notYou #dismiss {
+        position: absolute;
+        right: 5px;
+        top: 5px;
+      }
+
+      #notYou #slide-add-user {
+        margin-top: 10px;
+      }
+
+      :host-context([dir='rtl']) #notYou #dismiss {
+        left: 5px;
+        right: auto;
+      }
+    </style>
     <template is="dom-if" if="[[!hidden_]]">
       <template is="dom-if"
           if="[[!isStepHidden_(currentStep_, steps_.YOUR_CHROME)]]">
diff --git a/chrome/browser/resources/media_router/OWNERS b/chrome/browser/resources/media_router/OWNERS
index 583b6f8fa..efc4671 100644
--- a/chrome/browser/resources/media_router/OWNERS
+++ b/chrome/browser/resources/media_router/OWNERS
@@ -1,9 +1,6 @@
-# Owners with committer privileges
 apacible@chromium.org
 imcheng@chromium.org
-kmarshall@chromium.org
 mfoltz@chromium.org
-wez@chromium.org
 
-# Team members without committer privileges, for potential FYI reviews.
-haibinlu@chromium.org
+# Fallback OWNER, if others are not available.
+wez@chromium.org
diff --git a/chrome/browser/resources/media_router/compiled_resources2.gyp b/chrome/browser/resources/media_router/compiled_resources2.gyp
index 18695af5..b6af24ba 100644
--- a/chrome/browser/resources/media_router/compiled_resources2.gyp
+++ b/chrome/browser/resources/media_router/compiled_resources2.gyp
@@ -11,6 +11,7 @@
       'target_name': 'media_router',
       'dependencies': [
         '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr',
+        'media_router_ui_interface',
         'elements/media_router_header/compiled_resources2.gyp:media_router_header',
         'elements/media_router_container/compiled_resources2.gyp:media_router_container',
       ],
@@ -27,6 +28,7 @@
     {
       'target_name': 'media_router_ui_interface',
       'dependencies': [
+        '<(EXTERNS_GYP):chrome_send',
         'elements/media_router_header/compiled_resources2.gyp:media_router_header',
         'elements/media_router_container/compiled_resources2.gyp:media_router_container',
       ],
diff --git a/chrome/browser/resources/media_router/elements/issue_banner/issue_banner.js b/chrome/browser/resources/media_router/elements/issue_banner/issue_banner.js
index 855931ba..324360fb 100644
--- a/chrome/browser/resources/media_router/elements/issue_banner/issue_banner.js
+++ b/chrome/browser/resources/media_router/elements/issue_banner/issue_banner.js
@@ -25,30 +25,27 @@
 
     /**
      * The text shown in the default action button.
-     * @private {string}
+     * @private {string|undefined}
      */
     defaultActionButtonText_: {
       type: String,
-      value: '',
     },
 
     /**
      * The issue to show.
-     * @type {?media_router.Issue}
+     * @type {?media_router.Issue|undefined}
      */
     issue: {
       type: Object,
-      value: null,
       observer: 'updateActionButtonText_',
     },
 
     /**
      * The text shown in the secondary action button.
-     * @private {string}
+     * @private {string|undefined}
      */
     secondaryActionButtonText_: {
       type: String,
-      value: '',
     },
   },
 
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html
index e14ec95..fa43bd3 100644
--- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html
+++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html
@@ -212,8 +212,7 @@
       <template is="dom-if"
           if="[[computeIssueBannerShown_(currentView_, issue)]]">
         <issue-banner id="issue-banner" issue="[[issue]]"
-            class$="[[computeIssueBannerClass_(issue)]]"
-            on-issue-action-click="showSinkList_">
+            class$="[[computeIssueBannerClass_(issue)]]">
         </issue-banner>
       </template>
     </div>
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
index 6aa36c17..f61b2ed 100644
--- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
+++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
@@ -20,11 +20,10 @@
 
     /**
      * The list of CastModes to show.
-     * @type {!Array<!media_router.CastMode>}
+     * @type {!Array<!media_router.CastMode>|undefined}
      */
     castModeList: {
       type: Array,
-      value: [],
       observer: 'checkCurrentCastMode_',
     },
 
@@ -39,30 +38,27 @@
 
     /**
      * The current route.
-     * @private {?media_router.Route}
+     * @private {?media_router.Route|undefined}
      */
     currentRoute_: {
       type: Object,
-      value: null,
     },
 
     /**
      * The current view to be shown.
-     * @private {?media_router.MediaRouterView}
+     * @private {?media_router.MediaRouterView|undefined}
      */
     currentView_: {
       type: String,
-      value: null,
       observer: 'currentViewChanged_',
     },
 
     /**
      * The URL to open when the device missing link is clicked.
-     * @type {string}
+     * @type {string|undefined}
      */
     deviceMissingUrl: {
       type: String,
-      value: '',
     },
 
     /**
@@ -76,57 +72,51 @@
 
     /**
      * The time |this| element calls ready().
-     * @private {number}
+     * @private {number|undefined}
      */
     elementReadyTimeMs_: {
       type: Number,
-      value: 0,
     },
 
     /**
      * The URL to open when the cloud services pref learn more link is clicked.
-     * @type {string}
+     * @type {string|undefined}
      */
     firstRunFlowCloudPrefLearnMoreUrl: {
       type: String,
-      value: '',
     },
 
     /**
      * The URL to open when the first run flow learn more link is clicked.
-     * @type {string}
+     * @type {string|undefined}
      */
     firstRunFlowLearnMoreUrl: {
       type: String,
-      value: '',
     },
 
     /**
      * The header text for the sink list.
-     * @type {string}
+     * @type {string|undefined}
      */
     headerText: {
       type: String,
-      value: '',
     },
 
     /**
      * The header text tooltip. This would be descriptive of the
      * source origin, whether a host name, tab URL, etc.
-     * @type {string}
+     * @type {string|undefined}
      */
     headerTextTooltip: {
       type: String,
-      value: '',
     },
 
     /**
      * Whether the browser is currently incognito.
-     * @type {boolean}
+     * @type {boolean|undefined}
      */
     isOffTheRecord: {
       type: Boolean,
-      value: false,
     },
 
     /**
@@ -171,22 +161,20 @@
 
     /**
      * Whether the user's mouse is positioned over the dialog.
-     * @private {boolean}
+     * @private {boolean|undefined}
      */
     mouseIsPositionedOverDialog_: {
       type: Boolean,
-      value: false,
     },
 
     /**
      * The ID of the route that is currently being created. This is set when
      * route creation is resolved but not ready for its controls to be
      * displayed.
-     * @private {string}
+     * @private {string|undefined}
      */
     pendingCreatedRouteId_: {
       type: String,
-      value: '',
     },
 
     /**
@@ -212,11 +200,10 @@
 
     /**
      * Helps manage the state of creating a sink and a route from a pseudo sink.
-     * @private {PseudoSinkSearchState}
+     * @private {PseudoSinkSearchState|undefined}
      */
     pseudoSinkSearchState_: {
       type: Object,
-      value: null,
     },
 
     /**
@@ -232,21 +219,19 @@
 
     /**
      * The list of current routes.
-     * @type {!Array<!media_router.Route>}
+     * @type {!Array<!media_router.Route>|undefined}
      */
     routeList: {
       type: Array,
-      value: [],
       observer: 'rebuildRouteMaps_',
     },
 
     /**
      * Maps media_router.Route.id to corresponding media_router.Route.
-     * @private {!Object<!string, !media_router.Route>}
+     * @private {!Object<!string, !media_router.Route>|undefined}
      */
     routeMap_: {
       type: Object,
-      value: {},
     },
 
     /**
@@ -262,39 +247,35 @@
     /**
      * Sinks to display that match |searchInputText_|.
      * @private {!Array<!{sinkItem: !media_router.Sink,
-     *                    substrings: Array<!Array<number>>}>}
+     *                    substrings: Array<!Array<number>>}>|undefined}
      */
     searchResultsToShow_: {
       type: Array,
-      value: [],
     },
 
     /**
      * Whether to show the user domain of sinks associated with identity.
-     * @type {boolean}
+     * @type {boolean|undefined}
      */
     showDomain: {
       type: Boolean,
-      value: false,
     },
 
     /**
      * Whether to show the first run flow.
-     * @type {boolean}
+     * @type {boolean|undefined}
      */
     showFirstRunFlow: {
       type: Boolean,
-      value: false,
       observer: 'updateElementPositioning_',
     },
 
     /**
      * Whether to show the cloud preference setting in the first run flow.
-     * @type {boolean}
+     * @type {boolean|undefined}
      */
     showFirstRunFlowCloudPref: {
       type: Boolean,
-      value: false,
     },
 
     /**
@@ -318,11 +299,10 @@
 
     /**
      * Maps media_router.Sink.id to corresponding media_router.Sink.
-     * @private {!Object<!string, !media_router.Sink>}
+     * @private {!Object<!string, !media_router.Sink>|undefined}
      */
     sinkMap_: {
       type: Object,
-      value: {},
     },
 
     /**
@@ -336,11 +316,10 @@
 
     /**
      * Sinks to show for the currently selected cast mode.
-     * @private {!Array<!media_router.Sink>}
+     * @private {!Array<!media_router.Sink>|undefined}
      */
     sinksToShow_: {
       type: Array,
-      value: [],
     },
 
     /**
@@ -380,29 +359,27 @@
 
   ready: function() {
     this.elementReadyTimeMs_ = performance.now();
-
-    // If this is not on a Mac platform, remove the placeholder. See
-    // onFocus_() for more details. ready() is only called once, so no need
-    // to check if the placeholder exist before removing.
-    if (!cr.isMac)
-      this.$$('#focus-placeholder').remove();
-
-    document.addEventListener('keydown', this.onKeydown_.bind(this), true);
-    this.setSearchFocusHandlers_();
     this.showSinkList_();
-  },
 
-  attached: function() {
-    this.updateElementPositioning_();
+    Polymer.RenderStatus.afterNextRender(this, function() {
+      // If this is not on a Mac platform, remove the placeholder. See
+      // onFocus_() for more details. ready() is only called once, so no need
+      // to check if the placeholder exist before removing.
+      if (!cr.isMac)
+        this.$$('#focus-placeholder').remove();
 
-    // Turn off the spinner after 3 seconds, then report the current number of
-    // sinks.
-    this.async(function() {
-      this.justOpened_ = false;
-      this.fire('report-sink-count', {
-        sinkCount: this.allSinks.length,
-      });
-    }, 3000 /* 3 seconds */);
+      document.addEventListener('keydown', this.onKeydown_.bind(this), true);
+      this.setSearchFocusHandlers_();
+
+      // Turn off the spinner after 3 seconds, then report the current number of
+      // sinks.
+      this.async(function() {
+        this.justOpened_ = false;
+        this.fire('report-sink-count', {
+          sinkCount: this.allSinks.length,
+        });
+      }, 3000 /* 3 seconds */);
+    });
   },
 
   /**
@@ -613,7 +590,7 @@
   /**
    * @param {?media_router.MediaRouterView} view The current view.
    * @param {string} headerText The header text for the sink list.
-   * @return {string} The text for the header.
+   * @return {string|undefined} The text for the header.
    * @private
    */
   computeHeaderText_: function(view, headerText) {
@@ -1140,7 +1117,7 @@
       // issue was non-blocking, this would be a no-op. It is expected that
       // the only way to clear an issue is by user action; the IssueManager
       // (C++ side) does not clear issues in the UI.
-      this.currentView_ = media_router.MediaRouterView.SINK_LIST;
+      this.showSinkList_();
     }
 
     if (!!this.pendingCreatedRouteId_ && !!issue &&
diff --git a/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.js b/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.js
index 45f23d28..599c99f 100644
--- a/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.js
+++ b/chrome/browser/resources/media_router/elements/media_router_header/media_router_header.js
@@ -10,11 +10,10 @@
     /**
      * The name of the icon used as the back button. This is set once, when
      * the |this| is ready.
-     * @private {string}
+     * @private {string|undefined}
      */
     arrowDropIcon_: {
       type: String,
-      value: '',
     },
 
     /**
@@ -28,11 +27,10 @@
 
     /**
      * The header text to show.
-     * @type {string}
+     * @type {string|undefined}
      */
     headingText: {
       type: String,
-      value: '',
     },
 
     /**
@@ -57,39 +55,35 @@
 
     /**
      * Whether to show the user email in the header.
-     * @type {boolean}
+     * @type {boolean|undefined}
      */
     showEmail: {
       type: Boolean,
-      value: false,
       observer: 'maybeChangeHeaderHeight_',
     },
 
     /**
      * The text to show in the tooltip.
-     * @type {string}
+     * @type {string|undefined}
      */
     tooltip: {
       type: String,
-      value: '',
     },
 
     /**
      * The user email if they are signed in.
-     * @type {string}
+     * @type {string|undefined}
      */
     userEmail: {
       type: String,
-      value: '',
     },
 
     /**
      * The current view that this header should reflect.
-     * @type {?media_router.MediaRouterView}
+     * @type {?media_router.MediaRouterView|undefined}
      */
     view: {
       type: String,
-      value: null,
       observer: 'updateHeaderCursorStyle_',
     },
   },
diff --git a/chrome/browser/resources/media_router/elements/media_router_search_highlighter/media_router_search_highlighter.js b/chrome/browser/resources/media_router/elements/media_router_search_highlighter/media_router_search_highlighter.js
index 317907f..a38aa7f9 100644
--- a/chrome/browser/resources/media_router/elements/media_router_search_highlighter/media_router_search_highlighter.js
+++ b/chrome/browser/resources/media_router/elements/media_router_search_highlighter/media_router_search_highlighter.js
@@ -24,11 +24,11 @@
      * null corresponds to an empty string when the arrays are being combined.
      * So both examples reproduce the text 'living room', but with different
      * words highlighted.
-     * @type {{highlightedText: !Array<?string>, plainText: !Array<?string>}}
+     * @type {{highlightedText: !Array<?string>,
+     *         plainText: !Array<?string>}|undefined}
      */
     data: {
       type: Object,
-      value: null,
       observer: 'dataChanged_',
     },
 
@@ -36,11 +36,10 @@
      * The text that this element is displaying as a plain string. The primary
      * purpose for this property is to make getting this element's textContent
      * easy for testing.
-     * @type {?string}
+     * @type {string|undefined}
      */
     text: {
       type: String,
-      value: null,
       readOnly: true,
       notify: false,
     },
diff --git a/chrome/browser/resources/media_router/elements/route_details/route_details.js b/chrome/browser/resources/media_router/elements/route_details/route_details.js
index f38468c..d3db440 100644
--- a/chrome/browser/resources/media_router/elements/route_details/route_details.js
+++ b/chrome/browser/resources/media_router/elements/route_details/route_details.js
@@ -10,29 +10,26 @@
   properties: {
     /**
      * The text for the current casting activity status.
-     * @private {string}
+     * @private {string|undefined}
      */
     activityStatus_: {
       type: String,
-      value: '',
     },
 
     /**
      * Whether the browser is currently incognito.
-     * @type {boolean}
+     * @type {boolean|undefined}
      */
     isOffTheRecord: {
       type: Boolean,
-      value: false,
     },
 
     /**
      * The route to show.
-     * @type {?media_router.Route}
+     * @type {?media_router.Route|undefined}
      */
     route: {
       type: Object,
-      value: null,
       observer: 'maybeLoadCustomController_',
     },
 
diff --git a/chrome/browser/resources/media_router/media_router_ui_interface.js b/chrome/browser/resources/media_router/media_router_ui_interface.js
index 93be9fc..ed975c2 100644
--- a/chrome/browser/resources/media_router/media_router_ui_interface.js
+++ b/chrome/browser/resources/media_router/media_router_ui_interface.js
@@ -150,8 +150,8 @@
    *   showDomain - true if the user domain should be shown.
    */
   function setSinkListAndIdentity(data) {
-    container.allSinks = data['sinks'];
     container.showDomain = data['showDomain'];
+    container.allSinks = data['sinks'];
     header.userEmail = data['userEmail'];
     header.showEmail = data['showEmail'];
   }
diff --git a/chrome/browser/resources/options/browser_options.html b/chrome/browser/resources/options/browser_options.html
index 06e2676a..84b37586b 100644
--- a/chrome/browser/resources/options/browser_options.html
+++ b/chrome/browser/resources/options/browser_options.html
@@ -519,11 +519,18 @@
   <section id="bluetooth-devices" hidden>
     <h3 i18n-content="bluetooth"></h3>
     <div id="bluetooth-options-div">
-      <div class="checkbox">
+      <div class="checkbox controlled-setting-with-label">
         <label>
           <input type="checkbox" id="enable-bluetooth"
                  metric="Options_BluetoothEnabled">
-          <span i18n-content="enableBluetooth">
+          <span>
+            <span i18n-content="enableBluetooth"></span>
+            <span id="bluetooth-controlled-setting-indicator"
+                  class="controlled-setting-indicator"
+                  pref="cros.device.allow_bluetooth"
+                  hidden="true">
+            </span>
+          </span>
         </label>
       </div>
       <div class="settings-list bluetooth-device-list" hidden>
diff --git a/chrome/browser/resources/options/browser_options.js b/chrome/browser/resources/options/browser_options.js
index b35d004..2bc11d18 100644
--- a/chrome/browser/resources/options/browser_options.js
+++ b/chrome/browser/resources/options/browser_options.js
@@ -2127,7 +2127,10 @@
      * @private
      */
     onBluetoothAdapterStateChanged_: function(state) {
-      if (!state || !state.available) {
+      var disallowBluetooth = !loadTimeData.getBoolean('allowBluetooth');
+      // If allowBluetooth is false, state.available will always be false, so
+      // assume Bluetooth is available but disabled by policy.
+      if (!state || (!state.available && !disallowBluetooth)) {
         this.bluetoothAdapterState_ = null;
         $('bluetooth-devices').hidden = true;
         return;
@@ -2136,6 +2139,19 @@
       this.bluetoothAdapterState_ = state;
       this.setBluetoothState_(state.powered);
 
+      var enableBluetoothEl = $('enable-bluetooth');
+      if (disallowBluetooth) {
+        enableBluetoothEl.setAttribute('pref', 'cros.device.allow_bluetooth');
+        enableBluetoothEl.setAttribute('controlled-by', 'policy');
+        enableBluetoothEl.disabled = true;
+        $('bluetooth-controlled-setting-indicator').hidden = false;
+        return;
+      }
+      enableBluetoothEl.removeAttribute('pref');
+      enableBluetoothEl.removeAttribute('controlled-by');
+      enableBluetoothEl.disabled = false;
+      $('bluetooth-controlled-setting-indicator').hidden = true;
+
       // Flush the device lists.
       $('bluetooth-paired-devices-list').clear();
       $('bluetooth-unpaired-devices-list').clear();
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_browser_proxy.js b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_browser_proxy.js
index 9c52c79..575345ef 100644
--- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_browser_proxy.js
+++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_browser_proxy.js
@@ -16,6 +16,9 @@
      * @return {!Promise} A promise resolved when data clearing has completed.
      */
     clearBrowsingData: function() {},
+
+    /** Initializes the dialog. */
+    initialize: function() {},
   };
 
   /**
@@ -30,6 +33,11 @@
     clearBrowsingData: function() {
       return cr.sendWithPromise('clearBrowsingData');
     },
+
+    /** @override */
+    initialize: function() {
+      chrome.send('initializeClearBrowsingData');
+    },
   };
 
   return {
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html
index 6c77c7d..36357a3 100644
--- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html
+++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html
@@ -12,12 +12,59 @@
 <dom-module id="settings-clear-browsing-data-dialog">
   <template>
     <style include="settings-shared">
+      #dialog {
+        max-width: 600px;
+      }
+
       paper-spinner {
+        -webkit-margin-end: 16px;
         margin-bottom: auto;
         margin-top: auto;
-        -webkit-margin-end: 16px;
+      }
+
+      #generalFooter {
+        margin: 0;
+        min-height: 18px;
+      }
+
+      #generalFooter iron-icon {
+        height: 18px;
+        padding: 1px;
+        width: 18px;
+      }
+
+      #googleFooter {
+        margin: 0 0 0.8em 0;
+        min-height: 16px;
+      }
+
+      #googleFooter iron-icon {
+        height: 16px;
+        padding: 2px;
+        width: 16px;
+      }
+
+      .clear-browsing-data-footer {
+        padding-left: 4px;
+      }
+
+      .clear-browsing-data-footer .footer-text {
+        -webkit-margin-start: 36px;
+      }
+
+      .clear-browsing-data-footer iron-icon {
+        float: left;
+      }
+
+      html[dir='rtl'] .clear-browsing-data-footer iron-icon {
+        float: right;
+      }
+
+      .clear-browsing-data-footer a {
+        text-decoration: none;
       }
     </style>
+
     <settings-dialog id="dialog">
       <div class="title">$i18n{clearBrowsingData}</div>
       <div class="body">
@@ -71,8 +118,20 @@
         </paper-button>
       </div>
       <div class="footer">
-        <span>$i18n{warnAboutNonClearedData}</span>
-        <span>$i18n{clearsSyncedData}</span>
+        <div id="googleFooter" class="clear-browsing-data-footer">
+          <iron-icon icon="md-settings-icons:googleg"></iron-icon>
+          <div class="footer-text">$i18nRaw{otherFormsOfBrowsingHistory}</div>
+        </div>
+        <div id="generalFooter" class="clear-browsing-data-footer">
+          <iron-icon icon="info"></iron-icon>
+          <div class="footer-text">
+            <span id="syncedDataSentence">$i18n{clearsSyncedData}</span>
+            <span>$i18n{warnAboutNonClearedData}</span>
+            <a id="clear-browser-data-old-learn-more-link"
+                href="$i18n{clearBrowsingDataLearnMoreUrl}"
+                target="_blank">$i18n{learnMore}</a>
+          </div>
+        </div>
       </div>
     </settings-dialog>
   </template>
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js
index c14e51e..ab1fff3 100644
--- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js
+++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js
@@ -49,8 +49,12 @@
     this.addWebUIListener(
         'browsing-history-pref-changed',
         this.setAllowDeletingHistory_.bind(this));
+    this.addWebUIListener(
+        'update-footer',
+        this.updateFooter_.bind(this));
     this.browserProxy_ =
         settings.ClearBrowsingDataBrowserProxyImpl.getInstance();
+    this.browserProxy_.initialize();
     this.$.dialog.open();
   },
 
@@ -67,6 +71,23 @@
     }
   },
 
+  /**
+   * Updates the footer to show only those sentences that are relevant to this
+   * user.
+   * @param {boolean} syncing Whether the user is syncing data.
+   * @param {boolean} otherFormsOfBrowsingHistory Whether the user has other
+   *     forms of browsing history in their account.
+   * @private
+   */
+  updateFooter_: function(syncing, otherFormsOfBrowsingHistory) {
+    this.$.googleFooter.hidden = !otherFormsOfBrowsingHistory;
+    this.$.syncedDataSentence.hidden = !syncing;
+  },
+
+  open: function() {
+    this.$.dialog.open();
+  },
+
   /** @private */
   onClearBrowsingDataTap_: function() {
     this.clearingInProgress_ = true;
diff --git a/chrome/browser/resources/settings/icons.html b/chrome/browser/resources/settings/icons.html
index 785741c..5aa0629 100644
--- a/chrome/browser/resources/settings/icons.html
+++ b/chrome/browser/resources/settings/icons.html
@@ -22,6 +22,15 @@
         <path d="M31 28h-1.59l-.55-.55C30.82 25.18 32 22.23 32 19c0-7.18-5.82-13-13-13S6 11.82 6 19s5.82 13 13 13c3.23 0 6.18-1.18 8.45-3.13l.55.55V31l10 9.98L40.98 38 31 28zm-12 0c-4.97 0-9-4.03-9-9s4.03-9 9-9 9 4.03 9 9-4.03 9-9 9z"></path>
         <path d="M0 0h48v48H0z" fill="none"></path>
       </g>
+
+      <!-- The Google "G" icon in the Clear Browsing Data dialog. -->
+      <g id="googleg" width="16px" height="16px" viewBox="0 0 16 16">
+        <path fill="#4285F4" d="M14.72 8.16c0-.46-.05-.81-.11-1.16H8v2.4h3.97c-.1.62-.52 1.59-1.45 2.26v1.64h2.12c1.32-1.21 2.08-3.01 2.08-5.14z"></path>
+        <path fill="#34A853" d="M8 15c1.89 0 3.47-.63 4.63-1.69l-2.12-1.64c-.6.43-1.42.75-2.51.75-1.89 0-3.48-1.24-4.08-2.96H1.75v1.69C2.9 13.43 5.26 15 8 15z"></path>
+        <path fill="#FBBC05" d="M3.92 9.45C3.77 9 3.66 8.51 3.66 8s.1-1 .26-1.45V4.86H1.75C1.27 5.81 1 6.87 1 8s.27 2.19.75 3.14l2.17-1.69z"></path>
+        <path fill="#EA4335" d="M8 3.58c1.36 0 2.27.58 2.79 1.08l1.9-1.83C11.47 1.69 9.89 1 8 1 5.26 1 2.9 2.57 1.75 4.86l2.17 1.69C4.52 4.83 6.11 3.58 8 3.58z"></path>
+        <path fill="none" d="M1 1h14v14H1z"></path>
+      </g>
     </defs>
   </svg>
 </iron-icon-set>
diff --git a/chrome/browser/resources/settings/people_page/compiled_resources2.gyp b/chrome/browser/resources/settings/people_page/compiled_resources2.gyp
index fe835c52..2aaf207 100644
--- a/chrome/browser/resources/settings/people_page/compiled_resources2.gyp
+++ b/chrome/browser/resources/settings/people_page/compiled_resources2.gyp
@@ -102,7 +102,9 @@
     {
       'target_name': 'sync_browser_proxy',
       'dependencies': [
+        '<(DEPTH)/third_party/closure_compiler/externs/compiled_resources2.gyp:metrics_private',
         '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr',
+        '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:load_time_data',
       ],
       'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'],
     },
diff --git a/chrome/browser/resources/settings/people_page/people_page.html b/chrome/browser/resources/settings/people_page/people_page.html
index 7565ad77..234a5c65 100644
--- a/chrome/browser/resources/settings/people_page/people_page.html
+++ b/chrome/browser/resources/settings/people_page/people_page.html
@@ -35,7 +35,8 @@
         width: 40px;
       }
 
-      #profile-icon:hover {
+      #profile-icon:hover,
+      #activity-controls:hover {
         cursor: pointer;
       }
 
@@ -44,6 +45,19 @@
         cursor: pointer;
       }
 </if>
+      #googleg-logo-container {
+        -webkit-margin-end: 4px;
+        display: flex;
+        justify-content: center;
+        width: 40px;
+      }
+
+      #googleg-logo {
+        background-image: url(../../../../../ui/webui/resources/images/200-logo_googleg.png);
+        background-size: cover;
+        height: var(--iron-icon-height);
+        width: var(--iron-icon-width);
+      }
     </style>
     <settings-animated-pages id="pages" current-route="{{currentRoute}}"
         section="people">
@@ -100,6 +114,17 @@
           </div>
         </template>
 
+        <div class="settings-box" id="activity-controls"
+            on-tap="onActivityControlsTap_">
+          <div id="googleg-logo-container">
+            <div id="googleg-logo"></div>
+          </div>
+          <div class="middle">
+            <div>$i18n{personalizeGoogleServicesTitle}</div>
+            <div class="secondary">$i18n{personalizeGoogleServicesText}</div>
+          </div>
+        </div>
+
 <if expr="chromeos">
         <div class="settings-box">
           <settings-checkbox pref="{{prefs.settings.enable_screen_lock}}"
diff --git a/chrome/browser/resources/settings/people_page/people_page.js b/chrome/browser/resources/settings/people_page/people_page.js
index e00704a..d8caa52 100644
--- a/chrome/browser/resources/settings/people_page/people_page.js
+++ b/chrome/browser/resources/settings/people_page/people_page.js
@@ -184,6 +184,11 @@
 </if>
 
   /** @private */
+  onActivityControlsTap_: function() {
+    this.syncBrowserProxy_.openActivityControlsUrl();
+  },
+
+  /** @private */
   onSigninTap_: function() {
     this.syncBrowserProxy_.startSignIn();
   },
diff --git a/chrome/browser/resources/settings/people_page/sync_browser_proxy.html b/chrome/browser/resources/settings/people_page/sync_browser_proxy.html
index c3893471..c758d1c 100644
--- a/chrome/browser/resources/settings/people_page/sync_browser_proxy.html
+++ b/chrome/browser/resources/settings/people_page/sync_browser_proxy.html
@@ -1,2 +1,3 @@
+<link rel="import" href="chrome://md-settings/i18n_setup.html">
 <link rel="import" href="chrome://resources/html/cr.html">
 <script src="chrome://md-settings/people_page/sync_browser_proxy.js"></script>
diff --git a/chrome/browser/resources/settings/people_page/sync_browser_proxy.js b/chrome/browser/resources/settings/people_page/sync_browser_proxy.js
index 2b9aa7b..c2954cf 100644
--- a/chrome/browser/resources/settings/people_page/sync_browser_proxy.js
+++ b/chrome/browser/resources/settings/people_page/sync_browser_proxy.js
@@ -142,6 +142,11 @@
      * @return {!Promise<!settings.PageStatus>}
      */
     setSyncPrefs: function(syncPrefs) {},
+
+    /**
+     * Opens the Google Activity Controls url in a new tab.
+     */
+    openActivityControlsUrl: function() {},
   };
 
   /**
@@ -198,6 +203,13 @@
       return cr.sendWithPromise('SyncSetupConfigure',
                                 JSON.stringify(syncPrefs));
     },
+
+    /** @override */
+    openActivityControlsUrl: function() {
+      chrome.metricsPrivate.recordUserAction(
+          'Signin_AccountSettings_GoogleActivityControlsClicked');
+      window.open(loadTimeData.getString('activityControlsUrl'));
+    }
   };
 
   return {
diff --git a/chrome/browser/resources/settings/people_page/sync_page.html b/chrome/browser/resources/settings/people_page/sync_page.html
index 2f1059e8..4ee5357 100644
--- a/chrome/browser/resources/settings/people_page/sync_page.html
+++ b/chrome/browser/resources/settings/people_page/sync_page.html
@@ -1,7 +1,6 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-pages/iron-pages.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-checkbox/paper-checkbox.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-dropdown-menu/paper-dropdown-menu.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-input/paper-input.html">
@@ -28,46 +27,55 @@
 
           <div id="sync-item-list">
             <paper-checkbox checked="{{syncPrefs.appsSynced}}"
+                on-change="onSingleSyncDataTypeChanged_"
                 hidden="[[!syncPrefs.appsRegistered]]"
                 disabled="[[shouldSyncCheckboxBeDisabled_(syncPrefs.syncAllDataTypes, syncPrefs.appsEnforced)]]">
               <span i18n-content="appCheckboxLabel"></span>
             </paper-checkbox>
             <paper-checkbox checked="{{syncPrefs.autofillSynced}}"
+                on-change="onSingleSyncDataTypeChanged_"
                 hidden="[[!syncPrefs.autofillRegistered]]"
                 disabled="[[shouldSyncCheckboxBeDisabled_(syncPrefs.syncAllDataTypes, syncPrefs.autofillEnforced)]]">
               <span i18n-content="autofillCheckboxLabel"></span>
             </paper-checkbox>
             <paper-checkbox checked="{{syncPrefs.bookmarksSynced}}"
+                on-change="onSingleSyncDataTypeChanged_"
                 hidden="[[!syncPrefs.bookmarksRegistered]]"
                 disabled="[[shouldSyncCheckboxBeDisabled_(syncPrefs.syncAllDataTypes, syncPrefs.bookmarksEnforced)]]">
               <span i18n-content="bookmarksCheckboxLabel"></span>
             </paper-checkbox>
             <paper-checkbox checked="{{syncPrefs.extensionsSynced}}"
+                on-change="onSingleSyncDataTypeChanged_"
                 hidden="[[!syncPrefs.extensionsRegistered]]"
                 disabled="[[shouldSyncCheckboxBeDisabled_(syncPrefs.syncAllDataTypes, syncPrefs.extensionsEnforced)]]">
               <span i18n-content="extensionsCheckboxLabel"></span>
             </paper-checkbox>
             <paper-checkbox checked="{{syncPrefs.typedUrlsSynced}}"
+                on-change="onSingleSyncDataTypeChanged_"
                 hidden="[[!syncPrefs.typedUrlsRegistered]]"
                 disabled="[[shouldSyncCheckboxBeDisabled_(syncPrefs.syncAllDataTypes, syncPrefs.typedUrlsEnforced)]]">
               <span i18n-content="historyCheckboxLabel"></span>
             </paper-checkbox>
             <paper-checkbox checked="{{syncPrefs.passwordsSynced}}"
+                on-change="onSingleSyncDataTypeChanged_"
                 hidden="[[!syncPrefs.passwordsRegistered]]"
                 disabled="[[shouldSyncCheckboxBeDisabled_(syncPrefs.syncAllDataTypes, syncPrefs.passwordsEnforced)]]">
               <span i18n-content="passwordsCheckboxLabel"></span>
             </paper-checkbox>
             <paper-checkbox checked="{{syncPrefs.preferencesSynced}}"
+                on-change="onSingleSyncDataTypeChanged_"
                 hidden="[[!syncPrefs.preferencesRegistered]]"
                 disabled="[[shouldSyncCheckboxBeDisabled_(syncPrefs.syncAllDataTypes, syncPrefs.preferencesEnforced)]]">
               <span i18n-content="settingsCheckboxLabel"></span>
             </paper-checkbox>
             <paper-checkbox checked="{{syncPrefs.themesSynced}}"
+                on-change="onSingleSyncDataTypeChanged_"
                 hidden="[[!syncPrefs.themesRegistered]]"
                 disabled="[[shouldSyncCheckboxBeDisabled_(syncPrefs.syncAllDataTypes, syncPrefs.themesEnforced)]]">
               <span i18n-content="themesAndWallpapersCheckboxLabel"></span>
             </paper-checkbox>
             <paper-checkbox checked="{{syncPrefs.tabsSynced}}"
+                on-change="onSingleSyncDataTypeChanged_"
                 hidden="[[!syncPrefs.tabsRegistered]]"
                 disabled="[[shouldSyncCheckboxBeDisabled_(syncPrefs.syncAllDataTypes, syncPrefs.tabsEnforced)]]">
               <span i18n-content="openTabsCheckboxLabel"></span>
@@ -117,14 +125,6 @@
             <div id="incorrectPassphraseError" hidden>[[i18n('incorrectPassphraseError')]]</div>
           </template>
         </div>
-
-        <div class="settings-box">
-          <paper-button i18n-content="cancel" on-tap="onCancelTap_">
-          </paper-button>
-          <paper-button i18n-content="ok" on-tap="onOkTap_"
-              class="action-button">
-          </paper-button>
-        </div>
       </div>
     </iron-pages>
   </template>
diff --git a/chrome/browser/resources/settings/people_page/sync_page.js b/chrome/browser/resources/settings/people_page/sync_page.js
index f40bf31..1f98bde6 100644
--- a/chrome/browser/resources/settings/people_page/sync_page.js
+++ b/chrome/browser/resources/settings/people_page/sync_page.js
@@ -143,23 +143,31 @@
       this.set('syncPrefs.passwordsSynced', true);
       this.set('syncPrefs.tabsSynced', true);
     }
-  },
 
-  /** @private */
-  onCancelTap_: function() {
-    if (this.currentRoute.section == 'people' &&
-        this.currentRoute.subpage.length == 1 &&
-        this.currentRoute.subpage[0] == 'sync') {
-      // Event is caught by settings-animated-pages.
-      this.fire('subpage-back');
-    }
+    this.onSingleSyncDataTypeChanged_();
   },
 
   /**
-   * Sets the sync data by sending it to the browser.
+   * Handler for when any sync data type checkbox is changed.
    * @private
    */
-  onOkTap_: function() {
+  onSingleSyncDataTypeChanged_: function() {
+    // The usePassphrase field is true if and only if the user is creating a
+    // new passphrase or confirming an existing one. See the comment on the
+    // syncPrefs property.
+    // TODO(tommycli): Clean up the C++ handler to handle passwords separately.
+    this.syncPrefs.usePassphrase = false;
+
+    this.browserProxy_.setSyncPrefs(this.syncPrefs).then(
+        this.handlePageStatusChanged_.bind(this));
+  },
+
+  /**
+   * TODO(tommycli): Hook this up to a password submit button.
+   * Sends the entered password to the browser.
+   * @private
+   */
+  onPasswordSubmitTap_: function() {
     if (this.creatingNewPassphrase) {
       // If a new password has been entered but it is invalid, do not send the
       // sync state to the API.
@@ -191,7 +199,12 @@
    */
   handlePageStatusChanged_: function(pageStatus) {
     if (pageStatus == settings.PageStatus.DONE) {
-      this.onCancelTap_();
+      if (this.currentRoute.section == 'people' &&
+          this.currentRoute.subpage.length == 1 &&
+          this.currentRoute.subpage[0] == 'sync') {
+        // Event is caught by settings-animated-pages.
+        this.fire('subpage-back');
+      }
     } else if (pageStatus == settings.PageStatus.TIMEOUT) {
       this.$.pages.selected = 'timeout';
     } else if (pageStatus == settings.PageStatus.PASSPHRASE_FAILED) {
diff --git a/chrome/browser/resources/settings/settings_menu/settings_menu.html b/chrome/browser/resources/settings/settings_menu/settings_menu.html
index 679a02c..dcd49b42e 100644
--- a/chrome/browser/resources/settings/settings_menu/settings_menu.html
+++ b/chrome/browser/resources/settings/settings_menu/settings_menu.html
@@ -67,98 +67,96 @@
       }
     </style>
     <paper-menu name="root-menu">
-      <paper-submenu opened="{{basicOpened_}}">
-        <div class="menu-trigger" data-page="basic" data-section=""
-            on-tap="openPage_">
+      <paper-submenu data-page="basic" id="basicPage">
+        <div class="menu-trigger" data-section="" on-tap="openPage_">
           <span i18n-content="basicPageTitle"></span>
-          <iron-icon icon="{{arrowState_(basicOpened_)}}" item-icon></iron-icon>
+          <iron-icon icon="[[arrowState_(basicOpened_)]]" item-icon></iron-icon>
         </div>
-        <paper-menu class="menu-content">
+        <paper-menu attr-for-selected="data-section" class="menu-content"
+            data-page="basic" id="basicMenu">
 <if expr="chromeos">
-          <div data-page="basic" data-section="internet" on-tap="openPage_">
+          <div data-section="internet" on-tap="openPage_">
             <iron-icon icon="device:network-wifi" item-icon></iron-icon>
             <span i18n-content="internetPageTitle"></span>
           </div>
 </if>
-          <div data-page="basic" data-section="people" on-tap="openPage_">
+          <div data-section="people" on-tap="openPage_">
             <iron-icon icon="social:people" item-icon></iron-icon>
             <span i18n-content="peoplePageTitle"></span>
           </div>
-          <div data-page="basic" data-section="appearance" on-tap="openPage_">
+          <div data-section="appearance" on-tap="openPage_">
             <iron-icon icon="image:palette" item-icon></iron-icon>
             <span i18n-content="appearancePageTitle"></span>
           </div>
 <if expr="chromeos">
-          <div data-page="basic" data-section="device" on-tap="openPage_">
+          <div data-section="device" on-tap="openPage_">
             <iron-icon icon="hardware:laptop-chromebook" item-icon></iron-icon>
             <span i18n-content="devicePageTitle"></span>
           </div>
 </if>
-          <div data-page="basic" data-section="search" on-tap="openPage_">
+          <div data-section="search" on-tap="openPage_">
             <iron-icon icon="search" item-icon></iron-icon>
             <span i18n-content="searchPageTitle"></span>
           </div>
 <if expr="not chromeos">
-          <div data-page="basic" data-section="defaultBrowser"
-              on-tap="openPage_">
+          <div data-section="defaultBrowser" on-tap="openPage_">
             <iron-icon icon="av:web" item-icon></iron-icon>
             <span i18n-content="defaultBrowser"></span>
           </div>
 </if>
-          <div data-page="basic" data-section="onStartup" on-tap="openPage_">
+          <div data-section="onStartup" on-tap="openPage_">
             <iron-icon icon="icons:power-settings-new" item-icon></iron-icon>
             <span i18n-content="onStartup"></span>
           </div>
         </paper-menu>
       </paper-submenu>
-      <paper-submenu opened="{{advancedOpened_}}">
-        <div class="menu-trigger" data-page="advanced" data-section=""
-            on-tap="openPage_">
+      <paper-submenu id="advancedPage" data-page="advanced">
+        <div class="menu-trigger" data-section="" on-tap="openPage_">
           <span i18n-content="advancedPageTitle"></span>
-          <iron-icon icon="{{arrowState_(advancedOpened_)}}" item-icon>
+          <iron-icon icon="[[arrowState_(advancedOpened_)]]" item-icon>
           </iron-icon>
         </div>
-        <paper-menu class="menu-content">
+        <paper-menu attr-for-selected="data-section" class="menu-content"
+            data-page="advanced" id="advancedMenu">
 <if expr="chromeos">
-          <div data-page="advanced" data-section="dateTime" on-tap="openPage_">
+          <div data-section="dateTime" on-tap="openPage_">
             <iron-icon icon="device:access-time" item-icon></iron-icon>
             <span i18n-content="dateTimePageTitle"></span>
           </div>
 </if>
-          <div data-page="advanced" data-section="privacy" on-tap="openPage_">
+          <div data-section="privacy" on-tap="openPage_">
             <iron-icon icon="hardware:security" item-icon></iron-icon>
             <span i18n-content="privacyPageTitle"></span>
           </div>
 <if expr="chromeos">
-          <div data-page="advanced" data-section="bluetooth" on-tap="openPage_">
+          <div data-section="bluetooth" on-tap="openPage_">
             <iron-icon icon="device:bluetooth" item-icon></iron-icon>
             <span i18n-content="bluetoothPageTitle"></span>
           </div>
 </if>
-          <div data-page="advanced" data-section="passwordsAndForms"
-              on-tap="openPage_">
+          <div data-section="passwordsAndForms" on-tap="openPage_">
             <iron-icon icon="icons:assignment" item-icon></iron-icon>
             <span i18n-content="passwordsAndAutofillPageTitle"></span>
           </div>
-          <div data-page="advanced" data-section="languages" on-tap="openPage_">
+          <div data-section="languages" on-tap="openPage_">
             <iron-icon icon="icons:language" item-icon></iron-icon>
             <span i18n-content="languagesPageTitle"></span>
           </div>
-          <div data-page="advanced" data-section="downloads" on-tap="openPage_">
+          <div data-section="downloads" on-tap="openPage_">
             <iron-icon icon="icons:file-download" item-icon></iron-icon>
             <span i18n-content="downloadsPageTitle"></span>
           </div>
-          <div data-page="advanced" data-section="a11y" on-tap="openPage_">
+          <div data-section="a11y" on-tap="openPage_">
             <iron-icon icon="icons:accessibility" item-icon></iron-icon>
             <span i18n-content="a11yPageTitle"></span>
           </div>
 <if expr="not chromeos">
-          <div data-page="advanced" data-section="system" on-tap="openPage_">
+          <div data-section="system" on-tap="openPage_">
             <iron-icon icon="icons:build" item-icon></iron-icon>
             <span i18n-content="systemPageTitle"></span>
           </div>
 </if>
-          <div data-page="advanced" data-section="reset" on-tap="openPage_">
+          <div data-section="reset" on-tap="openPage_">
             <iron-icon icon="icons:restore" item-icon></iron-icon>
             <span i18n-content="resetPageTitle"></span>
           </div>
diff --git a/chrome/browser/resources/settings/settings_menu/settings_menu.js b/chrome/browser/resources/settings/settings_menu/settings_menu.js
index 45ddc5f..998b008ef 100644
--- a/chrome/browser/resources/settings/settings_menu/settings_menu.js
+++ b/chrome/browser/resources/settings/settings_menu/settings_menu.js
@@ -15,12 +15,6 @@
   is: 'settings-menu',
 
   properties: {
-    /** @private */
-    advancedOpened_: Boolean,
-
-    /** @private */
-    basicOpened_: Boolean,
-
     /**
      * The current active route.
      */
@@ -33,15 +27,21 @@
 
   /** @private */
   currentRouteChanged_: function() {
-    var submenu = this.shadowRoot.querySelector(
-        'paper-submenu[data-page="' + this.currentRoute.page + '"]');
-    if (submenu)
-      submenu.opened = true;
+    // Sync URL changes to the side nav menu.
+
+    this.$.advancedPage.opened = this.currentRoute.page == 'advanced';
+    this.$.basicPage.opened = this.currentRoute.page == 'basic';
+
+    if (this.$.advancedPage.opened)
+      this.$.advancedMenu.selected = this.currentRoute.section;
+
+    if (this.$.basicPage.opened)
+      this.$.basicMenu.selected = this.currentRoute.section;
   },
 
   /** @private */
   openPage_: function(event) {
-    var submenuRoute = event.currentTarget.dataset.page;
+    var submenuRoute = event.currentTarget.parentNode.dataset.page;
     if (submenuRoute) {
       this.currentRoute = {
         page: submenuRoute,
diff --git a/chrome/browser/resources/settings/settings_shared_css.html b/chrome/browser/resources/settings/settings_shared_css.html
index eb2c8f58..1381c5f 100644
--- a/chrome/browser/resources/settings/settings_shared_css.html
+++ b/chrome/browser/resources/settings/settings_shared_css.html
@@ -32,6 +32,7 @@
         --settings-nav-grey: rgb(90, 90, 90);
 
         --settings-row-min-height: 40px;
+        --settings-separator-line: 1px solid rgba(0, 0, 0, 0.06);
 
         --settings-title-bar-background-color: rgb(52, 73, 94);
         --settings-title-bar-color: rgb(255, 255, 255);
@@ -157,7 +158,7 @@
       }
 
       .list-item.underbar {
-        border-bottom: 1px solid var(--paper-grey-300);
+        border-bottom: var(--settings-separator-line);
       }
 
       .list-item.selected {
@@ -194,7 +195,7 @@
 
       .settings-box {
         @apply(--layout-center);
-        border-top: 1px solid var(--paper-grey-300);
+        border-top: var(--settings-separator-line);
         display: flex;
         min-height: var(--settings-row-min-height);
         padding: 0 20px;
@@ -238,7 +239,7 @@
        *  +-------------------------------------------------------+
        */
       .settings-box .secondary-action {
-        -webkit-border-start: 1px solid var(--paper-grey-300);
+        -webkit-border-start: var(--settings-separator-line);
         -webkit-padding-start: 20px;
       }
 
@@ -248,7 +249,7 @@
       }
 
       .vertical-list > *:not(:first-of-type) {
-        border-top: 1px solid var(--paper-grey-300);
+        border-top: var(--settings-separator-line);
       }
 
       .settings-checkbox-spacer {
diff --git a/chrome/browser/resources/settings/settings_ui/settings_ui.html b/chrome/browser/resources/settings/settings_ui/settings_ui.html
index 30e7b38..4425882 100644
--- a/chrome/browser/resources/settings/settings_ui/settings_ui.html
+++ b/chrome/browser/resources/settings/settings_ui/settings_ui.html
@@ -118,7 +118,8 @@
     <settings-router current-route="{{currentRoute}}"
         current-route-titles="{{currentRouteTitles}}">
     </settings-router>
-    <paper-drawer-panel drawer-width="256px" id="panel" narrow="{{isNarrow_}}">
+    <paper-drawer-panel drawer-width="256px" id="panel" narrow="{{isNarrow_}}"
+        responsive-width="900px">
       <paper-header-panel drawer>
         <paper-toolbar class="toolbar">
           <div class="heading flex">$i18n{settings}</div>
diff --git a/chrome/browser/safe_browsing/safe_browsing_database.cc b/chrome/browser/safe_browsing/safe_browsing_database.cc
index cd766f4..5a89dc2 100644
--- a/chrome/browser/safe_browsing/safe_browsing_database.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_database.cc
@@ -1835,7 +1835,7 @@
     // We precompute the mask for the given subnet size to speed up lookups.
     // Basically we need to create a 16B long string which has the highest
     // |size| bits sets to one.
-    std::string mask(net::kIPv6AddressSize, '\0');
+    std::string mask(net::IPAddress::kIPv6AddressSize, '\0');
     mask.replace(0, prefix_size / 8, prefix_size / 8, '\xFF');
     if ((prefix_size % 8) != 0) {
       mask[prefix_size / 8] = 0xFF << (8 - (prefix_size % 8));
diff --git a/chrome/browser/safe_browsing/safe_browsing_service.cc b/chrome/browser/safe_browsing/safe_browsing_service.cc
index 4cc6b1a..359e82041 100644
--- a/chrome/browser/safe_browsing/safe_browsing_service.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_service.cc
@@ -297,8 +297,8 @@
 
   database_manager_ = CreateDatabaseManager();
 
+  services_delegate_->Initialize();
   services_delegate_->InitializeCsdService(url_request_context_getter_.get());
-  services_delegate_->InitializeServices();
 
   // Track the safe browsing preference of existing profiles.
   // The SafeBrowsingService will be started if any existing profile has the
@@ -525,6 +525,8 @@
   SafeBrowsingProtocolConfig config = GetProtocolConfig();
   V4ProtocolConfig v4_config = GetV4ProtocolConfig();
 
+  services_delegate_->StartOnIOThread(url_request_context_getter, v4_config);
+
 #if defined(SAFE_BROWSING_DB_LOCAL) || defined(SAFE_BROWSING_DB_REMOTE)
   DCHECK(database_manager_.get());
   database_manager_->StartOnIOThread(url_request_context_getter, v4_config);
@@ -553,6 +555,8 @@
 #endif
   ui_manager_->StopOnIOThread(shutdown);
 
+  services_delegate_->StopOnIOThread(shutdown);
+
   if (enabled_) {
     enabled_ = false;
 
diff --git a/chrome/browser/safe_browsing/sandboxed_dmg_analyzer_mac.cc b/chrome/browser/safe_browsing/sandboxed_dmg_analyzer_mac.cc
index 48abce9..8377e7b2 100644
--- a/chrome/browser/safe_browsing/sandboxed_dmg_analyzer_mac.cc
+++ b/chrome/browser/safe_browsing/sandboxed_dmg_analyzer_mac.cc
@@ -73,7 +73,7 @@
   OnAnalysisFinished(zip_analyzer::Results());
 }
 
-void SandboxedDMGAnalyzer::OnProcessLaunchFailed() {
+void SandboxedDMGAnalyzer::OnProcessLaunchFailed(int error_code) {
   OnAnalysisFinished(zip_analyzer::Results());
 }
 
diff --git a/chrome/browser/safe_browsing/sandboxed_dmg_analyzer_mac.h b/chrome/browser/safe_browsing/sandboxed_dmg_analyzer_mac.h
index 19e5a2f..f016699a 100644
--- a/chrome/browser/safe_browsing/sandboxed_dmg_analyzer_mac.h
+++ b/chrome/browser/safe_browsing/sandboxed_dmg_analyzer_mac.h
@@ -45,7 +45,7 @@
 
   // content::UtilityProcessHostClient:
   void OnProcessCrashed(int exit_code) override;
-  void OnProcessLaunchFailed() override;
+  void OnProcessLaunchFailed(int error_code) override;
   bool OnMessageReceived(const IPC::Message& message) override;
 
   // Message handler to receive the results of the analysis. Invokes the
diff --git a/chrome/browser/safe_browsing/sandboxed_zip_analyzer.cc b/chrome/browser/safe_browsing/sandboxed_zip_analyzer.cc
index c720d95b..b7ce56f3 100644
--- a/chrome/browser/safe_browsing/sandboxed_zip_analyzer.cc
+++ b/chrome/browser/safe_browsing/sandboxed_zip_analyzer.cc
@@ -105,7 +105,7 @@
   OnAnalyzeZipFileFinished(zip_analyzer::Results());
 }
 
-void SandboxedZipAnalyzer::OnProcessLaunchFailed() {
+void SandboxedZipAnalyzer::OnProcessLaunchFailed(int error_code) {
   OnAnalyzeZipFileFinished(zip_analyzer::Results());
 }
 
diff --git a/chrome/browser/safe_browsing/sandboxed_zip_analyzer.h b/chrome/browser/safe_browsing/sandboxed_zip_analyzer.h
index d2cd8d9c..b251e32 100644
--- a/chrome/browser/safe_browsing/sandboxed_zip_analyzer.h
+++ b/chrome/browser/safe_browsing/sandboxed_zip_analyzer.h
@@ -53,7 +53,7 @@
   // content::UtilityProcessHostClient implementation.
   // These notifications run on the IO thread.
   void OnProcessCrashed(int exit_code) override;
-  void OnProcessLaunchFailed() override;
+  void OnProcessLaunchFailed(int error_code) override;
   bool OnMessageReceived(const IPC::Message& message) override;
 
   // Launches the utility process.  Must run on the IO thread.
diff --git a/chrome/browser/safe_browsing/services_delegate.h b/chrome/browser/safe_browsing/services_delegate.h
index 084068ca..978ab771 100644
--- a/chrome/browser/safe_browsing/services_delegate.h
+++ b/chrome/browser/safe_browsing/services_delegate.h
@@ -28,6 +28,7 @@
 class ResourceRequestDetector;
 struct ResourceRequestInfo;
 class SafeBrowsingService;
+struct V4ProtocolConfig;
 
 // Abstraction to help organize code for mobile vs full safe browsing modes.
 // This helper class should be owned by a SafeBrowsingService, and it handles
@@ -65,13 +66,13 @@
 
   virtual ~ServicesDelegate() {}
 
+  // Initializes internal state using the ServicesCreator.
+  virtual void Initialize() = 0;
+
   // Creates the CSD service for the given |context_getter|.
   virtual void InitializeCsdService(
       net::URLRequestContextGetter* context_getter) = 0;
 
-  // Initializes services using the ServicesCreator.
-  virtual void InitializeServices() = 0;
-
   // Shuts down the download service.
   virtual void ShutdownServices() = 0;
 
@@ -92,6 +93,11 @@
   // Returns nullptr for any service that is not available.
   virtual ClientSideDetectionService* GetCsdService() = 0;
   virtual DownloadProtectionService* GetDownloadService() = 0;
+
+  virtual void StartOnIOThread(
+    net::URLRequestContextGetter* url_request_context_getter,
+    const V4ProtocolConfig& v4_config) = 0;
+  virtual void StopOnIOThread(bool shutdown) = 0;
 };
 
 }  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/services_delegate_impl.cc b/chrome/browser/safe_browsing/services_delegate_impl.cc
index ae6cfdaa..e3b5b7a 100644
--- a/chrome/browser/safe_browsing/services_delegate_impl.cc
+++ b/chrome/browser/safe_browsing/services_delegate_impl.cc
@@ -8,12 +8,22 @@
 
 #include "base/command_line.h"
 #include "base/memory/ptr_util.h"
+#include "base/metrics/field_trial.h"
+#include "base/strings/string_util.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
 #include "chrome/common/chrome_switches.h"
+#include "components/safe_browsing_db/v4_local_database_manager.h"
 #include "content/public/browser/browser_thread.h"
 
 namespace safe_browsing {
 
+namespace {
+const base::Feature kSafeBrowsingV4LocalDatabaseManagerEnabled {
+    "SafeBrowsingV4LocalDatabaseManagerEnabled",
+    base::FEATURE_DISABLED_BY_DEFAULT
+};
+}  // namespace
+
 // static
 std::unique_ptr<ServicesDelegate> ServicesDelegate::Create(
     SafeBrowsingService* safe_browsing_service) {
@@ -52,7 +62,7 @@
 #endif  // defined(SAFE_BROWSING_CSD)
 }
 
-void ServicesDelegateImpl::InitializeServices() {
+void ServicesDelegateImpl::Initialize() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   download_service_.reset(
       (services_creator_ &&
@@ -69,6 +79,10 @@
        services_creator_->CanCreateResourceRequestDetector())
           ? services_creator_->CreateResourceRequestDetector()
           : CreateResourceRequestDetector());
+
+  if (IsV4LocalDatabaseManagerEnabled()) {
+    v4_local_database_manager_ = CreateV4LocalDatabaseManager();
+  }
 }
 
 void ServicesDelegateImpl::ShutdownServices() {
@@ -150,4 +164,28 @@
                                      incident_service_->GetIncidentReceiver());
 }
 
+void ServicesDelegateImpl::StartOnIOThread(
+    net::URLRequestContextGetter* url_request_context_getter,
+    const V4ProtocolConfig& v4_config) {
+  if (v4_local_database_manager_.get()) {
+    v4_local_database_manager_->StartOnIOThread(url_request_context_getter,
+                                                v4_config);
+  }
+}
+
+void ServicesDelegateImpl::StopOnIOThread(bool shutdown) {
+  if (v4_local_database_manager_.get()) {
+    v4_local_database_manager_->StopOnIOThread(shutdown);
+  }
+}
+
+V4LocalDatabaseManager* ServicesDelegateImpl::CreateV4LocalDatabaseManager() {
+  return new V4LocalDatabaseManager();
+}
+
+bool ServicesDelegateImpl::IsV4LocalDatabaseManagerEnabled() {
+  return base::FeatureList::IsEnabled(
+      kSafeBrowsingV4LocalDatabaseManagerEnabled);
+}
+
 }  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/services_delegate_impl.h b/chrome/browser/safe_browsing/services_delegate_impl.h
index 19e024b4..e861d25 100644
--- a/chrome/browser/safe_browsing/services_delegate_impl.h
+++ b/chrome/browser/safe_browsing/services_delegate_impl.h
@@ -16,6 +16,8 @@
 
 namespace safe_browsing {
 
+class V4LocalDatabaseManager;
+
 // Actual ServicesDelegate implementation. Create via
 // ServicesDelegate::Create().
 class ServicesDelegateImpl : public ServicesDelegate {
@@ -26,9 +28,9 @@
 
  private:
   // ServicesDelegate:
+  void Initialize() override;
   void InitializeCsdService(
       net::URLRequestContextGetter* context_getter) override;
-  void InitializeServices() override;
   void ShutdownServices() override;
   void RefreshState(bool enable) override;
   void ProcessResourceRequest(const ResourceRequestInfo* request) override;
@@ -42,6 +44,16 @@
   ClientSideDetectionService* GetCsdService() override;
   DownloadProtectionService* GetDownloadService() override;
 
+  void StartOnIOThread(
+    net::URLRequestContextGetter* url_request_context_getter,
+    const V4ProtocolConfig& v4_config) override;
+  void StopOnIOThread(bool shutdown) override;
+
+  // Is the Pver4 database manager enabled? Controlled by Finch.
+  bool IsV4LocalDatabaseManagerEnabled();
+
+  V4LocalDatabaseManager* CreateV4LocalDatabaseManager();
+
   DownloadProtectionService* CreateDownloadProtectionService();
   IncidentReportingService* CreateIncidentReportingService();
   ResourceRequestDetector* CreateResourceRequestDetector();
@@ -54,6 +66,10 @@
   SafeBrowsingService* const safe_browsing_service_;
   ServicesDelegate::ServicesCreator* const services_creator_;
 
+  // The Pver4 local database manager handles the database and download logic
+  // Accessed on both UI and IO thread.
+  scoped_refptr<V4LocalDatabaseManager> v4_local_database_manager_;
+
   DISALLOW_COPY_AND_ASSIGN(ServicesDelegateImpl);
 };
 
diff --git a/chrome/browser/safe_browsing/services_delegate_stub.cc b/chrome/browser/safe_browsing/services_delegate_stub.cc
index 562fd9e..1abf0a4e 100644
--- a/chrome/browser/safe_browsing/services_delegate_stub.cc
+++ b/chrome/browser/safe_browsing/services_delegate_stub.cc
@@ -30,7 +30,7 @@
 void ServicesDelegateStub::InitializeCsdService(
     net::URLRequestContextGetter* context_getter) {}
 
-void ServicesDelegateStub::InitializeServices() {}
+void ServicesDelegateStub::Initialize() {}
 
 void ServicesDelegateStub::ShutdownServices() {}
 
@@ -61,4 +61,10 @@
   return nullptr;
 }
 
+void ServicesDelegateStub::StartOnIOThread(
+    net::URLRequestContextGetter* url_request_context_getter,
+    const V4ProtocolConfig& v4_config) {}
+
+void ServicesDelegateStub::StopOnIOThread(bool shutdown) {}
+
 }  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/services_delegate_stub.h b/chrome/browser/safe_browsing/services_delegate_stub.h
index 431068f..07a326db 100644
--- a/chrome/browser/safe_browsing/services_delegate_stub.h
+++ b/chrome/browser/safe_browsing/services_delegate_stub.h
@@ -18,9 +18,9 @@
 
  private:
   // ServicesDelegate:
+  void Initialize() override;
   void InitializeCsdService(
       net::URLRequestContextGetter* context_getter) override;
-  void InitializeServices() override;
   void ShutdownServices() override;
   void RefreshState(bool enable) override;
   void ProcessResourceRequest(const ResourceRequestInfo* request) override;
@@ -34,6 +34,11 @@
   ClientSideDetectionService* GetCsdService() override;
   DownloadProtectionService* GetDownloadService() override;
 
+  void StartOnIOThread(
+    net::URLRequestContextGetter* url_request_context_getter,
+    const V4ProtocolConfig& v4_config) override;
+  void StopOnIOThread(bool shutdown) override;
+
   DISALLOW_COPY_AND_ASSIGN(ServicesDelegateStub);
 };
 
diff --git a/chrome/browser/sessions/session_restore.cc b/chrome/browser/sessions/session_restore.cc
index 19abe46125..3de36252 100644
--- a/chrome/browser/sessions/session_restore.cc
+++ b/chrome/browser/sessions/session_restore.cc
@@ -162,9 +162,9 @@
     // Create a browser instance to put the restored tabs in.
     for (std::vector<const sessions::SessionWindow*>::const_iterator i = begin;
          i != end; ++i) {
-      Browser* browser =
-          CreateRestoredBrowser(BrowserTypeForWindowType((*i)->type),
-                                (*i)->bounds, (*i)->show_state, (*i)->app_name);
+      Browser* browser = CreateRestoredBrowser(
+          BrowserTypeForWindowType((*i)->type), (*i)->bounds, (*i)->workspace,
+          (*i)->show_state, (*i)->app_name);
       browsers.push_back(browser);
 
       // Restore and show the browser.
@@ -411,9 +411,9 @@
           show_state = ui::SHOW_STATE_NORMAL;
           has_visible_browser = true;
         }
-        browser =
-            CreateRestoredBrowser(BrowserTypeForWindowType((*i)->type),
-                                  (*i)->bounds, show_state, (*i)->app_name);
+        browser = CreateRestoredBrowser(BrowserTypeForWindowType((*i)->type),
+                                        (*i)->bounds, (*i)->workspace,
+                                        show_state, (*i)->app_name);
 #if defined(OS_CHROMEOS)
         chromeos::BootTimesRecorder::Get()->AddLoginTimeMarker(
             "SessionRestore-CreateRestoredBrowser-End", false);
@@ -619,6 +619,7 @@
 
   Browser* CreateRestoredBrowser(Browser::Type type,
                                  gfx::Rect bounds,
+                                 const std::string& workspace,
                                  ui::WindowShowState show_state,
                                  const std::string& app_name) {
     Browser::CreateParams params(type, profile_);
@@ -630,6 +631,7 @@
       params.initial_bounds = bounds;
     }
     params.initial_show_state = show_state;
+    params.initial_workspace = workspace;
     params.is_session_restore = true;
     return new Browser(params);
   }
diff --git a/chrome/browser/sessions/session_service.cc b/chrome/browser/sessions/session_service.cc
index 74fcfae..62dcc89 100644
--- a/chrome/browser/sessions/session_service.cc
+++ b/chrome/browser/sessions/session_service.cc
@@ -169,6 +169,15 @@
       sessions::CreateSetWindowBoundsCommand(window_id, bounds, show_state));
 }
 
+void SessionService::SetWindowWorkspace(const SessionID& window_id,
+                                        const std::string& workspace) {
+  if (!ShouldTrackChangesToWindow(window_id))
+    return;
+
+  ScheduleCommand(
+      sessions::CreateSetWindowWorkspaceCommand(window_id, workspace));
+}
+
 void SessionService::SetTabIndexInWindow(const SessionID& window_id,
                                          const SessionID& tab_id,
                                          int new_index) {
@@ -815,6 +824,9 @@
             browser->app_name()));
   }
 
+  sessions::CreateSetWindowWorkspaceCommand(
+      browser->session_id(), browser->window()->GetWorkspace());
+
   windows_to_track->insert(browser->session_id().id());
   TabStripModel* tab_strip = browser->tab_strip_model();
   for (int i = 0; i < tab_strip->count(); ++i) {
diff --git a/chrome/browser/sessions/session_service.h b/chrome/browser/sessions/session_service.h
index 3653df1..94aab17 100644
--- a/chrome/browser/sessions/session_service.h
+++ b/chrome/browser/sessions/session_service.h
@@ -118,6 +118,10 @@
                        const gfx::Rect& bounds,
                        ui::WindowShowState show_state);
 
+  // Sets the workspace the window resides in.
+  void SetWindowWorkspace(const SessionID& window_id,
+                          const std::string& workspace);
+
   // Sets the visual index of the tab in its parent window.
   void SetTabIndexInWindow(const SessionID& window_id,
                            const SessionID& tab_id,
diff --git a/chrome/browser/sessions/session_service_unittest.cc b/chrome/browser/sessions/session_service_unittest.cc
index 661b652b..7a804c2c 100644
--- a/chrome/browser/sessions/session_service_unittest.cc
+++ b/chrome/browser/sessions/session_service_unittest.cc
@@ -75,6 +75,7 @@
     service()->SetWindowBounds(window_id,
                                window_bounds,
                                ui::SHOW_STATE_NORMAL);
+    service()->SetWindowWorkspace(window_id, window_workspace);
   }
 
   // Upon notification, increment the sync_save_count variable
@@ -178,6 +179,8 @@
 
   const gfx::Rect window_bounds;
 
+  const std::string window_workspace = "abc";
+
   SessionID window_id;
 
   int sync_save_count_;
@@ -208,6 +211,7 @@
 
   ASSERT_EQ(1U, windows.size());
   ASSERT_TRUE(window_bounds == windows[0]->bounds);
+  ASSERT_EQ(window_workspace, windows[0]->workspace);
   ASSERT_EQ(0, windows[0]->selected_tab_index);
   ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
   ASSERT_EQ(1U, windows[0]->tabs.size());
@@ -509,6 +513,7 @@
   service()->SetWindowBounds(window2_id,
                              window_bounds,
                              ui::SHOW_STATE_NORMAL);
+  service()->SetWindowWorkspace(window2_id, window_workspace);
 
   SerializedNavigationEntry nav1 =
       SerializedNavigationEntryTestHelper::CreateNavigation(
diff --git a/chrome/browser/storage/durable_storage_browsertest.cc b/chrome/browser/storage/durable_storage_browsertest.cc
index 73dc079..4327cd3 100644
--- a/chrome/browser/storage/durable_storage_browsertest.cc
+++ b/chrome/browser/storage/durable_storage_browsertest.cc
@@ -73,18 +73,18 @@
 
 IN_PROC_BROWSER_TEST_F(DurableStorageBrowserTest, QueryNonBookmarkedPage) {
   ui_test_utils::NavigateToURL(browser(), url_);
-  std::string permission_string;
-  EXPECT_TRUE(content::ExecuteScriptAndExtractString(
-      GetRenderFrameHost(), "checkPermission()", &permission_string));
-  EXPECT_EQ("default", permission_string);
+  bool is_persistent = false;
+  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
+      GetRenderFrameHost(), "checkPermission()", &is_persistent));
+  EXPECT_FALSE(is_persistent);
 }
 
 IN_PROC_BROWSER_TEST_F(DurableStorageBrowserTest, RequestNonBookmarkedPage) {
   ui_test_utils::NavigateToURL(browser(), url_);
-  bool default_box_is_persistent = false;
+  bool is_persistent = false;
   EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
-      GetRenderFrameHost(), "requestPermission()", &default_box_is_persistent));
-  EXPECT_FALSE(default_box_is_persistent);
+      GetRenderFrameHost(), "requestPermission()", &is_persistent));
+  EXPECT_FALSE(is_persistent);
 }
 
 IN_PROC_BROWSER_TEST_F(DurableStorageBrowserTest, QueryBookmarkedPage) {
@@ -92,71 +92,71 @@
   // hasn't requested the durable permission, even if it would be autogranted.
   Bookmark();
   ui_test_utils::NavigateToURL(browser(), url_);
-  std::string permission_string;
-  EXPECT_TRUE(content::ExecuteScriptAndExtractString(
-      GetRenderFrameHost(), "checkPermission()", &permission_string));
-  EXPECT_EQ("default", permission_string);
+  bool is_persistent = false;
+  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
+      GetRenderFrameHost(), "checkPermission()", &is_persistent));
+  EXPECT_FALSE(is_persistent);
 }
 
 IN_PROC_BROWSER_TEST_F(DurableStorageBrowserTest, RequestBookmarkedPage) {
   Bookmark();
   ui_test_utils::NavigateToURL(browser(), url_);
-  bool default_box_is_persistent = false;
+  bool is_persistent = false;
   EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
-      GetRenderFrameHost(), "requestPermission()", &default_box_is_persistent));
-  EXPECT_TRUE(default_box_is_persistent);
+      GetRenderFrameHost(), "requestPermission()", &is_persistent));
+  EXPECT_TRUE(is_persistent);
 }
 
 IN_PROC_BROWSER_TEST_F(DurableStorageBrowserTest, BookmarkThenUnbookmark) {
   Bookmark();
   ui_test_utils::NavigateToURL(browser(), url_);
-  bool default_box_is_persistent = false;
-  std::string permission_string;
+  bool is_persistent = false;
 
   EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
-      GetRenderFrameHost(), "requestPermission()", &default_box_is_persistent));
-  EXPECT_TRUE(default_box_is_persistent);
-  EXPECT_TRUE(content::ExecuteScriptAndExtractString(
-      GetRenderFrameHost(), "checkPermission()", &permission_string));
-  EXPECT_EQ("granted", permission_string);
+      GetRenderFrameHost(), "requestPermission()", &is_persistent));
+  EXPECT_TRUE(is_persistent);
+  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
+      GetRenderFrameHost(), "checkPermission()", &is_persistent));
+  EXPECT_TRUE(is_persistent);
 
   bookmarks::BookmarkModel* bookmark_model =
       BookmarkModelFactory::GetForProfile(browser()->profile());
   bookmarks::RemoveAllBookmarks(bookmark_model, url_);
 
   // Unbookmarking doesn't change the permission.
-  EXPECT_TRUE(content::ExecuteScriptAndExtractString(
-      GetRenderFrameHost(), "checkPermission()", &permission_string));
-  EXPECT_EQ("granted", permission_string);
+  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
+      GetRenderFrameHost(), "checkPermission()", &is_persistent));
+  EXPECT_TRUE(is_persistent);
   // Requesting after unbookmarking doesn't change the default box.
   EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
-      GetRenderFrameHost(), "requestPermission()", &default_box_is_persistent));
-  EXPECT_TRUE(default_box_is_persistent);
+      GetRenderFrameHost(), "requestPermission()", &is_persistent));
+  EXPECT_TRUE(is_persistent);
   // Querying after requesting after unbookmarking still reports "granted".
-  EXPECT_TRUE(content::ExecuteScriptAndExtractString(
-      GetRenderFrameHost(), "checkPermission()", &permission_string));
-  EXPECT_EQ("granted", permission_string);
+  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
+      GetRenderFrameHost(), "checkPermission()", &is_persistent));
+  EXPECT_TRUE(is_persistent);
 }
 
 IN_PROC_BROWSER_TEST_F(DurableStorageBrowserTest, FirstTabSeesResult) {
   ui_test_utils::NavigateToURL(browser(), url_);
-  std::string permission_string;
-  EXPECT_TRUE(content::ExecuteScriptAndExtractString(
-      GetRenderFrameHost(), "checkPermission()", &permission_string));
-  EXPECT_EQ("default", permission_string);
+  bool is_persistent = false;
+
+  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
+      GetRenderFrameHost(), "checkPermission()", &is_persistent));
+  EXPECT_FALSE(is_persistent);
 
   chrome::NewTab(browser());
   ui_test_utils::NavigateToURL(browser(), url_);
   Bookmark();
-  bool default_box_is_persistent = false;
+
   EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
-      GetRenderFrameHost(), "requestPermission()", &default_box_is_persistent));
-  EXPECT_TRUE(default_box_is_persistent);
+      GetRenderFrameHost(), "requestPermission()", &is_persistent));
+  EXPECT_TRUE(is_persistent);
 
   browser()->tab_strip_model()->ActivateTabAt(0, false);
-  EXPECT_TRUE(content::ExecuteScriptAndExtractString(
-      GetRenderFrameHost(), "checkPermission()", &permission_string));
-  EXPECT_EQ("granted", permission_string);
+  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
+      GetRenderFrameHost(), "checkPermission()", &is_persistent));
+  EXPECT_TRUE(is_persistent);
 }
 
 IN_PROC_BROWSER_TEST_F(DurableStorageBrowserTest, Incognito) {
@@ -164,14 +164,13 @@
   ui_test_utils::NavigateToURL(browser, url_);
 
   Bookmark(browser);
-  bool default_box_is_persistent = false;
+  bool is_persistent = false;
   EXPECT_TRUE(content::ExecuteScriptAndExtractBool(GetRenderFrameHost(browser),
                                                    "requestPermission()",
-                                                   &default_box_is_persistent));
-  EXPECT_TRUE(default_box_is_persistent);
+                                                   &is_persistent));
+  EXPECT_TRUE(is_persistent);
 
-  std::string permission_string;
-  EXPECT_TRUE(content::ExecuteScriptAndExtractString(
-      GetRenderFrameHost(browser), "checkPermission()", &permission_string));
-  EXPECT_EQ("granted", permission_string);
+  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
+      GetRenderFrameHost(browser), "checkPermission()", &is_persistent));
+  EXPECT_TRUE(is_persistent);
 }
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 32cb2a36..aacb457 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -253,15 +253,22 @@
     sources +=
         rebase_path(gypi_values.chrome_browser_ui_ash_sources, ".", "//chrome")
     sources += [
+      "ash/app_list/app_list_presenter_service.cc",
+      "ash/app_list/app_list_presenter_service.h",
       "ash/keyboard_ui_service.cc",
       "ash/keyboard_ui_service.h",
+      "ash/launcher/chrome_mash_shelf_controller.cc",
+      "ash/launcher/chrome_mash_shelf_controller.h",
     ]
     deps += [
       "//ash",
       "//ash:ash_with_content",
       "//ash/strings",
       "//components/user_manager",
+      "//mash/shelf/public/interfaces",
+      "//skia/public",
       "//ui/app_list/presenter",
+      "//ui/app_list/presenter:mojom",
       "//ui/keyboard:mojom",
     ]
     if (!is_chromeos) {
diff --git a/chrome/browser/ui/app_list/arc/arc_app_utils.cc b/chrome/browser/ui/app_list/arc/arc_app_utils.cc
index ffb2be3..5ddef11 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_utils.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_utils.cc
@@ -169,7 +169,7 @@
 }
 
 bool LaunchApp(content::BrowserContext* context, const std::string& app_id) {
-  return LaunchApp(context, app_id, false);
+  return LaunchApp(context, app_id, true);
 }
 
 bool LaunchApp(content::BrowserContext* context,
diff --git a/chrome/browser/ui/app_list/search/people/people_provider.cc b/chrome/browser/ui/app_list/search/people/people_provider.cc
deleted file mode 100644
index 8efc2ec..0000000
--- a/chrome/browser/ui/app_list/search/people/people_provider.cc
+++ /dev/null
@@ -1,211 +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 "chrome/browser/ui/app_list/search/people/people_provider.h"
-
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/values.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/search/search.h"
-#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
-#include "chrome/browser/signin/signin_manager_factory.h"
-#include "chrome/browser/ui/app_list/search/common/json_response_fetcher.h"
-#include "chrome/browser/ui/app_list/search/people/people_result.h"
-#include "chrome/browser/ui/app_list/search/people/person.h"
-#include "components/signin/core/browser/profile_oauth2_token_service.h"
-#include "components/signin/core/browser/signin_manager.h"
-#include "google_apis/gaia/gaia_constants.h"
-#include "net/base/url_util.h"
-#include "url/gurl.h"
-
-namespace app_list {
-
-namespace {
-
-const char kKeyItems[] = "items";
-
-const char kAccessTokenField[] = "access_token";
-const char kQueryField[] = "query";
-const char kPeopleSearchUrl[] =
-    "https://www.googleapis.com/plus/v2whitelisted/people/autocomplete";
-
-// OAuth2 scope for access to the Google+ People Search API.
-const char kPeopleSearchOAuth2Scope[] =
-    "https://www.googleapis.com/auth/plus.peopleapi.readwrite";
-
-}  // namespace
-
-PeopleProvider::PeopleProvider(Profile* profile,
-                               AppListControllerDelegate* controller)
-    : WebserviceSearchProvider(profile),
-      OAuth2TokenService::Consumer("people_provider"),
-      controller_(controller),
-      people_search_url_(kPeopleSearchUrl),
-      skip_request_token_for_test_(false) {
-  oauth2_scope_.insert(kPeopleSearchOAuth2Scope);
-}
-
-PeopleProvider::~PeopleProvider() {}
-
-void PeopleProvider::Start(bool /*is_voice_query*/,
-                           const base::string16& query) {
-  ClearResults();
-  if (!IsValidQuery(query)) {
-    query_.clear();
-    return;
-  }
-
-  query_ = base::UTF16ToUTF8(query);
-
-  const CacheResult result = cache_->Get(WebserviceCache::PEOPLE, query_);
-  if (result.second) {
-    ProcessPeopleSearchResults(result.second);
-    if (!people_search_fetched_callback_.is_null())
-      people_search_fetched_callback_.Run();
-    if (result.first == FRESH)
-      return;
-  }
-
-
-  if (!people_search_) {
-    people_search_.reset(new JSONResponseFetcher(
-        base::Bind(&PeopleProvider::OnPeopleSearchFetched,
-                   base::Unretained(this)),
-        profile_->GetRequestContext()));
-  }
-
-  if (!skip_request_token_for_test_) {
-    // We start with reqesting the access token. Once the token is fetched,
-    // we'll create the full query URL and fetch it.
-    StartThrottledQuery(base::Bind(&PeopleProvider::RequestAccessToken,
-                                   base::Unretained(this)));
-  } else {
-    // Running in a test, skip requesting the access token, straight away
-    // start our query.
-    StartThrottledQuery(base::Bind(&PeopleProvider::StartQuery,
-                                   base::Unretained(this)));
-  }
-}
-
-void PeopleProvider::Stop() {
-  if (people_search_)
-    people_search_->Stop();
-}
-
-void PeopleProvider::OnGetTokenSuccess(
-    const OAuth2TokenService::Request* request,
-    const std::string& access_token,
-    const base::Time& expiration_time) {
-  DCHECK_EQ(access_token_request_.get(), request);
-  access_token_request_.reset();
-  access_token_ = access_token;
-  StartQuery();
-}
-
-void PeopleProvider::OnGetTokenFailure(
-    const OAuth2TokenService::Request* request,
-    const GoogleServiceAuthError& error) {
-  DCHECK_EQ(access_token_request_.get(), request);
-  access_token_request_.reset();
-}
-
-void PeopleProvider::RequestAccessToken() {
-  // Only one active request at a time.
-  if (access_token_request_ != NULL)
-    return;
-
-  SigninManagerBase* signin_manager =
-      SigninManagerFactory::GetInstance()->GetForProfile(profile_);
-  if (signin_manager->IsAuthenticated()) {
-    ProfileOAuth2TokenService* token_service =
-        ProfileOAuth2TokenServiceFactory::GetForProfile(profile_);
-    access_token_request_ = token_service->StartRequest(
-        signin_manager->GetAuthenticatedAccountId(), oauth2_scope_, this);
-  }
-}
-
-GURL PeopleProvider::GetQueryUrl(const std::string& query) {
-  GURL people_search_url = people_search_url_;
-  people_search_url = net::AppendQueryParameter(people_search_url,
-                                                kAccessTokenField,
-                                                access_token_);
-  people_search_url = net::AppendQueryParameter(people_search_url,
-                                                kQueryField,
-                                                query);
-
-  return people_search_url;
-}
-
-void PeopleProvider::StartQuery() {
-  // |query_| can be NULL when the query is scheduled but then canceled.
-  if (!people_search_ || query_.empty())
-    return;
-
-  GURL url = GetQueryUrl(query_);
-  people_search_->Start(url);
-}
-
-void PeopleProvider::OnPeopleSearchFetched(
-    std::unique_ptr<base::DictionaryValue> json) {
-  ProcessPeopleSearchResults(json.get());
-  cache_->Put(WebserviceCache::PEOPLE, query_, std::move(json));
-
-  if (!people_search_fetched_callback_.is_null())
-    people_search_fetched_callback_.Run();
-}
-
-void PeopleProvider::ProcessPeopleSearchResults(
-    const base::DictionaryValue* json) {
-  const base::ListValue* item_list = NULL;
-  if (!json ||
-      !json->GetList(kKeyItems, &item_list) ||
-      !item_list ||
-      item_list->empty()) {
-    return;
-  }
-
-  ClearResults();
-  for (base::ListValue::const_iterator it = item_list->begin();
-       it != item_list->end();
-       ++it) {
-    const base::DictionaryValue* dict;
-    if (!(*it)->GetAsDictionary(&dict))
-      continue;
-
-    std::unique_ptr<SearchResult> result(CreateResult(*dict));
-    if (!result)
-      continue;
-
-    Add(std::move(result));
-  }
-}
-
-std::unique_ptr<SearchResult> PeopleProvider::CreateResult(
-    const base::DictionaryValue& dict) {
-  std::unique_ptr<SearchResult> result;
-
-  std::unique_ptr<Person> person = Person::Create(dict);
-  if (!person)
-    return result;
-
-  result.reset(new PeopleResult(profile_, controller_, std::move(person)));
-  return result;
-}
-
-void PeopleProvider::SetupForTest(
-    const base::Closure& people_search_fetched_callback,
-    const GURL& people_search_url) {
-  people_search_fetched_callback_ = people_search_fetched_callback;
-  people_search_url_ = people_search_url;
-  skip_request_token_for_test_ = true;
-}
-
-}  // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/people/people_provider.h b/chrome/browser/ui/app_list/search/people/people_provider.h
deleted file mode 100644
index ec197cd..0000000
--- a/chrome/browser/ui/app_list/search/people/people_provider.h
+++ /dev/null
@@ -1,94 +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 CHROME_BROWSER_UI_APP_LIST_SEARCH_PEOPLE_PEOPLE_PROVIDER_H_
-#define CHROME_BROWSER_UI_APP_LIST_SEARCH_PEOPLE_PEOPLE_PROVIDER_H_
-
-#include <memory>
-
-#include "base/callback_forward.h"
-#include "base/macros.h"
-#include "chrome/browser/ui/app_list/search/common/webservice_search_provider.h"
-#include "google_apis/gaia/oauth2_token_service.h"
-#include "url/gurl.h"
-
-class AppListControllerDelegate;
-
-namespace base {
-class DictionaryValue;
-}
-
-namespace app_list {
-
-namespace test {
-class PeopleProviderTest;
-}
-
-class JSONResponseFetcher;
-class SearchResult;
-
-// PeopleProvider fetches search results from the web store server.
-// A "Search in web store" result will be returned if the server does not
-// return any results.
-class PeopleProvider : public WebserviceSearchProvider,
-                       public OAuth2TokenService::Consumer {
- public:
-  PeopleProvider(Profile* profile, AppListControllerDelegate* controller);
-  ~PeopleProvider() override;
-
-  // SearchProvider overrides:
-  void Start(bool is_voice_query, const base::string16& query) override;
-  void Stop() override;
-
-  // OAuth2TokenService::Consumer overrides:
-  void OnGetTokenSuccess(const OAuth2TokenService::Request* request,
-                         const std::string& access_token,
-                         const base::Time& expiration_time) override;
-  void OnGetTokenFailure(const OAuth2TokenService::Request* request,
-                         const GoogleServiceAuthError& error) override;
-
- private:
-  friend class app_list::test::PeopleProviderTest;
-
-  // Start a request for getting the access token for people search.
-  void RequestAccessToken();
-  // Invalidate our existing token so a new one can be fetched.
-  void InvalidateToken();
-
-  // Get the full people search query URL. This URL includes the OAuth refresh
-  // token for authenticating the current user.
-  GURL GetQueryUrl(const std::string& query);
-
-  // Start the search request with |query_|.
-  void StartQuery();
-
-  // Callback for people search results being fetched.
-  void OnPeopleSearchFetched(std::unique_ptr<base::DictionaryValue> json);
-  void ProcessPeopleSearchResults(const base::DictionaryValue* json);
-  std::unique_ptr<SearchResult> CreateResult(const base::DictionaryValue& dict);
-
-  // Setup the various variables that we override for testing.
-  void SetupForTest(const base::Closure& people_search_fetched_callback,
-                    const GURL& people_search_url);
-
-  AppListControllerDelegate* controller_;
-  std::unique_ptr<JSONResponseFetcher> people_search_;
-  base::Closure people_search_fetched_callback_;
-
-  std::string access_token_;
-  std::unique_ptr<OAuth2TokenService::Request> access_token_request_;
-  OAuth2TokenService::ScopeSet oauth2_scope_;
-
-  // The current query.
-  std::string query_;
-  GURL people_search_url_;
-
-  bool skip_request_token_for_test_;
-
-  DISALLOW_COPY_AND_ASSIGN(PeopleProvider);
-};
-
-}  // namespace app_list
-
-#endif  // CHROME_BROWSER_UI_APP_LIST_SEARCH_PEOPLE_PEOPLE_PROVIDER_H_
diff --git a/chrome/browser/ui/app_list/search/people/people_provider_browsertest.cc b/chrome/browser/ui/app_list/search/people/people_provider_browsertest.cc
deleted file mode 100644
index ea5509a6..0000000
--- a/chrome/browser/ui/app_list/search/people/people_provider_browsertest.cc
+++ /dev/null
@@ -1,292 +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 "chrome/browser/ui/app_list/search/people/people_provider.h"
-
-#include <stddef.h>
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/macros.h"
-#include "base/run_loop.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/ui/app_list/test/test_app_list_controller_delegate.h"
-#include "chrome/common/chrome_switches.h"
-#include "chrome/test/base/in_process_browser_test.h"
-#include "content/public/browser/browser_thread.h"
-#include "net/test/embedded_test_server/embedded_test_server.h"
-#include "net/test/embedded_test_server/http_request.h"
-#include "net/test/embedded_test_server/http_response.h"
-#include "ui/app_list/search_result.h"
-
-using content::BrowserThread;
-using net::test_server::BasicHttpResponse;
-using net::test_server::HttpRequest;
-using net::test_server::HttpResponse;
-
-namespace app_list {
-namespace test {
-namespace {
-
-// Mock results.
-const char kOneResult[] = "{"
-    "\"items\":["
-      "{"
-        "\"person\" : {"
-          "\"id\": \"1\","
-          "\"metadata\" : {"
-            "\"ownerId\": \"1\""
-          "},"
-          "\"names\" : [{"
-            "\"displayName\": \"first person\""
-          "}],"
-          "\"emails\" : [{"
-            "\"value\": \"first@person.com\""
-          "}],"
-          "\"images\" : [{"
-            "\"url\": \"http://host/icon\""
-          "}],"
-          "\"sortKeys\" : {"
-            "\"interactionRank\": \"0.98\""
-          "}"
-        "}"
-      "}"
-    "]}";
-
-const char kThreeValidResults[] = "{"
-    "\"items\":["
-      "{"
-        "\"person\" : {"
-          "\"id\": \"1\","
-          "\"metadata\" : {"
-            "\"ownerId\": \"1\""
-          "},"
-          "\"names\" : [{"
-            "\"displayName\": \"first person\""
-          "}],"
-          "\"emails\" : [{"
-            "\"value\": \"first@person.com\""
-          "}],"
-          "\"images\" : [{"
-            "\"url\": \"http://host/icon\""
-          "}],"
-          "\"sortKeys\" : {"
-            "\"interactionRank\": \"0.98\""
-          "}"
-        "}"
-      "},"
-      "{"
-        "\"person\" : {"
-          "\"id\": \"2\","
-          "\"metadata\" : {"
-            "\"ownerId\": \"37\""
-          "},"
-          "\"names\" : [{"
-            "\"displayName\": \"second person\""
-          "}],"
-          "\"emails\" : [{"
-            "\"value\": \"second@person.com\""
-          "}],"
-          "\"images\" : [{"
-            "\"url\": \"http://host/icon\""
-          "}],"
-          "\"sortKeys\" : {"
-            "\"interactionRank\": \"0.84\""
-          "}"
-        "}"
-      "},"
-      "{"
-        "\"person\" : {"
-          "\"id\": \"3\","
-          "\"metadata\" : {"
-            "\"ownerId\": \"3\""
-          "},"
-          "\"names\" : [{"
-            "\"displayName\": \"third person\""
-          "}],"
-          "\"emails\" : [{"
-            "\"value\": \"third@person.com\""
-          "}],"
-          "\"images\" : [{"
-            "\"url\": \"http://host/icon\""
-          "}],"
-          "\"sortKeys\" : {"
-            "\"interactionRank\": \"0.67\""
-          "}"
-        "}"
-      "},"
-      "{"
-        "\"person\" : {"
-          "\"id\": \"4\","
-          "\"metadata\" : {"
-            "\"ownerId\": \"4\""
-          "},"
-          "\"names\" : [{"
-            "\"displayName\": \"fourth person\""
-          "}],"
-          "\"emails\" : [{"
-            "\"value\": \"fourth@person.com\""
-          "}],"
-          "\"images\" : [{"
-            "\"url\": \"http://host/icon\""
-          "}],"
-          "\"sortKeys\" : {"
-            "\"interactionRank\": \"0.0\""
-          "}"
-        "}"
-      "},"
-      "{"
-        "\"person\" : {"
-          "\"id\": \"5\","
-          "\"metadata\" : {"
-            "\"ownerId\": \"5\""
-          "},"
-          "\"names\" : [{"
-            "\"displayName\": \"fifth person\""
-          "}],"
-          "\"emails\" : [{"
-            "\"value\": \"fifth@person.com\""
-          "}],"
-          // Images field is missing on purpose.
-          "\"sortKeys\" : {"
-            "\"interactionRank\": \"0.98\""
-          "}"
-        "}"
-      "}"
-    "]}";
-
-}  // namespace
-
-class PeopleProviderTest : public InProcessBrowserTest {
- public:
-  PeopleProviderTest() {}
-  ~PeopleProviderTest() override {}
-
-  // InProcessBrowserTest overrides:
-  void SetUpOnMainThread() override {
-    embedded_test_server()->RegisterRequestHandler(
-        base::Bind(&PeopleProviderTest::HandleRequest,
-                   base::Unretained(this)));
-    ASSERT_TRUE(embedded_test_server()->Start());
-
-    people_provider_.reset(new PeopleProvider(
-        ProfileManager::GetActiveUserProfile(), &test_controller_));
-
-    people_provider_->SetupForTest(
-        base::Bind(&PeopleProviderTest::OnSearchResultsFetched,
-                   base::Unretained(this)),
-        embedded_test_server()->base_url());
-    people_provider_->set_use_throttling(false);
-  }
-
-  std::string RunQuery(const std::string& query,
-                       const std::string& mock_server_response) {
-    people_provider_->Start(false, base::UTF8ToUTF16(query));
-
-    if (people_provider_->people_search_ && !mock_server_response.empty()) {
-      mock_server_response_ = mock_server_response;
-
-      DCHECK(!run_loop_);
-      run_loop_.reset(new base::RunLoop);
-      run_loop_->Run();
-      run_loop_.reset();
-
-      mock_server_response_.clear();
-    }
-
-    people_provider_->Stop();
-    return GetResults();
-  }
-
-  std::string GetResults() const {
-    std::string results;
-    for (SearchProvider::Results::const_iterator it =
-             people_provider_->results().begin();
-         it != people_provider_->results().end();
-         ++it) {
-      if (!results.empty())
-        results += ',';
-      results += base::UTF16ToUTF8((*it)->title());
-    }
-    return results;
-  }
-
-  PeopleProvider* people_provider() { return people_provider_.get(); }
-
- private:
-  std::unique_ptr<HttpResponse> HandleRequest(const HttpRequest& request) {
-    std::unique_ptr<BasicHttpResponse> response(new BasicHttpResponse);
-    response->set_code(net::HTTP_OK);
-    response->set_content(mock_server_response_);
-
-    return std::move(response);
-  }
-
-  void OnSearchResultsFetched() {
-    if (run_loop_)
-      run_loop_->Quit();
-  }
-
-  std::unique_ptr<base::RunLoop> run_loop_;
-
-  std::string mock_server_response_;
-
-  std::unique_ptr<PeopleProvider> people_provider_;
-  ::test::TestAppListControllerDelegate test_controller_;
-
-  DISALLOW_COPY_AND_ASSIGN(PeopleProviderTest);
-};
-
-IN_PROC_BROWSER_TEST_F(PeopleProviderTest, Basic) {
-  struct {
-    const char* query;
-    const char* mock_server_response;
-    const char* expected_results_content;
-  } kTestCases[] = {
-    {"first", kOneResult, "first person" },
-    {"person", kThreeValidResults, "first person,second person,third person" },
-  };
-
-  for (size_t i = 0; i < arraysize(kTestCases); ++i) {
-    EXPECT_EQ(kTestCases[i].expected_results_content,
-              RunQuery(kTestCases[i].query,
-                       kTestCases[i].mock_server_response))
-        << "Case " << i << ": q=" << kTestCases[i].query;
-  }
-}
-
-IN_PROC_BROWSER_TEST_F(PeopleProviderTest, NoSearchForSensitiveData) {
-  // None of the following input strings should be accepted because they may
-  // contain private data.
-  const char* inputs[] = {
-    // file: scheme is bad.
-    "file://filename",
-    "FILE://filename",
-    // URLs with usernames, ports, queries or refs are bad.
-    "http://username:password@hostname/",
-    "http://www.example.com:1000",
-    "http://foo:1000",
-    "http://hostname/?query=q",
-    "http://hostname/path#ref",
-    // A https URL with path is bad.
-    "https://hostname/path",
-  };
-
-  for (size_t i = 0; i < arraysize(inputs); ++i)
-    EXPECT_EQ("", RunQuery(inputs[i], kOneResult));
-}
-
-IN_PROC_BROWSER_TEST_F(PeopleProviderTest, NoSearchForShortQueries) {
-  EXPECT_EQ("", RunQuery("f", kOneResult));
-  EXPECT_EQ("", RunQuery("fi", kOneResult));
-  EXPECT_EQ("first person", RunQuery("fir", kOneResult));
-}
-
-}  // namespace test
-}  // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/people/people_result.cc b/chrome/browser/ui/app_list/search/people/people_result.cc
deleted file mode 100644
index 9bfb791b..0000000
--- a/chrome/browser/ui/app_list/search/people/people_result.cc
+++ /dev/null
@@ -1,194 +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 "chrome/browser/ui/app_list/search/people/people_result.h"
-
-#include <stddef.h>
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/memory/ref_counted.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
-#include "chrome/browser/signin/signin_manager_factory.h"
-#include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
-#include "chrome/browser/ui/app_list/search/common/url_icon_source.h"
-#include "chrome/browser/ui/app_list/search/people/person.h"
-#include "chrome/browser/ui/app_list/search/search_util.h"
-#include "chrome/common/extensions/api/hangouts_private.h"
-#include "chrome/grit/generated_resources.h"
-#include "components/signin/core/browser/profile_oauth2_token_service.h"
-#include "components/signin/core/browser/signin_manager.h"
-#include "content/public/browser/user_metrics.h"
-#include "extensions/browser/event_router.h"
-#include "grit/theme_resources.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/resource/resource_bundle.h"
-
-namespace OnHangoutRequested =
-    extensions::api::hangouts_private::OnHangoutRequested;
-
-using extensions::api::hangouts_private::User;
-using extensions::api::hangouts_private::HangoutRequest;
-
-namespace {
-
-const char kImageSizePath[] = "s64-p/";
-const char kEmailUrlPrefix[] = "mailto:";
-
-// Add a query parameter to specify the size to fetch the image in. The
-// original profile image can be of an arbitrary size, we ask the server to
-// crop it to a square 64x64 using its smart cropping algorithm.
-GURL GetImageUrl(const GURL& url) {
-  std::string image_filename = url.ExtractFileName();
-  if (image_filename.empty())
-    return url;
-
-  return url.Resolve(kImageSizePath + image_filename);
-}
-
-}  // namespace
-
-namespace app_list {
-
-PeopleResult::PeopleResult(Profile* profile,
-                           AppListControllerDelegate* controller,
-                           std::unique_ptr<Person> person)
-    : profile_(profile),
-      controller_(controller),
-      person_(std::move(person)),
-      weak_factory_(this) {
-  set_id(person_->id);
-  set_title(base::UTF8ToUTF16(person_->display_name));
-  set_relevance(person_->interaction_rank);
-  set_details(base::UTF8ToUTF16(person_->email));
-
-  RefreshHangoutsExtensionId();
-  SetDefaultActions();
-
-  int icon_size = GetPreferredIconDimension();
-  image_ = gfx::ImageSkia(
-      new UrlIconSource(
-          base::Bind(&PeopleResult::OnIconLoaded, weak_factory_.GetWeakPtr()),
-          profile_->GetRequestContext(),
-          GetImageUrl(person_->image_url),
-          icon_size,
-          IDR_PROFILE_PICTURE_LOADING),
-      gfx::Size(icon_size, icon_size));
-  SetIcon(image_);
-}
-
-PeopleResult::~PeopleResult() {
-}
-
-void PeopleResult::Open(int event_flags) {
-  RecordHistogram(SEARCH_PEOPLE_SEARCH_RESULT);
-
-  // Action 0 will always be our default action.
-  InvokeAction(0, event_flags);
-}
-
-void PeopleResult::InvokeAction(int action_index, int event_flags) {
-  if (hangouts_extension_id_.empty()) {
-    // If the hangouts app is not available, the only option we are showing
-    // to the user is 'Send Email'.
-    SendEmail();
-  } else {
-    switch (action_index) {
-      case 0:
-        OpenChat();
-        break;
-      case 1:
-        SendEmail();
-        break;
-      default:
-        LOG(ERROR) << "Invalid people search action: " << action_index;
-    }
-  }
-}
-
-std::unique_ptr<SearchResult> PeopleResult::Duplicate() const {
-  return std::unique_ptr<SearchResult>(
-      new PeopleResult(profile_, controller_, person_->Duplicate()));
-}
-
-void PeopleResult::OnIconLoaded() {
-  // Remove the existing image reps since the icon data is loaded and they
-  // need to be re-created.
-  const std::vector<gfx::ImageSkiaRep>& image_reps = image_.image_reps();
-  for (size_t i = 0; i < image_reps.size(); ++i)
-    image_.RemoveRepresentation(image_reps[i].scale());
-
-  SetIcon(image_);
-}
-
-void PeopleResult::SetDefaultActions() {
-  Actions actions;
-
-  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
-  if (!hangouts_extension_id_.empty()) {
-    actions.push_back(Action(
-        *bundle.GetImageSkiaNamed(IDR_PEOPLE_SEARCH_ACTION_CHAT),
-        *bundle.GetImageSkiaNamed(IDR_PEOPLE_SEARCH_ACTION_CHAT_HOVER),
-        *bundle.GetImageSkiaNamed(IDR_PEOPLE_SEARCH_ACTION_CHAT_PRESSED),
-        l10n_util::GetStringUTF16(IDS_PEOPLE_SEARCH_ACTION_CHAT_TOOLTIP)));
-  }
-  actions.push_back(Action(
-      *bundle.GetImageSkiaNamed(IDR_PEOPLE_SEARCH_ACTION_EMAIL),
-      *bundle.GetImageSkiaNamed(IDR_PEOPLE_SEARCH_ACTION_EMAIL_HOVER),
-      *bundle.GetImageSkiaNamed(IDR_PEOPLE_SEARCH_ACTION_EMAIL_PRESSED),
-      l10n_util::GetStringUTF16(IDS_PEOPLE_SEARCH_ACTION_EMAIL_TOOLTIP)));
-  SetActions(actions);
-}
-
-void PeopleResult::OpenChat() {
-  HangoutRequest request;
-
-  request.type = extensions::api::hangouts_private::HANGOUT_TYPE_CHAT;
-
-  // from: the user this chat request is originating from.
-  SigninManagerBase* signin_manager =
-      SigninManagerFactory::GetInstance()->GetForProfile(profile_);
-  DCHECK(signin_manager);
-  request.from = signin_manager->GetAuthenticatedAccountInfo().email;
-
-  // to: list of users with whom to start this hangout is with.
-  User target;
-  target.id = person_->owner_id;
-  request.to.push_back(std::move(target));
-
-  std::unique_ptr<extensions::Event> event(new extensions::Event(
-      extensions::events::HANGOUTS_PRIVATE_ON_HANGOUT_REQUESTED,
-      OnHangoutRequested::kEventName, OnHangoutRequested::Create(request)));
-
-  // TODO(rkc): Change this once we remove the hangoutsPrivate API.
-  // See crbug.com/306672
-  extensions::EventRouter::Get(profile_)
-      ->DispatchEventToExtension(hangouts_extension_id_, std::move(event));
-
-  content::RecordAction(base::UserMetricsAction("PeopleSearch_OpenChat"));
-}
-
-void PeopleResult::SendEmail() {
-  controller_->OpenURL(profile_,
-                       GURL(kEmailUrlPrefix + person_->email),
-                       ui::PAGE_TRANSITION_LINK,
-                       NEW_FOREGROUND_TAB);
-  content::RecordAction(base::UserMetricsAction("PeopleSearch_SendEmail"));
-}
-
-void PeopleResult::RefreshHangoutsExtensionId() {
-  for (const char* id : extension_misc::kHangoutsExtensionIds) {
-    if (extensions::EventRouter::Get(profile_)
-            ->ExtensionHasEventListener(id, OnHangoutRequested::kEventName)) {
-      hangouts_extension_id_ = id;
-      return;
-    }
-  }
-  hangouts_extension_id_.clear();
-}
-
-}  // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/people/people_result.h b/chrome/browser/ui/app_list/search/people/people_result.h
deleted file mode 100644
index fb49ed5..0000000
--- a/chrome/browser/ui/app_list/search/people/people_result.h
+++ /dev/null
@@ -1,63 +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 CHROME_BROWSER_UI_APP_LIST_SEARCH_PEOPLE_PEOPLE_RESULT_H_
-#define CHROME_BROWSER_UI_APP_LIST_SEARCH_PEOPLE_PEOPLE_RESULT_H_
-
-#include <string>
-
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "ui/app_list/search_result.h"
-#include "url/gurl.h"
-
-class AppListControllerDelegate;
-class Profile;
-
-namespace app_list {
-
-struct Person;
-
-class PeopleResult : public SearchResult {
- public:
-  PeopleResult(Profile* profile,
-               AppListControllerDelegate* controller,
-               std::unique_ptr<Person> person);
-  ~PeopleResult() override;
-
-  // SearchResult overrides:
-  void Open(int event_flags) override;
-  void InvokeAction(int action_index, int event_flags) override;
-  std::unique_ptr<SearchResult> Duplicate() const override;
-
- private:
-  void OnIconLoaded();
-  void SetDefaultActions();
-  void OpenChat();
-  void SendEmail();
-
-  // Check if we have any variant of the hangouts extension installed and
-  // waiting on the onHangoutRequested event (the hangouts extension can have
-  // a total of four possible id's, depending on which release type of it is
-  // installed). If so, set the hangouts_extension_id_ to the id of the
-  // extension that is waiting, or set it to an empty string if not.
-  void RefreshHangoutsExtensionId();
-
-  Profile* profile_;
-  AppListControllerDelegate* controller_;
-  std::unique_ptr<Person> person_;
-
-  gfx::ImageSkia image_;
-
-  // Caches the id of the hangouts extension.
-  std::string hangouts_extension_id_;
-
-  base::WeakPtrFactory<PeopleResult> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(PeopleResult);
-};
-
-}  // namespace app_list
-
-#endif  // CHROME_BROWSER_UI_APP_LIST_SEARCH_PEOPLE_PEOPLE_RESULT_H_
diff --git a/chrome/browser/ui/app_list/search/people/person.cc b/chrome/browser/ui/app_list/search/people/person.cc
deleted file mode 100644
index 488d153..0000000
--- a/chrome/browser/ui/app_list/search/people/person.cc
+++ /dev/null
@@ -1,114 +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 "chrome/browser/ui/app_list/search/people/person.h"
-
-#include <vector>
-
-#include "base/strings/string_number_conversions.h"
-#include "base/values.h"
-
-namespace {
-
-const char kKeyId[] = "person.id";
-const char kKeyNames[] = "person.names";
-const char kKeyDisplayName[] = "displayName";
-const char kKeyEmails[] = "person.emails";
-const char kKeyEmailValue[] = "value";
-const char kKeyInteractionRank[] = "person.sortKeys.interactionRank";
-const char kKeyImages[] = "person.images";
-const char kKeyUrl[] = "url";
-const char kKeyOwnerId[] = "person.metadata.ownerId";
-
-// Finds a list in a dictionary, specified by list_key, then returns the
-// first value associated with item_key in the first dictionary in that list.
-// So, for this dictionary,
-// { key_random: value1,
-//   list_key: [ { random_key: value2,
-//                 item_key: TARGET_VALUE,
-//                 another_random_key: value3 } ],
-//   another_key: value4 }
-//
-//  we'll return TARGET_VALUE.
-//
-// The reason for this (seemingly) strange behavior is that several of our
-// results are going to be in this form and we need to repeat this operation
-// to parse them.
-std::string GetTargetValue(const base::DictionaryValue& dict,
-                           const char list_key[],
-                           const char item_key[]) {
-  const base::ListValue* list;
-  if (!dict.GetList(list_key, &list) || !list)
-    return std::string();
-
-  base::ListValue::const_iterator it = list->begin();
-  if (it == list->end())
-    return std::string();
-
-  base::DictionaryValue* sub_dict;
-  if (!(*it)->GetAsDictionary(&sub_dict) || !sub_dict)
-    return std::string();
-
-  std::string value;
-  if (!sub_dict->GetString(item_key, &value))
-    return std::string();
-
-  return value;
-}
-
-}  // namespace
-
-
-namespace app_list {
-
-// static
-std::unique_ptr<Person> Person::Create(const base::DictionaryValue& dict) {
-  std::unique_ptr<Person> person(new Person());
-
-  // Person id's.
-  if (!dict.GetString(kKeyId, &person->id) ||
-      !dict.GetString(kKeyOwnerId, &person->owner_id)) {
-    person.reset();
-    return person;
-  }
-
-  // Interaction rank.
-  std::string interaction_rank_string;
-  if (!dict.GetString(kKeyInteractionRank, &interaction_rank_string) ||
-      !base::StringToDouble(
-            interaction_rank_string, &person->interaction_rank)) {
-    person.reset();
-    return person;
-  }
-
-  person->display_name = GetTargetValue(dict, kKeyNames, kKeyDisplayName);
-  person->email = GetTargetValue(dict, kKeyEmails, kKeyEmailValue);
-  person->image_url = GURL(GetTargetValue(dict, kKeyImages, kKeyUrl));
-
-  // If any of our values are invalid, null out our result.
-  if (person->id.empty() ||
-      person->owner_id.empty() ||
-      person->display_name.empty() ||
-      person->email.empty() ||
-      !person->image_url.is_valid() ||
-      person->interaction_rank == 0.0) {
-    person.reset();
-  }
-
-  return person;
-}
-
-Person::Person() : interaction_rank(0.0) {
-}
-
-Person::~Person() {
-}
-
-std::unique_ptr<Person> Person::Duplicate() {
-  std::unique_ptr<Person> person(new Person());
-  *person = *this;
-  return person;
-}
-
-}  // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/people/person.h b/chrome/browser/ui/app_list/search/people/person.h
deleted file mode 100644
index 1cf5068..0000000
--- a/chrome/browser/ui/app_list/search/people/person.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 CHROME_BROWSER_UI_APP_LIST_SEARCH_PEOPLE_PERSON_H_
-#define CHROME_BROWSER_UI_APP_LIST_SEARCH_PEOPLE_PERSON_H_
-
-#include <memory>
-#include <string>
-
-#include "url/gurl.h"
-
-namespace base {
-class DictionaryValue;
-}
-
-namespace app_list {
-
-// Person holds information about a search result retrieved from the People
-// Search Google webservice.
-struct Person {
-  // Parses the dictionary from the people search result and creates a person
-  // object.
-  static std::unique_ptr<Person> Create(const base::DictionaryValue& dict);
-
-  Person();
-  ~Person();
-
-  std::unique_ptr<Person> Duplicate();
-
-  // This is a unique id for this person. In the case of a result with an
-  // associated Google account, this will always be the same as the owner id.
-  // In case of non-Google results, this id is arbitrary but guaranteed to be
-  // unique for this person search result.
-  std::string id;
-
-  // The Owner Id is a GAIA obfuscated id which can be used to identify a
-  // Google contact.
-  std::string owner_id;
-
-  // Interaction rank is a number between 0.0-1.0 indicating how frequently
-  // you interact with the person.
-  double interaction_rank;
-
-  std::string display_name;
-  std::string email;
-  GURL image_url;
-
-};
-
-}  // namespace app_list
-
-#endif  // CHROME_BROWSER_UI_APP_LIST_SEARCH_PEOPLE_PERSON_H_
diff --git a/chrome/browser/ui/app_list/search/search_controller_factory.cc b/chrome/browser/ui/app_list/search/search_controller_factory.cc
index b8a31761..3776d469 100644
--- a/chrome/browser/ui/app_list/search/search_controller_factory.cc
+++ b/chrome/browser/ui/app_list/search/search_controller_factory.cc
@@ -16,7 +16,6 @@
 #include "chrome/browser/ui/app_list/search/app_search_provider.h"
 #include "chrome/browser/ui/app_list/search/history_factory.h"
 #include "chrome/browser/ui/app_list/search/omnibox_provider.h"
-#include "chrome/browser/ui/app_list/search/people/people_provider.h"
 #include "chrome/browser/ui/app_list/search/suggestions/suggestions_search_provider.h"
 #include "chrome/browser/ui/app_list/search/webstore/webstore_provider.h"
 #include "chrome/common/chrome_switches.h"
@@ -38,7 +37,6 @@
 // Ignored unless AppListMixer field trial is "Blended".
 const size_t kMaxOmniboxResults = 4;
 const size_t kMaxWebstoreResults = 2;
-const size_t kMaxPeopleResults = 2;
 const size_t kMaxSuggestionsResults = 6;
 
 #if defined(OS_CHROMEOS)
@@ -68,9 +66,9 @@
       new SearchController(model->search_box(), model->results(),
                            HistoryFactory::GetForBrowserContext(profile)));
 
-  // Add mixer groups. There are four main groups: apps, people, webstore and
+  // Add mixer groups. There are three main groups: apps, webstore and
   // omnibox. The behaviour depends on the AppListMixer field trial:
-  // - If default: The apps, people and webstore groups each have a fixed
+  // - If default: The apps and webstore groups each have a fixed
   //   maximum number of results. The omnibox group fills the remaining slots
   //   (with a minimum of one result).
   // - If "Blended": Each group has a "soft" maximum number of results. However,
@@ -81,7 +79,6 @@
       controller->AddOmniboxGroup(kMaxOmniboxResults, 2.0, 1.0);
   size_t webstore_group_id =
       controller->AddGroup(kMaxWebstoreResults, 1.0, 0.4);
-  size_t people_group_id = controller->AddGroup(kMaxPeopleResults, 0.0, 0.85);
 
   // Add search providers.
   controller->AddProvider(
@@ -95,9 +92,6 @@
   controller->AddProvider(webstore_group_id,
                           std::unique_ptr<SearchProvider>(
                               new WebstoreProvider(profile, list_controller)));
-  controller->AddProvider(people_group_id,
-                          std::unique_ptr<SearchProvider>(
-                              new PeopleProvider(profile, list_controller)));
   if (IsSuggestionsSearchProviderEnabled()) {
     size_t suggestions_group_id =
         controller->AddGroup(kMaxSuggestionsResults, 3.0, 1.0);
diff --git a/chrome/browser/ui/app_list/search/search_util.h b/chrome/browser/ui/app_list/search/search_util.h
index 19cd5d1..08a1b3f 100644
--- a/chrome/browser/ui/app_list/search/search_util.h
+++ b/chrome/browser/ui/app_list/search/search_util.h
@@ -18,8 +18,8 @@
   WEBSTORE_SEARCH_RESULT,
   // A result that opens a webstore search.
   SEARCH_WEBSTORE_SEARCH_RESULT,
-  // A result that opens a people search.
-  SEARCH_PEOPLE_SEARCH_RESULT,
+  // A result that opens a people search (Deprecated).
+  SEARCH_PEOPLE_SEARCH_RESULT_DEPRECATED,
   // A result that opens a suggestion.
   SUGGESTIONS_SEARCH_RESULT,
   // A result that is provided by the custom launcher search provider.
diff --git a/chrome/browser/ui/ash/app_list/app_list_presenter_delegate_mus.cc b/chrome/browser/ui/ash/app_list/app_list_presenter_delegate_mus.cc
new file mode 100644
index 0000000..979835f6
--- /dev/null
+++ b/chrome/browser/ui/ash/app_list/app_list_presenter_delegate_mus.cc
@@ -0,0 +1,97 @@
+// Copyright 2016 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/ash/app_list/app_list_presenter_delegate_mus.h"
+
+#include "ui/app_list/presenter/app_list_view_delegate_factory.h"
+#include "ui/app_list/views/app_list_view.h"
+#include "ui/display/display.h"
+#include "ui/display/screen.h"
+
+namespace {
+
+// Gets the point at the center of the display. The calculation should exclude
+// the virtual keyboard area. If the height of the display area is less than
+// |minimum_height|, its bottom will be extended to that height (so that the
+// app list never starts above the top of the screen).
+gfx::Point GetCenterOfDisplay(int64_t display_id, int minimum_height) {
+  // TODO(mfomitchev): account for virtual keyboard.
+  std::vector<display::Display> displays =
+      display::Screen::GetScreen()->GetAllDisplays();
+  auto it = std::find_if(displays.begin(), displays.end(),
+                         [display_id](const display::Display& display) {
+                           return display.id() == display_id;
+                         });
+  DCHECK(it != displays.end());
+  gfx::Rect bounds = it->bounds();
+
+  // Apply the |minimum_height|.
+  if (bounds.height() < minimum_height)
+    bounds.set_height(minimum_height);
+
+  return bounds.CenterPoint();
+}
+
+}  // namespace
+
+AppListPresenterDelegateMus::AppListPresenterDelegateMus(
+    app_list::AppListViewDelegateFactory* view_delegate_factory)
+    : view_delegate_factory_(view_delegate_factory) {}
+
+AppListPresenterDelegateMus::~AppListPresenterDelegateMus() {}
+
+app_list::AppListViewDelegate* AppListPresenterDelegateMus::GetViewDelegate() {
+  return view_delegate_factory_->GetDelegate();
+}
+
+void AppListPresenterDelegateMus::Init(app_list::AppListView* view,
+                                       int64_t display_id,
+                                       int current_apps_page) {
+  view_ = view;
+
+  // Note: This would place the app list into the USER_WINDOWS container, unlike
+  // in classic ash, where it has it's own container.
+  // Note: We can't center the app list until we have its dimensions, so we
+  // init at (0, 0) and then reset its anchor point.
+  // TODO(mfomitchev): We are currently passing NULL for |parent|. It seems like
+  // the only thing this is used for is choosing the right scale factor in
+  // AppListMainView::PreloadIcons(), so we take care of that - perhaps by
+  // passing the display_id or the scale factor directly
+  view->InitAsBubbleAtFixedLocation(nullptr /* parent */, current_apps_page,
+                                    gfx::Point(), views::BubbleBorder::FLOAT,
+                                    true /* border_accepts_events */);
+
+  view->SetAnchorPoint(
+      GetCenterOfDisplay(display_id, GetMinimumBoundsHeightForAppList(view)));
+
+  // TODO(mfomitchev): Setup updating bounds on keyboard bounds change.
+  // TODO(mfomitchev): Setup dismissing on mouse/touch gesture anywhere outside
+  // the bounds of the app list.
+  // TODO(mfomitchev): Setup dismissing on maximize (touch-view) mode start/end.
+  // TODO(mfomitchev): Setup DnD.
+  // TODO(mfomitchev): UpdateAutoHideState for shelf
+}
+
+void AppListPresenterDelegateMus::OnShown(int64_t display_id) {
+  is_visible_ = true;
+}
+
+void AppListPresenterDelegateMus::OnDismissed() {
+  DCHECK(is_visible_);
+  is_visible_ = false;
+}
+
+void AppListPresenterDelegateMus::UpdateBounds() {
+  if (!view_ || !is_visible_)
+    return;
+
+  view_->UpdateBounds();
+}
+
+gfx::Vector2d AppListPresenterDelegateMus::GetVisibilityAnimationOffset(
+    aura::Window* root_window) {
+  // TODO(mfomitchev): Classic ash does different animation here depending on
+  // shelf alignment. We should probably do that too.
+  return gfx::Vector2d(0, kAnimationOffset);
+}
diff --git a/chrome/browser/ui/ash/app_list/app_list_presenter_delegate_mus.h b/chrome/browser/ui/ash/app_list/app_list_presenter_delegate_mus.h
new file mode 100644
index 0000000..c7978db
--- /dev/null
+++ b/chrome/browser/ui/ash/app_list/app_list_presenter_delegate_mus.h
@@ -0,0 +1,51 @@
+// Copyright 2016 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_ASH_APP_LIST_APP_LIST_PRESENTER_DELEGATE_MUS_H_
+#define CHROME_BROWSER_UI_ASH_APP_LIST_APP_LIST_PRESENTER_DELEGATE_MUS_H_
+
+#include "ui/app_list/presenter/app_list_presenter_delegate.h"
+
+#include "base/macros.h"
+
+namespace app_list {
+class AppListView;
+class AppListViewDelegateFactory;
+}
+
+// Mus+ash implementation of AppListPresetnerDelegate.
+// Responsible for laying out the app list UI as well as dismissing the app list
+// on in response to certain events (e.g. on mouse/touch gesture outside of the
+// app list bounds).
+class AppListPresenterDelegateMus : public app_list::AppListPresenterDelegate {
+ public:
+  explicit AppListPresenterDelegateMus(
+      app_list::AppListViewDelegateFactory* view_delegate_factory);
+  ~AppListPresenterDelegateMus() override;
+
+  // app_list::AppListPresenterDelegate:
+  app_list::AppListViewDelegate* GetViewDelegate() override;
+  void Init(app_list::AppListView* view,
+            int64_t display_id,
+            int current_apps_page) override;
+  void OnShown(int64_t display_id) override;
+  void OnDismissed() override;
+  void UpdateBounds() override;
+  gfx::Vector2d GetVisibilityAnimationOffset(
+      aura::Window* root_window) override;
+
+ private:
+  // Whether the app list is visible (or in the process of being shown).
+  bool is_visible_ = false;
+
+  // Not owned. Pointer is guaranteed to be valid while this object is alive.
+  app_list::AppListViewDelegateFactory* view_delegate_factory_;
+
+  // The current AppListView, owned by its widget.
+  app_list::AppListView* view_ = nullptr;
+
+  DISALLOW_COPY_AND_ASSIGN(AppListPresenterDelegateMus);
+};
+
+#endif  // CHROME_BROWSER_UI_ASH_APP_LIST_APP_LIST_PRESENTER_DELEGATE_MUS_H_
diff --git a/chrome/browser/ui/ash/app_list/app_list_presenter_service.cc b/chrome/browser/ui/ash/app_list/app_list_presenter_service.cc
new file mode 100644
index 0000000..58fef58d
--- /dev/null
+++ b/chrome/browser/ui/ash/app_list/app_list_presenter_service.cc
@@ -0,0 +1,27 @@
+// Copyright 2016 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/ash/app_list/app_list_presenter_service.h"
+
+#include "chrome/browser/ui/ash/app_list/app_list_service_ash.h"
+#include "ui/app_list/presenter/app_list_presenter.h"
+
+AppListPresenterService::AppListPresenterService() {}
+AppListPresenterService::~AppListPresenterService() {}
+
+void AppListPresenterService::Show(int64_t display_id) {
+  GetPresenter()->Show(display_id);
+}
+
+void AppListPresenterService::Dismiss() {
+  GetPresenter()->Dismiss();
+}
+
+void AppListPresenterService::ToggleAppList(int64_t display_id) {
+  GetPresenter()->ToggleAppList(display_id);
+}
+
+app_list::AppListPresenter* AppListPresenterService::GetPresenter() {
+  return AppListServiceAsh::GetInstance()->GetAppListPresenter();
+}
diff --git a/chrome/browser/ui/ash/app_list/app_list_presenter_service.h b/chrome/browser/ui/ash/app_list/app_list_presenter_service.h
new file mode 100644
index 0000000..3e00e8b
--- /dev/null
+++ b/chrome/browser/ui/ash/app_list/app_list_presenter_service.h
@@ -0,0 +1,32 @@
+// Copyright 2016 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_ASH_APP_LIST_APP_LIST_PRESENTER_SERVICE_H_
+#define CHROME_BROWSER_UI_ASH_APP_LIST_APP_LIST_PRESENTER_SERVICE_H_
+
+#include "base/macros.h"
+#include "ui/app_list/presenter/app_list_presenter.mojom.h"
+
+namespace app_list {
+class AppListPresenter;
+}
+
+// A service providing the Mojo interface to manipulate the App List.
+class AppListPresenterService : public app_list::mojom::AppListPresenter {
+ public:
+  AppListPresenterService();
+  ~AppListPresenterService() override;
+
+  // app_list::mojom::AppListPresenter:
+  void Show(int64_t display_id) override;
+  void Dismiss() override;
+  void ToggleAppList(int64_t display_id) override;
+
+ private:
+  app_list::AppListPresenter* GetPresenter();
+
+  DISALLOW_COPY_AND_ASSIGN(AppListPresenterService);
+};
+
+#endif  // CHROME_BROWSER_UI_ASH_APP_LIST_APP_LIST_PRESENTER_SERVICE_H_
diff --git a/chrome/browser/ui/ash/app_list/app_list_service_ash.cc b/chrome/browser/ui/ash/app_list/app_list_service_ash.cc
index bce86d32..68620408 100644
--- a/chrome/browser/ui/ash/app_list/app_list_service_ash.cc
+++ b/chrome/browser/ui/ash/app_list/app_list_service_ash.cc
@@ -6,7 +6,6 @@
 
 #include "ash/app_list/app_list_presenter_delegate.h"
 #include "ash/app_list/app_list_presenter_delegate_factory.h"
-#include "ash/app_list/app_list_view_delegate_factory.h"
 #include "ash/shell.h"
 #include "base/files/file_path.h"
 #include "base/memory/ptr_util.h"
@@ -16,18 +15,21 @@
 #include "chrome/browser/ui/app_list/app_list_view_delegate.h"
 #include "chrome/browser/ui/app_list/start_page_service.h"
 #include "chrome/browser/ui/ash/app_list/app_list_controller_ash.h"
+#include "chrome/browser/ui/ash/app_list/app_list_presenter_delegate_mus.h"
+#include "chrome/browser/ui/ash/ash_util.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
 #include "chrome/browser/ui/ash/session_util.h"
 #include "ui/app_list/app_list_switches.h"
 #include "ui/app_list/presenter/app_list_presenter_delegate_factory.h"
 #include "ui/app_list/presenter/app_list_presenter_impl.h"
+#include "ui/app_list/presenter/app_list_view_delegate_factory.h"
 #include "ui/app_list/views/app_list_main_view.h"
 #include "ui/app_list/views/app_list_view.h"
 #include "ui/app_list/views/contents_view.h"
 
 namespace {
 
-class ViewDelegateFactoryImpl : public ash::AppListViewDelegateFactory {
+class ViewDelegateFactoryImpl : public app_list::AppListViewDelegateFactory {
  public:
   explicit ViewDelegateFactoryImpl(AppListServiceImpl* factory)
       : factory_(factory) {}
@@ -45,6 +47,28 @@
   DISALLOW_COPY_AND_ASSIGN(ViewDelegateFactoryImpl);
 };
 
+class AppListPresenterDelegateFactoryMus
+    : public app_list::AppListPresenterDelegateFactory {
+ public:
+  explicit AppListPresenterDelegateFactoryMus(
+      std::unique_ptr<app_list::AppListViewDelegateFactory>
+          view_delegate_factory)
+      : view_delegate_factory_(std::move(view_delegate_factory)) {}
+
+  ~AppListPresenterDelegateFactoryMus() override {}
+
+  std::unique_ptr<app_list::AppListPresenterDelegate> GetDelegate(
+      app_list::AppListPresenter* presenter) override {
+    return base::WrapUnique(
+        new AppListPresenterDelegateMus(view_delegate_factory_.get()));
+  }
+
+ private:
+  std::unique_ptr<app_list::AppListViewDelegateFactory> view_delegate_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(AppListPresenterDelegateFactoryMus);
+};
+
 }  // namespace
 
 // static
@@ -53,9 +77,14 @@
                          base::LeakySingletonTraits<AppListServiceAsh>>::get();
 }
 
-AppListServiceAsh::AppListServiceAsh()
-    : presenter_delegate_factory_(new ash::AppListPresenterDelegateFactory(
-          base::WrapUnique(new ViewDelegateFactoryImpl(this)))) {
+AppListServiceAsh::AppListServiceAsh() {
+  if (chrome::IsRunningInMash()) {
+    presenter_delegate_factory_.reset(new AppListPresenterDelegateFactoryMus(
+        base::WrapUnique(new ViewDelegateFactoryImpl(this))));
+  } else {
+    presenter_delegate_factory_.reset(new ash::AppListPresenterDelegateFactory(
+        base::WrapUnique(new ViewDelegateFactoryImpl(this))));
+  }
   app_list_presenter_.reset(
       new app_list::AppListPresenterImpl(presenter_delegate_factory_.get()));
   controller_delegate_.reset(
@@ -89,7 +118,7 @@
     // TODO(calamity): This may cause the app list to show briefly before the
     // state change. If this becomes an issue, add the ability to ash::Shell to
     // load the app list without showing it.
-    app_list_presenter_->Show(ash::Shell::GetTargetRootWindow());
+    app_list_presenter_->Show(ash::Shell::GetTargetDisplayId());
     app_list_was_open = false;
     app_list_view = app_list_presenter_->GetView();
     DCHECK(app_list_view);
@@ -112,7 +141,7 @@
   // This may not work correctly if the profile passed in is different from the
   // one the ash Shell is currently using.
   // TODO(ananta): Handle profile changes correctly when !defined(OS_CHROMEOS).
-  app_list_presenter_->Show(ash::Shell::GetTargetRootWindow());
+  app_list_presenter_->Show(ash::Shell::GetTargetDisplayId());
 }
 
 void AppListServiceAsh::ShowForAppInstall(Profile* profile,
diff --git a/chrome/browser/ui/ash/chrome_launcher_prefs.cc b/chrome/browser/ui/ash/chrome_launcher_prefs.cc
index facb328..53a4f3a 100644
--- a/chrome/browser/ui/ash/chrome_launcher_prefs.cc
+++ b/chrome/browser/ui/ash/chrome_launcher_prefs.cc
@@ -12,6 +12,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/values.h"
 #include "chrome/browser/app_mode/app_mode_utils.h"
+#include "chrome/browser/ui/ash/launcher/launcher_controller_helper.h"
 #include "chrome/common/extensions/extension_constants.h"
 #include "chrome/common/pref_names.h"
 #include "components/pref_registry/pref_registry_syncable.h"
@@ -171,6 +172,7 @@
 
 const char kPinnedAppsPrefAppIDPath[] = "id";
 const char kPinnedAppsPrefPinnedByPolicy[] = "pinned_by_policy";
+const char kPinnedAppsPlaceholder[] = "AppShelfIDPlaceholder--------";
 
 const char kShelfAutoHideBehaviorAlways[] = "Always";
 const char kShelfAutoHideBehaviorNever[] = "Never";
@@ -268,4 +270,70 @@
   }
 }
 
+std::vector<std::string> GetPinnedAppsFromPrefs(
+    PrefService* prefs,
+    LauncherControllerHelper* helper) {
+  // Adding the app list item to the list of items requires that the ID is not
+  // a valid and known ID for the extension system. The ID was constructed that
+  // way - but just to make sure...
+  DCHECK(!helper->IsValidIDForCurrentUser(kPinnedAppsPlaceholder));
+
+  std::vector<std::string> apps;
+  const auto* pinned = prefs->GetList(prefs::kPinnedLauncherApps);
+  const auto* policy = prefs->GetList(prefs::kPolicyPinnedLauncherApps);
+
+  // Get the sanitized preference value for the index of the Chrome app icon.
+  const size_t chrome_icon_index = std::max<size_t>(
+      0, std::min<size_t>(pinned->GetSize(),
+                          prefs->GetInteger(prefs::kShelfChromeIconIndex)));
+
+  // Check if Chrome is in either of the the preferences lists.
+  std::unique_ptr<base::Value> chrome_app(
+      ash::CreateAppDict(extension_misc::kChromeAppId));
+  bool chrome_listed =
+      (pinned->Find(*chrome_app.get()) != pinned->end() ||
+       (policy && policy->Find(*chrome_app.get()) != policy->end()));
+
+  std::string app_id;
+  for (size_t i = 0; policy && (i < policy->GetSize()); ++i) {
+    const base::DictionaryValue* dictionary = nullptr;
+    if (policy->GetDictionary(i, &dictionary) &&
+        dictionary->GetString(kPinnedAppsPrefAppIDPath, &app_id) &&
+        helper->IsValidIDForCurrentUser(app_id) &&
+        std::find(apps.begin(), apps.end(), app_id) == apps.end()) {
+      apps.push_back(app_id);
+    }
+  }
+
+  for (size_t i = 0; i < pinned->GetSize(); ++i) {
+    // We need to position the chrome icon relative to its place in the pinned
+    // preference list - even if an item of that list isn't shown yet.
+    if (i == chrome_icon_index && !chrome_listed) {
+      apps.push_back(extension_misc::kChromeAppId);
+      chrome_listed = true;
+    }
+    bool pinned_by_policy = false;
+    const base::DictionaryValue* dictionary = nullptr;
+    if (pinned->GetDictionary(i, &dictionary) &&
+        dictionary->GetString(kPinnedAppsPrefAppIDPath, &app_id) &&
+        helper->IsValidIDForCurrentUser(app_id) &&
+        std::find(apps.begin(), apps.end(), app_id) == apps.end() &&
+        (!dictionary->GetBoolean(kPinnedAppsPrefPinnedByPolicy,
+                                 &pinned_by_policy) ||
+         !pinned_by_policy)) {
+      apps.push_back(app_id);
+    }
+  }
+
+  // If not added yet, the chrome item will be the last item in the list.
+  if (!chrome_listed)
+    apps.push_back(extension_misc::kChromeAppId);
+
+  // If not added yet, place the app list item at the beginning of the list.
+  if (std::find(apps.begin(), apps.end(), kPinnedAppsPlaceholder) == apps.end())
+    apps.insert(apps.begin(), kPinnedAppsPlaceholder);
+
+  return apps;
+}
+
 }  // namespace ash
diff --git a/chrome/browser/ui/ash/chrome_launcher_prefs.h b/chrome/browser/ui/ash/chrome_launcher_prefs.h
index de6fe245..86fe2bb 100644
--- a/chrome/browser/ui/ash/chrome_launcher_prefs.h
+++ b/chrome/browser/ui/ash/chrome_launcher_prefs.h
@@ -6,9 +6,11 @@
 #define CHROME_BROWSER_UI_ASH_CHROME_LAUNCHER_PREFS_H_
 
 #include <string>
+#include <vector>
 
 #include "ash/shelf/shelf_types.h"
 
+class LauncherControllerHelper;
 class PrefService;
 
 namespace base {
@@ -27,6 +29,10 @@
 
 extern const char kPinnedAppsPrefPinnedByPolicy[];
 
+// Value used as a placeholder in the list of pinned applications.
+// This is NOT a valid extension identifier so pre-M31 versions ignore it.
+extern const char kPinnedAppsPlaceholder[];
+
 // Values used for prefs::kShelfAutoHideBehavior.
 extern const char kShelfAutoHideBehaviorAlways[];
 extern const char kShelfAutoHideBehaviorNever[];
@@ -41,20 +47,25 @@
 
 base::DictionaryValue* CreateAppDict(const std::string& app_id);
 
-// Get or set the shelf auto hide behavior preference for a root window.
+// Get or set the shelf auto hide behavior preference for a particular display.
 ShelfAutoHideBehavior GetShelfAutoHideBehaviorPref(PrefService* prefs,
                                                    int64_t display_id);
 void SetShelfAutoHideBehaviorPref(PrefService* prefs,
                                   int64_t display_id,
                                   ShelfAutoHideBehavior behavior);
 
-// Get or set the shelf alignment preference for a root window.
+// Get or set the shelf alignment preference for a particular display.
 wm::ShelfAlignment GetShelfAlignmentPref(PrefService* prefs,
                                          int64_t display_id);
 void SetShelfAlignmentPref(PrefService* prefs,
                            int64_t display_id,
                            wm::ShelfAlignment alignment);
 
+// Get the list of pinned apps from preferences.
+std::vector<std::string> GetPinnedAppsFromPrefs(
+    PrefService* prefs,
+    LauncherControllerHelper* helper);
+
 }  // namespace ash
 
 #endif  // CHROME_BROWSER_UI_ASH_CHROME_LAUNCHER_PREFS_H_
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 2e3ee304..14e4046 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
@@ -13,6 +13,7 @@
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
 #include "chrome/browser/ui/ash/launcher/launcher_application_menu_item_model.h"
 #include "chrome/browser/ui/ash/launcher/launcher_context_menu.h"
+#include "chrome/browser/ui/ash/launcher/launcher_controller_helper.h"
 #include "chrome/browser/ui/ash/launcher/launcher_item_controller.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h"
@@ -200,7 +201,8 @@
 }
 
 base::string16 AppShortcutLauncherItemController::GetTitle() {
-  return GetAppTitle();
+  return LauncherControllerHelper::GetAppTitle(launcher_controller()->profile(),
+                                               app_id());
 }
 
 ash::ShelfMenuModel* AppShortcutLauncherItemController::CreateApplicationMenu(
diff --git a/chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.cc b/chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.cc
index 6601b171..f6d6d2a3 100644
--- a/chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.cc
+++ b/chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.cc
@@ -8,6 +8,7 @@
 
 #include "ash/wm/window_util.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
+#include "chrome/browser/ui/ash/launcher/launcher_controller_helper.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
 #include "ui/base/base_window.h"
@@ -137,7 +138,8 @@
 }
 
 base::string16 AppWindowLauncherItemController::GetTitle() {
-  return GetAppTitle();
+  return LauncherControllerHelper::GetAppTitle(launcher_controller()->profile(),
+                                               app_id());
 }
 
 bool AppWindowLauncherItemController::IsDraggable() {
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
index 546ac11..09d5c0ac 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
@@ -45,7 +45,7 @@
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_app_menu_item_browser.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_app_menu_item_tab.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_types.h"
-#include "chrome/browser/ui/ash/launcher/launcher_app_tab_helper.h"
+#include "chrome/browser/ui/ash/launcher/launcher_controller_helper.h"
 #include "chrome/browser/ui/ash/launcher/launcher_extension_app_updater.h"
 #include "chrome/browser/ui/ash/launcher/launcher_item_controller.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
@@ -56,9 +56,6 @@
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_tabstrip.h"
 #include "chrome/browser/ui/browser_window.h"
-#include "chrome/browser/ui/extensions/app_launch_params.h"
-#include "chrome/browser/ui/extensions/application_launch.h"
-#include "chrome/browser/ui/extensions/extension_enable_flow.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/web_applications/web_app.h"
 #include "chrome/common/chrome_switches.h"
@@ -84,7 +81,6 @@
 #include "extensions/common/url_pattern.h"
 #include "grit/ash_resources.h"
 #include "grit/theme_resources.h"
-#include "net/base/url_util.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -98,7 +94,6 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_icon_loader.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
-#include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
 #include "chrome/browser/ui/ash/chrome_shell_delegate.h"
 #include "chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h"
 #include "chrome/browser/ui/ash/launcher/launcher_arc_app_updater.h"
@@ -117,11 +112,6 @@
 
 namespace {
 
-// This will be used as placeholder in the list of the pinned applciatons.
-// Note that this is NOT a valid extension identifier so that pre M31 versions
-// will ignore it.
-const char kAppShelfIdPlaceholder[] = "AppShelfIDPlaceholder--------";
-
 int64_t GetDisplayIDForShelf(ash::Shelf* shelf) {
   aura::Window* root_window =
       shelf->shelf_widget()->GetNativeWindow()->GetRootWindow();
@@ -145,16 +135,6 @@
   }
 }
 
-std::string GetSourceFromAppListSource(ash::LaunchSource source) {
-  switch (source) {
-    case ash::LAUNCH_FROM_APP_LIST:
-      return std::string(extension_urls::kLaunchSourceAppList);
-    case ash::LAUNCH_FROM_APP_LIST_SEARCH:
-      return std::string(extension_urls::kLaunchSourceAppListSearch);
-    default: return std::string();
-  }
-}
-
 /*
  * Return whether an app is pinned only by user.
  * This function doesn't expect an app_id neither pinned by user nor by
@@ -203,25 +183,6 @@
   return true;
 }
 
-void update_pinned_apps(const std::string& app_id,
-                        bool valid_for_current_user,
-                        std::vector<std::string>* pinned_apps,
-                        bool* chrome_icon_added,
-                        bool* app_list_icon_added) {
-  if (app_id == extension_misc::kChromeAppId) {
-    *chrome_icon_added = true;
-    pinned_apps->push_back(extension_misc::kChromeAppId);
-  } else if (app_id == kAppShelfIdPlaceholder) {
-    *app_list_icon_added = true;
-    pinned_apps->push_back(kAppShelfIdPlaceholder);
-  } else if (valid_for_current_user) {
-    // Note: In multi profile scenarios we only want to show pinnable apps
-    // here which is correct. Running applications from the other users will
-    // continue to run. So no need for multi profile modifications.
-    pinned_apps->push_back(app_id);
-  }
-}
-
 const char* const kPinProhibitedExtensionIds[] = {
 #if defined(OS_CHROMEOS)
     "cnbgggchhmkkdmeppjobngjoejnihlei",  // Arc Support
@@ -656,44 +617,7 @@
 void ChromeLauncherController::LaunchApp(const std::string& app_id,
                                          ash::LaunchSource source,
                                          int event_flags) {
-#if defined(OS_CHROMEOS)
-  if (ArcAppListPrefs::Get(profile_)->IsRegistered(app_id)) {
-    arc::LaunchApp(profile_, app_id);
-    return;
-  }
-#endif
-
-  // |extension| could be NULL when it is being unloaded for updating.
-  const Extension* extension = GetExtensionForAppID(app_id);
-  if (!extension)
-    return;
-
-  if (!extensions::util::IsAppLaunchableWithoutEnabling(app_id, profile_)) {
-    // Do nothing if there is already a running enable flow.
-    if (extension_enable_flow_)
-      return;
-
-    extension_enable_flow_.reset(
-        new ExtensionEnableFlow(profile_, app_id, this));
-    extension_enable_flow_->StartForNativeWindow(NULL);
-    return;
-  }
-
-  // The app will be created for the currently active profile.
-  AppLaunchParams params = CreateAppLaunchParamsWithEventFlags(
-      profile_, extension, event_flags, extensions::SOURCE_APP_LAUNCHER);
-  if (source != ash::LAUNCH_FROM_UNKNOWN &&
-      app_id == extensions::kWebStoreAppId) {
-    // Get the corresponding source string.
-    std::string source_value = GetSourceFromAppListSource(source);
-
-    // Set an override URL to include the source.
-    GURL extension_url = extensions::AppLaunchInfo::GetFullLaunchURL(extension);
-    params.override_url = net::AppendQueryParameter(
-        extension_url, extension_urls::kWebstoreSourceField, source_value);
-  }
-
-  OpenApplication(params);
+  launcher_controller_helper_->LaunchApp(app_id, source, event_flags);
 }
 
 void ChromeLauncherController::ActivateApp(const std::string& app_id,
@@ -894,8 +818,8 @@
       } else if (model_->items()[i].type == ash::TYPE_BROWSER_SHORTCUT) {
         PersistChromeItemIndex(i);
       } else if (model_->items()[i].type == ash::TYPE_APP_LIST) {
-        base::DictionaryValue* app_value = ash::CreateAppDict(
-            kAppShelfIdPlaceholder);
+        base::DictionaryValue* app_value =
+            ash::CreateAppDict(ash::kPinnedAppsPlaceholder);
         if (app_value)
           updater->Append(app_value);
       }
@@ -917,7 +841,7 @@
 
 void ChromeLauncherController::UpdateAppState(content::WebContents* contents,
                                               AppState app_state) {
-  std::string app_id = app_tab_helper_->GetAppID(contents);
+  std::string app_id = launcher_controller_helper_->GetAppID(contents);
 
   // Check if the gMail app is loaded and it matches the given content.
   // This special treatment is needed to address crbug.com/234268.
@@ -956,7 +880,7 @@
     content::WebContents* contents) {
   DCHECK(contents);
 
-  std::string app_id = app_tab_helper_->GetAppID(contents);
+  std::string app_id = launcher_controller_helper_->GetAppID(contents);
 
   if (app_id.empty() && ContentCanBeHandledByGmailApp(contents))
     app_id = kGmailAppId;
@@ -1190,17 +1114,6 @@
     model_->set_status(ash::ShelfModel::STATUS_NORMAL);
 }
 
-void ChromeLauncherController::ExtensionEnableFlowFinished() {
-  LaunchApp(extension_enable_flow_->extension_id(),
-            ash::LAUNCH_FROM_UNKNOWN,
-            ui::EF_NONE);
-  extension_enable_flow_.reset();
-}
-
-void ChromeLauncherController::ExtensionEnableFlowAborted(bool user_initiated) {
-  extension_enable_flow_.reset();
-}
-
 ChromeLauncherAppMenuItems ChromeLauncherController::GetApplicationList(
     const ash::ShelfItem& item,
     int event_flags) {
@@ -1305,8 +1218,9 @@
                                                ash::TYPE_APP_SHORTCUT);
 }
 
-void ChromeLauncherController::SetAppTabHelperForTest(AppTabHelper* helper) {
-  app_tab_helper_.reset(helper);
+void ChromeLauncherController::SetLauncherControllerHelperForTest(
+    LauncherControllerHelper* helper) {
+  launcher_controller_helper_.reset(helper);
 }
 
 void ChromeLauncherController::SetAppIconLoadersForTest(
@@ -1518,7 +1432,8 @@
   // into the pref state. Therefore we tell |persistPinnedState| to ignore any
   // invocations while we are running.
   base::AutoReset<bool> auto_reset(&ignore_persist_pinned_state_change_, true);
-  std::vector<std::string> pinned_apps = GetListOfPinnedAppsAndBrowser();
+  std::vector<std::string> pinned_apps = ash::GetPinnedAppsFromPrefs(
+      profile_->GetPrefs(), launcher_controller_helper_.get());
 
   int index = 0;
   int max_index = model_->item_count();
@@ -1535,7 +1450,7 @@
   for (; index < max_index && pref_app_id != pinned_apps.end(); ++index) {
     // Check if we have an item which we need to handle.
     if (*pref_app_id == extension_misc::kChromeAppId ||
-        *pref_app_id == kAppShelfIdPlaceholder ||
+        *pref_app_id == ash::kPinnedAppsPlaceholder ||
         IsAppPinned(*pref_app_id)) {
       for (; index < max_index; ++index) {
         const ash::ShelfItem& item(model_->items()[index]);
@@ -1544,7 +1459,7 @@
         if (item.type != ash::TYPE_APP_SHORTCUT && !is_app_list && !is_chrome)
           continue;
         LauncherItemController* controller = GetLauncherItemController(item.id);
-        if ((kAppShelfIdPlaceholder == *pref_app_id && is_app_list) ||
+        if ((ash::kPinnedAppsPlaceholder == *pref_app_id && is_app_list) ||
             (extension_misc::kChromeAppId == *pref_app_id && is_chrome) ||
             (controller && controller->app_id() == *pref_app_id)) {
           // Check if an item needs to be moved here.
@@ -1630,7 +1545,7 @@
   for (; pref_app_id != pinned_apps.end(); ++pref_app_id) {
     // All items but the chrome and / or app list shortcut needs to be added.
     bool is_chrome = *pref_app_id == extension_misc::kChromeAppId;
-    bool is_app_list = *pref_app_id == kAppShelfIdPlaceholder;
+    bool is_app_list = *pref_app_id == ash::kPinnedAppsPlaceholder;
     // Coming here we know the next item which can be finalized, either the
     // chrome item or the app launcher. The final position is the end of the
     // list. The menu model will make sure that the item is grouped according
@@ -1805,14 +1720,6 @@
   profile_->GetPrefs()->SetInteger(prefs::kShelfChromeIconIndex, index);
 }
 
-int ChromeLauncherController::GetChromeIconIndexFromPref() const {
-  size_t index = profile_->GetPrefs()->GetInteger(prefs::kShelfChromeIconIndex);
-  const base::ListValue* pinned_apps_pref =
-      profile_->GetPrefs()->GetList(prefs::kPinnedLauncherApps);
-  return std::max(static_cast<size_t>(0),
-                  std::min(pinned_apps_pref->GetSize(), index));
-}
-
 void ChromeLauncherController::MoveChromeOrApplistToFinalPosition(
     bool is_chrome,
     bool is_app_list,
@@ -1858,7 +1765,8 @@
 int ChromeLauncherController::GetChromeIconIndexForCreation() {
   // We get the list of pinned apps as they currently would get pinned.
   // Within this list the chrome icon will be the correct location.
-  std::vector<std::string> pinned_apps = GetListOfPinnedAppsAndBrowser();
+  std::vector<std::string> pinned_apps = ash::GetPinnedAppsFromPrefs(
+      profile_->GetPrefs(), launcher_controller_helper_.get());
 
   std::vector<std::string>::iterator it =
       std::find(pinned_apps.begin(),
@@ -1875,88 +1783,6 @@
   return std::min(model_->item_count(), index);
 }
 
-std::vector<std::string>
-ChromeLauncherController::GetListOfPinnedAppsAndBrowser() {
-  // Adding the app list item to the list of items requires that the ID is not
-  // a valid and known ID for the extension system. The ID was constructed that
-  // way - but just to make sure...
-  DCHECK(!app_tab_helper_->IsValidIDForCurrentUser(kAppShelfIdPlaceholder));
-
-  std::vector<std::string> pinned_apps;
-
-  // Get the new incarnation of the list.
-  const base::ListValue* pinned_apps_pref =
-      profile_->GetPrefs()->GetList(prefs::kPinnedLauncherApps);
-
-  const base::ListValue* policy_pinned_apps_pref =
-      profile_->GetPrefs()->GetList(prefs::kPolicyPinnedLauncherApps);
-
-  // Keep track of the addition of the chrome and the app list icon.
-  bool chrome_icon_added = false;
-  bool app_list_icon_added = false;
-  size_t chrome_icon_index = GetChromeIconIndexFromPref();
-
-  // See if the chrome string is already in the pinned list and remove it if
-  // needed.
-  base::Value* chrome_app = ash::CreateAppDict(extension_misc::kChromeAppId);
-  if (chrome_app) {
-    chrome_icon_added = pinned_apps_pref->Find(*chrome_app) !=
-        pinned_apps_pref->end();
-    delete chrome_app;
-  }
-
-  if (policy_pinned_apps_pref) {
-    for (size_t index = 0; index < policy_pinned_apps_pref->GetSize();
-         ++index) {
-      const base::DictionaryValue* app = NULL;
-      std::string app_id;
-      if (policy_pinned_apps_pref->GetDictionary(index, &app) &&
-          app->GetString(ash::kPinnedAppsPrefAppIDPath, &app_id) &&
-          (std::find(pinned_apps.begin(), pinned_apps.end(), app_id) ==
-           pinned_apps.end()))
-        update_pinned_apps(
-            app_id, app_tab_helper_->IsValidIDForCurrentUser(app_id),
-            &pinned_apps, &chrome_icon_added, &app_list_icon_added);
-    }
-  }
-
-  for (size_t index = 0; index < pinned_apps_pref->GetSize(); ++index) {
-    // We need to position the chrome icon relative to it's place in the pinned
-    // preference list - even if an item of that list isn't shown yet.
-    if (index == chrome_icon_index && !chrome_icon_added) {
-      pinned_apps.push_back(extension_misc::kChromeAppId);
-      chrome_icon_added = true;
-    }
-    const base::DictionaryValue* app = NULL;
-    std::string app_id;
-    if (pinned_apps_pref->GetDictionary(index, &app) &&
-        app->GetString(ash::kPinnedAppsPrefAppIDPath, &app_id) &&
-        (std::find(pinned_apps.begin(), pinned_apps.end(), app_id) ==
-             pinned_apps.end())) {
-      bool pinned_by_policy;
-      if (app->GetBoolean(ash::kPinnedAppsPrefPinnedByPolicy,
-                          &pinned_by_policy) &&
-          pinned_by_policy) {
-        continue;
-      }
-      update_pinned_apps(
-          app_id, app_tab_helper_->IsValidIDForCurrentUser(app_id),
-          &pinned_apps, &chrome_icon_added, &app_list_icon_added);
-    }
-  }
-
-  // If not added yet, the chrome item will be the last item in the list.
-  if (!chrome_icon_added)
-    pinned_apps.push_back(extension_misc::kChromeAppId);
-
-  // If not added yet, add the app list item either at the end or at the
-  // beginning - depending on the shelf layout.
-  if (!app_list_icon_added) {
-    pinned_apps.insert(pinned_apps.begin(), kAppShelfIdPlaceholder);
-  }
-  return pinned_apps;
-}
-
 bool ChromeLauncherController::IsIncognito(
     const content::WebContents* web_contents) const {
   const Profile* profile =
@@ -2004,13 +1830,13 @@
 void ChromeLauncherController::AttachProfile(Profile* profile) {
   profile_ = profile;
   // Either add the profile to the list of known profiles and make it the active
-  // one for some functions of AppTabHelper or create a new one.
-  if (!app_tab_helper_.get())
-    app_tab_helper_.reset(new LauncherAppTabHelper(profile_));
+  // one for some functions of LauncherControllerHelper or create a new one.
+  if (!launcher_controller_helper_.get())
+    launcher_controller_helper_.reset(new LauncherControllerHelper(profile_));
   else
-    app_tab_helper_->SetCurrentUser(profile_);
+    launcher_controller_helper_->SetCurrentUser(profile_);
   // TODO(skuhne): The AppIconLoaderImpl has the same problem. Each loaded
-  // image is associated with a profile (it's loader requires the profile).
+  // image is associated with a profile (its loader requires the profile).
   // Since icon size changes are possible, the icon could be requested to be
   // reloaded. However - having it not multi profile aware would cause problems
   // if the icon cache gets deleted upon user switch.
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h
index 88225b80..de76ffc 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h
@@ -28,7 +28,6 @@
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_app_menu_item.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_types.h"
 #include "chrome/browser/ui/ash/launcher/launcher_app_updater.h"
-#include "chrome/browser/ui/extensions/extension_enable_flow_delegate.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "components/syncable_prefs/pref_service_syncable_observer.h"
 #include "extensions/common/constants.h"
@@ -38,8 +37,8 @@
 class Browser;
 class BrowserShortcutLauncherItemController;
 class BrowserStatusMonitor;
-class ExtensionEnableFlow;
 class GURL;
+class LauncherControllerHelper;
 class LauncherItemController;
 class Profile;
 class AppWindowLauncherController;
@@ -89,7 +88,6 @@
       public AppIconLoaderDelegate,
       public syncable_prefs::PrefServiceSyncableObserver,
       public AppSyncUIStateObserver,
-      public ExtensionEnableFlowDelegate,
       public LauncherAppUpdater::Delegate,
       public ash::ShelfItemDelegateManagerObserver {
  public:
@@ -107,25 +105,6 @@
     APP_STATE_REMOVED
   };
 
-  // Mockable interface to get app ids from tabs.
-  class AppTabHelper {
-   public:
-    virtual ~AppTabHelper() {}
-
-    // Returns the app id of the specified tab, or an empty string if there is
-    // no app. All known profiles will be queried for this.
-    virtual std::string GetAppID(content::WebContents* tab) = 0;
-
-    // Returns true if |id| is valid for the currently active profile.
-    // Used during restore to ignore no longer valid extensions.
-    // Note that already running applications are ignored by the restore
-    // process.
-    virtual bool IsValidIDForCurrentUser(const std::string& id) = 0;
-
-    // Sets the currently active profile for the usage of |GetAppID|.
-    virtual void SetCurrentUser(Profile* profile) = 0;
-  };
-
   ChromeLauncherController(Profile* profile, ash::ShelfModel* model);
   ~ChromeLauncherController() override;
 
@@ -308,10 +287,6 @@
   // AppSyncUIStateObserver:
   void OnAppSyncUIStatusChanged() override;
 
-  // ExtensionEnableFlowDelegate:
-  void ExtensionEnableFlowFinished() override;
-  void ExtensionEnableFlowAborted(bool user_initiated) override;
-
   // AppIconLoaderDelegate:
   void OnAppImageUpdated(const std::string& app_id,
                          const gfx::ImageSkia& image) override;
@@ -391,9 +366,8 @@
   ash::ShelfID CreateAppShortcutLauncherItem(const std::string& app_id,
                                              int index);
 
-  // Sets the AppTabHelper/AppIconLoader, taking ownership of the helper class.
-  // These are intended for testing.
-  void SetAppTabHelperForTest(AppTabHelper* helper);
+  // Sets LauncherControllerHelper/AppIconLoader for test, taking ownership.
+  void SetLauncherControllerHelperForTest(LauncherControllerHelper* helper);
   void SetAppIconLoadersForTest(
       std::vector<std::unique_ptr<AppIconLoader>>& loaders);
   const std::string& GetAppIdFromShelfIdForTest(ash::ShelfID id);
@@ -485,9 +459,6 @@
   // Update browser shortcut's index.
   void PersistChromeItemIndex(int index);
 
-  // Get browser shortcut's index from pref.
-  int GetChromeIconIndexFromPref() const;
-
   // Depending on the provided flags, move either the chrome icon, the app icon
   // or none to the given |target_index|. The provided |chrome_index| and
   // |app_list_index| locations will get adjusted within this call to finalize
@@ -507,9 +478,6 @@
   // configuration of pinned and known (but not running) apps.
   int GetChromeIconIndexForCreation();
 
-  // Get the list of pinned programs from the preferences.
-  std::vector<std::string> GetListOfPinnedAppsAndBrowser();
-
   // Close all windowed V1 applications of a certain extension which was already
   // deleted.
   void CloseWindowedAppsFromRemovedExtension(const std::string& app_id,
@@ -549,9 +517,9 @@
       app_window_controllers_;
 
   // Used to get app info for tabs.
-  std::unique_ptr<AppTabHelper> app_tab_helper_;
+  std::unique_ptr<LauncherControllerHelper> launcher_controller_helper_;
 
-  // Used to load the image for an extension app item.
+  // Used to load the images for app items.
   std::vector<std::unique_ptr<AppIconLoader>> app_icon_loaders_;
 
   // Used to handle app load/unload events.
@@ -561,8 +529,6 @@
 
   AppSyncUIState* app_sync_ui_state_;
 
-  std::unique_ptr<ExtensionEnableFlow> extension_enable_flow_;
-
   // The owned browser status monitor.
   std::unique_ptr<BrowserStatusMonitor> browser_status_monitor_;
 
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
index 92cdd60..058a6d4 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
@@ -33,6 +33,7 @@
 #include "chrome/browser/ui/ash/chrome_launcher_prefs.h"
 #include "chrome/browser/ui/ash/launcher/extension_app_window_launcher_item_controller.h"
 #include "chrome/browser/ui/ash/launcher/launcher_application_menu_item_model.h"
+#include "chrome/browser/ui/ash/launcher/launcher_controller_helper.h"
 #include "chrome/browser/ui/ash/launcher/launcher_item_controller.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
@@ -190,14 +191,13 @@
   DISALLOW_COPY_AND_ASSIGN(TestAppIconLoaderImpl);
 };
 
-// Test implementation of AppTabHelper.
-class TestAppTabHelperImpl : public ChromeLauncherController::AppTabHelper {
+// Test implementation of LauncherControllerHelper.
+class TestLauncherControllerHelper : public LauncherControllerHelper {
  public:
-  TestAppTabHelperImpl() {}
-  ~TestAppTabHelperImpl() override {}
+  TestLauncherControllerHelper() : LauncherControllerHelper(nullptr) {}
+  ~TestLauncherControllerHelper() override {}
 
-  // Sets the id for the specified tab. The id is removed if Remove() is
-  // invoked.
+  // Sets the id for the specified tab.
   void SetAppID(content::WebContents* tab, const std::string& id) {
     tab_id_map_[tab] = id;
   }
@@ -207,7 +207,7 @@
     return tab_id_map_.find(tab) != tab_id_map_.end();
   }
 
-  // AppTabHelper implementation:
+  // LauncherControllerHelper:
   std::string GetAppID(content::WebContents* tab) override {
     return tab_id_map_.find(tab) != tab_id_map_.end() ? tab_id_map_[tab] :
         std::string();
@@ -231,7 +231,7 @@
 
   TabToStringMap tab_id_map_;
 
-  DISALLOW_COPY_AND_ASSIGN(TestAppTabHelperImpl);
+  DISALLOW_COPY_AND_ASSIGN(TestLauncherControllerHelper);
 };
 
 // Test implementation of a V2 app launcher item controller.
@@ -501,8 +501,8 @@
     launcher_controller_->SetAppIconLoadersForTest(loaders);
   }
 
-  void SetAppTabHelper(ChromeLauncherController::AppTabHelper* helper) {
-    launcher_controller_->SetAppTabHelperForTest(helper);
+  void SetLauncherControllerHelper(LauncherControllerHelper* helper) {
+    launcher_controller_->SetLauncherControllerHelperForTest(helper);
   }
 
   void SetShelfItemDelegateManager(ash::ShelfItemDelegateManager* manager) {
@@ -940,21 +940,20 @@
   }
 
   // Creates a running V1 application.
-  // Note that with the use of the app_tab_helper as done below, this is only
-  // usable with a single v1 application.
+  // Note that with the use of the launcher_controller_helper as done below,
+  // this is only usable with a single v1 application.
   V1App* CreateRunningV1App(Profile* profile,
                             const std::string& app_name,
                             const std::string& url) {
     V1App* v1_app = new V1App(profile, app_name);
-    // Create a new app tab helper and assign it to the launcher so that this
-    // app gets properly detected.
-    // TODO(skuhne): Create a more intelligent app tab helper which is able to
-    // detect all running apps properly.
-    TestAppTabHelperImpl* app_tab_helper = new TestAppTabHelperImpl;
-    app_tab_helper->SetAppID(
-        v1_app->browser()->tab_strip_model()->GetWebContentsAt(0),
-        app_name);
-    SetAppTabHelper(app_tab_helper);
+    // Create a new launcher controller helper and assign it to the launcher so
+    // that this app gets properly detected.
+    // TODO(skuhne): Create a more intelligent launcher contrller helper that is
+    // able to detect all running apps properly.
+    TestLauncherControllerHelper* helper = new TestLauncherControllerHelper;
+    helper->SetAppID(v1_app->browser()->tab_strip_model()->GetWebContentsAt(0),
+                     app_name);
+    SetLauncherControllerHelper(helper);
 
     NavigateAndCommitActiveTabWithTitle(
         v1_app->browser(), GURL(url), ASCIIToUTF16(""));
@@ -1590,8 +1589,7 @@
        V1AppUpdateOnUserSwitchEdgecases2) {
   // Create a browser item in the LauncherController.
   InitLauncherController();
-  TestAppTabHelperImpl* app_tab_helper = new TestAppTabHelperImpl;
-  SetAppTabHelper(app_tab_helper);
+  SetLauncherControllerHelper(new TestLauncherControllerHelper);
 
   // First test: Create an app when the user is not active.
   std::string user2 = "user2";
@@ -2753,8 +2751,8 @@
 TEST_F(ChromeLauncherControllerTest, PersistLauncherItemPositions) {
   InitLauncherController();
 
-  TestAppTabHelperImpl* app_tab_helper = new TestAppTabHelperImpl;
-  SetAppTabHelper(app_tab_helper);
+  TestLauncherControllerHelper* helper = new TestLauncherControllerHelper;
+  SetLauncherControllerHelper(helper);
 
   EXPECT_EQ(ash::TYPE_APP_LIST, model_->items()[0].type);
   EXPECT_EQ(ash::TYPE_BROWSER_SHORTCUT, model_->items()[1].type);
@@ -2764,8 +2762,8 @@
   chrome::NewTab(browser());
   chrome::NewTab(browser());
   EXPECT_EQ(2, tab_strip_model->count());
-  app_tab_helper->SetAppID(tab_strip_model->GetWebContentsAt(0), "1");
-  app_tab_helper->SetAppID(tab_strip_model->GetWebContentsAt(1), "2");
+  helper->SetAppID(tab_strip_model->GetWebContentsAt(0), "1");
+  helper->SetAppID(tab_strip_model->GetWebContentsAt(1), "2");
 
   EXPECT_FALSE(launcher_controller_->IsAppPinned("1"));
   launcher_controller_->PinAppWithID("1");
@@ -2798,10 +2796,10 @@
   AddAppListLauncherItem();
   launcher_controller_.reset(
       ChromeLauncherController::CreateInstance(profile(), model_.get()));
-  app_tab_helper = new TestAppTabHelperImpl;
-  app_tab_helper->SetAppID(tab_strip_model->GetWebContentsAt(0), "1");
-  app_tab_helper->SetAppID(tab_strip_model->GetWebContentsAt(1), "2");
-  SetAppTabHelper(app_tab_helper);
+  helper = new TestLauncherControllerHelper;
+  helper->SetAppID(tab_strip_model->GetWebContentsAt(0), "1");
+  helper->SetAppID(tab_strip_model->GetWebContentsAt(1), "2");
+  SetLauncherControllerHelper(helper);
   if (!ash::Shell::HasInstance()) {
     item_delegate_manager_ = new ash::ShelfItemDelegateManager(model_.get());
     SetShelfItemDelegateManager(item_delegate_manager_);
@@ -2823,9 +2821,9 @@
   TabStripModel* tab_strip_model = browser()->tab_strip_model();
   EXPECT_EQ(1, tab_strip_model->count());
 
-  TestAppTabHelperImpl* app_tab_helper = new TestAppTabHelperImpl;
-  app_tab_helper->SetAppID(tab_strip_model->GetWebContentsAt(0), "1");
-  SetAppTabHelper(app_tab_helper);
+  TestLauncherControllerHelper* helper = new TestLauncherControllerHelper;
+  helper->SetAppID(tab_strip_model->GetWebContentsAt(0), "1");
+  SetLauncherControllerHelper(helper);
 
   // app_icon_loader is owned by ChromeLauncherController.
   TestAppIconLoaderImpl* app_icon_loader = new TestAppIconLoaderImpl;
@@ -2856,9 +2854,9 @@
   AddAppListLauncherItem();
   launcher_controller_.reset(
       ChromeLauncherController::CreateInstance(profile(), model_.get()));
-  app_tab_helper = new TestAppTabHelperImpl;
-  app_tab_helper->SetAppID(tab_strip_model->GetWebContentsAt(0), "1");
-  SetAppTabHelper(app_tab_helper);
+  helper = new TestLauncherControllerHelper;
+  helper->SetAppID(tab_strip_model->GetWebContentsAt(0), "1");
+  SetLauncherControllerHelper(helper);
   // app_icon_loader is owned by ChromeLauncherController.
   app_icon_loader = new TestAppIconLoaderImpl;
   app_icon_loader->AddSupportedApp("1");
diff --git a/chrome/browser/ui/ash/launcher/chrome_mash_shelf_controller.cc b/chrome/browser/ui/ash/launcher/chrome_mash_shelf_controller.cc
index c212264..d3931a0 100644
--- a/chrome/browser/ui/ash/launcher/chrome_mash_shelf_controller.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_mash_shelf_controller.cc
@@ -4,18 +4,29 @@
 
 #include "chrome/browser/ui/ash/launcher/chrome_mash_shelf_controller.h"
 
+#include "chrome/browser/extensions/extension_app_icon_loader.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/ash/chrome_launcher_prefs.h"
+#include "chrome/browser/ui/ash/launcher/chrome_launcher_types.h"
+#include "chrome/browser/ui/ash/launcher/launcher_item_controller.h"
 #include "chrome/grit/theme_resources.h"
 #include "content/public/common/mojo_shell_connection.h"
+#include "extensions/common/constants.h"
+#include "extensions/grit/extensions_browser_resources.h"
+#include "mojo/common/common_type_converters.h"
 #include "services/shell/public/cpp/connector.h"
 #include "skia/public/type_converters.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/display/screen.h"
 
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/ui/app_list/arc/arc_app_icon_loader.h"
+#endif
+
 class ChromeShelfItemDelegate : public mash::shelf::mojom::ShelfItemDelegate {
  public:
-  ChromeShelfItemDelegate() : item_delegate_binding_(this) {}
+  explicit ChromeShelfItemDelegate(const std::string& app_id)
+      : app_id_(app_id), item_delegate_binding_(this) {}
   ~ChromeShelfItemDelegate() override {}
 
   mash::shelf::mojom::ShelfItemDelegateAssociatedPtrInfo
@@ -28,6 +39,9 @@
 
  private:
   // mash::shelf::mojom::ShelfItemDelegate:
+  void LaunchItem() override {
+    ChromeMashShelfController::instance()->LaunchItem(app_id_);
+  }
   void ExecuteCommand(uint32_t command_id, int32_t event_flags) override {
     NOTIMPLEMENTED();
   }
@@ -35,6 +49,7 @@
   void ItemUnpinned() override { NOTIMPLEMENTED(); }
   void ItemReordered(uint32_t order) override { NOTIMPLEMENTED(); }
 
+  std::string app_id_;
   mojo::AssociatedBinding<mash::shelf::mojom::ShelfItemDelegate>
       item_delegate_binding_;
 
@@ -54,8 +69,13 @@
   return instance_;
 }
 
+void ChromeMashShelfController::LaunchItem(const std::string& app_id) {
+  helper_.LaunchApp(app_id, ash::LAUNCH_FROM_UNKNOWN, ui::EF_NONE);
+}
+
 ChromeMashShelfController::ChromeMashShelfController()
-    : observer_binding_(this) {}
+    : helper_(ProfileManager::GetActiveUserProfile()),
+      observer_binding_(this) {}
 
 void ChromeMashShelfController::Init() {
   shell::Connector* connector =
@@ -71,20 +91,23 @@
       static_cast<mash::shelf::mojom::AutoHideBehavior>(
           ash::GetShelfAutoHideBehaviorPref(profile->GetPrefs(), display_id)));
 
-  // Create a test shortcut item to a fake application.
-  mash::shelf::mojom::ShelfItemPtr item(mash::shelf::mojom::ShelfItem::New());
-  std::string item_id("mojo:fake_app");
-  item->app_id = item_id;
-  item->app_title = "Fake Mojo App (test pinned shelf item)";
-  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
-  const gfx::Image& image = rb.GetImageNamed(IDR_PRODUCT_LOGO_32);
-  item->image = skia::mojom::Bitmap::From(*image.ToSkBitmap());
-  std::unique_ptr<ChromeShelfItemDelegate> delegate(
-      new ChromeShelfItemDelegate());
-  shelf_controller_->PinItem(std::move(item),
-                             delegate->CreateInterfacePtrInfoAndBind(
-                                 shelf_controller_.associated_group()));
-  app_id_to_item_delegate_.insert(std::make_pair(item_id, std::move(delegate)));
+  // TODO(skuhne): The AppIconLoaderImpl has the same problem. Each loaded
+  // image is associated with a profile (its loader requires the profile).
+  // Since icon size changes are possible, the icon could be requested to be
+  // reloaded. However - having it not multi profile aware would cause problems
+  // if the icon cache gets deleted upon user switch.
+  std::unique_ptr<AppIconLoader> extension_app_icon_loader(
+      new extensions::ExtensionAppIconLoader(
+          profile, extension_misc::EXTENSION_ICON_SMALL, this));
+  app_icon_loaders_.push_back(std::move(extension_app_icon_loader));
+
+#if defined(OS_CHROMEOS)
+  std::unique_ptr<AppIconLoader> arc_app_icon_loader(new ArcAppIconLoader(
+      profile, extension_misc::EXTENSION_ICON_SMALL, this));
+  app_icon_loaders_.push_back(std::move(arc_app_icon_loader));
+#endif
+
+  PinAppsFromPrefs();
 
   // Start observing the shelf now that it has been initialized.
   mash::shelf::mojom::ShelfObserverAssociatedPtrInfo ptr_info;
@@ -92,6 +115,46 @@
   shelf_controller_->AddObserver(std::move(ptr_info));
 }
 
+void ChromeMashShelfController::PinAppsFromPrefs() {
+  Profile* profile = ProfileManager::GetActiveUserProfile();
+  std::vector<std::string> pinned_apps =
+      ash::GetPinnedAppsFromPrefs(profile->GetPrefs(), &helper_);
+
+  for (const auto& app : pinned_apps) {
+    if (app == ash::kPinnedAppsPlaceholder)
+      continue;
+
+    mash::shelf::mojom::ShelfItemPtr item(mash::shelf::mojom::ShelfItem::New());
+    item->app_id = app;
+    item->app_title = mojo::String::From(helper_.GetAppTitle(profile, app));
+    ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+    const gfx::Image& image = rb.GetImageNamed(IDR_APP_DEFAULT_ICON);
+    item->image = skia::mojom::Bitmap::From(*image.ToSkBitmap());
+    std::unique_ptr<ChromeShelfItemDelegate> delegate(
+        new ChromeShelfItemDelegate(app));
+    shelf_controller_->PinItem(std::move(item),
+                               delegate->CreateInterfacePtrInfoAndBind(
+                                   shelf_controller_.associated_group()));
+    app_id_to_item_delegate_.insert(std::make_pair(app, std::move(delegate)));
+
+    AppIconLoader* app_icon_loader = GetAppIconLoaderForApp(app);
+    if (app_icon_loader) {
+      app_icon_loader->FetchImage(app);
+      app_icon_loader->UpdateImage(app);
+    }
+  }
+}
+
+AppIconLoader* ChromeMashShelfController::GetAppIconLoaderForApp(
+    const std::string& app_id) {
+  for (const auto& app_icon_loader : app_icon_loaders_) {
+    if (app_icon_loader->CanLoadImageForApp(app_id))
+      return app_icon_loader.get();
+  }
+
+  return nullptr;
+}
+
 void ChromeMashShelfController::OnAlignmentChanged(
     mash::shelf::mojom::Alignment alignment) {
   ash::SetShelfAlignmentPref(
@@ -107,3 +170,9 @@
       display::Screen::GetScreen()->GetPrimaryDisplay().id(),
       static_cast<ash::ShelfAutoHideBehavior>(auto_hide));
 }
+
+void ChromeMashShelfController::OnAppImageUpdated(const std::string& app_id,
+                                                  const gfx::ImageSkia& image) {
+  shelf_controller_->SetItemImage(app_id,
+                                  skia::mojom::Bitmap::From(*image.bitmap()));
+}
diff --git a/chrome/browser/ui/ash/launcher/chrome_mash_shelf_controller.h b/chrome/browser/ui/ash/launcher/chrome_mash_shelf_controller.h
index b458fa3..532110e5 100644
--- a/chrome/browser/ui/ash/launcher/chrome_mash_shelf_controller.h
+++ b/chrome/browser/ui/ash/launcher/chrome_mash_shelf_controller.h
@@ -8,14 +8,18 @@
 #include <map>
 #include <memory>
 #include <string>
+#include <vector>
 
+#include "chrome/browser/ui/app_icon_loader.h"
+#include "chrome/browser/ui/ash/launcher/launcher_controller_helper.h"
 #include "mash/shelf/public/interfaces/shelf.mojom.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
 
 class ChromeShelfItemDelegate;
 
 // ChromeMashShelfController manages chrome's interaction with the mash shelf.
-class ChromeMashShelfController : public mash::shelf::mojom::ShelfObserver {
+class ChromeMashShelfController : public mash::shelf::mojom::ShelfObserver,
+                                  public AppIconLoaderDelegate {
  public:
   ~ChromeMashShelfController() override;
 
@@ -25,23 +29,37 @@
   // Returns the single ChromeMashShelfController instance.
   static ChromeMashShelfController* instance() { return instance_; }
 
+  void LaunchItem(const std::string& app_id);
+
  private:
   ChromeMashShelfController();
 
   void Init();
 
+  void PinAppsFromPrefs();
+
+  AppIconLoader* GetAppIconLoaderForApp(const std::string& app_id);
+
   // mash::shelf::mojom::ShelfObserver:
   void OnAlignmentChanged(mash::shelf::mojom::Alignment alignment) override;
   void OnAutoHideBehaviorChanged(
       mash::shelf::mojom::AutoHideBehavior auto_hide) override;
 
+  // AppIconLoaderDelegate:
+  void OnAppImageUpdated(const std::string& app_id,
+                         const gfx::ImageSkia& image) override;
+
   static ChromeMashShelfController* instance_;
 
+  LauncherControllerHelper helper_;
   mash::shelf::mojom::ShelfControllerPtr shelf_controller_;
   mojo::AssociatedBinding<mash::shelf::mojom::ShelfObserver> observer_binding_;
   std::map<std::string, std::unique_ptr<ChromeShelfItemDelegate>>
       app_id_to_item_delegate_;
 
+  // Used to load the images for app items.
+  std::vector<std::unique_ptr<AppIconLoader>> app_icon_loaders_;
+
   DISALLOW_COPY_AND_ASSIGN(ChromeMashShelfController);
 };
 
diff --git a/chrome/browser/ui/ash/launcher/launcher_app_tab_helper.cc b/chrome/browser/ui/ash/launcher/launcher_app_tab_helper.cc
deleted file mode 100644
index d6c6a5c..0000000
--- a/chrome/browser/ui/ash/launcher/launcher_app_tab_helper.cc
+++ /dev/null
@@ -1,120 +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/ash/launcher/launcher_app_tab_helper.h"
-
-#include <vector>
-
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_util.h"
-#include "chrome/browser/extensions/launch_util.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/ui/browser_finder.h"
-#include "chrome/browser/web_applications/web_app.h"
-#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
-#include "content/public/browser/navigation_entry.h"
-#include "content/public/browser/web_contents.h"
-#include "extensions/browser/extension_registry.h"
-#include "extensions/browser/extension_system.h"
-#include "extensions/common/extension.h"
-#include "extensions/common/extension_set.h"
-
-#if defined(OS_CHROMEOS)
-#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
-#endif
-
-namespace {
-
-const extensions::Extension* GetExtensionForTab(Profile* profile,
-                                                content::WebContents* tab) {
-  ExtensionService* extension_service =
-      extensions::ExtensionSystem::Get(profile)->extension_service();
-  if (!extension_service || !extension_service->extensions_enabled())
-    return NULL;
-
-  // Note: It is possible to come here after a tab got removed form the browser
-  // before it gets destroyed, in which case there is no browser.
-  Browser* browser = chrome::FindBrowserWithWebContents(tab);
-
-  extensions::ExtensionRegistry* registry =
-      extensions::ExtensionRegistry::Get(profile);
-
-  // Use the Browser's app name to determine the extension for app windows and
-  // use the tab's url for app tabs.
-  if (browser && browser->is_app()) {
-    return registry->GetExtensionById(
-        web_app::GetExtensionIdFromApplicationName(browser->app_name()),
-        extensions::ExtensionRegistry::EVERYTHING);
-  }
-
-  const GURL url = tab->GetURL();
-  const extensions::ExtensionSet& extensions = registry->enabled_extensions();
-  const extensions::Extension* extension = extensions.GetAppByURL(url);
-  if (extension && !extensions::LaunchesInWindow(profile, extension))
-    return extension;
-
-  // Bookmark app windows should match their launch url extension despite
-  // their web extents.
-  if (extensions::util::IsNewBookmarkAppsEnabled()) {
-    for (extensions::ExtensionSet::const_iterator it = extensions.begin();
-         it != extensions.end(); ++it) {
-      if (it->get()->from_bookmark() &&
-          extensions::AppLaunchInfo::GetLaunchWebURL(it->get()) == url &&
-          !extensions::LaunchesInWindow(profile, it->get())) {
-        return it->get();
-      }
-    }
-  }
-  return NULL;
-}
-
-const extensions::Extension* GetExtensionByID(Profile* profile,
-                                              const std::string& id) {
-  return extensions::ExtensionRegistry::Get(profile)->GetExtensionById(
-      id, extensions::ExtensionRegistry::EVERYTHING);
-}
-
-}  // namespace
-
-LauncherAppTabHelper::LauncherAppTabHelper(Profile* profile)
-    : profile_(profile) {
-}
-
-LauncherAppTabHelper::~LauncherAppTabHelper() {
-}
-
-std::string LauncherAppTabHelper::GetAppID(content::WebContents* tab) {
-  ProfileManager* profile_manager = g_browser_process->profile_manager();
-  if (profile_manager) {
-    const std::vector<Profile*> profile_list =
-        profile_manager->GetLoadedProfiles();
-    if (profile_list.size() > 0) {
-      for (std::vector<Profile*>::const_iterator it = profile_list.begin();
-           it != profile_list.end();
-           ++it) {
-        const extensions::Extension* extension = GetExtensionForTab(*it, tab);
-        if (extension)
-          return extension->id();
-      }
-      return std::string();
-    }
-  }
-  // If there is no profile manager we only use the known profile.
-  const extensions::Extension* extension = GetExtensionForTab(profile_, tab);
-  return extension ? extension->id() : std::string();
-}
-
-bool LauncherAppTabHelper::IsValidIDForCurrentUser(const std::string& id) {
-#if defined(OS_CHROMEOS)
-  if (ArcAppListPrefs::Get(profile_)->IsRegistered(id))
-    return true;
-#endif
-  return GetExtensionByID(profile_, id) != NULL;
-}
-
-void LauncherAppTabHelper::SetCurrentUser(Profile* profile) {
-  profile_ = profile;
-}
diff --git a/chrome/browser/ui/ash/launcher/launcher_app_tab_helper.h b/chrome/browser/ui/ash/launcher/launcher_app_tab_helper.h
deleted file mode 100644
index 8b53a13..0000000
--- a/chrome/browser/ui/ash/launcher/launcher_app_tab_helper.h
+++ /dev/null
@@ -1,33 +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_ASH_LAUNCHER_LAUNCHER_APP_TAB_HELPER_H_
-#define CHROME_BROWSER_UI_ASH_LAUNCHER_LAUNCHER_APP_TAB_HELPER_H_
-
-#include <string>
-
-#include "base/macros.h"
-#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
-
-class Profile;
-
-// Default implementation of LauncherUpdater::AppTabHelper that interacts
-// with ExtensionService.
-class LauncherAppTabHelper : public ChromeLauncherController::AppTabHelper {
- public:
-  explicit LauncherAppTabHelper(Profile* profile);
-  ~LauncherAppTabHelper() override;
-
-  // AppTabHelper:
-  std::string GetAppID(content::WebContents* tab) override;
-  bool IsValidIDForCurrentUser(const std::string& id) override;
-  void SetCurrentUser(Profile* profile) override;
-
- private:
-  Profile* profile_;
-
-  DISALLOW_COPY_AND_ASSIGN(LauncherAppTabHelper);
-};
-
-#endif  // CHROME_BROWSER_UI_ASH_LAUNCHER_LAUNCHER_APP_TAB_HELPER_H_
diff --git a/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc b/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc
new file mode 100644
index 0000000..b3156d1
--- /dev/null
+++ b/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc
@@ -0,0 +1,214 @@
+// 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/ash/launcher/launcher_controller_helper.h"
+
+#include <vector>
+
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_util.h"
+#include "chrome/browser/extensions/launch_util.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/extensions/app_launch_params.h"
+#include "chrome/browser/ui/extensions/application_launch.h"
+#include "chrome/browser/ui/extensions/extension_enable_flow.h"
+#include "chrome/browser/web_applications/web_app.h"
+#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
+#include "content/public/browser/navigation_entry.h"
+#include "content/public/browser/web_contents.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extension_system.h"
+#include "extensions/common/extension.h"
+#include "extensions/common/extension_set.h"
+#include "net/base/url_util.h"
+#include "ui/events/event_constants.h"
+
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
+#include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
+#endif
+
+namespace {
+
+const extensions::Extension* GetExtensionForTab(Profile* profile,
+                                                content::WebContents* tab) {
+  ExtensionService* extension_service =
+      extensions::ExtensionSystem::Get(profile)->extension_service();
+  if (!extension_service || !extension_service->extensions_enabled())
+    return nullptr;
+
+  // Note: It is possible to come here after a tab got removed form the browser
+  // before it gets destroyed, in which case there is no browser.
+  Browser* browser = chrome::FindBrowserWithWebContents(tab);
+
+  extensions::ExtensionRegistry* registry =
+      extensions::ExtensionRegistry::Get(profile);
+
+  // Use the Browser's app name to determine the extension for app windows and
+  // use the tab's url for app tabs.
+  if (browser && browser->is_app()) {
+    return registry->GetExtensionById(
+        web_app::GetExtensionIdFromApplicationName(browser->app_name()),
+        extensions::ExtensionRegistry::EVERYTHING);
+  }
+
+  const GURL url = tab->GetURL();
+  const extensions::ExtensionSet& extensions = registry->enabled_extensions();
+  const extensions::Extension* extension = extensions.GetAppByURL(url);
+  if (extension && !extensions::LaunchesInWindow(profile, extension))
+    return extension;
+
+  // Bookmark app windows should match their launch url extension despite
+  // their web extents.
+  if (extensions::util::IsNewBookmarkAppsEnabled()) {
+    for (const auto& i : extensions) {
+      if (i.get()->from_bookmark() &&
+          extensions::AppLaunchInfo::GetLaunchWebURL(i.get()) == url &&
+          !extensions::LaunchesInWindow(profile, i.get())) {
+        return i.get();
+      }
+    }
+  }
+  return nullptr;
+}
+
+const extensions::Extension* GetExtensionByID(Profile* profile,
+                                              const std::string& id) {
+  return extensions::ExtensionRegistry::Get(profile)->GetExtensionById(
+      id, extensions::ExtensionRegistry::EVERYTHING);
+}
+
+std::string GetSourceFromAppListSource(ash::LaunchSource source) {
+  switch (source) {
+    case ash::LAUNCH_FROM_APP_LIST:
+      return std::string(extension_urls::kLaunchSourceAppList);
+    case ash::LAUNCH_FROM_APP_LIST_SEARCH:
+      return std::string(extension_urls::kLaunchSourceAppListSearch);
+    default:
+      return std::string();
+  }
+}
+
+}  // namespace
+
+LauncherControllerHelper::LauncherControllerHelper(Profile* profile)
+    : profile_(profile) {}
+
+LauncherControllerHelper::~LauncherControllerHelper() {}
+
+// static
+base::string16 LauncherControllerHelper::GetAppTitle(
+    Profile* profile,
+    const std::string& app_id) {
+  base::string16 title;
+  if (app_id.empty())
+    return title;
+
+#if defined(OS_CHROMEOS)
+  // Get title if the app is an Arc app.
+  ArcAppListPrefs* arc_prefs = ArcAppListPrefs::Get(profile);
+  DCHECK(arc_prefs);
+  if (arc_prefs->IsRegistered(app_id)) {
+    std::unique_ptr<ArcAppListPrefs::AppInfo> app_info =
+        arc_prefs->GetApp(app_id);
+    DCHECK(app_info.get());
+    if (app_info)
+      title = base::UTF8ToUTF16(app_info->name);
+    return title;
+  }
+#endif  // defined(OS_CHROMEOS)
+
+  const extensions::Extension* extension = GetExtensionByID(profile, app_id);
+  if (extension)
+    title = base::UTF8ToUTF16(extension->name());
+  return title;
+}
+
+std::string LauncherControllerHelper::GetAppID(content::WebContents* tab) {
+  ProfileManager* profile_manager = g_browser_process->profile_manager();
+  if (profile_manager) {
+    const std::vector<Profile*> profile_list =
+        profile_manager->GetLoadedProfiles();
+    if (!profile_list.empty()) {
+      for (const auto& i : profile_list) {
+        const extensions::Extension* extension = GetExtensionForTab(i, tab);
+        if (extension)
+          return extension->id();
+      }
+      return std::string();
+    }
+  }
+  // If there is no profile manager we only use the known profile.
+  const extensions::Extension* extension = GetExtensionForTab(profile_, tab);
+  return extension ? extension->id() : std::string();
+}
+
+bool LauncherControllerHelper::IsValidIDForCurrentUser(const std::string& id) {
+#if defined(OS_CHROMEOS)
+  if (ArcAppListPrefs::Get(profile_)->IsRegistered(id))
+    return true;
+#endif
+  return GetExtensionByID(profile_, id) != nullptr;
+}
+
+void LauncherControllerHelper::SetCurrentUser(Profile* profile) {
+  profile_ = profile;
+}
+
+void LauncherControllerHelper::LaunchApp(const std::string& app_id,
+                                         ash::LaunchSource source,
+                                         int event_flags) {
+#if defined(OS_CHROMEOS)
+  if (ArcAppListPrefs::Get(profile_)->IsRegistered(app_id)) {
+    arc::LaunchApp(profile_, app_id);
+    return;
+  }
+#endif
+
+  // |extension| could be null when it is being unloaded for updating.
+  const extensions::Extension* extension = GetExtensionByID(profile_, app_id);
+  if (!extension)
+    return;
+
+  if (!extensions::util::IsAppLaunchableWithoutEnabling(app_id, profile_)) {
+    // Do nothing if there is already a running enable flow.
+    if (extension_enable_flow_)
+      return;
+
+    extension_enable_flow_.reset(
+        new ExtensionEnableFlow(profile_, app_id, this));
+    extension_enable_flow_->StartForNativeWindow(nullptr);
+    return;
+  }
+
+  // The app will be created for the currently active profile.
+  AppLaunchParams params = CreateAppLaunchParamsWithEventFlags(
+      profile_, extension, event_flags, extensions::SOURCE_APP_LAUNCHER);
+  if (source != ash::LAUNCH_FROM_UNKNOWN &&
+      app_id == extensions::kWebStoreAppId) {
+    // Get the corresponding source string.
+    std::string source_value = GetSourceFromAppListSource(source);
+
+    // Set an override URL to include the source.
+    GURL extension_url = extensions::AppLaunchInfo::GetFullLaunchURL(extension);
+    params.override_url = net::AppendQueryParameter(
+        extension_url, extension_urls::kWebstoreSourceField, source_value);
+  }
+
+  OpenApplication(params);
+}
+
+void LauncherControllerHelper::ExtensionEnableFlowFinished() {
+  LaunchApp(extension_enable_flow_->extension_id(), ash::LAUNCH_FROM_UNKNOWN,
+            ui::EF_NONE);
+  extension_enable_flow_.reset();
+}
+
+void LauncherControllerHelper::ExtensionEnableFlowAborted(bool user_initiated) {
+  extension_enable_flow_.reset();
+}
diff --git a/chrome/browser/ui/ash/launcher/launcher_controller_helper.h b/chrome/browser/ui/ash/launcher/launcher_controller_helper.h
new file mode 100644
index 0000000..864ff09
--- /dev/null
+++ b/chrome/browser/ui/ash/launcher/launcher_controller_helper.h
@@ -0,0 +1,61 @@
+// 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_ASH_LAUNCHER_LAUNCHER_CONTROLLER_HELPER_H_
+#define CHROME_BROWSER_UI_ASH_LAUNCHER_LAUNCHER_CONTROLLER_HELPER_H_
+
+#include <memory>
+#include <string>
+
+#include "base/macros.h"
+#include "base/strings/string16.h"
+#include "chrome/browser/ui/ash/launcher/chrome_launcher_types.h"
+#include "chrome/browser/ui/extensions/extension_enable_flow_delegate.h"
+
+class ExtensionEnableFlow;
+class Profile;
+
+namespace content {
+class WebContents;
+}
+
+// Assists the LauncherController with ExtensionService interaction.
+class LauncherControllerHelper : public ExtensionEnableFlowDelegate {
+ public:
+  explicit LauncherControllerHelper(Profile* profile);
+  ~LauncherControllerHelper() override;
+
+  // Helper function to return the title associated with |app_id|.
+  // Returns an empty title if no matching extension can be found.
+  static base::string16 GetAppTitle(Profile* profile,
+                                    const std::string& app_id);
+
+  // Returns the app id of the specified tab, or an empty string if there is
+  // no app. All known profiles will be queried for this.
+  virtual std::string GetAppID(content::WebContents* tab);
+
+  // Returns true if |id| is valid for the currently active profile.
+  // Used during restore to ignore no longer valid extensions.
+  // Note that already running applications are ignored by the restore process.
+  virtual bool IsValidIDForCurrentUser(const std::string& id);
+
+  // Sets the currently active profile for the usage of |GetAppID|.
+  virtual void SetCurrentUser(Profile* profile);
+
+  void LaunchApp(const std::string& app_id,
+                 ash::LaunchSource source,
+                 int event_flags);
+
+ private:
+  // ExtensionEnableFlowDelegate:
+  void ExtensionEnableFlowFinished() override;
+  void ExtensionEnableFlowAborted(bool user_initiated) override;
+
+  Profile* profile_;
+  std::unique_ptr<ExtensionEnableFlow> extension_enable_flow_;
+
+  DISALLOW_COPY_AND_ASSIGN(LauncherControllerHelper);
+};
+
+#endif  // CHROME_BROWSER_UI_ASH_LAUNCHER_LAUNCHER_CONTROLLER_HELPER_H_
diff --git a/chrome/browser/ui/ash/launcher/launcher_item_controller.cc b/chrome/browser/ui/ash/launcher/launcher_item_controller.cc
index c6c35dd..69fc8a4 100644
--- a/chrome/browser/ui/ash/launcher/launcher_item_controller.cc
+++ b/chrome/browser/ui/ash/launcher/launcher_item_controller.cc
@@ -4,15 +4,7 @@
 
 #include "chrome/browser/ui/ash/launcher/launcher_item_controller.h"
 
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
-#include "extensions/browser/extension_registry.h"
-#include "extensions/common/extension.h"
-
-#if defined(OS_CHROMEOS)
-#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
-#endif  // defined(OS_CHROMEOS)
 
 LauncherItemController::LauncherItemController(
     Type type,
@@ -23,44 +15,9 @@
       shelf_id_(0),
       launcher_controller_(launcher_controller),
       locked_(0),
-      image_set_by_controller_(false) {
-}
+      image_set_by_controller_(false) {}
 
-LauncherItemController::~LauncherItemController() {
-}
-
-const std::string& LauncherItemController::app_id() const {
-  return app_id_;
-}
-
-base::string16 LauncherItemController::GetAppTitle() const {
-  base::string16 title;
-  if (app_id_.empty())
-    return title;
-
-#if defined(OS_CHROMEOS)
-  // Get title if the app is an Arc app
-  ArcAppListPrefs* arc_prefs =
-      ArcAppListPrefs::Get(launcher_controller_->profile());
-  DCHECK(arc_prefs);
-  if (arc_prefs->IsRegistered(app_id_)) {
-    std::unique_ptr<ArcAppListPrefs::AppInfo> app_info =
-        arc_prefs->GetApp(app_id_);
-    DCHECK(app_info.get());
-    if (app_info)
-      title = base::UTF8ToUTF16(app_info->name);
-    return title;
-  }
-#endif  // defined(OS_CHROMEOS)
-
-  const extensions::Extension* extension =
-      extensions::ExtensionRegistry::Get(
-          launcher_controller_->profile())->GetExtensionById(
-              app_id_, extensions::ExtensionRegistry::EVERYTHING);
-  if (extension)
-    title = base::UTF8ToUTF16(extension->name());
-  return title;
-}
+LauncherItemController::~LauncherItemController() {}
 
 ash::ShelfItemType LauncherItemController::GetShelfItemType() const {
   switch (type_) {
diff --git a/chrome/browser/ui/ash/launcher/launcher_item_controller.h b/chrome/browser/ui/ash/launcher/launcher_item_controller.h
index d485c4be..8501a84 100644
--- a/chrome/browser/ui/ash/launcher/launcher_item_controller.h
+++ b/chrome/browser/ui/ash/launcher/launcher_item_controller.h
@@ -12,12 +12,12 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/memory/scoped_vector.h"
-#include "base/strings/string16.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_types.h"
 #include "ui/events/event.h"
 
 class ChromeLauncherController;
 class ChromeLauncherAppMenuItem;
+class Profile;
 
 typedef ScopedVector<ChromeLauncherAppMenuItem> ChromeLauncherAppMenuItems;
 
@@ -48,7 +48,7 @@
   Type type() const { return type_; }
   ash::ShelfID shelf_id() const { return shelf_id_; }
   void set_shelf_id(ash::ShelfID id) { shelf_id_ = id; }
-  virtual const std::string& app_id() const;
+  const std::string& app_id() const { return app_id_; }
   ChromeLauncherController* launcher_controller() const {
     return launcher_controller_;
   }
@@ -86,11 +86,6 @@
   // Helper function to get the ash::ShelfItemType for the item type.
   ash::ShelfItemType GetShelfItemType() const;
 
- protected:
-  // Helper function to return the title associated with |app_id_|.
-  // Returns an empty title if no matching extension can be found.
-  base::string16 GetAppTitle() const;
-
  private:
   const Type type_;
   // App id will be empty if there is no app associated with the window.
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 9512433..8930fb8 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -379,6 +379,7 @@
       cancel_download_confirmation_state_(NOT_PROMPTED),
       override_bounds_(params.initial_bounds),
       initial_show_state_(params.initial_show_state),
+      initial_workspace_(params.initial_workspace),
       is_session_restore_(params.is_session_restore),
       content_setting_bubble_model_delegate_(
           new BrowserContentSettingBubbleModelDelegate(this)),
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h
index 5c69860..6f84e1d 100644
--- a/chrome/browser/ui/browser.h
+++ b/chrome/browser/ui/browser.h
@@ -185,6 +185,9 @@
     // The bounds of the window to open.
     gfx::Rect initial_bounds;
 
+    // The workspace the window should open in, if the platform supports it.
+    std::string initial_workspace;
+
     ui::WindowShowState initial_show_state;
 
     bool is_session_restore;
@@ -239,6 +242,7 @@
   bool is_trusted_source() const { return is_trusted_source_; }
   Profile* profile() const { return profile_; }
   gfx::Rect override_bounds() const { return override_bounds_; }
+  const std::string& initial_workspace() const { return initial_workspace_; }
 
   // |window()| will return NULL if called before |CreateBrowserWindow()|
   // is done.
@@ -949,6 +953,7 @@
   // shell shortcut's startup info.
   gfx::Rect override_bounds_;
   ui::WindowShowState initial_show_state_;
+  const std::string initial_workspace_;
 
   // Tracks when this browser is being created by session restore.
   bool is_session_restore_;
diff --git a/chrome/browser/ui/browser_window.h b/chrome/browser/ui/browser_window.h
index 8ce02a6..4be71cec 100644
--- a/chrome/browser/ui/browser_window.h
+++ b/chrome/browser/ui/browser_window.h
@@ -379,6 +379,10 @@
       const base::Callback<void(ImeWarningBubblePermissionStatus status)>&
           callback) = 0;
 
+  // Returns the platform-specific ID of the workspace the browser window
+  // currently resides in.
+  virtual std::string GetWorkspace() const = 0;
+
  protected:
   friend class BrowserCloseManager;
   friend class BrowserView;
diff --git a/chrome/browser/ui/browser_window_state.cc b/chrome/browser/ui/browser_window_state.cc
index e40ef26..9c8179a6 100644
--- a/chrome/browser/ui/browser_window_state.cc
+++ b/chrome/browser/ui/browser_window_state.cc
@@ -136,6 +136,13 @@
     session_service->SetWindowBounds(browser->session_id(), bounds, show_state);
 }
 
+void SaveWindowWorkspace(const Browser* browser, const std::string& workspace) {
+  SessionService* session_service =
+      SessionServiceFactory::GetForProfileIfExisting(browser->profile());
+  if (session_service)
+    session_service->SetWindowWorkspace(browser->session_id(), workspace);
+}
+
 void GetSavedWindowBoundsAndShowState(const Browser* browser,
                                       gfx::Rect* bounds,
                                       ui::WindowShowState* show_state) {
diff --git a/chrome/browser/ui/browser_window_state.h b/chrome/browser/ui/browser_window_state.h
index e43a4654..cb224db 100644
--- a/chrome/browser/ui/browser_window_state.h
+++ b/chrome/browser/ui/browser_window_state.h
@@ -49,6 +49,8 @@
                          const gfx::Rect& bounds,
                          ui::WindowShowState show_state);
 
+void SaveWindowWorkspace(const Browser* browser, const std::string& workspace);
+
 // Return the |bounds| for the browser window to be used upon creation.
 // The |show_state| variable will receive the desired initial show state for
 // the window.
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.mm
index 34987513..7cdba41 100644
--- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.mm
+++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.mm
@@ -24,8 +24,10 @@
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/browser/bookmark_node_data.h"
 #import "components/bookmarks/managed/managed_bookmark_service.h"
+#include "grit/ui_resources.h"
 #include "ui/base/clipboard/clipboard_util_mac.h"
 #include "ui/base/cocoa/cocoa_base_utils.h"
+#include "ui/base/resource/resource_bundle.h"
 #include "ui/base/theme_provider.h"
 
 using bookmarks::BookmarkModel;
@@ -317,6 +319,13 @@
   NSRect scrollViewFrame = [scrollView_ frame];
   padding_ = NSWidth(windowFrame) - NSWidth(scrollViewFrame);
   verticalScrollArrowHeight_ = NSHeight([scrollUpArrowView_ frame]);
+
+  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
+  NSImage* image = rb.GetNativeImageNamed(IDR_MENU_OVERFLOW_DOWN).ToNSImage();
+  [[scrollUpArrowView_.subviews objectAtIndex:0] setImage:image];
+
+  image = rb.GetNativeImageNamed(IDR_MENU_OVERFLOW_UP).ToNSImage();
+  [[scrollDownArrowView_.subviews objectAtIndex:0] setImage:image];
 }
 
 // Overriden from NSWindowController to call childFolderWillShow: before showing
diff --git a/chrome/browser/ui/cocoa/browser_window_cocoa.h b/chrome/browser/ui/cocoa/browser_window_cocoa.h
index 71b2a5b..285735c 100644
--- a/chrome/browser/ui/cocoa/browser_window_cocoa.h
+++ b/chrome/browser/ui/cocoa/browser_window_cocoa.h
@@ -70,6 +70,7 @@
                           int reason) override;
   void ZoomChangedForActiveTab(bool can_show_bubble) override;
   gfx::Rect GetRestoredBounds() const override;
+  std::string GetWorkspace() const override;
   ui::WindowShowState GetRestoredState() const override;
   gfx::Rect GetBounds() const override;
   gfx::Size GetContentsSize() const override;
diff --git a/chrome/browser/ui/cocoa/browser_window_cocoa.mm b/chrome/browser/ui/cocoa/browser_window_cocoa.mm
index 2c0ea73..755661f 100644
--- a/chrome/browser/ui/cocoa/browser_window_cocoa.mm
+++ b/chrome/browser/ui/cocoa/browser_window_cocoa.mm
@@ -371,6 +371,10 @@
   return bounds;
 }
 
+std::string BrowserWindowCocoa::GetWorkspace() const {
+  return std::string();
+}
+
 ui::WindowShowState BrowserWindowCocoa::GetRestoredState() const {
   if (IsMaximized())
     return ui::SHOW_STATE_MAXIMIZED;
diff --git a/chrome/browser/ui/cocoa/extensions/extension_message_bubble_browsertest_mac.mm b/chrome/browser/ui/cocoa/extensions/extension_message_bubble_browsertest_mac.mm
index f599771..e7dd1a8 100644
--- a/chrome/browser/ui/cocoa/extensions/extension_message_bubble_browsertest_mac.mm
+++ b/chrome/browser/ui/cocoa/extensions/extension_message_bubble_browsertest_mac.mm
@@ -152,3 +152,8 @@
                        TestUninstallDangerousExtension) {
   TestUninstallDangerousExtension();
 }
+
+IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
+                       TestDevModeBubbleIsntShownTwice) {
+  TestDevModeBubbleIsntShownTwice();
+}
diff --git a/chrome/browser/ui/cocoa/extensions/extension_view_mac.h b/chrome/browser/ui/cocoa/extensions/extension_view_mac.h
index ca0f212..67889503 100644
--- a/chrome/browser/ui/cocoa/extensions/extension_view_mac.h
+++ b/chrome/browser/ui/cocoa/extensions/extension_view_mac.h
@@ -9,12 +9,10 @@
 
 #include "base/macros.h"
 #include "chrome/browser/extensions/extension_view.h"
-#include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/native_widget_types.h"
 
 class Browser;
-class SkBitmap;
 
 namespace content {
 class RenderViewHost;
diff --git a/chrome/browser/ui/cocoa/find_bar/find_bar_cocoa_controller.mm b/chrome/browser/ui/cocoa/find_bar/find_bar_cocoa_controller.mm
index 336fbdfd..a7e6acd 100644
--- a/chrome/browser/ui/cocoa/find_bar/find_bar_cocoa_controller.mm
+++ b/chrome/browser/ui/cocoa/find_bar/find_bar_cocoa_controller.mm
@@ -29,6 +29,10 @@
 #import "ui/base/cocoa/focus_tracker.h"
 #import "ui/base/cocoa/nsview_additions.h"
 #include "ui/base/l10n/l10n_util_mac.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/gfx/image/image_skia_util_mac.h"
+#include "ui/gfx/paint_vector_icon.h"
+#include "ui/gfx/vector_icons_public.h"
 #include "ui/resources/grit/ui_resources.h"
 
 using content::NativeWebKeyboardEvent;
@@ -130,6 +134,16 @@
   [previousButton_ setTitle:l10n_util::GetNSString(IDS_ACCNAME_PREVIOUS)];
   [nextButton_ setTitle:l10n_util::GetNSString(IDS_ACCNAME_NEXT)];
 
+  NSImage* image = NSImageFromImageSkia(
+      gfx::CreateVectorIcon(gfx::VectorIconId::FIND_NEXT, SK_ColorBLACK));
+  [image setTemplate:YES];
+  [nextButton_ setImage:image];
+
+  image = NSImageFromImageSkia(
+      gfx::CreateVectorIcon(gfx::VectorIconId::FIND_PREV, SK_ColorBLACK));
+  [image setTemplate:YES];
+  [previousButton_ setImage:image];
+
   [findBarView_ setFrame:[self hiddenFindBarFrame]];
   defaultWidth_ = NSWidth([findBarView_ frame]);
   [[self view] setHidden:YES];
diff --git a/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_editor.mm b/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_editor.mm
index 8a7128f..f76f2a3 100644
--- a/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_editor.mm
+++ b/chrome/browser/ui/cocoa/location_bar/autocomplete_text_field_editor.mm
@@ -84,10 +84,9 @@
   }
 
   bool inDarkMode = [[self window] inIncognitoModeWithSystemTheme];
-  // Draw a light insertion point for MD Incognito.
+  // Draw a white insertion point for MD Incognito.
   NSColor* insertionPointColor =
-      inDarkMode ? [NSColor colorWithCalibratedWhite:1 alpha:0.75]
-                 : [NSColor blackColor];
+      inDarkMode ? [NSColor whiteColor] : [NSColor blackColor];
   [self setInsertionPointColor:insertionPointColor];
 
   NSColor* textSelectionColor = [NSColor selectedTextBackgroundColor];
diff --git a/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm b/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm
index ec31a5b..9783982 100644
--- a/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm
+++ b/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm
@@ -546,6 +546,9 @@
     const base::string16& display_text,
     NSMutableAttributedString* attributedString) {
   NSUInteger as_length = [attributedString length];
+  if (as_length == 0) {
+    return;
+  }
   NSRange as_entire_string = NSMakeRange(0, as_length);
   bool in_dark_mode = [[field_ window] inIncognitoModeWithSystemTheme];
 
@@ -557,6 +560,15 @@
                            value:@"en_US_POSIX"
                            range:as_entire_string];
 
+  // Under Material Design, force the text to be a single color white editing.
+  if (ui::MaterialDesignController::IsModeMaterial() &&
+      [field_ currentEditor]) {
+    [attributedString addAttribute:NSForegroundColorAttributeName
+                             value:HostTextColor(in_dark_mode)
+                             range:as_entire_string];
+    return;
+  }
+
   url::Component scheme, host;
   AutocompleteInput::ParseForEmphasizeComponents(
       display_text, ChromeAutocompleteSchemeClassifier(profile_), &scheme,
diff --git a/chrome/browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc b/chrome/browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc
index 5a97bf6..5eaaf72 100644
--- a/chrome/browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc
+++ b/chrome/browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc
@@ -17,6 +17,7 @@
 #include "content/public/browser/render_widget_host_view.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/test_utils.h"
+#include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkColor.h"
 
 namespace {
diff --git a/chrome/browser/ui/extensions/extension_message_bubble_bridge.cc b/chrome/browser/ui/extensions/extension_message_bubble_bridge.cc
index 9efce4b..0611f32 100644
--- a/chrome/browser/ui/extensions/extension_message_bubble_bridge.cc
+++ b/chrome/browser/ui/extensions/extension_message_bubble_bridge.cc
@@ -54,7 +54,9 @@
              : std::string();
 }
 
-void ExtensionMessageBubbleBridge::OnBubbleShown() {}
+void ExtensionMessageBubbleBridge::OnBubbleShown() {
+  controller_->OnShown();
+}
 
 void ExtensionMessageBubbleBridge::OnBubbleClosed(CloseAction action) {
   switch (action) {
diff --git a/chrome/browser/ui/extensions/extension_message_bubble_browsertest.cc b/chrome/browser/ui/extensions/extension_message_bubble_browsertest.cc
index f91011f2..00ce49a 100644
--- a/chrome/browser/ui/extensions/extension_message_bubble_browsertest.cc
+++ b/chrome/browser/ui/extensions/extension_message_bubble_browsertest.cc
@@ -122,3 +122,24 @@
   CheckBubble(browser(), ANCHOR_BROWSER_ACTION);
   CloseBubble(browser());
 }
+
+void ExtensionMessageBubbleBrowserTest::TestDevModeBubbleIsntShownTwice() {
+  scoped_refptr<const extensions::Extension> action_extension =
+      extensions::extension_action_test_util::CreateActionExtension(
+          "action_extension",
+          extensions::extension_action_test_util::BROWSER_ACTION,
+          extensions::Manifest::UNPACKED);
+  extension_service()->AddExtension(action_extension.get());
+
+  Browser* second_browser = new Browser(Browser::CreateParams(profile()));
+  base::RunLoop().RunUntilIdle();
+
+  CheckBubble(second_browser, ANCHOR_BROWSER_ACTION);
+  CloseBubble(second_browser);
+  base::RunLoop().RunUntilIdle();
+
+  // The bubble was already shown, so it shouldn't be shown again.
+  Browser* third_browser = new Browser(Browser::CreateParams(profile()));
+  base::RunLoop().RunUntilIdle();
+  CheckBubbleIsNotPresent(third_browser);
+}
diff --git a/chrome/browser/ui/extensions/extension_message_bubble_browsertest.h b/chrome/browser/ui/extensions/extension_message_bubble_browsertest.h
index 5b54e588..98d2980 100644
--- a/chrome/browser/ui/extensions/extension_message_bubble_browsertest.h
+++ b/chrome/browser/ui/extensions/extension_message_bubble_browsertest.h
@@ -63,6 +63,11 @@
   void PreBubbleShowsOnStartup();
   void TestBubbleShowsOnStartup();
 
+  // Tests that the developer mode warning bubble is only shown once per
+  // profile.
+  // Regression test for crbug.com/607099.
+  void TestDevModeBubbleIsntShownTwice();
+
  private:
   std::unique_ptr<extensions::FeatureSwitch::ScopedOverride>
       dev_mode_bubble_override_;
diff --git a/chrome/browser/ui/extensions/icon_with_badge_image_source.cc b/chrome/browser/ui/extensions/icon_with_badge_image_source.cc
index ad48eae..a1ed4b8 100644
--- a/chrome/browser/ui/extensions/icon_with_badge_image_source.cc
+++ b/chrome/browser/ui/extensions/icon_with_badge_image_source.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/extensions/extension_action.h"
 #include "grit/theme_resources.h"
 #include "third_party/skia/include/core/SkPaint.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
 #include "third_party/skia/include/core/SkTypeface.h"
 #include "ui/base/material_design/material_design_controller.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -67,7 +68,7 @@
     text_paint->setAntiAlias(true);
     text_paint->setTextAlign(SkPaint::kLeft_Align);
 
-    skia::RefPtr<SkTypeface> typeface = skia::AdoptRef(
+    sk_sp<SkTypeface> typeface(
         SkTypeface::CreateFromName(kPreferredTypeface, SkTypeface::kBold));
     // Skia doesn't do any font fallback---if the user is missing the font then
     // typeface will be NULL. If we don't do manual fallback then we'll crash.
@@ -80,7 +81,7 @@
       // that don't have Arial.
       ResourceBundle& rb = ResourceBundle::GetSharedInstance();
       const gfx::Font& base_font = rb.GetFont(ResourceBundle::BaseFont);
-      typeface = skia::AdoptRef(SkTypeface::CreateFromName(
+      typeface = sk_sp<SkTypeface>(SkTypeface::CreateFromName(
           base_font.GetFontName().c_str(), SkTypeface::kNormal));
       DCHECK(typeface);
     }
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
index b8abfecd..8d64b35 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
@@ -96,7 +96,7 @@
 #include "ui/gfx/vector_icons_public.h"
 #include "ui/resources/grit/ui_resources.h"
 #include "ui/views/animation/button_ink_drop_delegate.h"
-#include "ui/views/animation/flood_fill_ink_drop_animation.h"
+#include "ui/views/animation/flood_fill_ink_drop_ripple.h"
 #include "ui/views/animation/ink_drop_hover.h"
 #include "ui/views/button_drag_utils.h"
 #include "ui/views/controls/button/label_button.h"
@@ -238,9 +238,8 @@
            event_utils::IsPossibleDispositionEvent(e);
   }
 
-  std::unique_ptr<views::InkDropAnimation> CreateInkDropAnimation()
-      const override {
-    return base::WrapUnique(new views::FloodFillInkDropAnimation(
+  std::unique_ptr<views::InkDropRipple> CreateInkDropRipple() const override {
+    return base::WrapUnique(new views::FloodFillInkDropRipple(
         CalculateInkDropBounds(size()), GetInkDropCenter(),
         GetInkDropBaseColor()));
   }
@@ -340,9 +339,8 @@
     set_ink_drop_delegate(&ink_drop_delegate_);
   }
 
-  std::unique_ptr<views::InkDropAnimation> CreateInkDropAnimation()
-      const override {
-    return base::WrapUnique(new views::FloodFillInkDropAnimation(
+  std::unique_ptr<views::InkDropRipple> CreateInkDropRipple() const override {
+    return base::WrapUnique(new views::FloodFillInkDropRipple(
         CalculateInkDropBounds(size()), GetInkDropCenter(),
         GetInkDropBaseColor()));
   }
diff --git a/chrome/browser/ui/views/download/download_item_view_md.cc b/chrome/browser/ui/views/download/download_item_view_md.cc
index f2c6bbf..980174f 100644
--- a/chrome/browser/ui/views/download/download_item_view_md.cc
+++ b/chrome/browser/ui/views/download/download_item_view_md.cc
@@ -58,7 +58,7 @@
 #include "ui/gfx/text_elider.h"
 #include "ui/gfx/text_utils.h"
 #include "ui/gfx/vector_icons_public.h"
-#include "ui/views/animation/flood_fill_ink_drop_animation.h"
+#include "ui/views/animation/flood_fill_ink_drop_ripple.h"
 #include "ui/views/animation/ink_drop_delegate.h"
 #include "ui/views/animation/ink_drop_hover.h"
 #include "ui/views/border.h"
@@ -473,9 +473,9 @@
   layer()->SetMasksToBounds(true);
 }
 
-std::unique_ptr<views::InkDropAnimation>
-DownloadItemViewMd::CreateInkDropAnimation() const {
-  return base::WrapUnique(new views::FloodFillInkDropAnimation(
+std::unique_ptr<views::InkDropRipple> DownloadItemViewMd::CreateInkDropRipple()
+    const {
+  return base::WrapUnique(new views::FloodFillInkDropRipple(
       GetLocalBounds(), ink_drop_delegate_.last_ink_drop_location(),
       color_utils::DeriveDefaultIconColor(GetTextColor())));
 }
diff --git a/chrome/browser/ui/views/download/download_item_view_md.h b/chrome/browser/ui/views/download/download_item_view_md.h
index 989525d..df29dbd 100644
--- a/chrome/browser/ui/views/download/download_item_view_md.h
+++ b/chrome/browser/ui/views/download/download_item_view_md.h
@@ -106,8 +106,7 @@
 
   // Overridden from view::InkDropHostView:
   void AddInkDropLayer(ui::Layer* ink_drop_layer) override;
-  std::unique_ptr<views::InkDropAnimation> CreateInkDropAnimation()
-      const override;
+  std::unique_ptr<views::InkDropRipple> CreateInkDropRipple() const override;
   std::unique_ptr<views::InkDropHover> CreateInkDropHover() const override;
 
   // Overridden from ui::EventHandler:
diff --git a/chrome/browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc b/chrome/browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc
index bc415fe3..0db2e9e 100644
--- a/chrome/browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc
+++ b/chrome/browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc
@@ -122,3 +122,8 @@
                        TestUninstallDangerousExtension) {
   TestUninstallDangerousExtension();
 }
+
+IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleViewBrowserTest,
+                       TestDevModeBubbleIsntShownTwice) {
+  TestDevModeBubbleIsntShownTwice();
+}
diff --git a/chrome/browser/ui/views/extensions/extension_view_views.h b/chrome/browser/ui/views/extensions/extension_view_views.h
index 251dd6b..91fd8b8d 100644
--- a/chrome/browser/ui/views/extensions/extension_view_views.h
+++ b/chrome/browser/ui/views/extensions/extension_view_views.h
@@ -9,7 +9,6 @@
 #include "base/macros.h"
 #include "chrome/browser/extensions/extension_view.h"
 #include "content/public/browser/native_web_keyboard_event.h"
-#include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
 #include "ui/views/controls/webview/webview.h"
 
diff --git a/chrome/browser/ui/views/frame/browser_frame.cc b/chrome/browser/ui/views/frame/browser_frame.cc
index 77c573dd..56414beb 100644
--- a/chrome/browser/ui/views/frame/browser_frame.cc
+++ b/chrome/browser/ui/views/frame/browser_frame.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/command_line.h"
 #include "base/debug/leak_annotations.h"
 #include "base/i18n/rtl.h"
 #include "build/build_config.h"
@@ -23,6 +24,7 @@
 #include "chrome/browser/ui/views/frame/native_browser_frame_factory.h"
 #include "chrome/browser/ui/views/frame/system_menu_model_builder.h"
 #include "chrome/browser/ui/views/frame/top_container_view.h"
+#include "chrome/common/chrome_switches.h"
 #include "ui/base/hit_test.h"
 #include "ui/events/event_handler.h"
 #include "ui/gfx/font_list.h"
@@ -78,6 +80,15 @@
     chrome::GetSavedWindowBoundsAndShowState(browser_view_->browser(),
                                              &params.bounds,
                                              &params.show_state);
+
+    params.workspace = browser_view_->browser()->initial_workspace();
+    const base::CommandLine& parsed_command_line =
+        *base::CommandLine::ForCurrentProcess();
+
+    if (parsed_command_line.HasSwitch(switches::kWindowWorkspace)) {
+      params.workspace =
+          parsed_command_line.GetSwitchValueASCII(switches::kWindowWorkspace);
+    }
   }
 
   Init(params);
@@ -208,6 +219,11 @@
   Widget::OnNativeWidgetActivationChanged(active);
 }
 
+void BrowserFrame::OnNativeWidgetWorkspaceChanged() {
+  chrome::SaveWindowWorkspace(browser_view_->browser(), GetWorkspace());
+  Widget::OnNativeWidgetWorkspaceChanged();
+}
+
 void BrowserFrame::ShowContextMenuForView(views::View* source,
                                           const gfx::Point& p,
                                           ui::MenuSourceType source_type) {
diff --git a/chrome/browser/ui/views/frame/browser_frame.h b/chrome/browser/ui/views/frame/browser_frame.h
index aed9802..180490f 100644
--- a/chrome/browser/ui/views/frame/browser_frame.h
+++ b/chrome/browser/ui/views/frame/browser_frame.h
@@ -105,6 +105,7 @@
   const ui::NativeTheme* GetNativeTheme() const override;
   void SchedulePaintInRect(const gfx::Rect& rect) override;
   void OnNativeWidgetActivationChanged(bool active) override;
+  void OnNativeWidgetWorkspaceChanged() override;
 
   // Overridden from views::ContextMenuController:
   void ShowContextMenuForView(views::View* source,
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 3ec6cdef..1d27d9a3 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -2535,6 +2535,10 @@
   ImeWarningBubbleView::ShowBubble(extension, this, callback);
 }
 
+std::string BrowserView::GetWorkspace() const {
+  return frame_->GetWorkspace();
+}
+
 bool BrowserView::DoCutCopyPasteForWebContents(
     WebContents* contents,
     void (WebContents::*method)()) {
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h
index 3dbe1f5..e6bb754 100644
--- a/chrome/browser/ui/views/frame/browser_view.h
+++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -366,6 +366,7 @@
       const extensions::Extension* extension,
       const base::Callback<void(ImeWarningBubblePermissionStatus status)>&
           callback) override;
+  std::string GetWorkspace() const override;
 
   BookmarkBarView* GetBookmarkBarView() const;
   LocationBarView* GetLocationBarView() const;
diff --git a/chrome/browser/ui/views/frame/contents_web_view.cc b/chrome/browser/ui/views/frame/contents_web_view.cc
index f77f345..151823ad 100644
--- a/chrome/browser/ui/views/frame/contents_web_view.cc
+++ b/chrome/browser/ui/views/frame/contents_web_view.cc
@@ -6,6 +6,7 @@
 
 #include "chrome/browser/themes/theme_properties.h"
 #include "chrome/browser/ui/views/status_bubble_views.h"
+#include "content/public/browser/render_widget_host_view.h"
 #include "content/public/browser/web_contents.h"
 #include "ui/base/theme_provider.h"
 #include "ui/compositor/layer_tree_owner.h"
@@ -64,6 +65,14 @@
       SkColorGetG(ntp_background) * kBackgroundBrightness / 0xFF,
       SkColorGetB(ntp_background) * kBackgroundBrightness / 0xFF,
       SkColorGetA(ntp_background)));
+
+
+  if (web_contents()) {
+    content::RenderWidgetHostView* rwhv =
+        web_contents()->GetRenderWidgetHostView();
+    if (rwhv)
+     rwhv->SetBackgroundColor(ntp_background);
+  }
 }
 
 void ContentsWebView::OnLayerRecreated(ui::Layer* old_layer,
@@ -114,3 +123,9 @@
   SetPaintToLayer(false);
   set_layer_owner_delegate(nullptr);
 }
+
+void ContentsWebView::RenderViewReady() {
+  // Apply the theme color to be the default background on startup.
+  OnThemeChanged();
+  WebView::RenderViewReady();
+}
diff --git a/chrome/browser/ui/views/frame/contents_web_view.h b/chrome/browser/ui/views/frame/contents_web_view.h
index da74a6b..93a39f2c 100644
--- a/chrome/browser/ui/views/frame/contents_web_view.h
+++ b/chrome/browser/ui/views/frame/contents_web_view.h
@@ -38,6 +38,7 @@
   void ViewHierarchyChanged(
       const ViewHierarchyChangedDetails& details) override;
   void OnThemeChanged() override;
+  void RenderViewReady() override;
 
   // ui::LayerOwnerDelegate overrides:
   void OnLayerRecreated(ui::Layer* old_layer, ui::Layer* new_layer) override;
diff --git a/chrome/browser/ui/views/media_router/OWNERS b/chrome/browser/ui/views/media_router/OWNERS
index 583b6f8fa..efc4671 100644
--- a/chrome/browser/ui/views/media_router/OWNERS
+++ b/chrome/browser/ui/views/media_router/OWNERS
@@ -1,9 +1,6 @@
-# Owners with committer privileges
 apacible@chromium.org
 imcheng@chromium.org
-kmarshall@chromium.org
 mfoltz@chromium.org
-wez@chromium.org
 
-# Team members without committer privileges, for potential FYI reviews.
-haibinlu@chromium.org
+# Fallback OWNER, if others are not available.
+wez@chromium.org
diff --git a/chrome/browser/ui/views/panels/panel_view.cc b/chrome/browser/ui/views/panels/panel_view.cc
index 078088fb..a494437 100644
--- a/chrome/browser/ui/views/panels/panel_view.cc
+++ b/chrome/browser/ui/views/panels/panel_view.cc
@@ -1012,8 +1012,8 @@
 #if defined(OS_WIN)
   if (focused_ && panel_->IsMinimized() &&
       panel_->collection()->type() == PanelCollection::DOCKED &&
-      display::Screen::GetScreen()->GetWindowUnderCursor() !=
-          widget->GetNativeWindow()) {
+      !display::Screen::GetScreen()->IsWindowUnderCursor(
+          widget->GetNativeWindow())) {
     panel_->Restore();
   }
 #endif
diff --git a/chrome/browser/ui/views/panels/taskbar_window_thumbnailer_win.cc b/chrome/browser/ui/views/panels/taskbar_window_thumbnailer_win.cc
index 29c2a5f..a5ba542 100644
--- a/chrome/browser/ui/views/panels/taskbar_window_thumbnailer_win.cc
+++ b/chrome/browser/ui/views/panels/taskbar_window_thumbnailer_win.cc
@@ -6,6 +6,8 @@
 
 #include <dwmapi.h>
 
+#include <algorithm>
+
 #include "base/logging.h"
 #include "base/win/scoped_hdc.h"
 #include "skia/ext/image_operations.h"
diff --git a/chrome/browser/ui/webui/extensions/extension_icon_source.h b/chrome/browser/ui/webui/extensions/extension_icon_source.h
index 16e8bf9..ebfe85b4 100644
--- a/chrome/browser/ui/webui/extensions/extension_icon_source.h
+++ b/chrome/browser/ui/webui/extensions/extension_icon_source.h
@@ -15,10 +15,10 @@
 #include "content/public/browser/url_data_source.h"
 #include "extensions/common/extension_icon_set.h"
 #include "extensions/common/extension_resource.h"
-#include "third_party/skia/include/core/SkBitmap.h"
 
 class ExtensionIconSet;
 class Profile;
+class SkBitmap;
 
 namespace extensions {
 class Extension;
diff --git a/chrome/browser/ui/webui/md_downloads/md_downloads_dom_handler.cc b/chrome/browser/ui/webui/md_downloads/md_downloads_dom_handler.cc
index c201893..c980c14 100644
--- a/chrome/browser/ui/webui/md_downloads/md_downloads_dom_handler.cc
+++ b/chrome/browser/ui/webui/md_downloads/md_downloads_dom_handler.cc
@@ -133,10 +133,6 @@
                  weak_ptr_factory_.GetWeakPtr()));
 }
 
-void MdDownloadsDOMHandler::OnJavascriptAllowed() {
-  list_tracker_.StartAndSendChunk();
-}
-
 void MdDownloadsDOMHandler::OnJavascriptDisallowed() {
   list_tracker_.Stop();
   list_tracker_.Reset();
@@ -144,13 +140,15 @@
 }
 
 void MdDownloadsDOMHandler::HandleGetDownloads(const base::ListValue* args) {
+  AllowJavascript();
+
   CountDownloadsDOMEvents(DOWNLOADS_DOM_EVENT_GET_DOWNLOADS);
 
   bool terms_changed = list_tracker_.SetSearchTerms(*args);
   if (terms_changed)
     list_tracker_.Reset();
 
-  AllowJavascript();
+  list_tracker_.StartAndSendChunk();
 }
 
 void MdDownloadsDOMHandler::HandleOpenFile(const base::ListValue* args) {
diff --git a/chrome/browser/ui/webui/md_downloads/md_downloads_dom_handler.h b/chrome/browser/ui/webui/md_downloads/md_downloads_dom_handler.h
index 6a2b95a..1b96a54 100644
--- a/chrome/browser/ui/webui/md_downloads/md_downloads_dom_handler.h
+++ b/chrome/browser/ui/webui/md_downloads/md_downloads_dom_handler.h
@@ -38,7 +38,6 @@
 
   // WebUIMessageHandler implementation.
   void RegisterMessages() override;
-  void OnJavascriptAllowed() override;
   void OnJavascriptDisallowed() override;
 
   // Callback for the "getDownloads" message.
diff --git a/chrome/browser/ui/webui/md_downloads/md_downloads_dom_handler_unittest.cc b/chrome/browser/ui/webui/md_downloads/md_downloads_dom_handler_unittest.cc
index 54f77a82..de44c38 100644
--- a/chrome/browser/ui/webui/md_downloads/md_downloads_dom_handler_unittest.cc
+++ b/chrome/browser/ui/webui/md_downloads/md_downloads_dom_handler_unittest.cc
@@ -11,21 +11,59 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-TEST(MdDownloadsDOMHandlerTest, ChecksForRemovedFiles) {
-  content::TestBrowserThreadBundle thread_bundle;
-  TestingProfile profile;
+namespace {
 
-  testing::NiceMock<content::MockDownloadManager> manager;
-  ON_CALL(manager, GetBrowserContext()).WillByDefault(
-      testing::Return(&profile));
+class TestMdDownloadsDOMHandler : public MdDownloadsDOMHandler {
+ public:
+  explicit TestMdDownloadsDOMHandler(content::DownloadManager* download_manager,
+                                     content::WebUI* web_ui)
+      : MdDownloadsDOMHandler(download_manager, web_ui) {}
 
-  content::TestWebUI web_ui;
+  using MdDownloadsDOMHandler::set_web_ui;
+};
 
-  EXPECT_CALL(manager, CheckForHistoryFilesRemoval());
-  MdDownloadsDOMHandler handler(&manager, &web_ui);
+}  // namespace
 
-  testing::Mock::VerifyAndClear(&manager);
+// A fixture to test MdDownloadsDOMHandler.
+class MdDownloadsDOMHandlerTest : public testing::Test {
+ public:
+  // testing::Test:
+  void SetUp() override {
+    ON_CALL(manager_, GetBrowserContext())
+        .WillByDefault(testing::Return(&profile_));
+  }
 
-  EXPECT_CALL(manager, CheckForHistoryFilesRemoval());
+  TestingProfile* profile() { return &profile_; }
+  content::MockDownloadManager* manager() { return &manager_; }
+  content::TestWebUI* web_ui() { return &web_ui_; }
+
+ private:
+  // NOTE: The initialization order of these members matters.
+  content::TestBrowserThreadBundle thread_bundle_;
+  TestingProfile profile_;
+
+  testing::NiceMock<content::MockDownloadManager> manager_;
+  content::TestWebUI web_ui_;
+};
+
+TEST_F(MdDownloadsDOMHandlerTest, ChecksForRemovedFiles) {
+  EXPECT_CALL(*manager(), CheckForHistoryFilesRemoval());
+  TestMdDownloadsDOMHandler handler(manager(), web_ui());
+
+  testing::Mock::VerifyAndClear(manager());
+
+  EXPECT_CALL(*manager(), CheckForHistoryFilesRemoval());
   handler.OnJavascriptDisallowed();
 }
+
+TEST_F(MdDownloadsDOMHandlerTest, HandleGetDownloads) {
+  TestMdDownloadsDOMHandler handler(manager(), web_ui());
+  handler.set_web_ui(web_ui());
+
+  base::ListValue empty_search_terms;
+  handler.HandleGetDownloads(&empty_search_terms);
+
+  EXPECT_EQ(1U, web_ui()->call_data().size());
+  EXPECT_EQ("downloads.Manager.insertItems",
+            web_ui()->call_data()[0]->function_name());
+}
diff --git a/chrome/browser/ui/webui/media_router/OWNERS b/chrome/browser/ui/webui/media_router/OWNERS
index a4d772ee..efc4671 100644
--- a/chrome/browser/ui/webui/media_router/OWNERS
+++ b/chrome/browser/ui/webui/media_router/OWNERS
@@ -1,12 +1,6 @@
-# Primary feature owners.
-# Please include at least one of the following people in CL reviews.
 apacible@chromium.org
-haibinlu@chromium.org
-
-# Also include an owner with committer privileges.
-kmarshall@chromium.org
-mfoltz@chromium.org
-wez@chromium.org
-
-# Other members, for potential FYI reviews.
 imcheng@chromium.org
+mfoltz@chromium.org
+
+# Fallback OWNER, if others are not available.
+wez@chromium.org
diff --git a/chrome/browser/ui/webui/options/browser_options_handler.cc b/chrome/browser/ui/webui/options/browser_options_handler.cc
index 155362eb..5a480faf 100644
--- a/chrome/browser/ui/webui/options/browser_options_handler.cc
+++ b/chrome/browser/ui/webui/options/browser_options_handler.cc
@@ -726,6 +726,11 @@
       "enableExperimentalAccessibilityFeatures",
       base::CommandLine::ForCurrentProcess()->HasSwitch(
           chromeos::switches::kEnableExperimentalAccessibilityFeatures));
+
+  chromeos::CrosSettings* cros_settings = chromeos::CrosSettings::Get();
+  bool allow_bluetooth = true;
+  cros_settings->GetBoolean(chromeos::kAllowBluetooth, &allow_bluetooth);
+  values->SetBoolean("allowBluetooth", allow_bluetooth);
 #endif
 }
 
diff --git a/chrome/browser/ui/webui/popular_sites_internals_message_handler.cc b/chrome/browser/ui/webui/popular_sites_internals_message_handler.cc
index 9534044..7898c15 100644
--- a/chrome/browser/ui/webui/popular_sites_internals_message_handler.cc
+++ b/chrome/browser/ui/webui/popular_sites_internals_message_handler.cc
@@ -13,6 +13,7 @@
 #include "base/task_runner_util.h"
 #include "base/values.h"
 #include "chrome/browser/android/ntp/popular_sites.h"
+#include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "components/url_formatter/url_fixer.h"
@@ -60,6 +61,7 @@
   popular_sites_.reset(new PopularSites(
       profile->GetPrefs(),
       TemplateURLServiceFactory::GetForProfile(profile),
+      g_browser_process->variations_service(),
       profile->GetRequestContext(),
       country, version, false,
       base::Bind(&PopularSitesInternalsMessageHandler::OnPopularSitesAvailable,
@@ -91,6 +93,7 @@
   popular_sites_.reset(new PopularSites(
       profile->GetPrefs(),
       TemplateURLServiceFactory::GetForProfile(profile),
+      g_browser_process->variations_service(),
       profile->GetRequestContext(),
       country, version, true, callback));
 }
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
index d278cfd6..4ceb4a3 100644
--- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -298,7 +298,16 @@
       {"clearDataEverything", IDS_SETTINGS_CLEAR_DATA_EVERYTHING},
       {"warnAboutNonClearedData", IDS_SETTINGS_CLEAR_DATA_SOME_STUFF_REMAINS},
       {"clearsSyncedData", IDS_SETTINGS_CLEAR_DATA_CLEARS_SYNCED_DATA},
+      {"clearBrowsingDataLearnMoreUrl", IDS_SETTINGS_CLEAR_DATA_LEARN_MORE_URL},
   };
+
+  html_source->AddString(
+      "otherFormsOfBrowsingHistory",
+      l10n_util::GetStringFUTF16(
+          IDS_CLEAR_BROWSING_DATA_HISTORY_FOOTER,
+          l10n_util::GetStringUTF16(
+              IDS_SETTINGS_CLEAR_DATA_WEB_HISTORY_URL_IN_FOOTER)));
+
   AddLocalizedStringsBulk(html_source, localized_strings,
                           arraysize(localized_strings));
 }
@@ -674,6 +683,10 @@
     {"passphrasePlaceholder", IDS_SETTINGS_PASSPHRASE_PLACEHOLDER},
     {"passphraseConfirmationPlaceholder",
      IDS_SETTINGS_PASSPHRASE_CONFIRMATION_PLACEHOLDER},
+    {"personalizeGoogleServicesTitle",
+     IDS_SETTINGS_PERSONALIZE_GOOGLE_SERVICES_TITLE},
+    {"personalizeGoogleServicesText",
+     IDS_SETTINGS_PERSONALIZE_GOOGLE_SERVICES_TEXT},
   };
   AddLocalizedStringsBulk(html_source, localized_strings,
                           arraysize(localized_strings));
@@ -687,6 +700,9 @@
       "syncDisconnectExplanation",
       l10n_util::GetStringFUTF16(IDS_SETTINGS_SYNC_DISCONNECT_EXPLANATION,
                                  base::ASCIIToUTF16(disconnect_help_url)));
+  html_source->AddString(
+      "activityControlsUrl",
+      base::ASCIIToUTF16(chrome::kGoogleAccountActivityControlsURL));
 }
 
 void AddPrivacyStrings(content::WebUIDataSource* html_source) {
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc
index 0becb60..bdfe1a5a 100644
--- a/chrome/browser/ui/webui/settings/people_handler.cc
+++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -409,7 +409,8 @@
         ProfileSyncService::STOP_FROM_ADVANCED_DIALOG);
 
     CloseSyncSetup();
-    ResolveJavascriptCallback(*callback_id, base::StringValue(kDonePageStatus));
+    ResolveJavascriptCallback(*callback_id,
+                              base::StringValue(kConfigurePageStatus));
 
     service->RequestStop(ProfileSyncService::CLEAR_DATA);
     service->SetSetupInProgress(false);
@@ -505,9 +506,8 @@
       service->SetFirstSetupComplete();
     }
 
-    // No passphrase is required from the user so mark the configuration as
-    // complete and close the sync setup overlay.
-    ResolveJavascriptCallback(*callback_id, base::StringValue(kDonePageStatus));
+    ResolveJavascriptCallback(*callback_id,
+                              base::StringValue(kConfigurePageStatus));
   }
 
   ProfileMetrics::LogProfileSyncInfo(ProfileMetrics::SYNC_CUSTOMIZE);
diff --git a/chrome/browser/ui/webui/settings/people_handler_unittest.cc b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
index a42e043..2728aebe 100644
--- a/chrome/browser/ui/webui/settings/people_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
@@ -527,9 +527,7 @@
   EXPECT_CALL(*mock_pss_, OnUserChoseDatatypes(true, _));
   handler_->HandleConfigure(&list_args);
 
-  // Ensure that we navigated to the "done" state since we don't need a
-  // passphrase.
-  ExpectPageStatusResponse(PeopleHandler::kDonePageStatus);
+  ExpectPageStatusResponse(PeopleHandler::kConfigurePageStatus);
 }
 
 TEST_F(PeopleHandlerTest, TestSyncNothing) {
@@ -542,7 +540,7 @@
   SetupInitializedProfileSyncService();
   handler_->HandleConfigure(&list_args);
 
-  ExpectPageStatusResponse(PeopleHandler::kDonePageStatus);
+  ExpectPageStatusResponse(PeopleHandler::kConfigurePageStatus);
 }
 
 TEST_F(PeopleHandlerTest, TurnOnEncryptAll) {
@@ -562,9 +560,7 @@
   EXPECT_CALL(*mock_pss_, OnUserChoseDatatypes(true, _));
   handler_->HandleConfigure(&list_args);
 
-  // Ensure that we navigated to the "done" state since we don't need a
-  // passphrase.
-  ExpectPageStatusResponse(PeopleHandler::kDonePageStatus);
+  ExpectPageStatusResponse(PeopleHandler::kConfigurePageStatus);
 }
 
 TEST_F(PeopleHandlerTest, TestPassphraseStillRequired) {
@@ -612,9 +608,7 @@
       WillOnce(Return(true));
 
   handler_->HandleConfigure(&list_args);
-  // We should navigate to PeopleHandler::kDonePageStatus page since we finished
-  // configuring.
-  ExpectPageStatusResponse(PeopleHandler::kDonePageStatus);
+  ExpectPageStatusResponse(PeopleHandler::kConfigurePageStatus);
 }
 
 TEST_F(PeopleHandlerTest, SelectCustomEncryption) {
@@ -641,9 +635,7 @@
                                       ProfileSyncService::EXPLICIT));
 
   handler_->HandleConfigure(&list_args);
-  // We should navigate to PeopleHandler::kDonePageStatus page since we finished
-  // configuring.
-  ExpectPageStatusResponse(PeopleHandler::kDonePageStatus);
+  ExpectPageStatusResponse(PeopleHandler::kConfigurePageStatus);
 }
 
 TEST_F(PeopleHandlerTest, UnsuccessfullySetPassphrase) {
@@ -700,8 +692,7 @@
                 OnUserChoseDatatypes(false, ModelTypeSetMatches(type_to_set)));
 
     handler_->HandleConfigure(&list_args);
-
-    ExpectPageStatusResponse(PeopleHandler::kDonePageStatus);
+    ExpectPageStatusResponse(PeopleHandler::kConfigurePageStatus);
     Mock::VerifyAndClearExpectations(mock_pss_);
   }
 }
@@ -724,7 +715,7 @@
               OnUserChoseDatatypes(false, ModelTypeSetMatches(GetAllTypes())));
   handler_->HandleConfigure(&list_args);
 
-  ExpectPageStatusResponse(PeopleHandler::kDonePageStatus);
+  ExpectPageStatusResponse(PeopleHandler::kConfigurePageStatus);
 }
 
 TEST_F(PeopleHandlerTest, ShowSyncSetup) {
@@ -943,9 +934,7 @@
   EXPECT_CALL(*mock_pss_, OnUserChoseDatatypes(true, _));
   handler_->HandleConfigure(&list_args);
 
-  // Ensure that we navigated to the "done" state since we don't need a
-  // passphrase.
-  ExpectPageStatusResponse(PeopleHandler::kDonePageStatus);
+  ExpectPageStatusResponse(PeopleHandler::kConfigurePageStatus);
 }
 
 }  // namespace settings
diff --git a/chrome/browser/ui/webui/settings/profile_info_handler.cc b/chrome/browser/ui/webui/settings/profile_info_handler.cc
index 6116ba9..c3b0de8 100644
--- a/chrome/browser/ui/webui/settings/profile_info_handler.cc
+++ b/chrome/browser/ui/webui/settings/profile_info_handler.cc
@@ -31,7 +31,11 @@
 const char ProfileInfoHandler::kProfileInfoChangedEventName[] =
     "profile-info-changed";
 
-ProfileInfoHandler::ProfileInfoHandler(Profile* profile) : profile_(profile) {}
+ProfileInfoHandler::ProfileInfoHandler(Profile* profile)
+    : profile_(profile),
+      profile_observer_(this) {}
+
+ProfileInfoHandler::~ProfileInfoHandler() {}
 
 void ProfileInfoHandler::RegisterMessages() {
   web_ui()->RegisterMessageCallback(
@@ -40,9 +44,8 @@
 }
 
 void ProfileInfoHandler::OnJavascriptAllowed() {
-  g_browser_process->profile_manager()
-      ->GetProfileAttributesStorage()
-      .AddObserver(this);
+  profile_observer_.Add(
+      &g_browser_process->profile_manager()->GetProfileAttributesStorage());
 
 #if defined(OS_CHROMEOS)
   registrar_.Add(this, chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED,
@@ -51,9 +54,8 @@
 }
 
 void ProfileInfoHandler::OnJavascriptDisallowed() {
-  g_browser_process->profile_manager()
-      ->GetProfileAttributesStorage()
-      .RemoveObserver(this);
+  profile_observer_.Remove(
+      &g_browser_process->profile_manager()->GetProfileAttributesStorage());
 
 #if defined(OS_CHROMEOS)
   registrar_.RemoveAll();
diff --git a/chrome/browser/ui/webui/settings/profile_info_handler.h b/chrome/browser/ui/webui/settings/profile_info_handler.h
index e0ab2ad..4bc64054 100644
--- a/chrome/browser/ui/webui/settings/profile_info_handler.h
+++ b/chrome/browser/ui/webui/settings/profile_info_handler.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/macros.h"
+#include "base/scoped_observer.h"
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile_attributes_storage.h"
 #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
@@ -30,7 +31,7 @@
   static const char kProfileInfoChangedEventName[];
 
   explicit ProfileInfoHandler(Profile* profile);
-  ~ProfileInfoHandler() override {}
+  ~ProfileInfoHandler() override;
 
   // SettingsPageUIHandler implementation.
   void RegisterMessages() override;
@@ -63,6 +64,9 @@
   // Weak pointer.
   Profile* profile_;
 
+  ScopedObserver<ProfileAttributesStorage, ProfileInfoHandler>
+      profile_observer_;
+
 #if defined(OS_CHROMEOS)
   // Used to listen to ChromeOS user image changes.
   content::NotificationRegistrar registrar_;
diff --git a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
index 0cde828..6309acec 100644
--- a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
@@ -11,14 +11,20 @@
 #include "base/metrics/sparse_histogram.h"
 #include "chrome/browser/browsing_data/browsing_data_helper.h"
 #include "chrome/browser/browsing_data/browsing_data_remover_factory.h"
+#include "chrome/browser/history/web_history_service_factory.h"
+#include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "chrome/common/pref_names.h"
+#include "components/browsing_data_ui/history_notice_utils.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/browser/web_ui.h"
 
 namespace settings {
 
 ClearBrowsingDataHandler::ClearBrowsingDataHandler(content::WebUI* webui)
-    : remover_(nullptr) {
+    : sync_service_(nullptr),
+      remover_(nullptr),
+      should_show_history_footer_(false),
+      weak_ptr_factory_(this) {
   PrefService* prefs = Profile::FromWebUI(webui)->GetPrefs();
   clear_plugin_lso_data_enabled_.Init(prefs::kClearPluginLSODataEnabled, prefs);
   pepper_flash_settings_enabled_.Init(prefs::kPepperFlashSettingsEnabled,
@@ -27,6 +33,8 @@
       prefs::kAllowDeletingBrowserHistory, prefs,
       base::Bind(&ClearBrowsingDataHandler::OnBrowsingHistoryPrefChanged,
                  base::Unretained(this)));
+  sync_service_ =
+        ProfileSyncServiceFactory::GetForProfile(Profile::FromWebUI(webui));
 }
 
 ClearBrowsingDataHandler::~ClearBrowsingDataHandler() {
@@ -39,6 +47,21 @@
       "clearBrowsingData",
       base::Bind(&ClearBrowsingDataHandler::HandleClearBrowsingData,
                  base::Unretained(this)));
+
+  web_ui()->RegisterMessageCallback(
+      "initializeClearBrowsingData",
+      base::Bind(&ClearBrowsingDataHandler::HandleInitialize,
+                 base::Unretained(this)));
+}
+
+void ClearBrowsingDataHandler::OnJavascriptAllowed() {
+  if (sync_service_)
+    sync_service_->AddObserver(this);
+}
+
+void ClearBrowsingDataHandler::OnJavascriptDisallowed() {
+  if (sync_service_)
+    sync_service_->RemoveObserver(this);
 }
 
 void ClearBrowsingDataHandler::HandleClearBrowsingData(
@@ -151,4 +174,31 @@
       base::FundamentalValue(*allow_deleting_browser_history_));
 }
 
+void ClearBrowsingDataHandler::HandleInitialize(const base::ListValue* args) {
+  AllowJavascript();
+  OnStateChanged();
+  RefreshHistoryNotice();
+}
+
+void ClearBrowsingDataHandler::OnStateChanged() {
+  web_ui()->CallJavascriptFunction(
+      "cr.webUIListenerCallback",
+      base::StringValue("update-footer"),
+      base::FundamentalValue(sync_service_ && sync_service_->IsSyncActive()),
+      base::FundamentalValue(should_show_history_footer_));
+}
+
+void ClearBrowsingDataHandler::RefreshHistoryNotice() {
+  browsing_data_ui::ShouldShowNoticeAboutOtherFormsOfBrowsingHistory(
+      sync_service_,
+      WebHistoryServiceFactory::GetForProfile(Profile::FromWebUI(web_ui())),
+      base::Bind(&ClearBrowsingDataHandler::UpdateHistoryNotice,
+                 weak_ptr_factory_.GetWeakPtr()));
+}
+
+void ClearBrowsingDataHandler::UpdateHistoryNotice(bool show) {
+  should_show_history_footer_ = show;
+  OnStateChanged();
+}
+
 }  // namespace settings
diff --git a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h
index 9059094..5663d05 100644
--- a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h
+++ b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h
@@ -10,6 +10,7 @@
 #include "chrome/browser/browsing_data/browsing_data_remover.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
+#include "components/browser_sync/browser/profile_sync_service.h"
 #include "components/prefs/pref_member.h"
 
 namespace base {
@@ -24,13 +25,16 @@
 
 // Chrome browser startup settings handler.
 class ClearBrowsingDataHandler : public SettingsPageUIHandler,
-                                 public BrowsingDataRemover::Observer {
+                                 public BrowsingDataRemover::Observer,
+                                 public sync_driver::SyncServiceObserver {
  public:
   explicit ClearBrowsingDataHandler(content::WebUI* webui);
   ~ClearBrowsingDataHandler() override;
 
-  // OptionsPageUIHandler:
+  // WebUIMessageHandler implementation.
   void RegisterMessages() override;
+  void OnJavascriptAllowed() override;
+  void OnJavascriptDisallowed() override;
 
  private:
   // Clears browsing data, called by Javascript.
@@ -43,6 +47,24 @@
   // Updates UI when the pref to allow clearing history changes.
   virtual void OnBrowsingHistoryPrefChanged();
 
+  // Initializes the dialog UI. Called by JavaScript when the DOM is ready.
+  void HandleInitialize(const base::ListValue* args);
+
+  // Implementation of SyncServiceObserver. Updates the footer of the dialog
+  // when the sync state changes.
+  void OnStateChanged() override;
+
+  // Finds out whether we should show notice about other forms of history stored
+  // in user's account.
+  void RefreshHistoryNotice();
+
+  // Called as an asynchronous response to |RefreshHistoryNotice()|. Shows or
+  // hides the footer about other forms of history stored in user's account.
+  void UpdateHistoryNotice(bool show);
+
+  // ProfileSyncService to observe sync state changes.
+  ProfileSyncService* sync_service_;
+
   // If non-null it means removal is in progress.
   BrowsingDataRemover* remover_;
 
@@ -60,6 +82,14 @@
   // Keeps track of whether deleting browsing history and downloads is allowed.
   BooleanPrefMember allow_deleting_browser_history_;
 
+  // Whether the sentence about other forms of history stored in user's account
+  // should be displayed in the footer. This value is retrieved asynchronously,
+  // so we cache it here.
+  bool should_show_history_footer_;
+
+  // A weak pointer factory for asynchronous calls referencing this class.
+  base::WeakPtrFactory<ClearBrowsingDataHandler> weak_ptr_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(ClearBrowsingDataHandler);
 };
 
diff --git a/chrome/browser/ui/webui/signin/md_user_manager_ui.cc b/chrome/browser/ui/webui/signin/md_user_manager_ui.cc
index f0de4ccd..9f0c204e 100644
--- a/chrome/browser/ui/webui/signin/md_user_manager_ui.cc
+++ b/chrome/browser/ui/webui/signin/md_user_manager_ui.cc
@@ -61,10 +61,8 @@
   source->AddLocalizedStrings(localized_strings);
   source->SetJsonPath("strings.js");
 
-  source->AddResourcePath("control_bar.css", IDR_MD_CONTROL_BAR_CSS);
   source->AddResourcePath("control_bar.html", IDR_MD_CONTROL_BAR_HTML);
   source->AddResourcePath("control_bar.js", IDR_MD_CONTROL_BAR_JS);
-  source->AddResourcePath("create_profile.css", IDR_MD_CREATE_PROFILE_CSS);
   source->AddResourcePath("create_profile.html", IDR_MD_CREATE_PROFILE_HTML);
   source->AddResourcePath("create_profile.js", IDR_MD_CREATE_PROFILE_JS);
   source->AddResourcePath("profile_browser_proxy.html",
@@ -72,8 +70,6 @@
   source->AddResourcePath("profile_browser_proxy.js",
                           IDR_MD_PROFILE_BROWSER_PROXY_JS);
   source->AddResourcePath("strings.html", IDR_MD_USER_MANAGER_STRINGS_HTML);
-  source->AddResourcePath("supervised_user_learn_more.css",
-                          IDR_MD_SUPERVISED_USER_LEARN_MORE_CSS);
   source->AddResourcePath("supervised_user_learn_more.html",
                           IDR_MD_SUPERVISED_USER_LEARN_MORE_HTML);
   source->AddResourcePath("supervised_user_learn_more.js",
@@ -81,14 +77,10 @@
   source->AddResourcePath("user_manager_styles.html",
                           IDR_MD_USER_MANAGER_STYLES_HTML);
   source->AddResourcePath("user_manager.js", IDR_MD_USER_MANAGER_JS);
-  source->AddResourcePath("user_manager_pages.css",
-                          IDR_MD_USER_MANAGER_PAGES_CSS);
   source->AddResourcePath("user_manager_pages.html",
                           IDR_MD_USER_MANAGER_PAGES_HTML);
   source->AddResourcePath("user_manager_pages.js",
                           IDR_MD_USER_MANAGER_PAGES_JS);
-  source->AddResourcePath("user_manager_tutorial.css",
-                          IDR_MD_USER_MANAGER_TUTORIAL_CSS);
   source->AddResourcePath("user_manager_tutorial.html",
                           IDR_MD_USER_MANAGER_TUTORIAL_HTML);
   source->AddResourcePath("user_manager_tutorial.js",
diff --git a/chrome/browser/ui/webui/sync_setup_browsertest.js b/chrome/browser/ui/webui/sync_setup_browsertest.js
index 74a9ded5..bcae6e11 100644
--- a/chrome/browser/ui/webui/sync_setup_browsertest.js
+++ b/chrome/browser/ui/webui/sync_setup_browsertest.js
@@ -81,12 +81,13 @@
   },
 };
 
-// This test is flaky on Linux bot. See crbug.com/579666
-GEN('#if defined(OS_LINUX)');
+// This test is flaky on Linux bot (crbug.com/579666) and Windows bot
+// (crbug.com/608975).
+GEN('#if defined(OS_LINUX) || defined(OS_WIN)');
 GEN('#define MAYBE_VerifySignIn DISABLED_VerifySignIn');
 GEN('#else');
 GEN('#define MAYBE_VerifySignIn VerifySignIn');
-GEN('#endif  // defined(OS_LINUX)');
+GEN('#endif  // defined(OS_LINUX) || defined(OS_WIN)');
 TEST_F('SyncSetupWebUITestAsync', 'MAYBE_VerifySignIn', function() {
   // Handle SyncSetupStartSignIn by displaying the sync setup dialog, verifying
   // that a confirmation dialog appears, and clicking OK to dismiss the dialog.
diff --git a/chrome/browser/ui/window_sizer/window_sizer_common_unittest.cc b/chrome/browser/ui/window_sizer/window_sizer_common_unittest.cc
index b0a84e7f..750752a9 100644
--- a/chrome/browser/ui/window_sizer/window_sizer_common_unittest.cc
+++ b/chrome/browser/ui/window_sizer/window_sizer_common_unittest.cc
@@ -45,9 +45,9 @@
     return gfx::Point();
   }
 
-  gfx::NativeWindow GetWindowUnderCursor() override {
-    NOTREACHED();
-    return NULL;
+  bool IsWindowUnderCursor(gfx::NativeWindow window) override {
+    NOTIMPLEMENTED();
+    return false;
   }
 
   gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override {
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index da9425f..ddf6274 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -920,6 +920,8 @@
       'browser/android/resource_mapper.h',
       'browser/android/rlz/revenue_stats.cc',
       'browser/android/rlz/revenue_stats.h',
+      'browser/android/safe_browsing/safe_browsing_api_handler_bridge.cc',
+      'browser/android/safe_browsing/safe_browsing_api_handler_bridge.h',
       'browser/android/seccomp_support_detector.cc',
       'browser/android/seccomp_support_detector.h',
       'browser/android/sessions/session_tab_helper_android.cc',
@@ -1994,6 +1996,7 @@
       'android/java/src/org/chromium/chrome/browser/push_messaging/PushMessagingServiceObserver.java',
       'android/java/src/org/chromium/chrome/browser/rappor/RapporServiceBridge.java',
       'android/java/src/org/chromium/chrome/browser/rlz/RevenueStats.java',
+      'android/java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingApiBridge.java',
       'android/java/src/org/chromium/chrome/browser/ShortcutHelper.java',
       'android/java/src/org/chromium/chrome/browser/SSLClientCertificateRequest.java',
       'android/java/src/org/chromium/chrome/browser/search_engines/TemplateUrlService.java',
diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi
index 670959c..a56516a 100644
--- a/chrome/chrome_browser_ui.gypi
+++ b/chrome/chrome_browser_ui.gypi
@@ -510,6 +510,8 @@
     'chrome_browser_ui_ash_sources': [
       'browser/ui/ash/app_list/app_list_controller_ash.cc',
       'browser/ui/ash/app_list/app_list_controller_ash.h',
+      'browser/ui/ash/app_list/app_list_presenter_delegate_mus.cc',
+      'browser/ui/ash/app_list/app_list_presenter_delegate_mus.h',
       'browser/ui/ash/app_list/app_list_service_ash.cc',
       'browser/ui/ash/app_list/app_list_service_ash.h',
       'browser/ui/ash/app_list/app_sync_ui_state_watcher.cc',
@@ -529,6 +531,8 @@
       'browser/ui/ash/cast_config_delegate_media_router.h',
       'browser/ui/ash/chrome_keyboard_ui.cc',
       'browser/ui/ash/chrome_keyboard_ui.h',
+      'browser/ui/ash/chrome_launcher_prefs.cc',
+      'browser/ui/ash/chrome_launcher_prefs.h',
       'browser/ui/ash/chrome_new_window_delegate.cc',
       'browser/ui/ash/chrome_new_window_delegate.h',
       'browser/ui/ash/chrome_new_window_delegate_chromeos.cc',
@@ -571,14 +575,14 @@
       'browser/ui/ash/launcher/extension_app_window_launcher_item_controller.h',
       'browser/ui/ash/launcher/extension_launcher_context_menu.cc',
       'browser/ui/ash/launcher/extension_launcher_context_menu.h',
-      'browser/ui/ash/launcher/launcher_app_tab_helper.cc',
-      'browser/ui/ash/launcher/launcher_app_tab_helper.h',
       'browser/ui/ash/launcher/launcher_app_updater.cc',
       'browser/ui/ash/launcher/launcher_app_updater.h',
       'browser/ui/ash/launcher/launcher_application_menu_item_model.cc',
       'browser/ui/ash/launcher/launcher_application_menu_item_model.h',
       'browser/ui/ash/launcher/launcher_context_menu.cc',
       'browser/ui/ash/launcher/launcher_context_menu.h',
+      'browser/ui/ash/launcher/launcher_controller_helper.cc',
+      'browser/ui/ash/launcher/launcher_controller_helper.h',
       'browser/ui/ash/launcher/launcher_extension_app_updater.cc',
       'browser/ui/ash/launcher/launcher_extension_app_updater.h',
       'browser/ui/ash/launcher/launcher_favicon_loader.cc',
@@ -665,8 +669,6 @@
     ],
     # Cross-platform aura sources.
     'chrome_browser_ui_aura_sources': [
-      'browser/ui/ash/chrome_launcher_prefs.cc',
-      'browser/ui/ash/chrome_launcher_prefs.h',
       'browser/ui/aura/accessibility/automation_manager_aura.cc',
       'browser/ui/aura/accessibility/automation_manager_aura.h',
       'browser/ui/aura/accessibility/ax_root_obj_wrapper.cc',
@@ -2677,12 +2679,6 @@
       'browser/ui/app_list/search/omnibox_provider.h',
       'browser/ui/app_list/search/omnibox_result.cc',
       'browser/ui/app_list/search/omnibox_result.h',
-      'browser/ui/app_list/search/people/people_provider.cc',
-      'browser/ui/app_list/search/people/people_provider.h',
-      'browser/ui/app_list/search/people/people_result.cc',
-      'browser/ui/app_list/search/people/people_result.h',
-      'browser/ui/app_list/search/people/person.cc',
-      'browser/ui/app_list/search/people/person.h',
       'browser/ui/app_list/search/search_controller_factory.cc',
       'browser/ui/app_list/search/search_controller_factory.h',
       'browser/ui/app_list/search/search_resource_manager.cc',
diff --git a/chrome/chrome_common.gypi b/chrome/chrome_common.gypi
index 0ee63d68..2d5babb 100644
--- a/chrome/chrome_common.gypi
+++ b/chrome/chrome_common.gypi
@@ -602,7 +602,7 @@
             'third_party/mozilla_security_manager/nsUsageArrayHelper.h',
           ],
           'dependencies': [
-            '../build/linux/system.gyp:ssl',
+            '../build/linux/system.gyp:nss',
           ],
         }, {
           'sources!': [
diff --git a/chrome/chrome_dll_bundle.gypi b/chrome/chrome_dll_bundle.gypi
index 7668bbc..985f40d 100644
--- a/chrome/chrome_dll_bundle.gypi
+++ b/chrome/chrome_dll_bundle.gypi
@@ -56,10 +56,6 @@
 
     'app/framework-Info.plist',
     '<@(mac_all_xibs)',
-    'app/theme/find_next_Template.pdf',
-    'app/theme/find_prev_Template.pdf',
-    'app/theme/menu_overflow_down.pdf',
-    'app/theme/menu_overflow_up.pdf',
     'browser/mac/install.sh',
     '<(SHARED_INTERMEDIATE_DIR)/repack/chrome_100_percent.pak',
     '<(SHARED_INTERMEDIATE_DIR)/repack/resources.pak',
@@ -74,7 +70,6 @@
   'dependencies': [
     'app_mode_app',
     # Bring in pdfsqueeze and run it on all pdfs
-    '../build/temp_gyp/pdfsqueeze.gyp:pdfsqueeze',
     '../crypto/crypto.gyp:crypto',
     # On Mac, Flash gets put into the framework, so we need this
     # dependency here. flash_player.gyp will copy the Flash bundle
@@ -85,21 +80,6 @@
     'chrome_resources.gyp:packed_extra_resources',
     'chrome_resources.gyp:packed_resources',
   ],
-  'rules': [
-    {
-      'rule_name': 'pdfsqueeze',
-      'extension': 'pdf',
-      'inputs': [
-        '<(PRODUCT_DIR)/pdfsqueeze',
-      ],
-      'outputs': [
-        '<(INTERMEDIATE_DIR)/pdfsqueeze/<(RULE_INPUT_ROOT).pdf',
-      ],
-      'action': ['<(PRODUCT_DIR)/pdfsqueeze',
-                 '<(RULE_INPUT_PATH)', '<@(_outputs)'],
-      'message': 'Running pdfsqueeze on <(RULE_INPUT_PATH)',
-    },
-  ],
   'variables': {
     'theme_dir_name': '<(branding_path_component)',
   },
diff --git a/chrome/chrome_repack_locales.gni b/chrome/chrome_repack_locales.gni
index 15331693..fc120040 100644
--- a/chrome/chrome_repack_locales.gni
+++ b/chrome/chrome_repack_locales.gni
@@ -163,7 +163,7 @@
 
       # Compute the output name. Mac uses a different location.
       if (is_mac || is_ios) {
-        output = "${root_gen_dir}/repack/${output_locale}.lproj/locale.pak"
+        output = "${root_gen_dir}/repack/locales/${output_locale}.pak"
       } else {
         output = "${root_out_dir}/locales/${output_locale}.pak"
       }
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index df6a848..cb3127b 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -923,7 +923,6 @@
       'browser/apps/drive/drive_app_provider_browsertest.cc',
       'browser/ui/app_list/app_list_controller_browsertest.cc',
       'browser/ui/app_list/app_list_service_impl_browsertest.cc',
-      'browser/ui/app_list/search/people/people_provider_browsertest.cc',
       'browser/ui/app_list/search/webstore/webstore_provider_browsertest.cc',
       'browser/ui/app_list/speech_recognizer_browsertest.cc',
     ],
@@ -1703,7 +1702,7 @@
         }],
         ['OS=="linux"', {
           'dependencies': [
-            '../build/linux/system.gyp:ssl',
+            '../build/linux/system.gyp:nss',
           ],
         }, {  # Non-Linux platforms (Linux includes ChromeOS here).
           'sources': [
@@ -2523,7 +2522,7 @@
         }],
         ['OS=="linux"', {
           'dependencies': [
-            '../build/linux/system.gyp:ssl',
+            '../build/linux/system.gyp:nss',
           ],
         }],
         ['OS=="mac"', {
@@ -2844,7 +2843,7 @@
         }],
         ['OS=="linux"', {
           'dependencies': [
-            '../build/linux/system.gyp:ssl',
+            '../build/linux/system.gyp:nss',
           ],
         }],
         ['OS=="mac"', {
@@ -2977,7 +2976,7 @@
       'conditions': [
         ['OS=="linux"', {
           'dependencies': [
-            '../build/linux/system.gyp:ssl',
+            '../build/linux/system.gyp:nss',
           ],
         }],
         ['OS=="mac"', {
@@ -3077,7 +3076,7 @@
       'conditions': [
         ['OS=="linux"', {
           'dependencies': [
-            '../build/linux/system.gyp:ssl',
+            '../build/linux/system.gyp:nss',
           ],
         }],
         ['OS=="mac"', {
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi
index d946a69..59ff235 100644
--- a/chrome/chrome_tests_unit.gypi
+++ b/chrome/chrome_tests_unit.gypi
@@ -2037,7 +2037,7 @@
         }],
         ['OS=="linux"', {
           'dependencies': [
-            '../build/linux/system.gyp:ssl',
+            '../build/linux/system.gyp:nss',
           ],
         }],
         ['enable_print_preview==1', {
@@ -2542,7 +2542,7 @@
         }],
         ['OS=="linux"', {
           'dependencies': [
-            '../build/linux/system.gyp:ssl',
+            '../build/linux/system.gyp:nss',
           ],
         }],
         # Only add this test for 64 bit builds because otherwise we need the 32
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index 4fa85eb3..95973fd 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -1062,6 +1062,9 @@
 // Specify the initial window size: --window-size=w,h
 const char kWindowSize[]                    = "window-size";
 
+// Specify the initial window workspace: --window-workspace=id
+const char kWindowWorkspace[]               = "window-workspace";
+
 // Uses WinHTTP to fetch and evaluate PAC scripts. Otherwise the default is to
 // use Chromium's network stack to fetch, and V8 to evaluate.
 const char kWinHttpProxyResolver[]          = "winhttp-proxy-resolver";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index ca0df6e..588aaaf 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -284,6 +284,7 @@
 extern const char kVersion[];
 extern const char kWindowPosition[];
 extern const char kWindowSize[];
+extern const char kWindowWorkspace[];
 extern const char kWinHttpProxyResolver[];
 extern const char kWinJumplistAction[];
 
diff --git a/chrome/common/chrome_utility_messages.h b/chrome/common/chrome_utility_messages.h
index 0cd82de..99af34bc 100644
--- a/chrome/common/chrome_utility_messages.h
+++ b/chrome/common/chrome_utility_messages.h
@@ -181,14 +181,6 @@
 #endif  // defined(FULL_SAFE_BROWSING)
 
 #if defined(OS_WIN)
-// Invokes ui::base::win::OpenFileViaShell from the utility process.
-IPC_MESSAGE_CONTROL1(ChromeUtilityMsg_OpenFileViaShell,
-                     base::FilePath /* full_path */)
-
-// Invokes ui::base::win::OpenFolderViaShell from the utility process.
-IPC_MESSAGE_CONTROL1(ChromeUtilityMsg_OpenFolderViaShell,
-                     base::FilePath /* full_path */)
-
 // Instructs the utility process to invoke GetOpenFileName. |owner| is the
 // parent of the modal dialog, |flags| are OFN_* flags. |filter| constrains the
 // user's file choices. |initial_directory| and |filename| select the directory
diff --git a/chrome/common/crash_keys.cc b/chrome/common/crash_keys.cc
index 99efb58..ef74b63 100644
--- a/chrome/common/crash_keys.cc
+++ b/chrome/common/crash_keys.cc
@@ -183,6 +183,11 @@
     { "initrf_root_is_in_same_site_instance_as_parent", kSmallSize},
     { "initrf_root_process_is_live", kSmallSize},
     { "initrf_root_proxy_is_live", kSmallSize},
+
+    // Temporary for https://crbug.com/600441
+    { "cookie_url", kSmallSize },
+    { "cookie_first_party", kSmallSize },
+    { "security_policy_origin_lock", kSmallSize },
   };
 
   // This dynamic set of keys is used for sets of key value pairs when gathering
diff --git a/chrome/common/extensions/api/feedback_private.idl b/chrome/common/extensions/api/feedback_private.idl
index 54990c3..2d6e4b3b 100644
--- a/chrome/common/extensions/api/feedback_private.idl
+++ b/chrome/common/extensions/api/feedback_private.idl
@@ -23,7 +23,11 @@
 
     // Flow on the ChromeOS login screen. URL entry, file attaching and landing
     // page is disabled for this flow.
-    login
+    login,
+
+    // Flow where a prompt to download the Chrome Cleanup Tool is displayed
+    // prior to showing the feedback form.
+    showSrtPrompt
   };
 
   dictionary FeedbackInfo {
@@ -72,6 +76,18 @@
   // Status of the sending of a feedback report.
   enum Status {success, delayed};
 
+  // Result of presenting the user with a prompt to download SRT.
+  enum SrtPromptResult {
+    // User clicked the "Learn More" button.
+    accepted,
+
+    // User declined the prompt and proceeded to the feedback page.
+    declined,
+
+    // User closed the window altogether.
+    closed
+  };
+
   callback GetUserEmailCallback = void(DOMString email);
   callback GetSystemInformationCallback =
       void(SystemInformation[] systemInformation);
@@ -93,6 +109,10 @@
     // strings as a dictionary mapping from string identifier to the
     // translated string to use in the feedback app UI.
     static void getStrings(GetStringsCallback callback);
+
+    // Logs whether the user accepted a prompt to try the Software Removal
+    // Tool.
+    static void logSrtPromptResult(SrtPromptResult result);
   };
 
   interface Events {
diff --git a/chrome/installer/gcapi/gcapi.cc b/chrome/installer/gcapi/gcapi.cc
index f00ec0d..1617dd2 100644
--- a/chrome/installer/gcapi/gcapi.cc
+++ b/chrome/installer/gcapi/gcapi.cc
@@ -227,27 +227,16 @@
       RegKeyHasC1F(HKEY_LOCAL_MACHINE, kC1FPendingKey);
 }
 
-enum WindowsVersion {
-  VERSION_BELOW_XP_SP2,
-  VERSION_XP_SP2_UP_TO_VISTA,  // "but not including"
-  VERSION_VISTA_OR_HIGHER,
-};
-WindowsVersion GetWindowsVersion() {
+bool IsWindowsVersionSupported() {
   OSVERSIONINFOEX version_info = { sizeof version_info };
   GetVersionEx(reinterpret_cast<OSVERSIONINFO*>(&version_info));
 
-  // Windows Vista is version 6.0.
-  if (version_info.dwMajorVersion >= 6)
-    return VERSION_VISTA_OR_HIGHER;
+  // Windows 7 is version 6.1.
+  if (version_info.dwMajorVersion > 6 ||
+      (version_info.dwMajorVersion == 6 && version_info.dwMinorVersion > 0))
+    return true;
 
-  // Windows XP is version 5.1.  (5.2 is Windows Server 2003/XP Pro x64.)
-  if ((version_info.dwMajorVersion < 5) || (version_info.dwMinorVersion < 1))
-    return VERSION_BELOW_XP_SP2;
-
-  // For XP itself, we only support SP2 and above.
-  return ((version_info.dwMinorVersion > 1) ||
-          (version_info.wServicePackMajor >= 2)) ?
-      VERSION_XP_SP2_UP_TO_VISTA : VERSION_BELOW_XP_SP2;
+  return false;
 }
 
 // Note this function should not be called on old Windows versions where these
@@ -297,8 +286,7 @@
 
 bool IsRunningElevated() {
   // This method should be called only for Vista or later.
-  if ((GetWindowsVersion() < VERSION_VISTA_OR_HIGHER) ||
-      !VerifyAdminGroup())
+  if (!IsWindowsVersionSupported() || !VerifyAdminGroup())
     return false;
 
   HANDLE process_token;
@@ -406,9 +394,9 @@
                                               DWORD* reasons) {
   DWORD local_reasons = 0;
 
-  WindowsVersion windows_version = GetWindowsVersion();
+  bool is_windows_version_supported = IsWindowsVersionSupported();
   // System requirements?
-  if (windows_version == VERSION_BELOW_XP_SP2)
+  if (!is_windows_version_supported)
     local_reasons |= GCCC_ERROR_OSNOTSUPPORTED;
 
   if (IsChromeInstalled(HKEY_LOCAL_MACHINE))
@@ -422,11 +410,10 @@
     // GCAPI is being invoked from an elevated shell, or in admin mode
     if (!VerifyHKLMAccess()) {
     local_reasons |= GCCC_ERROR_ACCESSDENIED;
-    } else if ((windows_version == VERSION_VISTA_OR_HIGHER) &&
-         !VerifyAdminGroup()) {
-    // For Vista or later check for elevation since even for admin user we could
-    // be running in non-elevated mode. We require integrity level High.
-    local_reasons |= GCCC_ERROR_INTEGRITYLEVEL;
+    } else if (is_windows_version_supported && !VerifyAdminGroup()) {
+      // For Vista or later check for elevation since even for admin user we
+      // could be running in non-elevated mode. We require integrity level High.
+      local_reasons |= GCCC_ERROR_INTEGRITYLEVEL;
     }
   }
 
diff --git a/chrome/installer/setup/install.cc b/chrome/installer/setup/install.cc
index fa288164..af966232 100644
--- a/chrome/installer/setup/install.cc
+++ b/chrome/installer/setup/install.cc
@@ -184,7 +184,8 @@
     const base::FilePath& src_path,
     const base::FilePath& temp_path,
     const Version& new_version,
-    std::unique_ptr<Version>* current_version) {
+    std::unique_ptr<Version>* current_version,
+    bool is_downgrade_allowed) {
   DCHECK(current_version);
 
   installer_state.UpdateStage(installer::BUILDING);
@@ -236,8 +237,9 @@
     return installer::INSTALL_REPAIRED;
   }
 
+  bool new_chrome_exe_exists = base::PathExists(new_chrome_exe);
   if (new_version > **current_version) {
-    if (base::PathExists(new_chrome_exe)) {
+    if (new_chrome_exe_exists) {
       VLOG(1) << "Version updated to " << new_version
               << " while running " << **current_version;
       return installer::IN_USE_UPDATED;
@@ -246,6 +248,16 @@
     return installer::NEW_VERSION_UPDATED;
   }
 
+  if (is_downgrade_allowed) {
+    if (new_chrome_exe_exists) {
+      VLOG(1) << "Version downgrades to " << new_version << " while running "
+              << **current_version;
+      return installer::IN_USE_DOWNGRADE;
+    }
+    VLOG(1) << "Version downgrades to " << new_version;
+    return installer::OLD_VERSION_DOWNGRADE;
+  }
+
   LOG(ERROR) << "Not sure how we got here while updating"
              << ", new version: " << new_version
              << ", old version: " << **current_version;
@@ -582,9 +594,10 @@
   CreateVisualElementsManifest(src_path, new_version);
 
   std::unique_ptr<Version> existing_version;
-  InstallStatus result = InstallNewVersion(original_state, installer_state,
-      setup_path, archive_path, src_path, install_temp_path, new_version,
-      &existing_version);
+  InstallStatus result =
+      InstallNewVersion(original_state, installer_state, setup_path,
+                        archive_path, src_path, install_temp_path, new_version,
+                        &existing_version, IsDowngradeAllowed(prefs));
 
   // TODO(robertshield): Everything below this line should instead be captured
   // by WorkItems.
@@ -646,8 +659,8 @@
       // force it here because the master_preferences file will not get copied
       // into the build.
       bool force_chrome_default_for_user = false;
-      if (result == NEW_VERSION_UPDATED ||
-          result == INSTALL_REPAIRED) {
+      if (result == NEW_VERSION_UPDATED || result == INSTALL_REPAIRED ||
+          result == OLD_VERSION_DOWNGRADE || result == IN_USE_DOWNGRADE) {
         prefs.GetBool(master_preferences::kMakeChromeDefaultForUser,
                       &force_chrome_default_for_user);
       }
diff --git a/chrome/installer/setup/setup_main.cc b/chrome/installer/setup/setup_main.cc
index 5e05535..f280794 100644
--- a/chrome/installer/setup/setup_main.cc
+++ b/chrome/installer/setup/setup_main.cc
@@ -1504,32 +1504,34 @@
     VLOG(1) << "version to install: " << installer_version->GetString();
     bool proceed_with_installation = true;
 
-    uint32_t higher_products = 0;
-    static_assert(sizeof(higher_products) * 8 > BrowserDistribution::NUM_TYPES,
-                  "too many distribution types");
-    const Products& products = installer_state.products();
-    for (Products::const_iterator it = products.begin(); it < products.end();
-         ++it) {
-      const Product& product = **it;
-      const ProductState* product_state =
-          original_state.GetProductState(system_install,
-                                         product.distribution()->GetType());
-      if (product_state != NULL &&
-          (product_state->version().CompareTo(*installer_version) > 0)) {
-        LOG(ERROR) << "Higher version of "
-                   << product.distribution()->GetDisplayName()
-                   << " is already installed.";
-        higher_products |= (1 << product.distribution()->GetType());
+    if (!IsDowngradeAllowed(prefs)) {
+      uint32_t higher_products = 0;
+      static_assert(
+          sizeof(higher_products) * 8 > BrowserDistribution::NUM_TYPES,
+          "too many distribution types");
+      const Products& products = installer_state.products();
+      for (Products::const_iterator it = products.begin(); it < products.end();
+           ++it) {
+        const Product& product = **it;
+        const ProductState* product_state = original_state.GetProductState(
+            system_install, product.distribution()->GetType());
+        if (product_state != NULL &&
+            (product_state->version().CompareTo(*installer_version) > 0)) {
+          LOG(ERROR) << "Higher version of "
+                     << product.distribution()->GetDisplayName()
+                     << " is already installed.";
+          higher_products |= (1 << product.distribution()->GetType());
+        }
       }
-    }
 
-    if (higher_products != 0) {
-      static_assert(BrowserDistribution::NUM_TYPES == 3,
-                    "add support for new products here");
-      int message_id = IDS_INSTALL_HIGHER_VERSION_BASE;
-      proceed_with_installation = false;
-      install_status = HIGHER_VERSION_EXISTS;
-      installer_state.WriteInstallerResult(install_status, message_id, NULL);
+      if (higher_products != 0) {
+        static_assert(BrowserDistribution::NUM_TYPES == 3,
+                      "add support for new products here");
+        int message_id = IDS_INSTALL_HIGHER_VERSION_BASE;
+        proceed_with_installation = false;
+        install_status = HIGHER_VERSION_EXISTS;
+        installer_state.WriteInstallerResult(install_status, message_id, NULL);
+      }
     }
 
     if (proceed_with_installation) {
diff --git a/chrome/installer/setup/setup_util.cc b/chrome/installer/setup/setup_util.cc
index 93826c8..2ff7b1d6 100644
--- a/chrome/installer/setup/setup_util.cc
+++ b/chrome/installer/setup/setup_util.cc
@@ -12,6 +12,7 @@
 #include <algorithm>
 #include <iterator>
 #include <set>
+#include <string>
 
 #include "base/command_line.h"
 #include "base/cpu.h"
@@ -31,6 +32,8 @@
 #include "chrome/installer/util/google_update_constants.h"
 #include "chrome/installer/util/installation_state.h"
 #include "chrome/installer/util/installer_state.h"
+#include "chrome/installer/util/master_preferences.h"
+#include "chrome/installer/util/master_preferences_constants.h"
 #include "chrome/installer/util/util_constants.h"
 #include "courgette/courgette.h"
 #include "courgette/third_party/bsdiff.h"
@@ -540,6 +543,12 @@
   return squid;
 }
 
+bool IsDowngradeAllowed(const MasterPreferences& prefs) {
+  bool allow_downgrade = false;
+  return prefs.GetBool(master_preferences::kAllowDowngrade, &allow_downgrade) &&
+         allow_downgrade;
+}
+
 ScopedTokenPrivilege::ScopedTokenPrivilege(const wchar_t* privilege_name)
     : is_enabled_(false) {
   HANDLE temp_handle;
diff --git a/chrome/installer/setup/setup_util.h b/chrome/installer/setup/setup_util.h
index c6ab661..c48a0b74 100644
--- a/chrome/installer/setup/setup_util.h
+++ b/chrome/installer/setup/setup_util.h
@@ -33,6 +33,7 @@
 class InstallationState;
 class InstallerState;
 class ProductState;
+class MasterPreferences;
 
 // Applies a patch file to source file using Courgette. Returns 0 in case of
 // success. In case of errors, it returns kCourgetteErrorOffset + a Courgette
@@ -120,6 +121,9 @@
 // registry entries.
 base::string16 GuidToSquid(const base::string16& guid);
 
+// Returns true if downgrade is allowed by installer data.
+bool IsDowngradeAllowed(const MasterPreferences& prefs);
+
 // This class will enable the privilege defined by |privilege_name| on the
 // current process' token. The privilege will be disabled upon the
 // ScopedTokenPrivilege's destruction (unless it was already enabled when the
diff --git a/chrome/installer/util/install_util.cc b/chrome/installer/util/install_util.cc
index c3e32d92..8b6dfa7 100644
--- a/chrome/installer/util/install_util.cc
+++ b/chrome/installer/util/install_util.cc
@@ -575,6 +575,8 @@
     case installer::NEW_VERSION_UPDATED:
     case installer::IN_USE_UPDATED:
     case installer::UNUSED_BINARIES_UNINSTALLED:
+    case installer::OLD_VERSION_DOWNGRADE:
+    case installer::IN_USE_DOWNGRADE:
       return 0;
     default:
       return status;
diff --git a/chrome/installer/util/master_preferences_constants.cc b/chrome/installer/util/master_preferences_constants.cc
index 657da75..27eeed8 100644
--- a/chrome/installer/util/master_preferences_constants.cc
+++ b/chrome/installer/util/master_preferences_constants.cc
@@ -42,5 +42,7 @@
   const char kSystemLevel[] = "system_level";
   const char kVerboseLogging[] = "verbose_logging";
   const char kExtensionsBlock[] = "extensions.settings";
+  const char kAllowDowngrade[] = "allow_downgrade";
+
 }  // namespace master_preferences
 }  // namespace installer
diff --git a/chrome/installer/util/master_preferences_constants.h b/chrome/installer/util/master_preferences_constants.h
index c2e1c9f4..d49947b 100644
--- a/chrome/installer/util/master_preferences_constants.h
+++ b/chrome/installer/util/master_preferences_constants.h
@@ -92,6 +92,9 @@
 extern const char kVerboseLogging[];
 // Name of the block that contains the extensions on the master preferences.
 extern const char kExtensionsBlock[];
+// Boolean. Allow Chrome to be downgraded to a previous version if true.
+extern const char kAllowDowngrade[];
+
 }  // namespace master_preferences
 }  // namespace installer
 
diff --git a/chrome/installer/util/util_constants.h b/chrome/installer/util/util_constants.h
index 13c905d..59151c35 100644
--- a/chrome/installer/util/util_constants.h
+++ b/chrome/installer/util/util_constants.h
@@ -88,8 +88,12 @@
   REENABLE_UPDATES_FAILED = 56,  // Autoupdates could not be enabled.
   UNPACKING_FAILED     = 57,  // Unpacking the (possibly patched) uncompressed
                               // archive failed.
+  IN_USE_DOWNGRADE     = 58,  // Successfully downgrade chrome but current
+                              // version is still running.
+  OLD_VERSION_DOWNGRADE = 59,  // Successfully downgrade chrome to an older
+                               // version.
 
-  MAX_INSTALL_STATUS = 58,    // Bump this out to make space for new results.
+  MAX_INSTALL_STATUS   = 60,  // Bump this out to make space for new results.
 };
 
 // The type of an update archive.
diff --git a/chrome/renderer/media/cast_transport_ipc.cc b/chrome/renderer/media/cast_transport_ipc.cc
index 4b0ef6b..ed89d53 100644
--- a/chrome/renderer/media/cast_transport_ipc.cc
+++ b/chrome/renderer/media/cast_transport_ipc.cc
@@ -14,11 +14,6 @@
 #include "ipc/ipc_channel_proxy.h"
 #include "media/cast/cast_sender.h"
 
-CastTransportIPC::ClientCallbacks::ClientCallbacks() {}
-CastTransportIPC::ClientCallbacks::ClientCallbacks(
-    const ClientCallbacks& other) = default;
-CastTransportIPC::ClientCallbacks::~ClientCallbacks() {}
-
 CastTransportIPC::CastTransportIPC(
     const net::IPEndPoint& local_end_point,
     const net::IPEndPoint& remote_end_point,
@@ -45,23 +40,17 @@
 
 void CastTransportIPC::InitializeAudio(
     const media::cast::CastTransportRtpConfig& config,
-    const media::cast::RtcpCastMessageCallback& cast_message_cb,
-    const media::cast::RtcpRttCallback& rtt_cb,
-    const media::cast::RtcpPliCallback& pli_cb) {
-  clients_[config.ssrc].cast_message_cb = cast_message_cb;
-  clients_[config.ssrc].rtt_cb = rtt_cb;
-  clients_[config.ssrc].pli_cb = pli_cb;
+    std::unique_ptr<media::cast::RtcpObserver> rtcp_observer) {
+  DCHECK(clients_.find(config.ssrc) == clients_.end());
+  clients_[config.ssrc] = std::move(rtcp_observer);
   Send(new CastHostMsg_InitializeAudio(channel_id_, config));
 }
 
 void CastTransportIPC::InitializeVideo(
     const media::cast::CastTransportRtpConfig& config,
-    const media::cast::RtcpCastMessageCallback& cast_message_cb,
-    const media::cast::RtcpRttCallback& rtt_cb,
-    const media::cast::RtcpPliCallback& pli_cb) {
-  clients_[config.ssrc].cast_message_cb = cast_message_cb;
-  clients_[config.ssrc].rtt_cb = rtt_cb;
-  clients_[config.ssrc].pli_cb = pli_cb;
+    std::unique_ptr<media::cast::RtcpObserver> rtcp_observer) {
+  DCHECK(clients_.find(config.ssrc) == clients_.end());
+  clients_[config.ssrc] = std::move(rtcp_observer);
   Send(new CastHostMsg_InitializeVideo(channel_id_, config));
 }
 
@@ -157,8 +146,7 @@
     LOG(ERROR) << "Received RTT report for unknown SSRC: " << rtp_sender_ssrc;
     return;
   }
-  if (!it->second.rtt_cb.is_null())
-    it->second.rtt_cb.Run(rtt);
+  it->second->OnReceivedRtt(rtt);
 }
 
 void CastTransportIPC::OnRtcpCastMessage(
@@ -169,9 +157,7 @@
     LOG(ERROR) << "Received cast message for unknown SSRC: " << rtp_sender_ssrc;
     return;
   }
-  if (it->second.cast_message_cb.is_null())
-    return;
-  it->second.cast_message_cb.Run(cast_message);
+  it->second->OnReceivedCastMessage(cast_message);
 }
 
 void CastTransportIPC::OnReceivedPli(uint32_t rtp_sender_ssrc) {
@@ -181,8 +167,7 @@
                << rtp_sender_ssrc;
     return;
   }
-  if (!it->second.pli_cb.is_null())
-    it->second.pli_cb.Run();
+  it->second->OnReceivedPli();
 }
 
 void CastTransportIPC::OnReceivedPacket(const media::cast::Packet& packet) {
diff --git a/chrome/renderer/media/cast_transport_ipc.h b/chrome/renderer/media/cast_transport_ipc.h
index bc9c809..d622d74 100644
--- a/chrome/renderer/media/cast_transport_ipc.h
+++ b/chrome/renderer/media/cast_transport_ipc.h
@@ -34,14 +34,10 @@
   // media::cast::CastTransport implementation.
   void InitializeAudio(
       const media::cast::CastTransportRtpConfig& config,
-      const media::cast::RtcpCastMessageCallback& cast_message_cb,
-      const media::cast::RtcpRttCallback& rtt_cb,
-      const media::cast::RtcpPliCallback& pli_cb) override;
+      std::unique_ptr<media::cast::RtcpObserver> rtcp_observer) override;
   void InitializeVideo(
       const media::cast::CastTransportRtpConfig& config,
-      const media::cast::RtcpCastMessageCallback& cast_message_cb,
-      const media::cast::RtcpRttCallback& rtt_cb,
-      const media::cast::RtcpPliCallback& pli_cb) override;
+      std::unique_ptr<media::cast::RtcpObserver> rtcp_observer) override;
   void InsertFrame(uint32_t ssrc,
                    const media::cast::EncodedFrame& frame) override;
   void SendSenderReport(
@@ -77,23 +73,14 @@
   void OnReceivedPacket(const media::cast::Packet& packet);
 
  private:
-  struct ClientCallbacks {
-    ClientCallbacks();
-    ClientCallbacks(const ClientCallbacks& other);
-    ~ClientCallbacks();
-
-    media::cast::RtcpCastMessageCallback cast_message_cb;
-    media::cast::RtcpRttCallback rtt_cb;
-    media::cast::RtcpPliCallback pli_cb;
-  };
-
   void Send(IPC::Message* message);
 
   int32_t channel_id_;
   media::cast::PacketReceiverCallback packet_callback_;
   media::cast::CastTransportStatusCallback status_callback_;
   media::cast::BulkRawEventsCallback raw_events_callback_;
-  typedef std::map<uint32_t, ClientCallbacks> ClientMap;
+  using ClientMap =
+      std::map<uint32_t, std::unique_ptr<media::cast::RtcpObserver>>;
   ClientMap clients_;
 
   DISALLOW_COPY_AND_ASSIGN(CastTransportIPC);
diff --git a/chrome/renderer/pepper/pepper_flash_font_file_host.cc b/chrome/renderer/pepper/pepper_flash_font_file_host.cc
index aed27bf..e5a6fb28 100644
--- a/chrome/renderer/pepper/pepper_flash_font_file_host.cc
+++ b/chrome/renderer/pepper/pepper_flash_font_file_host.cc
@@ -41,8 +41,8 @@
   SkFontStyle style(weight, SkFontStyle::kNormal_Width,
                     description.italic ? SkFontStyle::kItalic_Slant
                                        : SkFontStyle::kUpright_Slant);
-  skia::RefPtr<SkFontMgr> font_mgr = skia::AdoptRef(SkFontMgr::RefDefault());
-  typeface_ = skia::AdoptRef(
+  sk_sp<SkFontMgr> font_mgr(SkFontMgr::RefDefault());
+  typeface_ = sk_sp<SkTypeface>(
       font_mgr->matchFamilyStyle(description.face.c_str(), style));
 #endif  // defined(OS_LINUX) || defined(OS_OPENBSD)
 }
diff --git a/chrome/renderer/pepper/pepper_flash_font_file_host.h b/chrome/renderer/pepper/pepper_flash_font_file_host.h
index 07dcb62..3e9ba7d 100644
--- a/chrome/renderer/pepper/pepper_flash_font_file_host.h
+++ b/chrome/renderer/pepper/pepper_flash_font_file_host.h
@@ -17,7 +17,7 @@
 #if defined(OS_LINUX) || defined(OS_OPENBSD)
 #include "base/files/scoped_file.h"
 #elif defined(OS_WIN)
-#include "skia/ext/refptr.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
 #include "third_party/skia/include/core/SkTypeface.h"
 #endif
 
@@ -53,7 +53,7 @@
 #if defined(OS_LINUX) || defined(OS_OPENBSD)
   base::ScopedFD fd_;
 #elif defined(OS_WIN)
-  skia::RefPtr<SkTypeface> typeface_;
+  sk_sp<SkTypeface> typeface_;
 #endif
 
   DISALLOW_COPY_AND_ASSIGN(PepperFlashFontFileHost);
diff --git a/chrome/renderer/pepper/pepper_flash_renderer_host.cc b/chrome/renderer/pepper/pepper_flash_renderer_host.cc
index f270407..43d9f81c 100644
--- a/chrome/renderer/pepper/pepper_flash_renderer_host.cc
+++ b/chrome/renderer/pepper/pepper_flash_renderer_host.cc
@@ -29,7 +29,6 @@
 #include "ppapi/thunk/enter.h"
 #include "ppapi/thunk/ppb_image_data_api.h"
 #include "skia/ext/platform_canvas.h"
-#include "skia/ext/refptr.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkMatrix.h"
 #include "third_party/skia/include/core/SkPaint.h"
@@ -205,14 +204,13 @@
       params.glyph_indices.empty())
     return PP_ERROR_FAILED;
 
-  // Set up the typeface.
   int style = SkTypeface::kNormal;
   if (static_cast<PP_BrowserFont_Trusted_Weight>(params.font_desc.weight) >=
       PP_BROWSERFONT_TRUSTED_WEIGHT_BOLD)
     style |= SkTypeface::kBold;
   if (params.font_desc.italic)
     style |= SkTypeface::kItalic;
-  skia::RefPtr<SkTypeface> typeface = skia::AdoptRef(SkTypeface::CreateFromName(
+  sk_sp<SkTypeface> typeface(SkTypeface::CreateFromName(
       params.font_desc.face.c_str(), static_cast<SkTypeface::Style>(style)));
   if (!typeface)
     return PP_ERROR_FAILED;
@@ -222,7 +220,6 @@
   if (enter.failed())
     return PP_ERROR_FAILED;
 
-  // Set up the canvas.
   PPB_ImageData_API* image = static_cast<PPB_ImageData_API*>(enter.object());
   SkCanvas* canvas = image->GetCanvas();
   bool needs_unmapping = false;
@@ -243,7 +240,6 @@
       SkIntToScalar(params.clip.point.y + params.clip.size.height)};
   canvas->clipRect(clip_rect);
 
-  // Convert & set the matrix.
   SkMatrix matrix;
   matrix.set(SkMatrix::kMScaleX, SkFloatToScalar(params.transformation[0][0]));
   matrix.set(SkMatrix::kMSkewX, SkFloatToScalar(params.transformation[0][1]));
@@ -262,7 +258,7 @@
   paint.setAntiAlias(true);
   paint.setHinting(SkPaint::kFull_Hinting);
   paint.setTextSize(SkIntToScalar(params.font_desc.size));
-  paint.setTypeface(typeface.get());  // Takes a ref and manages lifetime.
+  paint.setTypeface(std::move(typeface));
   if (params.allow_subpixel_aa) {
     paint.setSubpixelText(true);
     paint.setLCDRenderText(true);
diff --git a/chrome/renderer/resources/extensions/automation/automation_node.js b/chrome/renderer/resources/extensions/automation/automation_node.js
index f36a2b9..a2d1ecd 100644
--- a/chrome/renderer/resources/extensions/automation/automation_node.js
+++ b/chrome/renderer/resources/extensions/automation/automation_node.js
@@ -631,7 +631,7 @@
     'textStyle'];
 
 var nodeRefAttributes = [
-    ['activedescendantId', 'activedescendant'],
+    ['activedescendantId', 'activeDescendant'],
     ['tableColumnHeaderId', 'tableColumnHeader'],
     ['tableHeaderId', 'tableHeader'],
     ['tableRowHeaderId', 'tableRowHeader'],
diff --git a/chrome/service/service_utility_process_host.cc b/chrome/service/service_utility_process_host.cc
index f3843c10..3b97904 100644
--- a/chrome/service/service_utility_process_host.cc
+++ b/chrome/service/service_utility_process_host.cc
@@ -244,12 +244,18 @@
   if (no_sandbox) {
     cmd_line->AppendSwitch(switches::kNoSandbox);
     process_ = base::LaunchProcess(*cmd_line, base::LaunchOptions());
+    return process_.IsValid();
   } else {
     ServiceSandboxedProcessLauncherDelegate delegate;
-    process_ = content::StartSandboxedProcess(
-        &delegate, cmd_line, base::HandlesToInheritVector());
+    base::Process process;
+    sandbox::ResultCode result = content::StartSandboxedProcess(
+        &delegate, cmd_line, base::HandlesToInheritVector(), &process);
+    if (result == sandbox::SBOX_ALL_OK) {
+      process_ = std::move(process);
+      return true;
+    }
+    return false;
   }
-  return process_.IsValid();
 }
 
 bool ServiceUtilityProcessHost::Send(IPC::Message* msg) {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 21ad3fa..46e52b4 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1886,6 +1886,11 @@
             ".",
             "//chrome")
     deps += [ ":test_proto" ]
+
+    if (is_mac) {
+      deps += [ ":mac_safe_browsing_test_data" ]
+      data += [ "$root_out_dir/test_data/chrome/safe_browsing_dmg/" ]
+    }
   } else if (safe_browsing_mode == 2) {
     sources += rebase_path(
             chrome_tests_unit_gypi_values.chrome_unit_tests_shared_safe_browsing_sources,
@@ -2169,6 +2174,54 @@
   }
 }
 
+if (safe_browsing_mode == 1 && is_mac) {
+  action("mac_safe_browsing_test_data") {
+    script = "//build/gn_run_binary.py"
+    shell_script = "//chrome/test/data/safe_browsing/dmg/generate_test_data.sh"
+    inputs = [
+      script,
+      shell_script,
+      "data/safe_browsing/dmg/make_hfs.sh",
+      "data/safe_browsing/mach_o/executablefat",
+      "data/safe_browsing/mach_o/lib64.dylib",
+    ]
+    _output_dir = "$root_out_dir/test_data/chrome/safe_browsing_dmg"
+    outputs = [
+      "$_output_dir/dmg_UDBZ_GPTSPUD.dmg",
+      "$_output_dir/dmg_UDBZ_NONE.dmg",
+      "$_output_dir/dmg_UDBZ_SPUD.dmg",
+      "$_output_dir/dmg_UDCO_GPTSPUD.dmg",
+      "$_output_dir/dmg_UDCO_NONE.dmg",
+      "$_output_dir/dmg_UDCO_SPUD.dmg",
+      "$_output_dir/dmg_UDRO_GPTSPUD.dmg",
+      "$_output_dir/dmg_UDRO_NONE.dmg",
+      "$_output_dir/dmg_UDRO_SPUD.dmg",
+      "$_output_dir/dmg_UDRW_GPTSPUD.dmg",
+      "$_output_dir/dmg_UDRW_NONE.dmg",
+      "$_output_dir/dmg_UDRW_SPUD.dmg",
+      "$_output_dir/dmg_UDSP_GPTSPUD.sparseimage",
+      "$_output_dir/dmg_UDSP_NONE.sparseimage",
+      "$_output_dir/dmg_UDSP_SPUD.sparseimage",
+      "$_output_dir/dmg_UDTO_GPTSPUD.cdr",
+      "$_output_dir/dmg_UDTO_NONE.cdr",
+      "$_output_dir/dmg_UDTO_SPUD.cdr",
+      "$_output_dir/dmg_UDZO_GPTSPUD.dmg",
+      "$_output_dir/dmg_UDZO_NONE.dmg",
+      "$_output_dir/dmg_UDZO_SPUD.dmg",
+      "$_output_dir/dmg_UFBI_GPTSPUD.dmg",
+      "$_output_dir/dmg_UFBI_NONE.dmg",
+      "$_output_dir/dmg_UFBI_SPUD.dmg",
+      "$_output_dir/hfs_plus.img",
+      "$_output_dir/hfsx_case_sensitive.img",
+      "$_output_dir/mach_o_in_dmg.dmg",
+    ]
+    args = [
+      rebase_path(shell_script, root_out_dir),
+      rebase_path(_output_dir, root_out_dir),
+    ]
+  }
+}
+
 if (is_win || is_mac || is_linux) {
   # TODO(GYP): Figure out which of these work and are needed on other
   # platforms.
diff --git a/chrome/test/base/test_browser_window.cc b/chrome/test/base/test_browser_window.cc
index 6aa32a922..29e4164 100644
--- a/chrome/test/base/test_browser_window.cc
+++ b/chrome/test/base/test_browser_window.cc
@@ -194,6 +194,10 @@
   return nullptr;
 }
 
+std::string TestBrowserWindow::GetWorkspace() const {
+  return std::string();
+}
+
 // TestBrowserWindowOwner -----------------------------------------------------
 
 TestBrowserWindowOwner::TestBrowserWindowOwner(TestBrowserWindow* window)
diff --git a/chrome/test/base/test_browser_window.h b/chrome/test/base/test_browser_window.h
index 089004d..dee8634 100644
--- a/chrome/test/base/test_browser_window.h
+++ b/chrome/test/base/test_browser_window.h
@@ -142,6 +142,7 @@
       const extensions::Extension* extension,
       const base::Callback<void(ImeWarningBubblePermissionStatus status)>&
           callback) override {}
+  std::string GetWorkspace() const override;
 
  protected:
   void DestroyBrowser() override {}
diff --git a/chrome/test/data/durable/durability-permissions.html b/chrome/test/data/durable/durability-permissions.html
index 8db22a4d..315ba61 100644
--- a/chrome/test/data/durable/durability-permissions.html
+++ b/chrome/test/data/durable/durability-permissions.html
@@ -2,13 +2,13 @@
 <script>
 
 function checkPermission() {
-  navigator.storage.persistentPermission().then(function(permission) {
-    window.domAutomationController.send(permission);
+  navigator.storage.persisted().then(function(is_persistent) {
+    window.domAutomationController.send(is_persistent);
   });
 }
 
 function requestPermission() {
-  navigator.storage.requestPersistent().then(function(is_persistent) {
+  navigator.storage.persist().then(function(is_persistent) {
     window.domAutomationController.send(is_persistent);
   });
 }
diff --git a/chrome/test/data/extensions/api_test/automation/tests/tabs/attributes.js b/chrome/test/data/extensions/api_test/automation/tests/tabs/attributes.js
index a42184c..3c998a66 100644
--- a/chrome/test/data/extensions/api_test/automation/tests/tabs/attributes.js
+++ b/chrome/test/data/extensions/api_test/automation/tests/tabs/attributes.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-var ActiveDescendantAttribute = [ 'activedescendant' ];
+var ActiveDescendantAttribute = [ 'activeDescendant' ];
 var LinkAttributes = [ 'url' ];
 var DocumentAttributes = [ 'docUrl',
                            'docTitle',
@@ -54,11 +54,11 @@
 
   function testActiveDescendant() {
     var combobox = rootNode.find({ role: 'comboBox' });
-    assertTrue('activedescendant' in combobox,
+    assertTrue('activeDescendant' in combobox,
                'combobox should have an activedescendant attribute');
     var listbox = rootNode.find({ role: 'listBox' });
     var opt6 = listbox.children[5];
-    assertEq(opt6, combobox.activedescendant);
+    assertEq(opt6, combobox.activeDescendant);
     chrome.test.succeed();
   },
 
diff --git a/chrome/test/data/nacl/BUILD.gn b/chrome/test/data/nacl/BUILD.gn
index 8eee2a0..9b8671af 100644
--- a/chrome/test/data/nacl/BUILD.gn
+++ b/chrome/test/data/nacl/BUILD.gn
@@ -586,10 +586,14 @@
       "-Wl,--no-undefined",
 
       # Silence the warning about the unused '-pthread' argument.
+      # TODO(gn): Come up with a way to remove the -pthread flag instead.
       "-Qunused-arguments",
     ]
     defines = [ "NACL_LINUX=1" ]
     include_dirs = [ "../../../.." ]
+
+    # Do not use any sanitizers tools, which require a few symbols.
+    configs -= [ "//build/config/sanitizers:default_sanitizer_flags" ]
     configs += [ ":nonsfi_libc_free_nexe_config" ]
   }
 
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index 060854e..4348a7fd 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -2718,6 +2718,14 @@
     ]
   },
 
+  "LoginVideoCaptureAllowedUrls": {
+    "os": ["chromeos"],
+    "test_policy": { "LoginVideoCaptureAllowedUrls": [ "https://example.com" ] },
+    "pref_mappings": [
+      { "pref": "cros.device.login_video_capture_allowed_urls" }
+    ]
+  },
+
   "----- Chrome Frame policies -------------------------------------------": {},
 
   "ChromeFrameRendererSettings": {
diff --git a/chrome/test/data/webui/md_user_manager/create_profile_tests.js b/chrome/test/data/webui/md_user_manager/create_profile_tests.js
index cd5ad3d..f6b65d25 100644
--- a/chrome/test/data/webui/md_user_manager/create_profile_tests.js
+++ b/chrome/test/data/webui/md_user_manager/create_profile_tests.js
@@ -82,7 +82,7 @@
 
           var dropdownMenu = createProfileElement.$$('paper-dropdown-menu');
           var paperMenu = dropdownMenu.querySelector('paper-menu');
-          assertEquals(createProfileElement.i18n('selectAnAccount'),
+          assertEquals(loadTimeData.getString('selectAnAccount'),
                        paperMenu.selectedItem.textContent.trim());
         });
       });
@@ -131,7 +131,7 @@
         assertFalse(createProfileElement.$$('#message-container').hidden);
         // Error message is set.
         assertEquals(
-            createProfileElement.i18n('custodianAccountNotSelectedError'),
+            loadTimeData.getString('custodianAccountNotSelectedError'),
             createProfileElement.$.message.innerHTML);
       });
 
@@ -158,7 +158,7 @@
               // Message container is visible.
               assertFalse(createProfileElement.$$('#message-container').hidden);
               // Error message is set.
-              var message = createProfileElement.i18n(
+              var message = loadTimeData.getString(
                   'managedProfilesExistingLocalSupervisedUser');
               assertEquals(message, createProfileElement.$.message.innerHTML);
             });
diff --git a/chrome/test/data/webui/md_user_manager/import_supervised_user_tests.js b/chrome/test/data/webui/md_user_manager/import_supervised_user_tests.js
new file mode 100644
index 0000000..c83c208
--- /dev/null
+++ b/chrome/test/data/webui/md_user_manager/import_supervised_user_tests.js
@@ -0,0 +1,156 @@
+// Copyright 2016 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.
+
+cr.define('user_manager.import_supervised_user_tests', function() {
+  function registerTests() {
+    suite('ImportSupervisedUserTests', function() {
+      /** @type {?ImportSupervisedUserElement} */
+      var importElement = null;
+
+      /**
+       * @param {!HTMLElement} element
+       * @return {string}
+       */
+      var getProfileName = function(element) {
+        return element.querySelector('.profile-name').textContent.trim();
+      }
+
+      setup(function() {
+        PolymerTest.clearBody();
+        importElement = document.createElement('import-supervised-user');
+        document.body.appendChild(importElement);
+
+        // Make sure DOM is up to date.
+        Polymer.dom.flush();
+      });
+
+      teardown(function() { importElement.remove(); });
+
+      test('Dialog does not show if no signed-in user is provided', function() {
+        // The dialog is initially not visible.
+        assertFalse(!!importElement.$$('#backdrop'));
+
+        importElement.show(undefined, []);
+        Polymer.dom.flush();
+
+        // The dialog is still not visible.
+        assertFalse(!!importElement.$$('#backdrop'));
+      });
+
+      test('Dialog shows when there are no supervised users', function() {
+        // The dialog is initially not visible.
+        assertFalse(!!importElement.$$('#backdrop'));
+
+        importElement.show({username: 'username',
+                            profilePath: 'path/to/profile'},
+                           []);
+        Polymer.dom.flush();
+
+        // The dialog becomes visible.
+        assertLT(0, importElement.$$('#backdrop').offsetHeight);
+
+        // The correct message is displayed.
+        assertEquals(loadTimeData.getString('noSupervisedUserImportText'),
+                     importElement.$$('#message').textContent.trim());
+
+        var selectorElement = importElement.$$('iron-selector');
+        assertTrue(!!selectorElement);
+
+        // There are no supervised users to choose from.
+        var items = selectorElement.querySelectorAll('.list-item');
+        assertEquals(0, items.length);
+
+        // Simulate clicking 'Cancel'
+        MockInteractions.tap(importElement.$$('#cancel'));
+
+        Polymer.dom.flush();
+        // The dialog is no longer visible.
+        assertEquals(0, importElement.$$('#backdrop').offsetHeight);
+      });
+
+      test('Can import supervised user', function() {
+        return new Promise(function(resolve, reject) {
+          /** @type {!SignedInUser} */
+          var signedInUser = {username: 'username',
+                              profilePath: 'path/to/profile'};
+
+          /** @type {!Array<!SupervisedUser>} */
+          var supervisedUsers = [{name: 'supervised user 1',
+                                  onCurrentDevice: true},
+                                 {name: 'supervised user 3',
+                                  onCurrentDevice: false},
+                                 {name: 'supervised user 2',
+                                  onCurrentDevice: false}];
+
+          // Expect an event to import the selected supervised user to be fired.
+          importElement.addEventListener('import', function(event) {
+            if (event.detail.signedInUser == signedInUser &&
+                event.detail.supervisedUser.name == 'supervised user 2') {
+              Polymer.dom.flush();
+              // The dialog is no longer visible.
+              assertEquals(0, importElement.$$('#backdrop').offsetHeight);
+
+              resolve();
+            }
+          });
+
+          // The dialog is initially not visible.
+          assertFalse(!!importElement.$$('#backdrop'));
+
+          importElement.show(signedInUser, supervisedUsers);
+          Polymer.dom.flush();
+
+          // The dialog becomes visible.
+          assertLT(0, importElement.$$('#backdrop').offsetHeight);
+
+          // The correct message is displayed.
+          assertEquals(loadTimeData.getString('supervisedUserImportText'),
+                       importElement.$$('#message').textContent.trim());
+
+          var selectorElement = importElement.$$('iron-selector');
+          assertTrue(!!selectorElement);
+
+          // Supervised users are ordered correctly (Ones that are not on the
+          // current device appear first, then they are alphabetically order in
+          // ascending order).
+          var items = selectorElement.querySelectorAll('.list-item');
+          assertEquals(3, items.length);
+          assertEquals('supervised user 2', getProfileName(items[0]));
+          assertEquals('supervised user 3', getProfileName(items[1]));
+          assertEquals('supervised user 1', getProfileName(items[2]));
+
+          // Only supervised users that are not on this device are selectable.
+          var selectableItems = selectorElement.querySelectorAll('.selectable');
+          assertEquals(2, selectableItems.length);
+          assertEquals('supervised user 2', getProfileName(selectableItems[0]));
+          assertEquals('supervised user 3', getProfileName(selectableItems[1]));
+
+          // No user is initially selected.
+          assertEquals(-1, selectorElement.selected);
+          // The import button is disabled if no supervised user is selected.
+          assertTrue(importElement.$$('#import').disabled);
+
+          // Simulate selecting the third user which is not selectable.
+          MockInteractions.tap(items[2]);
+          // Confirm no user is selected.
+          assertEquals(-1, selectorElement.selected);
+
+          // Simulate selecting the first user.
+          MockInteractions.tap(items[0]);
+          // Confirm the user is selected.
+          assertEquals(0, selectorElement.selected);
+          // The import button becomes enabled once a user is selected.
+          assertFalse(importElement.$$('#import').disabled);
+
+          // Simulate clicking 'Import'.
+          MockInteractions.tap(importElement.$$('#import'));
+        });
+      });
+    });
+  }
+
+  return {
+    registerTests: registerTests,
+  };
+});
diff --git a/chrome/test/data/webui/md_user_manager/user_manager_browsertest.js b/chrome/test/data/webui/md_user_manager/user_manager_browsertest.js
index 125d0f9..47e0368 100644
--- a/chrome/test/data/webui/md_user_manager/user_manager_browsertest.js
+++ b/chrome/test/data/webui/md_user_manager/user_manager_browsertest.js
@@ -28,6 +28,7 @@
     '../settings/test_browser_proxy.js',
     'control_bar_tests.js',
     'create_profile_tests.js',
+    'import_supervised_user_tests.js',
     'test_profile_browser_proxy.js',
     'user_manager_pages_tests.js',
   ]),
@@ -42,6 +43,7 @@
 
   user_manager.control_bar_tests.registerTests();
   user_manager.create_profile_tests.registerTests();
+  user_manager.import_supervised_user_tests.registerTests();
   user_manager.user_manager_pages_tests.registerTests();
   mocha.run();
 });
diff --git a/chrome/test/data/webui/media_router/issue_banner_tests.js b/chrome/test/data/webui/media_router/issue_banner_tests.js
index 7d9e0cc..a5046b7b 100644
--- a/chrome/test/data/webui/media_router/issue_banner_tests.js
+++ b/chrome/test/data/webui/media_router/issue_banner_tests.js
@@ -166,9 +166,8 @@
       // Tests the issue text. While the UI will show only the blocking or
       // non-blocking interface, the issue's info will be set if specified.
       test('issue text', function() {
-        // |issue| is null. Title text should be empty.
-        assertEquals(null, banner.issue);
-        checkIssueText(banner.issue);
+        // |issue| is initially undefined.
+        assertEquals(undefined, banner.issue);
 
         // Set |issue| to be a blocking issue. Title text should be updated.
         banner.issue = fakeBlockingIssueOne;
diff --git a/chrome/test/data/webui/media_router/media_router_container_filter_tests.js b/chrome/test/data/webui/media_router/media_router_container_filter_tests.js
index b826090..09959eb2 100644
--- a/chrome/test/data/webui/media_router/media_router_container_filter_tests.js
+++ b/chrome/test/data/webui/media_router/media_router_container_filter_tests.js
@@ -135,12 +135,14 @@
       // Tests that focusing the sink search input will cause the container to
       // enter filter view.
       test('focus sink search input', function(done) {
-        MockInteractions.focus(container.$['sink-search-input']);
         setTimeout(function() {
-          checkCurrentView(media_router.MediaRouterView.FILTER);
-          assertEquals(container.$['sink-search-input'],
-                       container.shadowRoot.activeElement);
-          done();
+          MockInteractions.focus(container.$['sink-search-input']);
+          setTimeout(function() {
+            checkCurrentView(media_router.MediaRouterView.FILTER);
+            assertEquals(container.$['sink-search-input'],
+                         container.shadowRoot.activeElement);
+            done();
+          });
         });
       });
 
@@ -160,11 +162,13 @@
       // Tests that pressing the Escape key in the FILTER view returns
       // |container| to the SINK_LIST view.
       test('filter view escape key', function(done) {
-        MockInteractions.tap(container.$['sink-search-icon']);
         setTimeout(function() {
-          pressEscapeOnElement(container);
-          checkCurrentView(media_router.MediaRouterView.SINK_LIST);
-          done();
+          MockInteractions.tap(container.$['sink-search-icon']);
+          setTimeout(function() {
+            pressEscapeOnElement(container);
+            checkCurrentView(media_router.MediaRouterView.SINK_LIST);
+            done();
+          });
         });
       });
 
@@ -172,19 +176,28 @@
       // keyboard focus returns |container| to the SINK_LIST view and focuses
       // the correct sink in the list.
       test('filter view escape key on menu item', function(done) {
-        container.allSinks = fakeSinkList;
-        MockInteractions.tap(container.$['sink-search-icon']);
         setTimeout(function() {
-          var item =
-              container.$$('#search-results').querySelectorAll('paper-item')[1];
-          item.focus();
-          pressEscapeOnElement(item);
-          checkCurrentView(media_router.MediaRouterView.SINK_LIST);
+          container.allSinks = fakeSinkList;
+          MockInteractions.tap(container.$['sink-search-icon']);
           setTimeout(function() {
-            item =
-                container.$['sink-list-view'].querySelectorAll('paper-item')[1];
-            assertTrue(item.focused);
-            done();
+            var item =
+                container.$$('#search-results')
+                    .querySelectorAll('paper-item')[1];
+            item.focus();
+            var focusedSuccess = item.focused;
+            pressEscapeOnElement(item);
+            checkCurrentView(media_router.MediaRouterView.SINK_LIST);
+            setTimeout(function() {
+              item =
+                  container.$$('#sink-list-view')
+                      .querySelectorAll('paper-item')[1];
+              // TODO(crbug.com/608551): This condition handles flakiness around
+              // the search item getting focus earlier. If it doesn't get focus,
+              // the logic that changes focus from a search item to a sink list
+              // item obviously won't do anything.
+              assertEquals(focusedSuccess, item.focused);
+              done();
+            });
           });
         });
       });
@@ -193,18 +206,25 @@
       // not have keyboard focus returns |container| to the SINK_LIST view and
       // leaves focus where it is.
       test('filter view escape key on menu item other focus', function(done) {
-        container.allSinks = fakeSinkList;
-        MockInteractions.tap(container.$['sink-search-icon']);
         setTimeout(function() {
-          var item =
-              container.$$('#search-results').querySelectorAll('paper-item')[1];
-          var closeButton = container.$['container-header'].$['close-button'];
-          closeButton.focus();
-          pressEscapeOnElement(item);
-          checkCurrentView(media_router.MediaRouterView.SINK_LIST);
+          container.allSinks = fakeSinkList;
+          MockInteractions.tap(container.$['sink-search-icon']);
           setTimeout(function() {
-            assertTrue(closeButton.focused);
-            done();
+            var item =
+                container.$$('#search-results')
+                    .querySelectorAll('paper-item')[1];
+            var closeButton = container.$['container-header'].$['close-button'];
+            closeButton.focus();
+            var focusedSuccess = closeButton.focused;
+            pressEscapeOnElement(item);
+            checkCurrentView(media_router.MediaRouterView.SINK_LIST);
+            setTimeout(function() {
+              // TODO(crbug.com/608551): This condition handles flakiness around
+              // the button initially getting focus. If it doesn't get focus
+              // earlier, it obviously shouldn't have it now.
+              assertEquals(focusedSuccess, closeButton.focused);
+              done();
+            });
           });
         });
       });
diff --git a/chrome/test/data/webui/media_router/route_details_tests.js b/chrome/test/data/webui/media_router/route_details_tests.js
index db00144..2d8d074 100644
--- a/chrome/test/data/webui/media_router/route_details_tests.js
+++ b/chrome/test/data/webui/media_router/route_details_tests.js
@@ -108,18 +108,18 @@
         checkSpanText(loadTimeData.getString('stopCastingButtonText')
             .toUpperCase(), 'close-route-button');
         checkSpanText(
-            loadTimeData.getString('startCastingButtonText'),
+            loadTimeData.getString('startCastingButtonText').toUpperCase(),
             'start-casting-to-route-button');
         checkSpanText('', 'route-information');
       });
 
-      // Tests when |route| is null or set.
-      test('route is null or set', function() {
-        // |route| is null.
-        assertEquals(null, details.route);
+      // Tests when |route| is undefined or set.
+      test('route is undefined or set', function() {
+        // |route| is initially undefined.
+        assertEquals(undefined, details.route);
         checkDefaultViewIsShown();
 
-        // Set |route| to be non-null.
+        // Set |route|.
         details.route = fakeRouteOne;
         assertEquals(fakeRouteOne, details.route);
         checkSpanText(loadTimeData.getStringF('castingActivityStatus',
diff --git a/chrome/test/data/webui/settings/privacy_page_test.js b/chrome/test/data/webui/settings/privacy_page_test.js
index 5bbdc24..5453a475 100644
--- a/chrome/test/data/webui/settings/privacy_page_test.js
+++ b/chrome/test/data/webui/settings/privacy_page_test.js
@@ -27,7 +27,10 @@
    * @implements {settings.ClearBrowsingDataBrowserProxy}
    */
   function TestClearBrowsingDataBrowserProxy() {
-    settings.TestBrowserProxy.call(this, ['clearBrowsingData']);
+    settings.TestBrowserProxy.call(this, [
+      'initialize',
+      'clearBrowsingData',
+    ]);
 
     /**
      * The promise to return from |clearBrowsingData|.
@@ -52,6 +55,11 @@
       return this.clearBrowsingDataPromise_ !== null ?
           this.clearBrowsingDataPromise_ : Promise.resolve();
     },
+
+    /** @override */
+    initialize: function() {
+      this.methodCalled('initialize');
+    },
   };
 
   function registerNativeCertificateManagerTests() {
diff --git a/chrome/test/data/webui/util_test.html b/chrome/test/data/webui/util_test.html
index a93b48f..6fdb5512 100644
--- a/chrome/test/data/webui/util_test.html
+++ b/chrome/test/data/webui/util_test.html
@@ -20,14 +20,14 @@
   assertEquals(null, match);
 }
 
-// Test the case where the origin URL is passed.
-function testGetFaviconImageSet_Origin() {
+// Test the case where a non-favicon URL is passed.
+function testGetFaviconImageSet_NonFavicon() {
   var url = 'http://foo.com';
   var expectedDesktop = '-webkit-image-set(' +
-      'url("chrome://favicon/size/16@1x/origin/http://foo.com") 1x, ' +
-      'url("chrome://favicon/size/16@2x/origin/http://foo.com") 2x)';
+      'url("chrome://favicon/size/16@1x/http://foo.com") 1x, ' +
+      'url("chrome://favicon/size/16@2x/http://foo.com") 2x)';
   var expectedOther = '-webkit-image-set(' +
-      'url("chrome://favicon/size/16@1x/origin/http://foo.com") ' +
+      'url("chrome://favicon/size/16@1x/http://foo.com") ' +
       window.devicePixelRatio + 'x)';
 
   var isDesktop = cr.isMac || cr.isChromeOS || cr.isWindows || cr.isLinux;
diff --git a/chrome/test/media_router/OWNERS b/chrome/test/media_router/OWNERS
index 86db59d..22d471d0 100644
--- a/chrome/test/media_router/OWNERS
+++ b/chrome/test/media_router/OWNERS
@@ -1,10 +1,10 @@
-# Owners with committer privileges
-apacible@chromium.org
+# OWNERS with committer privileges.
 imcheng@chromium.org
-kmarshall@chromium.org
+apacible@chromium.org
 mfoltz@chromium.org
+
+# Fallback OWNER, if others are not available.
 wez@chromium.org
 
 # Team members without committer privileges, for potential FYI reviews.
-haibinlu@chromium.org
 leilei@chromium.org
diff --git a/chrome/utility/shell_handler_win.cc b/chrome/utility/shell_handler_win.cc
index 92ae501..6433b99 100644
--- a/chrome/utility/shell_handler_win.cc
+++ b/chrome/utility/shell_handler_win.cc
@@ -12,7 +12,6 @@
 #include "chrome/common/chrome_utility_messages.h"
 #include "content/public/utility/utility_thread.h"
 #include "ui/base/win/open_file_name_win.h"
-#include "ui/base/win/shell.h"
 
 ShellHandler::ShellHandler() {}
 ShellHandler::~ShellHandler() {}
@@ -20,10 +19,6 @@
 bool ShellHandler::OnMessageReceived(const IPC::Message& message) {
   bool handled = true;
   IPC_BEGIN_MESSAGE_MAP(ShellHandler, message)
-    IPC_MESSAGE_HANDLER(ChromeUtilityMsg_OpenFileViaShell,
-                        OnOpenFileViaShell)
-    IPC_MESSAGE_HANDLER(ChromeUtilityMsg_OpenFolderViaShell,
-                        OnOpenFolderViaShell)
     IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetOpenFileName,
                         OnGetOpenFileName)
     IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetSaveFileName,
@@ -33,14 +28,6 @@
   return handled;
 }
 
-void ShellHandler::OnOpenFileViaShell(const base::FilePath& full_path) {
-  ui::win::OpenFileViaShell(full_path);
-}
-
-void ShellHandler::OnOpenFolderViaShell(const base::FilePath& full_path) {
-  ui::win::OpenFolderViaShell(full_path);
-}
-
 void ShellHandler::OnGetOpenFileName(
     HWND owner,
     DWORD flags,
diff --git a/chrome/utility/shell_handler_win.h b/chrome/utility/shell_handler_win.h
index 3647ed4..1276572c 100644
--- a/chrome/utility/shell_handler_win.h
+++ b/chrome/utility/shell_handler_win.h
@@ -36,9 +36,6 @@
   bool OnMessageReceived(const IPC::Message& message) override;
 
  private:
-  void OnOpenFileViaShell(const base::FilePath& full_path);
-  void OnOpenFolderViaShell(const base::FilePath& full_path);
-
   void OnGetOpenFileName(
     HWND owner,
     DWORD flags,
diff --git a/chromecast/graphics/cast_screen.cc b/chromecast/graphics/cast_screen.cc
index db4079fa..b88d75a6 100644
--- a/chromecast/graphics/cast_screen.cc
+++ b/chromecast/graphics/cast_screen.cc
@@ -48,9 +48,9 @@
   return aura::Env::GetInstance()->last_mouse_location();
 }
 
-gfx::NativeWindow CastScreen::GetWindowUnderCursor() {
+bool CastScreen::IsWindowUnderCursor(gfx::NativeWindow window) {
   NOTIMPLEMENTED();
-  return gfx::NativeWindow(nullptr);
+  return false;
 }
 
 gfx::NativeWindow CastScreen::GetWindowAtScreenPoint(const gfx::Point& point) {
diff --git a/chromecast/graphics/cast_screen.h b/chromecast/graphics/cast_screen.h
index 43ca0cc..a8d497c 100644
--- a/chromecast/graphics/cast_screen.h
+++ b/chromecast/graphics/cast_screen.h
@@ -33,7 +33,7 @@
 
   // display::Screen overrides:
   gfx::Point GetCursorScreenPoint() override;
-  gfx::NativeWindow GetWindowUnderCursor() override;
+  bool IsWindowUnderCursor(gfx::NativeWindow window) override;
   gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override;
   int GetNumDisplays() const override;
   std::vector<display::Display> GetAllDisplays() const override;
diff --git a/chromeos/BUILD.gn b/chromeos/BUILD.gn
index 13112ff..6529b17 100644
--- a/chromeos/BUILD.gn
+++ b/chromeos/BUILD.gn
@@ -39,6 +39,7 @@
     "//crypto",
     "//crypto:platform",
     "//google_apis",
+    "//net",
     "//third_party/icu",
     "//third_party/libxml",
     "//third_party/protobuf:protobuf_lite",
@@ -63,8 +64,15 @@
     ":chromeos",
     ":cryptohome_proto",
     ":power_manager_proto",
+  ]
+  deps = [
     ":test_support_without_gmock",
+    "//components/signin/core/account_id",
+    "//dbus:test_support",
+    "//google_apis",
+    "//net:test_support",
     "//testing/gmock",
+    "//testing/gtest",
   ]
   sources = [
     "attestation/mock_attestation_flow.cc",
diff --git a/chromeos/chromeos.gyp b/chromeos/chromeos.gyp
index dde451e8f..3ef4481 100644
--- a/chromeos/chromeos.gyp
+++ b/chromeos/chromeos.gyp
@@ -516,7 +516,7 @@
         '../base/base.gyp:base_i18n',
         '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
         '../build/linux/system.gyp:dbus',
-        '../build/linux/system.gyp:ssl',
+        '../build/linux/system.gyp:nss',
         '../components/components.gyp:cloud_policy_proto',
         '../components/components.gyp:device_event_log_component',
         '../components/components.gyp:onc_component',
@@ -648,7 +648,7 @@
         '../base/base.gyp:run_all_unittests',
         '../base/base.gyp:test_support_base',
         '../build/linux/system.gyp:dbus',
-        '../build/linux/system.gyp:ssl',
+        '../build/linux/system.gyp:nss',
         '../components/components.gyp:onc_component',
         '../components/components.gyp:proxy_config',
         '../components/components.gyp:signin_core_account_id',
diff --git a/chromeos/chromeos_switches.cc b/chromeos/chromeos_switches.cc
index 7d53d26..f0c55b2 100644
--- a/chromeos/chromeos_switches.cc
+++ b/chromeos/chromeos_switches.cc
@@ -65,10 +65,10 @@
 const char kDefaultWallpaperLarge[] = "default-wallpaper-large";
 const char kDefaultWallpaperSmall[] = "default-wallpaper-small";
 
-// Time before a machine at OOBE is considered derelict.
+// Time in seconds before a machine at OOBE is considered derelict.
 const char kDerelictDetectionTimeout[] = "derelict-detection-timeout";
 
-// Time before a derelict machines starts demo mode.
+// Time in seconds before a derelict machines starts demo mode.
 const char kDerelictIdleTimeout[] = "derelict-idle-timeout";
 
 // Disables ARC Opt-in verification process and ARC is enabled by default.
diff --git a/chromeos/settings/cros_settings_names.cc b/chromeos/settings/cros_settings_names.cc
index ae36b0cb..15a5e9ff 100644
--- a/chromeos/settings/cros_settings_names.cc
+++ b/chromeos/settings/cros_settings_names.cc
@@ -199,4 +199,9 @@
 const char kDeviceQuirksDownloadEnabled[] =
     "cros.device.quirks_download_enabled";
 
+// A list pref storing the security origins allowed to access the webcam
+// during SAML logins.
+const char kLoginVideoCaptureAllowedUrls[] =
+    "cros.device.login_video_capture_allowed_urls";
+
 }  // namespace chromeos
diff --git a/chromeos/settings/cros_settings_names.h b/chromeos/settings/cros_settings_names.h
index 492bc49..62b478d 100644
--- a/chromeos/settings/cros_settings_names.h
+++ b/chromeos/settings/cros_settings_names.h
@@ -100,6 +100,8 @@
 
 CHROMEOS_EXPORT extern const char kDeviceQuirksDownloadEnabled[];
 
+CHROMEOS_EXPORT extern const char kLoginVideoCaptureAllowedUrls[];
+
 }  // namespace chromeos
 
 #endif  // CHROMEOS_SETTINGS_CROS_SETTINGS_NAMES_H_
diff --git a/components/BUILD.gn b/components/BUILD.gn
index 09cf2b6..13f0c62 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -96,6 +96,7 @@
     "//components/network_time:unit_tests",
     "//components/ntp_snippets:unit_tests",
     "//components/offline_pages:unit_tests",
+    "//components/offline_pages/background:unit_tests",
     "//components/omnibox/browser:unit_tests",
     "//components/open_from_clipboard:unit_tests",
     "//components/os_crypt:unit_tests",
diff --git a/components/OWNERS b/components/OWNERS
index 32f504c..7d0d192 100644
--- a/components/OWNERS
+++ b/components/OWNERS
@@ -54,6 +54,8 @@
 
 per-file devtools_http_handler.gypi=file://components/devtools_http_handler/OWNERS
 
+per-file display_compositor.gypi=file://components/display_compositor/OWNERS
+
 per-file dom_distiller.gypi=file://components/dom_distiller/OWNERS
 per-file dom_distiller_strings.grdp=file://components/dom_distiller/OWNERS
 
diff --git a/components/arc.gypi b/components/arc.gypi
index 5aa8c91..429a621 100644
--- a/components/arc.gypi
+++ b/components/arc.gypi
@@ -20,6 +20,7 @@
         '../chromeos/chromeos.gyp:power_manager_proto',
         '../ipc/ipc.gyp:ipc',
         '../third_party/re2/re2.gyp:re2',
+        '../skia/skia.gyp:skia',
         '../ui/arc/arc.gyp:arc',
         '../ui/aura/aura.gyp:aura',
         '../ui/base/ime/ui_base_ime.gyp:ui_base_ime',
@@ -41,6 +42,8 @@
         'arc/arc_service_manager.h',
         'arc/audio/arc_audio_bridge.cc',
         'arc/audio/arc_audio_bridge.h',
+        'arc/bitmap/bitmap_type_converters.cc',
+        'arc/bitmap/bitmap_type_converters.h',
         'arc/bluetooth/arc_bluetooth_bridge.cc',
         'arc/bluetooth/arc_bluetooth_bridge.h',
         'arc/bluetooth/bluetooth_type_converters.cc',
@@ -109,6 +112,7 @@
         'arc/common/arc_bridge.mojom',
         'arc/common/audio.mojom',
         'arc/common/auth.mojom',
+        'arc/common/bitmap.mojom',
         'arc/common/bluetooth.mojom',
         'arc/common/clipboard.mojom',
         'arc/common/crash_collector.mojom',
diff --git a/components/arc/BUILD.gn b/components/arc/BUILD.gn
index 7c05adcb..106f0d66 100644
--- a/components/arc/BUILD.gn
+++ b/components/arc/BUILD.gn
@@ -19,6 +19,8 @@
     "arc_service_manager.h",
     "audio/arc_audio_bridge.cc",
     "audio/arc_audio_bridge.h",
+    "bitmap/bitmap_type_converters.cc",
+    "bitmap/bitmap_type_converters.h",
     "bluetooth/arc_bluetooth_bridge.cc",
     "bluetooth/arc_bluetooth_bridge.h",
     "bluetooth/bluetooth_type_converters.cc",
@@ -64,6 +66,7 @@
     "//ipc:ipc",
     "//ipc/mojo:mojo",
     "//mojo/edk/system",
+    "//skia",
     "//third_party/re2:re2",
     "//ui/arc",
     "//ui/aura",
@@ -86,6 +89,7 @@
     "common/arc_bridge.mojom",
     "common/audio.mojom",
     "common/auth.mojom",
+    "common/bitmap.mojom",
     "common/bluetooth.mojom",
     "common/clipboard.mojom",
     "common/crash_collector.mojom",
diff --git a/components/arc/DEPS b/components/arc/DEPS
index c93bccc..e6d16e4f 100644
--- a/components/arc/DEPS
+++ b/components/arc/DEPS
@@ -8,5 +8,6 @@
   "+ipc",
   "+mojo",
   "+third_party/re2",
+  "+third_party/skia",
   "+ui/arc",
 ]
diff --git a/components/arc/bitmap/bitmap_type_converters.cc b/components/arc/bitmap/bitmap_type_converters.cc
new file mode 100644
index 0000000..ab9e58b
--- /dev/null
+++ b/components/arc/bitmap/bitmap_type_converters.cc
@@ -0,0 +1,36 @@
+// Copyright 2016 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 "components/arc/bitmap/bitmap_type_converters.h"
+
+namespace mojo {
+
+SkBitmap TypeConverter<SkBitmap, arc::mojom::ArcBitmapPtr>::Convert(
+    const arc::mojom::ArcBitmapPtr& arcBitmap) {
+  if (arcBitmap.is_null())
+    return SkBitmap();
+
+  SkImageInfo info = SkImageInfo::Make(
+      arcBitmap->width, arcBitmap->height,
+      kRGBA_8888_SkColorType, kPremul_SkAlphaType);
+  if (info.getSafeSize(info.minRowBytes()) > arcBitmap->pixel_data.size())
+      return SkBitmap();
+
+  // Create the SkBitmap object which wraps the arc bitmap pixels.
+  SkBitmap bitmap;
+  if (!bitmap.installPixels(info,
+          const_cast<uint8_t*>(arcBitmap->pixel_data.storage().data()),
+          info.minRowBytes())) {
+    return SkBitmap();
+  }
+
+  // Copy the pixels with converting color type.
+  SkBitmap nativeColorBitmap;
+  if (!bitmap.copyTo(&nativeColorBitmap, kN32_SkColorType))
+    return SkBitmap();
+
+  return nativeColorBitmap;
+}
+
+}  // namespace mojo
diff --git a/components/arc/bitmap/bitmap_type_converters.h b/components/arc/bitmap/bitmap_type_converters.h
new file mode 100644
index 0000000..815b965
--- /dev/null
+++ b/components/arc/bitmap/bitmap_type_converters.h
@@ -0,0 +1,20 @@
+// Copyright 2016 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 COMPONENTS_ARC_BITMAP_BITMAP_TYPE_CONVERTERS_H_
+#define COMPONENTS_ARC_BITMAP_BITMAP_TYPE_CONVERTERS_H_
+
+#include "components/arc/common/bitmap.mojom.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+
+namespace mojo {
+
+template <>
+struct TypeConverter<SkBitmap, arc::mojom::ArcBitmapPtr> {
+  static SkBitmap Convert(const arc::mojom::ArcBitmapPtr& bitmap);
+};
+
+}  // namespace mojo
+
+#endif  // COMPONENTS_ARC_BITMAP_BITMAP_TYPE_CONVERTERS_H_
diff --git a/components/arc/common/bitmap.mojom b/components/arc/common/bitmap.mojom
new file mode 100644
index 0000000..02d96647
--- /dev/null
+++ b/components/arc/common/bitmap.mojom
@@ -0,0 +1,11 @@
+// Copyright 2016 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.
+
+module arc.mojom;
+
+struct ArcBitmap {
+  uint32 width;
+  uint32 height;
+  array<uint8> pixel_data;  // Must be ARGB_8888
+};
diff --git a/components/arc/common/notifications.mojom b/components/arc/common/notifications.mojom
index 84257481..023b3ddab 100644
--- a/components/arc/common/notifications.mojom
+++ b/components/arc/common/notifications.mojom
@@ -4,6 +4,8 @@
 
 module arc.mojom;
 
+import "bitmap.mojom";
+
 // These values must be matched with the NOTIFICATION_EVENT_* constants in
 // com.android.server.ArcNotificationListenerService.
 enum ArcNotificationEvent {
@@ -15,7 +17,6 @@
   BUTTON_3_CLICKED = 4,
   BUTTON_4_CLICKED = 5,
   BUTTON_5_CLICKED = 6,
-  MAX = BUTTON_5_CLICKED
 };
 
 // These values must be matched with the NOTIFICATION_TYPE_* constants in
@@ -24,7 +25,7 @@
   BASIC = 0,
   IMAGE = 1,
   PROGRESS = 2,
-  MAX = PROGRESS
+  LIST = 3,
 };
 
 struct ArcNotificationButton {
@@ -61,6 +62,12 @@
   // Flag if the notification has FLAG_ONGOING_EVENT.
   [MinVersion=1]
   bool ongoing_event;
+  // Subtexts for list notifications.
+  [MinVersion=3]
+  array<string>? texts;
+  // Image for image notifications.
+  [MinVersion=3]
+  ArcBitmap? big_picture;
 };
 
 [MinVersion=2]
diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc
index e233d106..788e01b 100644
--- a/components/autofill/content/renderer/autofill_agent.cc
+++ b/components/autofill/content/renderer/autofill_agent.cc
@@ -312,6 +312,14 @@
   element_ = *element;
 }
 
+void AutofillAgent::OnDestruct() {
+  // As described in http://crbug.com/608100, there might be an AutofillAgent
+  // method in-progress lower on the stack. Destroying |this| would cause
+  // use-after-free once the lower stack frame becomes active. Instead, a task
+  // needs to be posted to delete this.
+  base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this);
+}
+
 void AutofillAgent::FocusChangeComplete() {
   WebDocument doc = render_frame()->GetWebFrame()->document();
   WebElement focused_element;
diff --git a/components/autofill/content/renderer/autofill_agent.h b/components/autofill/content/renderer/autofill_agent.h
index 1257791..43af5550 100644
--- a/components/autofill/content/renderer/autofill_agent.h
+++ b/components/autofill/content/renderer/autofill_agent.h
@@ -115,6 +115,7 @@
   void WillSubmitForm(const blink::WebFormElement& form) override;
   void DidChangeScrollOffset() override;
   void FocusedNodeChanged(const blink::WebNode& node) override;
+  void OnDestruct() override;
 
   // Pass-through from LegacyAutofillAgent. This correlates with the
   // RenderViewObserver method.
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc
index ce485ac..d0245ec 100644
--- a/components/autofill/content/renderer/password_autofill_agent.cc
+++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -1237,6 +1237,14 @@
   }
 }
 
+void PasswordAutofillAgent::OnDestruct() {
+  // As described in http://crbug.com/608100, there might be an AutofillAgent
+  // method in-progress lower on the stack. Destroying |this| would cause
+  // use-after-free once the lower stack frame becomes active. Instead, a task
+  // needs to be posted to delete this.
+  base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this);
+}
+
 void PasswordAutofillAgent::DidStartProvisionalLoad() {
   std::unique_ptr<RendererSavePasswordProgressLogger> logger;
   if (logging_state_active_) {
diff --git a/components/autofill/content/renderer/password_autofill_agent.h b/components/autofill/content/renderer/password_autofill_agent.h
index a6a4f05..cb6c87d 100644
--- a/components/autofill/content/renderer/password_autofill_agent.h
+++ b/components/autofill/content/renderer/password_autofill_agent.h
@@ -154,6 +154,7 @@
                                 bool is_same_page_navigation) override;
   void WillSendSubmitEvent(const blink::WebFormElement& form) override;
   void WillSubmitForm(const blink::WebFormElement& form) override;
+  void OnDestruct() override;
 
   // RenderView IPC handlers:
   void OnFillPasswordForm(int key, const PasswordFormFillData& form_data);
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc
index 77ae77e..c9c1da0 100644
--- a/components/autofill/core/browser/autofill_manager.cc
+++ b/components/autofill/core/browser/autofill_manager.cc
@@ -20,8 +20,6 @@
 #include "base/guid.h"
 #include "base/logging.h"
 #include "base/message_loop/message_loop.h"
-#include "base/metrics/field_trial.h"
-#include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
 #include "base/strings/string16.h"
 #include "base/strings/string_number_conversions.h"
@@ -252,12 +250,6 @@
     return false;
   }
 
-  if (base::FieldTrialList::FindFullName("CreditCardScan") == "Control" &&
-      !base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kEnableCreditCardScan)) {
-    return false;
-  }
-
   if (!client_->HasCreditCardScanFeature())
     return false;
 
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc
index 9a0423c..564f23e7 100644
--- a/components/autofill/core/browser/personal_data_manager.cc
+++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -866,11 +866,20 @@
 // static
 std::string PersonalDataManager::MergeProfile(
     const AutofillProfile& new_profile,
-    const std::vector<AutofillProfile*>& existing_profiles,
+    std::vector<AutofillProfile*> existing_profiles,
     const std::string& app_locale,
     std::vector<AutofillProfile>* merged_profiles) {
   merged_profiles->clear();
 
+  // Sort the existing profiles in decreasing order of frecency, so the "best"
+  // profiles are checked first.
+  base::Time comparison_time = base::Time::Now();
+  std::sort(existing_profiles.begin(), existing_profiles.end(),
+            [comparison_time](const AutofillDataModel* a,
+                              const AutofillDataModel* b) {
+              return a->CompareFrecency(b, comparison_time);
+            });
+
   // Set to true if |existing_profiles| already contains an equivalent profile.
   bool matching_profile_found = false;
   std::string guid = new_profile.guid();
diff --git a/components/autofill/core/browser/personal_data_manager.h b/components/autofill/core/browser/personal_data_manager.h
index 29c3edf..3513d9e2 100644
--- a/components/autofill/core/browser/personal_data_manager.h
+++ b/components/autofill/core/browser/personal_data_manager.h
@@ -216,7 +216,7 @@
   // profile.
   static std::string MergeProfile(
       const AutofillProfile& new_profile,
-      const std::vector<AutofillProfile*>& existing_profiles,
+      std::vector<AutofillProfile*> existing_profiles,
       const std::string& app_locale,
       std::vector<AutofillProfile>* merged_profiles);
 
diff --git a/components/autofill/core/browser/personal_data_manager_unittest.cc b/components/autofill/core/browser/personal_data_manager_unittest.cc
index f229534b..5b602860 100644
--- a/components/autofill/core/browser/personal_data_manager_unittest.cc
+++ b/components/autofill/core/browser/personal_data_manager_unittest.cc
@@ -4161,4 +4161,41 @@
   }
 }
 
+// Tests that MergeProfile tries to merge the imported profile into the
+// existing profile in decreasing order of frecency.
+TEST_F(PersonalDataManagerTest, MergeProfile_Frecency) {
+  // Create two very similar profiles except with different company names.
+  AutofillProfile profile1(base::GenerateGUID(), "https://www.example.com");
+  test::SetProfileInfo(&profile1, "Homer", "Jay", "Simpson",
+                       "homer.simpson@abc.com", "SNP", "742 Evergreen Terrace",
+                       "", "Springfield", "IL", "91601", "US", "12345678910");
+  AutofillProfile profile2(base::GenerateGUID(), "https://www.example.com");
+  test::SetProfileInfo(&profile2, "Homer", "Jay", "Simpson",
+                       "homer.simpson@abc.com", "Fox", "742 Evergreen Terrace",
+                       "", "Springfield", "IL", "91601", "US", "12345678910");
+
+  // Give the "Fox" profile a bigger frecency score.
+  profile2.set_use_count(15);
+
+  // Create the |existing_profiles| vector.
+  std::vector<AutofillProfile*> existing_profiles;
+  existing_profiles.push_back(&profile1);
+  existing_profiles.push_back(&profile2);
+
+  // Create a new imported profile with no company name.
+  AutofillProfile imported_profile(base::GenerateGUID(),
+                                   "https://www.example.com");
+  test::SetProfileInfo(&imported_profile, "Homer", "Jay", "Simpson",
+                       "homer.simpson@abc.com", "", "742 Evergreen Terrace", "",
+                       "Springfield", "IL", "91601", "US", "12345678910");
+
+  // Merge the imported profile into the existing profiles.
+  std::vector<AutofillProfile> profiles;
+  std::string guid = personal_data_->MergeProfile(
+      imported_profile, existing_profiles, "US-EN", &profiles);
+
+  // The new profile should be merged into the "fox" profile.
+  EXPECT_EQ(profile2.guid(), guid);
+}
+
 }  // namespace autofill
diff --git a/components/bitmap_uploader/bitmap_uploader.cc b/components/bitmap_uploader/bitmap_uploader.cc
index 869ae847..8f574805 100644
--- a/components/bitmap_uploader/bitmap_uploader.cc
+++ b/components/bitmap_uploader/bitmap_uploader.cc
@@ -82,6 +82,11 @@
 }
 
 void BitmapUploader::Upload() {
+  // If the |gpu_service_| has errored than we won't get far. Do nothing,
+  // assuming we are in shutdown.
+  if (gpu_service_.encountered_error())
+    return;
+
   const gfx::Rect bounds(window_->bounds());
   mus::mojom::PassPtr pass = mojo::CreateDefaultPass(1, bounds);
   mus::mojom::CompositorFramePtr frame = mus::mojom::CompositorFrame::New();
diff --git a/components/components_strings.grd b/components/components_strings.grd
index d195968..985bf8ed 100644
--- a/components/components_strings.grd
+++ b/components/components_strings.grd
@@ -121,7 +121,7 @@
       <output filename="java/res/values-uk/components_strings.xml" lang="uk" type="android" context="android_java" />
       <output filename="java/res/values-vi/components_strings.xml" lang="vi" type="android" context="android_java" />
       <output filename="java/res/values-zh-rCN/components_strings.xml" lang="zh-CN" type="android" context="android_java" />
-      <output filename="java/res/values-zh-rTW/components_strings.xml" lang="zh-TW" type="android" context="android_java" />
+      <output filename="java/res/values-zh/components_strings.xml" lang="zh-TW" type="android" context="android_java" />
     </if>
 
   </outputs>
diff --git a/components/components_tests.gyp b/components/components_tests.gyp
index ae48eb20..c007e9e4 100644
--- a/components/components_tests.gyp
+++ b/components/components_tests.gyp
@@ -403,9 +403,13 @@
     ],
     'ntp_snippets_unittest_sources': [
       'ntp_snippets/inner_iterator_unittest.cc',
+      'ntp_snippets/ntp_snippets_fetcher_unittest.cc',
       'ntp_snippets/ntp_snippets_service_unittest.cc',
     ],
-    'offline_page_unittest_sources': [
+    'offline_pages_background_unittest_sources': [
+      'offline_pages/background/save_page_request_unittest.cc',
+    ],
+    'offline_pages_unittest_sources': [
       'offline_pages/offline_page_metadata_store_impl_unittest.cc',
       'offline_pages/offline_page_model_unittest.cc',
       'offline_pages/snapshot_controller_unittest.cc',
@@ -992,7 +996,8 @@
         '<@(mime_util_unittest_sources)',
         '<@(network_time_unittest_sources)',
         '<@(ntp_snippets_unittest_sources)',
-        '<@(offline_page_unittest_sources)',
+        '<@(offline_pages_background_unittest_sources)',
+        '<@(offline_pages_unittest_sources)',
         '<@(omnibox_unittest_sources)',
         '<@(open_from_clipboard_unittest_sources)',
         '<@(os_crypt_unittest_sources)',
@@ -1115,6 +1120,7 @@
         'components.gyp:network_time',
         'components.gyp:ntp_snippets',
         'components.gyp:offline_pages',
+        'components.gyp:offline_pages_background_offliner',
         'components.gyp:offline_pages_test_support',
         'components.gyp:omnibox_browser',
         'components.gyp:omnibox_test_support',
diff --git a/components/cronet/android/BUILD.gn b/components/cronet/android/BUILD.gn
index f59c54e..ee5bc3f 100644
--- a/components/cronet/android/BUILD.gn
+++ b/components/cronet/android/BUILD.gn
@@ -267,7 +267,7 @@
     ":network_quality_observations_java",
   ]
 
-  run_findbugs = true
+  run_findbugs_override = true
 }
 
 android_library("cronet_java") {
@@ -304,7 +304,7 @@
     ":net_request_priority_java",
   ]
 
-  run_findbugs = true
+  run_findbugs_override = true
 }
 
 android_resources("cronet_sample_apk_resources") {
@@ -325,7 +325,7 @@
     "//base:base_java",
   ]
 
-  run_findbugs = true
+  run_findbugs_override = true
 }
 
 android_apk("cronet_sample_apk") {
@@ -341,7 +341,7 @@
     "//third_party/jsr-305:jsr_305_javalib",
   ]
 
-  run_findbugs = true
+  run_findbugs_override = true
   if (!is_debug) {
     proguard_enabled = true
     proguard_configs = [
@@ -380,7 +380,7 @@
   ]
   additional_apks = [ "//net/android:net_test_support_apk" ]
 
-  run_findbugs = true
+  run_findbugs_override = true
   proguard_enabled = !is_debug
 }
 
@@ -485,7 +485,7 @@
     "//third_party/netty4:netty_all",
   ]
 
-  run_findbugs = true
+  run_findbugs_override = true
 }
 
 android_assets("cronet_test_apk_assets") {
@@ -544,7 +544,7 @@
     "//third_party/netty-tcnative:netty-tcnative_all",
   ]
 
-  run_findbugs = true
+  run_findbugs_override = true
 }
 
 android_library("cronet_javatests") {
@@ -597,7 +597,7 @@
     "//net/android:net_java_test_support",
   ]
 
-  run_findbugs = true
+  run_findbugs_override = true
 }
 
 instrumentation_test_apk("cronet_test_instrumentation_apk") {
@@ -627,7 +627,7 @@
   # TODO(jbudorick): Remove this once GN uses the generated .isolate files.
   isolate_file = "cronet_test_instrumentation_apk.isolate"
 
-  run_findbugs = true
+  run_findbugs_override = true
 }
 
 android_library("cronet_perf_test_apk_java") {
@@ -643,7 +643,7 @@
     "//base:base_java",
   ]
 
-  run_findbugs = true
+  run_findbugs_override = true
 }
 
 android_apk("cronet_perf_test_apk") {
@@ -659,7 +659,7 @@
     "//base:base_java",
   ]
 
-  run_findbugs = true
+  run_findbugs_override = true
   proguard_enabled = true
   proguard_configs = [
     "proguard.cfg",
diff --git a/components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java b/components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java
index 59d9b32..7c358d9 100644
--- a/components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java
+++ b/components/cronet/android/java/src/org/chromium/net/CronetLibraryLoader.java
@@ -35,7 +35,9 @@
                 return;
             }
             sInitStarted = true;
+            ContextUtils.initApplicationContext(context.getApplicationContext());
             builder.loadLibrary();
+            ContextUtils.initApplicationContextForNative();
             if (!Version.CRONET_VERSION.equals(nativeGetCronetVersion())) {
                 throw new RuntimeException(String.format(
                       "Expected Cronet version number %s, "
@@ -45,9 +47,9 @@
             }
             Log.i(TAG, "Cronet version: %s, arch: %s",
                     Version.CRONET_VERSION, System.getProperty("os.arch"));
-            ContextUtils.initApplicationContext(context.getApplicationContext());
             // Init native Chromium CronetEngine on Main UI thread.
             Runnable task = new Runnable() {
+                @Override
                 public void run() {
                     ensureInitializedOnMainThread(context);
                 }
diff --git a/components/cronet/android/test/javaperftests/android_rndis_forwarder.py b/components/cronet/android/test/javaperftests/android_rndis_forwarder.py
new file mode 100644
index 0000000..bec2ab1
--- /dev/null
+++ b/components/cronet/android/test/javaperftests/android_rndis_forwarder.py
@@ -0,0 +1,477 @@
+# Copyright 2016 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 atexit
+import os
+import re
+import socket
+import struct
+import subprocess
+
+from telemetry.core import platform
+from telemetry.internal.platform import android_device
+
+from devil.android import device_errors
+from devil.android import device_utils
+
+class AndroidRndisForwarder(object):
+  """Forwards traffic using RNDIS. Assumes the device has root access."""
+
+  def __init__(self, device, rndis_configurator):
+    self._device = device
+    self._rndis_configurator = rndis_configurator
+    self._device_iface = rndis_configurator.device_iface
+    self._host_ip = rndis_configurator.host_ip
+    self._original_dns = None, None, None
+    self._RedirectPorts()
+    self._OverrideDns()
+    self._OverrideDefaultGateway()
+    # Need to override routing policy again since call to setifdns
+    # sometimes resets policy table
+    self._rndis_configurator.OverrideRoutingPolicy()
+    atexit.register(self.Close)
+    # TODO(tonyg): Verify that each port can connect to host.
+
+  @property
+  def host_ip(self):
+    return self._host_ip
+
+  def Close(self):
+    #if self._forwarding:
+    #  self._rndis_configurator.RestoreRoutingPolicy()
+    #  self._SetDns(*self._original_dns)
+    #  self._RestoreDefaultGateway()
+    #super(AndroidRndisForwarder, self).Close()
+    pass
+
+  def _RedirectPorts(self):
+    """Sets the local to remote pair mappings to use for RNDIS."""
+    # Flush any old nat rules.
+    self._device.RunShellCommand('iptables -F -t nat')
+
+  def _OverrideDns(self):
+    """Overrides DNS on device to point at the host."""
+    self._original_dns = self._GetCurrentDns()
+    self._SetDns(self._device_iface, self.host_ip, self.host_ip)
+
+  def _SetDns(self, iface, dns1, dns2):
+    """Overrides device's DNS configuration.
+
+    Args:
+      iface: name of the network interface to make default
+      dns1, dns2: nameserver IP addresses
+    """
+    if not iface:
+      return  # If there is no route, then nobody cares about DNS.
+    # DNS proxy in older versions of Android is configured via properties.
+    # TODO(szym): run via su -c if necessary.
+    self._device.SetProp('net.dns1', dns1)
+    self._device.SetProp('net.dns2', dns2)
+    dnschange = self._device.GetProp('net.dnschange')
+    if dnschange:
+      self._device.SetProp('net.dnschange', str(int(dnschange) + 1))
+    # Since commit 8b47b3601f82f299bb8c135af0639b72b67230e6 to frameworks/base
+    # the net.dns1 properties have been replaced with explicit commands for netd
+    self._device.RunShellCommand('netd resolver setifdns %s %s %s' %
+                                 (iface, dns1, dns2))
+    # TODO(szym): if we know the package UID, we could setifaceforuidrange
+    self._device.RunShellCommand('netd resolver setdefaultif %s' % iface)
+
+  def _GetCurrentDns(self):
+    """Returns current gateway, dns1, and dns2."""
+    routes = self._device.RunShellCommand('cat /proc/net/route')[1:]
+    routes = [route.split() for route in routes]
+    default_routes = [route[0] for route in routes if route[1] == '00000000']
+    return (
+      default_routes[0] if default_routes else None,
+      self._device.GetProp('net.dns1'),
+      self._device.GetProp('net.dns2'),
+    )
+
+  def _OverrideDefaultGateway(self):
+    """Force traffic to go through RNDIS interface.
+
+    Override any default gateway route. Without this traffic may go through
+    the wrong interface.
+
+    This introduces the risk that _RestoreDefaultGateway() is not called
+    (e.g. Telemetry crashes). A power cycle or "adb reboot" is a simple
+    workaround around in that case.
+    """
+    self._device.RunShellCommand('route add default gw %s dev %s' %
+                                 (self.host_ip, self._device_iface))
+
+  def _RestoreDefaultGateway(self):
+    self._device.RunShellCommand('netcfg %s down' % self._device_iface)
+
+
+class AndroidRndisConfigurator(object):
+  """Configures a linux host to connect to an android device via RNDIS.
+
+  Note that we intentionally leave RNDIS running on the device. This is
+  because the setup is slow and potentially flaky and leaving it running
+  doesn't seem to interfere with any other developer or bot use-cases.
+  """
+
+  _RNDIS_DEVICE = '/sys/class/android_usb/android0'
+  _NETWORK_INTERFACES = '/etc/network/interfaces'
+  _INTERFACES_INCLUDE = 'source /etc/network/interfaces.d/*.conf'
+  _TELEMETRY_INTERFACE_FILE = '/etc/network/interfaces.d/telemetry-{}.conf'
+
+  def __init__(self, device):
+    self._device = device
+
+    try:
+      self._device.EnableRoot()
+    except device_errors.CommandFailedError:
+      logging.error('RNDIS forwarding requires a rooted device.')
+      raise
+
+    self._device_ip = None
+    self._host_iface = None
+    self._host_ip = None
+    self.device_iface = None
+
+    if platform.GetHostPlatform().GetOSName() == 'mac':
+      self._InstallHorndis(platform.GetHostPlatform().GetArchName())
+
+    assert self._IsRndisSupported(), 'Device does not support RNDIS.'
+    self._CheckConfigureNetwork()
+
+  @property
+  def host_ip(self):
+    return self._host_ip
+
+  def _IsRndisSupported(self):
+    """Checks that the device has RNDIS support in the kernel."""
+    return self._device.FileExists('%s/f_rndis/device' % self._RNDIS_DEVICE)
+
+  def _FindDeviceRndisInterface(self):
+    """Returns the name of the RNDIS network interface if present."""
+    config = self._device.RunShellCommand('ip -o link show')
+    interfaces = [line.split(':')[1].strip() for line in config]
+    candidates = [iface for iface in interfaces if re.match('rndis|usb', iface)]
+    if candidates:
+      candidates.sort()
+      if len(candidates) == 2 and candidates[0].startswith('rndis') and \
+          candidates[1].startswith('usb'):
+        return candidates[0]
+      assert len(candidates) == 1, 'Found more than one rndis device!'
+      return candidates[0]
+
+  def _EnumerateHostInterfaces(self):
+    host_platform = platform.GetHostPlatform().GetOSName()
+    if host_platform == 'linux':
+      return subprocess.check_output(['ip', 'addr']).splitlines()
+    if host_platform == 'mac':
+      return subprocess.check_output(['ifconfig']).splitlines()
+    raise NotImplementedError('Platform %s not supported!' % host_platform)
+
+  def _FindHostRndisInterface(self):
+    """Returns the name of the host-side network interface."""
+    interface_list = self._EnumerateHostInterfaces()
+    ether_address = self._device.ReadFile(
+        '%s/f_rndis/ethaddr' % self._RNDIS_DEVICE,
+        as_root=True, force_pull=True).strip()
+    interface_name = None
+    for line in interface_list:
+      if not line.startswith((' ', '\t')):
+        interface_name = line.split(':')[-2].strip()
+      elif ether_address in line:
+        return interface_name
+
+  def _WriteProtectedFile(self, file_path, contents):
+    subprocess.check_call(
+        ['/usr/bin/sudo', 'bash', '-c',
+         'echo -e "%s" > %s' % (contents, file_path)])
+
+  def _LoadInstalledHoRNDIS(self):
+    """Attempt to load HoRNDIS if installed.
+    If kext could not be loaded or if HoRNDIS is not installed, return False.
+    """
+    if not os.path.isdir('/System/Library/Extensions/HoRNDIS.kext'):
+      logging.info('HoRNDIS not present on system.')
+      return False
+
+    def HoRNDISLoaded():
+      return 'HoRNDIS' in subprocess.check_output(['kextstat'])
+
+    if HoRNDISLoaded():
+      return True
+
+    logging.info('HoRNDIS installed but not running, trying to load manually.')
+    subprocess.check_call(
+        ['/usr/bin/sudo', 'kextload', '-b', 'com.joshuawise.kexts.HoRNDIS'])
+
+    return HoRNDISLoaded()
+
+  def _InstallHorndis(self, arch_name):
+    if self._LoadInstalledHoRNDIS():
+      logging.info('HoRNDIS kext loaded successfully.')
+      return
+    logging.info('Installing HoRNDIS...')
+    pkg_path = binary_manager.FetchPath('horndis', arch_name, 'mac')
+    subprocess.check_call(
+        ['/usr/bin/sudo', 'installer', '-pkg', pkg_path, '-target', '/'])
+
+  def _DisableRndis(self):
+    try:
+      self._device.SetProp('sys.usb.config', 'adb')
+    except device_errors.AdbCommandFailedError:
+      # Ignore exception due to USB connection being reset.
+      pass
+    self._device.WaitUntilFullyBooted()
+
+  def _EnableRndis(self):
+    """Enables the RNDIS network interface."""
+    script_prefix = '/data/local/tmp/rndis'
+    # This could be accomplished via "svc usb setFunction rndis" but only on
+    # devices which have the "USB tethering" feature.
+    # Also, on some devices, it's necessary to go through "none" function.
+    script = """
+trap '' HUP
+trap '' TERM
+trap '' PIPE
+
+function manual_config() {
+  echo %(functions)s > %(dev)s/functions
+  echo 224 > %(dev)s/bDeviceClass
+  echo 1 > %(dev)s/enable
+  start adbd
+  setprop sys.usb.state %(functions)s
+}
+
+# This function kills adb transport, so it has to be run "detached".
+function doit() {
+  setprop sys.usb.config none
+  while [ `getprop sys.usb.state` != "none" ]; do
+    sleep 1
+  done
+  manual_config
+  # For some combinations of devices and host kernels, adb won't work unless the
+  # interface is up, but if we bring it up immediately, it will break adb.
+  #sleep 1
+  #ifconfig rndis0 192.168.123.2 netmask 255.255.255.0 up
+  echo DONE >> %(prefix)s.log
+}
+
+doit &
+    """ % {'dev': self._RNDIS_DEVICE, 'functions': 'rndis,adb',
+           'prefix': script_prefix}
+    self._device.WriteFile('%s.sh' % script_prefix, script)
+    # TODO(szym): run via su -c if necessary.
+    self._device.RunShellCommand('rm %s.log' % script_prefix)
+    self._device.RunShellCommand('. %s.sh' % script_prefix)
+    self._device.WaitUntilFullyBooted()
+    result = self._device.ReadFile('%s.log' % script_prefix).splitlines()
+    assert any('DONE' in line for line in result), 'RNDIS script did not run!'
+
+  def _CheckEnableRndis(self, force):
+    """Enables the RNDIS network interface, retrying if necessary.
+    Args:
+      force: Disable RNDIS first, even if it appears already enabled.
+    Returns:
+      device_iface: RNDIS interface name on the device
+      host_iface: corresponding interface name on the host
+    """
+    for _ in range(3):
+      if not force:
+        device_iface = self._FindDeviceRndisInterface()
+        if device_iface:
+          host_iface = self._FindHostRndisInterface()
+          if host_iface:
+            return device_iface, host_iface
+      self._DisableRndis()
+      self._EnableRndis()
+      force = False
+    raise Exception('Could not enable RNDIS, giving up.')
+
+  def _Ip2Long(self, addr):
+    return struct.unpack('!L', socket.inet_aton(addr))[0]
+
+  def _IpPrefix2AddressMask(self, addr):
+    def _Length2Mask(length):
+      return 0xFFFFFFFF & ~((1 << (32 - length)) - 1)
+
+    addr, masklen = addr.split('/')
+    return self._Ip2Long(addr), _Length2Mask(int(masklen))
+
+  def _GetHostAddresses(self, iface):
+    """Returns the IP addresses on host's interfaces, breaking out |iface|."""
+    interface_list = self._EnumerateHostInterfaces()
+    addresses = []
+    iface_address = None
+    found_iface = False
+    for line in interface_list:
+      if not line.startswith((' ', '\t')):
+        found_iface = iface in line
+      match = re.search(r'(?<=inet )\S+', line)
+      if match:
+        address = match.group(0)
+        if '/' in address:
+          address = self._IpPrefix2AddressMask(address)
+        else:
+          match = re.search(r'(?<=netmask )\S+', line)
+          address = self._Ip2Long(address), int(match.group(0), 16)
+        if found_iface:
+          assert not iface_address, (
+            'Found %s twice when parsing host interfaces.' % iface)
+          iface_address = address
+        else:
+          addresses.append(address)
+    return addresses, iface_address
+
+  def _GetDeviceAddresses(self, excluded_iface):
+    """Returns the IP addresses on all connected devices.
+    Excludes interface |excluded_iface| on the selected device.
+    """
+    my_device = str(self._device)
+    addresses = []
+    for device_serial in android_device.GetDeviceSerials(None):
+      try:
+        device = device_utils.DeviceUtils(device_serial)
+        if device_serial == my_device:
+          excluded = excluded_iface
+        else:
+          excluded = 'no interfaces excluded on other devices'
+        addresses += [line.split()[3]
+                      for line in device.RunShellCommand('ip -o -4 addr')
+                      if excluded not in line]
+      except device_errors.CommandFailedError:
+        logging.warning('Unable to determine IP addresses for %s',
+                        device_serial)
+    return addresses
+
+  def _ConfigureNetwork(self, device_iface, host_iface):
+    """Configures the |device_iface| to be on the same network as |host_iface|.
+    """
+    def _Long2Ip(value):
+      return socket.inet_ntoa(struct.pack('!L', value))
+
+    def _IsNetworkUnique(network, addresses):
+      return all((addr & mask != network & mask) for addr, mask in addresses)
+
+    def _NextUnusedAddress(network, netmask, used_addresses):
+      # Excludes '0' and broadcast.
+      for suffix in range(1, 0xFFFFFFFF & ~netmask):
+        candidate = network | suffix
+        if candidate not in used_addresses:
+          return candidate
+
+    def HasHostAddress():
+      _, host_address = self._GetHostAddresses(host_iface)
+      return bool(host_address)
+
+    if not HasHostAddress():
+      if platform.GetHostPlatform().GetOSName() == 'mac':
+        if 'Telemetry' not in subprocess.check_output(
+            ['networksetup', '-listallnetworkservices']):
+          subprocess.check_call(
+              ['/usr/bin/sudo', 'networksetup',
+               '-createnetworkservice', 'Telemetry', host_iface])
+          subprocess.check_call(
+              ['/usr/bin/sudo', 'networksetup',
+               '-setmanual', 'Telemetry', '192.168.123.1', '255.255.255.0'])
+      elif platform.GetHostPlatform().GetOSName() == 'linux':
+        with open(self._NETWORK_INTERFACES) as f:
+          orig_interfaces = f.read()
+        if self._INTERFACES_INCLUDE not in orig_interfaces:
+          interfaces = '\n'.join([
+              orig_interfaces,
+              '',
+              '# Added by Telemetry.',
+              self._INTERFACES_INCLUDE])
+          self._WriteProtectedFile(self._NETWORK_INTERFACES, interfaces)
+        interface_conf_file = self._TELEMETRY_INTERFACE_FILE.format(host_iface)
+        if not os.path.exists(interface_conf_file):
+          interface_conf_dir = os.path.dirname(interface_conf_file)
+          if not os.path.exists(interface_conf_dir):
+            subprocess.call(['/usr/bin/sudo', '/bin/mkdir', interface_conf_dir])
+            subprocess.call(
+                ['/usr/bin/sudo', '/bin/chmod', '755', interface_conf_dir])
+          interface_conf = '\n'.join([
+              '# Added by Telemetry for RNDIS forwarding.',
+              'allow-hotplug %s' % host_iface,
+              'iface %s inet static' % host_iface,
+              '  address 192.168.123.1',
+              '  netmask 255.255.255.0',
+              ])
+          self._WriteProtectedFile(interface_conf_file, interface_conf)
+          subprocess.check_call(['/usr/bin/sudo', 'ifup', host_iface])
+      logging.info('Waiting for RNDIS connectivity...')
+      util.WaitFor(HasHostAddress, 30)
+
+    addresses, host_address = self._GetHostAddresses(host_iface)
+    assert host_address, 'Interface %s could not be configured.' % host_iface
+
+    host_ip, netmask = host_address  # pylint: disable=unpacking-non-sequence
+    network = host_ip & netmask
+
+    if not _IsNetworkUnique(network, addresses):
+      logging.warning(
+        'The IP address configuration %s of %s is not unique!\n'
+        'Check your /etc/network/interfaces. If this overlap is intended,\n'
+        'you might need to use: ip rule add from <device_ip> lookup <table>\n'
+        'or add the interface to a bridge in order to route to this network.'
+        % (host_address, host_iface)
+      )
+
+    # Find unused IP address.
+    used_addresses = [addr for addr, _ in addresses]
+    used_addresses += [self._IpPrefix2AddressMask(addr)[0]
+                       for addr in self._GetDeviceAddresses(device_iface)]
+    used_addresses += [host_ip]
+
+    device_ip = _NextUnusedAddress(network, netmask, used_addresses)
+    assert device_ip, ('The network %s on %s is full.' %
+                       (host_address, host_iface))
+
+    host_ip = _Long2Ip(host_ip)
+    device_ip = _Long2Ip(device_ip)
+    netmask = _Long2Ip(netmask)
+
+    # TODO(szym) run via su -c if necessary.
+    self._device.RunShellCommand(
+        'ifconfig %s %s netmask %s up' % (device_iface, device_ip, netmask))
+    # Enabling the interface sometimes breaks adb.
+    self._device.WaitUntilFullyBooted()
+    self._host_iface = host_iface
+    self._host_ip = host_ip
+    self.device_iface = device_iface
+    self._device_ip = device_ip
+
+  def _TestConnectivity(self):
+    with open(os.devnull, 'wb') as devnull:
+      return subprocess.call(['ping', '-q', '-c1', '-W1', self._device_ip],
+                             stdout=devnull) == 0
+
+  def OverrideRoutingPolicy(self):
+    """Override any routing policy that could prevent
+    packets from reaching the rndis interface
+    """
+    policies = self._device.RunShellCommand('ip rule')
+    if len(policies) > 1 and not 'lookup main' in policies[1]:
+      self._device.RunShellCommand('ip rule add prio 1 from all table main')
+      self._device.RunShellCommand('ip route flush cache')
+
+  def RestoreRoutingPolicy(self):
+    policies = self._device.RunShellCommand('ip rule')
+    if len(policies) > 1 and re.match("^1:.*lookup main", policies[1]):
+      self._device.RunShellCommand('ip rule del prio 1')
+      self._device.RunShellCommand('ip route flush cache')
+
+  def _CheckConfigureNetwork(self):
+    """Enables RNDIS and configures it, retrying until we have connectivity."""
+    force = False
+    for _ in range(3):
+      device_iface, host_iface = self._CheckEnableRndis(force)
+      self._ConfigureNetwork(device_iface, host_iface)
+      self.OverrideRoutingPolicy()
+      # Sometimes the first packet will wake up the connection.
+      for _ in range(3):
+        if self._TestConnectivity():
+          return
+      force = True
+    self.RestoreRoutingPolicy()
+    raise Exception('No connectivity, giving up.')
diff --git a/components/cronet/android/test/javaperftests/run.py b/components/cronet/android/test/javaperftests/run.py
index 227858be..172390185 100755
--- a/components/cronet/android/test/javaperftests/run.py
+++ b/components/cronet/android/test/javaperftests/run.py
@@ -48,6 +48,7 @@
 sys.path.append(chromium_config.GetTelemetryDir())
 sys.path.append(os.path.join(REPOSITORY_ROOT, 'build', 'android'))
 
+import android_rndis_forwarder
 import lighttpd_server
 from pylib import constants
 from pylib import pexpect
@@ -58,8 +59,6 @@
 from telemetry import benchmark_runner
 from telemetry import project_config
 from telemetry import story
-from telemetry.internal import forwarders
-from telemetry.internal.forwarders import android_forwarder
 from telemetry.value import scalar
 from telemetry.web_perf import timeline_based_measurement
 
@@ -118,12 +117,12 @@
   return devices[0]
 
 
-def GetForwarderFactory(device):
-  return android_forwarder.AndroidForwarderFactory(device, True)
+def GetAndroidRndisConfig(device):
+  return android_rndis_forwarder.AndroidRndisConfigurator(device)
 
 
 def GetServersHost(device):
-  return GetForwarderFactory(device).host_ip
+  return GetAndroidRndisConfig(device).host_ip
 
 
 def GetHttpServerURL(device, resource):
@@ -297,11 +296,8 @@
   device.EnableRoot()
   device.Install(APP_APK)
   # Start USB reverse tethering.
-  # Port map is ignored for tethering; must create one to placate assertions.
-  named_port_pair_map = {'http': (forwarders.PortPair(0, 0)),
-      'https': None, 'dns': None}
-  port_pairs = forwarders.PortPairs(**named_port_pair_map)
-  forwarder = GetForwarderFactory(device).Create(port_pairs)
+  android_rndis_forwarder.AndroidRndisForwarder(device,
+      GetAndroidRndisConfig(device))
   # Start HTTP server.
   http_server_doc_root = GenerateHttpTestResources()
   config_file = tempfile.NamedTemporaryFile()
@@ -332,7 +328,6 @@
       default_chrome_root=REPOSITORY_ROOT)
   sys.argv.insert(1, 'run')
   sys.argv.insert(2, 'run.CronetPerfTestBenchmark')
-  sys.argv.insert(3, '--android-rndis')
   benchmark_runner.main(runner_config)
   # Shutdown.
   quic_server.ShutdownQuicServer()
diff --git a/components/data_use_measurement/core/data_use_user_data.cc b/components/data_use_measurement/core/data_use_user_data.cc
index 778a5d4..50578ff 100644
--- a/components/data_use_measurement/core/data_use_user_data.cc
+++ b/components/data_use_measurement/core/data_use_user_data.cc
@@ -56,6 +56,8 @@
       return "Policy";
     case SPELL_CHECKER:
       return "SpellChecker";
+    case NTP_SNIPPETS:
+      return "NTPSnippets";
   }
   return "INVALID";
 }
diff --git a/components/data_use_measurement/core/data_use_user_data.h b/components/data_use_measurement/core/data_use_user_data.h
index f5ba2cd2..00d749c 100644
--- a/components/data_use_measurement/core/data_use_user_data.h
+++ b/components/data_use_measurement/core/data_use_user_data.h
@@ -39,6 +39,7 @@
     AUTOFILL,
     POLICY,
     SPELL_CHECKER,
+    NTP_SNIPPETS,
   };
 
   explicit DataUseUserData(ServiceName service_name);
@@ -53,7 +54,7 @@
   static std::string GetServiceNameAsString(ServiceName service);
 
   // Services should use this function to attach their |service_name| to the
-  // URLFethcer serving them.
+  // URLFetcher serving them.
   static void AttachToFetcher(net::URLFetcher* fetcher,
                               ServiceName service_name);
 
diff --git a/components/display_compositor.gypi b/components/display_compositor.gypi
index f0ef224..ccbffe3 100644
--- a/components/display_compositor.gypi
+++ b/components/display_compositor.gypi
@@ -10,6 +10,7 @@
       'type': '<(component)',
       'dependencies': [
         '../base/base.gyp:base',
+        '../cc/cc.gyp:cc',
         '../gpu/gpu.gyp:command_buffer_client',
         '../gpu/gpu.gyp:command_buffer_common',
         '../skia/skia.gyp:skia',
@@ -33,6 +34,13 @@
       'sources': [
         'display_compositor/buffer_queue.cc',
         'display_compositor/buffer_queue.h',
+        'display_compositor/compositor_overlay_candidate_validator.h',
+        'display_compositor/compositor_overlay_candidate_validator_android.cc',
+        'display_compositor/compositor_overlay_candidate_validator_android.h',
+        'display_compositor/compositor_overlay_candidate_validator_mac.h',
+        'display_compositor/compositor_overlay_candidate_validator_mac.mm',
+        'display_compositor/compositor_overlay_candidate_validator_ozone.cc',
+        'display_compositor/compositor_overlay_candidate_validator_ozone.h',
         'display_compositor/display_compositor_export.h',
         'display_compositor/gl_helper.cc',
         'display_compositor/gl_helper.h',
@@ -40,7 +48,14 @@
         'display_compositor/gl_helper_readback_support.h',
         'display_compositor/gl_helper_scaling.cc',
         'display_compositor/gl_helper_scaling.h',
-      ]
+      ],
+      'conditions': [
+        ['use_ozone==1', {
+          'dependencies': [
+            '../ui/ozone/ozone.gyp:ozone_base',
+          ],
+        }],
+      ],
     },
     {
       # GN version: //components/display_compositor:display_compositor_unittests
diff --git a/components/display_compositor/BUILD.gn b/components/display_compositor/BUILD.gn
index d9964b7..00c47ff 100644
--- a/components/display_compositor/BUILD.gn
+++ b/components/display_compositor/BUILD.gn
@@ -2,12 +2,14 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/ui.gni")
 import("//testing/test.gni")
 
 component("display_compositor") {
   sources = [
     "buffer_queue.cc",
     "buffer_queue.h",
+    "compositor_overlay_candidate_validator.h",
     "display_compositor_export.h",
     "gl_helper.cc",
     "gl_helper.h",
@@ -30,6 +32,29 @@
     "//skia",
     "//ui/gfx",
   ]
+
+  if (is_mac) {
+    sources += [
+      "compositor_overlay_candidate_validator_mac.h",
+      "compositor_overlay_candidate_validator_mac.mm",
+    ]
+  }
+
+  if (is_android) {
+    sources += [
+      "compositor_overlay_candidate_validator_android.cc",
+      "compositor_overlay_candidate_validator_android.h",
+    ]
+  }
+
+  if (use_ozone) {
+    sources += [
+      "compositor_overlay_candidate_validator_ozone.cc",
+      "compositor_overlay_candidate_validator_ozone.h",
+    ]
+
+    deps += [ "//ui/ozone" ]
+  }
 }
 
 test("display_compositor_unittests") {
diff --git a/components/display_compositor/DEPS b/components/display_compositor/DEPS
index 5d99c70..34fad93b 100644
--- a/components/display_compositor/DEPS
+++ b/components/display_compositor/DEPS
@@ -9,6 +9,7 @@
   "+third_party/skia",
   "+ui/gfx",
   "+ui/gl",
+  "+ui/ozone/public",
 ]
 
 specific_include_rules = {
diff --git a/components/display_compositor/compositor_overlay_candidate_validator.h b/components/display_compositor/compositor_overlay_candidate_validator.h
new file mode 100644
index 0000000..faec8a0
--- /dev/null
+++ b/components/display_compositor/compositor_overlay_candidate_validator.h
@@ -0,0 +1,28 @@
+// Copyright 2015 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 COMPONENTS_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_H_
+#define COMPONENTS_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_H_
+
+#include "base/macros.h"
+#include "cc/output/overlay_candidate_validator.h"
+#include "components/display_compositor/display_compositor_export.h"
+
+namespace display_compositor {
+
+class DISPLAY_COMPOSITOR_EXPORT CompositorOverlayCandidateValidator
+    : public cc::OverlayCandidateValidator {
+ public:
+  CompositorOverlayCandidateValidator() {}
+  ~CompositorOverlayCandidateValidator() override {}
+
+  virtual void SetSoftwareMirrorMode(bool enabled) = 0;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CompositorOverlayCandidateValidator);
+};
+
+}  // namespace display_compositor
+
+#endif  // COMPONENTS_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_H_
diff --git a/content/browser/compositor/browser_compositor_overlay_candidate_validator_android.cc b/components/display_compositor/compositor_overlay_candidate_validator_android.cc
similarity index 65%
rename from content/browser/compositor/browser_compositor_overlay_candidate_validator_android.cc
rename to components/display_compositor/compositor_overlay_candidate_validator_android.cc
index e04a241..d2befbe 100644
--- a/content/browser/compositor/browser_compositor_overlay_candidate_validator_android.cc
+++ b/components/display_compositor/compositor_overlay_candidate_validator_android.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/browser/compositor/browser_compositor_overlay_candidate_validator_android.h"
+#include "components/display_compositor/compositor_overlay_candidate_validator_android.h"
 
 #include <memory>
 
@@ -11,21 +11,21 @@
 #include "cc/output/overlay_strategy_underlay.h"
 #include "ui/gfx/geometry/rect_conversions.h"
 
-namespace content {
+namespace display_compositor {
 
-BrowserCompositorOverlayCandidateValidatorAndroid::
-    BrowserCompositorOverlayCandidateValidatorAndroid() {}
+CompositorOverlayCandidateValidatorAndroid::
+    CompositorOverlayCandidateValidatorAndroid() {}
 
-BrowserCompositorOverlayCandidateValidatorAndroid::
-    ~BrowserCompositorOverlayCandidateValidatorAndroid() {}
+CompositorOverlayCandidateValidatorAndroid::
+    ~CompositorOverlayCandidateValidatorAndroid() {}
 
-void BrowserCompositorOverlayCandidateValidatorAndroid::GetStrategies(
+void CompositorOverlayCandidateValidatorAndroid::GetStrategies(
     cc::OverlayProcessor::StrategyList* strategies) {
   strategies->push_back(
       base::WrapUnique(new cc::OverlayStrategyUnderlay(this)));
 }
 
-void BrowserCompositorOverlayCandidateValidatorAndroid::CheckOverlaySupport(
+void CompositorOverlayCandidateValidatorAndroid::CheckOverlaySupport(
     cc::OverlayCandidateList* candidates) {
   // There should only be at most a single overlay candidate: the video quad.
   // There's no check that the presented candidate is really a video frame for
@@ -42,13 +42,13 @@
   }
 }
 
-bool BrowserCompositorOverlayCandidateValidatorAndroid::AllowCALayerOverlays() {
+bool CompositorOverlayCandidateValidatorAndroid::AllowCALayerOverlays() {
   return false;
 }
 
 // Overlays will still be allowed when software mirroring is enabled, even
 // though they won't appear in the mirror.
-void BrowserCompositorOverlayCandidateValidatorAndroid::SetSoftwareMirrorMode(
+void CompositorOverlayCandidateValidatorAndroid::SetSoftwareMirrorMode(
     bool enabled) {}
 
-}  // namespace content
+}  // namespace display_compositor
diff --git a/components/display_compositor/compositor_overlay_candidate_validator_android.h b/components/display_compositor/compositor_overlay_candidate_validator_android.h
new file mode 100644
index 0000000..0dd3becf
--- /dev/null
+++ b/components/display_compositor/compositor_overlay_candidate_validator_android.h
@@ -0,0 +1,40 @@
+// Copyright 2015 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 COMPONENTS_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_ANDROID_H_
+#define COMPONENTS_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_ANDROID_H_
+
+#include "base/macros.h"
+#include "components/display_compositor/compositor_overlay_candidate_validator.h"
+#include "components/display_compositor/display_compositor_export.h"
+
+namespace display_compositor {
+
+// An overlay validator for supporting fullscreen video underlays on Android.
+// Things are a bit different on Android compared with other platforms. By the
+// time a video frame is marked as overlayable it means the video decoder was
+// outputting to a Surface that we can't read back from. As a result, the
+// overlay must always succeed, or the video won't be visible. This is one of of
+// the reasons that only fullscreen is supported: we have to be sure that
+// nothing will cause the overlay to be rejected, because there's no fallback to
+// gl compositing.
+class DISPLAY_COMPOSITOR_EXPORT CompositorOverlayCandidateValidatorAndroid
+    : public CompositorOverlayCandidateValidator {
+ public:
+  CompositorOverlayCandidateValidatorAndroid();
+  ~CompositorOverlayCandidateValidatorAndroid() override;
+
+  void GetStrategies(cc::OverlayProcessor::StrategyList* strategies) override;
+  void CheckOverlaySupport(cc::OverlayCandidateList* surfaces) override;
+  bool AllowCALayerOverlays() override;
+
+  void SetSoftwareMirrorMode(bool enabled) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CompositorOverlayCandidateValidatorAndroid);
+};
+
+}  // namespace display_compositor
+
+#endif  // COMPONENTS_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_ANDROID_H_
diff --git a/components/display_compositor/compositor_overlay_candidate_validator_mac.h b/components/display_compositor/compositor_overlay_candidate_validator_mac.h
new file mode 100644
index 0000000..c08288f
--- /dev/null
+++ b/components/display_compositor/compositor_overlay_candidate_validator_mac.h
@@ -0,0 +1,41 @@
+// Copyright 2015 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 COMPONENTS_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_MAC_H_
+#define COMPONENTS_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_MAC_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "components/display_compositor/compositor_overlay_candidate_validator.h"
+#include "components/display_compositor/display_compositor_export.h"
+#include "ui/gfx/native_widget_types.h"
+
+namespace display_compositor {
+
+class DISPLAY_COMPOSITOR_EXPORT CompositorOverlayCandidateValidatorMac
+    : public CompositorOverlayCandidateValidator {
+ public:
+  explicit CompositorOverlayCandidateValidatorMac(bool ca_layer_disabled);
+  ~CompositorOverlayCandidateValidatorMac() override;
+
+  // cc::OverlayCandidateValidator implementation.
+  void GetStrategies(cc::OverlayProcessor::StrategyList* strategies) override;
+  bool AllowCALayerOverlays() override;
+  void CheckOverlaySupport(cc::OverlayCandidateList* surfaces) override;
+
+  // CompositorOverlayCandidateValidator implementation.
+  void SetSoftwareMirrorMode(bool enabled) override;
+
+ private:
+  gfx::AcceleratedWidget widget_;
+  bool software_mirror_active_;
+  const bool ca_layer_disabled_;
+
+  DISALLOW_COPY_AND_ASSIGN(CompositorOverlayCandidateValidatorMac);
+};
+
+}  // namespace display_compositor
+
+#endif  // COMPONENTS_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_MAC_H_
diff --git a/components/display_compositor/compositor_overlay_candidate_validator_mac.mm b/components/display_compositor/compositor_overlay_candidate_validator_mac.mm
new file mode 100644
index 0000000..7bf52fa
--- /dev/null
+++ b/components/display_compositor/compositor_overlay_candidate_validator_mac.mm
@@ -0,0 +1,33 @@
+// Copyright 2015 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 "components/display_compositor/compositor_overlay_candidate_validator_mac.h"
+
+#include <stddef.h>
+
+namespace display_compositor {
+
+CompositorOverlayCandidateValidatorMac::CompositorOverlayCandidateValidatorMac(
+    bool ca_layer_disabled)
+    : software_mirror_active_(false), ca_layer_disabled_(ca_layer_disabled) {}
+
+CompositorOverlayCandidateValidatorMac::
+    ~CompositorOverlayCandidateValidatorMac() {}
+
+void CompositorOverlayCandidateValidatorMac::GetStrategies(
+    cc::OverlayProcessor::StrategyList* strategies) {}
+
+bool CompositorOverlayCandidateValidatorMac::AllowCALayerOverlays() {
+  return !ca_layer_disabled_ && !software_mirror_active_;
+}
+
+void CompositorOverlayCandidateValidatorMac::CheckOverlaySupport(
+    cc::OverlayCandidateList* surfaces) {}
+
+void CompositorOverlayCandidateValidatorMac::SetSoftwareMirrorMode(
+    bool enabled) {
+  software_mirror_active_ = enabled;
+}
+
+}  // namespace display_compositor
diff --git a/content/browser/compositor/browser_compositor_overlay_candidate_validator_ozone.cc b/components/display_compositor/compositor_overlay_candidate_validator_ozone.cc
similarity index 80%
rename from content/browser/compositor/browser_compositor_overlay_candidate_validator_ozone.cc
rename to components/display_compositor/compositor_overlay_candidate_validator_ozone.cc
index 44b5041..644f21af 100644
--- a/content/browser/compositor/browser_compositor_overlay_candidate_validator_ozone.cc
+++ b/components/display_compositor/compositor_overlay_candidate_validator_ozone.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/browser/compositor/browser_compositor_overlay_candidate_validator_ozone.h"
+#include "components/display_compositor/compositor_overlay_candidate_validator_ozone.h"
 
 #include <stddef.h>
 
@@ -13,7 +13,7 @@
 #include "cc/output/overlay_strategy_underlay.h"
 #include "ui/ozone/public/overlay_candidates_ozone.h"
 
-namespace content {
+namespace display_compositor {
 
 static gfx::BufferFormat GetBufferFormat(cc::ResourceFormat overlay_format) {
   switch (overlay_format) {
@@ -27,17 +27,16 @@
   }
 }
 
-BrowserCompositorOverlayCandidateValidatorOzone::
-    BrowserCompositorOverlayCandidateValidatorOzone(
+CompositorOverlayCandidateValidatorOzone::
+    CompositorOverlayCandidateValidatorOzone(
         std::unique_ptr<ui::OverlayCandidatesOzone> overlay_candidates)
     : overlay_candidates_(std::move(overlay_candidates)),
       software_mirror_active_(false) {}
 
-BrowserCompositorOverlayCandidateValidatorOzone::
-    ~BrowserCompositorOverlayCandidateValidatorOzone() {
-}
+CompositorOverlayCandidateValidatorOzone::
+    ~CompositorOverlayCandidateValidatorOzone() {}
 
-void BrowserCompositorOverlayCandidateValidatorOzone::GetStrategies(
+void CompositorOverlayCandidateValidatorOzone::GetStrategies(
     cc::OverlayProcessor::StrategyList* strategies) {
   strategies->push_back(
       base::WrapUnique(new cc::OverlayStrategySingleOnTop(this)));
@@ -45,11 +44,11 @@
       base::WrapUnique(new cc::OverlayStrategyUnderlay(this)));
 }
 
-bool BrowserCompositorOverlayCandidateValidatorOzone::AllowCALayerOverlays() {
+bool CompositorOverlayCandidateValidatorOzone::AllowCALayerOverlays() {
   return false;
 }
 
-void BrowserCompositorOverlayCandidateValidatorOzone::CheckOverlaySupport(
+void CompositorOverlayCandidateValidatorOzone::CheckOverlaySupport(
     cc::OverlayCandidateList* surfaces) {
   // SW mirroring copies out of the framebuffer, so we can't remove any
   // quads for overlaying, otherwise the output is incorrect.
@@ -83,9 +82,9 @@
   }
 }
 
-void BrowserCompositorOverlayCandidateValidatorOzone::SetSoftwareMirrorMode(
+void CompositorOverlayCandidateValidatorOzone::SetSoftwareMirrorMode(
     bool enabled) {
   software_mirror_active_ = enabled;
 }
 
-}  // namespace content
+}  // namespace display_compositor
diff --git a/components/display_compositor/compositor_overlay_candidate_validator_ozone.h b/components/display_compositor/compositor_overlay_candidate_validator_ozone.h
new file mode 100644
index 0000000..e157827
--- /dev/null
+++ b/components/display_compositor/compositor_overlay_candidate_validator_ozone.h
@@ -0,0 +1,45 @@
+// Copyright 2014 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 COMPONENTS_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_OZONE_H_
+#define COMPONENTS_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_OZONE_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "components/display_compositor/compositor_overlay_candidate_validator.h"
+#include "components/display_compositor/display_compositor_export.h"
+#include "ui/gfx/native_widget_types.h"
+
+namespace ui {
+class OverlayCandidatesOzone;
+}
+
+namespace display_compositor {
+
+class DISPLAY_COMPOSITOR_EXPORT CompositorOverlayCandidateValidatorOzone
+    : public CompositorOverlayCandidateValidator {
+ public:
+  explicit CompositorOverlayCandidateValidatorOzone(
+      std::unique_ptr<ui::OverlayCandidatesOzone> overlay_candidates);
+  ~CompositorOverlayCandidateValidatorOzone() override;
+
+  // cc::OverlayCandidateValidator implementation.
+  void GetStrategies(cc::OverlayProcessor::StrategyList* strategies) override;
+  bool AllowCALayerOverlays() override;
+  void CheckOverlaySupport(cc::OverlayCandidateList* surfaces) override;
+
+  // CompositorOverlayCandidateValidator implementation.
+  void SetSoftwareMirrorMode(bool enabled) override;
+
+ private:
+  std::unique_ptr<ui::OverlayCandidatesOzone> overlay_candidates_;
+  bool software_mirror_active_;
+
+  DISALLOW_COPY_AND_ASSIGN(CompositorOverlayCandidateValidatorOzone);
+};
+
+}  // namespace display_compositor
+
+#endif  // COMPONENTS_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_OZONE_H_
diff --git a/components/dom_distiller/content/browser/distillability_driver.cc b/components/dom_distiller/content/browser/distillability_driver.cc
index 3feb13bba..8e6ad93 100644
--- a/components/dom_distiller/content/browser/distillability_driver.cc
+++ b/components/dom_distiller/content/browser/distillability_driver.cc
@@ -21,19 +21,20 @@
  public:
   DistillabilityServiceImpl(
       mojo::InterfaceRequest<DistillabilityService> request,
-      DistillabilityDriver* distillability_driver)
+      base::WeakPtr<DistillabilityDriver> distillability_driver)
       : binding_(this, std::move(request)),
         distillability_driver_(distillability_driver) {}
 
   ~DistillabilityServiceImpl() override {}
 
   void NotifyIsDistillable(bool is_distillable, bool is_last_update) override {
+    if (!distillability_driver_) return;
     distillability_driver_->OnDistillability(is_distillable, is_last_update);
   }
 
  private:
   mojo::StrongBinding<DistillabilityService> binding_;
-  DistillabilityDriver* distillability_driver_;
+  base::WeakPtr<DistillabilityDriver> distillability_driver_;
 };
 
 DistillabilityDriver::DistillabilityDriver(
@@ -49,7 +50,7 @@
 
 void DistillabilityDriver::CreateDistillabilityService(
     mojo::InterfaceRequest<DistillabilityService> request) {
-  new DistillabilityServiceImpl(std::move(request), this);
+  new DistillabilityServiceImpl(std::move(request), weak_factory_.GetWeakPtr());
 }
 
 void DistillabilityDriver::SetDelegate(
@@ -62,11 +63,6 @@
   if (m_delegate_.is_null()) return;
 
   m_delegate_.Run(distillable, is_last);
-
-  if (web_contents() && is_last) {
-    web_contents()->GetMainFrame()->GetServiceRegistry()
-        ->RemoveService<DistillabilityService>();
-  }
 }
 
 void DistillabilityDriver::DidStartProvisionalLoadForFrame(
diff --git a/components/exo/pointer.cc b/components/exo/pointer.cc
index 1613e3c..42a2346 100644
--- a/components/exo/pointer.cc
+++ b/components/exo/pointer.cc
@@ -10,6 +10,7 @@
 #include "components/exo/surface.h"
 #include "ui/aura/window.h"
 #include "ui/events/event.h"
+#include "ui/gfx/geometry/vector2d_conversions.h"
 #include "ui/views/widget/widget.h"
 
 namespace exo {
@@ -86,9 +87,9 @@
     }
     // Second generate an enter event if focus moved to a new target.
     if (target) {
-      delegate_->OnPointerEnter(target, event->location(),
+      delegate_->OnPointerEnter(target, event->location_f(),
                                 event->button_flags());
-      location_ = event->location();
+      location_ = event->location_f();
       focus_ = target;
       focus_->AddSurfaceObserver(this);
     }
@@ -111,10 +112,10 @@
       // here as mouse movement can generate both "moved" and "entered" events
       // but OnPointerMotion should only be called if location changed since
       // OnPointerEnter was called.
-      if (focus_ && event->location() != location_) {
-        delegate_->OnPointerMotion(event->time_stamp(), event->location());
+      if (focus_ && event->location_f() != location_) {
+        delegate_->OnPointerMotion(event->time_stamp(), event->location_f());
         delegate_->OnPointerFrame();
-        location_ = event->location();
+        location_ = event->location_f();
       }
       break;
     case ui::ET_SCROLL:
@@ -160,9 +161,10 @@
   if (focus_) {
     if (!widget_)
       CreatePointerWidget();
-    widget_->SetBounds(gfx::Rect(
-        focus_->GetBoundsInScreen().origin() + location_.OffsetFromOrigin(),
-        gfx::Size(1, 1)));
+    widget_->SetBounds(
+        gfx::Rect(focus_->GetBoundsInScreen().origin() +
+                      gfx::ToRoundedVector2d(location_.OffsetFromOrigin()),
+                  gfx::Size(1, 1)));
     if (!widget_->IsVisible())
       widget_->Show();
   } else {
diff --git a/components/exo/pointer.h b/components/exo/pointer.h
index be23d0af..ffa6fce 100644
--- a/components/exo/pointer.h
+++ b/components/exo/pointer.h
@@ -12,6 +12,7 @@
 #include "components/exo/surface_observer.h"
 #include "ui/events/event_handler.h"
 #include "ui/gfx/geometry/point.h"
+#include "ui/gfx/geometry/point_f.h"
 
 namespace ui {
 class Event;
@@ -74,7 +75,7 @@
   Surface* focus_;
 
   // The location of the pointer in the current focus surface.
-  gfx::Point location_;
+  gfx::PointF location_;
 
   // The position of the pointer surface relative to the pointer location.
   gfx::Point hotspot_;
diff --git a/components/exo/pointer_delegate.h b/components/exo/pointer_delegate.h
index 3fb3ab6..e9c7193 100644
--- a/components/exo/pointer_delegate.h
+++ b/components/exo/pointer_delegate.h
@@ -10,6 +10,7 @@
 
 namespace gfx {
 class Point;
+class PointF;
 class Vector2dF;
 }
 
@@ -32,7 +33,7 @@
   // is the location of pointer relative to the origin of surface and
   // |button_flags| contains all currently pressed buttons.
   virtual void OnPointerEnter(Surface* surface,
-                              const gfx::Point& location,
+                              const gfx::PointF& location,
                               int pressed_button_flags) = 0;
 
   // Called when pointer leaves a valid target surface.
@@ -40,7 +41,7 @@
 
   // Called when pointer moved within the current target surface.
   virtual void OnPointerMotion(base::TimeDelta time_stamp,
-                               const gfx::Point& location) = 0;
+                               const gfx::PointF& location) = 0;
 
   // Called when pointer button state changed. |changed_button_flags| contains
   // all buttons that changed. |pressed| is true if buttons entered pressed
diff --git a/components/exo/pointer_unittest.cc b/components/exo/pointer_unittest.cc
index 604b9c6..81dec792 100644
--- a/components/exo/pointer_unittest.cc
+++ b/components/exo/pointer_unittest.cc
@@ -26,9 +26,9 @@
   // Overridden from PointerDelegate:
   MOCK_METHOD1(OnPointerDestroying, void(Pointer*));
   MOCK_CONST_METHOD1(CanAcceptPointerEventsForSurface, bool(Surface*));
-  MOCK_METHOD3(OnPointerEnter, void(Surface*, const gfx::Point&, int));
+  MOCK_METHOD3(OnPointerEnter, void(Surface*, const gfx::PointF&, int));
   MOCK_METHOD1(OnPointerLeave, void(Surface*));
-  MOCK_METHOD2(OnPointerMotion, void(base::TimeDelta, const gfx::Point&));
+  MOCK_METHOD2(OnPointerMotion, void(base::TimeDelta, const gfx::PointF&));
   MOCK_METHOD3(OnPointerButton, void(base::TimeDelta, int, bool));
   MOCK_METHOD3(OnPointerScroll,
                void(base::TimeDelta, const gfx::Vector2dF&, bool));
@@ -53,7 +53,7 @@
   EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(surface.get()))
       .WillRepeatedly(testing::Return(true));
   EXPECT_CALL(delegate, OnPointerFrame()).Times(1);
-  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::Point(), 0));
+  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::PointF(), 0));
   generator.MoveMouseTo(surface->GetBoundsInScreen().origin());
 
   std::unique_ptr<Surface> pointer_surface(new Surface);
@@ -91,7 +91,7 @@
   EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(surface.get()))
       .WillRepeatedly(testing::Return(true));
   EXPECT_CALL(delegate, OnPointerFrame()).Times(1);
-  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::Point(), 0));
+  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::PointF(), 0));
   generator.MoveMouseTo(surface->GetBoundsInScreen().origin());
 
   EXPECT_CALL(delegate, OnPointerDestroying(pointer.get()));
@@ -114,7 +114,7 @@
   EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(surface.get()))
       .WillRepeatedly(testing::Return(true));
   EXPECT_CALL(delegate, OnPointerFrame()).Times(2);
-  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::Point(), 0));
+  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::PointF(), 0));
   generator.MoveMouseTo(surface->GetBoundsInScreen().origin());
 
   EXPECT_CALL(delegate, OnPointerLeave(surface.get()));
@@ -141,10 +141,10 @@
       .WillRepeatedly(testing::Return(true));
   EXPECT_CALL(delegate, OnPointerFrame()).Times(6);
 
-  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::Point(), 0));
+  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::PointF(), 0));
   generator.MoveMouseTo(surface->GetBoundsInScreen().origin());
 
-  EXPECT_CALL(delegate, OnPointerMotion(testing::_, gfx::Point(1, 1)));
+  EXPECT_CALL(delegate, OnPointerMotion(testing::_, gfx::PointF(1, 1)));
   generator.MoveMouseTo(surface->GetBoundsInScreen().origin() +
                         gfx::Vector2d(1, 1));
 
@@ -162,10 +162,10 @@
       .WillRepeatedly(testing::Return(true));
 
   EXPECT_CALL(delegate, OnPointerLeave(surface.get()));
-  EXPECT_CALL(delegate, OnPointerEnter(sub_surface.get(), gfx::Point(), 0));
+  EXPECT_CALL(delegate, OnPointerEnter(sub_surface.get(), gfx::PointF(), 0));
   generator.MoveMouseTo(sub_surface->GetBoundsInScreen().origin());
 
-  EXPECT_CALL(delegate, OnPointerMotion(testing::_, gfx::Point(1, 1)));
+  EXPECT_CALL(delegate, OnPointerMotion(testing::_, gfx::PointF(1, 1)));
   generator.MoveMouseTo(sub_surface->GetBoundsInScreen().origin() +
                         gfx::Vector2d(1, 1));
 
@@ -182,10 +182,10 @@
       .WillRepeatedly(testing::Return(true));
 
   EXPECT_CALL(delegate, OnPointerLeave(sub_surface.get()));
-  EXPECT_CALL(delegate, OnPointerEnter(child_surface.get(), gfx::Point(), 0));
+  EXPECT_CALL(delegate, OnPointerEnter(child_surface.get(), gfx::PointF(), 0));
   generator.MoveMouseTo(child_surface->GetBoundsInScreen().origin());
 
-  EXPECT_CALL(delegate, OnPointerMotion(testing::_, gfx::Point(10, 10)));
+  EXPECT_CALL(delegate, OnPointerMotion(testing::_, gfx::PointF(10, 10)));
   generator.MoveMouseTo(child_surface->GetBoundsInScreen().origin() +
                         gfx::Vector2d(10, 10));
 
@@ -210,7 +210,7 @@
       .WillRepeatedly(testing::Return(true));
   EXPECT_CALL(delegate, OnPointerFrame()).Times(3);
 
-  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::Point(), 0));
+  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::PointF(), 0));
   generator.MoveMouseTo(surface->GetBoundsInScreen().origin());
 
   EXPECT_CALL(delegate,
@@ -241,7 +241,7 @@
       .WillRepeatedly(testing::Return(true));
   EXPECT_CALL(delegate, OnPointerFrame()).Times(4);
 
-  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::Point(), 0));
+  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::PointF(), 0));
   generator.MoveMouseTo(location);
 
   {
@@ -276,7 +276,7 @@
       .WillRepeatedly(testing::Return(true));
   EXPECT_CALL(delegate, OnPointerFrame()).Times(2);
 
-  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::Point(), 0));
+  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::PointF(), 0));
   generator.MoveMouseTo(surface->GetBoundsInScreen().origin());
 
   EXPECT_CALL(delegate,
diff --git a/components/exo/wayland/server.cc b/components/exo/wayland/server.cc
index 5ad216ab..b7b6545 100644
--- a/components/exo/wayland/server.cc
+++ b/components/exo/wayland/server.cc
@@ -1426,15 +1426,15 @@
            wl_resource_get_client(surface_resource) == client();
   }
   void OnPointerEnter(Surface* surface,
-                      const gfx::Point& location,
+                      const gfx::PointF& location,
                       int button_flags) override {
     wl_resource* surface_resource = surface->GetProperty(kSurfaceResourceKey);
     DCHECK(surface_resource);
     // Should we be sending button events to the client before the enter event
     // if client's pressed button state is different from |button_flags|?
     wl_pointer_send_enter(pointer_resource_, next_serial(), surface_resource,
-                          wl_fixed_from_int(location.x()),
-                          wl_fixed_from_int(location.y()));
+                          wl_fixed_from_double(location.x()),
+                          wl_fixed_from_double(location.y()));
   }
   void OnPointerLeave(Surface* surface) override {
     wl_resource* surface_resource = surface->GetProperty(kSurfaceResourceKey);
@@ -1442,10 +1442,10 @@
     wl_pointer_send_leave(pointer_resource_, next_serial(), surface_resource);
   }
   void OnPointerMotion(base::TimeDelta time_stamp,
-                       const gfx::Point& location) override {
+                       const gfx::PointF& location) override {
     wl_pointer_send_motion(pointer_resource_, time_stamp.InMilliseconds(),
-                           wl_fixed_from_int(location.x()),
-                           wl_fixed_from_int(location.y()));
+                           wl_fixed_from_double(location.x()),
+                           wl_fixed_from_double(location.y()));
   }
   void OnPointerButton(base::TimeDelta time_stamp,
                        int button_flags,
diff --git a/components/filesystem/BUILD.gn b/components/filesystem/BUILD.gn
index 0f587b30..22a8c40 100644
--- a/components/filesystem/BUILD.gn
+++ b/components/filesystem/BUILD.gn
@@ -16,6 +16,8 @@
     "file_system_impl.h",
     "lock_table.cc",
     "lock_table.h",
+    "shared_temp_dir.cc",
+    "shared_temp_dir.h",
     "util.cc",
     "util.h",
   ]
diff --git a/components/filesystem/directory_impl.cc b/components/filesystem/directory_impl.cc
index 986526b..d6430710 100644
--- a/components/filesystem/directory_impl.cc
+++ b/components/filesystem/directory_impl.cc
@@ -24,15 +24,14 @@
 
 DirectoryImpl::DirectoryImpl(mojo::InterfaceRequest<Directory> request,
                              base::FilePath directory_path,
-                             std::unique_ptr<base::ScopedTempDir> temp_dir,
+                             scoped_refptr<SharedTempDir> temp_dir,
                              scoped_refptr<LockTable> lock_table)
     : binding_(this, std::move(request)),
       directory_path_(directory_path),
       temp_dir_(std::move(temp_dir)),
       lock_table_(std::move(lock_table)) {}
 
-DirectoryImpl::~DirectoryImpl() {
-}
+DirectoryImpl::~DirectoryImpl() {}
 
 void DirectoryImpl::Read(const ReadCallback& callback) {
   mojo::Array<DirectoryEntryPtr> entries;
@@ -83,7 +82,8 @@
   }
 
   if (file.is_pending()) {
-    new FileImpl(std::move(file), path, std::move(base_file), lock_table_);
+    new FileImpl(std::move(file), path, std::move(base_file), temp_dir_,
+                 lock_table_);
   }
   callback.Run(FileError::OK);
 }
@@ -155,7 +155,7 @@
   }
 
   if (directory.is_pending())
-    new DirectoryImpl(std::move(directory), path, nullptr, lock_table_);
+    new DirectoryImpl(std::move(directory), path, temp_dir_, lock_table_);
   callback.Run(FileError::OK);
 }
 
@@ -267,6 +267,13 @@
   callback.Run(FileError::OK, MakeFileInformation(info));
 }
 
+void DirectoryImpl::Clone(mojo::InterfaceRequest<Directory> directory) {
+  if (directory.is_pending()) {
+    new DirectoryImpl(std::move(directory), directory_path_,
+                      temp_dir_, lock_table_);
+  }
+}
+
 void DirectoryImpl::ReadEntireFile(const mojo::String& raw_path,
                                    const ReadEntireFileCallback& callback) {
   base::FilePath path;
diff --git a/components/filesystem/directory_impl.h b/components/filesystem/directory_impl.h
index 6924271..d88773a5a 100644
--- a/components/filesystem/directory_impl.h
+++ b/components/filesystem/directory_impl.h
@@ -13,13 +13,10 @@
 #include "base/files/scoped_file.h"
 #include "base/macros.h"
 #include "components/filesystem/public/interfaces/directory.mojom.h"
+#include "components/filesystem/shared_temp_dir.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 
-namespace base {
-class ScopedTempDir;
-}  // namespace base
-
 namespace filesystem {
 
 class LockTable;
@@ -30,7 +27,7 @@
   // when this object is destroyed.
   DirectoryImpl(mojo::InterfaceRequest<Directory> request,
                 base::FilePath directory_path,
-                std::unique_ptr<base::ScopedTempDir> temp_dir,
+                scoped_refptr<SharedTempDir> temp_dir,
                 scoped_refptr<LockTable> lock_table);
   ~DirectoryImpl() override;
 
@@ -64,6 +61,7 @@
   void Flush(const FlushCallback& callback) override;
   void StatFile(const mojo::String& path,
                 const StatFileCallback& callback) override;
+  void Clone(mojo::InterfaceRequest<Directory> directory) override;
   void ReadEntireFile(const mojo::String& path,
                       const ReadEntireFileCallback& callback) override;
   void WriteFile(const mojo::String& path,
@@ -73,7 +71,7 @@
  private:
   mojo::StrongBinding<Directory> binding_;
   base::FilePath directory_path_;
-  std::unique_ptr<base::ScopedTempDir> temp_dir_;
+  scoped_refptr<SharedTempDir> temp_dir_;
   scoped_refptr<LockTable> lock_table_;
 
   DISALLOW_COPY_AND_ASSIGN(DirectoryImpl);
diff --git a/components/filesystem/directory_impl_unittest.cc b/components/filesystem/directory_impl_unittest.cc
index daac202..d6cdd72d 100644
--- a/components/filesystem/directory_impl_unittest.cc
+++ b/components/filesystem/directory_impl_unittest.cc
@@ -154,6 +154,40 @@
   }
 }
 
+TEST_F(DirectoryImplTest, Clone) {
+  DirectoryPtr clone_one;
+  DirectoryPtr clone_two;
+  FileError error;
+
+  {
+    DirectoryPtr directory;
+    GetTemporaryRoot(&directory);
+
+    directory->Clone(GetProxy(&clone_one));
+    directory->Clone(GetProxy(&clone_two));
+
+    // Original temporary directory goes out of scope here; shouldn't be
+    // deleted since it has clones.
+  }
+
+  std::string data("one two three");
+  {
+    clone_one->WriteFile("data", mojo::Array<uint8_t>::From(data),
+                         Capture(&error));
+    ASSERT_TRUE(clone_one.WaitForIncomingResponse());
+    EXPECT_EQ(FileError::OK, error);
+  }
+
+  {
+    mojo::Array<uint8_t> file_contents;
+    clone_two->ReadEntireFile("data", Capture(&error, &file_contents));
+    ASSERT_TRUE(clone_two.WaitForIncomingResponse());
+    EXPECT_EQ(FileError::OK, error);
+
+    EXPECT_EQ(data, file_contents.To<std::string>());
+  }
+}
+
 TEST_F(DirectoryImplTest, WriteFileReadFile) {
   DirectoryPtr directory;
   GetTemporaryRoot(&directory);
diff --git a/components/filesystem/file_impl.cc b/components/filesystem/file_impl.cc
index 13ebced6..ee73031 100644
--- a/components/filesystem/file_impl.cc
+++ b/components/filesystem/file_impl.cc
@@ -14,6 +14,7 @@
 #include "base/logging.h"
 #include "build/build_config.h"
 #include "components/filesystem/lock_table.h"
+#include "components/filesystem/shared_temp_dir.h"
 #include "components/filesystem/util.h"
 #include "mojo/common/common_type_converters.h"
 #include "mojo/platform_handle/platform_handle_functions.h"
@@ -34,10 +35,12 @@
 FileImpl::FileImpl(mojo::InterfaceRequest<File> request,
                    const base::FilePath& path,
                    uint32_t flags,
+                   scoped_refptr<SharedTempDir> temp_dir,
                    scoped_refptr<LockTable> lock_table)
     : binding_(this, std::move(request)),
       file_(path, flags),
       path_(path),
+      temp_dir_(std::move(temp_dir)),
       lock_table_(std::move(lock_table)) {
   DCHECK(file_.IsValid());
 }
@@ -45,10 +48,12 @@
 FileImpl::FileImpl(mojo::InterfaceRequest<File> request,
                    const base::FilePath& path,
                    base::File file,
+                   scoped_refptr<SharedTempDir> temp_dir,
                    scoped_refptr<LockTable> lock_table)
     : binding_(this, std::move(request)),
       file_(std::move(file)),
       path_(path),
+      temp_dir_(std::move(temp_dir)),
       lock_table_(std::move(lock_table)) {
   DCHECK(file_.IsValid());
 }
@@ -297,7 +302,8 @@
   }
 
   if (file.is_pending())
-    new FileImpl(std::move(file), path_, std::move(new_file), lock_table_);
+    new FileImpl(std::move(file), path_, std::move(new_file), temp_dir_,
+                 lock_table_);
   callback.Run(FileError::OK);
 }
 
diff --git a/components/filesystem/file_impl.h b/components/filesystem/file_impl.h
index bdae38e0..6a232fd 100644
--- a/components/filesystem/file_impl.h
+++ b/components/filesystem/file_impl.h
@@ -21,16 +21,19 @@
 namespace filesystem {
 
 class LockTable;
+class SharedTempDir;
 
 class FileImpl : public File {
  public:
   FileImpl(mojo::InterfaceRequest<File> request,
            const base::FilePath& path,
            uint32_t flags,
+           scoped_refptr<SharedTempDir> temp_dir,
            scoped_refptr<LockTable> lock_table);
   FileImpl(mojo::InterfaceRequest<File> request,
            const base::FilePath& path,
            base::File file,
+           scoped_refptr<SharedTempDir> temp_dir,
            scoped_refptr<LockTable> lock_table);
   ~FileImpl() override;
 
@@ -74,6 +77,7 @@
   mojo::StrongBinding<File> binding_;
   base::File file_;
   base::FilePath path_;
+  scoped_refptr<SharedTempDir> temp_dir_;
   scoped_refptr<LockTable> lock_table_;
 
   DISALLOW_COPY_AND_ASSIGN(FileImpl);
diff --git a/components/filesystem/file_system_impl.cc b/components/filesystem/file_system_impl.cc
index 750a249..44f9333 100644
--- a/components/filesystem/file_system_impl.cc
+++ b/components/filesystem/file_system_impl.cc
@@ -42,8 +42,10 @@
   CHECK(temp_dir->CreateUniqueTempDir());
 
   base::FilePath path = temp_dir->path();
+  scoped_refptr<SharedTempDir> shared_temp_dir =
+      new SharedTempDir(std::move(temp_dir));
   new DirectoryImpl(
-      std::move(directory), path, std::move(temp_dir), lock_table_);
+      std::move(directory), path, std::move(shared_temp_dir), lock_table_);
   callback.Run(FileError::OK);
 }
 
@@ -55,8 +57,11 @@
   if (!base::PathExists(path))
     base::CreateDirectory(path);
 
+  scoped_refptr<SharedTempDir> shared_temp_dir =
+      new SharedTempDir(std::move(temp_dir));
+
   new DirectoryImpl(
-      std::move(directory), path, std::move(temp_dir), lock_table_);
+      std::move(directory), path, std::move(shared_temp_dir), lock_table_);
   callback.Run(FileError::OK);
 }
 
diff --git a/components/filesystem/file_system_impl.h b/components/filesystem/file_system_impl.h
index 30a6e20..866a9b8 100644
--- a/components/filesystem/file_system_impl.h
+++ b/components/filesystem/file_system_impl.h
@@ -8,6 +8,7 @@
 #include "base/files/file_path.h"
 #include "base/macros.h"
 #include "components/filesystem/public/interfaces/file_system.mojom.h"
+#include "components/filesystem/shared_temp_dir.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 
diff --git a/components/filesystem/filesystem.gyp b/components/filesystem/filesystem.gyp
index 7ec313a..3f54366 100644
--- a/components/filesystem/filesystem.gyp
+++ b/components/filesystem/filesystem.gyp
@@ -26,6 +26,8 @@
         'file_system_impl.h',
         'lock_table.cc',
         'lock_table.h',
+        'shared_temp_dir.cc',
+        'shared_temp_dir.h',
         'util.cc',
         'util.h',
       ],
diff --git a/components/filesystem/public/interfaces/directory.mojom b/components/filesystem/public/interfaces/directory.mojom
index 397c086..063fb0ad 100644
--- a/components/filesystem/public/interfaces/directory.mojom
+++ b/components/filesystem/public/interfaces/directory.mojom
@@ -71,6 +71,9 @@
   [Sync]
   StatFile(string path) => (FileError error, FileInformation? file_information);
 
+  // Creates a copy of this directory.
+  Clone(Directory& directory);
+
   // Reads the contents of an entire file.
   ReadEntireFile(string path) => (FileError error, array<uint8> data);
 
diff --git a/components/filesystem/shared_temp_dir.cc b/components/filesystem/shared_temp_dir.cc
new file mode 100644
index 0000000..375b8b8
--- /dev/null
+++ b/components/filesystem/shared_temp_dir.cc
@@ -0,0 +1,16 @@
+// Copyright 2016 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 "components/filesystem/shared_temp_dir.h"
+
+#include "base/files/scoped_temp_dir.h"
+
+namespace filesystem {
+
+SharedTempDir::SharedTempDir(std::unique_ptr<base::ScopedTempDir> temp_dir)
+    : temp_dir_(std::move(temp_dir)) {}
+
+SharedTempDir::~SharedTempDir() {}
+
+}  // namespace filesystem
diff --git a/components/filesystem/shared_temp_dir.h b/components/filesystem/shared_temp_dir.h
new file mode 100644
index 0000000..c4002e8
--- /dev/null
+++ b/components/filesystem/shared_temp_dir.h
@@ -0,0 +1,33 @@
+// Copyright 2016 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 COMPONENTS_FILESYSTEM_SHARED_TEMP_DIR_H_
+#define COMPONENTS_FILESYSTEM_SHARED_TEMP_DIR_H_
+
+#include "base/memory/ref_counted.h"
+
+namespace base {
+class ScopedTempDir;
+}
+
+namespace filesystem {
+
+// A class to allow multiple Directory objects to hold a reference to a
+// temporary directory.
+class SharedTempDir : public base::RefCounted<SharedTempDir> {
+ public:
+  SharedTempDir(std::unique_ptr<base::ScopedTempDir> temp_dir);
+
+ private:
+  friend class base::RefCounted<SharedTempDir>;
+  ~SharedTempDir();
+
+  std::unique_ptr<base::ScopedTempDir> temp_dir_;
+
+  DISALLOW_COPY_AND_ASSIGN(SharedTempDir);
+};
+
+}  // namespace filesystem
+
+#endif  // COMPONENTS_FILESYSTEM_SHARED_TEMP_DIR_H_
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc
index 4e17d35..4b767f8 100644
--- a/components/history/core/browser/history_backend.cc
+++ b/components/history/core/browser/history_backend.cc
@@ -16,7 +16,6 @@
 #include "base/bind.h"
 #include "base/compiler_specific.h"
 #include "base/files/file_enumerator.h"
-#include "base/memory/scoped_vector.h"
 #include "base/message_loop/message_loop.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
@@ -1357,13 +1356,15 @@
   if (!db_)
     return;
 
-  ScopedVector<PageUsageData> data;
-  db_->QuerySegmentUsage(
+  auto url_filter = backend_client_
+                        ? base::Bind(&HistoryBackendClient::IsWebSafe,
+                                     base::Unretained(backend_client_.get()))
+                        : base::Callback<bool(const GURL&)>();
+  std::vector<std::unique_ptr<PageUsageData>> data = db_->QuerySegmentUsage(
       base::Time::Now() - base::TimeDelta::FromDays(days_back), result_count,
-      &data.get());
+      url_filter);
 
-  for (size_t i = 0; i < data.size(); ++i) {
-    PageUsageData* current_data = data[i];
+  for (const std::unique_ptr<PageUsageData>& current_data : data) {
     RedirectList redirects;
     QueryRedirectsFrom(current_data->GetURL(), &redirects);
     MostVisitedURL url = MakeMostVisitedURL(*current_data, redirects);
diff --git a/components/history/core/browser/history_backend_client.h b/components/history/core/browser/history_backend_client.h
index 8327bd2..51217047 100644
--- a/components/history/core/browser/history_backend_client.h
+++ b/components/history/core/browser/history_backend_client.h
@@ -44,6 +44,10 @@
   // Returns whether database errors should be reported to the crash server.
   virtual bool ShouldReportDatabaseError() = 0;
 
+  // Returns whether |url| should be considered web-safe (see
+  // content::ChildProcessSecurityPolicy).
+  virtual bool IsWebSafe(const GURL& url) = 0;
+
 #if defined(OS_ANDROID)
   // Called upon initialization of the HistoryBackend.
   virtual void OnHistoryBackendInitialized(
diff --git a/components/history/core/browser/history_backend_db_unittest.cc b/components/history/core/browser/history_backend_db_unittest.cc
index 42bbe511..9090fd7 100644
--- a/components/history/core/browser/history_backend_db_unittest.cc
+++ b/components/history/core/browser/history_backend_db_unittest.cc
@@ -1004,13 +1004,12 @@
   // Re-open the db, triggering migration.
   CreateBackendAndDatabase();
 
-  std::vector<PageUsageData*> results;
-  db_->QuerySegmentUsage(segment_time, 10, &results);
+  std::vector<std::unique_ptr<PageUsageData>> results = db_->QuerySegmentUsage(
+      segment_time, 10, base::Callback<bool(const GURL&)>());
   ASSERT_EQ(1u, results.size());
   EXPECT_EQ(url, results[0]->GetURL());
   EXPECT_EQ(segment_id, results[0]->GetID());
   EXPECT_EQ(title, results[0]->GetTitle());
-  STLDeleteElements(&results);
 }
 
 TEST_F(HistoryBackendDBTest, CheckLastCompatibleVersion) {
@@ -1050,5 +1049,49 @@
   }
 }
 
+bool FilterURL(const GURL& url) {
+  return url.SchemeIsHTTPOrHTTPS();
+}
+
+TEST_F(HistoryBackendDBTest, QuerySegmentUsage) {
+  CreateBackendAndDatabase();
+
+  const GURL url1("file://bar");
+  const GURL url2("http://www.foo.com");
+  const int visit_count1 = 10;
+  const int visit_count2 = 5;
+  const base::Time time(base::Time::Now());
+
+  URLID url_id1 = db_->AddURL(URLRow(url1));
+  ASSERT_NE(0, url_id1);
+  URLID url_id2 = db_->AddURL(URLRow(url2));
+  ASSERT_NE(0, url_id2);
+
+  SegmentID segment_id1 = db_->CreateSegment(
+      url_id1, VisitSegmentDatabase::ComputeSegmentName(url1));
+  ASSERT_NE(0, segment_id1);
+  SegmentID segment_id2 = db_->CreateSegment(
+      url_id2, VisitSegmentDatabase::ComputeSegmentName(url2));
+  ASSERT_NE(0, segment_id2);
+
+  ASSERT_TRUE(db_->IncreaseSegmentVisitCount(segment_id1, time, visit_count1));
+  ASSERT_TRUE(db_->IncreaseSegmentVisitCount(segment_id2, time, visit_count2));
+
+  // Without a filter, the "file://" URL should win.
+  std::vector<std::unique_ptr<PageUsageData>> results =
+      db_->QuerySegmentUsage(time, 1, base::Callback<bool(const GURL&)>());
+  ASSERT_EQ(1u, results.size());
+  EXPECT_EQ(url1, results[0]->GetURL());
+  EXPECT_EQ(segment_id1, results[0]->GetID());
+
+  // With the filter, the "file://" URL should be filtered out, so the "http://"
+  // URL should win instead.
+  std::vector<std::unique_ptr<PageUsageData>> results2 =
+      db_->QuerySegmentUsage(time, 1, base::Bind(&FilterURL));
+  ASSERT_EQ(1u, results2.size());
+  EXPECT_EQ(url2, results2[0]->GetURL());
+  EXPECT_EQ(segment_id2, results2[0]->GetID());
+}
+
 }  // namespace
 }  // namespace history
diff --git a/components/history/core/browser/history_service.h b/components/history/core/browser/history_service.h
index ce0f8f2..b3be99ef 100644
--- a/components/history/core/browser/history_service.h
+++ b/components/history/core/browser/history_service.h
@@ -70,7 +70,6 @@
 class HistoryServiceTest;
 class InMemoryHistoryBackend;
 struct KeywordSearchTermVisit;
-class PageUsageData;
 class URLDatabase;
 class VisitDelegate;
 class WebHistoryService;
@@ -82,9 +81,6 @@
 // thread that made the request.
 class HistoryService : public syncer::SyncableService, public KeyedService {
  public:
-  // Miscellaneous commonly-used types.
-  typedef std::vector<PageUsageData*> PageUsageDataList;
-
   // Callback for value asynchronously returned by TopHosts().
   typedef base::Callback<void(const TopHostsList&)> TopHostsCallback;
 
diff --git a/components/history/core/browser/page_usage_data.cc b/components/history/core/browser/page_usage_data.cc
index 73ba3d4..04d63e0 100644
--- a/components/history/core/browser/page_usage_data.cc
+++ b/components/history/core/browser/page_usage_data.cc
@@ -4,8 +4,6 @@
 
 #include "components/history/core/browser/page_usage_data.h"
 
-#include <algorithm>
-
 namespace history {
 
 PageUsageData::PageUsageData(SegmentID id) : id_(id), score_(0.0) {
@@ -14,10 +12,4 @@
 PageUsageData::~PageUsageData() {
 }
 
-// static
-bool PageUsageData::Predicate(const PageUsageData* lhs,
-                              const PageUsageData* rhs) {
-  return lhs->GetScore() > rhs->GetScore();
-}
-
 }  // namespace history
diff --git a/components/history/core/browser/page_usage_data.h b/components/history/core/browser/page_usage_data.h
index 3a8fcc1..4ce691df 100644
--- a/components/history/core/browser/page_usage_data.h
+++ b/components/history/core/browser/page_usage_data.h
@@ -56,9 +56,6 @@
     return score_;
   }
 
-  // Sort predicate to sort instances by score (high to low)
-  static bool Predicate(const PageUsageData* dud1, const PageUsageData* dud2);
-
  private:
   SegmentID id_;
   GURL url_;
diff --git a/components/history/core/browser/visitsegment_database.cc b/components/history/core/browser/visitsegment_database.cc
index 66998e5..0e8244e 100644
--- a/components/history/core/browser/visitsegment_database.cc
+++ b/components/history/core/browser/visitsegment_database.cc
@@ -12,11 +12,11 @@
 #include <string>
 #include <vector>
 
+#include "base/callback.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/stl_util.h"
+#include "base/memory/ptr_util.h"
 #include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
 #include "components/history/core/browser/page_usage_data.h"
 #include "sql/statement.h"
 #include "sql/transaction.h"
@@ -201,10 +201,11 @@
   }
 }
 
-void VisitSegmentDatabase::QuerySegmentUsage(
+std::vector<std::unique_ptr<PageUsageData>>
+VisitSegmentDatabase::QuerySegmentUsage(
     base::Time from_time,
     int max_result_count,
-    std::vector<PageUsageData*>* results) {
+    const base::Callback<bool(const GURL&)>& url_filter) {
   // This function gathers the highest-ranked segments in two queries.
   // The first gathers scores for all segments.
   // The second gathers segment data (url, title, etc.) for the highest-ranked
@@ -216,26 +217,19 @@
       "FROM segment_usage WHERE time_slot >= ? "
       "ORDER BY segment_id"));
   if (!statement.is_valid())
-    return;
+    return std::vector<std::unique_ptr<PageUsageData>>();
 
   base::Time ts = from_time.LocalMidnight();
   statement.BindInt64(0, ts.ToInternalValue());
 
+  std::vector<std::unique_ptr<PageUsageData>> segments;
   base::Time now = base::Time::Now();
-  SegmentID last_segment_id = 0;
-  PageUsageData* pud = NULL;
-  float score = 0;
+  SegmentID previous_segment_id = 0;
   while (statement.Step()) {
     SegmentID segment_id = statement.ColumnInt64(0);
-    if (segment_id != last_segment_id) {
-      if (pud) {
-        pud->SetScore(score);
-        results->push_back(pud);
-      }
-
-      pud = new PageUsageData(segment_id);
-      score = 0;
-      last_segment_id = segment_id;
+    if (segment_id != previous_segment_id) {
+      segments.push_back(base::WrapUnique(new PageUsageData(segment_id)));
+      previous_segment_id = segment_id;
     }
 
     base::Time timeslot =
@@ -251,22 +245,16 @@
     // Today gets 3x, a week ago 2x, three weeks ago 1.5x, falling off to 1x
     // at the limit of how far we reach into the past.
     float recency_boost = 1.0f + (2.0f * (1.0f / (1.0f + days_ago/7.0f)));
-    score += recency_boost * day_visits_score;
+    float score = recency_boost * day_visits_score;
+    segments.back()->SetScore(segments.back()->GetScore() + score);
   }
 
-  if (pud) {
-    pud->SetScore(score);
-    results->push_back(pud);
-  }
-
-  // Limit to the top kResultCount results.
-  std::sort(results->begin(), results->end(), PageUsageData::Predicate);
-  DCHECK_GE(max_result_count, 0);
-  if (results->size() > static_cast<size_t>(max_result_count)) {
-    STLDeleteContainerPointers(results->begin() + max_result_count,
-                               results->end());
-    results->resize(max_result_count);
-  }
+  // Order by descending scores.
+  std::sort(segments.begin(), segments.end(),
+            [](const std::unique_ptr<PageUsageData>& lhs,
+               const std::unique_ptr<PageUsageData>& rhs) {
+              return lhs->GetScore() > rhs->GetScore();
+            });
 
   // Now fetch the details about the entries we care about.
   sql::Statement statement2(GetDB().GetCachedStatement(SQL_FROM_HERE,
@@ -275,17 +263,26 @@
       "WHERE segments.id = ?"));
 
   if (!statement2.is_valid())
-    return;
+    return std::vector<std::unique_ptr<PageUsageData>>();
 
-  for (size_t i = 0; i < results->size(); ++i) {
-    PageUsageData* pud = (*results)[i];
+  std::vector<std::unique_ptr<PageUsageData>> results;
+  DCHECK_GE(max_result_count, 0);
+  for (std::unique_ptr<PageUsageData>& pud : segments) {
     statement2.BindInt64(0, pud->GetID());
     if (statement2.Step()) {
-      pud->SetURL(GURL(statement2.ColumnString(0)));
-      pud->SetTitle(statement2.ColumnString16(1));
+      GURL url(statement2.ColumnString(0));
+      if (url_filter.is_null() || url_filter.Run(url)) {
+        pud->SetURL(url);
+        pud->SetTitle(statement2.ColumnString16(1));
+        results.push_back(std::move(pud));
+        if (results.size() >= static_cast<size_t>(max_result_count))
+          break;
+      }
     }
     statement2.Reset(true);
   }
+
+  return results;
 }
 
 bool VisitSegmentDatabase::DeleteSegmentData(base::Time older_than) {
diff --git a/components/history/core/browser/visitsegment_database.h b/components/history/core/browser/visitsegment_database.h
index c4f838b..6f07867 100644
--- a/components/history/core/browser/visitsegment_database.h
+++ b/components/history/core/browser/visitsegment_database.h
@@ -5,6 +5,9 @@
 #ifndef COMPONENTS_HISTORY_CORE_BROWSER_VISITSEGMENT_DATABASE_H_
 #define COMPONENTS_HISTORY_CORE_BROWSER_VISITSEGMENT_DATABASE_H_
 
+#include <memory>
+
+#include "base/callback_forward.h"
 #include "base/macros.h"
 #include "components/history/core/browser/history_types.h"
 
@@ -50,12 +53,13 @@
   bool IncreaseSegmentVisitCount(SegmentID segment_id, base::Time ts,
                                  int amount);
 
-  // Compute the segment usage since |from_time| using the provided aggregator.
-  // A PageUsageData is added in |result| for the highest-scored segments up to
-  // |max_result_count|.
-  void QuerySegmentUsage(base::Time from_time,
-                         int max_result_count,
-                         std::vector<PageUsageData*>* result);
+  // Computes the segment usage since |from_time|. If |url_filter| is non-null,
+  // then only URLs for which it returns true will be included.
+  // Returns the highest-scored segments up to |max_result_count|.
+  std::vector<std::unique_ptr<PageUsageData>> QuerySegmentUsage(
+      base::Time from_time,
+      int max_result_count,
+      const base::Callback<bool(const GURL&)>& url_filter);
 
   // Delete all the segment usage data which is older than the provided time
   // stamp.
diff --git a/components/history/core/test/history_client_fake_bookmarks.cc b/components/history/core/test/history_client_fake_bookmarks.cc
index f251a6f..2572f4a2 100644
--- a/components/history/core/test/history_client_fake_bookmarks.cc
+++ b/components/history/core/test/history_client_fake_bookmarks.cc
@@ -81,6 +81,7 @@
   bool IsBookmarked(const GURL& url) override;
   void GetBookmarks(std::vector<URLAndTitle>* bookmarks) override;
   bool ShouldReportDatabaseError() override;
+  bool IsWebSafe(const GURL& url) override;
 #if defined(OS_ANDROID)
   void OnHistoryBackendInitialized(HistoryBackend* history_backend,
                                    HistoryDatabase* history_database,
@@ -117,6 +118,10 @@
   return false;
 }
 
+bool HistoryBackendClientFakeBookmarks::IsWebSafe(const GURL& url) {
+  return true;
+}
+
 #if defined(OS_ANDROID)
 void HistoryBackendClientFakeBookmarks::OnHistoryBackendInitialized(
     HistoryBackend* history_backend,
diff --git a/components/invalidation/impl/invalidator_storage.cc b/components/invalidation/impl/invalidator_storage.cc
index 7e6ab48b..d40767d 100644
--- a/components/invalidation/impl/invalidator_storage.cc
+++ b/components/invalidation/impl/invalidator_storage.cc
@@ -29,14 +29,12 @@
     const base::ListValue& value,
     syncer::UnackedInvalidationsMap* map) {
   for (size_t i = 0; i != value.GetSize(); ++i) {
-    invalidation::ObjectId invalid_id;
-    syncer::UnackedInvalidationSet storage(invalid_id);
     const base::DictionaryValue* dict;
-    if (!value.GetDictionary(i, &dict) || !storage.ResetFromValue(*dict)) {
+    if (!value.GetDictionary(i, &dict) ||
+        !syncer::UnackedInvalidationSet::DeserializeSetIntoMap(*dict, map)) {
       DLOG(WARNING) << "Failed to parse ObjectState at position " << i;
       return false;
     }
-    map->insert(std::make_pair(storage.object_id(), storage));
   }
   return true;
 }
diff --git a/components/invalidation/impl/unacked_invalidation_set.cc b/components/invalidation/impl/unacked_invalidation_set.cc
index 481fcb43..78bcfa33 100644
--- a/components/invalidation/impl/unacked_invalidation_set.cc
+++ b/components/invalidation/impl/unacked_invalidation_set.cc
@@ -125,6 +125,38 @@
   invalidations_.insert(unknown_version);
 }
 
+// static
+bool UnackedInvalidationSet::DeserializeSetIntoMap(
+    const base::DictionaryValue& dict,
+    UnackedInvalidationsMap* map) {
+  std::string source_str;
+  if (!dict.GetString(kSourceKey, &source_str)) {
+    DLOG(WARNING) << "Unable to deserialize source";
+    return false;
+  }
+  int source = 0;
+  if (!base::StringToInt(source_str, &source)) {
+    DLOG(WARNING) << "Invalid source: " << source_str;
+    return false;
+  }
+  std::string name;
+  if (!dict.GetString(kNameKey, &name)) {
+    DLOG(WARNING) << "Unable to deserialize name";
+    return false;
+  }
+  invalidation::ObjectId id(source, name);
+  UnackedInvalidationSet storage(id);
+  const base::ListValue* invalidation_list = nullptr;
+  if (!dict.GetList(kInvalidationListKey, &invalidation_list) ||
+      !storage.ResetListFromValue(*invalidation_list)) {
+    // Earlier versions of this class did not set this field, so we don't treat
+    // parsing errors here as a fatal failure.
+    DLOG(WARNING) << "Unable to deserialize invalidation list.";
+  }
+  map->insert(std::make_pair(id, storage));
+  return true;
+}
+
 std::unique_ptr<base::DictionaryValue> UnackedInvalidationSet::ToValue() const {
   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue);
   value->SetString(kSourceKey, base::IntToString(object_id_.source()));
diff --git a/components/invalidation/impl/unacked_invalidation_set.h b/components/invalidation/impl/unacked_invalidation_set.h
index c7cf71d3..2a91a0b 100644
--- a/components/invalidation/impl/unacked_invalidation_set.h
+++ b/components/invalidation/impl/unacked_invalidation_set.h
@@ -29,6 +29,10 @@
 class SingleObjectInvalidationSet;
 class ObjectIdInvalidationMap;
 class AckHandle;
+class UnackedInvalidationSet;
+
+using UnackedInvalidationsMap =
+    std::map<invalidation::ObjectId, UnackedInvalidationSet, ObjectIdLessThan>;
 
 // Manages the set of invalidations that are awaiting local acknowledgement for
 // a particular ObjectId.  This set of invalidations will be persisted across
@@ -94,6 +98,12 @@
   // indicate that this invalidation has been lost without being acted on.
   void Drop(const AckHandle& handle);
 
+  // Deserializes the given |dict| as an UnackedInvalidationSet and inserts the
+  // pair into |map| using the ObjectId as the key. Returns false if the
+  // deserialization fails.
+  static bool DeserializeSetIntoMap(const base::DictionaryValue& dict,
+                                    syncer::UnackedInvalidationsMap* map);
+
   std::unique_ptr<base::DictionaryValue> ToValue() const;
   bool ResetFromValue(const base::DictionaryValue& value);
 
@@ -115,10 +125,6 @@
   InvalidationsSet invalidations_;
 };
 
-typedef std::map<invalidation::ObjectId,
-                 UnackedInvalidationSet,
-                 ObjectIdLessThan> UnackedInvalidationsMap;
-
 }  // namespace syncer
 
 #endif  // COMPONENTS_INVALIDATION_IMPL_UNACKED_INVALIDATION_SET_H_
diff --git a/components/invalidation/impl/unacked_invalidation_set_unittest.cc b/components/invalidation/impl/unacked_invalidation_set_unittest.cc
index a28daf6d..ffc37fcf8 100644
--- a/components/invalidation/impl/unacked_invalidation_set_unittest.cc
+++ b/components/invalidation/impl/unacked_invalidation_set_unittest.cc
@@ -9,6 +9,7 @@
 #include <memory>
 
 #include "base/json/json_string_value_serializer.h"
+#include "base/strings/string_number_conversions.h"
 #include "components/invalidation/impl/unacked_invalidation_set_test_util.h"
 #include "components/invalidation/public/object_id_invalidation_map.h"
 #include "components/invalidation/public/single_object_invalidation_set.h"
@@ -222,6 +223,42 @@
   EXPECT_THAT(unacked_invalidations_, test_util::Eq(deserialized));
 }
 
+TEST_F(UnackedInvalidationSetSerializationTest, ValidConversionFromMap) {
+  UnackedInvalidationsMap map;
+  Invalidation inv = Invalidation::Init(kObjectId_, 10, "payload");
+  unacked_invalidations_.Add(inv);
+  std::unique_ptr<base::DictionaryValue> dict =
+      unacked_invalidations_.ToValue();
+  bool result = UnackedInvalidationSet::DeserializeSetIntoMap(*dict, &map);
+  EXPECT_EQ(true, result);
+  auto item = map.find(kObjectId_);
+  ASSERT_NE(map.end(), item);
+  EXPECT_EQ(kObjectId_, item->second.object_id());
+}
+
+TEST_F(UnackedInvalidationSetSerializationTest, InvalidConversionFromMap) {
+  UnackedInvalidationsMap map;
+  base::DictionaryValue dict;
+  // Empty dictionary should fail.
+  EXPECT_FALSE(UnackedInvalidationSet::DeserializeSetIntoMap(dict, &map));
+
+  // Non-int source should fail.
+  dict.SetString("source", "foo");
+  EXPECT_FALSE(UnackedInvalidationSet::DeserializeSetIntoMap(dict, &map));
+
+  // Missing "name" should fail.
+  dict.SetString("source", base::IntToString(kObjectId_.source()));
+  EXPECT_FALSE(UnackedInvalidationSet::DeserializeSetIntoMap(dict, &map));
+
+  // The "invalidation-list" is not required, so add "name" to make valid.
+  dict.SetString("name", kObjectId_.name());
+  bool result = UnackedInvalidationSet::DeserializeSetIntoMap(dict, &map);
+  EXPECT_TRUE(result);
+  auto item = map.find(kObjectId_);
+  ASSERT_NE(map.end(), item);
+  EXPECT_EQ(kObjectId_, item->second.object_id());
+}
+
 }  // namespace
 
 }  // namespace syncer
diff --git a/components/leveldb/leveldb_service_unittest.cc b/components/leveldb/leveldb_service_unittest.cc
index 1f9b702..000727c 100644
--- a/components/leveldb/leveldb_service_unittest.cc
+++ b/components/leveldb/leveldb_service_unittest.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 "base/bind.h"
 #include "base/macros.h"
 #include "components/filesystem/public/interfaces/directory.mojom.h"
 #include "components/filesystem/public/interfaces/file_system.mojom.h"
@@ -40,10 +41,9 @@
 
   // Note: This has an out parameter rather than returning the |DirectoryPtr|,
   // since |ASSERT_...()| doesn't work with return values.
-  void GetUserDataDir(filesystem::DirectoryPtr* directory) {
+  void GetTempDirectory(filesystem::DirectoryPtr* directory) {
     FileError error = FileError::FAILED;
-    files()->OpenPersistentFileSystem(GetProxy(directory),
-                                      mojo::Capture(&error));
+    files()->OpenTempDirectory(GetProxy(directory), mojo::Capture(&error));
     ASSERT_TRUE(files().WaitForIncomingResponse());
     ASSERT_EQ(FileError::OK, error);
   }
@@ -187,22 +187,24 @@
   EXPECT_EQ("", value.To<std::string>());
 }
 
-// TODO(crbug.com/602820) Test is flaky.
-#if defined(OS_LINUX) || defined(OS_WIN)
-#define MAYBE_Reconnect DISABLED_Reconnect
-#else
-#define MAYBE_Reconnect Reconnect
-#endif
-TEST_F(LevelDBServiceTest, MAYBE_Reconnect) {
+TEST_F(LevelDBServiceTest, Reconnect) {
   DatabaseError error;
 
+  filesystem::DirectoryPtr temp_directory;
+  GetTempDirectory(&temp_directory);
+
   {
     filesystem::DirectoryPtr directory;
-    GetUserDataDir(&directory);
+    temp_directory->Clone(GetProxy(&directory));
 
     LevelDBDatabasePtr database;
-    leveldb()->Open(std::move(directory), "test", GetProxy(&database),
-                    Capture(&error));
+    leveldb::OpenOptionsPtr options = leveldb::OpenOptions::New();
+    options->error_if_exists = true;
+    options->create_if_missing = true;
+    leveldb()->OpenWithOptions(std::move(options),
+                               std::move(directory), "test",
+                               GetProxy(&database),
+                               Capture(&error));
     ASSERT_TRUE(leveldb().WaitForIncomingResponse());
     EXPECT_EQ(DatabaseError::OK, error);
 
@@ -219,7 +221,7 @@
 
   {
     filesystem::DirectoryPtr directory;
-    GetUserDataDir(&directory);
+    temp_directory->Clone(GetProxy(&directory));
 
     // Reconnect to the database.
     LevelDBDatabasePtr database;
diff --git a/components/metrics/stability_metrics_helper.cc b/components/metrics/stability_metrics_helper.cc
index 52b91f0f..7b771f9f 100644
--- a/components/metrics/stability_metrics_helper.cc
+++ b/components/metrics/stability_metrics_helper.cc
@@ -197,6 +197,8 @@
   } else if (status == base::TERMINATION_STATUS_LAUNCH_FAILED) {
     UMA_HISTOGRAM_ENUMERATION("BrowserRenderProcessHost.ChildLaunchFailures",
                               histogram_type, RENDERER_TYPE_COUNT);
+    UMA_HISTOGRAM_SPARSE_SLOWLY(
+        "BrowserRenderProcessHost.ChildLaunchFailureCodes", exit_code);
     if (was_extension_process)
       IncrementPrefValue(prefs::kStabilityExtensionRendererFailedLaunchCount);
     else
diff --git a/components/mus/gles2/command_buffer_driver.cc b/components/mus/gles2/command_buffer_driver.cc
index 0bbe1f5f..e1b1d7a 100644
--- a/components/mus/gles2/command_buffer_driver.cc
+++ b/components/mus/gles2/command_buffer_driver.cc
@@ -140,8 +140,6 @@
 
   command_buffer_.reset(
       new gpu::CommandBufferService(context_group->transfer_buffer_manager()));
-  bool result = command_buffer_->Initialize();
-  DCHECK(result);
 
   decoder_.reset(::gpu::gles2::GLES2Decoder::Create(context_group.get()));
   executor_.reset(new gpu::CommandExecutor(command_buffer_.get(),
diff --git a/components/mus/gles2/command_buffer_impl.cc b/components/mus/gles2/command_buffer_impl.cc
index 86fb239..20018b11 100644
--- a/components/mus/gles2/command_buffer_impl.cc
+++ b/components/mus/gles2/command_buffer_impl.cc
@@ -137,12 +137,7 @@
   NOTIMPLEMENTED();
 }
 
-void CommandBufferImpl::TakeFrontBuffer(const gpu::Mailbox& mailbox) {
-  NOTIMPLEMENTED();
-}
-
-void CommandBufferImpl::ReturnFrontBuffer(const gpu::Mailbox& mailbox,
-                                          bool is_lost) {
+void CommandBufferImpl::ProduceFrontBuffer(const gpu::Mailbox& mailbox) {
   NOTIMPLEMENTED();
 }
 
diff --git a/components/mus/gles2/command_buffer_impl.h b/components/mus/gles2/command_buffer_impl.h
index 69f3a20..d03cdf14 100644
--- a/components/mus/gles2/command_buffer_impl.h
+++ b/components/mus/gles2/command_buffer_impl.h
@@ -67,8 +67,7 @@
       uint32_t client_texture_id,
       const mojom::CommandBuffer::CreateStreamTextureCallback& callback
       ) override;
-  void TakeFrontBuffer(const gpu::Mailbox& mailbox) override;
-  void ReturnFrontBuffer(const gpu::Mailbox& mailbox, bool is_lost) override;
+  void ProduceFrontBuffer(const gpu::Mailbox& mailbox) override;
   void SignalQuery(uint32_t query, uint32_t signal_id) override;
   void SignalSyncToken(const gpu::SyncToken& sync_token,
                        uint32_t signal_id) override;
diff --git a/components/mus/gles2/command_buffer_local.h b/components/mus/gles2/command_buffer_local.h
index b0e077e3..511f9da 100644
--- a/components/mus/gles2/command_buffer_local.h
+++ b/components/mus/gles2/command_buffer_local.h
@@ -57,12 +57,12 @@
                      gfx::AcceleratedWidget widget,
                      const scoped_refptr<GpuState>& gpu_state);
 
+  bool Initialize();
   // Destroy the CommandBufferLocal. The client should not use this class
   // after calling it.
   void Destroy();
 
   // gpu::CommandBuffer implementation:
-  bool Initialize() override;
   gpu::CommandBuffer::State GetLastState() override;
   int32_t GetLastToken() override;
   void Flush(int32_t put_offset) override;
diff --git a/components/mus/public/cpp/context_provider.h b/components/mus/public/cpp/context_provider.h
index 973aa7a..a9ce9e0 100644
--- a/components/mus/public/cpp/context_provider.h
+++ b/components/mus/public/cpp/context_provider.h
@@ -10,7 +10,6 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "base/synchronization/lock.h"
 #include "cc/output/context_provider.h"
 #include "mojo/public/c/gles2/gles2_types.h"
 #include "mojo/public/cpp/system/core.h"
@@ -27,7 +26,6 @@
   gpu::ContextSupport* ContextSupport() override;
   class GrContext* GrContext() override;
   void InvalidateGrContext(uint32_t state) override;
-  void SetupLock() override;
   base::Lock* GetLock() override;
   gpu::Capabilities ContextCapabilities() override;
   void DeleteCachedResources() override {}
@@ -48,8 +46,6 @@
   MojoGLES2Context context_;
   std::unique_ptr<gpu::gles2::GLES2Interface> context_gl_;
 
-  base::Lock context_lock_;
-
   DISALLOW_COPY_AND_ASSIGN(ContextProvider);
 };
 
diff --git a/components/mus/public/cpp/lib/context_provider.cc b/components/mus/public/cpp/lib/context_provider.cc
index 97e3af4..a969698 100644
--- a/components/mus/public/cpp/lib/context_provider.cc
+++ b/components/mus/public/cpp/lib/context_provider.cc
@@ -51,10 +51,10 @@
   return capabilities;
 }
 
-void ContextProvider::SetupLock() {}
-
 base::Lock* ContextProvider::GetLock() {
-  return &context_lock_;
+  // This context provider is not used on multiple threads.
+  NOTREACHED();
+  return nullptr;
 }
 
 ContextProvider::~ContextProvider() {
diff --git a/components/mus/public/interfaces/command_buffer.mojom b/components/mus/public/interfaces/command_buffer.mojom
index f8c3899..176e36d 100644
--- a/components/mus/public/interfaces/command_buffer.mojom
+++ b/components/mus/public/interfaces/command_buffer.mojom
@@ -51,8 +51,7 @@
   DestroyImage(int32 id);
   CreateStreamTexture(uint32 client_texture_id)
       => (int32 stream_id, bool succeeded);
-  TakeFrontBuffer(gpu.mojom.Mailbox mailbox);
-  ReturnFrontBuffer(gpu.mojom.Mailbox mailbox, bool is_lost);
+  ProduceFrontBuffer(gpu.mojom.Mailbox mailbox);
   SignalQuery(uint32 query, uint32 signal_id);
   SignalSyncToken(gpu.mojom.SyncToken sync_token, uint32 signal_id);
   WaitForGetOffsetInRange(int32 start, int32 end)
diff --git a/components/mus/surfaces/surfaces_context_provider.cc b/components/mus/surfaces/surfaces_context_provider.cc
index ceb853b..58e9784 100644
--- a/components/mus/surfaces/surfaces_context_provider.cc
+++ b/components/mus/surfaces/surfaces_context_provider.cc
@@ -90,10 +90,10 @@
   return capabilities_;
 }
 
-void SurfacesContextProvider::SetupLock() {}
-
 base::Lock* SurfacesContextProvider::GetLock() {
-  return &context_lock_;
+  // This context provider is not used on multiple threads.
+  NOTREACHED();
+  return nullptr;
 }
 
 void SurfacesContextProvider::SetLostContextCallback(
diff --git a/components/mus/surfaces/surfaces_context_provider.h b/components/mus/surfaces/surfaces_context_provider.h
index a554dbd..5da9ef17 100644
--- a/components/mus/surfaces/surfaces_context_provider.h
+++ b/components/mus/surfaces/surfaces_context_provider.h
@@ -10,7 +10,6 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "base/synchronization/lock.h"
 #include "base/threading/non_thread_safe.h"
 #include "cc/output/context_provider.h"
 #include "components/mus/gles2/command_buffer_local_client.h"
@@ -55,7 +54,6 @@
   void DeleteCachedResources() override {}
   void SetLostContextCallback(
       const LostContextCallback& lost_context_callback) override;
-  void SetupLock() override;
   base::Lock* GetLock() override;
 
   // SurfacesContextProvider API.
@@ -86,8 +84,6 @@
 
   gfx::GLSurface::SwapCompletionCallback swap_buffers_completion_callback_;
 
-  base::Lock context_lock_;
-
   DISALLOW_COPY_AND_ASSIGN(SurfacesContextProvider);
 };
 
diff --git a/components/mus/ws/window_manager_factory_service.cc b/components/mus/ws/window_manager_factory_service.cc
index b424560..9aebb5a 100644
--- a/components/mus/ws/window_manager_factory_service.cc
+++ b/components/mus/ws/window_manager_factory_service.cc
@@ -25,7 +25,7 @@
 void WindowManagerFactoryService::SetWindowManagerFactory(
     mojom::WindowManagerFactoryPtr factory) {
   window_manager_factory_ptr_ = std::move(factory);
-  binding_.set_connection_error_handler(base::Bind(
+  window_manager_factory_ptr_.set_connection_error_handler(base::Bind(
       &WindowManagerFactoryService::OnConnectionLost, base::Unretained(this)));
   SetWindowManagerFactoryImpl(window_manager_factory_ptr_.get());
 }
diff --git a/components/nacl/broker/nacl_broker_listener.cc b/components/nacl/broker/nacl_broker_listener.cc
index 2704695a..e7fa3d1 100644
--- a/components/nacl/broker/nacl_broker_listener.cc
+++ b/components/nacl/broker/nacl_broker_listener.cc
@@ -109,9 +109,11 @@
     cmd_line->AppendSwitchASCII(switches::kProcessChannelID,
                                 loader_channel_id);
 
-    base::Process loader_process = content::StartSandboxedProcess(
-        this, cmd_line, base::HandlesToInheritVector());
-    if (loader_process.IsValid()) {
+    base::Process loader_process;
+    sandbox::ResultCode result = content::StartSandboxedProcess(
+        this, cmd_line, base::HandlesToInheritVector(), &loader_process);
+
+    if (result == sandbox::SBOX_ALL_OK) {
       // Note: PROCESS_DUP_HANDLE is necessary here, because:
       // 1) The current process is the broker, which is the loader's parent.
       // 2) The browser is not the loader's parent, and so only gets the
diff --git a/components/ntp_snippets/BUILD.gn b/components/ntp_snippets/BUILD.gn
index 865a914c..382aa911a 100644
--- a/components/ntp_snippets/BUILD.gn
+++ b/components/ntp_snippets/BUILD.gn
@@ -39,6 +39,7 @@
   testonly = true
   sources = [
     "inner_iterator_unittest.cc",
+    "ntp_snippets_fetcher_unittest.cc",
     "ntp_snippets_service_unittest.cc",
   ]
 
diff --git a/components/ntp_snippets/ntp_snippets_fetcher.cc b/components/ntp_snippets/ntp_snippets_fetcher.cc
index 2cb8213..acad45c 100644
--- a/components/ntp_snippets/ntp_snippets_fetcher.cc
+++ b/components/ntp_snippets/ntp_snippets_fetcher.cc
@@ -6,11 +6,11 @@
 
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
+#include "base/metrics/sparse_histogram.h"
 #include "base/path_service.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task_runner_util.h"
 #include "google_apis/google_api_keys.h"
 #include "net/base/load_flags.h"
 #include "net/http/http_request_headers.h"
@@ -70,11 +70,9 @@
 }  // namespace
 
 NTPSnippetsFetcher::NTPSnippetsFetcher(
-    scoped_refptr<base::SequencedTaskRunner> file_task_runner,
     scoped_refptr<URLRequestContextGetter> url_request_context_getter,
     bool is_stable_channel)
-    : file_task_runner_(file_task_runner),
-      url_request_context_getter_(url_request_context_getter),
+    : url_request_context_getter_(url_request_context_getter),
       is_stable_channel_(is_stable_channel) {}
 
 NTPSnippetsFetcher::~NTPSnippetsFetcher() {}
@@ -86,7 +84,6 @@
 
 void NTPSnippetsFetcher::FetchSnippets(const std::set<std::string>& hosts,
                                        int count) {
-  // TODO(treib): What to do if there's already a pending request?
   const std::string& key = is_stable_channel_
                                ? google_apis::GetAPIKey()
                                : google_apis::GetNonStableAPIKey();
@@ -121,6 +118,11 @@
 
   std::string message;
   const URLRequestStatus& status = source->GetStatus();
+
+  UMA_HISTOGRAM_SPARSE_SLOWLY(
+      "NewTabPage.Snippets.FetchHttpResponseOrErrorCode",
+      status.is_success() ? source->GetResponseCode() : status.error());
+
   if (!status.is_success()) {
     message = base::StringPrintf(kStatusMessageURLRequestErrorFormat,
                                  status.error());
diff --git a/components/ntp_snippets/ntp_snippets_fetcher.h b/components/ntp_snippets/ntp_snippets_fetcher.h
index 65e526a..86c7685 100644
--- a/components/ntp_snippets/ntp_snippets_fetcher.h
+++ b/components/ntp_snippets/ntp_snippets_fetcher.h
@@ -12,7 +12,6 @@
 #include "base/callback.h"
 #include "base/callback_list.h"
 #include "base/memory/weak_ptr.h"
-#include "base/sequenced_task_runner.h"
 #include "net/url_request/url_fetcher_delegate.h"
 #include "net/url_request/url_request_context_getter.h"
 
@@ -30,7 +29,6 @@
       base::CallbackList<void(const std::string&, const std::string&)>;
 
   NTPSnippetsFetcher(
-      scoped_refptr<base::SequencedTaskRunner> file_task_runner,
       scoped_refptr<net::URLRequestContextGetter> url_request_context_getter,
       bool is_stable_channel);
   ~NTPSnippetsFetcher() override;
@@ -42,15 +40,16 @@
   // Fetches snippets from the server. |hosts| can be used to restrict the
   // results to a set of hosts, e.g. "www.google.com". If it is empty, no
   // restrictions are applied.
+  //
+  // If an ongoing fetch exists, it will be cancelled and a new one started,
+  // without triggering additional callbacks (i.e. not noticeable by
+  // subscribers).
   void FetchSnippets(const std::set<std::string>& hosts, int count);
 
  private:
   // URLFetcherDelegate implementation.
   void OnURLFetchComplete(const net::URLFetcher* source) override;
 
-  // The SequencedTaskRunner on which file system operations will be run.
-  scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
-
   // Holds the URL request context.
   scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
 
diff --git a/components/ntp_snippets/ntp_snippets_fetcher_unittest.cc b/components/ntp_snippets/ntp_snippets_fetcher_unittest.cc
new file mode 100644
index 0000000..c256b6c
--- /dev/null
+++ b/components/ntp_snippets/ntp_snippets_fetcher_unittest.cc
@@ -0,0 +1,182 @@
+// Copyright 2016 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 "components/ntp_snippets/ntp_snippets_fetcher.h"
+
+#include "base/memory/ptr_util.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "base/strings/stringprintf.h"
+#include "base/test/histogram_tester.h"
+#include "base/thread_task_runner_handle.h"
+#include "google_apis/google_api_keys.h"
+#include "net/url_request/test_url_fetcher_factory.h"
+#include "net/url_request/url_request_test_util.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace ntp_snippets {
+namespace {
+
+using testing::ElementsAre;
+using testing::IsEmpty;
+using testing::IsNull;
+using testing::Not;
+using testing::NotNull;
+
+const char kTestContentSnippetsServerFormat[] =
+    "https://chromereader-pa.googleapis.com/v1/fetch?key=%s";
+
+class MockSnippetsAvailableCallback {
+ public:
+  MOCK_METHOD2(Run, void(const std::string& snippets_json,
+                         const std::string& status_message));
+};
+
+// Factory for FakeURLFetcher objects that always generate errors.
+class FailingFakeURLFetcherFactory : public net::URLFetcherFactory {
+ public:
+  std::unique_ptr<net::URLFetcher> CreateURLFetcher(
+      int id, const GURL& url, net::URLFetcher::RequestType request_type,
+      net::URLFetcherDelegate* d) override {
+    return base::WrapUnique(new net::FakeURLFetcher(
+        url, d, /*response_data=*/std::string(), net::HTTP_NOT_FOUND,
+        net::URLRequestStatus::FAILED));
+  }
+};
+
+class NTPSnippetsFetcherTest : public testing::Test {
+ public:
+  NTPSnippetsFetcherTest()
+      : fake_url_fetcher_factory_(
+            /*default_factory=*/&failing_url_fetcher_factory_),
+        snippets_fetcher_(scoped_refptr<net::TestURLRequestContextGetter>(
+                              new net::TestURLRequestContextGetter(
+                                  base::ThreadTaskRunnerHandle::Get())),
+                          /*is_stable_channel=*/true),
+        test_url_(base::StringPrintf(kTestContentSnippetsServerFormat,
+                                     google_apis::GetAPIKey().c_str())) {
+    snippets_fetcher_subscription_ = snippets_fetcher_.AddCallback(
+        base::Bind(&MockSnippetsAvailableCallback::Run,
+                   base::Unretained(&mock_callback_)));
+  }
+
+  net::FakeURLFetcherFactory& fake_url_fetcher_factory() {
+    return fake_url_fetcher_factory_;
+  }
+
+  NTPSnippetsFetcher& snippets_fetcher() { return snippets_fetcher_; }
+  MockSnippetsAvailableCallback& mock_callback() { return mock_callback_; }
+  void RunUntilIdle() { message_loop_.RunUntilIdle(); }
+  const GURL& test_url() { return test_url_; }
+
+  base::HistogramTester& histogram_tester() { return histogram_tester_; }
+
+ private:
+  FailingFakeURLFetcherFactory failing_url_fetcher_factory_;
+  // Instantiation of factory automatically sets itself as URLFetcher's factory.
+  net::FakeURLFetcherFactory fake_url_fetcher_factory_;
+  // Needed to use ThreadTaskRunnerHandle.
+  base::MessageLoop message_loop_;
+  NTPSnippetsFetcher snippets_fetcher_;
+  MockSnippetsAvailableCallback mock_callback_;
+  std::unique_ptr<
+      NTPSnippetsFetcher::SnippetsAvailableCallbackList::Subscription>
+      snippets_fetcher_subscription_;
+  const GURL test_url_;
+  base::HistogramTester histogram_tester_;
+
+  DISALLOW_COPY_AND_ASSIGN(NTPSnippetsFetcherTest);
+};
+
+TEST_F(NTPSnippetsFetcherTest, ShouldNotFetchOnCreation) {
+  // The lack of registered baked in responses would cause any fetch to fail.
+  RunUntilIdle();
+  EXPECT_THAT(histogram_tester().GetAllSamples(
+                  "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"),
+              IsEmpty());
+}
+
+TEST_F(NTPSnippetsFetcherTest, ShouldFetchSuccessfully) {
+  const std::string json_str = "{ \"recos\": [] }";
+  fake_url_fetcher_factory().SetFakeResponse(test_url(),
+                                             /*data=*/json_str, net::HTTP_OK,
+                                             net::URLRequestStatus::SUCCESS);
+  EXPECT_CALL(mock_callback(), Run(/*snippets_json=*/json_str,
+                                   /*status_message=*/std::string()))
+      .Times(1);
+  snippets_fetcher().FetchSnippets(/*hosts=*/std::set<std::string>(),
+                                   /*count=*/1);
+  RunUntilIdle();
+  EXPECT_THAT(histogram_tester().GetAllSamples(
+                  "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"),
+              ElementsAre(base::Bucket(/*min=*/200, /*count=*/1)));
+}
+
+TEST_F(NTPSnippetsFetcherTest, ShouldReportUrlStatusError) {
+  fake_url_fetcher_factory().SetFakeResponse(test_url(),
+                                             /*data=*/std::string(),
+                                             net::HTTP_NOT_FOUND,
+                                             net::URLRequestStatus::FAILED);
+  EXPECT_CALL(mock_callback(),
+              Run(/*snippets_json=*/std::string(),
+                  /*status_message=*/"URLRequestStatus error -2"))
+      .Times(1);
+  snippets_fetcher().FetchSnippets(/*hosts=*/std::set<std::string>(),
+                                   /*count=*/1);
+  RunUntilIdle();
+  EXPECT_THAT(histogram_tester().GetAllSamples(
+                  "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"),
+              ElementsAre(base::Bucket(/*min=*/-2, /*count=*/1)));
+}
+
+TEST_F(NTPSnippetsFetcherTest, ShouldReportHttpError) {
+  fake_url_fetcher_factory().SetFakeResponse(test_url(),
+                                             /*data=*/std::string(),
+                                             net::HTTP_NOT_FOUND,
+                                             net::URLRequestStatus::SUCCESS);
+  EXPECT_CALL(mock_callback(), Run(/*snippets_json=*/std::string(),
+                                   /*status_message=*/"HTTP error 404"))
+      .Times(1);
+  snippets_fetcher().FetchSnippets(/*hosts=*/std::set<std::string>(),
+                                   /*count=*/1);
+  RunUntilIdle();
+  EXPECT_THAT(histogram_tester().GetAllSamples(
+                  "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"),
+              ElementsAre(base::Bucket(/*min=*/404, /*count=*/1)));
+}
+
+// This test actually verifies that the test setup itself is sane, to prevent
+// hard-to-reproduce test failures.
+TEST_F(NTPSnippetsFetcherTest, ShouldReportHttpErrorForMissingBakedResponse) {
+  EXPECT_CALL(mock_callback(), Run(/*snippets_json=*/std::string(),
+                                   /*status_message=*/Not(IsEmpty())))
+      .Times(1);
+  snippets_fetcher().FetchSnippets(/*hosts=*/std::set<std::string>(),
+                                   /*count=*/1);
+  RunUntilIdle();
+}
+
+TEST_F(NTPSnippetsFetcherTest, ShouldCancelOngoingFetch) {
+  const std::string json_str = "{ \"recos\": [] }";
+  fake_url_fetcher_factory().SetFakeResponse(test_url(),
+                                             /*data=*/json_str, net::HTTP_OK,
+                                             net::URLRequestStatus::SUCCESS);
+  EXPECT_CALL(mock_callback(), Run(/*snippets_json=*/json_str,
+                                   /*status_message=*/std::string()))
+      .Times(1);
+  snippets_fetcher().FetchSnippets(/*hosts=*/std::set<std::string>(),
+                                   /*count=*/1);
+  // Second call to FetchSnippets() overrides/cancels the previous. Callback is
+  // expected to be called once.
+  snippets_fetcher().FetchSnippets(/*hosts=*/std::set<std::string>(),
+                                   /*count=*/1);
+  RunUntilIdle();
+  EXPECT_THAT(histogram_tester().GetAllSamples(
+                  "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"),
+              ElementsAre(base::Bucket(/*min=*/200, /*count=*/1)));
+}
+
+}  // namespace
+}  // namespace ntp_snippets
diff --git a/components/ntp_snippets/ntp_snippets_service.cc b/components/ntp_snippets/ntp_snippets_service.cc
index 5eddd097..d66d3fa 100644
--- a/components/ntp_snippets/ntp_snippets_service.cc
+++ b/components/ntp_snippets/ntp_snippets_service.cc
@@ -13,6 +13,7 @@
 #include "base/files/file_util.h"
 #include "base/json/json_reader.h"
 #include "base/location.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/metrics/sparse_histogram.h"
 #include "base/path_service.h"
 #include "base/strings/string_number_conversions.h"
@@ -34,6 +35,8 @@
 
 namespace {
 
+// Number of snippets requested to the server. Consider replacing sparse UMA
+// histograms with COUNTS() if this number increases beyond 50.
 const int kMaxSnippetCount = 10;
 
 const int kFetchingIntervalWifiChargingSeconds = 30 * 60;
@@ -364,7 +367,7 @@
 
 void NTPSnippetsService::OnJsonParsed(const std::string& snippets_json,
                                       std::unique_ptr<base::Value> parsed) {
-  if (!LoadFromValue(*parsed)) {
+  if (!LoadFromFetchedValue(*parsed)) {
     LOG(WARNING) << "Received invalid snippets: " << snippets_json;
     last_fetch_status_ = kStatusMessageEmptyList;
   } else {
@@ -383,7 +386,7 @@
   LoadingSnippetsFinished();
 }
 
-bool NTPSnippetsService::LoadFromValue(const base::Value& value) {
+bool NTPSnippetsService::LoadFromFetchedValue(const base::Value& value) {
   const base::DictionaryValue* top_dict = nullptr;
   if (!value.GetAsDictionary(&top_dict))
     return false;
@@ -392,14 +395,20 @@
   if (!top_dict->GetList("recos", &list))
     return false;
 
-  return LoadFromListValue(*list);
-}
-
-bool NTPSnippetsService::LoadFromListValue(const base::ListValue& list) {
   NTPSnippetStorage new_snippets;
-  if (!AddSnippetsFromListValue(list, &new_snippets))
+  if (!AddSnippetsFromListValue(*list, &new_snippets))
     return false;
 
+  // Sparse histogram used because the number of snippets is small (bound by
+  // kMaxSnippetCount).
+  DCHECK_LE(new_snippets.size(), static_cast<size_t>(kMaxSnippetCount));
+  UMA_HISTOGRAM_SPARSE_SLOWLY("NewTabPage.Snippets.NumArticlesFetched",
+                              new_snippets.size());
+
+  return MergeSnippets(std::move(new_snippets));
+}
+
+bool NTPSnippetsService::MergeSnippets(NTPSnippetStorage new_snippets) {
   // Remove new snippets that we already have, or that have been discarded.
   new_snippets.erase(
       std::remove_if(new_snippets.begin(), new_snippets.end(),
@@ -429,7 +438,10 @@
 }
 
 void NTPSnippetsService::LoadSnippetsFromPrefs() {
-  bool success = LoadFromListValue(*pref_service_->GetList(prefs::kSnippets));
+  NTPSnippetStorage prefs_snippets;
+  bool success = AddSnippetsFromListValue(
+      *pref_service_->GetList(prefs::kSnippets), &prefs_snippets) &&
+      MergeSnippets(std::move(prefs_snippets));
   DCHECK(success) << "Failed to parse snippets from prefs";
 
   LoadingSnippetsFinished();
@@ -500,6 +512,10 @@
 
   UMA_HISTOGRAM_SPARSE_SLOWLY("NewTabPage.Snippets.NumArticles",
                               snippets_.size());
+  if (snippets_.empty() && !discarded_snippets_.empty()) {
+    UMA_HISTOGRAM_COUNTS("NewTabPage.Snippets.NumArticlesZeroDueToDiscarded",
+                         discarded_snippets_.size());
+  }
 
   FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_,
                     NTPSnippetsServiceLoaded());
diff --git a/components/ntp_snippets/ntp_snippets_service.h b/components/ntp_snippets/ntp_snippets_service.h
index e958ade8..fccd9ef 100644
--- a/components/ntp_snippets/ntp_snippets_service.h
+++ b/components/ntp_snippets/ntp_snippets_service.h
@@ -144,15 +144,12 @@
                     std::unique_ptr<base::Value> parsed);
   void OnJsonError(const std::string& snippets_json, const std::string& error);
 
-  // Expects a top-level dictionary containing a "recos" list, which will be
-  // passed to LoadFromListValue().
-  bool LoadFromValue(const base::Value& value);
+  // Expects a top-level dictionary containing a "recos" list, each element of
+  // which will be parsed as a snippet.
+  bool LoadFromFetchedValue(const base::Value& value);
 
-  // Expects a list of dictionaries each containing a "contentInfo" dictionary
-  // with keys matching the properties of a snippet (url, title, site_title,
-  // etc...). The URL is the only mandatory value.
-  bool LoadFromListValue(const base::ListValue& list);
-
+  // Merges newly available snippets with the previously available list.
+  bool MergeSnippets(NTPSnippetStorage new_snippets);
   // TODO(treib): Investigate a better storage, maybe LevelDB or SQLite?
   void LoadSnippetsFromPrefs();
   void StoreSnippetsToPrefs();
diff --git a/components/ntp_snippets/ntp_snippets_service_unittest.cc b/components/ntp_snippets/ntp_snippets_service_unittest.cc
index a453305..b06b221b 100644
--- a/components/ntp_snippets/ntp_snippets_service_unittest.cc
+++ b/components/ntp_snippets/ntp_snippets_service_unittest.cc
@@ -24,6 +24,8 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using testing::ElementsAre;
+using testing::IsEmpty;
 using testing::_;
 
 namespace ntp_snippets {
@@ -148,7 +150,7 @@
         pref_service_.get(), nullptr, task_runner, std::string("fr"),
         scheduler_.get(),
         base::WrapUnique(new NTPSnippetsFetcher(
-            task_runner, std::move(request_context_getter), true)),
+            std::move(request_context_getter), true)),
         base::Bind(&ParseJson, true)));
     if (enabled)
       EXPECT_CALL(*scheduler_, Schedule(_, _, _, _));
@@ -391,23 +393,55 @@
   base::HistogramTester tester;
   SetExpectJsonParseSuccess(false);
   LoadFromJSONString(GetInvalidJson());
-  tester.ExpectUniqueSample("NewTabPage.Snippets.NumArticles", /*sample=*/0,
-                            /*expected_count=*/1);
+  EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticles"),
+              ElementsAre(base::Bucket(/*min=*/0, /*count=*/1)));
+  // Invalid JSON shouldn't contribute to NumArticlesFetched.
+  EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticlesFetched"),
+              IsEmpty());
   SetExpectJsonParseSuccess(true);
+  // Valid JSON with empty list.
+  LoadFromJSONString("{ \"recos\": []}");
+  EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticles"),
+              ElementsAre(base::Bucket(/*min=*/0, /*count=*/2)));
+  EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticlesFetched"),
+              ElementsAre(base::Bucket(/*min=*/0, /*count=*/1)));
+  // Snippet list should be populated with size 1.
   LoadFromJSONString(GetTestJson());
-  tester.ExpectBucketCount("NewTabPage.Snippets.NumArticles", /*sample=*/1,
-                            /*expected_count=*/1);
+  EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticles"),
+              ElementsAre(base::Bucket(/*min=*/0, /*count=*/2),
+                          base::Bucket(/*min=*/1, /*count=*/1)));
+  EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticlesFetched"),
+              ElementsAre(base::Bucket(/*min=*/0, /*count=*/1),
+                          base::Bucket(/*min=*/1, /*count=*/1)));
   // Duplicate snippet shouldn't increase the list size.
   LoadFromJSONString(GetTestJson());
-  tester.ExpectBucketCount("NewTabPage.Snippets.NumArticles", /*sample=*/1,
-                            /*expected_count=*/2);
+  EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticles"),
+              ElementsAre(base::Bucket(/*min=*/0, /*count=*/2),
+                          base::Bucket(/*min=*/1, /*count=*/2)));
+  EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticlesFetched"),
+              ElementsAre(base::Bucket(/*min=*/0, /*count=*/1),
+                          base::Bucket(/*min=*/1, /*count=*/2)));
+  EXPECT_THAT(
+      tester.GetAllSamples("NewTabPage.Snippets.NumArticlesZeroDueToDiscarded"),
+      IsEmpty());
   // Discarding a snippet should decrease the list size. This will only be
   // logged after the next fetch.
   EXPECT_TRUE(service()->DiscardSnippet(GURL("http://localhost/foobar")));
   LoadFromJSONString(GetTestJson());
-  tester.ExpectBucketCount("NewTabPage.Snippets.NumArticles", /*sample=*/0,
-                            /*expected_count=*/2);
-  tester.ExpectTotalCount("NewTabPage.Snippets.NumArticles", 4);
+  EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticles"),
+              ElementsAre(base::Bucket(/*min=*/0, /*count=*/3),
+                          base::Bucket(/*min=*/1, /*count=*/2)));
+  // Discarded snippets shouldn't influence NumArticlesFetched.
+  EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticlesFetched"),
+              ElementsAre(base::Bucket(/*min=*/0, /*count=*/1),
+                          base::Bucket(/*min=*/1, /*count=*/3)));
+  EXPECT_THAT(
+      tester.GetAllSamples("NewTabPage.Snippets.NumArticlesZeroDueToDiscarded"),
+      ElementsAre(base::Bucket(/*min=*/1, /*count=*/1)));
+  // Recreating the service and loading from prefs shouldn't count as fetched
+  // articles.
+  CreateSnippetsService();
+  tester.ExpectTotalCount("NewTabPage.Snippets.NumArticlesFetched", 4);
 }
 
 }  // namespace ntp_snippets
diff --git a/components/offline_pages.gypi b/components/offline_pages.gypi
index 05e12834..149c8ee 100644
--- a/components/offline_pages.gypi
+++ b/components/offline_pages.gypi
@@ -37,6 +37,30 @@
       ],
     },
     {
+      # GN: //components/offline_pages/background:background_offliner
+      'target_name': 'offline_pages_background_offliner',
+      'type': 'static_library',
+      'include_dirs': [
+        '..',
+        '../..',
+      ],
+      'dependencies': [
+        '../base/base.gyp:base',
+        '../net/net.gyp:net',
+        '../url/url.gyp:url_lib',
+      ],
+      'sources': [
+        'offline_pages/background/offliner.h',
+        'offline_pages/background/request_coordinator.cc',
+        'offline_pages/background/request_coordinator.h',
+        'offline_pages/background/request_queue.cc',
+        'offline_pages/background/request_queue.h',
+        'offline_pages/background/save_page_request.cc',
+        'offline_pages/background/save_page_request.h',
+        'offline_pages/background/scheduler.h',
+      ],
+    },
+    {
       # GN version: //components/offline_pages:test_support
       'target_name': 'offline_pages_test_support',
       'type': 'static_library',
diff --git a/components/offline_pages/BUILD.gn b/components/offline_pages/BUILD.gn
index 94a9d75a..cee2a6cb 100644
--- a/components/offline_pages/BUILD.gn
+++ b/components/offline_pages/BUILD.gn
@@ -9,7 +9,10 @@
 # GYP: //components/offline_pages.gypi:offline_pages
 static_library("offline_pages") {
   sources = [
+    "client_policy_controller.cc",
+    "client_policy_controller.h",
     "offline_page_archiver.h",
+    "offline_page_client_policy.h",
     "offline_page_item.cc",
     "offline_page_item.h",
     "offline_page_metadata_store.cc",
@@ -68,6 +71,7 @@
 source_set("unit_tests") {
   testonly = true
   sources = [
+    "client_policy_controller_unittest.cc",
     "offline_page_metadata_store_impl_unittest.cc",
     "offline_page_model_unittest.cc",
     "snapshot_controller_unittest.cc",
diff --git a/components/offline_pages/background/BUILD.gn b/components/offline_pages/background/BUILD.gn
new file mode 100644
index 0000000..2f4b970
--- /dev/null
+++ b/components/offline_pages/background/BUILD.gn
@@ -0,0 +1,43 @@
+# Copyright 2016 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.
+
+if (is_android) {
+  import("//build/config/android/rules.gni")
+}
+
+# GYP: //components/offline_pages/offline_pages.gypi:background_offliner
+static_library("background_offliner") {
+  sources = [
+    "offliner.h",
+    "request_coordinator.cc",
+    "request_coordinator.h",
+    "request_queue.cc",
+    "request_queue.h",
+    "save_page_request.cc",
+    "save_page_request.h",
+    "scheduler.h",
+  ]
+
+  deps = [
+    "//base",
+    "//components/offline_pages:offline_pages",
+    "//net",
+    "//url",
+  ]
+}
+
+source_set("unit_tests") {
+  testonly = true
+  sources = [
+    "save_page_request_unittest.cc",
+  ]
+
+  deps = [
+    ":background_offliner",
+    "//base",
+    "//components/offline_pages:offline_pages",
+    "//testing/gtest",
+    "//url",
+  ]
+}
diff --git a/components/offline_pages/background/request_coordinator.cc b/components/offline_pages/background/request_coordinator.cc
new file mode 100644
index 0000000..1e4d2563
--- /dev/null
+++ b/components/offline_pages/background/request_coordinator.cc
@@ -0,0 +1,32 @@
+// Copyright 2016 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 "components/offline_pages/background/request_coordinator.h"
+
+// TODO(fgorski): include file with SavePageRequest definition.
+
+namespace offline_pages {
+
+// TODO(dougarnett): How to inject Offliner factories and policy objects.
+RequestCoordinator::RequestCoordinator() {
+  // Do setup as needed.
+}
+
+RequestCoordinator::~RequestCoordinator() {
+  // Do cleanup as needed.
+}
+
+bool RequestCoordinator::SavePageLater(const SavePageRequest& request) {
+  return true;
+}
+
+bool RequestCoordinator::StartProcessing(
+    const ProcessingDoneCallback& callback) {
+  return false;
+}
+
+void RequestCoordinator::StopProcessing() {
+}
+
+}  // namespace offline_pages
diff --git a/components/offline_pages/background/request_coordinator.h b/components/offline_pages/background/request_coordinator.h
index 3ddd2d9d..4799106 100644
--- a/components/offline_pages/background/request_coordinator.h
+++ b/components/offline_pages/background/request_coordinator.h
@@ -5,6 +5,8 @@
 #ifndef COMPONENTS_OFFLINE_PAGES_BACKGROUND_REQUEST_COORDINATOR_H_
 #define COMPONENTS_OFFLINE_PAGES_BACKGROUND_REQUEST_COORDINATOR_H_
 
+#include "base/callback.h"
+
 namespace offline_pages {
 
 // Coordinates queueing and processing save page later requests.
@@ -20,7 +22,7 @@
   // TODO(dougarnett): How to inject Offliner factories and policy objects.
   RequestCoordinator();
 
-  ~RequestCoordinator() {}
+  ~RequestCoordinator();
 
   // Queues |request| to later load and save when system conditions allow.
   bool SavePageLater(const SavePageRequest& request);
diff --git a/components/offline_pages/background/request_queue.cc b/components/offline_pages/background/request_queue.cc
new file mode 100644
index 0000000..55af12f
--- /dev/null
+++ b/components/offline_pages/background/request_queue.cc
@@ -0,0 +1,24 @@
+// Copyright 2016 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 "components/offline_pages/background/request_queue.h"
+
+#include "components/offline_pages/background/save_page_request.h"
+
+namespace offline_pages {
+
+void RequestQueue::GetRequests(const GetRequestsCallback& callback) {}
+
+void RequestQueue::AddRequest(const SavePageRequest& request,
+                              const AddRequestCallback& callback) {}
+
+void RequestQueue::UpdateRequest(const SavePageRequest& request,
+                                 const UpdateRequestCallback& callback) {}
+
+void RequestQueue::RemoveRequest(int64_t request_id,
+                                 const UpdateRequestCallback& callback) {}
+
+void RequestQueue::PurgeRequests(const PurgeRequestsCallback& callback) {}
+
+}  // namespace offline_pages
diff --git a/components/offline_pages/background/request_queue.h b/components/offline_pages/background/request_queue.h
new file mode 100644
index 0000000..afae725
--- /dev/null
+++ b/components/offline_pages/background/request_queue.h
@@ -0,0 +1,85 @@
+// Copyright 2016 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 COMPONENTS_OFFLINE_PAGES_BACKGROUND_REQUEST_QUEUE_H_
+#define COMPONENTS_OFFLINE_PAGES_BACKGROUND_REQUEST_QUEUE_H_
+
+#include <stdint.h>
+#include <vector>
+
+#include "base/callback.h"
+
+namespace offline_pages {
+
+class SavePageRequest;
+
+// Class responsible for managing save page requests.
+class RequestQueue {
+ public:
+  enum class GetRequestsResult {
+    kSuccess,
+    kStoreFailure,
+  };
+
+  enum class AddRequestResult {
+    kSuccess,
+    kStoreFailure,
+    kRequestQuotaHit,  // Cannot add a request with this namespace, as it has
+                       // reached a quota of active requests.
+  };
+
+  enum class UpdateRequestResult {
+    kSuccess,
+    kStoreFailure,
+    kRequestDoesNotExist,  // Failed to delete the request because it does not
+                           // exist.
+  };
+
+  // Callback used for |GetRequests|.
+  typedef base::Callback<void(GetRequestsResult,
+                              const std::vector<SavePageRequest>&)>
+      GetRequestsCallback;
+
+  // Callback used for |AddRequest|.
+  typedef base::Callback<void(AddRequestResult, const SavePageRequest& request)>
+      AddRequestCallback;
+
+  // Callback used by |UdpateRequest| and |RemoveRequest|.
+  typedef base::Callback<void(UpdateRequestResult)> UpdateRequestCallback;
+
+  // Gets all of the active requests from the store. Calling this method may
+  // schedule purging of the request queue.
+  void GetRequests(const GetRequestsCallback& callback);
+
+  // Adds |request| to the request queue. Result is returned through |callback|.
+  // In case adding the request violates policy, the result will fail with
+  // appropriate result. Callback will also return a copy of a request with all
+  // fields set.
+  void AddRequest(const SavePageRequest& request,
+                  const AddRequestCallback& callback);
+
+  // Updates a request in the request queue if a request with matching ID
+  // exists. Does nothing otherwise. Result is returned through |callback|.
+  void UpdateRequest(const SavePageRequest& request,
+                     const UpdateRequestCallback& callback);
+
+  // Removes the request matching the |request_id|. Result is returned through
+  // |callback|.
+  void RemoveRequest(int64_t request_id, const UpdateRequestCallback& callback);
+
+ private:
+  // Callback used by |PurgeRequests|.
+  typedef base::Callback<void(UpdateRequestResult,
+                              int /* removed requests count */)>
+      PurgeRequestsCallback;
+
+  // Purges the queue, removing the requests that are no longer relevant, e.g.
+  // expired request. Result is returned through |callback| carries the number
+  // of removed requests.
+  void PurgeRequests(const PurgeRequestsCallback& callback);
+};
+
+}  // namespace offline_pages
+
+#endif  // COMPONENTS_OFFLINE_PAGES_BACKGROUND_REQUEST_QUEUE_H_
diff --git a/components/offline_pages/background/save_page_request.cc b/components/offline_pages/background/save_page_request.cc
new file mode 100644
index 0000000..fdae22c
--- /dev/null
+++ b/components/offline_pages/background/save_page_request.cc
@@ -0,0 +1,67 @@
+// Copyright 2016 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 "components/offline_pages/background/save_page_request.h"
+
+namespace offline_pages {
+
+SavePageRequest::SavePageRequest(int64_t request_id,
+                                 const GURL& url,
+                                 const ClientId& client_id,
+                                 const base::Time& creation_time)
+    : request_id_(request_id),
+      url_(url),
+      client_id_(client_id),
+      creation_time_(creation_time),
+      activation_time_(creation_time),
+      attempt_count_(0) {}
+
+SavePageRequest::SavePageRequest(int64_t request_id,
+                                 const GURL& url,
+                                 const ClientId& client_id,
+                                 const base::Time& creation_time,
+                                 const base::Time& activation_time)
+    : request_id_(request_id),
+      url_(url),
+      client_id_(client_id),
+      creation_time_(creation_time),
+      activation_time_(activation_time),
+      attempt_count_(0) {}
+
+SavePageRequest::~SavePageRequest() {}
+
+// TODO(fgorski): Introduce policy parameter, once policy is available.
+SavePageRequest::Status SavePageRequest::GetStatus(
+    const base::Time& now) const {
+  if (now < activation_time_)
+    return Status::kNotReady;
+
+  // TODO(fgorski): enable check once policy available.
+  // if (attempt_count_ >= policy.max_attempt_count)
+  // return Status::kFailed;
+
+  // TODO(fgorski): enable check once policy available.
+  // if (activation_time_+ policy.page_expiration_interval < now)
+  // return Status::kExpired;
+
+  if (creation_time_ < last_attempt_time_)
+    return Status::kStarted;
+
+  return Status::kPending;
+}
+
+void SavePageRequest::MarkAttemptStarted(const base::Time& start_time) {
+  DCHECK_LE(activation_time_, start_time);
+  // TODO(fgorski): As part of introducing policy in GetStatus, we can make a
+  // check here to ensure we only start tasks in status pending, and bail out in
+  // other cases.
+  last_attempt_time_ = start_time;
+  ++attempt_count_;
+}
+
+void SavePageRequest::MarkAttemptCompleted() {
+  last_attempt_time_ = base::Time();
+}
+
+}  // namespace offline_pages
diff --git a/components/offline_pages/background/save_page_request.h b/components/offline_pages/background/save_page_request.h
new file mode 100644
index 0000000..572ce31
--- /dev/null
+++ b/components/offline_pages/background/save_page_request.h
@@ -0,0 +1,90 @@
+// Copyright 2016 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 COMPONENTS_OFFLINE_PAGES_BACKGROUND_SAVE_PAGE_REQUEST_H_
+#define COMPONENTS_OFFLINE_PAGES_BACKGROUND_SAVE_PAGE_REQUEST_H_
+
+#include <stdint.h>
+
+#include "base/time/time.h"
+#include "components/offline_pages/offline_page_item.h"
+#include "url/gurl.h"
+
+namespace offline_pages {
+
+// Class representing a request to save page.
+class SavePageRequest {
+ public:
+  enum class Status {
+    kNotReady,  // Component requested a page be saved, but not until
+                // |activation_time_|.
+    kPending,   // Page request is pending, and coordinator can attempt it
+                // when it gets a chance to.
+    kStarted,   // The request is currently being processed.
+    kFailed,    // Page request failed many times and will no longer be
+                // retried.
+    kExpired,   // Save page request expired without being fulfilled.
+  };
+
+  SavePageRequest(int64_t request_id,
+                  const GURL& url,
+                  const ClientId& client_id,
+                  const base::Time& creation_time);
+  SavePageRequest(int64_t request_id,
+                  const GURL& url,
+                  const ClientId& client_id,
+                  const base::Time& creation_time,
+                  const base::Time& activation_time);
+  ~SavePageRequest();
+
+  // Status of this request.
+  Status GetStatus(const base::Time& now) const;
+
+  // Updates the |last_attempt_time_| and increments |attempt_count_|.
+  void MarkAttemptStarted(const base::Time& start_time);
+
+  // Marks attempt as completed and clears |last_attempt_time_|.
+  void MarkAttemptCompleted();
+
+  int64_t request_id() const { return request_id_; }
+
+  const GURL& url() const { return url_; }
+
+  const ClientId& client_id() const { return client_id_; }
+
+  const base::Time& creation_time() const { return creation_time_; }
+
+  const base::Time& activation_time() const { return activation_time_; }
+
+  int64_t attempt_count() const { return attempt_count_; }
+
+  const base::Time& last_attempt_time() const { return last_attempt_time_; }
+
+ private:
+  // ID of this request.
+  int64_t request_id_;
+
+  // Online URL of a page to be offlined.
+  GURL url_;
+
+  // Client ID related to the request. Contains namespace and ID assigned by the
+  // requester.
+  ClientId client_id_;
+
+  // Time when this request was created. (Alternative 2).
+  base::Time creation_time_;
+
+  // Time when this request will become active.
+  base::Time activation_time_;
+
+  // Number of attempts made to get the page.
+  int attempt_count_;
+
+  // Timestamp of the last request starting.
+  base::Time last_attempt_time_;
+};
+
+}  // namespace offline_pages
+
+#endif  // COMPONENTS_OFFLINE_PAGES_BACKGROUND_SAVE_PAGE_REQUEST_H_
diff --git a/components/offline_pages/background/save_page_request_unittest.cc b/components/offline_pages/background/save_page_request_unittest.cc
new file mode 100644
index 0000000..579b8bc
--- /dev/null
+++ b/components/offline_pages/background/save_page_request_unittest.cc
@@ -0,0 +1,100 @@
+// Copyright 2016 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 "components/offline_pages/background/save_page_request.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace offline_pages {
+
+namespace {
+const int64_t kRequestId = 42;
+const GURL kUrl("http://example.com");
+const ClientId kClientId("bookmark", "1234");
+}  // namespace
+
+class SavePageRequestTest : public testing::Test {
+ public:
+  ~SavePageRequestTest() override;
+};
+
+SavePageRequestTest::~SavePageRequestTest() {}
+
+TEST_F(SavePageRequestTest, CreatePendingReqeust) {
+  base::Time creation_time = base::Time::Now();
+  SavePageRequest request(kRequestId, kUrl, kClientId, creation_time);
+  ASSERT_EQ(kRequestId, request.request_id());
+  ASSERT_EQ(kUrl, request.url());
+  ASSERT_EQ(kClientId, request.client_id());
+  ASSERT_EQ(creation_time, request.creation_time());
+  ASSERT_EQ(creation_time, request.activation_time());
+  ASSERT_EQ(base::Time(), request.last_attempt_time());
+  ASSERT_EQ(0, request.attempt_count());
+
+  base::Time after_creation = creation_time + base::TimeDelta::FromHours(6);
+  ASSERT_EQ(SavePageRequest::Status::kPending,
+            request.GetStatus(after_creation));
+}
+
+TEST_F(SavePageRequestTest, CreateNotReadyRequest) {
+  base::Time creation_time = base::Time::Now();
+  base::Time activation_time = creation_time + base::TimeDelta::FromHours(6);
+  SavePageRequest request(kRequestId, kUrl, kClientId, creation_time,
+                          activation_time);
+
+  ASSERT_EQ(kRequestId, request.request_id());
+  ASSERT_EQ(kUrl, request.url());
+  ASSERT_EQ(kClientId, request.client_id());
+  ASSERT_EQ(creation_time, request.creation_time());
+  ASSERT_EQ(activation_time, request.activation_time());
+  ASSERT_EQ(base::Time(), request.last_attempt_time());
+  ASSERT_EQ(0, request.attempt_count());
+
+  base::Time not_ready_time = activation_time - base::TimeDelta::FromHours(3);
+  ASSERT_EQ(SavePageRequest::Status::kNotReady,
+            request.GetStatus(not_ready_time));
+
+  base::Time ready_time = activation_time + base::TimeDelta::FromHours(3);
+  ASSERT_EQ(SavePageRequest::Status::kPending, request.GetStatus(ready_time));
+}
+
+TEST_F(SavePageRequestTest, StartAndCompleteRequest) {
+  base::Time creation_time = base::Time::Now();
+  base::Time activation_time = creation_time + base::TimeDelta::FromHours(6);
+  SavePageRequest request(kRequestId, kUrl, kClientId, creation_time,
+                          activation_time);
+
+  base::Time start_time = activation_time + base::TimeDelta::FromHours(3);
+  request.MarkAttemptStarted(start_time);
+
+  // Most things don't change about the request.
+  ASSERT_EQ(kRequestId, request.request_id());
+  ASSERT_EQ(kUrl, request.url());
+  ASSERT_EQ(kClientId, request.client_id());
+  ASSERT_EQ(creation_time, request.creation_time());
+  ASSERT_EQ(activation_time, request.activation_time());
+
+  // Attempt time, attempt count and status will though.
+  ASSERT_EQ(start_time, request.last_attempt_time());
+  ASSERT_EQ(1, request.attempt_count());
+
+  ASSERT_EQ(SavePageRequest::Status::kStarted, request.GetStatus(start_time));
+
+  request.MarkAttemptCompleted();
+
+  // Again, most things don't change about the request.
+  ASSERT_EQ(kRequestId, request.request_id());
+  ASSERT_EQ(kUrl, request.url());
+  ASSERT_EQ(kClientId, request.client_id());
+  ASSERT_EQ(creation_time, request.creation_time());
+  ASSERT_EQ(activation_time, request.activation_time());
+
+  // Last attempt time and status will. Attempt count also unchanged.
+  ASSERT_EQ(base::Time(), request.last_attempt_time());
+  ASSERT_EQ(1, request.attempt_count());
+
+  ASSERT_EQ(SavePageRequest::Status::kPending, request.GetStatus(start_time));
+}
+
+}  // offline_pages
diff --git a/components/offline_pages/client_policy_controller.cc b/components/offline_pages/client_policy_controller.cc
new file mode 100644
index 0000000..cc3209c
--- /dev/null
+++ b/components/offline_pages/client_policy_controller.cc
@@ -0,0 +1,58 @@
+// Copyright 2016 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 "components/offline_pages/client_policy_controller.h"
+
+#include <utility>
+
+#include "base/time/time.h"
+
+using LifetimeType = offline_pages::LifetimePolicy::LifetimeType;
+
+namespace offline_pages {
+
+namespace {
+const char kBookmarkNamespace[] = "bookmark";
+const char kLastNNamespace[] = "last_n";
+}  // namespace
+
+ClientPolicyController::ClientPolicyController() {
+  policies_.clear();
+  // Manually defining client policies for bookmark and last_n.
+  policies_.insert(std::make_pair(
+      kBookmarkNamespace,
+      MakePolicy(kBookmarkNamespace, LifetimeType::TEMPORARY,
+                 base::TimeDelta::FromDays(7), kUnlimitedPages)));
+  policies_.insert(std::make_pair(
+      kLastNNamespace, MakePolicy(kLastNNamespace, LifetimeType::TEMPORARY,
+                                  base::TimeDelta::FromDays(2), 20)));
+  // Fallback policy.
+  policies_.insert(std::make_pair(
+      kDefaultNamespace, MakePolicy(kDefaultNamespace, LifetimeType::TEMPORARY,
+                                    base::TimeDelta::FromDays(1), 10)));
+}
+
+ClientPolicyController::~ClientPolicyController() {}
+
+// static
+const OfflinePageClientPolicy ClientPolicyController::MakePolicy(
+    const std::string& name_space,
+    LifetimeType lifetime_type,
+    const base::TimeDelta& expire_period,
+    int page_limit) {
+  OfflinePageClientPolicy policy(
+      {name_space, {lifetime_type, expire_period, page_limit}});
+  return policy;
+}
+
+const OfflinePageClientPolicy& ClientPolicyController::GetPolicy(
+    const std::string& name_space) const {
+  const auto& iter = policies_.find(name_space);
+  if (iter != policies_.end())
+    return iter->second;
+  // Fallback when the namespace isn't defined.
+  return policies_.at(kDefaultNamespace);
+}
+
+}  // namespace offline_pages
diff --git a/components/offline_pages/client_policy_controller.h b/components/offline_pages/client_policy_controller.h
new file mode 100644
index 0000000..3e086534
--- /dev/null
+++ b/components/offline_pages/client_policy_controller.h
@@ -0,0 +1,48 @@
+// Copyright 2016 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 COMPONENTS_OFFLINE_PAGES_CLIENT_POLICY_CONTROLLER_H_
+#define COMPONENTS_OFFLINE_PAGES_CLIENT_POLICY_CONTROLLER_H_
+
+#include <stdint.h>
+
+#include <map>
+#include <string>
+
+#include "base/time/time.h"
+#include "components/offline_pages/offline_page_client_policy.h"
+
+namespace offline_pages {
+
+// Currently used for fallbacks like tests.
+static const char kDefaultNamespace[] = "default";
+
+// This is the class which is a singleton for offline page model
+// to get client policies based on namespaces.
+class ClientPolicyController {
+ public:
+  ClientPolicyController();
+  ~ClientPolicyController();
+
+  // Generates a client policy from the input values.
+  static const OfflinePageClientPolicy MakePolicy(
+      const std::string& name_space,
+      LifetimePolicy::LifetimeType lifetime_type,
+      const base::TimeDelta& expiration_period,
+      int page_limit);
+
+  // Get the client policy for |name_space|.
+  const OfflinePageClientPolicy& GetPolicy(const std::string& name_space) const;
+
+ private:
+  // The map from name_space to a client policy. Will be generated
+  // as pre-defined values for now.
+  std::map<std::string, OfflinePageClientPolicy> policies_;
+
+  DISALLOW_COPY_AND_ASSIGN(ClientPolicyController);
+};
+
+}  // namespace offline_pages
+
+#endif  // COMPONENTS_OFFLINE_PAGES_CLIENT_POLICY_CONTROLLER_H_
diff --git a/components/offline_pages/client_policy_controller_unittest.cc b/components/offline_pages/client_policy_controller_unittest.cc
new file mode 100644
index 0000000..6bd4fae
--- /dev/null
+++ b/components/offline_pages/client_policy_controller_unittest.cc
@@ -0,0 +1,67 @@
+// Copyright 2016 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 "components/offline_pages/client_policy_controller.h"
+
+#include "base/bind.h"
+#include "base/time/time.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using LifetimeType = offline_pages::LifetimePolicy::LifetimeType;
+
+namespace offline_pages {
+
+namespace {
+const char kBookmarkNamespace[] = "bookmark";
+const char kLastNNamespace[] = "last_n";
+const char kUndefinedNamespace[] = "undefined";
+
+bool isTemporary(const OfflinePageClientPolicy& policy) {
+  // Check if policy has a expire period > 0 or a limited number
+  // of pages allowed.
+  return (policy.lifetime_policy.page_limit > kUnlimitedPages ||
+          !policy.lifetime_policy.expiration_period.is_zero());
+}
+
+}  // namespace
+
+class ClientPolicyControllerTest : public testing::Test {
+ public:
+  ClientPolicyController* controller() { return controller_.get(); }
+
+  // testing::Test
+  void SetUp() override;
+  void TearDown() override;
+
+ private:
+  std::unique_ptr<ClientPolicyController> controller_;
+};
+
+void ClientPolicyControllerTest::SetUp() {
+  controller_.reset(new ClientPolicyController());
+}
+
+void ClientPolicyControllerTest::TearDown() {
+  controller_.reset();
+}
+
+TEST_F(ClientPolicyControllerTest, FallbackTest) {
+  OfflinePageClientPolicy policy = controller()->GetPolicy(kUndefinedNamespace);
+  EXPECT_EQ(policy.name_space, kDefaultNamespace);
+  EXPECT_TRUE(isTemporary(policy));
+}
+
+TEST_F(ClientPolicyControllerTest, CheckBookmarkDefined) {
+  OfflinePageClientPolicy policy = controller()->GetPolicy(kBookmarkNamespace);
+  EXPECT_EQ(policy.name_space, kBookmarkNamespace);
+  EXPECT_TRUE(isTemporary(policy));
+}
+
+TEST_F(ClientPolicyControllerTest, CheckLastNDefined) {
+  OfflinePageClientPolicy policy = controller()->GetPolicy(kLastNNamespace);
+  EXPECT_EQ(policy.name_space, kLastNNamespace);
+  EXPECT_TRUE(isTemporary(policy));
+}
+
+}  // namespace offline_pages
diff --git a/components/offline_pages/offline_page_client_policy.h b/components/offline_pages/offline_page_client_policy.h
new file mode 100644
index 0000000..8b47d3a
--- /dev/null
+++ b/components/offline_pages/offline_page_client_policy.h
@@ -0,0 +1,55 @@
+// Copyright 2016 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 COMPONENTS_OFFLINE_PAGES_OFFLINE_PAGE_CLIENT_POLICY_H_
+#define COMPONENTS_OFFLINE_PAGES_OFFLINE_PAGE_CLIENT_POLICY_H_
+
+#include <stdint.h>
+
+#include <string>
+
+#include "base/time/time.h"
+
+namespace offline_pages {
+
+static const int kUnlimitedPages = 0;
+
+// The struct describing the lifetime policy of offline pages.
+// The following behaviors are controlled by policy:
+//    a. Persistency of the offline page.
+//    b. Expiration time of an offline page
+//    c. Limit of number of pages offline.
+struct LifetimePolicy {
+  // Type of the client, indicating where the archived page would be saved
+  // and whether it could be kept indefinitely.
+  enum class LifetimeType {
+    TEMPORARY,
+    PERSISTENT,
+  };
+
+  // Type of the page generated by the client.
+  LifetimeType lifetime_type;
+
+  // The time after which the page expires.
+  base::TimeDelta expiration_period;
+
+  // The maximum number of pages allowed to be saved by the namespace.
+  // kUnlimitedPages (defined above) means no limit set.
+  int page_limit;
+};
+
+// The struct describing policies for various namespaces (Bookmark, Last-N etc.)
+// used by offline page model. The name_space is supposed to be key, so that
+// it's sufficient to compare name_space only when doing comparisons.
+struct OfflinePageClientPolicy {
+  // Namespace to which the policy applied.
+  std::string name_space;
+
+  // Policy to control the lifetime of a page generated by this namespace.
+  LifetimePolicy lifetime_policy;
+};
+
+}  // namespace offline_pages
+
+#endif  // COMPONENTS_OFFLINE_PAGES_OFFLINE_PAGE_CLIENT_POLICY_H_
diff --git a/components/offline_pages/offline_page_model.cc b/components/offline_pages/offline_page_model.cc
index 66d8c9ec..1cbd15a7 100644
--- a/components/offline_pages/offline_page_model.cc
+++ b/components/offline_pages/offline_page_model.cc
@@ -12,6 +12,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/optional.h"
 #include "base/rand_util.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_number_conversions.h"
@@ -315,7 +316,8 @@
   callback.Run(result);
 }
 
-void OfflinePageModel::GetAllPages(const GetAllPagesCallback& callback) {
+void OfflinePageModel::GetAllPages(
+    const MultipleOfflinePageItemCallback& callback) {
   if (!is_loaded_) {
     delayed_tasks_.push_back(
         base::Bind(&OfflinePageModel::GetAllPagesAfterLoadDone,
@@ -327,31 +329,33 @@
 }
 
 void OfflinePageModel::GetAllPagesAfterLoadDone(
-    const GetAllPagesCallback& callback) {
+    const MultipleOfflinePageItemCallback& callback) {
   DCHECK(is_loaded_);
 
-  std::vector<OfflinePageItem> offline_pages;
+  MultipleOfflinePageItemResult offline_pages;
   for (const auto& id_page_pair : offline_pages_)
     offline_pages.push_back(id_page_pair.second);
 
   callback.Run(offline_pages);
 }
 
-const std::vector<OfflinePageItem> OfflinePageModel::GetPagesToCleanUp() const {
-  DCHECK(is_loaded_);
-  std::vector<OfflinePageItem> offline_pages;
-  base::Time now = base::Time::Now();
-  for (const auto& id_page_pair : offline_pages_) {
-    if (now - id_page_pair.second.last_access_time > kPageCleanUpThreshold)
-      offline_pages.push_back(id_page_pair.second);
-  }
-  return offline_pages;
+void OfflinePageModel::GetOfflineIdsForClientId(
+    const ClientId& client_id,
+    const MultipleOfflineIdCallback& callback) {
+  RunWhenLoaded(
+      base::Bind(&OfflinePageModel::GetOfflineIdsForClientIdWhenLoadDone,
+                 weak_ptr_factory_.GetWeakPtr(), client_id, callback));
+}
+
+void OfflinePageModel::GetOfflineIdsForClientIdWhenLoadDone(
+    const ClientId& client_id,
+    const MultipleOfflineIdCallback& callback) const {
+  callback.Run(MaybeGetOfflineIdsForClientId(client_id));
 }
 
 // TODO(fgorski): Remove include_deleted, as it no longer makes sense.
-const std::vector<int64_t> OfflinePageModel::GetOfflineIdsForClientId(
-    const ClientId& client_id,
-    bool include_deleted) const {
+const std::vector<int64_t> OfflinePageModel::MaybeGetOfflineIdsForClientId(
+    const ClientId& client_id) const {
   DCHECK(is_loaded_);
   std::vector<int64_t> results;
 
@@ -364,13 +368,54 @@
   return results;
 }
 
-const OfflinePageItem* OfflinePageModel::GetPageByOfflineId(
+void OfflinePageModel::GetPageByOfflineId(
+    int64_t offline_id,
+    const SingleOfflinePageItemCallback& callback) {
+  RunWhenLoaded(base::Bind(&OfflinePageModel::GetPageByOfflineIdWhenLoadDone,
+                           weak_ptr_factory_.GetWeakPtr(), offline_id,
+                           callback));
+}
+
+void OfflinePageModel::GetPageByOfflineIdWhenLoadDone(
+    int64_t offline_id,
+    const SingleOfflinePageItemCallback& callback) const {
+  SingleOfflinePageItemResult result;
+  const OfflinePageItem* match = MaybeGetPageByOfflineId(offline_id);
+  if (match != nullptr)
+    result = *match;
+  callback.Run(result);
+}
+
+const OfflinePageItem* OfflinePageModel::MaybeGetPageByOfflineId(
     int64_t offline_id) const {
   const auto iter = offline_pages_.find(offline_id);
   return iter != offline_pages_.end() ? &(iter->second) : nullptr;
 }
 
-const OfflinePageItem* OfflinePageModel::GetPageByOfflineURL(
+void OfflinePageModel::GetPageByOfflineURL(
+    const GURL& offline_url,
+    const SingleOfflinePageItemCallback& callback) {
+  RunWhenLoaded(base::Bind(&OfflinePageModel::GetPageByOfflineURLWhenLoadDone,
+                           weak_ptr_factory_.GetWeakPtr(), offline_url,
+                           callback));
+}
+
+void OfflinePageModel::GetPageByOfflineURLWhenLoadDone(
+    const GURL& offline_url,
+    const SingleOfflinePageItemCallback& callback) const {
+  base::Optional<OfflinePageItem> result;
+
+  for (const auto& id_page_pair : offline_pages_) {
+    if (id_page_pair.second.GetOfflineURL() == offline_url) {
+      callback.Run(base::make_optional(id_page_pair.second));
+      return;
+    }
+  }
+
+  callback.Run(base::nullopt);
+}
+
+const OfflinePageItem* OfflinePageModel::MaybeGetPageByOfflineURL(
     const GURL& offline_url) const {
   for (const auto& id_page_pair : offline_pages_) {
     if (id_page_pair.second.GetOfflineURL() == offline_url)
@@ -379,7 +424,28 @@
   return nullptr;
 }
 
-const OfflinePageItem* OfflinePageModel::GetPageByOnlineURL(
+void OfflinePageModel::GetPagesByOnlineURL(
+    const GURL& online_url,
+    const MultipleOfflinePageItemCallback& callback) {
+  RunWhenLoaded(base::Bind(&OfflinePageModel::GetPagesByOnlineURLWhenLoadDone,
+                           weak_ptr_factory_.GetWeakPtr(), online_url,
+                           callback));
+}
+
+void OfflinePageModel::GetPagesByOnlineURLWhenLoadDone(
+    const GURL& online_url,
+    const MultipleOfflinePageItemCallback& callback) const {
+  std::vector<OfflinePageItem> result;
+
+  for (const auto& id_page_pair : offline_pages_) {
+    if (id_page_pair.second.url == online_url)
+      result.push_back(id_page_pair.second);
+  }
+
+  callback.Run(result);
+}
+
+const OfflinePageItem* OfflinePageModel::MaybeGetPageByOnlineURL(
     const GURL& online_url) const {
   for (const auto& id_page_pair : offline_pages_) {
     if (id_page_pair.second.url == online_url)
diff --git a/components/offline_pages/offline_page_model.h b/components/offline_pages/offline_page_model.h
index 35084369..f7a7c15 100644
--- a/components/offline_pages/offline_page_model.h
+++ b/components/offline_pages/offline_page_model.h
@@ -20,6 +20,7 @@
 #include "base/memory/scoped_vector.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
+#include "base/optional.h"
 #include "base/supports_user_data.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/offline_pages/offline_page_archiver.h"
@@ -123,15 +124,22 @@
     virtual ~Observer() {}
   };
 
-  typedef std::vector<OfflinePageItem> GetAllPagesResult;
   typedef std::set<GURL> CheckPagesExistOfflineResult;
+  typedef std::vector<int64_t> MultipleOfflineIdResult;
+  typedef base::Optional<OfflinePageItem> SingleOfflinePageItemResult;
+  typedef std::vector<OfflinePageItem> MultipleOfflinePageItemResult;
 
   typedef base::Callback<void(SavePageResult, int64_t)> SavePageCallback;
   typedef base::Callback<void(DeletePageResult)> DeletePageCallback;
-  typedef base::Callback<void(const GetAllPagesResult&)> GetAllPagesCallback;
   typedef base::Callback<void(const CheckPagesExistOfflineResult&)>
       CheckPagesExistOfflineCallback;
   typedef base::Callback<void(bool)> HasPagesCallback;
+  typedef base::Callback<void(const MultipleOfflineIdResult&)>
+      MultipleOfflineIdCallback;
+  typedef base::Callback<void(const SingleOfflinePageItemResult&)>
+      SingleOfflinePageItemCallback;
+  typedef base::Callback<void(const MultipleOfflinePageItemResult&)>
+      MultipleOfflinePageItemCallback;
 
   // Generates a new offline id
   static int64_t GenerateOfflineId();
@@ -189,31 +197,48 @@
                               const CheckPagesExistOfflineCallback& callback);
 
   // Gets all available offline pages. Requires that the model is loaded.
-  void GetAllPages(const GetAllPagesCallback& callback);
+  void GetAllPages(const MultipleOfflinePageItemCallback& callback);
 
-  // Gets pages that should be removed to clean up storage. Requires that the
-  // model is loaded.
-  // TODO(fgorski): This needs an update as part of expiration policy work.
-  const std::vector<OfflinePageItem> GetPagesToCleanUp() const;
+  // Gets all offline ids where the offline page has the matching client id.
+  void GetOfflineIdsForClientId(const ClientId& client_id,
+                                const MultipleOfflineIdCallback& callback);
 
-  // Gets all offline ids where the offline page has the matching client id
-  // If |include_deleted| is true, include pages that are marked for deletion
-  // but not actually deleted yet.  Default is false.
-  const std::vector<int64_t> GetOfflineIdsForClientId(
-      const ClientId& client_id,
-      bool include_deleted = false) const;
+  // Gets all offline ids where the offline page has the matching client id.
+  // Requires that the model is loaded.  May not return matching IDs depending
+  // on the internal state of the model.
+  //
+  // This function is deprecated.  Use |GetOfflineIdsForClientId| instead.
+  const std::vector<int64_t> MaybeGetOfflineIdsForClientId(
+      const ClientId& client_id) const;
+
+  // Returns zero or one offline pages associated with a specified |offline_id|.
+  void GetPageByOfflineId(int64_t offline_id,
+                          const SingleOfflinePageItemCallback& callback);
 
   // Returns an offline page associated with a specified |offline_id|. nullptr
   // is returned if not found.
-  const OfflinePageItem* GetPageByOfflineId(int64_t offline_id) const;
+  const OfflinePageItem* MaybeGetPageByOfflineId(int64_t offline_id) const;
+
+  // Returns the offline page that is stored under |offline_url|, if any.
+  void GetPageByOfflineURL(const GURL& offline_url,
+                           const SingleOfflinePageItemCallback& callback);
 
   // Returns an offline page that is stored as |offline_url|. A nullptr is
   // returned if not found.
-  const OfflinePageItem* GetPageByOfflineURL(const GURL& offline_url) const;
+  //
+  // This function is deprecated, and may return |nullptr| even if a page
+  // exists, depending on the implementation details of OfflinePageModel.
+  // Use |GetPageByOfflineURL| instead.
+  const OfflinePageItem* MaybeGetPageByOfflineURL(
+      const GURL& offline_url) const;
+
+  // Returns the offline pages that are stored under |offline_url|.
+  void GetPagesByOnlineURL(const GURL& offline_url,
+                           const MultipleOfflinePageItemCallback& callback);
 
   // Returns an offline page saved for |online_url|. A nullptr is returned if
   // not found.
-  const OfflinePageItem* GetPageByOnlineURL(const GURL& online_url) const;
+  const OfflinePageItem* MaybeGetPageByOnlineURL(const GURL& online_url) const;
 
   // Checks that all of the offline pages have corresponding offline copies.
   // If a page is discovered to be missing an offline copy, its offline page
@@ -245,10 +270,23 @@
   // Callback for ensuring archive directory is created.
   void OnEnsureArchivesDirCreatedDone();
 
-  void GetAllPagesAfterLoadDone(const GetAllPagesCallback& callback);
+  void GetAllPagesAfterLoadDone(
+      const MultipleOfflinePageItemCallback& callback);
   void CheckPagesExistOfflineAfterLoadDone(
       const std::set<GURL>& urls,
       const CheckPagesExistOfflineCallback& callback);
+  void GetOfflineIdsForClientIdWhenLoadDone(
+      const ClientId& client_id,
+      const MultipleOfflineIdCallback& callback) const;
+  void GetPageByOfflineIdWhenLoadDone(
+      int64_t offline_id,
+      const SingleOfflinePageItemCallback& callback) const;
+  void GetPagesByOnlineURLWhenLoadDone(
+      const GURL& offline_url,
+      const MultipleOfflinePageItemCallback& callback) const;
+  void GetPageByOfflineURLWhenLoadDone(
+      const GURL& offline_url,
+      const SingleOfflinePageItemCallback& callback) const;
 
   // Callback for checking whether we have offline pages.
   void HasPagesAfterLoadDone(const std::string& name_space,
diff --git a/components/offline_pages/offline_page_model_unittest.cc b/components/offline_pages/offline_page_model_unittest.cc
index d6a8435..ef5ad7f9 100644
--- a/components/offline_pages/offline_page_model_unittest.cc
+++ b/components/offline_pages/offline_page_model_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/feature_list.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
+#include "base/optional.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
@@ -29,9 +30,14 @@
 
 using SavePageResult = offline_pages::OfflinePageModel::SavePageResult;
 using DeletePageResult = offline_pages::OfflinePageModel::DeletePageResult;
-using GetAllPagesResult = offline_pages::OfflinePageModel::GetAllPagesResult;
+using SingleOfflinePageItemResult =
+    offline_pages::OfflinePageModel::SingleOfflinePageItemResult;
+using MultipleOfflinePageItemResult =
+    offline_pages::OfflinePageModel::MultipleOfflinePageItemResult;
 using CheckPagesExistOfflineResult =
     offline_pages::OfflinePageModel::CheckPagesExistOfflineResult;
+using MultipleOfflineIdResult =
+    offline_pages::OfflinePageModel::MultipleOfflineIdResult;
 
 namespace offline_pages {
 
@@ -75,12 +81,19 @@
   void SetLastPathCreatedByArchiver(const base::FilePath& file_path) override;
 
   // OfflinePageModel callbacks.
-  void OnGetAllPagesDone(const GetAllPagesResult& result);
   void OnSavePageDone(SavePageResult result, int64_t offline_id);
   void OnDeletePageDone(DeletePageResult result);
   void OnHasPagesDone(bool result);
   void OnCheckPagesExistOfflineDone(const CheckPagesExistOfflineResult& result);
   void OnClearAllDone();
+  void OnGetOfflineIdsForClientIdDone(MultipleOfflineIdResult* storage,
+                                      const MultipleOfflineIdResult& result);
+  void OnGetSingleOfflinePageItemResult(
+      SingleOfflinePageItemResult* storage,
+      const SingleOfflinePageItemResult& result);
+  void OnGetMultipleOfflinePageItemsResult(
+      MultipleOfflinePageItemResult* storage,
+      const MultipleOfflinePageItemResult& result);
 
   // OfflinePageMetadataStore callbacks.
   void OnStoreUpdateDone(bool /* success */);
@@ -104,8 +117,10 @@
 
   OfflinePageTestStore* GetStore();
 
-  const GetAllPagesResult& GetAllPages();
+  MultipleOfflinePageItemResult GetAllPages();
+
   void SavePage(const GURL& url, ClientId client_id);
+
   void SavePageWithArchiverResult(const GURL& url,
                                   ClientId client_id,
                                   OfflinePageArchiver::ArchiverResult result);
@@ -118,8 +133,17 @@
   }
 
   bool HasPages(std::string name_space);
+
   CheckPagesExistOfflineResult CheckPagesExistOffline(std::set<GURL>);
 
+  MultipleOfflineIdResult GetOfflineIdsForClientId(const ClientId& client_id);
+
+  SingleOfflinePageItemResult GetPageByOfflineId(int64_t offline_id);
+
+  base::Optional<OfflinePageItem> GetPagesByOnlineURL(const GURL& offline_url);
+
+  SingleOfflinePageItemResult GetPageByOfflineURL(const GURL& offline_url);
+
   OfflinePageModel* model() { return model_.get(); }
 
   int64_t last_save_offline_id() const { return last_save_offline_id_; }
@@ -144,7 +168,6 @@
   base::ScopedTempDir temp_dir_;
 
   std::unique_ptr<OfflinePageModel> model_;
-  GetAllPagesResult all_pages_;
   SavePageResult last_save_result_;
   int64_t last_save_offline_id_;
   DeletePageResult last_delete_result_;
@@ -205,11 +228,6 @@
   last_save_offline_id_ = offline_id;
 }
 
-void OfflinePageModelTest::OnGetAllPagesDone(
-    const OfflinePageModel::GetAllPagesResult& result) {
-  all_pages_ = result;
-}
-
 void OfflinePageModelTest::OnDeletePageDone(DeletePageResult result) {
   last_delete_result_ = result;
 }
@@ -294,11 +312,13 @@
   PumpLoop();
 }
 
-const std::vector<OfflinePageItem>& OfflinePageModelTest::GetAllPages() {
+MultipleOfflinePageItemResult OfflinePageModelTest::GetAllPages() {
+  MultipleOfflinePageItemResult result;
   model()->GetAllPages(
-      base::Bind(&OfflinePageModelTest::OnGetAllPagesDone, AsWeakPtr()));
+      base::Bind(&OfflinePageModelTest::OnGetMultipleOfflinePageItemsResult,
+                 AsWeakPtr(), base::Unretained(&result)));
   PumpLoop();
-  return all_pages_;
+  return result;
 }
 
 CheckPagesExistOfflineResult OfflinePageModelTest::CheckPagesExistOffline(
@@ -310,6 +330,70 @@
   return last_pages_exist_result_;
 }
 
+MultipleOfflineIdResult OfflinePageModelTest::GetOfflineIdsForClientId(
+    const ClientId& client_id) {
+  MultipleOfflineIdResult result;
+  model()->GetOfflineIdsForClientId(
+      client_id,
+      base::Bind(&OfflinePageModelTest::OnGetOfflineIdsForClientIdDone,
+                 AsWeakPtr(), base::Unretained(&result)));
+  PumpLoop();
+  return result;
+}
+
+void OfflinePageModelTest::OnGetOfflineIdsForClientIdDone(
+    MultipleOfflineIdResult* storage,
+    const MultipleOfflineIdResult& result) {
+  *storage = result;
+}
+
+SingleOfflinePageItemResult OfflinePageModelTest::GetPageByOfflineId(
+    int64_t offline_id) {
+  SingleOfflinePageItemResult result;
+  model()->GetPageByOfflineId(
+      offline_id,
+      base::Bind(&OfflinePageModelTest::OnGetSingleOfflinePageItemResult,
+                 AsWeakPtr(), base::Unretained(&result)));
+  PumpLoop();
+  return result;
+}
+
+SingleOfflinePageItemResult OfflinePageModelTest::GetPageByOfflineURL(
+    const GURL& offline_url) {
+  SingleOfflinePageItemResult result;
+  model()->GetPageByOfflineURL(
+      offline_url,
+      base::Bind(&OfflinePageModelTest::OnGetSingleOfflinePageItemResult,
+                 AsWeakPtr(), base::Unretained(&result)));
+  PumpLoop();
+  return result;
+}
+
+void OfflinePageModelTest::OnGetSingleOfflinePageItemResult(
+    SingleOfflinePageItemResult* storage,
+    const SingleOfflinePageItemResult& result) {
+  *storage = result;
+}
+
+void OfflinePageModelTest::OnGetMultipleOfflinePageItemsResult(
+    MultipleOfflinePageItemResult* storage,
+    const MultipleOfflinePageItemResult& result) {
+  *storage = result;
+}
+
+base::Optional<OfflinePageItem> OfflinePageModelTest::GetPagesByOnlineURL(
+    const GURL& online_url) {
+  MultipleOfflinePageItemResult result;
+  model()->GetPagesByOnlineURL(
+      online_url,
+      base::Bind(&OfflinePageModelTest::OnGetMultipleOfflinePageItemsResult,
+                 AsWeakPtr(), base::Unretained(&result)));
+  PumpLoop();
+  if (result.size() > 0)
+    return base::make_optional(result[0]);
+  return base::nullopt;
+}
+
 bool OfflinePageModelTest::HasPages(std::string name_space) {
   model()->HasPages(
       name_space,
@@ -628,7 +712,7 @@
 
   ResetResults();
 
-  const OfflinePageItem* page = model()->GetPageByOfflineId(offline_id);
+  base::Optional<OfflinePageItem> page = GetPageByOfflineId(offline_id);
 
   // Delete the offline copy of the page and check the metadata.
   base::DeleteFile(page->file_path, false);
@@ -647,7 +731,7 @@
 
   ResetResults();
 
-  const OfflinePageItem* page = model()->GetPageByOfflineId(offline_id);
+  base::Optional<OfflinePageItem> page = GetPageByOfflineId(offline_id);
   // Delete the offline copy of the page and check the metadata.
   base::DeleteFile(page->file_path, false);
   // Reseting the model should trigger the metadata consistency check as well.
@@ -708,20 +792,23 @@
   SavePage(kTestUrl2, kTestClientId2);
   int64_t offline2 = last_save_offline_id();
 
-  const OfflinePageItem* page = model()->GetPageByOfflineId(offline1);
-  ASSERT_TRUE(page);
+  base::Optional<OfflinePageItem> page = GetPageByOfflineId(offline1);
+  bool page_exists = page != base::nullopt;
+  EXPECT_TRUE(page_exists);
   EXPECT_EQ(kTestUrl, page->url);
   EXPECT_EQ(kTestClientId1, page->client_id);
   EXPECT_EQ(kTestFileSize, page->file_size);
 
-  page = model()->GetPageByOfflineId(offline2);
-  ASSERT_TRUE(page);
+  page = GetPageByOfflineId(offline2);
+  page_exists = page != base::nullopt;
+  EXPECT_TRUE(page_exists);
   EXPECT_EQ(kTestUrl2, page->url);
   EXPECT_EQ(kTestClientId2, page->client_id);
   EXPECT_EQ(kTestFileSize, page->file_size);
 
-  page = model()->GetPageByOfflineId(-42);
-  EXPECT_FALSE(page);
+  page = GetPageByOfflineId(-42);
+  page_exists = page != base::nullopt;
+  EXPECT_FALSE(page_exists);
 }
 
 TEST_F(OfflinePageModelTest, GetPageByOfflineURL) {
@@ -736,38 +823,36 @@
   GURL offline_url2 = store->last_saved_page().GetOfflineURL();
   int64_t offline2 = last_save_offline_id();
 
-  const OfflinePageItem* page = model()->GetPageByOfflineURL(offline_url2);
-  EXPECT_TRUE(page);
+  SingleOfflinePageItemResult page = GetPageByOfflineURL(offline_url2);
+  EXPECT_TRUE(page != base::nullopt);
   EXPECT_EQ(kTestUrl2, page->url);
   EXPECT_EQ(kTestClientId2, page->client_id);
   EXPECT_EQ(offline2, page->offline_id);
 
-  page = model()->GetPageByOfflineURL(offline_url);
-  EXPECT_TRUE(page);
+  page = GetPageByOfflineURL(offline_url);
+  EXPECT_TRUE(page != base::nullopt);
   EXPECT_EQ(kTestUrl, page->url);
   EXPECT_EQ(kTestClientId1, page->client_id);
   EXPECT_EQ(offline1, page->offline_id);
 
-  page = model()->GetPageByOfflineURL(GURL("http://foo"));
-  EXPECT_FALSE(page);
+  page = GetPageByOfflineURL(GURL("http://foo"));
+  EXPECT_TRUE(page == base::nullopt);
 }
 
-TEST_F(OfflinePageModelTest, GetPageByOnlineURL) {
+TEST_F(OfflinePageModelTest, GetPagesByOnlineURL) {
   SavePage(kTestUrl, kTestClientId1);
   SavePage(kTestUrl2, kTestClientId2);
 
-  const OfflinePageItem* page = model()->GetPageByOnlineURL(kTestUrl2);
-  EXPECT_TRUE(page);
+  base::Optional<OfflinePageItem> page = GetPagesByOnlineURL(kTestUrl2);
   EXPECT_EQ(kTestUrl2, page->url);
   EXPECT_EQ(kTestClientId2, page->client_id);
 
-  page = model()->GetPageByOnlineURL(kTestUrl);
-  EXPECT_TRUE(page);
+  page = GetPagesByOnlineURL(kTestUrl);
   EXPECT_EQ(kTestUrl, page->url);
   EXPECT_EQ(kTestClientId1, page->client_id);
 
-  page = model()->GetPageByOnlineURL(GURL("http://foo"));
-  EXPECT_FALSE(page);
+  page = GetPagesByOnlineURL(GURL("http://foo"));
+  EXPECT_TRUE(base::nullopt == page);
 }
 
 TEST_F(OfflinePageModelTest, CheckPagesExistOffline) {
@@ -786,47 +871,6 @@
   EXPECT_EQ(existing_pages.end(), existing_pages.find(kTestUrl3));
 }
 
-// Test that model returns pages that are older than 30 days as candidates for
-// clean up, hence the numbers in time delta.
-TEST_F(OfflinePageModelTest, GetPagesToCleanUp) {
-  base::Time now = base::Time::Now();
-
-  SavePage(kTestUrl, kTestClientId1);
-  GetStore()->UpdateLastAccessTime(last_save_offline_id(),
-                                   now - base::TimeDelta::FromDays(40));
-
-  SavePage(kTestUrl2, kTestClientId2);
-  GetStore()->UpdateLastAccessTime(last_save_offline_id(),
-                                   now - base::TimeDelta::FromDays(31));
-
-  SavePage(kTestUrl3, kTestClientId3);
-  GetStore()->UpdateLastAccessTime(last_save_offline_id(),
-                                   now - base::TimeDelta::FromDays(29));
-
-  ResetModel();
-
-  // Only page_1 and page_2 are expected to be picked up by the model as page_3
-  // has not been in the store long enough.
-  std::vector<OfflinePageItem> pages_to_clean_up = model()->GetPagesToCleanUp();
-  // Offline IDs are random, so the order of the pages is also random
-  // So load in the right page for the validation below.
-  const OfflinePageItem* page1;
-  const OfflinePageItem* page2;
-  if (pages_to_clean_up[0].client_id == kTestClientId1) {
-    page1 = &pages_to_clean_up[0];
-    page2 = &pages_to_clean_up[1];
-  } else {
-    page1 = &pages_to_clean_up[1];
-    page2 = &pages_to_clean_up[0];
-  }
-
-  EXPECT_EQ(2UL, pages_to_clean_up.size());
-  EXPECT_EQ(kTestUrl, page1->url);
-  EXPECT_EQ(kTestClientId1, page1->client_id);
-  EXPECT_EQ(kTestUrl2, page2->url);
-  EXPECT_EQ(kTestClientId2, page2->client_id);
-}
-
 TEST_F(OfflinePageModelTest, CanSavePage) {
   EXPECT_TRUE(OfflinePageModel::CanSavePage(GURL("http://foo")));
   EXPECT_TRUE(OfflinePageModel::CanSavePage(GURL("https://foo")));
@@ -872,8 +916,7 @@
 
   EXPECT_NE(offline1, offline2);
 
-  const std::vector<int64_t> ids =
-      model()->GetOfflineIdsForClientId(kTestClientId1);
+  const std::vector<int64_t> ids = GetOfflineIdsForClientId(kTestClientId1);
 
   EXPECT_EQ(2UL, ids.size());
 
diff --git a/components/omnibox/browser/autocomplete_input_unittest.cc b/components/omnibox/browser/autocomplete_input_unittest.cc
index cb8eba12..c973661 100644
--- a/components/omnibox/browser/autocomplete_input_unittest.cc
+++ b/components/omnibox/browser/autocomplete_input_unittest.cc
@@ -45,7 +45,7 @@
     { ASCIIToUTF16("foo/bar/"), metrics::OmniboxInputType::URL },
     { ASCIIToUTF16("foo/bar baz\\"), metrics::OmniboxInputType::URL },
     { ASCIIToUTF16("foo.com/bar"), metrics::OmniboxInputType::URL },
-    { ASCIIToUTF16("foo;bar"), metrics::OmniboxInputType::UNKNOWN },
+    { ASCIIToUTF16("foo;bar"), metrics::OmniboxInputType::QUERY },
     { ASCIIToUTF16("foo/bar baz"), metrics::OmniboxInputType::UNKNOWN },
     { ASCIIToUTF16("foo bar.com"), metrics::OmniboxInputType::QUERY },
     { ASCIIToUTF16("foo bar"), metrics::OmniboxInputType::QUERY },
diff --git a/components/os_crypt.gypi b/components/os_crypt.gypi
index 88ba67c7..38f94c9 100644
--- a/components/os_crypt.gypi
+++ b/components/os_crypt.gypi
@@ -61,6 +61,9 @@
           'include_dirs' : [
             '../third_party/libsecret/'
           ],
+          'dependencies': [
+            '../build/linux/system.gyp:glib',
+          ],
         }],
       ],
       'target_conditions': [
diff --git a/components/os_crypt/BUILD.gn b/components/os_crypt/BUILD.gn
index 33bab6e..6e37c63c 100644
--- a/components/os_crypt/BUILD.gn
+++ b/components/os_crypt/BUILD.gn
@@ -46,6 +46,7 @@
       "libsecret_util_posix.cc",
       "libsecret_util_posix.h",
     ]
+    configs += [ "//build/config/linux:glib" ]
     deps += [ "//third_party/libsecret" ]
     defines = [ "USE_LIBSECRET" ]
   }
diff --git a/components/ownership.gypi b/components/ownership.gypi
index 9415ade..1c369d36 100644
--- a/components/ownership.gypi
+++ b/components/ownership.gypi
@@ -39,7 +39,7 @@
           }],
           ['use_nss_certs==1', {
             'dependencies': [
-              '../build/linux/system.gyp:ssl',
+              '../build/linux/system.gyp:nss',
             ],
           }],
         ],
diff --git a/components/password_manager/content/browser/credential_manager_impl.cc b/components/password_manager/content/browser/credential_manager_impl.cc
index 0d5fa0d..c69d46a 100644
--- a/components/password_manager/content/browser/credential_manager_impl.cc
+++ b/components/password_manager/content/browser/credential_manager_impl.cc
@@ -61,13 +61,14 @@
   if (!client_->IsSavingAndFillingEnabledForCurrentPage())
     return;
 
+  GURL origin = web_contents()->GetLastCommittedURL().GetOrigin();
   std::unique_ptr<autofill::PasswordForm> form(
-      CreatePasswordFormFromCredentialInfo(
-          info, web_contents()->GetLastCommittedURL().GetOrigin()));
+      CreatePasswordFormFromCredentialInfo(info, origin));
   form->skip_zero_click = !IsZeroClickAllowed();
 
   form_manager_.reset(new CredentialManagerPasswordFormManager(
-      client_, GetDriver(), *form, this));
+      client_, GetDriver(), *CreateObservedPasswordFormFromOrigin(origin),
+      std::move(form), this));
 }
 
 void CredentialManagerImpl::OnProvisionalSaveComplete() {
diff --git a/components/password_manager/content/browser/credential_manager_impl_unittest.cc b/components/password_manager/content/browser/credential_manager_impl_unittest.cc
index 66c30d3..cfd3728 100644
--- a/components/password_manager/content/browser/credential_manager_impl_unittest.cc
+++ b/components/password_manager/content/browser/credential_manager_impl_unittest.cc
@@ -1160,4 +1160,105 @@
   EXPECT_TRUE(synthesized.ssl_valid);
 }
 
+TEST_F(CredentialManagerImplTest, BlacklistPasswordCredential) {
+  EXPECT_CALL(*client_, PromptUserToSavePasswordPtr(
+                            _, CredentialSourceType::CREDENTIAL_SOURCE_API));
+
+  CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_PASSWORD);
+  bool called = false;
+  CallStore(info, base::Bind(&RespondCallback, &called));
+  // Allow the PasswordFormManager to talk to the password store
+  RunAllPendingTasks();
+
+  ASSERT_TRUE(client_->pending_manager());
+  client_->pending_manager()->PermanentlyBlacklist();
+  // Allow the PasswordFormManager to talk to the password store.
+  RunAllPendingTasks();
+
+  // Verify that the site is blacklisted.
+  autofill::PasswordForm blacklisted;
+  TestPasswordStore::PasswordMap passwords = store_->stored_passwords();
+  blacklisted.blacklisted_by_user = true;
+  blacklisted.origin = form_.origin;
+  blacklisted.signon_realm = form_.signon_realm;
+  blacklisted.type = autofill::PasswordForm::TYPE_API;
+  blacklisted.ssl_valid = true;
+  blacklisted.date_created = passwords[form_.signon_realm][0].date_created;
+  EXPECT_THAT(passwords[form_.signon_realm], testing::ElementsAre(blacklisted));
+}
+
+TEST_F(CredentialManagerImplTest, BlacklistFederatedCredential) {
+  form_.federation_origin = url::Origin(GURL("https://example.com/"));
+  form_.signon_realm = "federation://example.com/example.com";
+
+  EXPECT_CALL(*client_, PromptUserToSavePasswordPtr(
+                            _, CredentialSourceType::CREDENTIAL_SOURCE_API));
+  CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_FEDERATED);
+  bool called = false;
+  CallStore(info, base::Bind(&RespondCallback, &called));
+  // Allow the PasswordFormManager to talk to the password store
+  RunAllPendingTasks();
+
+  ASSERT_TRUE(client_->pending_manager());
+  client_->pending_manager()->PermanentlyBlacklist();
+  // Allow the PasswordFormManager to talk to the password store.
+  RunAllPendingTasks();
+
+  // Verify that the site is blacklisted.
+  TestPasswordStore::PasswordMap passwords = store_->stored_passwords();
+  ASSERT_TRUE(passwords.count(form_.origin.spec()));
+  autofill::PasswordForm blacklisted;
+  blacklisted.blacklisted_by_user = true;
+  blacklisted.origin = form_.origin;
+  blacklisted.signon_realm = blacklisted.origin.spec();
+  blacklisted.type = autofill::PasswordForm::TYPE_API;
+  blacklisted.ssl_valid = true;
+  blacklisted.date_created =
+      passwords[blacklisted.signon_realm][0].date_created;
+  EXPECT_THAT(passwords[blacklisted.signon_realm],
+              testing::ElementsAre(blacklisted));
+}
+
+TEST_F(CredentialManagerImplTest, RespectBlacklistingPasswordCredential) {
+  autofill::PasswordForm blacklisted;
+  blacklisted.blacklisted_by_user = true;
+  blacklisted.origin = form_.origin;
+  blacklisted.signon_realm = blacklisted.origin.spec();
+  blacklisted.ssl_valid = true;
+  store_->AddLogin(blacklisted);
+
+  CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_PASSWORD);
+  bool called = false;
+  EXPECT_CALL(*client_, PromptUserToSavePasswordPtr(
+                            _, CredentialSourceType::CREDENTIAL_SOURCE_API));
+  CallStore(info, base::Bind(&RespondCallback, &called));
+  // Allow the PasswordFormManager to talk to the password store
+  RunAllPendingTasks();
+
+  ASSERT_TRUE(client_->pending_manager());
+  EXPECT_TRUE(client_->pending_manager()->IsBlacklisted());
+}
+
+TEST_F(CredentialManagerImplTest, RespectBlacklistingFederatedCredential) {
+  autofill::PasswordForm blacklisted;
+  blacklisted.blacklisted_by_user = true;
+  blacklisted.origin = form_.origin;
+  blacklisted.signon_realm = blacklisted.origin.spec();
+  blacklisted.ssl_valid = true;
+  store_->AddLogin(blacklisted);
+
+  form_.federation_origin = url::Origin(GURL("https://example.com/"));
+  form_.signon_realm = "federation://example.com/example.com";
+  CredentialInfo info(form_, CredentialType::CREDENTIAL_TYPE_FEDERATED);
+  bool called = false;
+  EXPECT_CALL(*client_, PromptUserToSavePasswordPtr(
+                            _, CredentialSourceType::CREDENTIAL_SOURCE_API));
+  CallStore(info, base::Bind(&RespondCallback, &called));
+  // Allow the PasswordFormManager to talk to the password store
+  RunAllPendingTasks();
+
+  ASSERT_TRUE(client_->pending_manager());
+  EXPECT_TRUE(client_->pending_manager()->IsBlacklisted());
+}
+
 }  // namespace password_manager
diff --git a/components/password_manager/content/public/cpp/BUILD.gn b/components/password_manager/content/public/cpp/BUILD.gn
index 3b22d006..a4c0353 100644
--- a/components/password_manager/content/public/cpp/BUILD.gn
+++ b/components/password_manager/content/public/cpp/BUILD.gn
@@ -18,6 +18,6 @@
     "//mojo/common:common_base",
     "//mojo/common:url_type_converters",
     "//mojo/public/cpp/bindings",
-    "//third_party/WebKit/public:blink_headers",
+    "//third_party/WebKit/public:blink",
   ]
 }
diff --git a/components/password_manager/core/browser/credential_manager_password_form_manager.cc b/components/password_manager/core/browser/credential_manager_password_form_manager.cc
index c1230f7..559c2109 100644
--- a/components/password_manager/core/browser/credential_manager_password_form_manager.cc
+++ b/components/password_manager/core/browser/credential_manager_password_form_manager.cc
@@ -19,13 +19,16 @@
     PasswordManagerClient* client,
     base::WeakPtr<PasswordManagerDriver> driver,
     const PasswordForm& observed_form,
+    std::unique_ptr<autofill::PasswordForm> saved_form,
     CredentialManagerPasswordFormManagerDelegate* delegate)
     : PasswordFormManager(driver->GetPasswordManager(),
                           client,
                           driver,
                           observed_form,
                           true),
-      delegate_(delegate) {
+      delegate_(delegate),
+      saved_form_(std::move(saved_form)) {
+  DCHECK(saved_form_);
   FetchDataFromPasswordStore();
 }
 
@@ -38,9 +41,8 @@
 
   // Mark the form as "preferred", as we've been told by the API that this is
   // indeed the credential set that the user used to sign into the site.
-  PasswordForm provisionally_saved_form(observed_form());
-  provisionally_saved_form.preferred = true;
-  ProvisionallySave(provisionally_saved_form, IGNORE_OTHER_POSSIBLE_USERNAMES);
+  saved_form_->preferred = true;
+  ProvisionallySave(*saved_form_, IGNORE_OTHER_POSSIBLE_USERNAMES);
   delegate_->OnProvisionalSaveComplete();
 }
 
diff --git a/components/password_manager/core/browser/credential_manager_password_form_manager.h b/components/password_manager/core/browser/credential_manager_password_form_manager.h
index db7b419f..7e979ef 100644
--- a/components/password_manager/core/browser/credential_manager_password_form_manager.h
+++ b/components/password_manager/core/browser/credential_manager_password_form_manager.h
@@ -33,14 +33,15 @@
  public:
   // Given a |client| and an |observed_form|, kick off the process of fetching
   // matching logins from the password store; if |observed_form| doesn't map to
-  // a blacklisted origin, provisionally save it. Once saved, let the delegate
-  // know that it's safe to poke at the UI.
+  // a blacklisted origin, provisionally save |saved_form|. Once saved, let the
+  // delegate know that it's safe to poke at the UI.
   //
   // This class does not take ownership of |delegate|.
   CredentialManagerPasswordFormManager(
       PasswordManagerClient* client,
       base::WeakPtr<PasswordManagerDriver> driver,
       const autofill::PasswordForm& observed_form,
+      std::unique_ptr<autofill::PasswordForm> saved_form,
       CredentialManagerPasswordFormManagerDelegate* delegate);
   ~CredentialManagerPasswordFormManager() override;
 
@@ -49,6 +50,7 @@
 
  private:
   CredentialManagerPasswordFormManagerDelegate* delegate_;
+  std::unique_ptr<autofill::PasswordForm> saved_form_;
 
   DISALLOW_COPY_AND_ASSIGN(CredentialManagerPasswordFormManager);
 };
diff --git a/components/password_manager/core/browser/password_form_manager.cc b/components/password_manager/core/browser/password_form_manager.cc
index a702e61..4490457 100644
--- a/components/password_manager/core/browser/password_form_manager.cc
+++ b/components/password_manager/core/browser/password_form_manager.cc
@@ -251,12 +251,9 @@
   DCHECK(!client_->IsOffTheRecord());
 
   // Configure the form about to be saved for blacklist status.
-  blacklisted_matches_.push_back(
-      new autofill::PasswordForm(pending_credentials_));
+  blacklisted_matches_.push_back(new autofill::PasswordForm(observed_form_));
   blacklisted_matches_.back()->preferred = false;
   blacklisted_matches_.back()->blacklisted_by_user = true;
-  blacklisted_matches_.back()->username_value.clear();
-  blacklisted_matches_.back()->password_value.clear();
   blacklisted_matches_.back()->other_possible_usernames.clear();
   blacklisted_matches_.back()->date_created = Time::Now();
 
@@ -1147,12 +1144,15 @@
   pending_credentials_.preferred = provisionally_saved_form_->preferred;
 
   // If we're dealing with an API-driven provisionally saved form, then take
-  // its 'skip_zero_click' value. We don't do this for non-API forms, as
-  // those will never have 'skip_zero_click' set, and we would otherwise
-  // overwrite a user's auto-sign-in preference when they used autofill.
+  // the server provided values. We don't do this for non-API forms, as
+  // those will never have those members set.
   if (provisionally_saved_form_->type == autofill::PasswordForm::TYPE_API) {
     pending_credentials_.skip_zero_click =
         provisionally_saved_form_->skip_zero_click;
+    pending_credentials_.display_name = provisionally_saved_form_->display_name;
+    pending_credentials_.federation_origin =
+        provisionally_saved_form_->federation_origin;
+    pending_credentials_.icon_url = provisionally_saved_form_->icon_url;
   }
 
   if (user_action_ == kUserActionOverridePassword &&
diff --git a/components/password_manager/core/browser/test_password_store.cc b/components/password_manager/core/browser/test_password_store.cc
index afcd8c2..3eba949 100644
--- a/components/password_manager/core/browser/test_password_store.cc
+++ b/components/password_manager/core/browser/test_password_store.cc
@@ -8,6 +8,7 @@
 
 #include "base/thread_task_runner_handle.h"
 #include "components/autofill/core/common/password_form.h"
+#include "components/password_manager/core/browser/psl_matching_helper.h"
 #include "components/password_manager/core/browser/statistics_table.h"
 
 namespace password_manager {
@@ -83,10 +84,13 @@
 ScopedVector<autofill::PasswordForm> TestPasswordStore::FillMatchingLogins(
     const autofill::PasswordForm& form) {
   ScopedVector<autofill::PasswordForm> matched_forms;
-  std::vector<autofill::PasswordForm> forms =
-      stored_passwords_[form.signon_realm];
-  for (const auto& stored_form : forms) {
-    matched_forms.push_back(new autofill::PasswordForm(stored_form));
+  for (const auto& elements : stored_passwords_) {
+    if (elements.first == form.signon_realm ||
+        (form.scheme == autofill::PasswordForm::SCHEME_HTML &&
+         password_manager::IsFederatedMatch(elements.first, form.origin))) {
+      for (const auto& stored_form : elements.second)
+        matched_forms.push_back(new autofill::PasswordForm(stored_form));
+    }
   }
   return matched_forms;
 }
diff --git a/components/password_manager/core/common/credential_manager_types.cc b/components/password_manager/core/common/credential_manager_types.cc
index 6d431e1a..484b2be7 100644
--- a/components/password_manager/core/common/credential_manager_types.cc
+++ b/components/password_manager/core/common/credential_manager_types.cc
@@ -51,6 +51,12 @@
 CredentialInfo::~CredentialInfo() {
 }
 
+bool CredentialInfo::operator==(const CredentialInfo& rhs) const {
+  return (type == rhs.type && id == rhs.id && name == rhs.name &&
+          icon == rhs.icon && password == rhs.password &&
+          federation.Serialize() == rhs.federation.Serialize());
+}
+
 std::unique_ptr<autofill::PasswordForm> CreatePasswordFormFromCredentialInfo(
     const CredentialInfo& info,
     const GURL& origin) {
@@ -75,10 +81,15 @@
   form->username_value = info.id;
   return form;
 }
-bool CredentialInfo::operator==(const CredentialInfo& rhs) const {
-  return (type == rhs.type && id == rhs.id && name == rhs.name &&
-          icon == rhs.icon && password == rhs.password &&
-          federation.Serialize() == rhs.federation.Serialize());
+
+std::unique_ptr<autofill::PasswordForm> CreateObservedPasswordFormFromOrigin(
+    const GURL& origin) {
+  std::unique_ptr<autofill::PasswordForm> form(new autofill::PasswordForm);
+  form->origin = origin;
+  form->scheme = autofill::PasswordForm::SCHEME_HTML;
+  form->type = autofill::PasswordForm::TYPE_API;
+  form->signon_realm = origin.spec();
+  return form;
 }
 
 }  // namespace password_manager
diff --git a/components/password_manager/core/common/credential_manager_types.h b/components/password_manager/core/common/credential_manager_types.h
index 2b98e3f..9bbb9000 100644
--- a/components/password_manager/core/common/credential_manager_types.h
+++ b/components/password_manager/core/common/credential_manager_types.h
@@ -71,6 +71,11 @@
     const CredentialInfo& info,
     const GURL& origin);
 
+// Create a new autofill::PasswordForm object based on |origin|. The result
+// plays the role of an observed form on that page.
+std::unique_ptr<autofill::PasswordForm> CreateObservedPasswordFormFromOrigin(
+    const GURL& origin);
+
 }  // namespace password_manager
 
 #endif  // COMPONENTS_PASSWORD_MANAGER_CORE_COMMON_CREDENTIAL_MANAGER_TYPES_H_
diff --git a/components/password_manager/core/common/credential_manager_types_unittest.cc b/components/password_manager/core/common/credential_manager_types_unittest.cc
index 46deeb5..e1744b5 100644
--- a/components/password_manager/core/common/credential_manager_types_unittest.cc
+++ b/components/password_manager/core/common/credential_manager_types_unittest.cc
@@ -85,4 +85,19 @@
   EXPECT_EQ(info.password, form->password_value);
   EXPECT_EQ(origin_.spec(), form->signon_realm);
 }
+
+TEST_F(CredentialManagerTypesTest, CreateObservedPasswordForm) {
+  std::unique_ptr<autofill::PasswordForm> form =
+      CreateObservedPasswordFormFromOrigin(origin_);
+
+  ASSERT_TRUE(form);
+  EXPECT_EQ(GURL(), form->icon_url);
+  EXPECT_EQ(base::string16(), form->display_name);
+  EXPECT_EQ(origin_, form->origin);
+  EXPECT_EQ(autofill::PasswordForm::SCHEME_HTML, form->scheme);
+  EXPECT_TRUE(form->federation_origin.unique());
+  EXPECT_EQ(base::string16(), form->password_value);
+  EXPECT_EQ(origin_.spec(), form->signon_realm);
+}
+
 }  // namespace password_manager
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index cc0afffe..0be5da5 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -137,7 +137,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: 327
+#   For your editing convenience: highest ID currently used: 328
 #
 # Placeholders:
 #   The following placeholder strings are automatically substituted:
@@ -8328,7 +8328,7 @@
       'supported_on': ['chrome_os:51-'],
       'device_only': True,
       'features': {
-        'dynamic_refresh': True,
+        'dynamic_refresh': False,
       },
       'example_value': [
         {
@@ -8345,7 +8345,7 @@
       'tags': ['system-security'],
       'desc': '''Defines the list of USB devices that are allowed to be detached from their kernel driver in order to be used through the chrome.usb API directly inside a web application. Entries are pairs of USB Vendor Identifier and Product Identifier to identify a specific hardware.
 
-      If this policy is not configured, the list of a detachable USB devices is considered as empty.''',
+      If this policy is not configured, the list of a detachable USB devices is empty.''',
     },
     {
       'name': 'DeviceAllowBluetooth',
@@ -8480,6 +8480,28 @@
       'tags': [],
       'id': 327,
     },
+    {
+      'name': 'LoginVideoCaptureAllowedUrls',
+      'type': 'list',
+      'schema': {
+        'type': 'array',
+        'items': { 'type': 'string' },
+      },
+      'supported_on': ['chrome_os:52-'],
+      'device_only': True,
+      'features': {
+        'dynamic_refresh': True,
+      },
+      'example_value': [ "https://example.com" ],
+      'id': 328,
+      'caption': '''URLs that will be granted access to video capture devices on SAML login pages''',
+      'tags': ['website-sharing'],
+      'desc': '''Patterns in this list will be matched against the security
+      origin of the requesting URL.  If a match is found, access to video
+      capture devices will be granted on SAML login pages.  If no match is
+      found, access will be automatically denied.  Wildcard patterns are not
+      allowed.'''
+    },
   ],
   'messages': {
     # Messages that are not associated to any policies.
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb
index ab054126..3510482 100644
--- a/components/policy/resources/policy_templates_am.xtb
+++ b/components/policy/resources/policy_templates_am.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="am">
 <translation id="101438888985615157">ማያ ገጹን በ180 ዲግሪ አሽከርክር</translation>
-<translation id="1015272884520659144">በቀጥታ በድር መተግበሪያ ውስጥ በchrome.usb ኤፒአዩ ውስጥ መጠቀም እንዲቻሉ ከአውራ ከዋኝ ነጂያቸው እንዲላቀቁ የሚፈቀድላቸው የዩኤስቢ መሣሪያዎች ዝርዝር ይገልጻል። ግቤቶች የተወሰነ ሃርድዌር የሚለዩ የዩኤስቢ አቅራቢ ለዪ እና የምርት ለዪ ጥምሮች ናቸው።
-
-      ይህ መመሪያ ካልተዋቀረ መላቀቅ የሚችሉ የዩኤስቢ መሣሪያዎች ዝርዝር ባዶ እንደሆነ ይቆጠራል።</translation>
 <translation id="1017967144265860778">የኃይል አስተዳደር በመለያ መግቢያ ገጹ ላይ</translation>
 <translation id="1019101089073227242">የተጠቃሚ ውሂብ አቃፊ ያዋቅሩ</translation>
 <translation id="1022361784792428773">ተጠቃሚው እንዳይጭናቸው መታገድ ያለባቸው የቅጥያ መታወቂያዎች (ወይም ደግሞ ለሁሉም *)</translation>
@@ -72,14 +69,6 @@
     ይህ መመሪያ ካልተዋቀረ ወይም ወደ ሐሰት ከተዋቀረ፣ በTLS ውስጥ የስነ መሰውር ጥቅል RC4 አይነቃም። ካልሆነ ደግሞ ጊዜው ባለፈበት አገልጋይ ተኳኋኝነትን ለማግኘት እውነት ሆኖ ሊዋቀር ይችላል። ይህ ጊዜያዊ መፍትሔ ነው፣ እና አገልጋዩ ዳግም መዋቀር አለበት።</translation>
 <translation id="1297182715641689552">የ.pac ተኪ ስክሪፕት ይጠቀሙ</translation>
 <translation id="1304973015437969093">በፀጥታ የሚጫኑ የቅጥያ/መተግበሪያ መታወቂያዎች እና የዝማኔ ዩአርኤሎች</translation>
-<translation id="1310699457130669094">ለተኪ .pac ፋይሉ አንድ ዩአርኤል እዚህ መግለጽ ይችላሉ።
-
-          በ«የተኪ አገልጋዮች ቅንብሮች እንዴት እንደሚገለጹ ይምረጡ» ላይ የራስ ተኪ ቅንብሮችን ከመረጡ ብቻ ነው ይህ መመሪያ የሚተገበረው።
-
-          የተኪ መመሪያዎችን ለማዋቀር ሌላ አይነት ሁነታን ከመረጡ ይህን መመሪያ እንዳልተዋቀረ መተው አለብዎት።
-
-          ለዝርዝር ምሳሌዎች ይህንን ይጎብኙ፦
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">ማያ ገጹ ደብዝዞ በአለበት ጊዜ ወይም ማያ ገጹ ከጠፋ በኋላ ወዲያውኑ የተጠቃሚ እንቅስቃሴ ከታየ የማያ ገጹ መደብዘዝ መዘግየት የሚመጠንበት መቶኛ ይገልጻል።
 
           ይህ መመሪያ ከተዋቀረ ማያ ገጹ ደብዝዞ በአለበት ጊዜ ወይም ማያ ገጹ ከጠፋ በኋላ ወዲያውኑ የተጠቃሚ እንቅስቃሴ ከታየ የማያ ገጹ መደብዘዝ መዘግየት የሚመጠንበት መቶኛ ይገልጻል። የማደብዘዝ መዘግየት ሲመጠን፣ ማያ ገጹ መጥፋት፣ የማያ ገጹ ቁልፍ እና ስራ መፍታት መዘግየቶች መጀመሪያ ላይ እንደተዋቀረው ከማያ ገጹ ማደብዘዝ ተመሳሳይ ርቀት እንዲኖራቸው ተደርገው ይስተካከላሉ።
@@ -160,18 +149,6 @@
 <translation id="1561424797596341174">መመሪያ ለርቀት መዳረሻ አስተናጋጅ እርማት ግንቦች ይሽራል</translation>
 <translation id="1583248206450240930"><ph name="PRODUCT_FRAME_NAME" />ን በነባሪነት ይጠቀሙ</translation>
 <translation id="1608755754295374538">የድምጽ ቀረጻ መሣሪያዎች መዳረሻ ያለጥያቄ የሚሰጣቸው ዩ አር ኤሎች</translation>
-<translation id="1613574633990410986">እርስዎ <ph name="PRODUCT_NAME" /> እና የኤአርሲ መተግበሪያዎች የሚጠቀመው ተኪ አገልጋይ እንዲገልጹ ያስችልዎታል፣ እና ተጠቃሚዎች የተኪ ቅንብሮችን እንዳይቀይሩ ይከለክላል።
-
-      ተኪ አገልጋይ በጭራሽ ላለመጠቀም ሁልጊዜ በቀጥታ ለመገናኘት ከመረጡ፣ ሌሎች አማራጮች ሁሉ ችላ ይባላሉ።
-
-      የተኪ አገልጋዩ በራስ እንዲገኝ ከመረጡ ሌሎች አማራጮች ሁሉ ችላ ይባላሉ።
-
-      ለዝርዝር ምሳሌዎች ይህንን ይጎብኙ፦
-      <ph name="PROXY_HELP_URL" />
-
-      ይህን ቅንብር ካነቁት <ph name="PRODUCT_NAME" /> እና የኤአርሲ መተግበሪያዎች ከትዕዛዝ መስመሩ የተገለጹ ሁሉንም ከተኪ ጋር የሚዛመዱ አማራጮች ችላ ይሏቸዋል።
-
-      እነዚህን መመሪያዎች እንዳልተዋቀሩ መተው ተጠቃሚዎች በራሳቸው የተኪ ቅንብሮችን እንዲመርጡ አይፈቅድላቸውም።</translation>
 <translation id="1617235075406854669">የአሳሽ እና ውርድ ታሪክ መሰረዝን ያንቁ</translation>
 <translation id="1617384279878333801">በመገለጫ አስተዳዳሪ ውስጥ ሰው አክልን ያንቁ</translation>
 <translation id="1655229863189977773">የዲስክ መሸጎጫ መጠን በባይቶች ያስቀምጡ</translation>
@@ -265,14 +242,6 @@
       ከነቃ ክፍለ ጊዜው ገባሪ ሆኖ ሳለና ማያ ገጹ ካልተቆለፈ አንድ ትልቅ ቀይ የመውጫ አዝራር በስርዓት መሣቢያው ላይ ይታያል።
 
       ከተሰናከለ ወይም ካልተገለጸ ምንም ትልቅ ቀይ የመውጫ አዝራር በስርዓቱ መሣቢያ ላይ አይታይም።</translation>
-<translation id="1942957375738056236">የተኪ አገልጋዩ ዩአርኤል እዚህ መጥቀስ ይችላሉ።
-
-          ይህ መመሪያ በ«የተኪ አገልጋይ ቅንብሮች እንዴት እንደሚገለጹ ይምረጡ» ላይ እራስዎ የተኪ ቅንብሮችን ከገለጹ ብቻ ነው የሚተገበረው።
-
-          የተኪ መመሪያዎችን ለማዋቀር ሌላ ሁነታን ከመረጡ ይህን መመሪያ እንዳልተዋቀረ ነው መተው ያለብዎት።
-
-          ለተጨማሪ አማራጮች እና ዝርዝር ምሳሌዎች ይህንን ይጎብኙ፦
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974"><ph name="PRODUCT_OS_NAME" /> ውስጥ በመግቢያ ገጹ ላይ የኃይል አስተዳደር ያዋቅሩ።
 
       ይህ መመሪያ መግቢያ ገጹ እየታየ ሳለ ለተወሰነ ጊዜ ምንም የተጠቃሚ እንቅስቃሴ ከሌለ <ph name="PRODUCT_OS_NAME" /> ምን አይነት ባህሪ እንደሚያሳይ እንዲያዋቅሩ ያስችልዎታል። መመሪያው በርካታ ቅንብሮችን ይቆጣጠራል። ለግል የቃላት ትርጉም እና የእሴት ክልሎች በአንድ ክፍለ-ጊዜ ውስጥ የኃይል አስተዳደርን የሚቆጣጠሩ ተጓዳኞቹ መመሪያዎችን ይመልከቱ። ከእነዚህ መመሪያዎች የሚያፈነግጡ ነገሮች እነዚህ ብቻ ናቸው፦
@@ -663,24 +632,6 @@
 <translation id="3072847235228302527">የመሣሪያ-አካባቢያዊ መለያ አገልግሎት ውል ያዋቅሩ</translation>
 <translation id="3096595567015595053">የነቁ ተሰኪዎች ዝርዝር</translation>
 <translation id="3101501961102569744">የተኪ አገልጋይ ቅንብሮች እንዴት እንደሚገለጹ ይምረጡ</translation>
-<translation id="3125884964575432854">እርስዎ <ph name="PRODUCT_NAME" /> እና የኤአርሲ መተግበሪያዎች የሚጠቀመው ተኪ አገልጋይ እንዲገልጹ ያስችልዎታል፣ እና ተጠቃሚዎች የተኪ ቅንብሮችን እንዳይቀይሩ ይከለክላል።
-
-      ተኪ አገልጋይ በጭራሽ ላለመጠቀም ሁልጊዜ በቀጥታ ለመገናኘት ከመረጡ፣ ሌሎች አማራጮች ሁሉ ችላ ይባላሉ።
-
-          የስርዓት ተኪ ቅንብሮችን ለመጠቀም ከመረጡ ሌሎች አማራጮች ሁሉ ችላ ይባላሉ።
-
-          የተኪ አገልጋዩ በራስ እንዲገኝ ከመረጡ ሌሎች አማራጮች ሁሉ ችላ ይባላሉ።
-
-          የቋሚ አገልጋይ ተኪ ሁነታ ከመረጡ በ«የተኪ አገልጋይ አድራሻ ወይም ዩአርኤል» እና «በኮማ የተለዩ የተኪ ማለፊያ ደንቦች ዝርዝር» ውስጥ ተጨማሪ አማራጮችን መግለጽ ይችላሉ። የኤአርሲ መተግበሪያዎች የኤችቲቲፒ ተኪ አገልጋዩን ከከፍተኛ ቅድሚያ ጋር ብቻ ነው የሚጠቀመው።
-
-          የ .pac ተኪ ስክሪፕት ለመጠቀም ከመረጡ ወደ ስክሪፕቱ የሚወስደውን ዩአርኤል በ«ወደ ተኪ .pac ፋይል የሚወስድ ዩአርኤል» መግለጽ አለብዎት።
-
-          ለዝርዝር ምሳሌዎች ይህንን ይጎብኙ፦
-          <ph name="PROXY_HELP_URL" />
-
-         ይህን ቅንብር ካነቁት <ph name="PRODUCT_NAME" /> እና የኤአርሲ መተግበሪያዎች ከትዕዛዝ መስመሩ የተገለጹ ሁሉንም ከተኪ ጋር የሚዛመዱ አማራጮች ችላ ይሏቸዋል።
-
-         እነዚህን መመሪያዎች እንዳልተዋቀሩ መተው ተጠቃሚዎች በራሳቸው የተኪ ቅንብሮችን እንዲመርጡ አይፈቅድላቸውም።</translation>
 <translation id="3153348162326497318">የትኛዎቹ ቅጥያዎች ተጠቃሚዎች መጫን እንደማይችሉ እንዲገልጹ ያስችልዎታል። አስቀድመው የተጫኑ ቅጥያዎች በቅጣት መዝገብ ውስጥ ካሉ ይወገዳሉ።
 
           የ«*» እሴት ያለው የክልከላ ዝርዝር እሴት ማለት በግልጽ በተፈቀዱ ዝርዝር ውስጥ በግልጽ እስካልተጠቀሱ ድረስ ሁሉም ቅጥያዎች በተከለከሉ ዝርዝር ውስጥ ናቸው ማለት ነው።
@@ -753,6 +704,7 @@
       ይሄ ቅንብር ከነቃ ወይም ካልተዋቀረ ተጠቃሚዎች በGoogle መለያቸው በማረጋገጥ የደመና ህትመት ተኪውን ሊያነቁት ይችላሉ።
 
       ይህ ቅንብር ከተሰናከለ ተጠቃሚዎች ተኪውን ሊያነቁት አይችሉም፣ እና ማሽኑ አታሚዎቹን ለ<ph name="CLOUD_PRINT_NAME" /> እንዲያጋራ አይፈቀድለትም።</translation>
+<translation id="3297010562646015826">በተግባር አስተዳዳሪ ውስጥ ሂደቶችን ማጠናቀቅን ያነቃል</translation>
 <translation id="3322771899429619102">የትኛዎቹ ጣቢያዎች ቁልፍ ማመንጨትን እንዲጠቀሙ የተፈቀደላቸው መሆናቸውን የሚገልጹ የዩአርኤል ስርዓተ ጥለቶች ዝርዝር እንዲያዋቅሩ ያስችልዎታል። አንድ የዩአርኤል ስርዓተ ጥለት በ«KeygenBlockedForUrls» ውስጥ ከሆነ ይሄ እነዚህን የተለዩትን ይሽራል።
 
           ይህ መመሪያ እንዳልተዋቀረ ከተተወ የ«DefaultKeygenSetting» መመሪያው ከተዋቀረ ሁለገብ ነባሪ እሴቱ ለሁሉም ጣቢያዎች ጥቅም ላይ ይውላል፣ አለበለዚያ ደግሞ የተጠቃሚው የግል ውቅር ጥቅም ላይ ይውላል።</translation>
@@ -939,22 +891,6 @@
           ይህ መመሪያ ወደ ፞«ኩኪዎችን ለክፍለ-ጊዜው ቆይታ አቆይ» ከተዋቀረ ክፍለ-ጊዜው በሚያበቃበት ጊዜ ኩኪዎቹ ይጸዳሉ። <ph name="PRODUCT_NAME" /> በ«በስተጀርባ ሁነታ» ላይ እያሄደ ከሆነ የመጨረሻው መስኮት በሚዘጋበት ጊዜ ክፍለ-ጊዜው ላይዘጋ እንደሚችል ልብ ይበሉ። ይህንን ባህሪ ስለማወቀር ተጨማሪ መረጃ ከፈለጉ እባክዎ የ«BackgroundModeEnabled» መመሪያውን ይመልከቱ። 
 
           ይህ መመሪያ ሳይዋቀር ከቀረ «AllowCookies» ስራ ላይ ይውላል፣ እና ተጠቃሚው ሊለውጠው ይችላል።</translation>
-<translation id="4098957623809244159">ይህ መመሪያ ተቋርጧል፣ በምትኩ ProxyModeን ይጠቀሙ።
-
-          <ph name="PRODUCT_NAME" /> እና የኤአርሲ መተግበሪያዎች የሚጠቀሙበት ተኪ አገልጋይ እንዲገልጹ ያስችልዎታል፣ እና ተጠቃሚዎች የተኪ ቅንብሮችን እንዳይቀይሩ ይከለክላቸዋል።
-
-          የተኪ አገልጋይ በጭራሽ ላለመጠቀምና ሁልጊዜ በቀጥታ ለመገናኘት ከመረጡ ሌሎች አማራጮች ሁሉ ችላ ይባላሉ።
-
-          የስርዓት ተኪ ቅንብሮችን ለመጠቀም ወይም የተኪ አገልጋዩን በራስ ለማግኘት ከመረጡ ሌሎች አማራጮች ሁሉ ችላ ይባላሉ።
-
-          ራስዎ የሚያቀናብሯቸው የተኪ ቅንብሮችን ከመረጡ በ«የተኪ አገልጋይ አድራሻ ወይም ዩአርኤል»፣ «የተኪ .pac ፋይል ዩአርኤል» ወይም «በኮማ የተለዩ የተኪ ማለፊያ ደንቦች ዝርዝር» ውስጥ ተጨማሪ አማራጮችን መግለጽ ይችላሉ።
-
-          ተጨማሪ ምሳሌዎችን ለማግኘት ይህንን ይመልከቱ፦
-          <ph name="PROXY_HELP_URL" />
-
-          ይህን ቅንብር ካነቁት <ph name="PRODUCT_NAME" /> ከትዕዛዝ መስመሩ የተገለጹ ሁሉንም ከተኪ ጋር የተገናኙ አማራጮችን ችላ ይላቸዋል።
-
-          ይህን መመሪያ እንዳልተዋቀረ መተው ተጠቃሚዎች የተኪ ቅንብሮችን በራሳቸው እንዲመርጡ ይፈቅድላቸዋል።</translation>
 <translation id="4103289232974211388">ከተጠቃሚ ማረጋገጥ በኋላ ወደ SAML IdP አዙር</translation>
 <translation id="410478022164847452">በሶኬት ኃይል ላይ ሲሆን የስራ ፈት እርምጃ ከመወሰዱ በፊት ተጠቃሚው ግብዓት ሳያስገባ የሚቆየው የጊዜ ርዝመት ይገልጻል።
 
@@ -1437,14 +1373,6 @@
 <translation id="5893553533827140852">ይህ ቅንብር ከነቃ የgnubby ማረጋገጫ ጣቄዎች በርቀት አስተናጋጅ ግንኙነት ላይ በተኪ ይተላለፋሉ።
 
           ይህ ቅንብር ከተሰናከለ ወይም ካልተዋቀረ የgnubby ማረጋገጫ ጥያቄዎች በተኪ አይተላለፉም።</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> የኤአርሲ መተግበሪያዎች ማንኛውም እዚህ የተሰጡት አስተናጋጆች ዝርዝር ተኪን ያልፋል።
-
-          ይህ መምሪያ በ«የተኪ አገልጋይ ቅንብሮች እንዴት እንደሚገለጹ ይምረጡ» ላይ የእራስዎ ተኪ ቅንብሮችን ከመረጡ ብቻ ነው የሚተገበረው።
-
-          ተኪ መምሪያዎችን ለማዋቀር ሌላ ማንኛውም ዓይነት ሁነታን ከመረጡ ይህ መምሪያ እንዳልተዋቀረ ነው መተው ያለብዎት።
-
-          ለተጨማሪ ዝርዝር ምሳሌዎች ይህንን ይጎብኙ፦
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">የራስ-ዝማኔ ውርዶች በHTTP በኩል ይፍቀዱ</translation>
 <translation id="5921888683953999946">በመግቢያ ገጹ ላይ ያለው ነባሪውን የትልቅ ጠቋሚ ተደራሽነት ባህሪ ያዋቅሩ።
 
@@ -1973,9 +1901,6 @@
 
       ይህ ቅንብር ከተሰናከለ ወይም ካልተዋቀረ <ph name="PRODUCT_NAME" /> በተጠቃሚ የተገለጸውን አካባቢ (ከተዋቀረ)፣ የስርዓቱ አካባቢ ወይም ተጠባባቂ የሆነውን አካባቢ «en-US» ይጠቀማል።</translation>
 <translation id="7651739109954974365">የውሂብ ዝውውር ለዚህ መሣሪያ መንቃት ካለበት ይወስናል። ወደ እውነት ከተዋቀረ የውሂብ ዝውውር ይፈቀዳል። እንዳልተዋቀረ ከተተወ ወይም ወደ ሐሰት ከተዋቀረ የውሂብ ዝውውር አይገኝም።</translation>
-<translation id="7667184304362487902">የ<ph name="PRODUCT_NAME" /> እና የኤአርሲ መተግበሪያዎች ተኪ ቅንብሮችን ያዋቅራል።
-
-      ይህ መመሪያ ጥቅም ላይ ለመዋል ገና ዝግጁ አይደለም፣ እባክዎ አይጠቀሙበት።</translation>
 <translation id="76810863974142048">የርቀት መዳረሻ ደንበኛዎች የማረጋገጫ ማስመሰያቸውን ማግኘት ያለባቸው ዩአርኤል።
 
           ይህ መመሪያ ከተዋቀረ የርቀት መዳረሻ አስተናጋጁ የሚያረጋግጡ ደንበኛዎች መገናኘት እንዲችሉ ከዚህ ዩአርኤል የማረጋገጫ ማስመሰያ እንዲያገኙ ይፈልግባቸዋል። ከ RemoteAccessHostTokenValidationUrl ጋር በጥምረት ጥቅም ላይ መዋል አለበት።
@@ -2197,6 +2122,7 @@
 
       የመመሪያ ዋጋው በሚሊሰከንዶች ነው መገለጽ ያለበው።</translation>
 <translation id="8344454543174932833">የመጀመሪያው አሂድ ላይ ዕልባቶችን ከነባሪው አሳሽ ያስመጣል</translation>
+<translation id="8359734107661430198">የExampleDeprecatedFeature ኤፒአይ እስከ 2008/09/02 ድረስ አንቃ</translation>
 <translation id="8360452361555133173">ከስርዓተ ክወና ማላቅ በኋላ በመጀመሪያው የአሳሽ ጅምር ላይ የእንኳን ደህና መጡ ገጽን ያንቁ።
 
       ይህ መመሪያ ወደ እውነት ከተዋቀረ ወይም ካልተዋቀረ አሳሹ በመጀመሪያው የአሳሽ ጅምር ላይ የእንኳን ደህና መጡ ገጹን ዳግም ያሳያል።
@@ -2387,7 +2313,7 @@
 
           የመመሪያ ዋጋው በሚሊሰከንዶች ነው መገለጽ ያለበት። ዋጋዎች ከስራ ፈትቶ መዘግየቱ ያነሱ ነው የሚሆኑት።</translation>
 <translation id="891435090623616439">እንደ JSON ሕብረ ቁምፊ በኮድ ተቀምጧል፣ ለዝርዝሩ <ph name="COMPLEX_POLICIES_URL" />ን ይመልከቱ</translation>
-<translation id="8929359433203547810">ይህ መመሪያ ወደ ሐሰት ከተዋቀረ <ph name="PRODUCT_OS_NAME" /> ብሉቱዝን ያሰናክላል፣ እና ተጠቃሚው መልሶ ሊያነቃው አይችልም።
+<translation id="8929359433203547810">ይህ መመሪያ ወደ ሐሰት ከተዋቀረ <ph name="PRODUCT_OS_NAME" /> ብሉቱዝን የሚያሰናክለው ሲሆን ተጠቃሚው መልሶ ሊያነቃው አይችልም።
 
       ይህ መመሪያ ወደ እውነት ከተዋቀረ ወይም እንዳልተዋቀረ ከተተወ ተጠቃሚው ብሉቱዙን እንደፈለገ ሊያነቃው ወይም ሊያሰናክለው ይችላል።
 
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb
index 493da9f..86ce6b5 100644
--- a/components/policy/resources/policy_templates_ar.xtb
+++ b/components/policy/resources/policy_templates_ar.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ar">
 <translation id="101438888985615157">تدوير الشاشة 180 درجة</translation>
-<translation id="1015272884520659144">‏تحديد قائمة أجهزة USB التي يُسمح لها بأن تكون منفصلة عن برنامج تشغيل kernel من أجل استخدامها عبر واجهة برمجة التطبيقات chrome.usb مباشرةً داخل تطبيق ويب. الإدخالات هي أزواج من معرّف مورد USB ومعرّف المنتج لتحديد أجهزة معينة.
-
-     إذا لم تتم تهيئة هذه السياسة، تعتبر قائمة أجهزة USB القابلة للفصل فارغة.</translation>
 <translation id="1017967144265860778">إدارة الطاقة على شاشة تسجيل الدخول</translation>
 <translation id="1019101089073227242">تعيين دليل بيانات المستخدم</translation>
 <translation id="1022361784792428773">معرفات الإضافات التي يتم منع المستخدم من تثبيتها (أو * للجميع)</translation>
@@ -63,7 +60,6 @@
       إذا لم يتم تعيين السياسة أو تم تعيين السياسة على "false"، فحينئذٍ لن يتم تمكين مجموعات تشفير RC4 في طبقة النقل الآمنة. وإلا قد يتم تعيينها على "true" للحفاظ على التوافق مع الخادم القديم. ويُعد هذا إجراءً مؤقتًا ومن المفترض أن تتم إعادة تهيئة الخادم.</translation>
 <translation id="1297182715641689552">‏استخدام نص برمجي لملف pac. للخادم الوكيل</translation>
 <translation id="1304973015437969093">‏أرقام تعريف التطبيقات / الإضافات وعناوين URL المتعلقة بالتحديث المراد تثبيتها تلقائيًا</translation>
-<translation id="1310699457130669094">‏يمكنك تحديد عنوان URL لملف pac. للخادم الوكيل هنا. لا تسري هذه السياسة إلا عند تحديد إعدادات الخادم الوكيل يدويًا في 'اختيار كيفية تحديد إعدادات الخادم الوكيل'. يجب ترك هذه السياسة بدون تعيين في حالة اختيار أي وضع آخر لتعيين سياسات الخادم الوكيل. للحصول على أمثلة تفصيلية، انتقل إلى: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">لتحديد النسبة المئوية التي بمقتضاها يتم تحديد مهلة إعتام الشاشة في حالة ملاحظة نشاط المستخدم أثناء إعتام الشاشة أو بعد قليل من توقف الشاشة عن العمل.
 
           في حالة تعيين السياسة، فإنها تعمل على تحديد النسبة المئوية التي بمقتضاها يتم تحديد مهلة إعتام الشاشة في حالة ملاحظة نشاط المستخدم أثناء إعتام الشاشة أو بعد قليل من توقف الشاشة عن العمل. وعند قياس مهلة الإعتام، يتم ضبط مهلة إيقاف الشاشة وقفل الشاشة ووضع الخمول بحيث تحتفظ بنفس مهلة إعتام الشاشة كما هو الحال في التهيئة المعتادة.
@@ -140,18 +136,6 @@
 <translation id="1561424797596341174">إلغاء السياسة لإصدارات تصحيح الأخطاء لمضيف الوصول البعيد</translation>
 <translation id="1583248206450240930">استخدام <ph name="PRODUCT_FRAME_NAME" /> افتراضيًا</translation>
 <translation id="1608755754295374538">‏عناوين URL التي سيتم منحها إمكانية الدخول إلى أجهزة التقاط الصوت بدون إذن</translation>
-<translation id="1613574633990410986">‏للسماح بتحديد الخادم الوكيل الذي يستخدمه <ph name="PRODUCT_NAME" /> وتطبيقات ARC، ومنع المستخدمين من تغيير إعدادات الخادم الوكيل.
-
-      إذا اخترت عدم استخدام الخادم الوكيل مطلقًا، والاتصال دائمًا بشكل مباشر، فسيتم تجاهل جميع الخيارات الأخرى.
-
-      وإذا اخترت الاكتشاف التلقائي للخادم الوكيل، فسيتم تجاهل جميع الخيارات الأخرى.
-
-      للحصول على أمثلة تفصيلية، انتقل إلى:
-      <ph name="PROXY_HELP_URL" />
-
-      إذا مكّنت هذا الإعداد، فسيتجاهل <ph name="PRODUCT_NAME" /> وتطبيقات ARC جميع الخيارات المتعلقة بالخادم الوكيل، والتي تم تحديدها من خلال سطر الأوامر.
-
-      يؤدي ترك هذه السياسات بدون تعيين إلى السماح للمستخدمين باختيار إعدادات الخادم الوكيل بأنفسهم.</translation>
 <translation id="1617235075406854669">تمكين حذف سجل المتصفح والتنزيل</translation>
 <translation id="1617384279878333801">تمكين إضافة شخص في مدير الملف الشخصي</translation>
 <translation id="1655229863189977773">تعيين حجم ذاكرة التخزين المؤقت للقرص بالبايت</translation>
@@ -238,14 +222,6 @@
       في حالة تمكين هذا الإعداد، سيظهر زر خروج كبير أحمر اللون في علبة النظام أثناء نشاط الجلسة وعدم قفل الشاشة.
 
       في حالة تعطيل هذا الإعداد أو عدم تحديده، لن يظهر الزر الكبير أحمر اللون في علبة النظام.</translation>
-<translation id="1942957375738056236">‏يمكنك تحديد عنوان URL للخادم الوكيل هنا.
-
-          لا يكون لهذه السياسة تأثير إلا في حالة تحديد إعدادات الخادم الوكيل يدويًا في "اختيار كيفية تحديد إعدادات الخادم الوكيل".
-
-          يجب ترك هذه السياسة بدون تعيينها إذا حددت أي وضع آخر لإعداد سياسات الخادم الوكيل.
-
-          للحصول على المزيد من الخيارات والأمثلة التفصيلية، انتقل إلى:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">تتيح تهيئة إدارة الطاقة في شاشة تسجيل الدخول في <ph name="PRODUCT_OS_NAME" />.
 
       تتيح لك هذه السياسة تهيئة كيفية تصرف <ph name="PRODUCT_OS_NAME" /> في حالة توقف نشاط المستخدم لفترة من الوقت أثناء عرض شاشة تسجيل الدخول. تتحكم السياسة في إعدادات متعددة. بالنسبة إلى الدلالات الفردية ونطاقات القيم، اطلع على السياسات المقابلة التي تتحكم في إدارة الطاقة ضمن إحدى الجلسات. الاختلافات الوحيدة عن هذه السياسات هي:
@@ -604,24 +580,6 @@
 <translation id="3072847235228302527">تعيين بنود الخدمة لحساب محلي على الجهاز</translation>
 <translation id="3096595567015595053">قائمة المكونات الإضافية الممَّكنة</translation>
 <translation id="3101501961102569744">اختيار كيفية تحديد إعدادات الخادم الوكيل</translation>
-<translation id="3125884964575432854">‏للسماح لك بتحديد الخادم الوكيل الذي يستخدمه <ph name="PRODUCT_NAME" /> وتطبيقات ARC ومنع المستخدمين من تغيير إعدادات الخادم الوكيل.
-
-          إذا اخترت عدم استخدام الخادم الوكيل مطلقًا والاتصال دائمًا بشكل مباشر، فسيتم تجاهل جميع الخيارات الأخرى.
-
-          وإذا اخترت استخدام إعدادات الخادم الوكيل للنظام، فسيتم تجاهل جميع الخيارات الأخرى.
-
-          وإذا اخترت استخدام اكتشاف الخادم الوكيل تلقائيًا، فسيتم تجاهل جميع الخيارات الأخرى.
-
-          وإذا اخترت وضع الخادم الوكيل الثابت، يمكنك تحديد المزيد من الخيارات في "العنوان أو عنوان URL للخادم الوكيل" و"قائمة مفصولة بفواصل لقواعد تجاوز الخادم الوكيل". ولن تستخدم تطبيقات ARC إلا الخادم الوكيل HTTP مع الأولوية القصوى.
-
-          وإذا اخترت استخدام نص برمجي لملف .pac للخادم الوكيل، يجب عليك تحديد عنوان URL للنص البرمجي في "عنوان URL لملف pac. للخادم الوكيل".
-
-          للحصول على أمثلة تفصيلية، انتقل إلى:
-          <ph name="PROXY_HELP_URL" />
-
-          إذا مكّنت هذا الإعداد، فسيتجاهل <ph name="PRODUCT_NAME" /> وتطبيقات ARC جميع الخيارات المتعلقة بالخادم الوكيل والتي تم تحديدها من خلال سطر الأوامر.
-
-          سيؤدي عدم تعيين هذه السياسة إلى السماح للمستخدمين باختيار إعدادات الخادم الوكيل بأنفسهم.</translation>
 <translation id="3153348162326497318">للسماح لك بتحديد الإضافات التي لا يمكن للمستخدمين تثبيتها. وستتم إزالة الإضافات المثبّتة بالفعل إذا تم حظرها. تعني القيمة "*" في قائمة الحظر، حظر جميع الإضافات ما لم يتم إدراجها بشكل صريح في قائمة السماح. إذا تم ترك هذه السياسة بدون تعيين، يمكن للمستخدم تثبيت أية إضافات في  <ph name="PRODUCT_NAME" />.</translation>
 <translation id="316778957754360075">‏لقد تمّ إيقاف هذا الإعداد اعتبارًا من الإصدار 29 من <ph name="PRODUCT_NAME" />. وإن الطريقة الموصى بها لإعداد مجموعة التطبيقات أو الإضافات التي تستضيفها المؤسسة، عبارة عن تضمين الموقع الذي يستضيف حزم CRX في ExtensionInstallSources وع وضع روابط للتنزيل المباشر في الحزم على صفحة الويب. ويُمكن إنشاء مشغّل لصفحة الويب هذه باستخدام سياسة ExtensionInstallForcelist.</translation>
 <translation id="3185009703220253572">منذ الإصدار <ph name="SINCE_VERSION" /></translation>
@@ -685,6 +643,7 @@
        في حالة تمكين هذا الإعداد أو لم تتم تهيئته، يتمكن المستخدمون من تمكين الخادم الوكيل للطباعة في السحاب من خلال المصادقة مع حساب Google.
 
        في حالة تعطيل هذا الإعداد، لن يتمكن المستخدمون من تمكين الخادم الوكيل ولن يتم السماح للجهاز بمشاركة الطابعات التابعة له مع <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">تمكّن عمليات الإنهاء في إدارة المهام</translation>
 <translation id="3322771899429619102">‏يسمح لك بتعيين قائمة أنماط عناوين URL التي تحدد المواقع التي يُسمح لها باستخدام إنشاء مفتاح. وإذا كان نمط عنوان url في 'KeygenBlockedForUrls'، فإن هذا يلغي هذه الاستثناءات.
 
 
@@ -853,22 +812,6 @@
           إذا تم تعيين هذه السياسة إلى "الاحتفاظ بملفات تعريف الارتباط طوال مدة الجلسة"، فحينئذٍ سيتم محو ملفات تعريف الارتباط عند إغلاق الجلسة. وتجدر الإشارة إلى أنه إذا كان <ph name="PRODUCT_NAME" /> يعمل في وضع الخلفية، فقد لا يمكن إغلاق الجلسة عند إغلاق آخر نافذة. يُرجى الاطلاع على سياسة "BackgroundModeEnabled" لمزيد من المعلومات عن تهيئة هذا السلوك.
 
           إذا تُركت هذه السياسة بدون تعيين، فسيتم استخدام "AllowCookies" وسيتمكن المستخدم من تغييرها.</translation>
-<translation id="4098957623809244159">‏هذه السياسة متوقفة، استخدم ProxyMode بدلاً من ذلك.
-
-          تسمح لك بتحديد الخادم الوكيل الذي يستخدمه <ph name="PRODUCT_NAME" /> وتطبيقات ARC ومنع المستخدمين من تغيير إعدادات الخادم الوكيل.
-
-          إذا اخترت عدم استخدام الخادم الوكيل مطلقًا والاتصال دائمًا بشكل مباشر، فسيتم تجاهل جميع الخيارات الأخرى.
-
-          وإذا اخترت استخدام إعدادات الخادم الوكيل للنظام أو اكتشاف الخادم الوكيل تلقائيًا، فسيتم تجاهل جميع الخيارات الأخرى.
-
-          وإذا اخترت الإعدادات اليدوية للخادم الوكيل، يمكنك تحديد المزيد من الخيارات في "العنوان أو عنوان URL للخادم الوكيل" و"عنوان URL لملف pac. للخادم الوكيل" و"قائمة مفصولة بفواصل لقواعد تجاوز الخادم الوكيل".
-
-          للحصول على أمثلة تفصيلية، انتقل إلى:
-          <ph name="PROXY_HELP_URL" />
-
-          إذا مكّنت هذا الإعداد، فسيتجاهل <ph name="PRODUCT_NAME" /> جميع الخيارات المتعلقة بالخادم الوكيل والتي تم تحديدها من خلال سطر الأوامر.
-
-          يؤدي ترك هذه السياسة بدون تعيين إلى السماح للمستخدمين باختيار إعدادات الخادم الوكيل بأنفسهم.</translation>
 <translation id="4103289232974211388">‏إعادة توجيه إلى SAML IdP بعد تأكيد المستخدم</translation>
 <translation id="410478022164847452">لتحديد المدة الزمنية التي تنقضي بدون تعامل المستخدم مع الجهاز، والتي سيتم اتخاذ إجراء وضع الخمول بعد انقضائها عند استخدام طاقة التيار المتردد.
 
@@ -1282,14 +1225,6 @@
 <translation id="5893553533827140852">‏عند تمكين هذا الإعداد، سيتم توكيل طلبات مصادقة gnubby على اتصال مضيف بعيد.
 
           وعند تعطيله أو عدم تهيئته، لن يتم توكيل طلبات مصادقة gnubby.</translation>
-<translation id="5900959132054596599">‏سيتجاوز <ph name="PRODUCT_NAME" /> وتطبيقات ARC أي خادم وكيل في قائمة المضيفين الواردة هنا.
-
-          لا تسري هذه السياسة إلا إذا حددت إعدادات الخادم الوكيل يدويًا في "اختيار كيفية تحديد إعدادات الخادم الوكيل".
-
-          يجب ترك هذه السياسة بدون تعيين في حالة اختيار أي وضع آخر لإعداد سياسات الخادم الوكيل.
-
-          للحصول على المزيد من الأمثلة التفصيلية، انتقل إلى:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">‏السماح بتنزيلات التحديث التلقائي عبر HTTP</translation>
 <translation id="5921888683953999946">‏تعيين الحالة الافتراضية لميزة الدخول إلى المؤشر الكبير في شاشة تسجيل الدخول.
 
@@ -1766,9 +1701,6 @@
 
       إذا تم تعطيل هذا الإعداد، فسيستخدم <ph name="PRODUCT_NAME" /> اللغة المفضلة التي حددها المستخدم (إذا تمت تهيئتها) أو لغة النظام أو اللغة البديلة 'en-US'.</translation>
 <translation id="7651739109954974365">‏لتحديد ما إذا كان يجب تمكين تجوال البيانات للجهاز أم لا. إذا تم التعيين على "true"، يتم السماح بتجوال البيانات. وإذا تم تركه بدون تهيئته أو تعيينه على "false"، فإن تجوال البيانات لن يكون متاحًا.</translation>
-<translation id="7667184304362487902">‏لتهيئة إعدادات الخادم الوكيل لـ <ph name="PRODUCT_NAME" /> وتطبيقات ARC.
-
-      هذه السياسة غير جاهزة للاستخدام بعدُ، الرجاء عدم استخدامها.</translation>
 <translation id="76810863974142048">‏عنوان URL الذي ينبغي أن يحصل عملاء الوصول البعيد من خلاله على الرموز المميزة للمصادقة.
 
           في حالة تعيين هذه السياسة، سيتطلب مضيف الوصول البعيد عملاء للمصادقة للحصول على رمز المصادقة من عنوان URL هذا للاتصال. ويجب استخدامه مع emoteAccessHostTokenValidationUrl.
@@ -1978,6 +1910,7 @@
 
       يجب تحديد قيمة السياسة بالمللي ثانية.</translation>
 <translation id="8344454543174932833">استيراد الإشارات المرجعية من المتصفح الافتراضي عند التشغيل أول مرة</translation>
+<translation id="8359734107661430198">‏تمكين واجهة برمجة تطبيقات ExampleDeprecatedFeature من خلال 2008/09/02</translation>
 <translation id="8360452361555133173">‏تمكين عرض صفحة الترحيب عند التشغيل الأول للمتصفح عقب ترقية نظام التشغيل.
 
       إذا تم تعيين هذه السياسة على "true" أو لم يتم تهيئتها، فسيعيد المتصفح عرض صفحة الترحيب عند التشغيل الأول عقب ترقية نظام التشغيل.
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb
index 8622c83..72044bf 100644
--- a/components/policy/resources/policy_templates_bg.xtb
+++ b/components/policy/resources/policy_templates_bg.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="bg">
 <translation id="101438888985615157">Завъртане на екрана на 180 градуса</translation>
-<translation id="1015272884520659144">Определя списъка с USB устройства, за които е разрешено да бъдат отделяни от драйвера в ядрото, за да се използват директно в уеб приложения чрез приложния програмен интерфейс (API) chrome.usb. Записите представляват двойки от идентификатор на доставчика и идентификатор на продукта за USB, чрез които се идентифицира конкретният хардуер.
-
-Ако това правило не е конфигурирано, списъкът с USB устройства, които може да се отделят, ще се счита за празен.</translation>
 <translation id="1017967144265860778">Управление на захранването от екрана за вход</translation>
 <translation id="1019101089073227242">Задаване на директорията за потребителски данни</translation>
 <translation id="1022361784792428773">Идентификационни номера на разширения, чието инсталиране не бива да е позволено на потребителя (или „*“ за всички)</translation>
@@ -61,7 +58,6 @@
       Ако правилото не е зададено или е false, то пакетите шифри RC4 в TLS няма да бъдат активирани. В противен случай  за него може да бъде зададено true, за да се запази съвместимостта с остарял сървър. Това е временна мярка и сървърът трябва да бъде преконфигуриран.</translation>
 <translation id="1297182715641689552">Използване на .pac скрипт за прокси сървър</translation>
 <translation id="1304973015437969093">Идентификационни номера на разширения/приложения и URL адреси за актуализации, които да се инсталират негласно</translation>
-<translation id="1310699457130669094">Тук можете да посочите URL адрес на .pac файл за прокси сървър. Това правило влиза в сила само ако сте избрали ръчни настройки в „Изберете как да посочите настройките на прокси сървър“. Трябва да го оставите незададено, ако сте избрали друг режим за задаване на съответните настройки. За подробни примери посетете: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Посочва процента, с който се променя забавянето на затъмняването на екрана, когато бъде установена активност на потребителя при затъмнен екран или скоро след изключването на екрана.
 
           Ако това правило е зададено, посочва процента, с който се променя забавянето на затъмняването на екрана, когато бъде установена активност на потребителя при затъмнен екран или скоро след изключването на екрана. При такава промяна забавянията за изключване на екрана, за заключването му и при неактивност се коригират, така че да запазят същото отстояние от забавянето на затъмняването на екрана като първоначално конфигурираното.
@@ -134,18 +130,6 @@
 <translation id="1561424797596341174">Отмяна на правилата за версиите на хоста за отдалечен достъп, предназначени за отстраняване на грешки</translation>
 <translation id="1583248206450240930">Използване по подразбиране на <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="1608755754295374538">URL адреси, на които без подкана ще се предоставя достъп до звукозаписните устройства</translation>
-<translation id="1613574633990410986">Позволява да посочите прокси сървъра, който да се използва от <ph name="PRODUCT_NAME" /> и приложенията в ARC, и не разрешава на потребителите да променят настройките за него.
-
-Ако изберете никога да не се използва прокси сървър и винаги да се установява директна връзка, всички други опции се пренебрегват.
-
-В случай че изберете автоматично откриване на прокси сървъра, всички други опции се пренебрегват.
-
-За подробни примери посетете:
-<ph name="PROXY_HELP_URL" />
-
-Ако активирате тази настройка, <ph name="PRODUCT_NAME" /> и приложенията в ARC пренебрегват всички посочени в командния ред опции във връзка с прокси сървъра.
-
-Незадаването на тези правила ще позволи на потребителите да избират сами настройките за прокси сървър.</translation>
 <translation id="1617235075406854669">Активиране на изтриването на историята на браузъра и на изтеглянията</translation>
 <translation id="1617384279878333801">Активиране на възможността за добавяне на хора чрез функцията за управление на потребителските профили</translation>
 <translation id="1655229863189977773">Задаване на размер на кеша на диска в байтове</translation>
@@ -222,7 +206,6 @@
 Ако правилото е активирано, в системната област се показва голям червен бутон за изход при активна сесия и отключен екран.
 
 В случай че е деактивирано или не е посочено, съответният бутон не се показва.</translation>
-<translation id="1942957375738056236">Можете да посочите URL адреса на прокси сървъра тук. Това правило влиза в сила само ако сте избрали ръчни настройки в „Изберете как да посочите настройките на прокси сървъра“. Трябва да го оставите незададено, ако сте избрали друг режим за съответните настройки. За още опции и подробни примери посетете: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Конфигурирайте управлението на захранването на екрана за вход в <ph name="PRODUCT_OS_NAME" />.
 
 Това правило ви позволява да зададете поведението на <ph name="PRODUCT_OS_NAME" /> при липса на потребителска активност на екрана за вход за определен период от време. То контролира няколко настройки. За да научите за предназначението на всяка от тях и за стойностите, които можете да зададете, вижте съответните правила за контролиране на управлението на захранването в рамките на сесията. Единствените изключения от тези правила са следните:
@@ -590,24 +573,6 @@
 <translation id="3072847235228302527">Задаване на Общите условия за локален за устройството профил</translation>
 <translation id="3096595567015595053">Списък с активирани приставки</translation>
 <translation id="3101501961102569744">Избор на посочване на настройките за прокси сървър</translation>
-<translation id="3125884964575432854">Позволява да посочите прокси сървъра, използван от <ph name="PRODUCT_NAME" /> и приложенията в ARC, и не разрешава на потребителите да променят настройките за него.
-
-Ако изберете никога да не се използва прокси сървър и винаги да се установява директна връзка, всички други опции се пренебрегват.
-
-В случай че изберете да се използват системните настройки за прокси сървър, всички други опции се пренебрегват.
-
-При избиране на автоматично откриване на прокси сървъра всички други опции се пренебрегват.
-
-Ако изберете режим на фиксиран прокси сървър, можете да посочите допълнителни опции в „Адрес или URL адрес на прокси сървъра“ и „Списък с разделени със запетая правила за заобикаляне на прокси сървъра“. Приложенията в ARC ще използват само HTTP прокси сървъра с най-висок приоритет.
-
-В случай че изберете да се използва .pac файл със скрипт за прокси сървър, трябва да посочите URL адреса към скрипта в „URL адрес на .pac файл за прокси сървър“.
-
-За подробни примери посетете:
-<ph name="PROXY_HELP_URL" />
-
-Ако активирате тази настройка, <ph name="PRODUCT_NAME" /> и приложенията в ARC пренебрегват всички посочени в командния ред опции във връзка с прокси сървъра.
-
-Незадаването на това правило ще позволи на потребителите да избират сами настройките за прокси сървър.</translation>
 <translation id="3153348162326497318">Позволява да посочите кои разширения НЕ могат да се инсталират от потребителите. Вече инсталираните ще бъдат премахнати, ако са в черния списък.
 
           Стойността му „*“ означава, че всички разширения са в него, освен ако не са изрично посочени в белия списък.
@@ -676,6 +641,7 @@
 Ако тази настройка е активирана или не е конфигурирана, потребителите могат да активират прокси сървъра за отпечатване в облак чрез удостоверяване с профила си в Google.
 
 В случай че е деактивирана, това няма да е възможно и на компютъра няма да е разрешено да споделя принтерите си с <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Активира прекратяването на процеси в диспечера на задачите</translation>
 <translation id="3322771899429619102">Позволява да съставите списък с образци на URL адреси, посочващи сайтовете, на които е разрешено да генерират ключове. Ако даден образец фигурира в „KeygenBlockedForUrls“, изключението за него ще бъде отменено.
 
 В случай че настройката не е зададена, за всички сайтове ще се използва глобалната стандартна стойност от правилото „DefaultKeygenSetting“, ако е зададено, или личната конфигурация на потребителя в противен случай.</translation>
@@ -856,22 +822,6 @@
 Ако за правилото е зададено „Съхраняване на „бисквитките“ за цялата продължителност на сесията“, „бисквитките“ ще се изчистват след затварянето на сесията. Обърнете внимание, че ако <ph name="PRODUCT_NAME" /> се изпълнява в режим на заден план, сесията може да не бъде прекратена след затварянето на последния прозорец. Моля, разгледайте правилото „BackgroundModeEnabled“ за повече информация относно конфигурирането на това поведение.
 
 В случай че правилото не е зададено, ще се използва „AllowCookies“ и потребителят ще може да го променя.</translation>
-<translation id="4098957623809244159">Това правило е оттеглено. Вместо него използвайте ProxyMode.
-
-Позволява да посочите прокси сървъра, използван от <ph name="PRODUCT_NAME" /> и приложенията в ARC, и не разрешава на потребителите да променят настройките за него.
-
-Ако изберете никога да не се използва прокси сървър и винаги да се установява директна връзка, всички други опции се пренебрегват.
-
-В случай че изберете да се използват системните настройки за прокси сървър или той да се открива автоматично, всички други опции се пренебрегват.
-
-Ако изберете ръчни настройки за прокси сървър, можете да посочите допълнителни опции в „Адрес или URL адрес на прокси сървъра“, „URL адрес на .pac файл за прокси сървър“ и „Списък с разделени със запетая правила за заобикаляне на прокси сървъра“.
-
-За подробни примери посетете:
-<ph name="PROXY_HELP_URL" />
-
-Ако активирате тази настройка, <ph name="PRODUCT_NAME" /> пренебрегва всички посочени в командния ред опции във връзка с прокси сървъра.
-
-Незадаването на това правило ще позволи на потребителите да избират сами настройките за прокси сървър.</translation>
 <translation id="4103289232974211388">Пренасочване към доставчик на удостоверителни услуги със SAML след потвърждение от потребителя</translation>
 <translation id="410478022164847452">Посочва периода от време без потребителска активност, след който при работа на променлив ток се предприема съответното действие.
 
@@ -1302,14 +1252,6 @@
 <translation id="5893553533827140852">Ако тази настройка е активирана, заявките за удостоверяване през gnubby ще бъдат пренасочвани през връзка с отдалечен хост.
 
           Ако е деактивирана или не е конфигурирана, заявките за удостоверяване през gnubby няма да се пренасочват.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> и приложенията в ARC ще заобикалят всеки прокси сървър за предоставения тук списък с хостове.
-
-Това правило влиза в сила само ако сте избрали ръчни настройки за прокси сървър в „Изберете как да посочите настройките за прокси сървър“.
-
-Не го задавайте, ако сте избрали друг режим за конфигуриране на правилата за прокси сървър.
-
-За по-подробни примери посетете:
-<ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Разрешаване на изтегляния на автоматични актуализации през HTTP</translation>
 <translation id="5921888683953999946">Задаване на стандартното състояние на функцията за достъпност с голям курсор на екрана за вход.
 
@@ -1788,9 +1730,6 @@
 <translation id="7632724434767231364">Име на библиотеката за GSSAPI</translation>
 <translation id="7635471475589566552">Конфигурира локала на приложенията в <ph name="PRODUCT_NAME" /> и не разрешава на потребителите да го променят. Ако активирате тази настройка, <ph name="PRODUCT_NAME" /> използва посочения локал. Ако той не се поддържа, вместо него се използва „en-US“. Ако настройката е деактивирана или не е зададена, <ph name="PRODUCT_NAME" /> използва предпочитания локал, посочен от потребителя (ако е зададен), системния или резервния локал „en-US“.</translation>
 <translation id="7651739109954974365">Определя дали роумингът за данни трябва да е активиран за устройството. Ако за правилото е зададено „true“, роумингът е разрешен. В случай че е оставено неконфигурирано или е зададено „false“, функцията няма да е налице.</translation>
-<translation id="7667184304362487902">Конфигурира настройките за прокси сървър за <ph name="PRODUCT_NAME" /> и приложенията в ARC.
-
-Това правило още не е готово за употреба. Моля, не го използвайте.</translation>
 <translation id="76810863974142048">URL адрес, откъдето клиентските програми за отдалечен достъп да получат означението си за удостоверяване.
 
 Ако това правило е зададено, хостът за отдалечен достъп ще изисква удостоверяващите се клиентски програми да получат съответното означение от този URL адрес, за да установят връзка. Настройката трябва да се използва заедно с RemoteAccessHostTokenValidationUrl.
@@ -2007,6 +1946,7 @@
 Ако правилото не е зададено, ще се използва „BlockKeygen“ и потребителят ще може да го променя.</translation>
 <translation id="8329984337216493753">Това правило е активно само в режим за търговски експонати. Когато „DeviceIdleLogoutTimeout“ е посочено, правилото дефинира продължителността на предупредителното поле с таймер за обратно отброяване, който се показва на потребителя, преди да се изпълни излизането. Стойността за правилото трябва да се посочва в милисекунди.</translation>
 <translation id="8344454543174932833">Импортиране на отметките от браузъра по подразбиране при първото изпълнение</translation>
+<translation id="8359734107661430198">Активиране на приложния програмен интерфейс (API) ExampleDeprecatedFeature за периода до 02.09.2008 г. включително.</translation>
 <translation id="8360452361555133173">Активирайте показването на приветствената страница при първото стартиране на браузъра след надстройване на операционната система.
 
 Ако за това правило е зададено true или то не е конфигурирано, приветствената страница ще се показва в браузъра при първото му стартиране след надстройване на операционната система.
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb
index 5a4886f..23e8bedc 100644
--- a/components/policy/resources/policy_templates_bn.xtb
+++ b/components/policy/resources/policy_templates_bn.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="bn">
 <translation id="101438888985615157">স্ক্রীনকে ১৮০ ডিগ্রী দ্বারা ঘোরান</translation>
-<translation id="1015272884520659144">সেসব USB ডিভাইসগুলির তালিকা সংজ্ঞায়িত করে যেগুলিকে সরাসরি ওয়েব অ্যাপ্লিকেশানের ভিতরে chrome.usb API এর মাধ্যমে ব্যবহার করার জন্য তাদের কার্নেল ড্রাইভার থেকে বিচ্ছিন্ন করার জন্য অনুমতি দেওয়া হয়। এন্ট্রিগুলি USB ভেন্ডর শনাক্তকারী এবং পণ্য শনাক্তকারীর জোড় যা একটি নির্দিষ্ট হার্ডওয়্যার শনাক্ত করার জন্য ব্যবহৃত হয়।
-
-      এই নীতিটি কনফিগার করা না হলে, বিচ্ছিন্ন করা যায় এমন USB ডিভাইসের তালিকা খালি হিসাবে বিবেচনা করা হয়।</translation>
 <translation id="1017967144265860778">লগইন স্ক্রীণে পাওয়ার ম্যানেজমেন্ট</translation>
 <translation id="1019101089073227242">ব্যবহারকারীর ডেটা ডিরেক্টরি সেট করুন</translation>
 <translation id="1022361784792428773">এক্সটেনশন আইডিগুলি যা ব্যবহারকারীদের ইনস্টল করা থেকে বাধা দেওয়া উচিত (বা সকলের জন্য *)</translation>
@@ -72,14 +69,6 @@
      এই নীতিটি সেট না করা হলে, বা মিথ্যাতে সেট করা থাকলে, TLS এ RC4 সাইফার স্যুট সক্ষম করা হবে না। অন্যথায়, এটি একটি পুরোনো সার্ভারের সাথে সামঞ্জস্য বজায় রাখার জন্য সত্যতে সেট করা যেতে পারে। এটি একটি অস্থায়ী সমাধান এবং সার্ভারটি পুনরায় কনফিগার করা উচিত।</translation>
 <translation id="1297182715641689552">একটি .pac প্রক্সি স্ক্রিপ্ট ব্যবহার করুন</translation>
 <translation id="1304973015437969093">এক্সটেনশান/অ্যাপ আইডিগুলি এবং আপডেট URLগুলি নীরবে ইনস্টল হবে</translation>
-<translation id="1310699457130669094">আপনি এখানে কোনো প্রক্সির .pac ফাইলের একটি URL নির্দিষ্ট করতে পারেন৷
-
-          এই নীতিটি কেবল তখনই প্রভাবী হয় যদি আপনি 'কীভাবে প্রক্সি সার্ভার সেটিংস চয়ন করতে হয়'-এ ম্যানুয়ালি প্রক্সি সেটিংস নির্বাচন করে থাকেন৷
-
-          প্রক্সি নীতি সেট করার জন্য আপনি যদি কোনো অন্য মোড নির্বাচন করে থাকেন তাহলে, আপনার এই নীতিটি সেট নয়-এ ছেড়ে যাওয়া উচিত৷
-
-          বিস্তারিত উদাহরণের জন্য, দেখুন:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">স্ক্রীন অনুজ্বল হওয়ার পরে অথবা স্ক্রীন বন্ধ হয়ে যাওয়ার সাথেসাথেই যখন ব্যবহারকারীর কার্যকলাপ নিরীক্ষণ করা হয় তখন যার দ্বারা স্ক্রীনের অনুজ্বলতার বিলম্বকে পরিমাপ করা হয় তার শতাংশ নির্দিষ্ট করে৷
 
           এই নীতিটি সেট করা থাকলে, স্ক্রীন অনুজ্বল হওয়ার পরে অথবা স্ক্রীন বন্ধ হয়ে যাওয়ার সাথেসাথেই যখন ব্যবহারকারীর কার্যকলাপ নিরীক্ষণ করা হয় তখন যার দ্বারা স্ক্রীনের অনুজ্বলতার বিলম্বকে পরিমাপ করা হয় তার শতাংশ নির্দিষ্ট করে৷ যখন অনুজ্বলতার বিলম্ব স্কেল করা হয়, তখন যেভাবে মূলত করা হয়েছিল সেভাবে অনুজ্বলতা বিলম্ব থেকে একই সময়কাল বজায় রাখতে স্ক্রিনের উজ্জ্বলতা হ্রাস, স্ক্রিন বন্ধ এবং স্ক্রিন লকের বিলম্বগুলিকে সামঞ্জস্য করা হয়৷
@@ -160,18 +149,6 @@
 <translation id="1561424797596341174">দূরবর্তী অ্যাক্সেস হোস্টের ত্রুটিমুক্তকরণ বিল্ডের জন্য নীতি ওভাররাইড</translation>
 <translation id="1583248206450240930">ডিফল্ট ভাবে <ph name="PRODUCT_FRAME_NAME" /> ব্যবহার করুন</translation>
 <translation id="1608755754295374538">এই URLগুলিকে বিজ্ঞপ্তি ছাড়াই অডিও ক্যাপচার ডিভাইসগুলিতে অ্যাক্সেসের অধিকার দেওয়া হবে</translation>
-<translation id="1613574633990410986">আপনাকে <ph name="PRODUCT_NAME" /> এবং ARC-অ্যাপ্লিকেশানগুলি দ্বারা ব্যবহৃত প্রক্সী সার্ভারটি নির্দিষ্ট করার অনুমতি দেয়  এবং ব্যবহারকারীদের প্রক্সী সেটিংস পরিবর্তন করা থেকে আটকায়।
-
-      আপনি যদি কখনই প্রক্সী সার্ভার ব্যবহার না করা চয়ন করেন এবং সর্বদা সরাসরি সংযোগ করেন তবে অন্যান্য সমস্ত বিকল্প উপেক্ষা করা হয়৷
-
-      আপনি যদি প্রক্সী সার্ভারটি স্বয়ংক্রিয়ভাবে সনাক্ত করা বেছে নেন, তবে অন্যান্য সমস্ত বিকল্প উপেক্ষা করা হয়৷
-
-      বিস্তারিত উদাহরণের জন্য, এখানে যান:
-      <ph name="PROXY_HELP_URL" />
-
-      আপনি এই সেটিং সক্ষম করলে, <ph name="PRODUCT_NAME" /> এবং ARC-অ্যাপ্লিকেশানগুলি কমান্ড লাইন থেকে নির্দিষ্ট করা প্রক্সী সংক্রান্ত সমস্ত বিকল্প উপেক্ষা করে।
-
-      এই নীতি সেট না করে ছেড়ে যাওয়া হলে ব্যবহারকারী স্বয়ং প্রক্সী সেটিং চয়ন করতে পারেন৷</translation>
 <translation id="1617235075406854669">ব্রাউজার এবং ডাউনলোড ইতিহাস মুছে ফেলা সক্ষম করুন</translation>
 <translation id="1617384279878333801">প্রোফাইল পরিচালকে ব্যক্তি যোগ করা সক্ষম করে</translation>
 <translation id="1655229863189977773">বাইটে ডিস্ক ক্যাশে আকার সেট করুন</translation>
@@ -257,14 +234,6 @@
       যদি সক্ষমিত থাকে, তাহলে যখন একটি অধিবেশন সক্রিয় এবং স্ক্রীন লক করা নেই তখন সিস্টেম ট্রেতে একটি বড় লাল লগ আউট বোতাম প্রদর্শিত হয়৷
 
       যদি অক্ষমিত থাকে অথবা নির্দিষ্ট করা না থাকে, তাহলে সিস্টেম ট্রেতে কোন বড় লাল লগ আউট বোতাম প্রদর্শিত হয় না৷</translation>
-<translation id="1942957375738056236">আপনি এখানে প্রক্সি সার্ভারের URLটি নির্দিষ্ট করতে পারেন৷
-
-          এই নীতিটি আপনি 'কীভাবে প্রক্সি সার্ভার সেটিংস নির্দিষ্ট করবেন চয়ন করুন'-এ ম্যানুয়াল প্রক্সি সেটিংস নির্বাচন করলে কার্যকর হবে৷
-
-          আপনি প্রক্সি নীতিগুলি সেট করার জন্য অন্য কোনো মোড নির্বাচন করে রাখলে আপনার এই নীতিটি ত্যাগ করা উচিত৷
-
-          আরো বিকল্প এবং বিস্তারিত উদাহরণগুলির জন্য, এখানে যান:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974"><ph name="PRODUCT_OS_NAME" /> এ লগইন স্ক্রীনে পাওয়ার পরিচালনা কনফিগার করে।
 
       যখন কিছু সময়ের জন্য কোনো ব্যবহারকারী কার্যকলাপ থাকে না ও লগইন স্ক্রীন দেখানো হয়, তখন <ph name="PRODUCT_OS_NAME" /> কিভাবে আচরণ করবে এই নীতি তা আপনাকে কনফিগার করতে দিবে। এই নীতি একাধিক সেটিংস নিয়ন্ত্রণ করে। এগুলির স্বতন্ত্র সেমানটিক্স ও মান পরিসরের জন্য অনুরূপ নীতিগুলি দেখুন যেগুলি কোনো সেশনের পাওয়ার পরিচালনা নিয়ন্ত্রণ করে। এই নীতির ব্যতিক্রমগুলি হলো:
@@ -649,24 +618,6 @@
 <translation id="3072847235228302527">একটি ডিভাইস-স্থানীয় অ্যাকাউন্টের জন্য পরিষেবার শর্তাদি সেট করুন</translation>
 <translation id="3096595567015595053">সক্ষম হওয়া প্লাগইনগুলির তালিকা</translation>
 <translation id="3101501961102569744">কীভাবে প্রক্সি সার্ভার সেটিংস নির্দিষ্ট করবেন তা চয়ন করুন</translation>
-<translation id="3125884964575432854">আপনাকে <ph name="PRODUCT_NAME" /> এবং ARC-অ্যাপ্লিকেশানগুলি দ্বারা ব্যবহৃত প্রক্সী সার্ভারটি নির্দিষ্ট করার অনুমতি দেয়  এবং ব্যবহারকারীদের প্রক্সী সেটিংস পরিবর্তন করা থেকে আটকায়।
-
-          আপনি যদি কখনই প্রক্সী সার্ভার ব্যবহার না করা চয়ন করেন এবং সর্বদা সরাসরি সংযোগ করেন তবে অন্যান্য সমস্ত বিকল্প উপেক্ষা করা হয়৷
-
-          আপনি যদি সিস্টেম প্রক্সী সেটিংস ব্যবহার করা চয়ন করেন, তাহলে অন্য সব বিকল্প উপেক্ষা করা হয়।
-
-          আপনি যদি প্রক্সী সার্ভারটি স্বয়ংক্রিয়ভাবে সনাক্ত করা বেছে নেন, তবে অন্যান্য সমস্ত বিকল্প উপেক্ষা করা হয়৷
-
-          আপনি যদি নির্দিষ্ট সার্ভার প্রক্সী মোড চয়ন করেন, তাহলে 'প্রক্সী সার্ভারের ঠিকানা  বা URL' ও 'প্রক্সী বাইপাস বিধির কমা-বিভাজিত তালিকায়' আরো বিকল্প নির্দিষ্ট করতে পারেন। ARC-অ্যাপ্লিকেশানগুলি কেবলমাত্র সর্বোচ্চ অগ্রাধিকারযুক্ত HTTP প্রক্সী সার্ভার ব্যবহার করবে।
-
-          আপনি যদি একটি .pac প্রক্সী স্ক্রিপ্ট ব্যবহার করা চয়ন করেন, তাহলে আপনাকে অবশ্যই ' প্রক্সী .pac ফাইলে URL' এ স্ক্রিপ্টটিতে URL নির্দিষ্ট করতে হবে৷
-
-          বিশদ উদাহরণের জন্য, এখানে দেখুন:
-          <ph name="PROXY_HELP_URL" />
-
-          আপনি এই সেটিং সক্ষম করলে, <ph name="PRODUCT_NAME" /> এবং ARC-অ্যাপ্লিকেশানগুলি কমান্ড লাইন থেকে নির্দিষ্ট করা প্রক্সী সংক্রান্ত সমস্ত বিকল্প উপেক্ষা করে।
-
-          এই নীতিটি সেট না করে ছেড়ে দেওয়া হলে, ব্যবহারকারীদের তাদের নিজস্ব প্রক্সী সেটিংস চয়ন করার অনুমতি দেবে৷</translation>
 <translation id="3153348162326497318">কোনো এক্সটেনশানগুলি ব্যবহারকারীরা ইনস্টল করতে পারে না তা আপনাকে নির্দিষ্ট করার অনুমতি দেয়৷ কালো তালিকাভুক্ত থাকলে ইতিমধ্যে ইনস্টল থাকা এক্সটেনশগুলি সরানো হবে৷ কালো তালিকা মান '*' এর অর্থ হ'ল সমস্ত এক্সটেনশান শ্বেত তালিকায় বর্ণিতভাবে তালিকাবদ্ধ না থাকলে সেগুলি কালো তালিকাভুক্ত থাকে৷ যদি এই নীতিটি সেট না থাকা হিসাবে ছেড়ে দেওয়া থাকে তাহলে ব্যবহারকারী <ph name="PRODUCT_NAME" />-এ যেকোনো এক্সটেনশান ইনস্টল করতে পারবে৷</translation>
 <translation id="316778957754360075"><ph name="PRODUCT_NAME" /> ২৯ সংস্করণে এই সেটিংকে সরানো হয়েছে৷ সংগঠন-হোস্ট করা এক্সটেনশান/অ্যাপ্লিকেশান সংগ্রহগুলির সেট করার প্রস্তাবিত উপায়টি হল ExtensionInstallSources এ যে সাইটটি CRX প্যাকেজগুলি হোস্ট করছে সেটি অন্তর্ভুক্ত করা এবং একটি ওয়েব পৃষ্ঠায় প্যাকেজগুলিতে সরাসরি ডাউনলোড লিঙ্কগুলি রাখা৷ ExtensionInstallForcelist নীতিটি ব্যবহার করে এই ওয়েব পৃষ্ঠাটির জন্য একটি লঞ্চার তৈরি করা যেতে পারে৷</translation>
 <translation id="3185009703220253572"><ph name="SINCE_VERSION" />সংস্করণটি থেকে</translation>
@@ -731,6 +682,7 @@
       যদি এই সেটিংটি সক্ষমিত থাকে বা কনফিগার করা না থাকে তবে ব্যবহারকারী তাদের Google অ্যাকাউন্টটি প্রমাণীকরণের মাধ্যমে মেঘ প্রিন্ট প্রক্সিটি সক্ষম করতে পারে৷
 
       যদি এই সেটিংটি অক্ষমিত থাকে তবে ব্যবহারকারীরা প্রক্সিটি সক্ষম করতে পারে না এবং যন্ত্রটি তার মুদ্রক <ph name="CLOUD_PRINT_NAME" /> এর সাথে শেয়ার করার জন্য অনুমতি দেবে না৷</translation>
+<translation id="3297010562646015826">কার্য পরিচালকে প্রক্রিয়াগুলি সমাপ্ত করা সক্ষম করে</translation>
 <translation id="3322771899429619102">আপনাকে url প্যাটার্নের একটি তালিকা সেট করার মঞ্জুরি দেয় যা এমন সাইটগুলিকে নির্দিষ্ট করে যেগুলি কী তৈরি করা ব্যবহার করার জন্য মঞ্জুরিপ্রাপ্ত। যদি কোনো url প্যাটার্ন 'KeygenBlockedForUrls' এ থাকে, তাহলে সেটি এসব ব্যতিক্রমকে ওভারারইড করে।
 
           যদি এই নীতিটি সেট না করে ছেড়ে যাওয়া হয়, তাহলে গ্লোবাল ডিফল্ট মান সব সাইটগুলির জন্য ব্যবহার করা হবে আর যদি 'DefaultKeygenSetting' নীতি সেট করা হয় তাহলে তার থেকে ব্যবহার করা হবে, নয়তো ব্যবহারকারীদের ব্যক্তিগত কনফিগারেশান থেকে।</translation>
@@ -914,22 +866,6 @@
           এই নীতি যদি ‘অধিবেশন সময়ের জন্য কুকিজ রাখুন’ এ সেট করা থাকে, তাহলে অধিবেশন শেষ হলে কুকিজ সাফ করা হবে। মনে রাখবেন যে, যদি <ph name="PRODUCT_NAME" /> ‘পটভূমি মোডে’ চলমান থাকে তাহলে সর্বশেষ উইন্ডো বন্ধ হওয়ার সময় অধিবেশন বন্ধ না হতে পারে। এই আচরণ কনফিগার করা সম্পর্কে আরো তথ্যের জন্য দয়া করে 'পটভূমি মোড সক্ষম হয়েছে' নীতি দেখুন।
 
           এই নীতিটি সেট না করে রাখা হলে, 'কুকিজ মঞ্জুর করুন' ব্যবহার করা হবে এবং ব্যবহারকারী এটি পরিবর্তন করতে সক্ষম হবে।</translation>
-<translation id="4098957623809244159">এই নীতিটি থামানো হয়েছে, এর পরিবর্তে ProxyMode ব্যবহার করুন।
-
-          আপনাকে <ph name="PRODUCT_NAME" /> এবং ARC-অ্যাপ্লিকেশান দ্বারা ব্যবহৃত প্রক্সী সার্ভারটি নির্দিষ্ট করার অনুমতি দেয় এবং ব্যবহারকারীদের প্রক্সী সেটিংস পরিবর্তন করা থেকে আটকায়।
-
-          আপনি কখনই একটি প্রক্সী সার্ভার ব্যবহার না করা চয়ন করলে এবং সর্বদা সরাসরি সংযোগ করলে, অন্য সব বিকল্প উপেক্ষা করা হয়।
-
-          আপনি যদি সিস্টেম প্রক্সী সেটিংস বা প্রক্সী সার্ভার স্বয়ংক্রিয় সনাক্ত করা ব্যবহার করার জন্য চয়ন করেন, তাহলে অন্য সব বিকল্প উপেক্ষা করা হয়।
-
-          আপনি ম্যানুয়াল প্রক্সী সেটিংস নির্বাচন করলে, আপনি 'প্রক্সী সার্ভারের ঠিকানা বা URL', 'কোনো প্রক্সী .pac ফাইলের URL' এবং 'প্রক্সী বাইপাস বিধির কমা-বিভাজিত তালিকায়' আপনি আরো বিকল্প নির্দিষ্ট করে দিতে পারেন। 
-
-          বিশদ উদাহরণের জন্য, এখানে দেখুন:
-          <ph name="PROXY_HELP_URL" />
-
-          আপনি এই সেটিংটি সক্ষম করলে, কমান্ড লাইন থেকে নির্দিষ্ট করা প্রক্সী সংক্রান্ত সমস্ত বিকল্প <ph name="PRODUCT_NAME" /> উপেক্ষা করে।
-
-          এই নীতি সেট না করে ছেড়ে যাওয়া হলে, ব্যবহারকারীরা তাদের নিজস্ব প্রক্সী সেটিংস চয়ন করার অনুমতি পাবে।</translation>
 <translation id="4103289232974211388">ব্যবহারকারির নিশ্চিতকরণের পরে SAML IdP এ পুনঃর্নির্দেশ করে</translation>
 <translation id="410478022164847452">ব্যবহারকারীর ইনপুট ছাড়াই সময়কাল নির্দিষ্ট করে, তারপর AC শক্তি চলতে থাকলেও নিষ্ক্রিয়তা ক্রিয়া শুরু হয়ে যায়৷
 
@@ -1407,14 +1343,6 @@
 <translation id="5893553533827140852">যদি এই সেটিং সক্ষম করা থাকে, তাহলে একটি দূরবর্তী হোস্ট সংযোগ জুড়ে gnubby প্রমাণীকরণের অনুরোধগুলির প্রক্সি করা হবে৷
 
           যদি এই সেটিং অক্ষম করা থাকে অথবা কনফিগার করা না থাকে, তাহলে gnubby প্রমাণীকরণের অনুরোধগুলির প্রক্সি করা হবে না৷</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> ও ARC-অ্যাপ্লিকেশানগুলি এখানে দেওয়া হোস্টের তালিকার যেকোনো প্রক্সীকে বাইপাস করবে৷
-
-          আপনি যদি 'কীভাবে প্রক্সী সার্ভার সেটিংস নির্দিষ্ট করতে চান' এ ম্যানুয়াল প্রক্সী সেটিংস নির্বাচন করেন, কেবল তাহলেই এই নীতিটি কার্যকর হয়৷
-
-          আপনি যদি প্রক্সী নীতি সেট করার অন্য কোনো মোড নির্বাচন করেন, তাহলে এই নীতিটি সেট না করে ছেড়ে দেওয়া ঠিক হবে৷
-
-          বিশদ উদাহরণের জন্য, এখানে দেখুন:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">HTTP এর মাধ্যমে স্বতঃআপডেট ডাউনলোড করার মঞ্জুরি দিন</translation>
 <translation id="5921888683953999946">লগইন স্ক্রীনে বড় কার্সার অ্যাক্সেসযোগ্যতার বৈশিষ্ট্যের ডিফল্ট স্থিতি সেট করে৷
 
@@ -1928,9 +1856,6 @@
 <translation id="7632724434767231364">GSSAPI লাইব্রেরি নাম</translation>
 <translation id="7635471475589566552"><ph name="PRODUCT_NAME" />-এ অ্যাপ্লিকেশান লোকেলকে কনফিগার করে এবং ব্যবহারকারীদের লোকেল পরিবর্তন করা থেকে আটকায়৷ আপনি এই সেটিং সক্ষম করলে, <ph name="PRODUCT_NAME" /> নির্দিষ্ট করা লোকেলকে ব্যবহার করে৷ কনফিগার করা লোকেল সমর্থিত না হলে, পরিবর্তে 'en-US' ব্যবহৃত হয়৷ এই সেটিং অক্ষম বা সেট না থাকলে, <ph name="PRODUCT_NAME" /> ব্যবহারকারী-নির্দিষ্ট পছন্দসই লোকেল (যদি কনফিগার করা থাকে), সিস্টেম লোকেল অথবা ফলব্যাক লোকেল 'en-US'-এর মধ্যে একটিকে ব্যবহার করে৷</translation>
 <translation id="7651739109954974365">ডিভাইসের জন্য ডেটা বিচরণ ঠিক কিনা সিদ্ধান্ত নিন. যদি সত্যতে সেট করতে চান, ডেটা বিচরণ অনুমোদিত৷ যদি অকনফিগার ছাড়া থাকে বা সেট ভুয়ো হয়, ডেটা বিচরণ উপলব্ধ হবে না৷</translation>
-<translation id="7667184304362487902"><ph name="PRODUCT_NAME" /> ও ARC-অ্যাপ্লিকেশানগুলির জন্য প্রক্সী সেটিংস কনফিগার করে।
-
-      এই নীতিটি এখনও পর্যন্ত ব্যবহারের জন্য প্রস্তুত হয়নি, দয়া করে এটিকে ব্যবহার করবেন না।</translation>
 <translation id="76810863974142048">দূরবর্তী অ্যাক্সেস ক্লায়েন্টদেরকে যেখান থেকে তাদের প্রমাণীকরণ টোকেন সংগ্রহ করতে হবে সেই URL।
 
          এই নীতিটি সেট করা থাকলে, সংযোগ করার জন্য এই URL থেকে একটি প্রমাণীকরণ টোকেন সংগ্রহ করতে দূরবর্তী অ্যাক্সেস হোস্টের ক্লায়েন্টদের প্রমাণীকরণ করার প্রয়োজন হবে। অবশ্যই RemoteAccessHostTokenValidationUrl সহ ব্যবহার করতে হবে।
@@ -2160,6 +2085,7 @@
 
       নীতি মান সময়, মিলিসেকেন্ডে নির্দিষ্ট করা উচিত৷</translation>
 <translation id="8344454543174932833">প্রথমবার চালনার সাথে সাথে ডিফল্ট ব্রাউজার থেকে বুকমার্কগুলি আমদানি করুন</translation>
+<translation id="8359734107661430198">২০০৮/০৯/০২ এর মধ্যের ExampleDeprecatedFeature API সক্ষম করুন</translation>
 <translation id="8360452361555133173">OS আপগ্রেডের পরে প্রথম বার ব্রাউজার লঞ্চ হওয়ার সময় স্বাগত পাতা দেখানো সক্ষম করে।
 
       যদি এই নীতিটি সত্যতে সেট করা হয় বা কনফিগার না করা হয়, তাহলে ব্রাউজার একটি OS আপগ্রেডের পরে প্রথম লঞ্চের সময় পুনরায় স্বাগত পৃষ্ঠা প্রদর্শন করবে।
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb
index b1a67a3b3..f598eedc 100644
--- a/components/policy/resources/policy_templates_ca.xtb
+++ b/components/policy/resources/policy_templates_ca.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ca">
 <translation id="101438888985615157">Gira la pantalla 180 graus</translation>
-<translation id="1015272884520659144">Defineix la llista de dispositius USB que està permès separar del programa de control de kernel per tal d'utilitzar-los mitjançant l'API de chrome.usb directament dins d'una aplicació web. Les entrades són parells de l'identificador del producte i de l'identificador del proveïdor dels USB, que permeten identificar un maquinari concret.
-
-      Si aquesta política no està configurada, la llista de dispositius USB que es poden separar es considera buida.</translation>
 <translation id="1017967144265860778">Gestió de l'alimentació a la pantalla d'inici de sessió</translation>
 <translation id="1019101089073227242">Estableix el directori de dades de l'usuari</translation>
 <translation id="1022361784792428773">ID de les extensions que l'usuari no pot instal·lar (o bé * per a totes)</translation>
@@ -65,7 +62,6 @@
       Si la política no s'estableix o s'estableix en "false", els sistemes de xifratge RC4 de TLS no s'activaran. En cas contrari, es pot establir en "true" per conservar la compatibilitat amb un servidor obsolet. Es tracta d'una mesura temporal i el servidor s'ha de tornar a configurar.</translation>
 <translation id="1297182715641689552">Fes servir un script de servidor intermediari .pac</translation>
 <translation id="1304973015437969093">Identificadors de les extensions i de les aplicacions i URL de les actualitzacions que s'instal·laran en silenci</translation>
-<translation id="1310699457130669094">Podeu especificar un URL a un fitxer .pac del servidor intermediari. Aquesta política només té efecte si heu seleccionat la configuració manual del servidor intermediari a "Triar la manera d'especificar la configuració del servidor intermediari". No heu de definir aquesta política si heu seleccionat alguna altra manera de definir les polítiques del servidor intermediari. Per obtenir exemples més detallats, visiteu: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Especifica el percentatge d'ajust del temps d'espera d'inactivitat de la pantalla quan s'observa l'activitat de l'usuari amb la pantalla atenuada o poc després de desactivar-la.
 
          Si s'estableix aquesta política, s'especifica el percentatge d'ajust del temps d'espera d'inactivitat de la pantalla quan s'observa l'activitat de l'usuari amb la pantalla atenuada o poc després de desactivar-la. Quan s'ajusta el temps d'espera d'inactivitat de la pantalla, s'ajusten els retards de desconnexió, bloqueig i desactivació de la pantalla per mantenir les mateixes distàncies del temps d'espera d'inactivitat de la pantalla que la configuració original.
@@ -146,18 +142,6 @@
 <translation id="1561424797596341174">La política substitueix les compilacions de depuració de l'amfitrió d'accés remot</translation>
 <translation id="1583248206450240930">Fes servir <ph name="PRODUCT_FRAME_NAME" /> de manera predeterminada</translation>
 <translation id="1608755754295374538">URL als quals els dispositius de captura d'àudio podran accedir sense confirmació.</translation>
-<translation id="1613574633990410986">Us permet especificar el servidor intermediari que <ph name="PRODUCT_NAME" /> i les aplicacions ARC utilitzen. A més, impedeix que els usuaris canviïn la configuració del servidor.
-
-      Si decidiu no utilitzar mai un servidor intermediari i connectar-vos sempre a la xarxa directament, la resta d'opcions s'ignoren.
-
-      Si decidiu detectar automàticament el servidor intermediari, la resta d'opcions s'ignoren.
-
-      Per veure exemples detallats, aneu a:
-      <ph name="PROXY_HELP_URL" />
-
-      Si activeu aquesta opció de configuració, <ph name="PRODUCT_NAME" /> i les aplicacions ARC ignoren totes les opcions relacionades amb el servidor intermediari que s'han especificat des de la línia d'ordres.
-
-      Si deixeu aquestes polítiques sense establir, els usuaris poden triar pel seu compte la configuració del servidor intermediari.</translation>
 <translation id="1617235075406854669">Activa la supressió de l'historial de baixades i del navegador</translation>
 <translation id="1617384279878333801">Permet que s'utilitzi l'opció Afegeix una persona al gestor de perfils</translation>
 <translation id="1655229863189977773">Defineix la mida de la memòria cau del disc en bytes</translation>
@@ -242,7 +226,6 @@
 Si aquesta opció està activada, es mostra un botó gran i vermell de tancament de sessió a la safata del sistema mentre hi ha una sessió activa i la pantalla no està bloquejada.
 
 Si aquesta opció està desactivada o no especificada, no apareix cap botó gran i vermell de tancament de sessió a la safata del sistema.</translation>
-<translation id="1942957375738056236">Podeu especificar l'URL del servidor intermediari. Aquesta política només té efecte si s'ha seleccionat la configuració manual del servidor intermediari a "Tria la manera d'especificar la configuració del servidor intermediari". No heu de definir aquesta política si s'ha seleccionat cap altra manera de definir les polítiques del servidor intermediari. Per obtenir més opcions i exemples detallats, visiteu: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Configuració de la gestió d'energia a la pantalla d'inici de <ph name="PRODUCT_OS_NAME" />
 
       Aquesta política us permet configurar de quina manera es comporta <ph name="PRODUCT_OS_NAME" /> quan no hi ha activitat de l'usuari durant un temps determinat quan es mostra la pantalla d'inici. La política controla diversos paràmetres. Per conèixer la semàntica i els intervals de valors, consulteu les polítiques corresponents que controlen la gestió d'energia d'una sessió. Les úniques desviacions d'aquestes polítiques són les següents:
@@ -606,24 +589,6 @@
 <translation id="3072847235228302527">Defineix els Termes i condicions d'un compte local del dispositiu</translation>
 <translation id="3096595567015595053">Llista dels connectors activats</translation>
 <translation id="3101501961102569744">Tria com vols especificar la configuració del servidor intermediari</translation>
-<translation id="3125884964575432854">Us permet especificar el servidor intermediari que <ph name="PRODUCT_NAME" /> i les aplicacions ARC utilitzen. A més, impedeix que els usuaris canviïn la configuració del servidor.
-
-          Si decidiu no utilitzar mai un servidor intermediari i connectar-vos sempre a la xarxa directament, la resta d'opcions s'ignoren.
-
-          Si decidiu utilitzar la configuració del servidor intermediari del sistema, la resta d'opcions s'ignoren.
-
-          Si decidiu detectar automàticament el servidor intermediari, la resta d'opcions s'ignoren.
-
-          Si trieu el mode de servidor intermediari fix, podeu especificar més opcions a Adreça o URL del servidor intermediari i a Llista de regles d'evitació de servidors intermediaris separada per comes. Les aplicacions ARC només utilitzen el servidor intermediari HTTP amb la prioritat més alta.
-
-          Si decidiu utilitzar un script de servidor intermediari .pac, heu d'especificar l'URL a l'script que hi ha a URL d'un fitxer .pac d'un servidor intermediari.
-
-          Per veure exemples detallats, aneu a:
-          <ph name="PROXY_HELP_URL" />
-
-          Si activeu aquesta opció de configuració, <ph name="PRODUCT_NAME" /> i les aplicacions ARC ignoren totes les opcions relacionades amb el servidor intermediari que s'han especificat des de la línia d'ordres.
-
-          Si deixeu aquesta política sense establir, els usuaris poden triar pel seu compte la configuració del servidor intermediari.</translation>
 <translation id="3153348162326497318">Us permet especificar quines extensions NO poden instal·lar els usuaris. Les extensions ja instal·lades s'eliminaran si apareixen a la llista negra. Un valor de llista negra de "*" significa que totes les extensions apareixen a la llista negra llevat que apareguin explícitament a la llista blanca. Si no s'ha definit aquesta política, l'usuari podrà instal·lar qualsevol extensió a <ph name="PRODUCT_NAME" />.</translation>
 <translation id="316778957754360075">Aquesta versió no està disponible des de la versió 29 de <ph name="PRODUCT_NAME" />. La manera recomanada de definir col·leccions d'aplicacions/extensions allotjades per una organització és incloure el lloc que allotja els paquets CRX a ExtensionInstallSources i col·locar enllaços de baixada directa als paquets en una pàgina web. Es pot crear un menú d'aplicacions per a la pàgina web mitjançant la política ExtensionInstallForcelist.</translation>
 <translation id="3185009703220253572">des de la versió <ph name="SINCE_VERSION" /></translation>
@@ -688,6 +653,7 @@
 Si s'activa aquest paràmetre o si no es configura, els usuaris podran activar el servidor intermediari d'impressió al núvol en autenticar-se amb el seu compte de Google.
 
 Si es desactiva aquest paràmetre, els usuaris no podran activar el servidor intermediari i l'ordinador no podrà compartir les seves impressores amb <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Activa la finalització de processos al gestor de tasques</translation>
 <translation id="3322771899429619102">Us permet definir una llista de patrons d'URL que especifiquin els llocs que estan autoritzats a utilitzar la generació de claus. Si un patró d'URL està configurat com a "KeygenBlockedForUrls", la política substitueix aquestes excepcions.
 
 
@@ -852,22 +818,6 @@
           Si aquesta política s'estableix en Conserva les galetes mentre duri la sessió, les galetes s'esborraran quan es tanqui la sessió. Tingueu en compte que, si <ph name="PRODUCT_NAME" /> s'executa en mode de segon pla, és possible que la sessió no es tanqui en tancar l'última finestra. Consulteu la política "BackgroundModeEnabled" per obtenir més informació sobre com es configura aquest comportament.
 
           Si aquesta política no s'estableix, s'utilitzarà "AllowCookies" i l'usuari podrà canviar-la.</translation>
-<translation id="4098957623809244159">Aquesta política està obsoleta; substituïu-la per ProxyMode.
-
-          Us permet especificar el servidor intermediari que <ph name="PRODUCT_NAME" /> i les aplicacions ARC utilitzen. A més, impedeix que els usuaris canviïn la configuració del servidor.
-
-          Si decidiu no utilitzar mai un servidor intermediari i connectar-vos sempre a la xarxa directament, la resta d'opcions s'ignoren.
-
-          Si decidiu detectar automàticament el servidor intermediari o utilitzar-ne la configuració del sistema, la resta d'opcions s'ignoren.
-
-          Si trieu manualment la configuració del servidor intermediari, podeu especificar més opcions a Adreça o URL del servidor intermediari, a URL d'un fitxer .pac d'un servidor intermediari i a Llista de regles d'evitació de servidors intermediaris separada per comes.
-
-          Per veure exemples detallats, aneu a:
-          <ph name="PROXY_HELP_URL" />
-
-          Si activeu aquesta opció de configuració, <ph name="PRODUCT_NAME" /> ignora totes les opcions relacionades amb el servidor intermediari que s'han especificat des de la línia d'ordres.
-
-          Si deixeu aquesta política sense establir, els usuaris poden triar pel seu compte la configuració del servidor intermediari.</translation>
 <translation id="4103289232974211388">Redirigeix al proveïdor d'identitat SAML després de la confirmació de l'usuari</translation>
 <translation id="410478022164847452">Indica el temps sense activitat per part de l'usuari després del qual es duu a terme l'acció d'inactivitat quan el dispositiu funciona amb alimentació.
 
@@ -1295,14 +1245,6 @@
 <translation id="5893553533827140852">Si s'activa aquesta opció de configuració, les sol·licituds d'autenticació Gnubby s'enviaran per un servidor intermediari a través d'una connexió d'amfitrió remot.
 
           Si es desactiva o no es configura aquesta opció, les sol·licituds d'autenticació Gnubby s'enviaran per un servidor intermediari.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> i les aplicacions ARC evitaran qualsevol servidor intermediari de la llista d'amfitrions proporcionada.
-
-          Aquesta política només té efecte si heu seleccionat la configuració manual del servidor intermediari a Tria com vols especificar la configuració del servidor intermediari.
-
-          Deixeu-la sense establir si heu seleccionat qualsevol altra manera per establir les polítiques del servidor intermediari.
-
-          Per veure exemples més detallats, aneu a:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Permet les baixades d'actualització automàtica mitjançant HTTP</translation>
 <translation id="5921888683953999946">Establiu l'estat predeterminat de la funció d'accessibilitat del cursor gran a la pantalla d'inici de sessió.
 
@@ -1789,9 +1731,6 @@
 <translation id="7632724434767231364">Nom de la biblioteca GSSAPI</translation>
 <translation id="7635471475589566552">Defineix la configuració regional de les aplicacions a <ph name="PRODUCT_NAME" /> i impedeix que els usuaris la modifiquin. Si activeu aquest paràmetre, <ph name="PRODUCT_NAME" /> fa servir la configuració regional especificada. Si aquesta configuració regional no és compatible, es fa servir "en-US" en lloc seu. Si aquest paràmetre està desactivat o bé si no està configurat, <ph name="PRODUCT_NAME" /> fa servir la configuració regional preferida que hagi especificat l'usuari (en cas que n'hagi configurat cap), la configuració regional del sistema o bé la configuració regional alternativa "en-US".</translation>
 <translation id="7651739109954974365">Determina si cal activar la itinerància de dades per al dispositiu. Si es defineix a «true» (cert), es permet la itinerància de dades. Si es deixa sense configurar o es defineix a «false» (fals), la itinerància de dades no estarà disponible.</translation>
-<translation id="7667184304362487902">Configura el servidor intermediari per a <ph name="PRODUCT_NAME" /> i per a les aplicacions ARC.
-
-      Aquesta política encara no està llesta; no la feu servir.</translation>
 <translation id="76810863974142048">URL on els clients d'accés remot han d'obtenir el testimoni d'autenticació.
 
           Si s'estableix aquesta política, l'amfitrió d'accés remot requerirà que els clients que es vulguin autenticar obtinguin un testimoni d'autenticació d'aquest URL per connectar-se. Cal utilitzar la política juntament amb la política RemoteAccessHostTokenValidationUrl.
@@ -2005,6 +1944,7 @@
 
       El valor de la política s'ha d'especificar en mil·lisegons.</translation>
 <translation id="8344454543174932833">Importació de les adreces d'interès des del navegador predeterminat en la primera execució</translation>
+<translation id="8359734107661430198">Activa l'API de ExampleDeprecatedFeature fins al 02/09/2008</translation>
 <translation id="8360452361555133173">Activa que es mostri la pàgina de benvinguda la primera vegada que s'inicia el navegador després d'actualitzar el sistema operatiu.
 
       Si aquesta política s'estableix en "true" o no es configura, el navegador tornarà a mostrar la pàgina de benvinguda la primera vegada que s'iniciï després d'actualitzar el sistema operatiu.
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb
index 7c6f135..4f226cc 100644
--- a/components/policy/resources/policy_templates_cs.xtb
+++ b/components/policy/resources/policy_templates_cs.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="cs">
 <translation id="101438888985615157">Otočit obrazovku o 180 stupňů</translation>
-<translation id="1015272884520659144">Definuje seznam zařízení USB, která lze odpojit od ovladače jádra a použít přímo ve webové aplikaci prostřednictvím rozhraní chrome.usb API. Hodnotami jsou páry identifikátorů (dodavatel a produkt), které příslušné hardwarové zařízení popisují.
-
-Pokud tato zásada není nastavena, seznam odpojitelných zařízení USB se považuje za prázdný.</translation>
 <translation id="1017967144265860778">Správa možností napájení na přihlašovací obrazovce</translation>
 <translation id="1019101089073227242">Nastavit adresář uživatelských dat</translation>
 <translation id="1022361784792428773">ID rozšíření, která by uživatelé neměli instalovat (* znamená, že se černá listina týká všech rozšíření)</translation>
@@ -71,14 +68,6 @@
       Pokud tato zásada není nastavena nebo je nastavena na hodnotu false, v protokolu TLS nebudou povoleny šifrovací sady RC4. Nastavením této zásady na hodnotu true je možné zajistit kompatibilitu se zastaralým serverem. Toto nastavení by však mělo být použito pouze jako dočasné nouzové opatření a server by měl být překonfigurován.</translation>
 <translation id="1297182715641689552">Použít skript proxy serveru ve formátu PAC</translation>
 <translation id="1304973015437969093">ID aplikací/rozšíření a adresy URL aktualizací, které se mají nainstalovat na pozadí</translation>
-<translation id="1310699457130669094">Zde můžete zadat adresu URL souboru PAC proxy serveru.
-
-          Tato zásada bude použita pouze v případě, že jste v části „Zvolte způsob konfigurace nastavení proxy serveru“ zvolili ruční nastavení proxy serveru.
-
-          Pokud jste vybrali jiný režim nastavení zásad proxy serveru, neměli byste tuto zásadu nastavovat.
-
-          Podrobné příklady naleznete na následující adrese:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Určuje, o kolik procent bude prodloužena prodleva ztmavení obrazovky, když je v případě ztmavené obrazovky nebo záhy po vypnutí obrazovky zaznamenána aktivita uživatele.
 
 Pokud je tato zásada nastavena, udává procento, o které bude prodloužena prodleva ztmavení obrazovky, když je v případě ztmavené obrazovky nebo záhy po vypnutí obrazovky zaznamenána aktivita uživatele. Při prodloužení prodlevy ztmavení budou prodlouženy i prodlevy vypnutí, uzamčení obrazovky a nečinnosti tak, aby mezi nimi a prodlevou ztmavení zůstala stejná doba.
@@ -152,18 +141,6 @@
 <translation id="1561424797596341174">Přepsání zásad pro ladicí sestavení hostitele vzdáleného přístupu</translation>
 <translation id="1583248206450240930">Ve výchozím nastavení používat plugin <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="1608755754295374538">Adresy URL, kterým bude udělen přístup pro záznam zvuku bez zobrazení výzvy</translation>
-<translation id="1613574633990410986">Umožňuje zadat proxy server, který budou prohlížeč <ph name="PRODUCT_NAME" /> a aplikace ARC používat, a brání uživatelům ve změně nastavení proxy serveru.
-
-      Pokud zvolíte, že proxy server nikdy používat nechcete a chcete se vždy připojovat přímo, všechny další možnosti budou ignorovány.
-
-      Pokud zvolíte, že se má proxy server zjistit automaticky, všechny další možnosti budou ignorovány.
-
-      Podrobné příklady naleznete na následující stránce:
-      <ph name="PROXY_HELP_URL" />
-
-      Pokud toto nastavení aktivujete, prohlížeč <ph name="PRODUCT_NAME" /> a aplikace ARC budou ignorovat veškeré možnosti související s proxy serverem zadané na příkazovém řádku.
-
-      Pokud tyto zásady ponecháte nenastavené, uživatelé budou moci zvolit vlastní nastavení proxy serveru.</translation>
 <translation id="1617235075406854669">Aktivovat smazání historie prohlížeče a stahování</translation>
 <translation id="1617384279878333801">Povolit přidání uživatele ve správci profilů</translation>
 <translation id="1655229863189977773">Nastavit velikost diskové mezipaměti v bajtech</translation>
@@ -250,14 +227,6 @@
       Pokud je tato zásada aktivovaná, na hlavním panelu systému se v případě, že je relace aktivní a obrazovka není uzamčená, zobrazí velké červené tlačítko pro odhlášení.
 
       Pokud je tato zásada deaktivovaná nebo není nastavená, velké červené tlačítko pro odhlášení se na hlavním panelu systému nezobrazí.</translation>
-<translation id="1942957375738056236">Zde můžete zadat adresu URL proxy serveru.
-
-          Tato zásada bude použita pouze v případě, že jste v části „Zvolte způsob konfigurace nastavení proxy serveru“ zvolili ruční nastavení proxy serveru. 
-
-          Pokud jste pro nastavení zásad proxy zvolili jakýkoliv jiný režim, neměli byste tuto zásadu nastavovat.
-
-          Další možnosti a podrobné příklady naleznete na následující adrese:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Umožňuje konfigurovat na přihlašovací obrazovce systému <ph name="PRODUCT_OS_NAME" /> řízení spotřeby.
 
       Tato zásada umožňuje nakonfigurovat chování systému <ph name="PRODUCT_OS_NAME" /> v případech, kdy je zobrazena přihlašovací obrazovka a uživatel po určitou dobu neprovádí žádnou činnost. Tato zásada řídí několik nastavení. Jejich individuální sémantika a rozsahy hodnot se řídí odpovídajícími zásadami pro řízení spotřeby v rámci relace. Oproti těmto zásadám platí u této zásady následující odlišnosti:
@@ -633,24 +602,6 @@
 <translation id="3072847235228302527">Nastavit smluvní podmínky pro účet v zařízení</translation>
 <translation id="3096595567015595053">Seznam aktivovaných pluginů</translation>
 <translation id="3101501961102569744">Zvolit způsob konfigurace nastavení proxy serveru</translation>
-<translation id="3125884964575432854">Umožňuje zadat proxy server, který budou prohlížeč <ph name="PRODUCT_NAME" /> a aplikace ARC používat, a brání uživatelům ve změně nastavení proxy serveru.
-
-          Pokud zvolíte, že proxy server nikdy používat nechcete a chcete se vždy připojovat přímo, všechny další možnosti budou ignorovány.
-
-          Pokud zvolíte, že chcete použít systémové nastavení proxy serveru, všechny další možnosti budou ignorovány.
-
-          Pokud zvolíte, že chcete nastavení proxy serveru zjistit automaticky, všechny další možnosti budou ignorovány.
-
-          Pokud zvolíte režim proxy s pevně daným serverem, můžete v zásadách „Adresa (nebo adresa URL) proxy serveru“ a „Seznam pravidel vynechání proxy serveru oddělených čárkami“ zadat další možnosti. Aplikace ARC budou používat pouze proxy server HTTP s nejvyšší prioritou.
-
-          Pokud zvolíte, že chcete používat skript .pac proxy serveru, musíte v zásadě Adresa URL souboru PAC proxy serveru zadat adresu URL skriptu.
-
-          Podrobné příklady naleznete na následující stránce:
-          <ph name="PROXY_HELP_URL" />
-
-          Pokud toto nastavení aktivujete, prohlížeč <ph name="PRODUCT_NAME" /> a aplikace ARC budou ignorovat veškeré možnosti související s proxy serverem zadané na příkazovém řádku.
-
-          Pokud tato zásada nebude nastavena, uživatelé budou moci nastavení proxy serveru zvolit sami.</translation>
 <translation id="3153348162326497318">Umožňuje určit rozšíření, která uživatelé NEMOHOU nainstalovat. Pokud se na seznamu zakázaných vyskytne rozšíření, které již bylo nainstalováno, bude odebráno.
 
           Pokud je na seznamu zakázaných rozšíření uvedena hodnota *, znamená to, že jsou zakázána všechna rozšíření, která nejsou explicitně uvedena na seznamu povolených rozšíření.
@@ -723,6 +674,7 @@
       Pokud je toto nastavení aktivované nebo není nakonfigurované, mohou uživatelé proxy server pro tisk z cloudu aktivovat ověřením pomocí účtu Google.
 
       Pokud je toto nastavení deaktivováno, uživatelé proxy server nebudou moci aktivovat a počítač nebude moci sdílet připojené tiskárny se službou <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Umožňuje ukončování procesů ve Správci úloh</translation>
 <translation id="3322771899429619102">Umožňuje nastavit seznam vzorů adres URL webových stránek, které mají povoleno generovat klíče. Vzory adres URL uvedené v zásadě KeygenBlockedForUrls tyto výjimky přepíšou.
 
 Pokud tuto zásadu nenastavíte, použije se pro všechny webové stránky globální výchozí hodnota buď ze zásady DefaultKeygenSetting (pokud je nastavena), nebo z osobního nastavení uživatele.</translation>
@@ -900,22 +852,6 @@
 Pokud je tato zásada nastavena na možnost Uchovat soubory cookie po dobu trvání relace, po ukončení relace budou soubory cookie vymazány. Pokud je prohlížeč <ph name="PRODUCT_NAME" /> spuštěn na pozadí, relace se po zavření okna nemusí ukončit. Další informace o konfiguraci tohoto chování naleznete v podrobnostech o zásadě BackgroundModeEnabled.
 
 Není-li zásada nastavena, bude použita zásada AllowCookies a uživatelé ji budou moci změnit.</translation>
-<translation id="4098957623809244159">Podpora této zásady byla ukončena, použijte místo ní zásadu ProxyMode.
-
-          Umožňuje zadat proxy server, který budou prohlížeč <ph name="PRODUCT_NAME" /> a aplikace ARC používat, a brání uživatelům ve změně nastavení proxy serveru.
-
-          Pokud zvolíte, že proxy server nikdy používat nechcete a chcete se vždy připojovat přímo, všechny další možnosti budou ignorovány.
-
-          Pokud zvolíte, že chcete použít systémové nastavení proxy serveru nebo jej zjistit automaticky, všechny další možnosti budou ignorovány.
-
-          Pokud zvolíte ruční nastavení proxy serveru, můžete v zásadách „Adresa (nebo adresa URL) proxy serveru“ a „Seznam pravidel vynechání proxy serveru oddělených čárkami“ zadat další možnosti.
-
-          Podrobné příklady naleznete na následující stránce:
-          <ph name="PROXY_HELP_URL" />
-
-          Pokud toto nastavení aktivujete, prohlížeč <ph name="PRODUCT_NAME" /> bude ignorovat veškeré možnosti související s proxy serverem zadané na příkazovém řádku.
-
-          Pokud tato zásada nebude nastavena, uživatelé budou moci nastavení proxy serveru zvolit sami.</translation>
 <translation id="4103289232974211388">Po potvrzení uživatele přesměrovat na poskytovatele identity SAML</translation>
 <translation id="410478022164847452">Udává dobu nečinnosti uživatele, po které bude při napájení ze sítě provedena úsporná akce.
 
@@ -1394,14 +1330,6 @@
 <translation id="5893553533827140852">Pokud je toto nastavení povoleno, žádosti gnubby o ověření budou zprostředkovány přes připojení ke vzdálenému hostiteli.
 
           Pokud je toto nastavení zakázáno nebo není nakonfigurováno, žádosti gnubby o ověření nebudou zprostředkovány.</translation>
-<translation id="5900959132054596599">U hostitelů v tomto seznamu prohlížeč <ph name="PRODUCT_NAME" /> a aplikace ARC obejdou všechny proxy servery.
-
-          Tato zásada bude použita pouze v případě, že jste v zásadě „Zvolit způsob konfigurace nastavení proxy serveru“ zvolili ruční nastavení.
-
-          Pokud jste vybrali jiný režim nastavení zásad proxy serveru, tuto zásadu byste nastavovat neměli.
-
-          Další podrobné příklady naleznete na následující stránce:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Povolení stahování automatických aktualizací prostřednictvím protokolu HTTP</translation>
 <translation id="5921888683953999946">Nastavuje výchozí stav funkce usnadnění přístupu pomocí velkého kurzoru na přihlašovací obrazovce.
 
@@ -1918,9 +1846,6 @@
 
       Pokud je toto nastavení deaktivováno nebo není nakonfigurováno, použije aplikace <ph name="PRODUCT_NAME" /> buď preferovaný jazyk nastavený uživatelem (je-li nakonfigurován), jazyk systému, nebo základní nastavení „en-US“.</translation>
 <translation id="7651739109954974365">Určuje, zda bude v zařízení povolen datový roaming. Pokud je tato zásada nastavena na hodnotu True, je datový roaming povolen. Pokud tato zásada není nastavena nebo je nastavena na hodnotu False, datový roaming nebude k dispozici.</translation>
-<translation id="7667184304362487902">Konfiguruje nastavení proxy serveru pro prohlížeč <ph name="PRODUCT_NAME" /> a aplikace ARC.
-
-      Tato zásada zatím není připravena k použití. Nepoužívejte ji prosím.</translation>
 <translation id="76810863974142048">Adresa URL, u které by klienti vzdáleného připojení měli obdržet ověřovací token.
 
 Pokud je tato zásada nastavená, bude připojení hostitele vzdáleného přístupu vyžadovat, aby ověřovaní klienti získali token ověření z této adresy URL. Je třeba používat spolu se zásadou RemoteAccessHostTokenValidationUrl.
@@ -2143,6 +2068,7 @@
 
       Hodnota zásady se určuje v milisekundách.</translation>
 <translation id="8344454543174932833">Importování záložek z výchozího prohlížeče při prvním spuštění</translation>
+<translation id="8359734107661430198">Aktivovat API PříkladZastaraléFunkce do 2. 9. 2008</translation>
 <translation id="8360452361555133173">Aktivuje zobrazení uvítací stránky při prvním spuštění prohlížeče po přechodu na vyšší verzi OS.
 
 Pokud je tato zásada nastavena na hodnotu true nebo nastavena není, prohlížeč bude při prvním spuštění po přechodu na vyšší verzi OS zobrazovat uvítací stránku.
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb
index 127463d..d6a6abe2 100644
--- a/components/policy/resources/policy_templates_da.xtb
+++ b/components/policy/resources/policy_templates_da.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="da">
 <translation id="101438888985615157">Roter skærmen 180 grader</translation>
-<translation id="1015272884520659144">Definerer listen over USB-enheder, der gerne må frigøres fra deres kernedriver, så de kan bruges via chrome.usb API direkte i en webapplikation. Poster er par bestående af et USB-leverandør-id og et produkt-id til identifikation af en bestemt hardware.
-
-      Hvis denne politik ikke konfigureres, regnes listen over USB-enheder, der kan frigøres, som tom.</translation>
 <translation id="1017967144265860778">Strømstyring på loginskærmen</translation>
 <translation id="1019101089073227242">Angiv brugerdatamappe</translation>
 <translation id="1022361784792428773">Udvidelses-id'er, som brugeren skal forhindres i at installere (eller * for alle)</translation>
@@ -65,7 +62,6 @@
       Hvis politikken ikke er angivet eller er angivet til Falsk, aktiveres RC4-krypteringsprogrammer i TLS ikke. Alternativt kan den angives til Sandt for at bevare kompatibiliteten med en forældet server. Dette er en midlertidig løsning, og serveren bør rekonfigureres.</translation>
 <translation id="1297182715641689552">Brug et .pac-proxyscript</translation>
 <translation id="1304973015437969093">Udvidelses-/app-id'er og opdateringswebadresser skal installeres ubemærket</translation>
-<translation id="1310699457130669094">Du kan angive en webadresse til en proxy .pac-fil her. Denne politik fungerer kun, hvis du har valgt indstillinger for manuel proxy i "Vælg, hvordan du kan angive indstillinger for proxyserver". Du bør ikke angive denne politik, hvis du har valgt en anden tilstand for angivelse af proxypolitikker. Få detaljerede eksempler på: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Angiver den procentdel, som nedtoningsforsinkelsen på skærmen skaleres, når der observeres brugeraktivitet, mens skærmen er nedtonet, eller umiddelbart efter skærmen slukkes.
 
           Hvis denne politik indstilles, angiver den den procentdel, som nedtoningsforsinkelsen på skærmen skaleres, når der observeres brugeraktivitet, mens skærmen er nedtonet, eller umiddelbart efter skærmen slukkes. Når nedtoningsforsinkelsen skaleres, tilpasses forsinkelsen for skærmsluk, skærmlås og inaktivitet for at bibeholde samme afstande fra nedtoningsforsinkelsen på skærmen som i den oprindelige konfiguration.
@@ -146,18 +142,6 @@
 <translation id="1561424797596341174">Tilsidesættelser af politik for fejlretningsbuilds på hosten til fjernadgang</translation>
 <translation id="1583248206450240930">Brug <ph name="PRODUCT_FRAME_NAME" /> som standard</translation>
 <translation id="1608755754295374538">Webadresser, der får adgang til lydoptagelsesenheder, uden at du skal give tilladelse hertil</translation>
-<translation id="1613574633990410986">Giver dig mulighed for at angive den proxyserver, der anvendes af <ph name="PRODUCT_NAME" /> og ARC-apps, og forhindrer brugerne i at ændre proxyindstillingerne.
-
-      Hvis du vælger aldrig at bruge en proxyserver og altid oprette direkte forbindelse, ignoreres alle andre valgmuligheder.
-
-      Hvis du vælger at registrere proxyserveren automatisk, ignoreres alle andre valgmuligheder.
-
-      Få flere detaljerede eksempler på:
-      <ph name="PROXY_HELP_URL" />
-
-      Hvis du aktiverer denne indstilling, ignorerer <ph name="PRODUCT_NAME" /> og ARC-apps alle proxyrelaterede valgmuligheder, der angives på kommandolinjen.
-
-      Hvis disse politikker ikke angives, kan brugerne selv vælge proxyindstillingerne.</translation>
 <translation id="1617235075406854669">Aktivér sletning af browser- og downloadhistorik</translation>
 <translation id="1617384279878333801">Aktivér funktionen Tilføj person i profiladministratoren</translation>
 <translation id="1655229863189977773">Angiv diskcache i bytes</translation>
@@ -242,7 +226,6 @@
       Hvis den er aktiveret, vises der en stor, rød log ud-knap i systembakken, når en session er aktiv, og skærmen ikke er låst.
 
       Hvis den er deaktiveret eller ikke angivet, vises der ikke en stor, rød log ud-knap i systembakken.</translation>
-<translation id="1942957375738056236">Du kan angive webadressen på proxyserveren her. Denne politik træder kun i kraft, hvis du har valgt indstillinger for manuel proxy i "Vælg, hvordan du angiver indstillinger for proxyserveren". Du bør ikke angive denne politik, hvis du har valgt en anden tilstand til indstilling af proxypolitikker. Du kan finde flere valgmuligheder og detaljerede eksempler på: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Konfigurer strømstyring på loginskærmen i <ph name="PRODUCT_OS_NAME" />.
 
       Med denne politik kan du konfigurere, hvordan <ph name="PRODUCT_OS_NAME" /> reagerer, når der ikke har været brugeraktivitet i et stykke tid, mens loginskærmen vises. Politikken styrer flere indstillinger. Se de tilsvarende politikker, som styrer strømstyring i en session, for individuelle semantik- og værdiområder. De eneste afvigelser fra disse politikker er:
@@ -605,23 +588,6 @@
 <translation id="3072847235228302527">Konfigurer servicevilkårene for en enhedslokal konto</translation>
 <translation id="3096595567015595053">Liste over aktiverede plugins</translation>
 <translation id="3101501961102569744">Vælg, hvordan du vil angive indstillinger for proxyserveren</translation>
-<translation id="3125884964575432854">Giver dig mulighed for at angive den proxyserver, der anvendes af <ph name="PRODUCT_NAME" /> og ARC-apps, og forhindrer brugerne i at ændre proxyindstillingerne.
-
-      Hvis du vælger aldrig at bruge en proxyserver og altid oprette direkte forbindelse, ignoreres alle andre valgmuligheder.
-
-      Hvis du vælger at bruge systemets proxyindstillinger, ignoreres alle andre valgmuligheder.
-
-      Hvis du vælger at bruge automatisk registrering af proxyserveren, ignoreres alle andre valgmuligheder.
-
-      Hvis du vælger tilstanden for en fast proxyserver, kan du angive yderligere valgmuligheder i "Adresse eller webadresse til proxyserveren" og "Kommasepareret liste over regler for omgåelse af proxy". ARC-apps bruger kun den HTTP-proxyserver, der har højest prioritet. 
-
-      Hvis du vælger at bruge et proxyscript af typen .pac, skal du angive webadressen til scriptet i "Webadresse til en proxyfil af typen .pac".
-
-      Få flere detaljerede eksempler på:
-      <ph name="PROXY_HELP_URL" />
-      Hvis du aktiverer denne indstilling, ignorerer <ph name="PRODUCT_NAME" /> og ARC-apps alle proxyrelaterede valgmuligheder, der angives på kommandolinjen.
-
-      Hvis disse politikker ikke angives, kan brugerne selv vælge proxyindstillingerne.</translation>
 <translation id="3153348162326497318">Giver dig mulighed for at angive, hvilke udvidelser brugerne IKKE kan installere. Udvidelser, der allerede er installeret, fjernes, hvis de bliver sortlistet.
 
           Sortlisteværdien "*" betyder, at alle udvidelser er sortlistet, medmindre de er tydeligt angivet på hvidlisten.
@@ -690,6 +656,7 @@
       Hvis indstillingen er aktiveret eller ikke konfigureret, kan brugerne aktivere proxyen til Cloudprinter ved at godkende med deres Google-konto.
 
       Hvis denne indstilling er deaktiveret, kan brugerne ikke aktivere proxyen, og det vil ikke være tilladt for maskinen at dele sine printere med <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Aktiverer mulighed for at afslutte processer i Jobliste</translation>
 <translation id="3322771899429619102">Giver dig mulighed for at oprette en liste med webadressemønstre, der angiver websites, som har tilladelse til at benytte nøglegenerering. Hvis et webadressemønster findes i "KeygenBlockedForUrls", tilsidesættes disse undtagelser.
 
           Hvis denne politik ikke angives, anvendes den globale standardværdi på alle websites, enten fra politikken "DefaultKeygenSetting", hvis den er angivet, eller brugerens personlige konfiguration.</translation>
@@ -864,22 +831,6 @@
           Hvis denne politik er angivet til "Behold cookies under sessionen", så ryddes cookies, når sessionen afsluttes. Bemærk, at sessionen muligvis ikke afsluttes, når det sidste vindue lukkes, hvis <ph name="PRODUCT_NAME" /> kører i "baggrundstilstand". Se politikken "BackgroundModeEnabled" for at få flere oplysninger om konfiguration af denne adfærd.
 
           Hvis denne politik ikke angives, anvendes "AllowCookies", og brugeren kan ændre dette.</translation>
-<translation id="4098957623809244159">Denne politik er udfaset. Brug ProxyMode i stedet.
-
-      Giver dig mulighed for at angive den proxyserver, der anvendes af <ph name="PRODUCT_NAME" /> og ARC-apps, og forhindrer brugerne i at ændre proxyindstillingerne.
-
-      Hvis du vælger aldrig at bruge en proxyserver og altid oprette direkte forbindelse, ignoreres alle andre valgmuligheder.
-
-      Hvis du vælger at bruge systemets proxyindstillinger eller registrere proxyserveren automatisk, ignoreres alle andre valgmuligheder.
-
-      Hvis du vælger manuelle proxyindstillinger, kan du angive yderligere valgmuligheder i "Adresse eller webadresse til proxyserveren", "Webadresse til en proxyfil af typen .pac" og "Kommasepareret liste over regler for omgåelse af proxy".
-
-      Få flere detaljerede eksempler på:
-      <ph name="PROXY_HELP_URL" />
-
-      Hvis du aktiverer denne indstilling, ignorerer <ph name="PRODUCT_NAME" /> alle proxyrelaterede valgmuligheder, der angives på kommandolinjen.
-
-      Hvis denne politik ikke angives, kan brugerne selv vælge proxyindstillingerne.</translation>
 <translation id="4103289232974211388">Omdiriger til SAML IdP efter brugerbekræftelse</translation>
 <translation id="410478022164847452">Angiver den tid uden brugerinput, der udløser inaktivitetshandlingen, når strømforsyningen er tilsluttet.
 
@@ -1313,14 +1264,6 @@
 <translation id="5893553533827140852">Hvis denne indstilling er aktiveret, oprettes der en proxyforbindelse for anmodninger om gnubby-godkendelse på tværs af en fjernhostforbindelse.
 
           Hvis denne indstilling er deaktiveret eller ikke er konfigureret, oprettes der ingen proxyforbindelse for anmodninger om gnubby-godkendelse.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> og ARC-apps omgår alle proxyservere for den liste over hosts, der vises her.
-
-          Denne politik træder kun i kraft, hvis du har valgt indstillinger for manuel proxy i "Vælg, hvordan indstillinger for proxyservere skal angives".
-
-          Denne politik bør ikke angives, hvis du har valgt en anden tilstand til angivelse af proxypolitikker.
-
-          Få flere detaljerede eksempler på:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Tillad download af automatiske opdateringer via HTTP</translation>
 <translation id="5921888683953999946">Indstil standardtilstanden for hjælpefunktionen med den store markør på loginskærmen.
 
@@ -1801,9 +1744,6 @@
 <translation id="7632724434767231364">Navn på GSSAPI-samling</translation>
 <translation id="7635471475589566552">Konfigurerer applikationens landestandard i <ph name="PRODUCT_NAME" /> og forhindrer brugerne i at ændre landestandarden. Hvis du aktiverer denne indstilling, anvender <ph name="PRODUCT_NAME" /> den angivne landestandard. Hvis den konfigurerede landestandard ikke understøttes, bruges "en-US" i stedet. Hvis denne indstilling er deaktiveret eller ikke konfigureret, bruger <ph name="PRODUCT_NAME" /> enten den brugerdefinerede landestandard (hvis denne er konfigureret), systemets landestandard eller reservelandestandarden "en-US".</translation>
 <translation id="7651739109954974365">Bestemmer, om dataroaming skal aktiveres for enheden. Hvis den er indstillet til sand, tillades dataroaming. Hvis den ikke er konfigureret eller er angivet til falsk, vil dataroaming ikke være tilgængelig.</translation>
-<translation id="7667184304362487902">Konfigurerer proxyindstillinger for <ph name="PRODUCT_NAME" /> og ARC-apps.
-
-      Denne politik er ikke klar til brug endnu. Undlad at bruge den.</translation>
 <translation id="76810863974142048">Webadresse, hvor klienter med fjernadgang skal hente deres godkendelsestoken.
 
           Hvis denne politik er indstillet, kræver hosten for fjernadgang, at klienter, der ønsker godkendelse, skal hente et godkendelsestoken på denne webadresse for at oprette forbindelse. Skal bruges i forbindelse med RemoteAccessHostTokenValidationUrl.
@@ -2019,6 +1959,7 @@
 
       Politikværdien skal angives i millisekunder.</translation>
 <translation id="8344454543174932833">Importer bogmærker fra standardbrowser ved første visning</translation>
+<translation id="8359734107661430198">Aktivér ExampleDeprecatedFeature API frem til 02/09/2008</translation>
 <translation id="8360452361555133173">Aktivér visning af velkomstsiden, når browseren genstartes efter opgradering af operativsystemet.
 
       Hvis denne politik angives som Sand eller ikke er konfigureret, viser browseren velkomstsiden igen, når browseren genstartes efter opgradering af operativsystemet.
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 19c23ef..41283b29 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="de">
 <translation id="101438888985615157">Bildschirm um 180 Grad drehen</translation>
-<translation id="1015272884520659144">Definiert die Liste der USB-Geräte, die vom jeweiligen Kerneltreiber getrennt werden können, um über die chrome.usb API direkt in einer Webanwendung eingesetzt zu werden. Die Einträge bestehen aus der USB-Hersteller-ID und der Produkt-ID, über die die Hardware identifiziert werden kann.
-
-      Wenn diese Richtlinie nicht konfiguriert ist, wird die Liste der trennbaren USB-Geräte als leer betrachtet.</translation>
 <translation id="1017967144265860778">Energieverwaltung auf dem Anmeldebildschirm</translation>
 <translation id="1019101089073227242">Verzeichnis für Nutzerdaten festlegen</translation>
 <translation id="1022361784792428773">Erweiterungs-IDs, die der Nutzer nicht installieren darf ("*" für alle)</translation>
@@ -64,7 +61,6 @@
       Wenn die Richtlinie nicht konfiguriert oder auf "false" festgelegt ist, werden RC4-Verschlüsselungssammlungen in TLS nicht aktiviert. Sie kann auf "true" gestellt werden, um die Kompatibilität mit veralteten Servern zu gewährleisten. Hierbei handelt es sich jedoch um eine provisorische Maßnahme. Der Server sollte neu konfiguriert werden.</translation>
 <translation id="1297182715641689552">PAC-Proxy-Skript verwenden</translation>
 <translation id="1304973015437969093">Ohne Nutzereingriff zu installierende Erweiterungs-/App-IDs und Aktualisierungs-URLs</translation>
-<translation id="1310699457130669094">Hier können Sie eine URL zu einer Proxy-PAC-Datei angeben. Diese Richtlinie tritt nur dann in Kraft, wenn Sie bei "Auswählen, wie Proxyserver-Einstellungen angegeben werden" manuelle Proxy-Einstellungen angegeben haben. Sie sollten diese Richtlinie nicht konfigurieren, wenn Sie sich für eine andere Methode zur Festlegung der Proxy-Richtlinien entschieden haben. Ausführliche Beispiele erhalten Sie unter <ph name="PROXY_HELP_URL" />.</translation>
 <translation id="1313457536529613143">Hiermit wird der Prozentsatz angegeben, um den die Spanne für die Bildschirmabdunkelung skaliert wird, wenn während der Bildschirmabdunkelung oder kurz nach der Bildschirmabschaltung Nutzeraktivität festgestellt wird.
 
           Wenn diese Richtlinie konfiguriert ist, wird damit der Prozentsatz für die Skalierung der Spanne für die Bildschirmabdunkelung angegeben, wenn während der Bildschirmabdunkelung oder kurz nach der Bildschirmabschaltung Nutzeraktivität festgestellt wird. Sollte die Abdunkelungsspanne skaliert werden, wird die Spanne für die Abschaltung und Sperre des Bildschirms sowie die Inaktivität so angepasst, dass die Abstände der ursprünglichen Konfiguration proportional beibehalten werden.
@@ -146,23 +142,6 @@
 <translation id="1561424797596341174">Überschreiben von Richtlinien für Fehlerbehebungs-Builds des Hosts für den Remotezugriff</translation>
 <translation id="1583248206450240930">Standardmäßig <ph name="PRODUCT_FRAME_NAME" /> verwenden</translation>
 <translation id="1608755754295374538">URLs, denen ohne Nachfrage Zugriff auf Audioaufnahmegeräte gestattet wird</translation>
-<translation id="1613574633990410986">Mit dieser Richtlinie können Sie angeben, welcher Proxyserver für <ph name="PRODUCT_NAME" /> und die ARC-Apps verwendet werden soll, und verhindern, dass Nutzer die Proxy-Einstellungen ändern.
-
-
-      Wenn Sie festlegen, dass nie ein Proxyserver verwendet, sondern immer eine direkte Verbindung hergestellt wird, werden alle anderen Optionen ignoriert.
-
-
-      Falls Sie die automatische Ermittlung des Proxyservers auswählen, werden alle anderen Optionen ignoriert.
-
-
-      Ausführliche Beispiele finden Sie unter
-      <ph name="PROXY_HELP_URL" />.
-
-
-      Wenn Sie diese Einstellung aktivieren, werden in <ph name="PRODUCT_NAME" /> und den ARC-Apps alle Proxy-Optionen ignoriert, die in der Eingabeaufforderung angegeben werden.
-
-
-      Sind diese Richtlinien nicht konfiguriert, können Nutzer ihre eigenen Proxy-Einstellungen auswählen.</translation>
 <translation id="1617235075406854669">Löschen des Browserverlaufs und des Downloadverlaufs aktivieren</translation>
 <translation id="1617384279878333801">"Person hinzufügen" im Profilmanager aktivieren</translation>
 <translation id="1655229863189977773">Cache-Größe für Datenträger in Byte festlegen</translation>
@@ -243,7 +222,6 @@
       Wenn diese Option aktiviert wurde, wird während einer aktiven Sitzung und bei nicht gesperrtem Bildschirm eine große, rote Schaltfläche "Abmelden" in der Taskleiste angezeigt.
 
       Wenn diese Option deaktiviert oder nicht spezifiziert wurde, befindet sich in der Taskleiste keine große, rote Schaltfläche "Abmelden".</translation>
-<translation id="1942957375738056236">Hier können Sie die URL des Proxyservers angeben. Die Richtlinie tritt nur dann in Kraft, wenn bei "Auswählen, wie Proxyserver-Einstellungen angegeben werden" manuelle Proxy-Einstellungen festgelegt wurden. Sie sollten diese Richtlinie nicht konfigurieren, wenn Sie eine andere Methode zur Festlegung der Proxy-Richtlinien ausgewählt haben. Weitere Optionen und ausführliche Beispiele finden Sie unter <ph name="PROXY_HELP_URL" />.</translation>
 <translation id="1956493342242507974">Konfiguriert die Energieverwaltung auf dem Anmeldebildschirm in <ph name="PRODUCT_OS_NAME" />.
 
       Mit dieser Richtlinie konfigurieren Sie, wie <ph name="PRODUCT_OS_NAME" /> sich verhalten soll, wenn auf dem Anmeldebildschirm keine Nutzeraktivität erfolgt. Durch die Richtlinie werden mehrere Einstellungen festgelegt. Deren Semantik und zulässige Wertebereiche finden Sie unter den entsprechenden Richtlinien zur Steuerung der Energieverwaltung innerhalb einer Sitzung. Diese Richtlinie unterscheidet sich nur in folgenden Punkten:
@@ -607,24 +585,6 @@
 <translation id="3072847235228302527">Nutzungsbedingungen für ein lokales Gerätekonto festlegen</translation>
 <translation id="3096595567015595053">Liste der aktivierten Plug-ins</translation>
 <translation id="3101501961102569744">Auswählen, wie Proxyserver-Einstellungen angegeben werden</translation>
-<translation id="3125884964575432854">Mit dieser Richtlinie können Sie angeben, welcher Proxyserver für <ph name="PRODUCT_NAME" /> und die ARC-Apps verwendet werden soll, und verhindern, dass Nutzer die Proxy-Einstellungen ändern.
-
-          Wenn Sie festlegen, dass nie ein Proxyserver verwendet, sondern immer eine direkte Verbindung hergestellt wird, werden alle anderen Optionen ignoriert.
-
-          Falls Sie sich für die Verwendung der Proxy-Einstellungen des Systems entscheiden, werden alle anderen Optionen ignoriert.
-
-          Falls Sie die automatische Ermittlung des Proxyservers auswählen, werden alle anderen Optionen ignoriert.
-
-          Bei Auswahl des Modus mit festem Proxyserver können Sie in "Adresse oder URL des Proxyservers" und "Kommagetrennte Liste der Proxy-Umgehungsregeln" weitere Optionen angeben. Für ARC-Apps wird nur der HTTP-Proxyserver mit der höchsten Priorität verwendet.
-
-          Zur Verwendung eines PAC-Proxy-Skripts müssen Sie die URL des Skripts im Feld "URL einer PAC-Proxy-Datei" angeben.
-
-          Ausführliche Beispiele finden Sie unter
-          <ph name="PROXY_HELP_URL" />.
-
-          Wenn Sie diese Einstellung aktivieren, werden in <ph name="PRODUCT_NAME" /> und den ARC-Apps alle Proxy-Optionen ignoriert, die in der Eingabeaufforderung angegeben werden.
-
-          Sind diese Richtlinien nicht konfiguriert, können Nutzer ihre eigenen Proxy-Einstellungen auswählen.</translation>
 <translation id="3153348162326497318">Ermöglicht Ihnen zu bestimmen, welche Erweiterungen Nutzer nicht installieren dürfen. Bereits installierte Erweiterungen werden entfernt, wenn sie auf die schwarze Liste gesetzt werden. Der Wert "*" in einer schwarzen Liste bedeutet, dass alle Erweiterungen auf die schwarze Liste gesetzt sind. Ausnahmen bilden lediglich solche, die ausdrücklich in der Whitelist geführt sind. Wenn die Richtlinie nicht konfiguriert ist, so ist es dem Nutzer gestattet, beliebige Erweiterungen in <ph name="PRODUCT_NAME" /> zu installieren.</translation>
 <translation id="316778957754360075">Diese Einstellung wird ab <ph name="PRODUCT_NAME" />-Version 29 nicht mehr verwendet. Zur Einrichtung einer Sammlung mit Erweiterungen oder Apps, die von der Organisation gehostet wird, empfehlen wir, die Host-Website der CRX-Pakete in "ExtensionInstallSources" einzufügen und auf einer Webseite direkte Downloadlinks zu den Paketen bereitzustellen. Ein Launcher für diese Webseite kann mithilfe der Richtlinie "ExtensionInstallForcelist" erstellt werden.</translation>
 <translation id="3185009703220253572">Ab Version <ph name="SINCE_VERSION" /></translation>
@@ -689,6 +649,7 @@
      Wenn diese Einstellung aktiviert ist oder nicht konfiguriert wurde, können Nutzer den Google Cloud Print-Proxy durch die Authentifizierung mit ihrem Google-Konto aktivieren.
 
        Ist diese Einstellung deaktiviert, können Nutzer den Proxy nicht aktivieren und der Computer darf seine Drucker nicht für <ph name="CLOUD_PRINT_NAME" /> freigeben.</translation>
+<translation id="3297010562646015826">Ermöglicht das Beenden von Prozessen im Task-Manager</translation>
 <translation id="3322771899429619102">Ermöglicht Ihnen die Erstellung einer Liste mit URL-Mustern, die Websites angeben, denen die Schlüsselgenerierung gestattet ist. Wenn ein URL-Muster in "KeygenBlockedForUrls" angegeben ist, werden diese Ausnahmen dadurch überschrieben.
 
           Wenn diese Richtlinie nicht konfiguriert ist, wird für alle Websites entweder der globale Standardwert der Richtlinie "DefaultKeygenSetting", sofern festgelegt, oder die persönliche Konfiguration des Nutzers verwendet.</translation>
@@ -858,22 +819,6 @@
           Wenn für diese Richtlinie "Cookies für die Dauer der Sitzung beibehalten" festgelegt wurde, werden die Cookies nach Beenden der Sitzung wieder entfernt. Hinweis: Wenn <ph name="PRODUCT_NAME" /> im Hintergrundmodus ausgeführt wird, wird die Sitzung beim Schließen des letzten Fensters möglicherweise nicht beendet. Rufen Sie für weitere Informationen zum Konfigurieren dieses Verhaltens die Richtlinie "BackgroundModeEnabled" auf.
 
           Wenn diese Richtlinie nicht konfiguriert wird, kommt "AllowCookies" zum Einsatz. Nutzer können sie dann ändern.</translation>
-<translation id="4098957623809244159">Verwenden Sie statt dieser Richtlinie "ProxyMode", da die Richtlinie veraltet ist.
-
-          Mit dieser Richtlinie können Sie angeben, welcher Proxyserver für <ph name="PRODUCT_NAME" /> und die ARC-Apps verwendet werden soll, und verhindern, dass Nutzer die Proxy-Einstellungen ändern.
-
-          Wenn Sie festlegen, dass nie ein Proxyserver verwendet, sondern immer eine direkte Verbindung hergestellt wird, werden alle anderen Optionen ignoriert.
-
-          Falls Sie bestimmen, dass die Proxy-Einstellungen des Systems verwendet werden sollen oder der Proxyserver automatisch ermittelt werden soll, werden alle anderen Optionen ignoriert.
-
-          Bei Auswahl manueller Proxy-Einstellungen können Sie in "Adresse oder URL des Proxyservers", "URL einer PAC-Proxy-Datei" und "Kommagetrennte Liste der Proxy-Umgehungsregeln" weitere Optionen angeben.
-
-          Ausführliche Beispiele finden Sie unter
-          <ph name="PROXY_HELP_URL" />.
-
-          Wenn Sie diese Einstellung aktivieren, werden in <ph name="PRODUCT_NAME" /> alle Proxy-Optionen ignoriert, die per Eingabeaufforderung angegeben werden.
-
-          Sind diese Richtlinien nicht konfiguriert, können Nutzer ihre eigenen Proxy-Einstellungen auswählen.</translation>
 <translation id="4103289232974211388">Nach Bestätigung durch Nutzer an SAML-IdP weiterleiten</translation>
 <translation id="410478022164847452">Hiermit wird angegeben, nach welchem Zeitraum ohne Nutzereingabe die Inaktivität im Netzbetrieb erfolgt.
 
@@ -1300,14 +1245,6 @@
 <translation id="5893553533827140852">Wenn diese Einstellung aktiviert ist, wird für Anfragen zur Gnubby-Authentifizierung ein Proxy über eine Remotehostverbindung verwendet.
 
 Wenn diese Einstellung deaktiviert oder nicht konfiguriert ist, wird kein Proxy für Anfragen zur Gnubby-Authentifizierung verwendet.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> und die ARC-Apps umgehen für die Liste der hier angegebenen Hosts alle Proxys.
-
-          Diese Richtlinie tritt nur dann in Kraft, wenn Sie unter "Auswählen, wie Proxy-Server-Einstellungen angegeben werden" manuelle Proxy-Einstellungen ausgewählt haben.
-
-          Konfigurieren Sie diese Richtlinie nicht, wenn Sie sich für eine andere Methode zum Festlegen der Proxy-Richtlinien entschieden haben.
-
-          Ausführliche Beispiele finden Sie unter
-          <ph name="PROXY_HELP_URL" />.</translation>
 <translation id="5921713479449475707">Downloads automatischer Updates über HTTP zulassen</translation>
 <translation id="5921888683953999946">Hiermit wird der Standardstatus der Bedienungshilfefunktion für den großen Cursor auf der Anmeldeseite festgelegt.
 
@@ -1784,9 +1721,6 @@
 <translation id="7632724434767231364">Name der GSSAPI-Bibliothek</translation>
 <translation id="7635471475589566552">Konfiguriert das App-Gebietsschema in <ph name="PRODUCT_NAME" /> und verhindert, dass Nutzer das Gebietsschema ändern. Wenn Sie diese Einstellung aktivieren, verwendet <ph name="PRODUCT_NAME" /> das angegebene Gebietsschema. Wird das konfigurierte Gebietsschema nicht unterstützt, kommt stattdessen "en-US" zum Einsatz. Ist diese Einstellung deaktiviert oder nicht konfiguriert, verwendet <ph name="PRODUCT_NAME" /> das vom Nutzer angegebene bevorzugte Gebietsschema (sofern konfiguriert), das Gebietsschema des Systems oder das Ersatz-Gebietsschema "en-US".</translation>
 <translation id="7651739109954974365">Legt fest, ob Daten-Roaming für das Gerät aktiviert werden soll. Bei Einstellung auf "true" ist das Roaming erlaubt. Ist die Richtlinie nicht konfiguriert oder auf "false" gesetzt, ist kein Roaming verfügbar.</translation>
-<translation id="7667184304362487902">Hiermit werden die Proxy-Einstellungen für <ph name="PRODUCT_NAME" /> und die ARC-Apps konfiguriert.
-
-      Diese Richtlinie ist noch nicht einsatzbereit und sollte daher nicht verwendet werden.</translation>
 <translation id="76810863974142048">URL, unter der Clients für den Remotezugriff ihr Authentifizierungstoken anfordern sollen
 
           Wenn diese Richtlinie konfiguriert ist, benötigt der Host für den Remotezugriff Authentifizierungsclients, um ein Authentifizierungstoken von dieser URL zum Aufbau einer Verbindung anzufordern. Diese Richtlinie muss in Verbindung mit "RemoteAccessHostTokenValidationUrl" verwendet werden.
@@ -2000,6 +1934,7 @@
 
       Der Wert für die Richtlinie sollte in Millisekunden angegeben werden.</translation>
 <translation id="8344454543174932833">Lesezeichen bei erster Ausführung aus Standardbrowser importieren</translation>
+<translation id="8359734107661430198">ExampleDeprecatedFeature API bis zum 02.09.2008 aktivieren</translation>
 <translation id="8360452361555133173">Mit dieser Richtlinie kann die Anzeige der Begrüßungsseite beim ersten Start des Browsers nach einer Aktualisierung des Betriebssystems aktiviert werden.
 
       Wenn die Richtlinie auf "true" eingestellt oder nicht konfiguriert ist, zeigt der Browser die Begrüßungsseite beim ersten Start nach einer Aktualisierung des Betriebssystems erneut an.
@@ -2184,7 +2119,7 @@
 
       Wenn diese Richtlinien auf "true" gesetzt oder gar nicht festgelegt werden, kann der Nutzer Bluetooth nach Belieben aktivieren und deaktivieren.
 
-      Wenn diese Richtlinien festgelegt sind, kann sie der Nutzer nicht ändern oder übersschreiben.
+      Wenn diese Richtlinien festgelegt sind, kann sie der Nutzer nicht ändern oder überschreiben.
 
       Nachdem Bluetooth aktiviert wurde, muss das Gerät neu gestartet werden, damit die Änderungen wirksam werden. Wenn Bluetooth deaktiviert wird, ist kein Neustart erforderlich.</translation>
 <translation id="8947415621777543415">Gerätestandort melden</translation>
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb
index d83d7fe..cc6c727 100644
--- a/components/policy/resources/policy_templates_el.xtb
+++ b/components/policy/resources/policy_templates_el.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="el">
 <translation id="101438888985615157">Περιστροφή οθόνης κατά 180 μοίρες</translation>
-<translation id="1015272884520659144">Προσδιορίζει τη λίστα συσκευών USB που επιτρέπεται να αποσυνδεθούν από το πρόγραμμα οδήγησης πυρήνα τους, ώστε να χρησιμοποιηθούν μέσω του API chrome.usb απευθείας σε μια εφαρμογή ιστού. Οι καταχωρήσεις είναι ζεύγη αναγνωριστικών προμηθευτών USB και αναγνωριστικών προϊόντων, τα οποία προσδιορίζουν συγκεκριμένες συσκευές υλικού.
-
-      Αν δεν ρυθμιστεί αυτή η πολιτική, τότε η λίστα των αποσπώμενων συσκευών USB θα θεωρηθεί ότι είναι κενή.</translation>
 <translation id="1017967144265860778">Διαχείριση ενέργειας στην οθόνη σύνδεσης</translation>
 <translation id="1019101089073227242">Ορισμός καταλόγου δεδομένων χρήστη</translation>
 <translation id="1022361784792428773">Αναγνωριστικά επέκτασης η εγκατάσταση των οποίων από τον χρήστη θα πρέπει να αποτρέπεται (ή * για όλες)</translation>
@@ -73,14 +70,6 @@
       Αν η πολιτική δεν έχει οριστεί ή οριστεί σε false, οι σουίτες κρυπτογράφησης RC4 στο TLS δεν θα ενεργοποιηθούν. Εναλλακτικά, μπορεί να οριστεί σε true για τη διατήρηση της συμβατότητας με έναν μη ενημερωμένο διακομιστή. Αυτό αποτελεί μια πρόχειρη λύση και ο διακομιστής θα πρέπει να διαμορφωθεί ξανά.</translation>
 <translation id="1297182715641689552">Χρησιμοποιήστε ένα σενάριο διακομιστή μεσολάβησης .pac</translation>
 <translation id="1304973015437969093">Αναγνωριστικά επέκτασης/εφαρμογής και διευθύνσεις URL ενημέρωσης για αθόρυβη εγκατάσταση</translation>
-<translation id="1310699457130669094">Μπορείτε να καθορίσετε μια διεύθυνση URL σε ένα αρχείο διακομιστή μεσολάβησης .pac εδώ.
-
-          Η πολιτική αυτή τίθεται σε ισχύ μόνο αν έχετε επιλέξει μη αυτόματες ρυθμίσεις διακομιστή μεσολάβησης στο στοιχείο ''Επιλέξτε τον τρόπο καθορισμού των ρυθμίσεων του διακομιστή μεσολάβησης''.
-
-          Δεν πρέπει να καθορίσετε αυτήν την πολιτική αν έχετε επιλέξει οποιαδήποτε άλλη λειτουργία για τη ρύθμιση των πολιτικών του διακομιστή μεσολάβησης.
-
-          Για λεπτομερή παραδείγματα, επισκεφθείτε τη διεύθυνση:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Προσδιορίζει το ποσοστό κατά το οποίο προσαρμόζεται η καθυστέρηση μείωσης της φωτεινότητας της οθόνης όταν παρατηρείται δραστηριότητα χρηστών ενώ η φωτεινότητα της οθόνης είναι μειωμένη ή λίγο μετά την απενεργοποίηση της οθόνης.
 
           Αν ρυθμιστεί αυτή η πολιτική, προσδιορίζει  το ποσοστό κατά το οποίο προσαρμόζεται η καθυστέρηση μείωσης της φωτεινότητας της οθόνης όταν παρατηρείται δραστηριότητα χρηστών ενώ η φωτεινότητα της οθόνης είναι μειωμένη ή λίγο μετά την απενεργοποίηση της οθόνης. Όταν γίνεται προσαρμογή της καθυστέρησης μείωσης της φωτεινότητας της οθόνης, οι καθυστερήσεις απενεργοποίησης και κλειδώματος της οθόνης προσαρμόζονται αναλόγως, ώστε να διατηρούνται οι ίδιες χρονικές διαφορές με τη μείωση φωτεινότητας που ορίζονται στις αρχικές ρυθμίσεις.
@@ -163,18 +152,6 @@
 <translation id="1561424797596341174">Παρακάμψεις πολιτικής για εκδόσεις εντοπισμού σφαλμάτων κεντρικού υπολογιστή απομακρυσμένης πρόσβασης</translation>
 <translation id="1583248206450240930">Χρήση του <ph name="PRODUCT_FRAME_NAME" /> από προεπιλογή</translation>
 <translation id="1608755754295374538">Διευθύνσεις URL που θα έχουν πρόσβαση στις συσκευές καταγραφής ήχου χωρίς ερώτηση</translation>
-<translation id="1613574633990410986">Σας επιτρέπει να καθορίσετε το διακομιστή μεσολάβησης που χρησιμοποιείται από το <ph name="PRODUCT_NAME" /> και τις εφαρμογές ARC και αποτρέπει την αλλαγή των ρυθμίσεων του διακομιστή μεσολάβησης από τους χρήστες.
-
-     Εάν επιλέξετε να μην χρησιμοποιείτε ποτέ έναν διακομιστή μεσολάβησης και να συνδέεστε πάντα απευθείας, όλες οι υπόλοιπες επιλογές θα παραβλεφθούν.
-
-      Εάν επιλέξετε να εντοπίσετε αυτόματα το διακομιστή μεσολάβησης, όλες οι υπόλοιπες επιλογές θα παραβλεφθούν.
-
-     Για λεπτομερή παραδείγματα, επισκεφτείτε τη διεύθυνση:
-      <ph name="PROXY_HELP_URL" />
-
-      Εάν ενεργοποιήσετε αυτήν τη ρύθμιση, το <ph name="PRODUCT_NAME" /> και οι εφαρμογές ARC παραβλέπουν όλες τις επιλογές που σχετίζονται με το διακομιστή μεσολάβησης οι οποίες καθορίζονται από τη γραμμή εντολών.
-
-     Εάν οι πολιτικές αυτές δεν καθοριστούν, οι χρήστες θα μπορούν να επιλέξουν τις ρυθμίσεις διακομιστή μεσολάβησης οι ίδιοι.</translation>
 <translation id="1617235075406854669">Ενεργοποίηση διαγραφής του ιστορικού περιήγησης και του ιστορικού λήψεων</translation>
 <translation id="1617384279878333801">Ενεργοποίηση προσθήκης ατόμου στο διαχειριστή προφίλ</translation>
 <translation id="1655229863189977773">Ορισμός μεγέθους προσωρινής μνήμης δίσκου σε byte</translation>
@@ -265,14 +242,6 @@
       Εάν είναι ενεργοποιημένο, εμφανίζεται ένα μεγάλο κόκκινο κουμπί αποσύνδεσης στο δίσκο του συστήματος όταν μια περίοδος σύνδεσης είναι ενεργή και η οθόνη δεν είναι κλειδωμένη.
 
       Εάν είναι απενεργοποιημένο ή δεν έχει καθοριστεί, δεν εμφανίζεται κάποιο μεγάλο κόκκινο κουμπί αποσύνδεσης.</translation>
-<translation id="1942957375738056236">Μπορείτε να καθορίσετε τη διεύθυνση URL του διακομιστή μεσολάβησης εδώ.
-
-          Η πολιτική αυτή τίθεται σε ισχύ μόνο αν έχετε επιλέξει μη αυτόματες ρυθμίσεις διακομιστή μεσολάβησης στο στοιχείο ''Επιλέξτε τον τρόπο καθορισμού των ρυθμίσεων του διακομιστή μεσολάβησης''.
-
-          Δεν πρέπει να καθορίσετε αυτήν την πολιτική αν έχετε επιλέξει οποιαδήποτε άλλη λειτουργία για τη ρύθμιση πολιτικών διακομιστή μεσολάβησης.
-
-          Για περισσότερες επιλογές και λεπτομερή παραδείγματα, επισκεφθείτε τη διεύθυνση:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Διαμόρφωση διαχείρισης ενέργειας στην οθόνη σύνδεσης στο <ph name="PRODUCT_OS_NAME" />.
 
       Αυτή η πολιτική σάς επιτρέπει να διαμορφώνετε τη συμπεριφορά του <ph name="PRODUCT_OS_NAME" /> όταν δεν υπάρχει δραστηριότητα από το χρήστη για κάποιο χρονικό διάστημα όταν εμφανίζεται η οθόνη σύνδεσης. Η πολιτική ελέγχει πολλές ρυθμίσεις. Για τη σημασία και τα εύρη τιμών κάθε ρύθμισης, ανατρέξτε στις αντίστοιχες πολιτικές που ελέγχουν τη διαχείριση ενέργειας σε μια περίοδο λειτουργίας. Οι μοναδικές αποκλίσεις από αυτές τις πολιτικές είναι οι εξής:
@@ -661,24 +630,6 @@
 <translation id="3072847235228302527">Καθορισμός των Όρων Παροχής Υπηρεσιών για λογαριασμό συσκευής/τοπικό λογαριασμό</translation>
 <translation id="3096595567015595053">Κατάλογος ενεργοποιημένων προσθηκών</translation>
 <translation id="3101501961102569744">Επιλογή τρόπου καθορισμού των ρυθμίσεων του διακομιστή μεσολάβησης</translation>
-<translation id="3125884964575432854">Σας επιτρέπει να καθορίσετε το διακομιστή μεσολάβησης που χρησιμοποιείται από το <ph name="PRODUCT_NAME" /> και τις εφαρμογές ARC και αποτρέπει την αλλαγή των ρυθμίσεων του διακομιστή μεσολάβησης από τους χρήστες.
-
-         Εάν επιλέξετε να μην χρησιμοποιείτε ποτέ έναν διακομιστή μεσολάβησης και να συνδέεστε πάντα απευθείας, όλες οι υπόλοιπες επιλογές θα παραβλεφθούν.
-
-          Εάν επιλέξετε να χρησιμοποιήσετε ρυθμίσεις διακομιστή μεσολάβησης συστήματος, όλες οι υπόλοιπες επιλογές θα παραβλεφθούν.
-
-           Εάν επιλέξετε να εντοπίσετε αυτόματα το διακομιστή μεσολάβησης, όλες οι υπόλοιπες επιλογές θα παραβλεφθούν.
-
-          Αν επιλέξετε τη σταθερή κατάσταση διακομιστή μεσολάβησης, μπορείτε να καθορίσετε περαιτέρω επιλογές στα πεδία "Διεύθυνση ή διεύθυνση URL του διακομιστή μεσολάβησης" και "Λίστα κανόνων παράβλεψης διακομιστή μεσολάβησης διαχωρισμένων με κόμματα". Οι εφαρμογές ARC θα χρησιμοποιούν μόνο το διακομιστή μεσολάβησης HTTP με την ύψιστη προτεραιότητα.
-
-          Εάν επιλέξετε να χρησιμοποιείτε ένα σενάριο διακομιστή μεσολάβησης .pac, θα πρέπει να καθορίσετε το URL στο σενάριο σε "URL για αρχείο .pac διακομιστή μεσολάβησης".
-
-         Για λεπτομερή παραδείγματα, επισκεφτείτε τη διεύθυνση:
-          <ph name="PROXY_HELP_URL" />
-
-          Εάν ενεργοποιήσετε αυτήν τη ρύθμιση, το <ph name="PRODUCT_NAME" /> και οι εφαρμογές ARC παραβλέπουν όλες τις επιλογές που σχετίζονται με το διακομιστή μεσολάβησης οι οποίες καθορίζονται από τη γραμμή εντολών.
-
-          Εάν δεν καθορίσετε αυτήν την πολιτική, θα επιτρέπεται στους χρήστες να επιλέγουν οι ίδιοι τις ρυθμίσεις του διακομιστή μεσολάβησης.</translation>
 <translation id="3153348162326497318">Σας επιτρέπει να καθορίσετε ποιες επεκτάσεις οι χρήστες ΔΕΝ μπορούν να εγκαταστήσουν. Οι επεκτάσεις που έχουν ήδη εγκατασταθεί θα αφαιρεθούν, αν βρίσκονται στη λίστα αποκλεισμένων.
 
           Μια τιμή λίστας αποκλεισμένων του ''*'' σημαίνει ότι όλες οι επεκτάσεις βρίσκονται σε λίστα αποκλεισμένων εκτός αν αναφέρονται ρητά στη λίστα επιτρεπόμενων.
@@ -751,6 +702,7 @@
       Εάν αυτή η ρύθμιση είναι ενεργοποιημένη ή δεν έχει διαμορφωθεί, οι χρήστες μπορούν να ενεργοποιήσουν τον διακομιστή μεσολάβησης εκτυπωτή νέφους μέσω του ελέγχου ταυτότητας με το Λογαριασμό τους Google.
 
       Εάν αυτή η ρύθμιση είναι απενεργοποιημένη, οι χρήστες δεν μπορούν να ενεργοποιήσουν το διακομιστή μεσολάβησης και δεν θα επιτρέπεται η κοινή χρήση των εκτυπωτών του υπολογιστή με το <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Επιτρέπει τον τερματισμό διεργασιών στη Διαχείριση εργασιών</translation>
 <translation id="3322771899429619102">Σας επιτρέπει να ορίσετε μια λίστα με τα μοτίβα url που προσδιορίζουν ιστότοπους στους οποίους επιτρέπεται να χρησιμοποιούν τη δημιουργία κλειδιού. Αν ένα μοτίβο url περιέχεται στην πολιτική "KeygenBlockedForUrls", αυτή η πολιτική παρακάμπτει αυτές τις εξαιρέσεις.
 
           Αν δεν ορίσετε αυτήν την πολιτική, θα χρησιμοποιηθεί η καθολική προεπιλεγμένη τιμή για όλους τους ιστότοπους είτε από την πολιτική "DefaultKeygenSetting" εφόσον έχει οριστεί, είτε από την προσωπική διαμόρφωση του χρήστη.</translation>
@@ -927,22 +879,6 @@
                Αν αυτή η πολιτική έχει οριστεί σε "Διατήρηση cookie για τη διάρκεια της περιόδου σύνδεσης", τα cookie θα διαγραφούν όταν κλείσει η περίοδος σύνδεσης. Έχετε υπόψη ότι αν το <ph name="PRODUCT_NAME" /> εκτελείται σε "λειτουργία παρασκηνίου", η περίοδος σύνδεσης μπορεί να μην κλείσει όταν κλείσει το τελευταίο παράθυρο. Για περισσότερες πληροφορίες σχετικά με τη διαμόρφωση αυτής της συμπεριφοράς, ανατρέξτε στην πολιτική "BackgroundModeEnabled".
 
           Αν αυτή η πολιτική δεν έχει οριστεί, θα χρησιμοποιηθεί το στοιχείο "AllowCookies" και ο χρήστης θα μπορεί να την αλλάξει.</translation>
-<translation id="4098957623809244159">Αυτή η πολιτική έχει καταργηθεί. Χρησιμοποιήστε το ProxyMode στη θέση της.
-
-          Σας επιτρέπει να καθορίσετε το διακομιστή μεσολάβησης που χρησιμοποιεί το <ph name="PRODUCT_NAME" /> και οι εφαρμογές ARC και αποτρέπει την αλλαγή των ρυθμίσεων του διακομιστή μεσολάβησης από τους χρήστες.
-
-          Εάν επιλέξετε να μην χρησιμοποιείτε ποτέ έναν διακομιστή μεσολάβησης και να συνδέεστε πάντα απευθείας, όλες οι υπόλοιπες επιλογές θα παραβλεφθούν.
-
-         Εάν επιλέξετε να χρησιμοποιήσετε ρυθμίσεις διακομιστή μεσολάβησης συστήματος ή αυτόματο εντοπισμό του διακομιστή μεσολάβησης, όλες οι υπόλοιπες επιλογές θα παραβλεφθούν.
-
-         Εάν επιλέξετε τον μη αυτόματο καθορισμό των ρυθμίσεων του διακομιστή μεσολάβησης, μπορείτε να καθορίσετε περισσότερες επιλογές στα πεδία "Διεύθυνση ή URL του διακομιστή μεσολάβησης", "URL για αρχείο .pac διακομιστή μεσολάβησης" και "Λίστα κανόνων παράβλεψης διακομιστή μεσολάβησης διαχωρισμένων με κόμματα".
-
-          Για λεπτομερή παραδείγματα, επισκεφτείτε τη διεύθυνση:
-          <ph name="PROXY_HELP_URL" />
-
-          Εάν ενεργοποιήσετε αυτήν τη ρύθμιση, το <ph name="PRODUCT_NAME" /> παραβλέπει όλες τις επιλογές που σχετίζονται με το διακομιστή μεσολάβησης οι οποίες καθορίζονται από τη γραμμή εντολών.
-          
-          Εάν δεν καθορίσετε αυτήν την πολιτική, θα επιτρέπεται στους χρήστες να επιλέγουν οι ίδιοι τις ρυθμίσεις του διακομιστή μεσολάβησης.</translation>
 <translation id="4103289232974211388">Ανακατεύθυνση σε SAML IdP μετά την επιβεβαίωση του χρήστη</translation>
 <translation id="410478022164847452">Καθορίζει τη χρονική διάρκεια χωρίς εισαγωγή από το χρήστη, μετά από την οποία πραγματοποιείται η ενέργεια αδράνειας κατά τη λειτουργία με εναλλασσόμενο ρεύμα.
 
@@ -1421,14 +1357,6 @@
 <translation id="5893553533827140852">Εάν είναι ενεργοποιημένη αυτή η ρύθμιση, τότε η μεσολάβηση των αιτημάτων ελέγχου ταυτότητας gnubby θα γίνεται μέσω μιας απομακρυσμένης σύνδεσης σε κεντρικό υπολογιστή.
 
           Εάν είναι απενεργοποιημένη αυτή η ρύθμιση ή δεν διαμορφωθεί, δεν θα γίνεται μεσολάβηση των αιτημάτων ελέγχου ταυτότητας gnubby.</translation>
-<translation id="5900959132054596599">Το <ph name="PRODUCT_NAME" /> και οι εφαρμογές ARC θα παρακάμψουν κάθε διακομιστή μεσολάβησης για τη λίστα των κεντρικών υπολογιστών που παρατίθεται εδώ.
-
-          Αυτή η πολιτική τίθεται σε ισχύ μόνο εάν έχετε επιλέξει μη αυτόματες ρυθμίσεις διακομιστή μεσολάβησης στο στοιχείο ''Επιλέξτε τον τρόπο καθορισμού των ρυθμίσεων του διακομιστή μεσολάβησης''.
-
-          Δεν πρέπει να καθορίσετε αυτήν την πολιτική εάν έχετε επιλέξει οποιαδήποτε άλλη λειτουργία για τη ρύθμιση πολιτικών διακομιστή μεσολάβησης.
-
-          Για πιο λεπτομερή παραδείγματα, επισκεφτείτε τη διεύθυνση:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Να επιτρέπονται οι λήψεις αυτόματης ενημέρωσης μέσω HTTP</translation>
 <translation id="5921888683953999946">Ρύθμιση της προεπιλεγμένης κατάστασης της δυνατότητας προσβασιμότητας μεγάλου δείκτη στην οθόνη σύνδεσης.
 
@@ -1952,9 +1880,6 @@
 
       Αν αυτή η ρύθμιση είναι απενεργοποιημένη ή δεν έχει διαμορφωθεί, το <ph name="PRODUCT_NAME" /> θα χρησιμοποιεί τις προτιμώμενες τοπικές ρυθμίσεις που έχουν καθοριστεί από τον χρήστη (αν έχει γίνει διαμόρφωση), τις τοπικές ρυθμίσεις του συστήματος ή τις εναλλακτικές τοπικές ρυθμίσεις "el-GR".</translation>
 <translation id="7651739109954974365">Καθορίζει εάν η περιαγωγή δεδομένων θα πρέπει να είναι ενεργή για τη συσκευή. Εάν έχει οριστεί ως αληθής, η περιαγωγή δεδομένων θα επιτρέπεται. Εάν δεν έχει διαμορφωθεί ή έχει οριστεί ως ψευδής, η περιαγωγή δεδομένων δεν θα είναι διαθέσιμη.</translation>
-<translation id="7667184304362487902">Διαμορφώνει τις ρυθμίσεις διακομιστή μεσολάβησης για το <ph name="PRODUCT_NAME" /> και τις εφαρμογές ARC.
-
-      Αυτή η πολιτική δεν είναι ακόμα έτοιμη για χρήση, επομένως μην τη χρησιμοποιήσετε.</translation>
 <translation id="76810863974142048">URL από όπου οι εφαρμογές πελάτες απομακρυσμένης πρόσβασης θα λαμβάνουν το διακριτικό τους για τον έλεγχο ταυτότητας.
 
           Αν οριστεί αυτή η πολιτική, ο κεντρικός υπολογιστής απομακρυσμένης πρόσβασης θα απαιτεί από τις εφαρμογές πελάτες που εκτελούν έλεγχο ταυτότητας την απόκτηση ενός διακριτικού ελέγχου ταυτότητας από αυτό το URL για την πραγματοποίηση σύνδεσης. Πρέπει να χρησιμοποιείται σε συνδυασμό με την πολιτική RemoteAccessHostTokenValidationUrl.
@@ -2185,6 +2110,7 @@
 
      Η τιμή της πολιτικής θα πρέπει να καθορίζεται σε χιλιοστά του δευτερολέπτου.</translation>
 <translation id="8344454543174932833">Εισαγωγή σελιδοδεικτών από το προεπιλεγμένο πρόγραμμα περιήγησης στην πρώτη εκτέλεση</translation>
+<translation id="8359734107661430198">Ενεργοποίηση ExampleDeprecatedFeature API έως 2008/09/02</translation>
 <translation id="8360452361555133173">Ενεργοποίηση εμφάνισης της σελίδας υποδοχής στην πρώτη εκκίνηση του προγράμματος περιήγησης μετά από αναβάθμιση του λειτουργικού συστήματος.
 
       Αν αυτή η πολιτική οριστεί ως αληθής ή δεν διαμορφωθεί, το πρόγραμμα περιήγησης θα εμφανίσει ξανά τη σελίδα υποδοχής στην πρώτη εκκίνηση μετά από αναβάθμιση του λειτουργικού συστήματος.
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb
index 5bc90ed..1c0b3eb 100644
--- a/components/policy/resources/policy_templates_en-GB.xtb
+++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -2,7 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="en-GB">
 <translation id="101438888985615157">Rotate screen by 180 degrees</translation>
-<translation id="1015272884520659144">Defines the list of USB devices that are allowed to be detached from their kernel driver in order to be used through the chrome.usb API directly inside a web application. Entries are pairs of USB Vendor Identifier and Product Identifier to identify a specific hardware. If this policy is not configured, the list of a detachable USB devices is considered as empty.</translation>
 <translation id="1017967144265860778">Power management on the login screen</translation>
 <translation id="1019101089073227242">Set user data directory</translation>
 <translation id="1022361784792428773">Extension IDs the user should be prevented from installing (or * for all)</translation>
@@ -71,14 +70,6 @@
       If the policy is not set, or is set to false, then RC4 cipher suites in TLS will not be enabled. Otherwise it may be set to true to retain compatibility with an outdated server. This is a stopgap measure and the server should be reconfigured.</translation>
 <translation id="1297182715641689552">Use a .pac proxy script</translation>
 <translation id="1304973015437969093">Extension/App IDs and update URLs to be silently installed</translation>
-<translation id="1310699457130669094">You can specify a URL to a proxy .pac file here.
-
-          This policy only takes effect if you have selected manual proxy settings at 'Choose how to specify proxy server settings'.
-
-          You should leave this policy unset if you have selected any other mode for setting proxy policies.
-
-          For detailed examples, visit:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Specifies the percentage by which the screen dim delay is scaled when user activity is observed while the screen is dimmed or soon after the screen has been turned off.
 
           If this policy is set, it specifies the percentage by which the screen dim delay is scaled when user activity is observed while the screen is dimmed or soon after the screen has been turned off. When the dim delay is scaled, the screen off, screen lock and idle delays get adjusted to maintain the same distances from the screen dim delay as originally configured.
@@ -161,18 +152,6 @@
 <translation id="1561424797596341174">Policy overrides for Debug builds of the remote access host</translation>
 <translation id="1583248206450240930">Use <ph name="PRODUCT_FRAME_NAME" /> by default</translation>
 <translation id="1608755754295374538">URLs that will be granted access to audio capture devices without prompt</translation>
-<translation id="1613574633990410986">Allows you to specify the proxy server used by <ph name="PRODUCT_NAME" /> and ARC-apps and prevents users from changing proxy settings.
-
-      If you choose to never use a proxy server and always connect directly, all other options are ignored.
-
-      If you choose to auto detect the proxy server, all other options are ignored.
-
-      For detailed examples, visit:
-      <ph name="PROXY_HELP_URL" />
-
-      If you enable this setting, <ph name="PRODUCT_NAME" /> and ARC-apps ignore all proxy-related options specified from the command line.
-
-      Leaving these policies not set will allow the users to choose the proxy settings on their own.</translation>
 <translation id="1617235075406854669">Enable deleting browser and download history</translation>
 <translation id="1617384279878333801">Enable add person in profile manager</translation>
 <translation id="1655229863189977773">Set disk cache size in bytes</translation>
@@ -263,14 +242,6 @@
       If enabled, a big, red logout button is shown in the system tray while a session is active and the screen is not locked.
 
       If disabled or not specified, no big, red logout button is shown in the system tray.</translation>
-<translation id="1942957375738056236">You can specify the URL of the proxy server here.
-
-          This policy only takes effect if you have selected manual proxy settings at 'Choose how to specify proxy server settings'.
-
-          You should leave this policy unset if you have selected any other mode for setting proxy policies.
-
-          For more options and detailed examples, visit:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Configure power management on the log-in screen in <ph name="PRODUCT_OS_NAME" />.
 
       This policy lets you configure how <ph name="PRODUCT_OS_NAME" /> behaves when there is no user activity for some amount of time while the log-in screen is being shown. The policy controls multiple settings. For their individual semantics and value ranges, see the corresponding policies that control power management within a session. The only deviations from these policies are:
@@ -661,24 +632,6 @@
 <translation id="3072847235228302527">Set the Terms of Service for a device-local account</translation>
 <translation id="3096595567015595053">List of enabled plug-ins</translation>
 <translation id="3101501961102569744">Choose how to specify proxy server settings</translation>
-<translation id="3125884964575432854">Allows you to specify the proxy server used by <ph name="PRODUCT_NAME" /> and ARC-apps and prevents users from changing proxy settings.
-
-          If you choose to never use a proxy server and always connect directly, all other options are ignored.
-
-          If you choose to use system proxy settings, all other options are ignored.
-
-          If you choose to auto detect the proxy server, all other options are ignored.
-
-          If you choose fixed server proxy mode, you can specify further options in 'Address or URL of proxy server' and 'Comma-separated list of proxy bypass rules'. ARC-apps will only use the HTTP proxy server with the highest priority.
-
-          If you choose to use a .pac proxy script, you must specify the URL to the script in 'URL to a proxy .pac file'.
-
-          For detailed examples, visit:
-          <ph name="PROXY_HELP_URL" />
-
-          If you enable this setting, <ph name="PRODUCT_NAME" /> and ARC-apps ignore all proxy-related options specified from the command line.
-
-          Leaving this policy not set will allow the users to choose the proxy settings on their own.</translation>
 <translation id="3153348162326497318">Allows you to specify which extensions the users CANNOT install. Extensions already installed will be removed if blacklisted.
 
           A blacklist value of '*' means all extensions are blacklisted unless they are explicitly listed in the whitelist.
@@ -751,6 +704,7 @@
       If this setting is enabled or not configured, users can enable the cloud print proxy by authentication with their Google account.
 
       If this setting is disabled, users cannot enable the proxy, and the machine will not be allowed to share it's printers with <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Enables ending processes in Task Manager</translation>
 <translation id="3322771899429619102">Allows you to set a list of URL patterns that specify sites which are allowed to use key generation. If a URL pattern is in 'KeygenBlockedForUrls', that overrides these exceptions.
 
           If this policy is left not set the global default value will be used for all sites either from the 'DefaultKeygenSetting' policy if it is set or the user's personal configuration otherwise.</translation>
@@ -938,22 +892,6 @@
           If this policy is set to 'Keep cookies for the duration of the session' then cookies will be cleared when the session closes. Note that if <ph name="PRODUCT_NAME" /> is running in 'background mode', the session may not close when the last window is closed. Please see the 'BackgroundModeEnabled' policy for more information about configuring this behaviour.
 
           If this policy is left not set, 'AllowCookies' will be used and the user will be able to change it.</translation>
-<translation id="4098957623809244159">This policy is deprecated, use ProxyMode instead.
-
-          Allows you to specify the proxy server used by <ph name="PRODUCT_NAME" /> and ARC-apps and prevents users from changing proxy settings.
-
-          If you choose to never use a proxy server and always connect directly, all other options are ignored.
-
-          If you choose to use system proxy settings or auto detect the proxy server, all other options are ignored.
-
-          If you choose manual proxy settings, you can specify further options in 'Address or URL of proxy server', 'URL to a proxy .pac file' and 'Comma-separated list of proxy bypass rules'.
-
-          For detailed examples, visit:
-          <ph name="PROXY_HELP_URL" />
-
-          If you enable this setting, <ph name="PRODUCT_NAME" /> ignores all proxy-related options specified from the command line.
-
-          Leaving this policy not set will allow the users to choose the proxy settings on their own.</translation>
 <translation id="4103289232974211388">Redirect to SAML IdP after user confirmation</translation>
 <translation id="410478022164847452">Specifies the length of time without user input after which the idle action is taken when running on AC power.
 
@@ -1438,14 +1376,6 @@
 <translation id="5893553533827140852">If this setting is enabled, then gnubby authentication requests will be proxied across a remote host connection.
 
           If this setting is disabled or not configured, gnubby authentication requests will not be proxied.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> and ARC-apps will bypass any proxy for the list of hosts given here.
-
-          This policy only takes effect if you have selected manual proxy settings at 'Choose how to specify proxy server settings'.
-
-          You should leave this policy not set if you have selected any other mode for setting proxy policies.
-
-          For more detailed examples, visit:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Allow autoupdate downloads via HTTP</translation>
 <translation id="5921888683953999946">Set the default state of the large cursor accessibility feature on the login screen.
 
@@ -1971,9 +1901,6 @@
 
       If this setting is disabled or not set, <ph name="PRODUCT_NAME" /> uses either the user-specified preferred locale (if configured), the system locale or the default locale 'en-US'.</translation>
 <translation id="7651739109954974365">Determines whether data roaming should be enabled for the device. If set to true, data roaming is allowed. If left unconfigured or set to false, data roaming will be unavailable.</translation>
-<translation id="7667184304362487902">Configures the proxy settings for <ph name="PRODUCT_NAME" /> and ARC-apps.
-
-      This policy isn't ready for usage yet, please don't use it.</translation>
 <translation id="76810863974142048">URL where remote access clients should obtain their authentication token.
 
           If this policy is set, the remote access host will require authenticating clients to obtain an authentication token from this URL in order to connect. Must be used in conjunction with RemoteAccessHostTokenValidationUrl.
@@ -2206,6 +2133,7 @@
 
       The policy value should be specified in milliseconds.</translation>
 <translation id="8344454543174932833">Import bookmarks from default browser on first run</translation>
+<translation id="8359734107661430198">Enable ExampleDeprecatedFeature API through 2008/09/02</translation>
 <translation id="8360452361555133173">Enable showing the welcome page on the first browser launch following OS upgrade.
 
       If this policy is set to true or not configured, the browser will re-show the welcome page on the first launch following an OS upgrade.
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index d836474..c8fce600 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="es-419">
 <translation id="101438888985615157">Rotar la pantalla 180 grados</translation>
-<translation id="1015272884520659144">Define la lista de dispositivos USB que tienen autorización para separarse del controlador en modo kernel para usarse a través de la API chrome.usb directamente en la aplicación web. Las entradas son pares formados por el identificador del producto y del proveedor USB que permiten determinar un hardware específico.
-
-      Si esta política no se configura, se considera que la lista de dispositivos USB que se pueden separar está vacía.</translation>
 <translation id="1017967144265860778">Administración de energía en la pantalla de acceso</translation>
 <translation id="1019101089073227242">Configurar directorio de datos de usuarios</translation>
 <translation id="1022361784792428773">ID de extensiones que el usuario no debe poder instalar (o * para incluirlas todas).</translation>
@@ -64,7 +61,6 @@
       Si la política no se configura o se configura en false, los conjuntos de cifrado de RC4 en TLS no se habilitarán. De lo contrario, se puede configurar en true para mantener la compatibilidad con un servidor obsoleto. Esta medida es provisional y el servidor se debería volver a configurar.</translation>
 <translation id="1297182715641689552">Usar un script para proxy .pac</translation>
 <translation id="1304973015437969093">ID de extensiones/apps y direcciones URL de actualización para instalar en silencio</translation>
-<translation id="1310699457130669094">Puedes especificar una URL para un archivo .pac de proxy aquí. Esta política solo tiene efecto si se ha seleccionado la configuración manual de proxy en "Elegir cómo especificar la configuración del servidor proxy". No debes configurar esta política si se ha seleccionado cualquier otro modo de configuración de las políticas de proxy. Para ver ejemplos detallados, visita: <ph name="PROXY_HELP_URL" />.</translation>
 <translation id="1313457536529613143">Especifica el porcentaje de ajuste del tiempo de espera de inactividad de la pantalla cuando se observa la actividad del usuario con la pantalla oscurecida o poco después de que esta se haya desactivado.
 
           Si se establece esta política, se especificará el porcentaje de ajuste del tiempo de espera de inactividad de la pantalla cuando se observe la actividad del usuario con la pantalla oscurecida o poco después de que esta se haya desactivado. Cuando se ajusta el tiempo de espera de inactividad de la pantalla, se ajustan las demoras de desconexión, bloqueo y desactivación de la pantalla para mantener las mismas distancias del tiempo de espera de inactividad de la pantalla que la configuración original.
@@ -145,18 +141,6 @@
 <translation id="1561424797596341174">Anulaciones de políticas en compilaciones de depuración del host de acceso remoto</translation>
 <translation id="1583248206450240930">Utilizar <ph name="PRODUCT_FRAME_NAME" /> de manera predeterminada</translation>
 <translation id="1608755754295374538">Las URL que recibirán acceso a dispositivos de captura de audio sin solicitarlo</translation>
-<translation id="1613574633990410986">Te permite especificar el servidor proxy que usa <ph name="PRODUCT_NAME" /> y las apps de ARC, y evita que los usuarios cambien la configuración del proxy.
-
-      Si eliges no usar nunca un servidor proxy y conectarte siempre de forma directa, se ignoran todas las otras opciones.
-
-      Si eliges detectar de forma automática el servidor proxy, se ignoran todas las otras opciones.
-
-      Para conocer ejemplos detallados, visita:
-      <ph name="PROXY_HELP_URL" />
-
-      Si habilitas esta configuración, <ph name="PRODUCT_NAME" /> y las apps de ARC ignoran todas las opciones relacionadas con el proxy que se especificaron en la línea de comandos.
-
-      Si no estableces esta política, los usuarios podrán elegir las opciones de configuración por su cuenta.</translation>
 <translation id="1617235075406854669">Habilita la eliminación del historial de descargas y del navegador.</translation>
 <translation id="1617384279878333801">Habilitar opción para agregar persona al administrador de perfiles</translation>
 <translation id="1655229863189977773">Establecer el tamaño del caché de disco en bytes</translation>
@@ -237,7 +221,6 @@
       Si esta opción se habilita, aparecerá un gran botón de color rojo para cerrar sesión en la bandeja del sistema mientras la sesión esté activa y la pantalla no esté bloqueada.
 
       Si la opción se inhabilita o no se especifica, no se mostrará ningún botón en la bandeja del sistema.</translation>
-<translation id="1942957375738056236">Puedes especificar la URL del servidor proxy aquí. Esta política solo se aplica si se ha seleccionado la configuración manual de proxy en "Elegir cómo especificar la configuración del servidor proxy". No se debe configurar esta política si se ha seleccionado cualquier otro modo de configurar políticas de proxy. Para obtener más opciones y ejemplos detallados, visita: <ph name="PROXY_HELP_URL" />.</translation>
 <translation id="1956493342242507974">Configura la administración de energía en la pantalla de acceso en <ph name="PRODUCT_OS_NAME" />.
 
       Esta política te permite configurar el comportamiento de <ph name="PRODUCT_OS_NAME" /> cuando el usuario está inactivo durante cierta cantidad de tiempo en la que aparece la pantalla de acceso. Esta política controla varios parámetros de configuración. Para conocer la semántica y los rangos de valor individuales, consulta las políticas correspondientes que controlan la administración de energía dentro de una sesión. Las únicas divergencias de estas políticas son las siguientes:
@@ -594,24 +577,6 @@
 <translation id="3072847235228302527">Establecer las Condiciones del servicio para la cuenta local del dispositivo</translation>
 <translation id="3096595567015595053">Lista de complementos habilitados</translation>
 <translation id="3101501961102569744">Elegir cómo especificar la configuración del servidor proxy</translation>
-<translation id="3125884964575432854">Te permite especificar el servidor proxy que usa <ph name="PRODUCT_NAME" /> y las apps de ARC, y evita que los usuarios cambien la configuración del proxy.
-
-          Si eliges no usar nunca un servidor proxy y conectarte siempre de forma directa, se ignoran todas las otras opciones.
-
-          Si eliges usar la configuración del proxy del sistema, se ignoran todas las otras opciones.
-
-          Si eliges detectar de forma automática el servidor proxy, se ignoran todas las otras opciones.
-
-          Si eliges el modo de proxy de servidor fijo, puedes especificar más opciones en los campos "Dirección o URL del servidor proxy" y "Lista separada por comas de las reglas de omisión del proxy". Las apps de ARC solo podrán usar el servidor proxy HTTP con la prioridad más alta.
-
-          Si eliges usar una secuencia de comandos para el proxy con formato .pac, debes especificar la URL de la secuencia de comandos en el campo "URL para el archivo .pac de proxy".
-
-          Para conocer ejemplos detallados, visita:
-          <ph name="PROXY_HELP_URL" />
-
-          Si habilitas esta configuración, <ph name="PRODUCT_NAME" /> y las apps de ARC ignoran todas las opciones relacionadas con el proxy que se especificaron en la línea de comandos.
-
-          Si no estableces esta política, los usuarios podrán elegir las opciones de configuración por su cuenta.</translation>
 <translation id="3153348162326497318">Te permite especificar qué extensiones NO pueden instalar los usuarios. Las extensiones ya instaladas se eliminarán si están en la lista negra. Un valor "*" en la lista negra indica que todas las extensiones figuran en la lista negra a menos que aparezcan explícitamente en la lista blanca. Si esta política no se configura, el usuario puede instalar cualquier extensión en <ph name="PRODUCT_NAME" /> .</translation>
 <translation id="316778957754360075">Esta opción se eliminó a partir de la versión 29 de <ph name="PRODUCT_NAME" />. La forma recomendada de configurar colecciones de aplicaciones o extensiones alojadas por una organización es incluir el sitio que aloja los paquetes CRX en la política ExtensionInstallSources y colocar vínculos de descarga directa a los paquetes en una página web. Se puede crear un selector para esa página web con la política ExtensionInstallForcelist.</translation>
 <translation id="3185009703220253572">desde la versión <ph name="SINCE_VERSION" /></translation>
@@ -845,22 +810,6 @@
           Si esta política se establece en "Guardar las cookies durante la sesión", las cookies se borrarán cuando se cierre la sesión. Se debe tener en cuenta que si <ph name="PRODUCT_NAME" /> se está ejecutando en "modo en segundo plano", es posible que la sesión no se cierre cuando se cierre la última ventana. Para obtener más información sobre cómo configurar este comportamiento, se debe consultar la política "BackgroundModeEnabled". 
 
           Si esta política no se establece, se usará "AllowCookies" y el usuario podrá modificarlo.</translation>
-<translation id="4098957623809244159">Esta política dejó de estar disponible; en su lugar, se usa ProxyMode.
-
-          Te permite especificar el servidor proxy que usa <ph name="PRODUCT_NAME" /> y las apps de ARC, y evita que los usuarios cambien la configuración del proxy.
-
-          Si eliges no usar nunca un servidor proxy y conectarte siempre de forma directa, se ignoran todas las otras opciones.
-
-          Si eliges usar la configuración del proxy del sistema o detectar de forma automática el servidor proxy, se ignoran todas las otras opciones.
-
-          Si eliges la configuración manual del proxy, puedes especificar más opciones en los campos "Dirección o URL del servidor proxy" y "Lista separada por comas de las reglas de omisión del proxy".
-
-          Para conocer ejemplos detallados, visita:
-          <ph name="PROXY_HELP_URL" />
-
-          Si habilitas esta configuración, <ph name="PRODUCT_NAME" /> ignora todas las opciones relacionadas con el proxy que se especificaron en la línea de comandos.
-
-          Si no estableces esta política, los usuarios podrán elegir las opciones de configuración por su cuenta.</translation>
 <translation id="4103289232974211388">Redireccionar al IdP de SAML después de la confirmación del usuario</translation>
 <translation id="410478022164847452">Especifica el período de tiempo sin intervención del usuario después de que se tome la medida de inactividad si se usa alimentación de CA.
 
@@ -1282,14 +1231,6 @@
 <translation id="5893553533827140852">Si esta opción está habilitada, las solicitudes de autenticación gnubby se representarán a través de una conexión de host remota.
 
           Si esta opción está inhabilitada o no está configurada, no se representarán solicitudes de autenticación gnubby.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> y las apps de ARC omitirán cualquier proxy para la lista de hosts que se especifica aquí.
-
-          Esta política solo se aplica si se seleccionó la configuración manual de proxy en "Elegir cómo especificar la configuración del servidor proxy".
-
-          No establezcas esta política si seleccionaste otro modo para configurar políticas de proxy.
-
-          Para conocer ejemplos detallados, visita:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Permitir descargas de actualizaciones automáticas a través de HTTP</translation>
 <translation id="5921888683953999946">Establece el estado predeterminado de la función de accesibilidad del cursor grande en la pantalla de acceso.
 
@@ -1771,9 +1712,6 @@
 <translation id="7632724434767231364">Nombre de la biblioteca GSSAPI</translation>
 <translation id="7635471475589566552">Al establecer la configuración regional de la aplicación en <ph name="PRODUCT_NAME" />, los usuarios no pueden cambiar la configuración regional. Si se habilita esta configuración, <ph name="PRODUCT_NAME" /> usará la configuración regional especificada. Si la configuración regional no se admite, se usará "en-US" en su lugar. Si esta opción se inhabilita o no se configura, <ph name="PRODUCT_NAME" /> usará la configuración regional preferida que haya especificado el usuario (si está configurada), la configuración regional del sistema o la configuración regional alternativa "en-US".</translation>
 <translation id="7651739109954974365">Determina si la itinerancia de datos debe activarse en el dispositivo. Si el valor se establece en "true", se permite la itinerancia de datos. Si no se configura o si se establece en "false", la itinerancia de datos no estará disponible.</translation>
-<translation id="7667184304362487902">Establece la configuración de proxy para <ph name="PRODUCT_NAME" /> y apps de ARC.
-
-      Esta política todavía no puede usarse.</translation>
 <translation id="76810863974142048">URL donde los clientes de acceso remoto deben obtener el token de autenticación.
 
           Si esta política se establece, el host de acceso remoto requerirá que los clientes que se autentiquen obtengan un token de autenticación de esta URL para conectarse. Se debe usar junto con RemoteAccessHostTokenValidationUrl.
@@ -2152,7 +2090,7 @@
 
           El valor de la política debe especificarse en milisegundos. Los valores se establecerán para que sean inferiores a la demora de inactividad.</translation>
 <translation id="891435090623616439">codificada como cadena JSON; para obtener detalles, se puede consultar <ph name="COMPLEX_POLICIES_URL" /></translation>
-<translation id="8929359433203547810">Si esta política se establece como falsa, <ph name="PRODUCT_OS_NAME" /> inhabilitará Bluetooth y el usuario no podrá volver a habilitarlo.
+<translation id="8929359433203547810">Si esta política se establece como falsa, <ph name="PRODUCT_OS_NAME" /> inhabilitará Bluetooth, y el usuario no podrá volver a habilitarlo.
 
       Si esta política se establece como verdadera o no se establece, el usuario podrá habilitar o inhabilitar Bluetooth como lo desee.
 
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index 32b031e..39e40b4 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="es">
 <translation id="101438888985615157">Girar la pantalla 180 grados</translation>
-<translation id="1015272884520659144">Define la lista de dispositivos USB que pueden separarse de su controlador de kernel para utilizarse en la API chrome.usb directamente en una aplicación web. Las entradas son pares del identificador de producto y el identificador de proveedor del USB que permiten reconocer hardware específico.
-
-      Si no se configura esta política, la lista de dispositivos USB que se pueden separar se considera vacía.</translation>
 <translation id="1017967144265860778">Administración de energía en la pantalla de inicio de sesión</translation>
 <translation id="1019101089073227242">Establecer directorio de datos de usuarios</translation>
 <translation id="1022361784792428773">ID de extensiones que el usuario no debe poder instalar (o * para incluirlas todas)</translation>
@@ -72,14 +69,6 @@
       Si la política no se establece o se le asigna el valor false, no se habilitarán los conjuntos de cifrado de RC4 en TLS. Si por el contrario se le asigna el valor true, mantendrá la compatibilidad con un servidor obsoleto. Se trata de una medida provisional y el servidor se debería volver a configurar.</translation>
 <translation id="1297182715641689552">Utilizar una secuencia de comandos .pac de proxy</translation>
 <translation id="1304973015437969093">IDs de extensiones/aplicaciones y URLs de actualización que se instalan automáticamente</translation>
-<translation id="1310699457130669094">Permite especificar la URL de un archivo .pac de proxy.
-
-          Esta política solo tendrá validez si has seleccionado una configuración manual del proxy en la opción Seleccionar la forma de especificar la configuración del servidor proxy.
-
-          Te recomendamos que no establezcas esta política si has seleccionado cualquier otro modo de configuración de políticas de proxy.
-
-          Puedes consultar ejemplos detallados en la siguiente página:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Especifica el porcentaje de ajuste del tiempo de espera de inactividad de la pantalla cuando se observa la actividad del usuario con la pantalla oscurecida o poco después de que esta se haya desactivado.
 
           Si se establece esta política, se especificará el porcentaje de ajuste del tiempo de espera de inactividad de la pantalla cuando se observe la actividad del usuario con la pantalla oscurecida o poco después de que esta se haya desactivado. Cuando se ajusta el tiempo de espera de inactividad de la pantalla, se ajustan los retrasos de desconexión, bloqueo y desactivación de la pantalla para mantener las mismas distancias del tiempo de espera de inactividad de la pantalla que la configuración original.
@@ -159,18 +148,6 @@
 <translation id="1561424797596341174">La política anula las compilaciones de depuración del host de acceso remoto.</translation>
 <translation id="1583248206450240930">Utilizar <ph name="PRODUCT_FRAME_NAME" /> de forma predeterminada</translation>
 <translation id="1608755754295374538">URLs a las que se concederá acceso a dispositivos de captura de audio sin confirmación</translation>
-<translation id="1613574633990410986">Permite especificar el servidor proxy que utilizan <ph name="PRODUCT_NAME" /> y las aplicaciones ARC, e impide que los usuarios cambien la configuración del proxy.
-
-      Si eliges la opción de establecer siempre conexión directamente en lugar de utilizar un servidor proxy, se ignorarán las demás opciones.
-
-      Si eliges la opción de detectar automáticamente el servidor proxy, se ignorarán las demás opciones.
-
-      Puedes consultar ejemplos detallados en la siguiente página:
-      <ph name="PROXY_HELP_URL" />
-
-      Si habilitas esta opción, <ph name="PRODUCT_NAME" /> y las aplicaciones ARC ignorarán todas las opciones relacionadas con el proxy especificadas en la línea de comandos.
-
-      Si no se establecen estas políticas, los usuarios podrán elegir la configuración de proxy que quieran.</translation>
 <translation id="1617235075406854669">Habilitar eliminación de historial de navegación y de descargas</translation>
 <translation id="1617384279878333801">Habilitar la opción para añadir usuarios en el administrador de perfiles</translation>
 <translation id="1655229863189977773">Establecer tamaño de caché de disco en bytes</translation>
@@ -265,14 +242,6 @@
       Si esta opción se habilita, aparecerá un gran botón de color rojo para cerrar sesión en la bandeja del sistema mientras la sesión esté activa y la pantalla no esté bloqueada.
 
       Si la opción se inhabilita o no se especifica, no se mostrará ningún botón rojo en la bandeja del sistema.</translation>
-<translation id="1942957375738056236">Permite especificar la URL del servidor proxy.
-
-          Esta política solo tendrá validez si has seleccionado una configuración manual del proxy en la opción Seleccionar la forma de especificar la configuración del servidor proxy.
-
-          Si has seleccionado otro modo para configurar las políticas del servidor proxy, te recomendamos que no establezcas esta política.
-
-          Puedes consultar ejemplos detallados en la siguiente página:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Permite configurar la administración de energía en la pantalla de inicio de sesión de <ph name="PRODUCT_OS_NAME" />.
 
       Esta política te permite configurar el comportamiento de <ph name="PRODUCT_OS_NAME" /> cuando no hay actividad del usuario durante cierto tiempo mientras se muestra la pantalla de inicio de sesión. La política controla varias opciones. Para obtener información sobre los intervalos de valores y la semántica de estas opciones, consulta las políticas correspondientes que controlan la administración de energía en una sesión. Las únicas desviaciones de estas políticas son:
@@ -663,24 +632,6 @@
 <translation id="3072847235228302527">Establecer las Condiciones de servicio para una cuenta de dispositivo local</translation>
 <translation id="3096595567015595053">Lista de complementos habilitados</translation>
 <translation id="3101501961102569744">Seleccionar la forma de especificar la configuración del servidor proxy</translation>
-<translation id="3125884964575432854">Permite especificar el servidor proxy que utilizan <ph name="PRODUCT_NAME" /> y las aplicaciones ARC, e impide que los usuarios cambien la configuración del proxy.
-
-          Si eliges la opción de establecer siempre conexión directamente en lugar de utilizar un servidor proxy, se ignorarán las demás opciones.
-
-          Si eliges la opción de usar la configuración de proxy del sistema, se ignorarán las demás opciones.
-
-          Si eliges la opción de detectar automáticamente el servidor proxy, se ignorarán las demás opciones.
-
-          Si decides configurar el servidor proxy manualmente, puedes especificar más opciones en Dirección o URL de servidor proxy y en Lista de reglas de omisión de proxy separadas por comas. Las aplicaciones ARC solo usarán el servidor proxy HTTP con la mayor prioridad.
-
-          Si decides usar una secuencia de comandos .pac de proxy, deberás especificar la URL de la secuencia en URL de un archivo .pac de proxy.
-
-          Puedes consultar ejemplos detallados en la siguiente página:
-          <ph name="PROXY_HELP_URL" />
-
-          Si habilitas esta opción, <ph name="PRODUCT_NAME" /> y las aplicaciones ARC ignorarán todas las opciones relacionadas con el proxy especificadas en la línea de comandos.
-
-          Si no se establece esta política, los usuarios podrán elegir su propia configuración del proxy.</translation>
 <translation id="3153348162326497318">Permite especificar las extensiones que los usuarios NO pueden instalar. Si se incluyen en la lista negra extensiones que ya estén instaladas, estas se eliminarán.
 
           El valor de asterisco "*" indica que todas las extensiones están incluidas en la lista negra, salvo las que se incluyan explícitamente en la lista de admisión.
@@ -753,6 +704,7 @@
       Si esta opción se habilita o no se configura, los usuarios podrán habilitar el proxy de Google Cloud Print si realizan el proceso de autenticación con sus cuentas de Google.
 
       Si se inhabilita esta opción, los usuarios no podrán habilitar el proxy y el ordenador no podrá compartir las impresoras conectadas con <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Permite finalizar precesos en el Administrador de tareas</translation>
 <translation id="3322771899429619102">Te permite establecer una lista de patrones de URL para especificar los sitios web que pueden utilizar la generación de claves. Si un patrón de URL está en KeygenBlockedForUrls, se anularán estas excepciones.
 
        Si no se establece esta política, se utilizará el valor general predeterminado de la política DefaultKeygenSetting (si está configurada) para todos los sitios web. De lo contrario, se utilizará la configuración personalizada que haya definido el usuario.</translation>
@@ -937,22 +889,6 @@
           Si se ha establecido la opción Guardar las cookies durante la duración de la sesión para esta política, las cookies se borrarán cuando la sesión se cierre. Ten en cuenta que si <ph name="PRODUCT_NAME" /> se está ejecutando en segundo plano, es posible que la sesión no se cierre al cerrar la última ventana. Consulta la política BackgroundModeEnabled para obtener más información sobre la configuración de este comportamiento.
 
           Si no se establece ningún valor para esta política, se utilizará AllowCookies, aunque el usuario podrá cambiarla.</translation>
-<translation id="4098957623809244159">Esta política está obsoleta. Te recomendamos que utilices ProxyMode en su lugar.
-
-          Permite especificar el servidor proxy que utilizan <ph name="PRODUCT_NAME" /> y las aplicaciones ARC, e impide que los usuarios cambien la configuración del proxy.
-
-          Si eliges la opción de establecer siempre conexión directamente en lugar de utilizar un servidor proxy, se ignorarán las demás opciones.
-
-          Si eliges la opción de utilizar la configuración de proxy del sistema o detectar automáticamente el servidor proxy, se ignorarán las demás opciones.
-
-         Si decides configurar el servidor proxy manualmente, puedes especificar más opciones en Dirección o URL del servidor proxy, URL de un archivo .pac de proxy y Lista de reglas de omisión de proxy separadas por comas.
-
-          Puedes consultar ejemplos detallados en la siguiente página:
-          <ph name="PROXY_HELP_URL" />
-
-          Si habilitas esta opción, <ph name="PRODUCT_NAME" /> ignorará todas las opciones relacionadas con el proxy especificadas en la línea de comandos.
-
-          Si no se establece esta política, los usuarios podrán elegir la configuración de proxy que quieran.</translation>
 <translation id="4103289232974211388">Redirigir al proveedor de identidad SAML después de la confirmación del usuario</translation>
 <translation id="410478022164847452">Permite especificar el tiempo transcurrido hasta que se entra en modo de inactividad (sin que el usuario realice ninguna acción) cuando el dispositivo está conectado a la red.
 
@@ -1435,14 +1371,6 @@
 <translation id="5893553533827140852">Si esta opción está habilitada, las solicitudes de autenticación gnubby se representarán a través de una conexión de host remota.
 
           Si esta opción está inhabilitada o no está configurada, no se representarán solicitudes de autenticación gnubby.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> y las aplicaciones ARC omitirán cualquier proxy que se incluya en la lista de hosts especificada.
-
-          Esta política solo tendrá validez si has seleccionado una configuración manual del proxy en la opción Seleccionar la forma de especificar la configuración del servidor proxy.
-
-          No se debe establecer esta política si se ha seleccionado cualquier otro modo de configuración de políticas de proxy.
-
-          Puedes consultar ejemplos detallados en la siguiente página:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Permitir descargas de actualizaciones automáticas a través de HTTP</translation>
 <translation id="5921888683953999946">Establece el estado predeterminado de la función de accesibilidad del cursor grande en la pantalla de inicio de sesión.
 
@@ -1961,9 +1889,6 @@
 
       Si esta opción se inhabilita o no se configura, <ph name="PRODUCT_NAME" /> usa la configuración regional preferida y especificada por el usuario (si está configurada), la configuración regional del sistema o la configuración regional de reserva "en-US".</translation>
 <translation id="7651739109954974365">Permite determinar la habilitación de la itinerancia de datos en el dispositivo. Si el valor se establece en "true", se permite la itinerancia de datos. Si no se configura o si el valor se establece en "false", la itinerancia de datos no estará disponible.</translation>
-<translation id="7667184304362487902">Permite establecer los valores de configuración de proxy de <ph name="PRODUCT_NAME" /> y de las aplicaciones ARC.
-
-      Esta política aún no está lista para su uso, así que no debes utilizarla.</translation>
 <translation id="76810863974142048">URL donde los clientes de acceso remoto deben obtener su token de autenticación.
 
           Si se configura esta política, el host de acceso remoto necesitará la autenticación de los clientes para obtener un token de autenticación de esta URL y poder conectarse. Se debe aplicar junto con la política RemoteAccessHostTokenValidationUrl.
@@ -2191,6 +2116,7 @@
 
       El valor correspondiente a esta política se debe especificar en milisegundos.</translation>
 <translation id="8344454543174932833">Importa los marcadores desde el navegador predeterminado en la primera ejecución.</translation>
+<translation id="8359734107661430198">Habilitar el API ExampleDeprecatedFeature hasta el 02/09/2008</translation>
 <translation id="8360452361555133173">Permite que se muestre la página de bienvenida la primera vez que se inicia el navegador después de actualizar el sistema operativo.
 
       Si se asigna el valor true a esta política o si esta no se configura, el navegador volverá a mostrar la página de bienvenida la primera vez que inicies el navegador después de actualizar el sistema operativo.
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb
index 159c5a1..fe00c57 100644
--- a/components/policy/resources/policy_templates_et.xtb
+++ b/components/policy/resources/policy_templates_et.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="et">
 <translation id="101438888985615157">Ekraani pööramine 180 kraadi</translation>
-<translation id="1015272884520659144">Luuakse loend USB-seadmetest, mis lubatakse eemaldada tuumadraiverist, et neid veebirakenduses otse chrome.usb API kaudu kasutada. Kirjed on USB teenusepakkuja ID-de ja toote ID-de paarid, mille abil konkreetne riistvara tuvastada.
-
-      Kui see reegel jäetakse seadistamata, peetakse eemaldatavate USB-seadmete loendit tühjaks.</translation>
 <translation id="1017967144265860778">Toitehaldus sisselogimiskuval</translation>
 <translation id="1019101089073227242">Kasutaja andmete kataloogi määramine</translation>
 <translation id="1022361784792428773">Laienduste ID-d, mida kasutajatel ei ole lubatud installida (märk * keelab kõik)</translation>
@@ -73,14 +70,6 @@
       Kui reegel on määramata või selle väärtuseks on määratud Väär, siis ei ole RC4 šifreerimiskomplektid TLS-is lubatud. Selle väärtuseks võib olla määratud ka Tõene, et säilitada ühilduvus aegunud serveriga. See on ajutine meede ja server tuleks ümber seadistada.</translation>
 <translation id="1297182715641689552">Kasuta puhverserveri pac-skripti</translation>
 <translation id="1304973015437969093">Taustal installitavate laienduste/rakenduste ID-d ja värskenduste URL-id</translation>
-<translation id="1310699457130669094">Siin saate määrata puhverserveri pac-faili URL-i.
-
-          Reegel kehtib vaid juhul, kui valisite jaotises „Valige puhverserveri seadete määramise viis” puhverserveri käsitsi seadistamise.
-
-          Jätke see reegel määramata, kui valisite puhverserveri reeglite määramiseks muu viisi.
-
-          Vaadake üksikasjalikke näiteid:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Määratleb ekraani tumenduse viivituse skaleerimismäära protsentides, kui täheldatakse kasutaja tegevust ekraani tumendamise ajal või peagi pärast ekraani väljalülitumist.
 
           Reegel määratleb ekraani tumenduse viivituse skaleerimismäära protsentides, kui täheldatakse kasutaja tegevust ekraani tumendamise ajal või peagi pärast ekraani väljalülitumist. Tumenduse viivituse skaleerimisel reguleeritakse ekraani väljalülitumise, ekraaniluku ja tegevusetu oleku viivitusi, et säilitada ekraanitumenduse viivitusest samu kaugusi mis algselt seadistatud.
@@ -163,18 +152,6 @@
 <translation id="1561424797596341174">Kaugjuurdepääsu hosti silumisjärkude reeglite alistused</translation>
 <translation id="1583248206450240930">Kasuta vaikimisi rakendust <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="1608755754295374538">URL-id, millele antakse ilma küsimata juurdepääs helijäädvustusseadmetele</translation>
-<translation id="1613574633990410986">Võimaldab määrata puhverserveri, mida kasutavad brauser <ph name="PRODUCT_NAME" /> ja ARC-rakendused, ning takistab kasutajaid puhverserveri seadeid muutmast.
-
-      Kui otsustate puhverserverit mitte kunagi kasutada ja luua ühenduse alati otse, eiratakse kõiki muid valikuid.
-
-      Kui valite puhverserveri automaatse tuvastamise, eiratakse kõiki muid valikuid.
-
-      Vaadake üksikasjalikke näiteid:
-      <ph name="PROXY_HELP_URL" />
-
-      Kui lubate selle seade, eiravad brauser <ph name="PRODUCT_NAME" /> ja ARC-rakendused kõiki käsurealt määratud puhverserveriga seotud valikuid.
-
-      Kui jätate reegli määramata, saavad kasutajad ise puhverserveri seaded valida.</translation>
 <translation id="1617235075406854669">Brauseri ja allalaadimiste ajaloo kustutamise lubamine</translation>
 <translation id="1617384279878333801">Inimese profiilihalduris lisamise lubamine</translation>
 <translation id="1655229863189977773">Määrake ketta vahemälu suurus baitides</translation>
@@ -265,14 +242,6 @@
       Seade lubamisel ilmub süsteemisalves suur punane väljalogimisnupp, kui seanss on aktiivne ja ekraan ei ole lukustatud.
 
       Kui seade on keelatud või määramata, ei kuvata süsteemisalves suurt punast nuppu.</translation>
-<translation id="1942957375738056236">Siin saate määrata puhverserveri URL-i.
-
-          See reegel jõustub vaid juhul, kui valisite jaotises „Valige puhverserveri seadete määramise viis” puhverserveri käsitsi seadistamise.
-
-          Jätke see reegel määramata, kui valisite puhverserveri reeglite määramiseks muu režiimi.
-
-          Vaadake lisavalikuid ja üksikasjalikke näiteid aadressilt:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Toitehalduse seadistamine sisselogimisekraanil operatsioonisüsteemis <ph name="PRODUCT_OS_NAME" />.
 
       Selle reegliga saate seadistada, kuidas <ph name="PRODUCT_OS_NAME" /> käitub, kui kuvatakse sisselogimisekraan ja kasutaja ei tee teatud aja jooksul ühtegi toimingut. See reegel juhib mitut seadet. Individuaalset semantikat ja väärtusevahemikke vaadake vastavatest seansi toitehaldust juhtivatest reeglitest. Ainsad kõrvalekalded nendest reeglitest on järgmised.
@@ -661,25 +630,6 @@
 <translation id="3072847235228302527">Teenusetingimuste määramine seadmes kasutatava konto jaoks</translation>
 <translation id="3096595567015595053">Lubatud pistikprogrammide loend</translation>
 <translation id="3101501961102569744">Valimine, kuidas määrata puhverserveri seaded</translation>
-<translation id="3125884964575432854">Võimaldab määrata puhverserveri, mida kasutavad brauser <ph name="PRODUCT_NAME" /> ja ARC-rakendused, ning takistab kasutajaid puhverserveri seadeid muutmast.
-
-          Kui otsustate puhverserverit mitte kunagi kasutada ja luua ühenduse alati otse, eiratakse kõiki muid valikuid.
-
-          Kui otsustate kasutada süsteemi puhverserveri seadeid, eiratakse kõiki muid valikuid.
-
-          Kui valite puhverserveri automaatse tuvastamise, eiratakse kõiki muid valikuid.
-
-
-          Kui valite serveri fikseeritud puhverrežiimi, saate määrata täpsemad valikud jaotistes „Puhverserveri aadress või URL” ja „Puhverserveri möödumisreeglite komaeraldusega loend”. ARC-rakendused kasutavad ainult kõrgeima prioriteediga HTTP-puhverserverit.
-
-          Kui otsustate kasutada puhverserveri PAC-skripti, tuleb teil määrata skripti URL jaotises „Puhverserveri PAC-faili URL”.
-
-          Vaadake üksikasjalikke näiteid:
-          <ph name="PROXY_HELP_URL" />
-
-          Kui lubate selle seade, eiravad brauser <ph name="PRODUCT_NAME" /> ja ARC-rakendused kõiki käsurealt pärinevaid puhverserveriga seotud valikuid.
-
-          Kui jätate reegli määramata, saavad kasutajad ise puhverserveri seaded valida.</translation>
 <translation id="3153348162326497318">Võimaldab määrata, milliseid laiendusi kasutajad EI saa installida. Juba installitud rakendused eemaldatakse, kui need on mustas nimekirjas. Kui mustas nimekirjas on väärtus „*”, siis kantakse kõik laiendused musta nimekirja, kui need ei ole eraldi lisatud lubatud nimekirja. Kui reeglit ei määrata, siis saab kasutaja rakenduses <ph name="PRODUCT_NAME" /> installida kõik laiendused.</translation>
 <translation id="316778957754360075">See seade on alates rakenduse <ph name="PRODUCT_NAME" /> versioonist 29 kasutusest kõrvaldatud. Organisatsiooni majutatud laienduse-/rakendusekogude seadistamiseks on soovitatav kaasata sait, mis hostib üksuses ExtensionInstallSources CRX-pakette ja paneb pakettide allalaadimise otselingid veebilehele. Selle veebilehe käivitaja saab luua reegliga ExtensionInstallForcelist.</translation>
 <translation id="3185009703220253572">alates versioonist <ph name="SINCE_VERSION" /></translation>
@@ -744,6 +694,7 @@
       Kui seade on lubatud või seadistamata, saavad kasutajad lubada pilvprintimise puhverserveri Google'i kontoga autentides.
 
       Kui seade on keelatud, ei saa kasutajad puhverserverit lubada ja seadmel ei ole lubatud jagada printereid teenusega <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Lubab protsessid tegumihalduris lõpetada</translation>
 <translation id="3322771899429619102">Võimaldab määrata URL-i mustrite loendi, mis määrab saidid, millel on lubatud kasutada võtmete loomist. Kui URL-i muster on loendis „KeygenBlockedForUrls”, alistab see need erandid.
 
           Kui jätate reegli määramata, kasutatakse kõikide saitide puhul globaalset vaikeväärtust, mis pärineb reeglist „DefaultKeygenSetting”, kui see on määratud, või kasutaja isiklikku seadistust.</translation>
@@ -924,22 +875,6 @@
           Kui selle reegli väärtuseks määratakse „Säilita küpsisefailid seansi ajaks”, siis kustutatakse küpsisefailid seansi lõppedes. Pange tähele, et kui teenus <ph name="PRODUCT_NAME" /> töötab „taustarežiimis”, ei pruugi seanss viimase akna sulgemisel lõppeda. Lisateavet sellise toimimise seadistamise kohta leiate reeglist „BackgroundModeEnabled”.
 
           Kui seda reeglit pole määratud, kasutatakse reeglit „AllowCookies” ja kasutaja saab seda muuta.</translation>
-<translation id="4098957623809244159">See reegel on iganenud, kasutage selle asemel reeglit ProxyMode.
-
-          Võimaldab määrata puhverserveri, mida kasutavad brauser <ph name="PRODUCT_NAME" /> ja ARC-rakendused, ning takistab kasutajaid puhverserveri seadeid muutmast.
-
-          Kui otsustate puhverserverit mitte kasutada ja alati otse ühenduse luua, eiratakse kõiki muid valikuid.
-
-          Kui otsustate kasutada süsteemi puhverserveri seadeid või puhverserveri automaatselt tuvastada, eiratakse kõiki muid valikuid.
-
-          Kui valite puhverserveri seaded käsitsi, saate määrata täpsemad valikud jaotistes „Puhverserveri aadress või URL”, „Puhverserveri PAC-faili URL” ja „Puhverserveri möödumisreeglite komaeraldusega loend”.
-
-          Vaadake üksikasjalikke näiteid:
-          <ph name="PROXY_HELP_URL" />.
-
-          Kui lubate selle seade, eirab brauser <ph name="PRODUCT_NAME" /> kõiki käsurealt määratud puhverserveriga seotud valikuid.
-
-          Kui jätate reegli määramata, saavad kasutajad ise valida puhverserveri seaded.</translation>
 <translation id="4103289232974211388">Pärast kasutaja kinnitust SAML IdP-le ümbersuunamine</translation>
 <translation id="410478022164847452">Määrab aja, pärast mida lülitatakse võrgutoite kasutamisel sisse jõudeolek, kui kasutaja pole midagi sisestanud.
 
@@ -1419,14 +1354,6 @@
 <translation id="5893553533827140852">Kui see seade on lubatud, siis edastatakse gnubby autentimistaotlused puhverserverisse kaughosti ühenduse abil.
 
           Kui see seade on keelatud või seadistamata, siis ei edastata gnubby autentimistaotlusi puhverserveri abil.</translation>
-<translation id="5900959132054596599">Brauser <ph name="PRODUCT_NAME" /> ja ARC-rakendused mööduvad siin loetletud hostide puhul kõikidest puhverserveritest.
-
-          Reegel kehtib vaid juhul, kui valisite jaotises „Valige puhverserveri seadete määramise viis” puhverserveri käsitsi seadistamise.
-
-          Jätke see reegel määramata, kui valisite puhverserveri reeglite seadistamiseks muu viisi.
-
-          Vaadake üksikasjalikke näiteid:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Automaatsete allalaadimiste lubamine HTTP kaudu</translation>
 <translation id="5921888683953999946">Sisselogimisekraanil suure kursori hõlbustusfunktsiooni vaikeoleku määramine.
 
@@ -1951,9 +1878,6 @@
 
       Kui keelate seade või jätate selle määramata, kasutab rakendus <ph name="PRODUCT_NAME" /> kasutaja määratud eelistatud lokaati (kui see on seadistatud), süsteemi lokaati või varulokaati „en-US”.</translation>
 <translation id="7651739109954974365">Määrab, kas seadmes on andmeside rändlusteenus lubatud. Selle reegli aktiveerimisel on andmeside rändlusteenus lubatud. Kui jätate selle reegli seadistamata või keelate, siis ei ole andmeside rändlusteenus saadaval.</translation>
-<translation id="7667184304362487902">Seadistab brauseri <ph name="PRODUCT_NAME" /> ja ARC-rakenduste puhverserveri seaded.
-
-      See reegel ei ole veel kasutamiseks valmis, ärge kasutage seda.</translation>
 <translation id="76810863974142048">URL, kust kaugjuurdepääsu kliendid peavad hankima autentimismärgi.
 
           Kui reegel on määratud, nõuab kaugjuurdepääsu host, et kliendid hangiksid autentimiseks ja ühenduse loomiseks sellelt URL-ilt märgi. Reeglit tuleb kasutada koos reegliga RemoteAccessHostTokenValidationUrl.
@@ -2184,6 +2108,7 @@
 
       Määrake reegli väärtus millisekundites.</translation>
 <translation id="8344454543174932833">Impordi järjehoidjad vaikebrauserist esmakordsel käitamisel</translation>
+<translation id="8359734107661430198">Luba ExampleDeprecatedFeature API kuni 02.09.2008</translation>
 <translation id="8360452361555133173">Lubab brauseri esmakordsel käivitamisel pärast operatsioonisüsteemi täiendamist näidata tervituslehte.
 
       Kui reegli väärtuseks määratakse Tõene või seda ei seadistata, kuvab brauser esmakordsel käivitamisel pärast operatsioonisüsteemi täiendamist uuesti tervituslehe.
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb
index 43148e6b..94f6e2a 100644
--- a/components/policy/resources/policy_templates_fa.xtb
+++ b/components/policy/resources/policy_templates_fa.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fa">
 <translation id="101438888985615157">چرخش صفحه تا ۱۸۰ درجه</translation>
-<translation id="1015272884520659144">‏فهرستی از دستگاه‌های USB تعریف می‌کند که مجاز به جداشدن از درایور کرنل خود هستند تا از طریق chrome.usb API مستقیماً در داخل برنامه‌ای از وب استفاده شوند. ورودی‌ها جفت شناسه‌های محصول و فروشنده USB هستند که برای شناسایی یک سخت‌افزار خاص استفاده می‌شوند.
-
-      اگر این خط‌مشی پیکربندی نشود، فهرست دستگاه‌های قابل جداشدن USB خالی درنظر گرفته می‌شود.</translation>
 <translation id="1017967144265860778">مدیریت نیرو در صفحه ورود به سیستم</translation>
 <translation id="1019101089073227242">تنظیم دایرکتوری داده‌های کاربر</translation>
 <translation id="1022361784792428773">شناسه افزونه‌هایی که کاربران نباید آن‌ها را نصب کنند (علامت * برای همه)</translation>
@@ -62,7 +59,6 @@
       اگر این خط‌مشی تنظیم نشود یا روی نادرست تنظیم شود، مجموعه رمز RC4 در TLS فعال نمی‌شود. در غیر این صورت، می‌توان برای حفظ سازگاری با یک سرور قدیمی، این خط‌مشی را روی درست تنظیم کرد. این اقدام موقتی است و سرور باید پیکربندی مجدد شود.</translation>
 <translation id="1297182715641689552">‏استفاده از اسکریپت pac. برای پروکسی</translation>
 <translation id="1304973015437969093">شناسه افزونه‌ها/برنامه‌ها و نشانی وب به‌روزرسانی‌ها برای نصب در سکوت</translation>
-<translation id="1310699457130669094">‏شما می‌توانید یک URL به یک فایل pac. پروکسی را در اینجا مشخص کنید. این قانون تنها زمانی تأثیرگذار است که شما تنظیمات دستی پروکسی را در "انتخاب روش تعیین تنظیمات سرور پروکسی" انتخاب کرده باشید. اگر هر حالت دیگری را برای تنظیم قوانین پروکسی انتخاب کرده‌اید، باید این قانون را تنظیم نشده باقی بگذارید. برای مثال‌های دارای جزئیات اینجا را ببینید: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">درصدی را نشان می‌دهد که با آن تأخیر عدم فعالیت صفحه نمایش هنگامی که فعالیت کاربر مورد نظر است و صفحه نمایش کم نور شده یا بلافاصله بعد از خاموش شدن صفحه نمایش، اندازه‌گیری می‌شود.
 
           اگر این خط‌مشی تنظیم شود، درصدی را نشان می‌دهد که با آن تأخیر عدم فعالیت صفحه نمایش، هنگامی که فعالیت کاربر مورد نظر است و صفحه نمایش کم نور شده یا بلافاصله بعد از خاموش شدن صفحه نمایش، اندازه‌گیری می‌شود. وقتی تأخیر عدم فعالیت صفحه نمایش اندازه‌گیری شود، خاموش شدن صفحه و  تأخیر قفل و بدون فعالیت بودن صفحه به‌ گونه‌ای تنظیم می‌شود که تأخیر عدم فعالیت صفحه نمایش همانطوری باشد که در ابتدا پیکربندی شده بود.
@@ -140,18 +136,6 @@
 <translation id="1561424797596341174">‏لغو خط‌مشی برای ساخت‌های Debug از میزبان دسترسی راه دور</translation>
 <translation id="1583248206450240930">از <ph name="PRODUCT_FRAME_NAME" /> به‌طور پیش‌فرض استفاده شود</translation>
 <translation id="1608755754295374538">نشانی‌های وب که بدون سؤال از کاربر اجازه دسترسی به دستگاه‌های ضبط صدا را خواهند داشت</translation>
-<translation id="1613574633990410986">‏به شما امکان می‌دهد سرور پروکسی مورد استفاده <ph name="PRODUCT_NAME" /> و برنامه‌های-ARC را مشخص کنید و از تغییر دادن تنظیمات پروکسی توسط کاربران جلوگیری می‌کند.
-
-      اگر انتخاب کنید که هیچ وقت از سرور پروکسی استفاده نشود و همیشه مستقیماً به اینترنت وصل شوید، تمام گزینه‌های دیگر نادیده گرفته می‌شوند.
-
-      اگر انتخاب کنید که پروکسی به‌طور خودکار شناسایی شود، تمام گزینه‌های دیگر نادیده گرفته می‌شوند.
-
-      برای مثال‌های با جزئیات به اینجا مراجعه کنید:
-     <ph name="PROXY_HELP_URL" />
-
-      اگر این تنظیم را فعال کنید، <ph name="PRODUCT_NAME" /> و برنامه‌های-ARC تمام گزینه‌های مربوط به پروکسی مشخص‌شده در خط فرمان را نادیده می‌گیرند.
-
-      درصورتی که این خط‌مشی‌ها را بدون تنظیم کردن رها کنید، کاربران می‌توانند تنظیمات پروکسی را خودشان انتخاب کنند.</translation>
 <translation id="1617235075406854669">فعال‌سازی حذف سابقه مرور و بارگیری</translation>
 <translation id="1617384279878333801">فعال کردن افزودن شخص از مدیر نمایه</translation>
 <translation id="1655229863189977773">تنظیم اندازه حافظهٔ پنهان دیسک در واحد بایت</translation>
@@ -242,7 +226,6 @@
       اگر فعال باشد، وقتی جلسه‌ای فعال باشد و صفحه قفل نباشد، دکمه بزرگ قرمزی در سینی سیستم نشان داده می‌شود.
 
       اگر غیرفعال شده باشد یا مشخص نشده باشد، دکمه خروج از سیستم قرمز بزرگ در سینی سیستم نشان داده نمی‌شود.</translation>
-<translation id="1942957375738056236">در اینجا می‌توانید آدرس سرور پروکسی را مشخص کنید. این قانون تنها در صورتی عمل می‌کند که در "انتخاب روش تعیین تنظیمات سرور پروکسی"، گزینه تنظیم دستی سرور پروکسی را انتخاب کرده باشید. اگر هر حالت دیگری را برای تنظیم قانون پروکسی در آنجا انتخاب کردید، این قانون را بدون تنظیم باقی بگذارید. برای گزینه‌های بیشتر و مثال‌های دارای جزئیات، <ph name="PROXY_HELP_URL" /> را ببینید.</translation>
 <translation id="1956493342242507974">در صفحه ورود به سیستم در <ph name="PRODUCT_OS_NAME" />، مدیریت نیرو را پیکربندی کنید.
 
      این خطمشی به شما امکان می‌دهد رفتار <ph name="PRODUCT_OS_NAME" /> را در زمانی که کاربر برای مدتی هیچ فعالیتی ندارد و صفحه ورود به سیستم در حال نمایش است، پیکربندی کنید. این خط‌مشی چندین تنظیم را کنترل می‌کند. برای معنای هر کدام از آنها و محدوده مقادیر، به خط‌مشی‌های مربوطه که مدیریت نیرو را در طول یک جلسه کنترل می‌کنند، رجوع کنید. تنها موارد استثنای این خط‌مشی‌ها عبارتند از: 
@@ -599,24 +582,6 @@
 <translation id="3072847235228302527">تنظیم شرایط خدمات برای حساب محلی دستگاه</translation>
 <translation id="3096595567015595053">فهرست افزایه‌های فعال شده</translation>
 <translation id="3101501961102569744">انتخاب کنید که چگونه تنظیمات سرور پروکسی تعیین شوند</translation>
-<translation id="3125884964575432854">‏به شما امکان می‌دهد سرور پروکسی مورد استفاده <ph name="PRODUCT_NAME" /> و برنامه‌های-ARC را مشخص کنید و از تغییر دادن تنظیمات پروکسی توسط کاربران جلوگیری می‌کند.
-
-          اگر انتخاب کنید هیچ وقت از سرور پروکسی استفاده نشود و همیشه مستقیماً به اینترنت وصل شوید، تمام گزینه‌های دیگر نادیده گرفته می‌شوند.
-
-          اگر انتخاب کنید از تنظیمات پروکسی سیستم استفاده شود، تمام گزینه‌های دیگر نادیده گرفته می‌شوند.
-
-          اگر انتخاب کنید پروکسی به‌طور خودکار شناسایی شود، تمام گزینه‌های دیگر نادیده گرفته می‌شوند.
-
-          اگر حالت پروکسی با سرور ثابت را انتخاب کنید، می‌توانید در «نشانی یا نشانی وب سرور پروکسی» و «فهرست قوانین رد کردن پروکسی (جداشده با کاما)»، گزینه‌های دیگری را مشخص کنید. برنامه‌های ARC فقط از سرور پروکسی ARC با بالاترین اولویت استفاده می‌کنند.
-
-          اگر انتخاب کنید که از اسکریپت پروکسی ‎.pac استفاده شود، بایستی نشانی وب را برای اسکریپت در «نشانی وب مربوط به یک فایل پروکسی ‎.pac‎» مشخص کنید.
-
-          برای مثال‌های با جزئیات به اینجا مراجعه کنید:
-          <ph name="PROXY_HELP_URL" />
-
-          اگر این تنظیم را فعال کنید، <ph name="PRODUCT_NAME" /> و برنامه‌های-ARC تمام گزینه‌های مربوط به پروکسی مشخص‌شده در خط فرمان را نادیده می‌گیرند.
-
-          درصورتی که این خط‌مشی‌ها را بدون تنظیم کردن رها کنید، کاربران می‌توانند تنظیمات پروکسی را خودشان انتخاب کنند.</translation>
 <translation id="3153348162326497318">‏شما را قادر می‎سازد تا تعیین کنید کاربران چه برنامه‌های افزودنی را نمی‌توانند نصب کنند. برنامه‌های افزودنی نصب شده، اگر در فهرست سیاه قرار گیرند، از روی سیستم حذف می‌شوند. مقدار "*" در فهرست سیاه بدین معنی است که تمام برنامه‎های افزودنی در فهرست سیاه هستند مگر آن‌هایی که مشخصاً در فهرست سفید قرار گیرند. اگر این قانون تنظیم نشود، کاربر می‌تواند هر برنامهٔ افزودنی را در <ph name="PRODUCT_NAME" /> نصب کند.</translation>
 <translation id="316778957754360075">‏این تنظیم از نسخه ۲۹ <ph name="PRODUCT_NAME" /> کنار گذاشته شده است. روش پیشنهادی برای تنظیم مجموعهٔ برنامه/افزودنی با میزبانی سازمان این است که سایت میزبان بسته‌های CRX را در منابع نصب افزودنی گنجانده و لینک‌های دانلود مستقیم در بسته‌ها در صفحه وب قرار داده شود. سپس با استفاده از خط‌مشی فهرست منبع نصب افزودنی می‌توان یک راه‌انداز نیز برای آن صفحه وب ایجاد نمود.</translation>
 <translation id="3185009703220253572">از نسخه <ph name="SINCE_VERSION" /></translation>
@@ -681,6 +646,7 @@
       اگر این تنظیم فعال باشد یا پیکربندی نشده باشد، کاربران می‌توانند با تأیید اعتبار با حساب Google، پراکسی چاپ cloud را فعال کنند.
 
       اگر این تنظیم غیرفعال باشد، کاربران نمی‌توانند پراکسی را فعال کنند و دستگاه اجازه ندارد چاپگرهای خود را با <ph name="CLOUD_PRINT_NAME" /> به اشتراک بگذارد.</translation>
+<translation id="3297010562646015826">پایان بخشیدن به پردازش‌های «مدیر فعالیت‌ها» را امکان‌پذیر می‌کند</translation>
 <translation id="3322771899429619102">‏به شما امکان می‌دهد فهرستی از الگوهای نشانی وب تعیین کنید که سایت‌های مجاز به استفاده از تولید کلید را مشخص کند. اگر الگوی نشانی وبی در «KeygenBlockedForUrls» باشد، خط‌مشی این استثناها را لغو می‌کند.
 
            اگر این خط‌مشی تنظیم نشود، برای همه سایت‌ها از مقدار پیش‌فرض کلی استفاده می‌شود، این مقدار یا از خط‌مشی «DefaultKeygenSetting» (درصورت تنظیم)، یا به‌صورتی دیگر از پیکربندی شخصی کاربر گرفته می‌شود.</translation>
@@ -844,22 +810,6 @@
           اگر این خط‌مشی روی «نگه‌داشتن کوکی‌ها برای کل مدت جلسه» تنظیم شود، کوکی‌ها پس از بسته شدن جلسه پاک می‌شوند. توجه کنید اگر <ph name="PRODUCT_NAME" /> در «حالت پس‌زمینه» در حال اجرا باشد، ممکن است پس از بسته شدن آخرین پنجره، جلسه بسته نشود. لطفاً برای اطلاعات بیشتر درباره پیکربندی این رفتار، خط‌مشی «BackgroundModeEnabled» را ببینید.
 
           اگر این خط‌مشی تنظیم نشود، «AllowCookies» استفاده می‌شود و کاربر می‌تواند آن را تغییر دهد.</translation>
-<translation id="4098957623809244159">‏این خط‌مشی منسوخ شده است. به‌جای آن از ProxyMode استفاده کنید.
-
-          به شما امکان می‌دهد که سرور پروکسی مورد استفاده <ph name="PRODUCT_NAME" /> و برنامه‌های-ARC را مشخص کنید و از تغییر دادن تنظیمات پروکسی توسط کاربران جلوگیری می‌کند.
-
-          اگر انتخاب کنید هیچ وقت از سرور پروکسی استفاده نشود و همیشه مستقیماً به اینترنت وصل شوید، تمام گزینه‌های دیگر نادیده گرفته می‌شوند.
-
-          اگر انتخاب کنید از تنظیمات پروکسی سیستم استفاده شود یا پروکسی به‌طور خودکار شناسایی شود، تمام گزینه‌های دیگر نادیده گرفته می‌شوند.
-
-          اگر تنظیمات پروکسی دستی را انتخاب کنید، می‌توانید در «نشانی یا نشانی وب سرور پروکسی»، «نشانی وب مربوط به یک فایل پروکسی ‎.pac‎‎» و «فهرست قوانین رد کردن پروکسی (جداشده با کاما)»، گزینه‌های دیگری را مشخص کنید.
-
-          برای مثال‌های با جزئیات به اینجا مراجعه کنید:
-          <ph name="PROXY_HELP_URL" />
-
-          اگر این تنظیم را فعال کنید، <ph name="PRODUCT_NAME" /> تمام گزینه‌های مربوط به پروکسی مشخص‌شده را از خط فرمان نادیده می‌گیرند.
-
-          درصورتی که این خط‌مشی را بدون تنظیم کردن رها کنید، کاربران می‌توانند تنظیمات پروکسی را خودشان انتخاب کنند.</translation>
 <translation id="4103289232974211388">‏هدایت به SAML IdP پس از تأیید کاربر</translation>
 <translation id="410478022164847452">مدت زمانی را مشخص می‌کند که بدون ورودی کاربر پس از آن، هنگام کار با برق فعالیت بی‌حرکتی انجام می‌شود.
 
@@ -1172,7 +1122,7 @@
 <translation id="5496487987837463732">‏تنظیم این خط مشی روی نادرست باعث می‌شود کاربران نتوانند اطلاعات خطاهای امنیتی را به سرورهای Google ارسال کنند. اگر این تنظیم روی درست تنظیم شود یا پیکربندی نشود، کاربران می‌توانند اطلاعات خطاهای SSL یا هشدار مرور امن را ارسال کنند.</translation>
 <translation id="5499375345075963939">این ‌خط‌مشی فقط در حالت خرده فروشی فعال است.
 
-      وقتی مقدار این ‌خط‌مشی تنظیم شود و۰ نیست پس کاربری که الان وارد سیستم شده پس از سپری شدن مدت زمان مشخص شده برای عدم فعالیت بطور خودکار از سیستم خارج می‌شود.
+      وقتی مقدار این ‌خط‌مشی تنظیم شود و۰ نیست پس کاربری که الان وارد سیستم شده پس از سپری شدن مدت زمان مشخص شده برای عدم فعالیت به‌طور خودکار از سیستم خارج می‌شود.
 
       مقدار خط‌مشی باید برحسب میلی ثانیه تنظیم شود.</translation>
 <translation id="5511702823008968136">فعال کردن نوار نشانک</translation>
@@ -1190,7 +1140,7 @@
 اگر تعیین نشود، نشانی وب seed تغییرات را تغییر نخواهد داد.</translation>
 <translation id="556941986578702361">‏پنهان شدن خودکار قفسه <ph name="PRODUCT_OS_NAME" /> را کنترل می‌کند.
 
-      اگر این خط‌مشی روی «AlwaysAutoHideShelf» تنظیم شده باشد، قفسه همیشه بطور خودکار پنهان می‌شود.
+      اگر این خط‌مشی روی «AlwaysAutoHideShelf» تنظیم شده باشد، قفسه همیشه به‌طور خودکار پنهان می‌شود.
 
       اگر این خط‌مشی روی «NeverAutoHideShelf» تنظیم شده باشد، قفسه هرگز بصورت خودکار پنهان نمی‌شود.
 
@@ -1280,14 +1230,6 @@
 <translation id="5893553533827140852">‏اگر این تنظیم فعال باشد، درخواست‌های احراز هویت gnubby در سراسر یک اتصال به میزبان راه دور پروکسی خواهد شد.
 
 اگر این تنظیم غیرفعال باشد یا پیکربندی نشده باشد، درخواست‌های احراز هویت gnubby پروکسی نمی‌شود.</translation>
-<translation id="5900959132054596599">‏<ph name="PRODUCT_NAME" /> و برنامه‌های-ARC، برای میزبان‌های فهرست شده در اینجا، پروکسی را نادیده می‌گیرند.
-
-          این خط‌مشی تنها زمانی فعال می‌شود که تنظیمات دستی پروکسی را در قسمت «انتخاب نوع تنظیمات سرور پروکسی» انتخاب کرده باشید.
-
-اگر هر حالت دیگری را برای تنظیم خط‌مشی‌های پروکسی انتخاب کرده‌اید، باید این خط‌مشی را تنظیم‌نشده رها کنید.
-
-          برای مثال‌های با جزئیات به اینجا مراجعه کنید:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">‏امکان بارگیری‌های به‌روزرسانی خودکار از طریق HTTP</translation>
 <translation id="5921888683953999946">حالت پیش‌فرض قابلیت دسترس‌پذیری نشانگر موشواره بزرگ را در صفحه ورود به سیستم تنظیم کنید.
 
@@ -1520,7 +1462,7 @@
       اگر این تنظیم را روی «همیشه»، «هرگز» یا «فقط Wi-Fi» قرار دهید،کاربران نمی‌توانند آن را در <ph name="PRODUCT_NAME" /> تغییر دهند یا لغو کنند.
 
       اگر این خط مشی تنظیم نشده باقی بماند، پیش‌بینی شبکه فعال خواهد شد اما کاربر می‌تواند آن را تغییر دهد.</translation>
-<translation id="6658245400435704251">تعداد ثانیه‌هایی را مشخص می‌کند که دستگاه می‌تواند حداکثر تا آن زمان بطور تصادفی دانلود به‌روزرسانی خود را به تأخیر بیندازد این زمان از وقتی اندازه گیری می‌شود که ابتدا به‌روزرسانی به سرور ارسال شده است. دستگاه می‌تواند مقداری از این زمان را به‌عنوان زمان شروع تا پایان کار و بقیه را به‌عنوان تعداد بررسی‌ها برای به‌روزرسانی منتظر باشد. در هر حال پراکندگی به مقدار ثابتی از زمان بستگی دارد به این ترتیب که دستگاه هزگز برای بارگیری به‌روزرسانی همیشه به انتظار نمی‌ماند.</translation>
+<translation id="6658245400435704251">تعداد ثانیه‌هایی را مشخص می‌کند که دستگاه می‌تواند حداکثر تا آن زمان به‌طور تصادفی دانلود به‌روزرسانی خود را به تأخیر بیندازد این زمان از وقتی اندازه گیری می‌شود که ابتدا به‌روزرسانی به سرور ارسال شده است. دستگاه می‌تواند مقداری از این زمان را به‌عنوان زمان شروع تا پایان کار و بقیه را به‌عنوان تعداد بررسی‌ها برای به‌روزرسانی منتظر باشد. در هر حال پراکندگی به مقدار ثابتی از زمان بستگی دارد به این ترتیب که دستگاه هزگز برای بارگیری به‌روزرسانی همیشه به انتظار نمی‌ماند.</translation>
 <translation id="6689792153960219308">گزارش وضعیت سخت‌افزار</translation>
 <translation id="6693751878507293182">درصورت فعال کردن این گزینه، جستجوی خودکار و نصب افزایه‌های مفقود شده در <ph name="PRODUCT_NAME" /> غیرفعال می‌شود. غیرفعال کردن این گزینه یا تنظیم نکردن آن باعث فعال بودن افزایه‌یاب می‌شود.</translation>
 <translation id="6697474194550078937">‏محدود کردن زمانی که کاربر احراز هویت شده از طریق SAML می‌تواند ورود به سیستم آفلاین داشته باشد.
@@ -1769,9 +1711,6 @@
 <translation id="7632724434767231364">‏نام کتابخانه GSSAPI</translation>
 <translation id="7635471475589566552">‏زبان محلی برنامه را در <ph name="PRODUCT_NAME" /> تعیین می‌کند و از تغییر آن توسط کاربران جلوگیری می‌کند. اگر فعال شود، <ph name="PRODUCT_NAME" /> از زبان محلی تعیین شده استفاده می‌کند. اگر زبان محلی تعیین شده پشتیبانی نشود، به جای آن از "en-US" استفاده می‌شود. اگر این گزینه غیرفعال شود یا تنظیمات آن دست نخورده باقی بماند، <ph name="PRODUCT_NAME" /> یا از زبان محلی ترجیحی تعیین شده توسط کاربر (در صورت وجود)، زبان محلی سیستم، یا از زبان محلی پیش‌فرض "en-US" استفاده می‌کند.</translation>
 <translation id="7651739109954974365">تعیین می‌کند آیا رومینگ داده‌ها برای دستگاه فعال شود یا نه. درصورتی‌که روی درست تنظیم شود، رومینگ داده‌ها امکان‌پذیر می‌شود. اگر این خط‌مشی پیکربندی نشود یا روی نادرست تنظیم شود، رومینگ داده‌ها موجود نخواهد بود.</translation>
-<translation id="7667184304362487902">‏تنظیمات پروکسی را برای <ph name="PRODUCT_NAME" /> و برنامه‌های-ARC پیکربندی می‌کند.
-
-     این خط‌مشی هنوز برای استفاده آماده نیست، لطفاً از آن استفاده نکنید.</translation>
 <translation id="76810863974142048">‏نشانی وبِ مکانی که کلاینت‌های دسترسی راه دور باید کد احراز هویت خود را کسب کنند.
 
           اگر این خط‌مشی تنظیم شود، میزبان دسترسی راه دور کلاینت‌های درحال احراز هویت را ملزم به کسب یک کد احراز هویت از این نشانی وب برای اتصال می‌کند. باید همراه با  RemoteAccessHostTokenValidationUrl استفاده شود.
@@ -1818,7 +1757,7 @@
       این خط مشی فقط می‌تواند به صورت پیشنهادی تنظیم شود. می‌توانید با این خط مشی مجموعه‌ای از زبان‌های پیشنهادی را به بالا منتقل کنید، اما کاربران همیشه می‌توانند هر زبانی را که توسط <ph name="PRODUCT_OS_NAME" /> پشتیبانی شده باشد، برای جلسه‌شان انتخاب کنند.
       </translation>
 <translation id="7763311235717725977">‏اجازه می‌دهد تعیین کنید که وب سایت‌ها اجازه نمایش تصویر را دارند. نمایش تصاویر می‌تواند برای تمام وب سایت‌ها مجاز یا غیرمجاز باشد. اگر این قانون تنظیم نشده باقی بماند، "AllowImages" به جای آن استفاده می‌شود و کاربر می‌تواند آن را تغییر دهد.</translation>
-<translation id="7763479091692861127">‏ انواع اتصالاتی که مجاز به استفاده از به‌روزرسانی‌های سیستم عامل هستند. به‌روزرسانی‌های سیستم عامل بار سنگینی را روی اتصال ایجاد می‌کنند چون اندازه آنها بزرگ است و ممکن است هزینه بیشتری داشته باشند. بنابراین بطور خودکار برای انواع اتصالی که گران باشد و در حال حاضر شامل WiMax، بلوتوث و تلفن همراه باشند، فعال نمی‌شوند.
+<translation id="7763479091692861127">‏ انواع اتصالاتی که مجاز به استفاده از به‌روزرسانی‌های سیستم عامل هستند. به‌روزرسانی‌های سیستم عامل بار سنگینی را روی اتصال ایجاد می‌کنند چون اندازه آنها بزرگ است و ممکن است هزینه بیشتری داشته باشند. بنابراین به‌طور خودکار برای انواع اتصالی که گران باشد و در حال حاضر شامل WiMax، بلوتوث و تلفن همراه باشند، فعال نمی‌شوند.
 
       شناسه‌های نوع اتصال شناسایی شده "اترنت"، "wifi"، "wimax، "بلوتوث" و "تلفن همراه" هستند.</translation>
 <translation id="7766336524667238790">گزارش اطلاعاتی درباره جلسه کیوسک فعال مانند
@@ -1982,6 +1921,7 @@
       وقتی DeviceIdleLogoutTimeout مشخص شود، این خط‌مشی طول مدت زمان کادر اخطار با یک تایمر شمارش معکوس را مشخص می‌کند که قبل از انجام خروج از سیستم، به کاربر نشان داده می‌شود.
       میزان خط‌مشی باید در واحد میلی ثانیه مشخص شود.</translation>
 <translation id="8344454543174932833">وارد کردن نشانک‌ها از مرورگر پیش‌فرض در اولین اجرا</translation>
+<translation id="8359734107661430198">‏فعال‌سازی ExampleDeprecatedFeature API از ‏‎۲۰۰۸/۰۹/۰۲</translation>
 <translation id="8360452361555133173">نمایش صفحه خوشامدگویی را در اولین اجرای مرورگر پس از ارتقای سیستم عامل فعال می‌کند.
 
       اگر این خط مشی روی درست تنظیم شود یا کلاً‌ تنظیم نشود، مرورگر صفحه خوشامدگویی را در اولین اجرای مرورگر پس از ارتقای سیستم عامل نشان می‌دهد.
diff --git a/components/policy/resources/policy_templates_fi.xtb b/components/policy/resources/policy_templates_fi.xtb
index ce37a8b..2c189fb 100644
--- a/components/policy/resources/policy_templates_fi.xtb
+++ b/components/policy/resources/policy_templates_fi.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fi">
 <translation id="101438888985615157">Kierrä näyttöä 180 astetta.</translation>
-<translation id="1015272884520659144">Määrittää luettelon USB-laitteista, jotka voidaan irrottaa kernel-ajurista, jotta laitetta voi käyttää suoraan chrome.usb API:n kautta verkkosovelluksessa. Tiedot näkyvät USB-toimittajan tunnus- ja tuotetunnuspareina, joilla tunnistetaan tietty laitteisto.
-
-      Jos tätä käytäntöä ei määritetä, USB-laitteiden luettelon katsotaan olevan tyhjä.</translation>
 <translation id="1017967144265860778">Virran hallinta kirjautumisruudulla</translation>
 <translation id="1019101089073227242">Aseta käyttäjätietojen hakemisto</translation>
 <translation id="1022361784792428773">Niiden laajennuksien tunnukset, joita käyttäjä ei saa asentaa (tai * = kaikki).</translation>
@@ -65,7 +62,6 @@
       Jos tätä käytäntöä ei aseteta tai jos sen arvo on epätosi, TLS:n RC4-salaustekniikoita ei oteta käyttöön. Jos yhteensopivuus vanhentuneen palvelimen kanssa täytyy varmistaa, arvoksi voidaan asettaa tosi. Tämä on kuitenkin tilapäinen toimenpide, ja palvelimen määritykset tulee tehdä uudelleen.</translation>
 <translation id="1297182715641689552">Käytä .pac-välityspalvelinkoodia</translation>
 <translation id="1304973015437969093">Laajennuksien ja sovellusten tunnukset ja päivitys-URL-osoitteet asennetaan taustalla</translation>
-<translation id="1310699457130669094">Voit määrittää välityspalvelimen .pac-tiedoston URL-osoitteen täällä. Käytäntö tulee voimaan vain, jos olet valinnut manuaaliset välityspalvelimen asetukset kohdassa Valitse, miten välityspalvelimen asetukset määritetään. Jätä tämä käytäntö määrittämättä, jos olet valinnut toisen välityspalvelinkäytäntöjen määritystavan. Lisää asetuksia ja esimerkkejä näet osoitteesta <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Määrittää prosenttimäärän, jolla näytön himmennyksen viive skaalataan, kun käyttäjän toimia huomataan näytön ollessa himmennettynä tai pian näytön sammuttamisen jälkeen.
 
           Jos tämä käytäntö on asetettu, se määrittää prosenttimäärän, jolla näytön himmennyksen viive skaalataan, kun käyttäjän toimia huomataan näytön ollessa himmennettynä tai pian näytön sammuttamisen jälkeen. Kun himmennyksen viive on skaalattu, näytön sammutus-, lukitus- ja käyttämättömyysviiveet säädetään ylläpitämään samoja etäisyyksiä näytön himmennyksen viiveestä kuin alunperin määritettiin.
@@ -146,18 +142,6 @@
 <translation id="1561424797596341174">Käytäntöjen ohitus etäkäytön isännän vianetsintäversioissa</translation>
 <translation id="1583248206450240930">Käytä tuotetta <ph name="PRODUCT_FRAME_NAME" /> oletuksena</translation>
 <translation id="1608755754295374538">URL-osoitteet, joille on myönnetty pääsy äänikaappauslaitteisiin ilman erillisen luvan pyytämistä</translation>
-<translation id="1613574633990410986">Voit määrittää välityspalvelimen, jota <ph name="PRODUCT_NAME" /> ja ARC-sovellukset käyttävät, ja estää käyttäjiä muuttamasta välityspalvelimen asetuksia.
-
-      Jos päätät muodostaa aina suoran yhteyden välityspalvelimen käyttämisen sijaan, kaikki muut vaihtoehdot ohitetaan.
-
-      Jos päätät etsiä välityspalvelimen automaattisesti, kaikki muut vaihtoehdot ohitetaan.
-
-      Näet esimerkkejä osoitteessa
-      <ph name="PROXY_HELP_URL" />.
-
-      Jos otat tämän asetuksen käyttöön, <ph name="PRODUCT_NAME" /> ja ARC-sovellukset ohittavat kaikki komentorivillä annetut välityspalvelimiin liittyvät komennot.
-
-      Jos et määritä näitä käytäntöjä, käyttäjät voivat valita välityspalvelinasetukset itse.</translation>
 <translation id="1617235075406854669">Salli selaus- ja lataushistorian poistaminen</translation>
 <translation id="1617384279878333801">Salli profiilien luominen käyttäjäprofiilien hallinnassa</translation>
 <translation id="1655229863189977773">Aseta levyn välimuistin koko tavuina</translation>
@@ -238,7 +222,6 @@
 Jos tämä asetus on käytössä, järjestelmäpalkissa näytetään suuri punainen uloskirjautumispainike käyttökerran ollessa aktiivinen ja ruudun ollessa käytössä.
 
 Jos tämä asetus ei ole käytössä, järjestelmäpalkissa ei näytetä suurta punaista uloskirjautumispainiketta.</translation>
-<translation id="1942957375738056236">Voit määrittää välityspalvelimen URL-osoitteen täällä. Käytäntö tulee voimaan vain, jos olet valinnut manuaaliset välityspalvelimen asetukset kohdassa Valitse, miten välityspalvelimen asetukset määritetään. Jätä tämä käytäntö määrittämättä, jos olet valinnut toisen välityspalvelinkäytäntöjen määritystavan. Lisää asetuksia ja esimerkkejä näet osoitteesta <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Määritä virranhallinta-asetukset tuotteen <ph name="PRODUCT_OS_NAME" /> kirjautumisruudulla.
 
       Käytäntö määrittää tuotteen <ph name="PRODUCT_OS_NAME" /> toiminnan, kun käyttäjä ei tee mitään tietyn ajan kuluessa kirjautumisruudun ollessa avoinna. Käytäntö ohjaa useita asetuksia. Voit tarkastella yksittäisten asetusten tietoja ja arvoalueita tutustumalla käytäntöihin, jotka ohjaavat virranhallintaa käyttökerran aikana. Käytäntöjen ainoat poikkeukset ovat:
@@ -601,22 +584,6 @@
 <translation id="3072847235228302527">Aseta laitteen paikallisen tilin käyttöehdot</translation>
 <translation id="3096595567015595053">Luettelo käytössä olevista laajennuksista</translation>
 <translation id="3101501961102569744">Valitse, miten välityspalvelimen asetukset määritetään</translation>
-<translation id="3125884964575432854">Voit määrittää välityspalvelimen, jota <ph name="PRODUCT_NAME" /> ja ARC-sovellukset käyttävät, ja estää käyttäjiä muuttamasta välityspalvelimen asetuksia.
-
-          Jos päätät muodostaa aina suoran yhteyden välityspalvelimen käyttämisen sijaan, kaikki muut vaihtoehdot ohitetaan.
-
-          Jos päätät etsiä välityspalvelimen automaattisesti, kaikki muut vaihtoehdot ohitetaan.
-
-          Jos haluat käyttää kiinteää välityspalvelinta, voit määrittää lisää vaihtoehtoja kentissä ”Välityspalvelimen osoite tai URL-osoite” ja ”Välityspalvelimen ohitussääntöjen pilkuilla erotettu luettelo”. ARC-sovellukset käyttävät vain korkeimman prioriteetin HTTP-välityspalvelinta.
-
-          Jos haluat käyttää .pac-välityspalvelinkoodia, kirjoita koodin URL-osoite kenttään ”Välityspalvelimen .pac-tiedoston URL-osoite”.
-
-          Näet esimerkkejä osoitteessa
-          <ph name="PROXY_HELP_URL" />.
-
-          Jos otat tämän asetuksen käyttöön, <ph name="PRODUCT_NAME" /> ja ARC-sovellukset ohittavat kaikki komentorivillä annetut välityspalvelimiin liittyvät komennot.
-
-          Jos et määritä tätä käytäntöä, käyttäjät voivat itse valita välityspalvelinasetukset.</translation>
 <translation id="3153348162326497318">Voit määrittää, mitä laajennuksia käyttäjät EIVÄT saa asentaa. Jo asennetut laajennukset poistetaan, jos ne ovat kiellettyjen luettelossa. Kiellettyjen luettelon arvo * tarkoittaa, että kaikki laajennukset ovat kiellettyjen luettelossa, ellei niitä ole mainittu sallittujen luettelossa. Jos tätä käytäntöä ei ole määritetty, käyttäjä voi asentaa tuotteeseen <ph name="PRODUCT_NAME" /> mitä tahansa laajennuksia.</translation>
 <translation id="316778957754360075">Tämä asetus on poistettu käytöstä tuotteen <ph name="PRODUCT_NAME" /> versiosta 29 lähtien. Suositeltu tapa määrittää organisaation isännöimiä laajennuksia tai sovelluskokoelmia on sisällyttää CRX-paketteja sisältävä sivusto ExtensionInstallSources-luetteloon ja lisätä suorat latauslinkit paketteihin verkkosivulle. Kyseisen verkkosivun käynnistysohjelma voidaan luoda ExtensionInstallForcelist-käytännön avulla.</translation>
 <translation id="3185009703220253572">versiosta <ph name="SINCE_VERSION" /> alkaen</translation>
@@ -681,6 +648,7 @@
 Jos tämä asetus on käytössä tai sitä ei ole määritetty, käyttäjät voivat ottaa pilvitulostuksen välityspalvelimen käyttöön todentamalla sen Google-tilinsä avulla.
 
 Jos asetus ei ole käytössä, käyttäjät eivät voi ottaa välityspalvelinta käyttöön eikä kone voi jakaa tulostimiaan palvelussa <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Salli prosessien lopettaminen tehtävänhallinnassa</translation>
 <translation id="3322771899429619102">Voit määrittää URL-mallien luettelon, jossa määritetään sivustot, jotka saavat luoda avaimia. Jos URL-malli on KeygenBlockedForUrls-käytännössä, se ohittaa nämä poikkeukset.
 
           Jos tätä käytäntöä ei ole määritetty, kaikille sivustoille käytetään joko DefaultKeygenSetting-käytännön yleistä oletusarvoa, jos se on asetettu, tai käyttäjän henkilökohtaisia määrityksiä.</translation>
@@ -851,22 +819,6 @@
           Jos tämän käytännön asetus on Säilytä evästeet käyttökerran ajan, evästeet poistetaan käyttökerran päätyttyä. Huom. Jos <ph name="PRODUCT_NAME" /> on käynnissä taustatilassa, käyttökerta ei välttämättä pääty viimeisen ikkunan sulkeutuessa. Katso käytäntö BackgroundModeEnabled, niin saat lisätietoja tämän toiminnallisuuden määrittämisestä.
 
           Jos tätä käytäntöä ei aseteta, sen sijaan käytetään AllowCookies-käytäntöä ja käyttäjä voi muuttaa asetusta.</translation>
-<translation id="4098957623809244159">Tämä käytäntö ei ole enää käytössä, käytä sen sijaan ProxyMode-käytäntöä.
-
-          Voit määrittää välityspalvelimen, jota <ph name="PRODUCT_NAME" /> ja ARC-sovellukset käyttävät, ja estää käyttäjiä muuttamasta välityspalvelimen asetuksia.
-
-          Jos päätät muodostaa aina suoran yhteyden välityspalvelimen käyttämisen sijaan, kaikki muut vaihtoehdot ohitetaan.
-
-          Jos päätät käyttää järjestelmän välityspalvelinasetuksia tai etsiä välityspalvelimen automaattisesti, kaikki muut vaihtoehdot ohitetaan.
-
-          Jos haluat määrittää välityspalvelimen asetukset manuaalisesti, voit määrittää lisää vaihtoehtoja kentissä ”Välityspalvelimen osoite tai URL-osoite”, ”Välityspalvelimen .pac-tiedoston URL-osoite” ja ”Välityspalvelimen ohitussääntöjen pilkuilla erotettu luettelo”.
-
-          Näet esimerkkejä osoitteessa
-          <ph name="PROXY_HELP_URL" />.
-
-          Jos otat tämän asetuksen käyttöön, <ph name="PRODUCT_NAME" /> ohittaa kaikki komentorivillä annetut välityspalvelimiin liittyvät käskyt.
-
-          Jos tätä käytäntöä ei ole määritetty, käyttäjät voivat itse valita välityspalvelimen asetukset.</translation>
 <translation id="4103289232974211388">Uudelleenohjaa SAML IdP:hen käyttäjän todennuksen jälkeen.</translation>
 <translation id="410478022164847452">Määrittää käyttämättömyysajan, jonka kuluttua suoritetaan käyttämättömyystoimenpide, kun laitetta käytetään verkkovirralla.
 
@@ -1296,14 +1248,6 @@
 <translation id="5893553533827140852">Jos asetus on käytössä, gnubby-todennuspyynnöt lähetetään välityspalvelimen kautta etäisäntäyhteyden avulla.
 
           Jos asetus ei ole käytössä tai sitä ei ole määritetty, gnubby-todennuspyyntöjä ei lähetetä välityspalvelimen kautta.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> ja ARC-sovellukset ohittavat tässä annettujen isäntien kaikki välityspalvelimet.
-
-          Käytäntö tulee voimaan vain, jos olet valinnut manuaaliset välityspalvelimen asetukset Valitse, miten välityspalvelimen asetukset määritetään -kohdassa.
-
-          Jätä tämä käytäntö määrittämättä, jos olet valinnut toisen välityspalvelinkäytäntöjen määritystavan.
-
-          Lisää esimerkkejä näet osoitteessa
-          <ph name="PROXY_HELP_URL" />.</translation>
 <translation id="5921713479449475707">Salli automaattiset päivitykset HTTP:n kautta</translation>
 <translation id="5921888683953999946">Määritä suuren osoittimen käytettävyysominaisuuden oletustila kirjautumisnäytössä.
 
@@ -1785,9 +1729,6 @@
 <translation id="7632724434767231364">GSSAPI-kirjaston nimi</translation>
 <translation id="7635471475589566552">Määrittää tuotteen <ph name="PRODUCT_NAME" /> sovelluksen kielen ja estää käyttäjiä muuttamasta sitä. Jos otat tämän asetuksen käyttöön, <ph name="PRODUCT_NAME" /> käyttää määritettyä kieltä. Jos tätä kieltä ei tueta, käytetään kieltä en-US. Jos asetus poistetaan käytöstä tai valintaa ei tehdä, <ph name="PRODUCT_NAME" /> käyttää joko käyttäjän määrittämää kieltä (jos valittu), järjestelmän kieltä tai kieltä en-US, jos näitä kieliä ei tueta.</translation>
 <translation id="7651739109954974365">Määrittää, onko mobiilitiedonsiirto roaming-tilassa käytössä laitteessa. Jos arvo on tosi, mobiilitiedonsiirto roaming-tilassa on sallittu. Jos arvoa ei määritetä tai määritetty arvo on epätosi, mobiilitiedonsiirto roaming-tilassa ei ole käytettävissä.</translation>
-<translation id="7667184304362487902">Määrittää välityspalvelimen asetukset tuotteelle <ph name="PRODUCT_NAME" /> ja ARC-sovelluksille.
-
-      Tämä käytäntö ei ole vielä valmis käyttöön – älä käytä sitä.</translation>
 <translation id="76810863974142048">URL-osoite, josta etäkäytön asiakkaiden tulisi saada todennustunnus.
 
           Jos tämä käytäntö asetetaan, etäkäytön isäntä vaatii todennettavia asiakkaita hankkimaan todennustunnuksen tästä URL-osoitteesta ennen yhteyden muodostamista. Tämän käytännön yhteydessä myös RemoteAccessHostTokenValidationUrl täytyy määrittää.
@@ -2000,6 +1941,7 @@
 
       Käytännön arvo määrittää ajan millisekunteina.</translation>
 <translation id="8344454543174932833">Tuo kirjanmerkit oletusselaimesta ensimmäisellä käyttökerralla</translation>
+<translation id="8359734107661430198">Ota käyttöön ExampleDeprecatedFeature-sovellusliittymä 2.9.2008 saakka</translation>
 <translation id="8360452361555133173">Määrittää tervetulosivun näyttämisen, kun selain käynnistetään ensimmäisen kerran käyttöjärjestelmän päivityksen jälkeen.
 
       Jos tämän käytännön arvo on Tosi tai sitä ei määritetä, tervetulosivu näytetään uudelleen, kun selain käynnistetään ensimmäisen kerran käyttöjärjestelmän päivityksen jälkeen.
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb
index 5d3b4bf..0382865 100644
--- a/components/policy/resources/policy_templates_fil.xtb
+++ b/components/policy/resources/policy_templates_fil.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fil">
 <translation id="101438888985615157">I-rotate ang screen nang 180 degrees</translation>
-<translation id="1015272884520659144">Tinutukoy ang listahan ng mga USB device na pinapahintulutang ma-detach mula sa kernel driver ng mga ito upang direktang magamit sa pamamagitan ng chrome.usb API sa loob ng isang web application. Ang mga entry ay mga pares ng Identifier ng USB Vendor at Identifier ng Produkto upang matukoy ang isang partikular na hardware.
-
-      Kung hindi na-configure ang patakarang ito, ituturing na walang laman ang listahan ng mga nade-detach na USB device.</translation>
 <translation id="1017967144265860778">Pamamahala ng power sa screen sa pag-log in</translation>
 <translation id="1019101089073227242">Itakda ang direktoryo ng data ng user</translation>
 <translation id="1022361784792428773">Ang mga ID ng Extension na dapat na iwasan ng user mula sa pag-install (o * para sa lahat)</translation>
@@ -73,14 +70,6 @@
       Kung hindi itatakda ang patakaran, o kung itatakda ito sa false, hindi mae-enable ang mga RC4 na cipher suite sa TLS. Maaari itong itakda sa true upang manatili itong compatible sa isang lumang server. Isa lang itong pansamantalang solusyon at dapat pa ring i-configure ang server.</translation>
 <translation id="1297182715641689552">Gumamit ng .pac proxy script</translation>
 <translation id="1304973015437969093">Ang mga extension/app ID at URL sa pag-update na tahimik na ii-install</translation>
-<translation id="1310699457130669094">Maaari kang tumukoy ng isang URL sa isang proxy .pac file dito.
-
-          Magkakaroon lamang ng epekto ang patakarang ito kung pinili mo ang mga manu-manong setting ng proxy sa 'Pumili kung paano tumukoy ng mga setting ng proxy server'.
-
-          Dapat mong hayaang hindi nakatakda ang patakarang ito kung pumili ka ng anumang iba pang mode para sa pagtatakda ng mga patakaran ng proxy.
-
-          Para sa mga detalyadong halimbawa, bisitahin ang:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Tinutukoy ang porsyento ng pag-scale sa pag-aantala ng pagdilim ng screen kapag napansin ang pagkilos ng user habang madilim ang screen o kaagad pagkatapos i-off ang screen.
 
           Kung nakatakda ang patakarang ito, tinutukoy nito ang porsyento ng pag-scale sa pag-aantala ng pagdilim ng screen kapag napansin ang pagkilos ng user habang madilim ang screen o kaagad pagkatapos i-off ang screen. Kapag naka-scale ang pagkaantala ng pagdilim, masasaayos ang mga pagkaantala ng screen off, screen lock at idle upang panatilihin ang parehong agwat mula sa pag-aantala ng pagdilim ng screen gaya ng orihinal na pagkaka-configure.
@@ -163,18 +152,6 @@
 <translation id="1561424797596341174">Mga pag-override ng patakaran para sa Mga build sa pag-debug ng host ng malayuang access</translation>
 <translation id="1583248206450240930">Gamitin ang <ph name="PRODUCT_FRAME_NAME" /> bilang default</translation>
 <translation id="1608755754295374538">Mga URL na mabibigyan ng access sa mga device na nakakakuha ng audio nang walang prompt</translation>
-<translation id="1613574633990410986">Nagbibigay-daan sa iyong tukuyin ang ginagamit na server ng proxy ng <ph name="PRODUCT_NAME" /> at mga ARC-app at pumipigil sa mga user na baguhin ang mga setting ng proxy.
-
-      Kung pipiliin mong hindi gumamit ng server ng proxy kahit kailan at palaging kumonekta nang direkta, babalewalain ang lahat ng iba pang opsyon.
-
-      Kung pipiliin mong awtomatikong ma-detect ang server ng proxy, babalewalain ang lahat ng iba pang opsyon.
-
-      Para sa mga detalyadong halimbawa, bisitahin ang:
-      <ph name="PROXY_HELP_URL" />
-
-      Kung ie-enable mo ang setting na ito, babalewalain ng <ph name="PRODUCT_NAME" /> at mga ARC-app ang lahat ng opsyon na nauugnay sa proxy na tinukoy sa linya ng command.
-
-      Kapag hinayaang hindi nakatakda ang patakarang ito, mabibigyang-daan ang mga user na sila mismo ang pumili ng mga setting ng proxy.</translation>
 <translation id="1617235075406854669">Paganahin ang pagtatanggal ng browser at kasaysayan ng pag-download</translation>
 <translation id="1617384279878333801">I-enable ang magdagdag ng tao sa profile manager</translation>
 <translation id="1655229863189977773">Itakda ang laki ng cache ng disk sa bytes</translation>
@@ -265,14 +242,6 @@
       Kung pinagana, ipapakita ang isang malaki at pulang button sa tray ng system habang aktibo ang isang session at hindi naka-lock ang screen.
 
       Kung hindi pinagana o hindi tinukoy, walang ipapakitang malaki at pulang button sa pag-logout sa tray ng system.</translation>
-<translation id="1942957375738056236">Matutukoy mo ang URL ng proxy server dito.
-
-          Magkakaroon lamang ng bisa ang patakaran kung pinili mo ang mga setting ng manu-manong proxy sa 'Piliin kung paano tukuyin ang mga setting ng proxy server .'
-
-          Dapat mong hayaang hindi nakatakda ang patakarang ito kung pumili ka ng anumang iba pang mode para sa pagtatakda ng mga patakaran ng proxy.
-
-          Para sa higit pang mga pagpipilian at detalyadong halimbawa, bisitahin ang:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Kino-configure ang pamamahala sa power sa screen sa pag-login sa <ph name="PRODUCT_OS_NAME" />.
 
       Nagbibigay-daan sa iyo ang patakarang ito na i-configure kung paano kikilos ang <ph name="PRODUCT_OS_NAME" /> kapag walang gawain ang user sa loob ng ilang sandali habang ipinapakita ang screen sa pag-login. Kumokontrol ang patakaran ng maraming setting. Para sa mga indibidwal na semantics at saklaw ng value ng mga ito, tingnan ang mga naaangkop na patakararan na kumokontrol sa pamamahala sa power sa loob ng isang session. Ang mga natatanging paglihis sa mga patakarang ito ay:
@@ -662,24 +631,6 @@
 <translation id="3072847235228302527">Itakda ang Mga Tuntunin ng Serbisyo para sa isang account na lokal sa device</translation>
 <translation id="3096595567015595053">Listahan ng mga pinaganang plugin</translation>
 <translation id="3101501961102569744">Pumili kung paano tukuyin ang mga setting ng proxy server</translation>
-<translation id="3125884964575432854">Nagbibigay-daan sa iyong tukuyin ang ginagamit na server ng proxy ng <ph name="PRODUCT_NAME" /> at mga ARC-app at pumipigil sa mga user na baguhin ang mga setting ng proxy.
-
-          Kung pipiliin mong hindi gumamit ng server ng proxy kahit kailan at palaging kumonekta nang direkta, babalewalain ang lahat ng iba pang opsyon.
-
-          Kung pipiliin mong gamitin ang mga setting ng proxy ng system, babalewalain ang lahat ng iba pang mga opsyon.
-
-          Kung pipiliin mong awtomatikong ma-detect ang server ng proxy, babalewalain ang lahat ng iba pang mga opsyon..
-
-          Kung pipiliin mo ang fixed server proxy mode, maaari kang tumukoy ng mga karagdagang opsyon sa 'Address o URL ng server ng proxy' at 'Listahan ng mga panuntunan ng bypass ng proxy na pinaghihiwalay ng kuwit.' Gagamitin lang ng mga ARC-app ang server ng proxy ng HTTP na may pinakamataas na priyoridad.
-
-          Kung pipiliin mong gumamit ng .pac na script ng proxy, dapat mong tukuyin ang URL sa script sa 'URL sa isang proxy na .pac file'.
-
-          Para sa mga detalyadong halimbawa, bisitahin ang:
-          <ph name="PROXY_HELP_URL" />
-
-          Kung ie-enable mo ang setting na ito, babalewalain ng <ph name="PRODUCT_NAME" /> at mga ARC-app ang lahat ng tinukoy na opsyon na nauugnay sa proxy mula sa linya ng command.
-
-          Kapag hinayaang hindi nakatakda ang patakarang ito, mabibigyang-daan ang mga user na sila mismo ang pumili ng mga setting ng proxy.</translation>
 <translation id="3153348162326497318">Binibigyang-daan kang tukuyin kung aling mga extension ang HINDI maaaring i-install ng mga user. Aalisin ang mga extension na na-install na kung na-blacklist.
 
           Nangangahulugan ang isang halaga ng blacklist na '*' na ang lahat ng extension ay na-blacklist maliban kung tahasang nakalista sa whitelist ang mga ito.
@@ -752,6 +703,7 @@
       Kung pinagana o hindi naka-configure ang setting na ito, mapapagana ng mga user ang proxy ng cloud print proxy sa pamamagitan ng pagpapatotoo sa kanilang Google Account.
 
       Kung hindi pinapagana ang setting na ito, hindi mapapagana ng mga user ang proxy, at hindi papayagan ang machine na ibahagi ang mga printer nito sa <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Ine-enable ang pagtatapos sa mga proseso sa Task Manager</translation>
 <translation id="3322771899429619102">Binibigyang-daan ka na magtakda ng isang listahan ng mga pattern ng URL na tumutukoy sa mga site na pinapayagang gumamit ng pagbuo ng key. Kung ang isang pattern ng URL ay nasa 'KeygenBlockedForUrls,' ino-override nito ang mga pagbubukod na ito.
 
           Kung hinayaang hindi nakatakda ang patakarang ito, gagamitin ang default na pandaigdigang value para sa lahat ng site mula sa patakaran na 'DefaultKeygenSetting' kung nakatakda ito, o kung hindi naman ay sa personal na configuration ng user.</translation>
@@ -933,22 +885,6 @@
           Kung nakatakda ang patakarang ito sa 'Panatilihin ang cookies sa kabuuan ng session,' iki-clear ang cookies kapag nagsara ang session. Tandaan na kung tumatakbo ang <ph name="PRODUCT_NAME" /> sa 'background mode,' maaaring hindi magsara ang session kapag isinara ang huling window. Pakitingnan ang patakarang 'BackgroundModeEnabled' para sa higit pang impormasyon tungkol sa pagko-configure sa gawing ito.
 
           Kung hindi itatakda ang patakarang ito, gagamitin ang 'AllowCookies' at mababago ito ng user.</translation>
-<translation id="4098957623809244159">Hindi na ginagamit ang patakarang ito, gamitin ang ProxyMode sa halip.
-
-          Nagbibigay-daan sa iyong tukuyin ang ginagamit na server ng proxy ng <ph name="PRODUCT_NAME" /> at mga ARC-app at pumipigil sa mga user na baguhin ang mga setting ng proxy.
-
-          Kung pipiliin mong hindi gumamit ng server ng proxy kahit kailan at palaging kumonekta nang direkta, babalewalain ang lahat ng iba pang opsyon.
-
-          Kung pipiliin mong gamitin ang mga setting ng proxy ng system o awtomatikong ma-detect ang server ng proxy server, babalewalain ang lahat ng iba pang opsyon.
-
-          Kung pipiliin mo ang mga manual na setting ng proxy, maaari kang tumukoy ng mga karagdagang opsyon sa 'Address o URL ng server ng proxy,' 'URL sa isang proxy na .pac file' at 'Listahan ng mga panuntunan ng bypass ng proxy na pinaghihiwalay ng kuwit.'
-
-          Para sa mga detalyadong halimbawa, bisitahin ang:
-          <ph name="PROXY_HELP_URL" />
-
-          Kung ie-enable mo ang setting na ito, babalewalain ng <ph name="PRODUCT_NAME" /> ang lahat ng opsyon na nauugnay sa proxy na tinukoy mula sa linya ng command.
-
-          Kapag hinayaang hindi nakatakda ang patakarang ito, mabibigyang-daan ang mga user na sila mismo ang pumili ng mga setting ng proxy.</translation>
 <translation id="4103289232974211388">I-redirect sa SAML IdP pagkatapos ng kumpirmasyon ng user</translation>
 <translation id="410478022164847452">Tinutukoy ang tagal ng oras na walang input ng user na kapag lumipas ay gagawa ng pagkilos kapag idle kapag tumatakbo habang nakasaksak sa kuryente.
 
@@ -1429,14 +1365,6 @@
 <translation id="5893553533827140852">Kung naka-enable ang setting na ito, ipo-proxy ang mga kahilingan sa pagpapatunay ng gnubby sa isang malayuang koneksyon sa host.
 
           Kung naka-disable o hindi naka-configure ang setting na ito, hindi ipo-proxy ang mga kahilingan sa pagpapatunay ng gnubby.</translation>
-<translation id="5900959132054596599">Iba-bypass ng <ph name="PRODUCT_NAME" /> at mga ARC-app ang anumang proxy para sa listahan ng mga host na ibinigay rito.
-
-          Magkakaroon lang ng epekto ang patakarang ito kung pinili mo ang mga manual na setting ng proxy sa 'Piliin kung paano tutukuyin ang mga setting ng server ng proxy.'
-
-          Dapat mong hayaang hindi nakatakda ang patakarang ito kung pumili ka ng anumang iba pang mode para sa pagtatakda ng mga patakaran ng proxy.
-
-          Para sa mga mas detalyadong halimbawa, bisitahin ang:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Pinapayagan ang mga pag-download ng autoupdate sa pamamagitan ng HTTP</translation>
 <translation id="5921888683953999946">Itakda ang default na katayuan ng pagiging naa-access ng malaking cursor sa screen sa pag-login.
 
@@ -1960,9 +1888,6 @@
 
       Kung hindi pinagana o hindi nakatakda ang setting na ito, ginagamit ng <ph name="PRODUCT_NAME" /> ang piniling lokal na tinukoy ng user (kung na-configure), ang lokal ng system o ang fallback na lokal na 'en-US'.</translation>
 <translation id="7651739109954974365">Tinutukoy kung dapat paganahin ang roaming ng data para sa device. Kung nakatakda sa true, pinapayagan ang roaming ng data. Kung iniwang hindi naka-configure o nakatakda sa false, hindi magiging available ang roaming ng data.</translation>
-<translation id="7667184304362487902">Iko-configure ang mga setting ng proxy para sa <ph name="PRODUCT_NAME" /> at mga ARC-app.
-
-      Hindi pa handa sa paggamit ang patakarang ito, mangyaring huwag itong gamitin.</translation>
 <translation id="76810863974142048">URL kung saan dapat kunin ng mga client na may malayuang access ang kanilang token ng pagpapatotoo.
 
           Kung nakatakda ang patakarang ito, hihilingin ng host ng malayuang access na patotohanan ang mga client upang makakuha ng token ng pagpapatotoo mula sa URL na ito upang makakonekta. Dapat na gamitin kasama ng RemoteAccessHostTokenValidationUrl.
@@ -2194,6 +2119,7 @@
 
       Dapat na tinukoy sa milliseconds ang halaga ng patakaran.</translation>
 <translation id="8344454543174932833">Mag-import ng mga bookmark mula sa default na browser sa unang pagtakbo</translation>
+<translation id="8359734107661430198">I-enable ang ExampleDeprecatedFeature API sa 2008/09/02</translation>
 <translation id="8360452361555133173">I-enable ang pagpapakita ng welcome page sa unang paglulunsad ng browser kasunod ng pag-upgrade ng OS.
 
       Kung itatakda ang patakaran na ito sa true o hindi ito na-configure, ipapakitang muli ng browser ang welcome page sa unang paglulunsad kasunod ng pag-upgrade ng OS.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index 808b8c6..ea737eb 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fr">
 <translation id="101438888985615157">Faire pivoter l'écran de 180 degrés</translation>
-<translation id="1015272884520659144">Définit la liste des appareils USB autorisés à être dissociés de leur pilote de noyau afin d'être utilisés directement au sein d'une application mobile via l'API chrome.usb. Les entrées sont des paires composées d'un identifiant de fournisseur USB et d'un identifiant produit associé à du matériel spécifique.
-
-      Si cette règle n'est pas configurée, la liste des appareils USB amovibles est considérée comme étant vide.</translation>
 <translation id="1017967144265860778">Gestion de l'alimentation sur l'écran de connexion</translation>
 <translation id="1019101089073227242">Définir le répertoire de données utilisateur</translation>
 <translation id="1022361784792428773">Identifiants d'extension que l'utilisateur ne doit pas être autorisé à installer (ou * pour tous)</translation>
@@ -73,14 +70,6 @@
       Si cette règle n'est pas configurée, ou si elle est définie sur "False", les suites de chiffrement RC4 dans TLS ne seront pas activées. La règle peut être définie sur "True" pour assurer la compatibilité avec un serveur obsolète. Il s'agit là d'une solution provisoire, et le serveur devrait être reconfiguré.</translation>
 <translation id="1297182715641689552">Utiliser un script de proxy .pac</translation>
 <translation id="1304973015437969093">Identifiants d'extension ou d'application et URL de mise à jour à installer en arrière-plan</translation>
-<translation id="1310699457130669094">Vous pouvez spécifier ici une URL pointant vers un fichier .pac de proxy. 
-
-Cette règle ne prend effet que si vous avez sélectionné les paramètres de proxy manuels pour l'option "Sélectionner le mode de spécification des paramètres de serveur proxy". 
-
-Vous ne devriez pas configurer cette règle si vous avez sélectionné un autre mode de spécification des règles de proxy. 
-
-Pour voir plus d'options et des exemples détaillés, accédez à l'adresse : 
-<ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Indique le pourcentage d'adaptation du délai d'assombrissement de l'écran en cas d'activité de l'utilisateur lors de la réduction de la luminosité ou peu de temps après la désactivation de l'écran.
 
           Si vous définissez cette règle, elle indique le pourcentage d'adaptation du délai de réduction de la luminosité de l'écran en cas d'activité de l'utilisateur lors de la réduction de la luminosité ou peu de temps après la désactivation de l'écran. En cas d'adaptation de ce délai, les délais de désactivation, de verrouillage et d'inactivité de l'écran sont ajustés pour maintenir le même décalage par rapport au délai d'assombrissement de l'écran initialement configuré.
@@ -164,18 +153,6 @@
 <translation id="1561424797596341174">Remplacements de règle pour les versions de débogage de l'hôte distant</translation>
 <translation id="1583248206450240930">Utiliser <ph name="PRODUCT_FRAME_NAME" /> par défaut</translation>
 <translation id="1608755754295374538">URL autorisées à accéder aux appareils de capture audio sans avis préalable</translation>
-<translation id="1613574633990410986">Permet de définir le serveur proxy utilisé par <ph name="PRODUCT_NAME" /> et les applications ARC, et d'empêcher les utilisateurs de modifier les paramètres de proxy.
-
-      Si vous choisissez de ne jamais utiliser de serveur proxy et de toujours vous connecter directement, toutes les autres options sont ignorées.
-
-      Si vous optez pour la détection automatique du serveur proxy, toutes les autres options sont ignorées.
-
-      Pour consulter des exemples détaillés, rendez-vous sur :
-      <ph name="PROXY_HELP_URL" />
-
-      Si vous activez ce paramètre, <ph name="PRODUCT_NAME" /> et les applications ARC ignorent toutes les options liées au proxy spécifiées à partir de la ligne de commande.
-
-      Si ces règles ne sont pas configurées, les utilisateurs peuvent choisir eux-mêmes leurs paramètres de proxy.</translation>
 <translation id="1617235075406854669">Activer la suppression de l'historique du navigateur et de l'historique des téléchargements</translation>
 <translation id="1617384279878333801">Autoriser l'ajout de personnes dans le gestionnaire de profils</translation>
 <translation id="1655229863189977773">Définir la taille du cache du disque en octets</translation>
@@ -266,14 +243,6 @@
       Si l'option est activée, un gros bouton rouge de déconnexion s'affiche dans la barre d'état système pendant que la session est active et que l'écran n'est pas verrouillé.
 
       Si l'option est désactivée ou si elle n'est pas configurée, aucun gros bouton rouge de déconnexion ne s'affiche dans la barre d'état système.</translation>
-<translation id="1942957375738056236">Vous pouvez spécifier ici l'URL du serveur proxy. 
-
-Cette règle ne prend effet que si vous avez sélectionné les paramètres de proxy manuels dans l'option "Sélectionner le mode de spécification des paramètres de serveur proxy". 
-
-Vous ne devriez pas configurer cette règle si vous avez sélectionné un autre mode de spécification des règles de proxy. 
-
-Pour plus d'options et obtenir des exemples détaillés, accédez au site : 
-<ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Configurer la gestion de l'alimentation sur l'écran de connexion dans <ph name="PRODUCT_OS_NAME" />.
 
       Cette règle vous permet de configurer le comportement de <ph name="PRODUCT_OS_NAME" /> en cas d'inactivité de l'utilisateur pendant une période donnée alors que l'écran de connexion est affiché. Elle contrôle plusieurs paramètres. Pour connaître leur signification et les valeurs possibles, consultez les règles correspondantes qui contrôlent la gestion de l'alimentation au cours d'une session. Les seules différences sont les suivantes :
@@ -666,24 +635,6 @@
 <translation id="3072847235228302527">Définir les conditions d'utilisation d'un compte local de l'appareil</translation>
 <translation id="3096595567015595053">Liste des plug-ins activés</translation>
 <translation id="3101501961102569744">Sélectionner le mode de spécification des paramètres de serveur proxy</translation>
-<translation id="3125884964575432854">Permet de définir le serveur proxy utilisé par <ph name="PRODUCT_NAME" /> et les applications ARC, et d'empêcher les utilisateurs de modifier les paramètres de proxy.
-
-          Si vous choisissez de ne jamais utiliser de serveur proxy et de toujours vous connecter directement, toutes les autres options sont ignorées.
-
-          Si vous décidez d'utiliser les paramètres de proxy du système, toutes les autres options sont ignorées.
-
-          Si vous optez pour la détection automatique du serveur proxy, toutes les autres options sont ignorées.
-
-          Si vous choisissez le mode serveur proxy déterminé, vous pouvez définir des options supplémentaires dans "Adresse ou URL du serveur proxy" et "Liste de règles de contournement de proxy séparées par des virgules". Les applications ARC n'utilisent que le serveur proxy HTTP ayant la priorité la plus élevée.
-
-          Si vous décidez d'utiliser un script de proxy .pac, vous devez indiquer l'URL du script dans "URL d'un fichier .pac de proxy".
-
-          Pour consulter des exemples détaillés, rendez-vous sur :
-          <ph name="PROXY_HELP_URL" />
-
-          Si vous activez ce paramètre, <ph name="PRODUCT_NAME" /> et les applications ARC ignorent toutes les options liées au proxy spécifiées à partir de la ligne de commande.
-
-          Si cette règle n'est pas configurée, les utilisateurs peuvent choisir eux-mêmes leurs paramètres de proxy.</translation>
 <translation id="3153348162326497318">Vous permet de spécifier les extensions que les utilisateurs ne peuvent PAS installer. Les extensions déjà installées seront supprimées si elles sont ajoutées à la liste noire. 
 
 La valeur "*" en liste noire signifie que toutes les extensions sont sur la liste noire, sauf si elles sont explicitement répertoriées dans la liste blanche. 
@@ -756,6 +707,7 @@
       Si ce paramètre est activé ou s'il n'est pas configuré, l'utilisateur peut activer le proxy d'impression sur le cloud en se connectant à son compte Google.
 
       Si ce paramètre est désactivé, l'utilisateur ne peut pas activer le proxy et la machine n'est pas autorisée à partager ses imprimantes avec <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Permet de mettre fin aux processus dans le gestionnaire des tâches</translation>
 <translation id="3322771899429619102">Permet de définir une liste de formats d'URL qui déterminent les sites autorisés à utiliser la génération de clé. Si la règle "KeygenBlockedForUrls" est appliquée à un format d'URL, elle a priorité sur ces exceptions.
 
           Si cette règle n'est pas définie, la valeur globale par défaut est utilisée pour tous les sites, et déterminée à partir de la règle "DefaultKeygenSetting" si celle-ci est définie, ou à partir de la configuration personnelle de l'utilisateur.</translation>
@@ -942,22 +894,6 @@
           Si la règle est définie sur "Conserver les cookies pendant toute la durée de la session", les cookies seront supprimés à la fermeture de la session. Notez que si <ph name="PRODUCT_NAME" /> s'exécute en arrière-plan, il se peut que la session ne se termine pas à la fermeture de la dernière fenêtre. Veuillez consulter la règle BackgroundModeEnabled pour en savoir plus sur cette configuration.
 
           Si cette règle n'est pas définie, la règle AllowCookies sera activée, et l'utilisateur sera autorisé à la modifier.</translation>
-<translation id="4098957623809244159">Cette règle a été abandonnée. Utilisez plutôt le mode proxy.
-
-          Permet de spécifier le serveur proxy utilisé par <ph name="PRODUCT_NAME" /> et les applications ARC, et d'empêcher les utilisateurs de modifier les paramètres de proxy.
-
-          Si vous choisissez de ne jamais utiliser de serveur proxy et de toujours vous connecter directement, toutes les autres options sont ignorées.
-
-          Si vous optez pour les paramètres proxy du système ou la détection automatique du serveur proxy, toutes les autres options sont ignorées.
-
-          Si vous sélectionnez les paramètres de proxy manuels, vous pouvez spécifier des options supplémentaires dans "Adresse ou URL du serveur proxy", "URL d'un fichier .pac de proxy" et "Liste de règles de contournement de proxy séparées par des virgules".
-
-          Pour consulter des exemples détaillés, rendez-vous sur :
-          <ph name="PROXY_HELP_URL" />
-
-          Si vous activez ce paramètre, <ph name="PRODUCT_NAME" /> ignore toutes les options liées au proxy spécifiées à partir de la ligne de commande.
-
-          Si cette règle n'est pas configurée, les utilisateurs peuvent choisir eux-mêmes leurs paramètres de proxy.</translation>
 <translation id="4103289232974211388">Rediriger vers le fournisseur d'identité SAML après confirmation de l'utilisateur</translation>
 <translation id="410478022164847452">Indiquer le délai d'inactivité au terme duquel l'action d'inactivité est appliquée en cas d'utilisation de l'alimentation secteur
 
@@ -1445,14 +1381,6 @@
 <translation id="5893553533827140852">Si ce paramètre est activé, les demandes d'authentification gnubby seront envoyées par un proxy via une connexion hôte à distance.
 
           S'il est désactivé ou n'est pas configuré, ces demandes ne seront pas envoyées par un proxy.</translation>
-<translation id="5900959132054596599">Permet de définir une liste d'hôtes pour lesquels <ph name="PRODUCT_NAME" /> et les applications ARC contourneront le serveur proxy.
-
-          Cette règle n'est applicable que si vous avez sélectionné les paramètres de proxy manuels pour l'option "Sélectionner le mode de spécification des paramètres de serveur proxy".
-
-          Ne configurez pas cette règle si vous avez sélectionné un autre mode de spécification des règles de proxy.
-
-          Pour consulter des exemples détaillés, rendez-vous sur :
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Autoriser les téléchargements de mise à jour automatique via HTTP</translation>
 <translation id="5921888683953999946">Définit l'état par défaut de la fonctionnalité d'accessibilité de grand curseur sur l'écran de connexion.
 
@@ -1973,9 +1901,6 @@
 
 Si ce paramètre est désactivé ou s'il n'est pas configuré, <ph name="PRODUCT_NAME" /> utilise les paramètres régionaux favoris de l'utilisateur (s'ils ont été configurés), les paramètres régionaux du système ou les paramètres régionaux de remplacement ("en-US").</translation>
 <translation id="7651739109954974365">Détermine si l'itinérance des données doit être activée pour l'appareil. Si cette règle est définie sur "true", l'itinérance des données est autorisée. Si cette règle n'est pas configurée ou si elle est définie sur "false", l'itinérance des données n'est pas possible.</translation>
-<translation id="7667184304362487902">Permet de configurer les paramètres de proxy pour <ph name="PRODUCT_NAME" /> et les applications ARC.
-
-      Cette règle n'est pas encore prête. Nous vous invitons donc à ne pas l'utiliser pour le moment.</translation>
 <translation id="76810863974142048">URL à laquelle les clients d'accès à distance doivent obtenir leur jeton d'authentification.
 
           Si cette règle est définie, l'hôte d'accès à distance exigera des clients qui s'authentifient qu'ils obtiennent un jeton d'authentification à partir de cette URL pour se connecter. Elle doit être utilisée avec la règle RemoteAccessHostTokenValidationUrl.
@@ -2209,6 +2134,7 @@
 
        La valeur de cette règle est définie en millisecondes.</translation>
 <translation id="8344454543174932833">Importer les favoris du navigateur par défaut à la première exécution</translation>
+<translation id="8359734107661430198">Activer l'API ExampleDeprecatedFeature jusqu'au 09/02/2008</translation>
 <translation id="8360452361555133173">Activer l'affichage de la page d'accueil au premier lancement suivant la mise à jour  de l'OS.
 
       Si cette règle est définie sur "True" ou n'est pas configurée, le navigateur affichera à nouveau la page d'accueil au premier lancement suivant la mise à jour de l'OS.
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb
index d81517c..16d403a 100644
--- a/components/policy/resources/policy_templates_gu.xtb
+++ b/components/policy/resources/policy_templates_gu.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="gu">
 <translation id="101438888985615157">સ્ક્રીનને 180 ડિગ્રીએ ફેરવો</translation>
-<translation id="1015272884520659144">USB ઉપકરણોની સૂચિને વ્યાખ્યાયિત કરે છે કે જે સીધા જ વેબ ઍપ્લિકેશનની અંદર chrome.usb API મારફતે ઉપયોગ કરવા માટે તેમના કર્નલ ડ્રાઇવરમાંથી અલગ કરી દેવા માટે મંજૂરી આપે છે. પ્રવિષ્ટિઓ ઉલ્લેખિત હાર્ડવેરને ઓળખવા માટે USB વિક્રેતા ઓળખકર્તા અને ઉત્પાદન ઓળખકર્તાની જોડીઓ છે.
-
-      જો આ નીતિ ગોઠવેલી ન હોય, તો અલગ પાડી શકાય તેવા USB ઉપકરણો ખાલી તરીકે ગણવામાં આવે છે.</translation>
 <translation id="1017967144265860778">લોગિન સ્ક્રીન પર પાવર સંચાલન</translation>
 <translation id="1019101089073227242">વપરાશકર્તા  ડેટા નિર્દેશિકા સેટ કરો</translation>
 <translation id="1022361784792428773">તે એક્સ્ટેંશન ID કે જેને ઇન્સ્ટોલ કરવાથી વપરાશકર્તાઓને અટકાવવા જોઈએ (અથવા * બધા માટે)</translation>
@@ -74,14 +71,6 @@
       જો નીતિ સેટ કરેલ નથી અથવા તો false પર સેટ કરેલ છે, તો પછી TLS માં RC4 સાઇફર સ્યૂટ્સ સક્ષમ કરવામાં આવશે નહીં. અન્યથા તે જૂના સર્વર સાથે સુસંગતતા રાખવા માટે તે true પર સેટ કરવામાં આવી શકે છે. આ એક કામચલાઉ પગલું છે અને સર્વરને ફરીથી ગોઠવવું જોઈએ.</translation>
 <translation id="1297182715641689552">.pac પ્રોક્સી સ્ક્રિપ્ટનો ઉપયોગ કરો</translation>
 <translation id="1304973015437969093">ચુપચાપ ઇન્સ્ટોલ કરવાના ઍક્સ્ટેન્શન/ઍપ્લિકેશન ID અને અપડેટ URL</translation>
-<translation id="1310699457130669094">તમે અહીં પ્રોક્સી .pac ફાઇલના URL નો ઉલ્લેખ કરી શકો છો.
-
-          આ નીતિ ફક્ત ત્યારે જ પ્રભાવિત થાય છે જો તમે 'પ્રોક્સી સર્વર સેટિંગ્સનો ઉલ્લેખ કેવી રીતે કરવો તે પસંદ કરો' પર તમે મેન્યુઅલ પ્રોક્સી સેટિંગ પસંદ કર્યું હોય.
-
-          તમારે આ નીતિને સેટ કર્યા વિના છોડવી જોઈએ જો તમે પ્રોક્સી સેટિંગ નીતિઓ માટે કોઈ અન્ય મોડ પસંદ કર્યો છે.
-
-          વિગતવાર ઉદાહરણો માટે, આની મુલાકાત લો:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">તે ટકાવારી નિર્દિષ્ટ કરે છે કે જેના દ્વારા જ્યારે સ્ક્રીન મંદ હોવા પર અથવા સ્ક્રીન બંધ કરવામાં આવે કે તરત વપરાશકર્તા પ્રવૃત્તિનું નિરીક્ષણ કરવામાં આવે છે ત્યારે સ્ક્રીન મંદતા વિલંબ માપવામાં આવે છે.
 
           જો આ નીતિ સેટ કરેલી હોય, તો તે ટકાવારી નિર્દિષ્ટ કરે છે કે જેના દ્વારા જ્યારે સ્ક્રીન મંદ હોવા પર અથવા જ્યારે સ્ક્રીન બંધ કરવામાં આવે કે તરત વપરાશકર્તા પ્રવૃત્તિનું નિરીક્ષણ કરવામાં આવે છે ત્યારે સ્ક્રીન મંદતા વિલંબ માપવામાં આવે છે. જ્યારે સ્ક્રીન મંદતા વિલંબ માપવામાં આવે છે, ત્યારે સ્ક્રીન બંધ, સ્ક્રીન લૉક અને સ્ક્રીન નિષ્ક્રિય વિલંબો મૂળ રીતે ગોઠવેલા સ્ક્રીન મંદતા વિલંબથી સમાન અંતરોને જાળવવા માટે સમાયોજિત થાય છે.
@@ -163,18 +152,6 @@
 <translation id="1561424797596341174">રિમોટ ઍક્સેસ હોસ્ટના ડીબગ બિલ્ડ્સ માટે નીતિ ઓવરરાઇડ્સ</translation>
 <translation id="1583248206450240930">ડિફૉલ્ટ તરીકે  <ph name="PRODUCT_FRAME_NAME" /> નો ઉપયોગ કરો</translation>
 <translation id="1608755754295374538">URL કે જેને વિના સંકેતે ઑડિઓ કેપ્ચર ઉપકરણોની ઍક્સેસ આપવામાં આવશે</translation>
-<translation id="1613574633990410986">તમને <ph name="PRODUCT_NAME" /> અને ARC-ઍપ્લિકેશનો દ્વારા ઉપયોગમાં લેવાતા પ્રોક્સી સર્વરનો ઉલ્લેખ કરવાની મંજૂરી આપે છે અને વપરાશકર્તાઓને પ્રોક્સી સેટિંગ્સ બદલવાથી અટકાવે છે.
-
-      જો તમે ક્યારેય પ્રોક્સી સર્વરનો ઉપયોગ ન કરવા અને હંમેશાં સીધા જ કનેક્ટ કરવાનું પસંદ કરો છો, તો અન્ય તમામ વિકલ્પો અવગણવામાં આવે છે.
-
-      જો તમે પ્રોક્સી સર્વરની સ્વતઃ શોધ કરવાનું પસંદ કરો છો, તો અન્ય તમામ વિકલ્પો અવગણવામાં આવે છે.
-
-      વિગતવાર ઉદાહરણો માટે, આની મુલાકાત લો:
-      <ph name="PROXY_HELP_URL" />
-
-      જો તમે આ સેટિંગને સક્ષમ કરો છો, તો <ph name="PRODUCT_NAME" />, આદેશ રેખા પરથી ઉલ્લેખિત કરેલા તમામ પ્રોક્સી-સંબંધિત વિકલ્પોને અવગણે છે.
-
-      આ નીતિઓને સેટ કર્યા વિના છોડવું વપરાશકર્તાઓને તેમની પોતાની પ્રોક્સી સેટિંગ્સ પસંદ કરવાની મંજૂરી આપે છે.</translation>
 <translation id="1617235075406854669">બ્રાઉઝર અને ડાઉનલોડ ઇતિહાસને કાઢી નાખવાનું સક્ષમ કરો</translation>
 <translation id="1617384279878333801">પ્રોફાઇલ સંચાલકમાં વ્યક્તિ ઉમેરવાનું સક્ષમ કરવું</translation>
 <translation id="1655229863189977773">ડિસ્ક કૅસ કદને બાઇટ્સમાં સેટ કરો</translation>
@@ -260,14 +237,6 @@
       જો સક્ષમ હોય, તો એક મોટું, લાલ લૉગઆઉટ બટન સિસ્ટમ ટ્રેમાં દેખાય છે જ્યારે સત્ર સક્રિય હોય અને સ્ક્રીન લૉક કરેલી ન હોય.
 
       જો અક્ષમ હોય અથવા ઉલ્લેખિત ન હોય, તો મોટું, લાલ લૉગઆઉટ બટન સિસ્ટમ ટ્રેમાં દેખાતું નથી.</translation>
-<translation id="1942957375738056236">તમે અહીં પ્રોક્સી સર્વરના URL નો ઉલ્લેખ કરી શકો છો.
-
-          આ નીતિ ફક્ત ત્યારે જ અસર કરે છે જો તમે 'પ્રોક્સી સર્વર સેટિંગ્સનો ઉલ્લેખ કેવી રીતે કરવો' પર મેન્યુઅલ પ્રોક્સી સેટિંગ્સ પસંદ કર્યું હોય.
-
-          જો તમે સેટિંગ પ્રોક્સી નીતિ માટે કોઈ અન્ય મોડ પસંદ કરેલો હોય, તો તમારે આ નીતિને સેટ કર્યા વિના છોડવી જોઈએ.
-
-          વધુ વિકલ્પો અને વિગતવાર ઉદાહરણો માટે, આની મુલાકાત લો:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974"><ph name="PRODUCT_OS_NAME" /> માં લોગિન સ્ક્રિન પર પાવર સંચાલનને ગોઠવો.
 
       જ્યારે લોગિન સ્ક્રિન દર્શાવવામાં આવી રહી હોય ત્યારે થોડા સમય માટે કોઇ વપરાશકર્તા પ્રવૃત્તિ ન થાય ત્યારે <ph name="PRODUCT_OS_NAME" /> કેવી રીતે વર્તે છે તે આ નીતિ તમને ગોઠવવા દે છે. આ નીતિ બહુવિધ સેટિંગ્સનું નિયંત્રણ કરે છે. તેમના વ્યક્તિગત અર્થનિર્ધારણ અને મૂલ્ય શ્રેણીઓ માટે, સત્ર અંતર્ગત પાવર સંચાલનનું નિયંત્રણ કરતી અનુરૂપ નીતિઓ જુઓ. આ નીતિઓમાંથી માત્ર વિચલનો આ છે:
@@ -654,24 +623,6 @@
 <translation id="3072847235228302527">ઉપકરણ-સ્થાનિક એકાઉન્ટ માટે સેવાની શરતો સેટ કરો</translation>
 <translation id="3096595567015595053">સક્ષમ પ્લગઇન્સની સૂચિ</translation>
 <translation id="3101501961102569744">પ્રોક્સી સર્વર સેટિંગનો ઉલ્લેખ કેવી રીતે કરવો તે  પસંદ કરો</translation>
-<translation id="3125884964575432854">તમને <ph name="PRODUCT_NAME" /> અને ARC-ઍપ્લિકેશનો દ્વારા ઉપયોગમાં લેવાતા પ્રોક્સી સર્વરનો ઉલ્લેખ કરવાની મંજૂરી આપે છે અને વપરાશકર્તાઓને પ્રોક્સી સેટિંગ્સ બદલવાથી અટકાવે છે.
-
-          જો તમે ક્યારેય પ્રોક્સી સર્વરનો ઉપયોગ ન કરવા અને હંમેશાં સીધા જ કનેક્ટ કરવાનું પસંદ કરો છો, તો અન્ય તમામ વિકલ્પો અવગણવામાં આવે છે.
-
-          જો તમે સિસ્ટમ પ્રોક્સી સેટિંગ્સનો ઉપયોગ કરવાનું પસંદ કરો છો, તો અન્ય તમામ વિકલ્પો અવગણવામાં આવે છે.
-
-          જો તમે પ્રોક્સી સર્વરની સ્વતઃ શોધ કરવાનું પસંદ કરો છો, તો અન્ય તમામ વિકલ્પોને અવગણે છે.
-
-          જો તમે સ્થિર સર્વર પ્રોક્સી મોડ પસંદ કરો છો, તો તમે 'પ્રોક્સી સર્વરનું સરનામું અથવા URL' અને 'પ્રોક્સી બાયપાસ નિયમોની અલ્પવિરામથી વિભાજિત સૂચિ'માં આગળનાં વિકલ્પો ઉલ્લેખિત કરી શકો છો. ARC-ઍપ્લિકેશનો ફક્ત ઉચ્ચતમ પ્રાધાન્યતા સાથેના HTTP પ્રોક્સી સર્વરનો જ ઉપયોગ કરશે.
-
-          જો તમે .pac પ્રોક્સી સ્ક્રિપ્ટને ઉપયોગ કરવાનું પસંદ કરો છો, તો તમે 'પ્રોક્સી .pac ફાઇલનું URL' માં સ્ક્રિપ્ટના URL નો ઉલ્લેખ કરો એ આવશ્યક છે.
-
-          વિગતવાર ઉદાહરણ માટે, આની મુલાકાત લો:
-          <ph name="PROXY_HELP_URL" />
-
-          જો તમે આ સેટિંગને સક્ષમ કરો છો, તો <ph name="PRODUCT_NAME" /> અને ARC-ઍપ્લિકેશનો આદેશ રેખા પરથી ઉલ્લેખિત તમામ પ્રોક્સી-સંબંધિત વિકલ્પોને અવગણશે.
-
-          આ નીતિને સેટ કર્યા વિના છોડવી વપરાશકર્તાઓને પોતાની જાતે પ્રોક્સી સેટિંગ્સને પસંદ કરવાની મંજૂરી આપશે.</translation>
 <translation id="3153348162326497318">તમને નિર્દિષ્ટ કરવા દે છે કે કયા એક્સ્ટેશંસને વપરાશકર્તા ઇન્સ્ટોલ કરી શકતા નથી. જો બ્લેકલિસ્ટેડ હશે તો પહેલાથી ઇન્સ્ટોલ કરેલા એક્સ્ટેશંસને દૂર કરવામાં આવશે.
 
           '*' નું બ્લેકલિસ્ટ મૂલ્યનો અર્થ એ છે કે બધા એક્સ્ટેંશંસ વ્હાઇટલિસ્ટમાં સ્પષ્ટ રૂપે સૂચિબદ્ધ નહીં થાય ત્યાં સુધી બ્લેકલિસ્ટેડ છે.
@@ -744,6 +695,7 @@
       જો આ સેટિંગ સક્ષમ છે અથવા ગોઠવેલી નથી, તો વપરાશકર્તાઓ તેમના Google એકાઉન્ટ સાથે પ્રમાણીકરણ દ્વારા મેઘ મુદ્રણ પ્રોક્સીને સક્ષમ કરી શકે છે.
 
       જો આ સેટિંગ અક્ષમ છે, તો વપરાશકર્તાઓ પ્રોક્સીને સક્ષમ કરી શકતા નથી, અને મશીનને તેના પ્રિંટર્સને <ph name="CLOUD_PRINT_NAME" /> સાથે શેર કરવાની પરવાનગી હશે નહીં.</translation>
+<translation id="3297010562646015826">કાર્ય વ્યવસ્થાપકમાં સમાપ્તિની પ્રક્રિયાઓ સક્ષમ કરે છે</translation>
 <translation id="3322771899429619102">કી જનરેશનનો ઉપયોગ કરવાની મંજૂરી આપવામાં આવી હોય તેવી સાઇટ્સને ઉલ્લેખિત કરતી url પેટર્ન્સની સૂચિ સેટ કરવા માટે તમને મંજૂરી આપે છે. જો url પેટર્ન 'KeygenBlockedForUrls' માં હોય, તો તે આ અપવાદોને ઓવરરાઇડ કરે છે.
 
           જો આ નીતિ સેટ કર્યા વિના છોડવામાં આવી હોય, તો વૈશ્વિક ડિફોલ્ટ મૂલ્યનો ઉપયોગ, જો 'DefaultKeygenSetting' નીતિ સેટ કરેલી હોય તો તેમાંથી અથવા અન્ય રીતે વપરાશકર્તાની વ્યક્તિગત ગોઠવણીમાંથી તમામ સાઇટ્સ માટે કરવામાં આવશે.</translation>
@@ -930,22 +882,6 @@
           જો આ નીતિને ‘કુકીઝને સત્રના સમયગાળા માટે રાખો’ પર સેટ કરવામાં આવી હોય, તો જ્યારે સત્ર બંધ થશે ત્યારે કુકીઝ સાફ કરવામાં આવશે. નોંધો કે જો <ph name="PRODUCT_NAME" />, ‘પૃષ્ઠભૂમિ મોડ’ માં ચાલી રહ્યું હોય, તો જ્યારે છેલ્લી વિંડો બંધ થાય ત્યારે સત્ર બંધ ન થાય તેવું બની શકે. કૃપા કરીને આ વર્તનને ગોઠવવા વિશે વધુ માહિતી માટે ‘BackgroundModeEnabled’ નીતિ જુઓ.
 
           જો આ નીતિને સેટ કર્યા વગર છોડવામાં આવી હોય, તો ‘AllowCookies’ નો ઉપયોગ કરવામાં આવશે અને વપરાશકર્તા તેને બદલવામાં સમર્થ હશે.</translation>
-<translation id="4098957623809244159">આ નીતિ ટાળેલ છે, તેના બદલે ProxyMode નો ઉપયોગ કરો.
-
-          તમને <ph name="PRODUCT_NAME" /> અને ARC-વપરાશકર્તાઓને દ્વારા ઉપયોગમાં લેવાતા પ્રોક્સી સર્વરનો ઉલ્લેખ કરવાની મંજૂરી આપે છે અને વપરાશકર્તાઓને પ્રોક્સી સેટિંગ્સ બદલવાથી અટકાવે છે.
-
-          જો તમે પ્રોક્સી સર્વરનો ક્યારેય ઉપયોગ ન કરવાનું અને હંમેશાં સીધા જ કનેક્ટ થવાનું પસંદ કરો છો, તો અન્ય તમામ વિકલ્પો અવગણવામાં આવે છે.
-
-          જો તમે સિસ્ટમ પ્રોક્સી સેટિંગ્સનો ઉપયોગ કરવાનું અથવા પ્રોક્સી સર્વરની સ્વતઃ શોધ કરવાનું પસંદ કરો છો, તો અન્ય તમામ વિકલ્પો અવગણવામાં આવે છે.
-
-          જો તમે મેન્યુઅલ પ્રોક્સી સેટિંગ્સ પસંદ કરો છો, તો તમે 'પ્રોક્સી સર્વરનું સરનામું અથવા URL', 'પ્રોક્સી .pac ફાઇલનું URL' અને 'પ્રોક્સી બાયપાસ નિયમોની અલ્પવિરામથી વિભાજિત સૂચિ'માં આગળનાં વિકલ્પો ઉલ્લેખિત કરી શકો છો.
-
-          વિગતવાર ઉદાહરણો માટે, આની મુલાકાત લો:
-          <ph name="PROXY_HELP_URL" />
-
-          જો તમે આ સેટિંગને સક્ષમ કરો છો, <ph name="PRODUCT_NAME" /> આદેશ રેખા પરથી ઉલ્લેખિત તમામ પ્રોક્સી-સંબંધિત વિકલ્પોને અવગણે છે.
-
-          આ નીતિને સેટ કર્યા વિના છોડવી વપરાશકર્તાઓને પોતાની જાતે પ્રોક્સી સેટિંગ્સને પસંદ કરવાની મંજૂરી આપશે.</translation>
 <translation id="4103289232974211388">વપરાશકર્તાના પુષ્ટિકરણ બાદ SAML IdP પર રીડાયરેક્ટ કરો</translation>
 <translation id="410478022164847452">વપરાશકર્તા ઇનપુટ વિના સમયની લંબાઈને નિર્દિષ્ટ કરે છે કે જેના પછી નિષ્ક્રિય ક્રિયા લેવાય છે જ્યારે AC પાવર પર ચાલી રહ્યું હોય છે.
 
@@ -1428,14 +1364,6 @@
 <translation id="5893553533827140852">જો આ સેટિંગ સક્ષમ કરેલી છે, તો પછી gnubby પ્રમાણીકરણ વિનંતીઓને સમગ્ર રિમોટ હોસ્ટ કનેક્શન પર પ્રોક્સી કરવામાં આવશે.
 
           જો આ સેટિંગ અક્ષમ કરેલી છે અથવા ગોઠવેલી નથી, તો gnubby પ્રમાણીકરણ વિનંતીઓને પ્રોક્સી કરવામાં આવશે નહીં.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> અને ARC-ઍપ્લિકેશનો, અહીં આપેલ હોસ્ટ્સની સૂચિ માટે કોઈપણ પ્રોક્સીને બાયપાસ કરશે.
-
-          આ નીતિ ફક્ત ત્યારે જ લાગુ થાય છે જ્યારે તમે 'પ્રોક્સી સર્વર સેટિંગ્સનો કેવી રીતે ઉલ્લેખ કરવોને પસંદ કરો' પર મેન્યુઅલ પ્રોક્સી સેટિંગ્સને પસંદ કરી હોય.
-
-          જો તમે પ્રોક્સી નીતિઓને સેટ કરવા માટે કોઈ અન્ય મોડ પસંદ કર્યો હોય તો તમારે આ નીતિને સેટ કર્યા વિના છોડવી જોઈએ.
-
-          વધુ વિગતવાર ઉદાહરણો માટે, આની મુલાકાત લો:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">HTTP મારફતે સ્વતઃઅપડેટ ડાઉનલોડ્સને મંજૂરી આપો</translation>
 <translation id="5921888683953999946">લોગિન સ્ક્રીન પર મોટું કર્સરની સ્થિતિ ઍક્સેસિબિલિટી સુવિધાની ડિફોલ્ટ સ્થિતિ સેટ કરો.
 
@@ -1953,9 +1881,6 @@
 <translation id="7632724434767231364">GSSAPI લાઇબ્રેરી નામ</translation>
 <translation id="7635471475589566552"><ph name="PRODUCT_NAME" /> માં એપ્લિકેશન લોકૅલને ગોઠવે છે અને વપરાશકર્તાઓને લોકૅલ બદલવાથી રોકે છે. જો તમે આ સેટિંગ્સને સક્ષમ કરો છો, તો <ph name="PRODUCT_NAME" /> ઉલ્લેખિત લોકૅલનો ઉપયોગ કરે છે. જો તમે ગોઠવેલા લોકૅલ સપોર્ટ નથી કરતા, તો તેને બદલે 'en-US' નો ઉપયોગ કરવામાં આવે છે. જો આ સેટિંગ અક્ષમ કરેલી છે અથવાસેટ કરેલી નથી, તો <ph name="PRODUCT_NAME" /> વપરાશકર્તા-ઉલ્લેખિત પસંદીદા લોકૅલ (જો ગોઠવેલ છે)નો, સિસ્ટમ લોકૅલનો અથવા ફૉલબૅક લોકૅલ 'en-US' નો ઉપયોગ કરે છે.</translation>
 <translation id="7651739109954974365">ઉપકરણ માટે ડેટા રોમિંગ સક્ષમ હોવું જોઈએ કે નહીં. જો true પર સેટ છે, તો ડેટા રોમિંગની મંજૂરી છે. જો ગોઠવ્યાં વગર છોડેલું છે અથવા false પર સેટ છે, તો ડેટા રોમિંગ ઉપલબ્ધ હશે નહીં.</translation>
-<translation id="7667184304362487902"><ph name="PRODUCT_NAME" /> અને ARC-ઍપ્લિકેશનો માટે પ્રોક્સી સેટિંગ્સને ગોઠવે છે.
-
-      આ નીતિ હજી સુધી ઉપયોગ માટે તૈયાર નથી, કૃપા કરીને તેનો ઉપયોગ કરશો નહીં.</translation>
 <translation id="76810863974142048">URL જ્યાં રિમોટ ઍક્સેસ ક્લાઇન્ટ્સ એ તેઓનો પ્રમાણીકરણ ટોકન મેળવવો જોઈએ.
 
           જો આ નીતિ સેટ કરવામાં આવી હોય, તો રિમોટ ઍક્સેસ હોસ્ટ, પ્રમાણીકરણ કરતાં ક્લાઇન્ટ્સને, કનેક્ટ કરવા માટે, આ URL પરથી પ્રમાણીકરણ ટોકન મેળવવું પડશે. RemoteAccessHostTokenValidationUrl ની સાથે ઉપયોગમાં લેવો આવશ્યક છે.
@@ -2185,6 +2110,7 @@
 
       નીતિ મૂલ્ય મીલિસેકન્ડ્સમાં ઉલ્લેખિત હોવું જોઈએ.</translation>
 <translation id="8344454543174932833">પહેલા ચલાવવા પર ડિફૉલ્ટ બ્રાઉઝરથી બુકમાર્ક્સને આયાત કરો</translation>
+<translation id="8359734107661430198">2008/09/02 મારફતે ExampleDeprecatedFeature API સક્ષમ કરો</translation>
 <translation id="8360452361555133173">OS અપગ્રેડ બાદ, પહેલીવાર બ્રાઉઝર લોંચ કરવા પર સ્વાગત પૃષ્ઠ બતાવવું સક્ષમ કરો.
 
       જો આ નીતિને true પર સેટ કરી હોય અથવા ગોઠવી ન હોય, તો OS અપગ્રેડ બાદ, પહેલીવાર લોંચ કરવા પર બ્રાઉઝર સ્વાગત પૃષ્ઠ ફરીથી બતાવશે.
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb
index 0f89b78..32fbfa0f 100644
--- a/components/policy/resources/policy_templates_hi.xtb
+++ b/components/policy/resources/policy_templates_hi.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="hi">
 <translation id="101438888985615157">स्‍क्रीन को 180 डिग्री पर घुमाएं</translation>
-<translation id="1015272884520659144">उन USB डिवाइस की सूची परिभाषित करती है जिन्हें किसी वेब ऐप्लिकेशन के अंदर chrome.usb API के माध्यम से उपयोग किए जाने के लिए उनके kernel डिस्क से अलग करने की अनुमति है. किसी विशिष्ट हार्डवेयर की पहचान करने के लिए प्रविष्टियां, USB विक्रेता पहचानकर्ता और उत्पाद पहचानकर्ता का समूह होती हैं.
-
-      यदि यह पॉलिसी कॉन्फ़िगर नहीं की गई है, तो अलग किए जाने वाले USB डिवाइसों की सूची को खाली माना जाएगा.</translation>
 <translation id="1017967144265860778">लॉगिन स्क्रीन पर पावर प्रबंधन</translation>
 <translation id="1019101089073227242">उपयोगकर्ता डेटा निर्देशिका सेट करें</translation>
 <translation id="1022361784792428773">वे एक्सटेंशन आईडी जिन्हें उपयोगकर्ता को इंस्टॉल करने से बचना चाहिए (या सभी के लिए *)</translation>
@@ -69,14 +66,6 @@
       यदि पॉलिसी को सेट नहीं किया जाता है या असत्य पर सेट किया जाता है, तो RC4 के सिफ़र सुइट को TLS में सक्षम नहीं किया जाएगा. अन्यथा किसी पुराने सर्वर के साथ संगतता बनाए रखने के लिए उसे सत्य पर सेट किया जा सकता है. यह एक स्‍टॉपगैप उपाय है और सर्वर को पुनः कॉन्फ़िगर किया जाना चाहिए.</translation>
 <translation id="1297182715641689552">किसी .pac प्रॉक्सी स्क्रिप्ट का उपयोग करें</translation>
 <translation id="1304973015437969093">चुपचाप इंस्टॉल किए जाने वाले एक्सटेंशन/ऐप आईडी और अपडेट URL</translation>
-<translation id="1310699457130669094">आप यहां प्रॉक्‍सी .pac फ़ाइल का कोई URL निर्दिष्ट कर सकते हैं.
-
-          यह नीति केवल तब प्रभावी होगी यदि आपने 'यह चुनें कि प्रॉक्‍सी सर्वर सेटिंग कैसे निर्दिष्ट करें' पर मैन्‍युअल प्रॉक्‍सी सेटिंग का चयन किया है.
-
-          यदि आपने प्रॉक्‍सी नीतियां सेट करने का कोई अन्‍य मोड चयनित किया है, तो आपको यह नीति सेट किए बिना छोड़ देनी चाहिए.
-
-          विस्तृत उदाहरणों के लिए, इस पर जाएं:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">स्क्रीन के मंद रहने या स्क्रीन के बंद हो जाने के तुरंत बाद उपयोगकर्ता गतिविधि का निरीक्षण करते समय मंद स्क्रीन विलंब को मापे जाने का प्रतिशत निर्दिष्ट करता है.
 
           यदि यह नीति सेट हो, तो यह स्क्रीन के मंद रहने या स्क्रीन के बंद हो जाने के तुरंत बाद उपयोगकर्ता गतिविधि का निरीक्षण करते समय मंद स्क्रीन विलंब को मापे जाने का प्रतिशत निर्दिष्ट करती है. जब मंद विलंब मापा जाता है, तो बंद स्क्रीन, स्क्रीन लॉक, प्रयोग में नहीं विलंब को मंद स्क्रीन विलंब से वही समान दूरी बनाए रखने के लिए एडजस्ट किया जाता हैजो मूल रूप से कॉन्फ़िगर की गई है.
@@ -159,18 +148,6 @@
 <translation id="1561424797596341174">दूरस्‍थ ऐक्‍सेस होस्‍ट के डीबग बिल्‍ड के लिए पॉलिसी ओवरराइड</translation>
 <translation id="1583248206450240930">सामान्य रूप से <ph name="PRODUCT_FRAME_NAME" /> का उपयोग करें</translation>
 <translation id="1608755754295374538">ऐसे URL जिन्हें संकेत किए बिना ऑडियो कैप्चर डिवाइस की एक्सेस दी जाएगी</translation>
-<translation id="1613574633990410986">आपको <ph name="PRODUCT_NAME" /> और ARC-ऐप्लिकेशन के द्वारा उपयोग किए जाने वाले प्रॉक्सी सर्वर को निर्दिष्ट करने और उपयोगकर्ताओं को प्रॉक्सी सेटिंग में बदलाव करने से रोकती है.
-
-      यदि आप प्रॉक्सी सर्वर का कभी भी उपयोग नहीं करना और हमेशा सीधे कनेक्ट होना चुनते हैं, तो अन्य सभी विकल्पों पर ध्यान नहीं दिया जाता है.
-
-      यदि आप प्रॉक्सी सर्वर का स्वतः पता लगाना चुनते हैं, तो अन्य सभी विकल्पों पर ध्यान नहीं दिया जाता है.
-
-      विस्तृत उदाहरणों के लिए, यहां जाएं:
-      <ph name="PROXY_HELP_URL" />
-
-      यदि आप यह सेटिंग सक्षम करते हैं, तो <ph name="PRODUCT_NAME" /> और ARC-ऐप्लिकेशन द्वारा आदेश पंक्ति द्वारा निर्दिष्ट सभी प्रॉक्सी-संबंधी विकल्पों पर ध्यान नहीं दिया जाता है.
-
-      इन पॉलिसी को सेट नहीं पर छोड़ने से उपयोगकर्ताओं को स्वयं प्रॉक्सी सेटिंग चुनने की अनुमति मिल जाएगी.</translation>
 <translation id="1617235075406854669">ब्राउज़र और डाउनलोड इतिहास हटाना सक्षम करें</translation>
 <translation id="1617384279878333801">प्रोफ़ाइल प्रबंधक में व्‍यक्‍ति जोड़ना सक्षम करें</translation>
 <translation id="1655229863189977773">डिस्‍क संचय आकार को बाइट में सेट करें</translation>
@@ -260,7 +237,6 @@
       यदि सक्षम हो, तो सत्र के सक्रिय रहने और स्क्रीन के लॉक नहीं होने पर, सिस्टम ट्रे में एक बड़ा, लाल लॉगआउट बटन दिखाया जाता है.
 
       यदि अक्षम हो या निर्दिष्ट नहीं हो, तो सिस्टम ट्रे में कोई भी बड़ा, लाल लॉगआउट बटन नहीं दिखाया जाता है.</translation>
-<translation id="1942957375738056236">आप यहां प्रॉक्‍सी सर्वर का URL निर्दिष्ट कर सकते हैं. यह नीति केवल तभी लागू होती है, जब आपके द्वारा 'चुनें कि प्रॉक्‍सी सर्वर सेटिंग कैसे निर्दिष्ट करें' पर मैन्‍यूअल प्रॉक्‍सी सेटिंग का चयन किया गया हो. यदि आपने प्रॉक्‍सी नीतियों की सेटिंग के लिए किसी अन्‍य मोड का चयन किया है, तो आपको यह नीति सेट नहीं करना चाहिए. अधिक विकल्‍पों और विस्‍तृत उदाहरणों के लिए, यहां जाएं: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974"><ph name="PRODUCT_OS_NAME" /> में प्रवेश स्क्रीन पर पावर प्रबंधन कॉन्फ़िगर करें.
 
       यह नीति प्रवेश स्क्रीन के दिखाई देने पर कुछ समय के लिए कोई भी उपयोगकर्ता गतिविधि नहीं होने पर आपको <ph name="PRODUCT_OS_NAME" /> के व्यवहार करने के तरीके को कॉन्फ़िगर करने देती है. नीति एकाधिक सेटिंग नियंत्रित करती है. उनके व्यक्तिगत सीमेंटिक और मान श्रेणियों के लिए, सत्र में पावर प्रबंधन को नियंत्रित करने वाली संबंधित नीतियां देखें. इन नीतियों के साथ भिन्नताएं निम्न हैं:
@@ -636,24 +612,6 @@
 <translation id="3072847235228302527">डिवाइस-स्थानीय खाते के लिए सेवा की शर्तों सेट करना</translation>
 <translation id="3096595567015595053">सक्षम प्‍लग इन की सूची</translation>
 <translation id="3101501961102569744">प्रॉक्सी सर्वर सेटिंग निर्दिष्ट करने का तरीका चुनें</translation>
-<translation id="3125884964575432854">आपको <ph name="PRODUCT_NAME" /> और ARC-ऐप्लिकेशन द्वारा उपयोग किए जाने वाले प्रॉक्सी सर्वर निर्दिष्ट करने और उपयोगकर्ताओं को प्रॉक्सी सेटिंग में बदलाव करने से रोकती है.
-
-          यदि आप प्रॉक्सी सर्वर का कभी भी उपयोग नहीं करना और हमेशा सीधे कनेक्ट होना चुनते हैं, तो अन्य सभी विकल्पों पर ध्यान नहीं दिया जाता है.
-
-          यदि आप सिस्टम प्रॉक्सी सेटिंग का उपयोग करना चुनते हैं, तो अन्य सभी विकल्पों पर ध्यान नहीं दिया जाता है.
-
-          यदि आप प्रॉक्सी सर्वर का स्वतः पता लगाना चुनते हैं, तो अन्य सभी विकल्पों पर ध्यान नहीं दिया जाता है.
-
-          यदि आप निश्चित सर्वर प्रॉक्सी मोड चुनते हैं, तो आप 'प्रॉक्सी सर्वर का पता या URL' और 'प्रॉक्सी को अनदेखा करने के नियमों की विरामचिह्न द्वारा अलग की गई सूची' में और अधिक विकल्प निर्दिष्ट कर सकते हैं. ARC-ऐप्लिकेशन केवल उच्चतम प्राथमिकता वाले HTTP प्रॉक्सी सर्वर का उपयोग करेगा.
-
-          यदि आप .pac प्रॉक्सी स्क्रिप्ट का उपयोग करना चुनते हैं, तो आपको 'प्रॉक्सी .pac फ़ाइल का URL' में स्क्रिप्ट का URL निर्दिष्ट करना होगा.
-
-          विस्तृत उदाहरणों के लिए, इस पर जाएं:
-          <ph name="PROXY_HELP_URL" />
-
-          यदि आप यह सेटिंग सक्षम करते हैं, तो <ph name="PRODUCT_NAME" /> और ARC-ऐप्लिकेशन आदेश पंक्ति द्वारा निर्दिष्ट किए गए प्रॉक्सी-संबंधित सभी विकल्पों पर ध्यान नहीं देते.
-
-          इस पॉलिसी को सेट नहीं करने पर, अपयोगकर्ताओं को स्वयं की प्रॉक्सी सेटिंग चुनने की अनुमति मिलेगी.</translation>
 <translation id="3153348162326497318">आपको यह निर्दिष्ट करने देती है कि उपयोगकर्ता कौन-से एक्‍सटेंशन इंस्‍टॉल नहीं कर सकते. प्रतिबंधित होने पर पहले से इंस्‍टॉल किए गए एक्‍सटेंशन निकाल दिए जाएंगे. '*' के प्रतिबंधित मान का अर्थ है कि सभी एक्‍सटेंशन प्रतिबंधित हैं, जब तक उन्‍हें स्‍पष्ट रूप से श्वेतसूची में सूचीबद्ध नहीं किया जाता. यदि इस नीति को सेट किए बिना छोड़ दिया जाता है, तो उपयोगकर्ता <ph name="PRODUCT_NAME" /> में कोई भी एक्‍सटेंशन इंस्‍टॉल कर सकता है.</translation>
 <translation id="316778957754360075">इस नीति को <ph name="PRODUCT_NAME" /> वर्शन 29 में समाप्त कर दिया गया है. संगठन द्वारा होस्ट किए जाने वाले एक्सटेंशन/ऐप्स  संकलनों को सेट किए जाने का सुझाए गए तरीका CRX पैकेज होस्ट करने वाली साइट को ExtensionInstallSources में शामिल करना तथा पैकेज के प्रत्यक्ष डाउनलोड लिंक को किसी वेब पृष्ठ पर रखना है. उस वेब पृष्ठ का एक लॉन्चर ExtensionInstallForcelist नीति का उपयोग करके बनाया जा सकता है.</translation>
 <translation id="3185009703220253572">वर्शन <ph name="SINCE_VERSION" /> से</translation>
@@ -722,6 +680,7 @@
       यदि यह सेटिंग सक्षम है या कॉन्‍फ़िगर नहीं है, तो उपयोगकर्ता अपने Google  खाते के साथ प्रमाणीकरण द्वारा मेघ मुद्रण प्रॉक्‍सी सक्षम कर सकते हैं.
 
       यदि यह सेटिंग अक्षम है, तो उपयोगकर्ता प्रॉक्‍सी को सक्षम नहीं कर सकते, और मशीन को <ph name="CLOUD_PRINT_NAME" /> के साथ प्रिंटर साझा करने की अनुमति नहीं दी जाएगी.</translation>
+<translation id="3297010562646015826">कार्य प्रबंधक में प्रक्रियाओं की समाप्ति को सक्षम करती है</translation>
 <translation id="3322771899429619102">आपको उन url पैटर्न की सूची सेट करने देती है जो ऐसी साइट निर्दिष्ट करते हैं जिन्हें कुंजी जेनरेशन का उपयोग करने की अनुमति है. यदि कोई url पैटर्न 'KeygenBlockedForUrls' में हो, तो वह इन अपवादों को ओवरराइड करता है.
 
           यदि यह पॉलिसी सेट किए बिना छोड़ दी जाती है तो सभी साइट के लिए डिफ़ॉल्ट मान का उपयोग या तो 'DefaultKeygenSetting' नीति के सेट होने पर उससे किया जाएगा, अन्यथा उपयोगकर्ता के व्यक्तिगत कॉन्फ़िगरेशन से किया जाएगा.</translation>
@@ -906,22 +865,6 @@
           यदि यह पॉलिसी 'सत्र की अवधि तक कुकी रखें' पर सेट होती है, तो सत्र के बंद होने पर कुकी साफ़ कर दी जाएंगी. ध्यान दें कि यदि <ph name="PRODUCT_NAME" /> 'पृष्ठभूमि मोड' में चल रहा हो, तो हो सकता है कि अंतिम विंडो बंद होने के बाद सत्र बंद ना हो. कृपया इस व्यवहार को कॉन्फ़िगर करने के बारे में अधिक जानकारी के लिए 'BackgroundModeEnabled' पॉलिसी देखें.
 
           यदि यह पॉलिसी सेट किए बिना छोड़ दी जाती है, तो 'AllowCookies' का उपयोग किया जाएगा और उपयोगकर्ता उसे बदल सकेगा.</translation>
-<translation id="4098957623809244159">यह पॉलिसी हटाई गई है, इसके बजाय ProxyMode का उपयोग करें.
-
-          <ph name="PRODUCT_NAME" /> और ARC-ऐप्लिकेशन द्वारा उपयोग किया गया प्रॉक्सी सर्वर निर्दिष्ट करने देती है और उपयोगकर्ताओं को प्रॉक्सी सेटिंग बदलने से रोकती है.
-
-          यदि आप किसी प्रॉक्सी सर्वर का कभी उपयोग नहीं करना और हमेशा सीधे कनेक्ट होना चुनते हैं, तो अन्य सभी विकल्पों पर ध्यान नहीं दिया जाएगा.
-
-          यदि आप सिस्टम प्रॉक्सी सेटिंग का उपयोग करना या प्रॉक्सी सर्वर का स्वतः पता लगाना चुनते हैं, तो अन्य सभी विकल्पों पर ध्यान नहीं दिया जाएगा.
-
-          यदि आप मैन्युअल प्रॉक्सी सेटिंग चुनते हैं, तो आप 'प्रॉक्सी सर्वर के पते या URL', 'किसी .pac फ़ाइल का URL' और 'प्रॉक्सी उपयोग न करने के नियमों की अल्पविराम द्वारा अलग की गई सूची' में आगे के विकल्प निर्दिष्ट कर सकते हैं.
-
-          विस्तृत उदाहरणों के लिए, इस पर जाएं:
-          <ph name="PROXY_HELP_URL" />
-
-         यदि आप यह सेटिंग सक्षम करते हैं, तो <ph name="PRODUCT_NAME" /> आदेश पंक्ति से निर्दिष्ट सभी प्रॉक्सी संबंधित विकल्पों पर ध्यान नहीं देगा.
-
-          इस पॉलिसी को सेट किए बिना छोड़ने से उपयोगकर्ता स्वयं ही प्रॉक्सी सेटिंग चुन सकेगा.</translation>
 <translation id="4103289232974211388">उपयोगकर्ता पुष्टिकरण के बाद SAML IdP पर रीडायरेक्ट करें</translation>
 <translation id="410478022164847452">AC पावर पर चलते समय, उस समयावधि को निर्दिष्ट करती है जितनी देर तक उपयोगकर्ता कोई भी इनपुट न दे, उसके बाद प्रयोग में नहीं कार्यवाही की जाती है.
 
@@ -1381,14 +1324,6 @@
 <translation id="5893553533827140852">यदि यह सेटिंग सक्षम है, तब gnubby प्रमाणन अनुरोध पूरे दूरस्थ होस्ट कनेक्शन पर प्रॉक्सी किया जाएगा.
 
           यदि यह सेटिंग अक्षम है या कॉन्फ़िगर नहीं है, तो gnubby प्रमाणन अनुरोध प्रॉक्सी नहीं किए जाएंगे.</translation>
-<translation id="5900959132054596599">यहां दिए गए होस्ट की सूची के लिए <ph name="PRODUCT_NAME" /> और ARC-ऐप्लिकेशन किसी भी प्रॉक्सी का उपयोग नहीं करेंगे.
-
-          यह पॉलिसी केवल तब प्रभावी होगी यदि आपने 'यह चुनें कि प्रॉक्सी सर्वर सेटिंग कैसे निर्दिष्ट करें' पर मैन्युअल प्रॉक्सी सेटिंग को चुना है.
-
-          यदि आपने प्रॉक्सी पॉलिसी सेट करने के लिए किसी अन्य मोड का चयन किया है, तो आपको इस पॉलिसी को सेट किए बिना छोड़ देना चाहिए.
-
-          विस्तृत उदाहरणों के लिए, इस पर जाएं:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">HTTP के द्वारा स्वतः अपडेट डाउनलोड की अनुमति दें</translation>
 <translation id="5921888683953999946">प्रवेश स्क्रीन पर बड़े कर्सर की पहुंच-योग्यता सुविधा की डिफ़ॉल्ट स्थिति सेट करें.
 
@@ -1896,9 +1831,6 @@
 <translation id="7632724434767231364">GSSAPI लाइब्रेरी नाम</translation>
 <translation id="7635471475589566552"><ph name="PRODUCT_NAME" /> में ऐप्‍लिकेशन का स्‍थान कॉन्‍फ़िगर करता है और उपयोगकर्ताओं को स्‍थान बदलने से रोकता है. यदि आप यह सेटिंग सक्षम करते हैं, तो <ph name="PRODUCT_NAME" /> निर्दिष्ट स्‍थान का उपयोग करता है. यदि कॉन्‍फ़िगर किया गया स्‍थान समर्थित नहीं है, तो इसके बजाय 'en-US' का उपयोग किया जाता है. यदि यह सेटिंग अक्षम है या कॉन्‍फ़िगर नहीं है, तो <ph name="PRODUCT_NAME" /> उपयोगकर्ता द्वारा निर्दिष्ट पसंदीदा स्‍थान (यदि कॉन्‍फ़िगर है), सिस्‍टम स्‍थान या फ़ॉलबैक स्‍थान 'en-US' का उपयोग करता है.</translation>
 <translation id="7651739109954974365">निर्धारित करता है कि क्या डिवाइस के लिए डेटा रोमिंग सक्षम किया जाना चाहिए. अगर सही पर सेट हो, तो डेटा रोमिंग की अनुमति है. बिना कॉन्‍फ़गर किए या गलत पर सेट हो तो, डेटा रोमिंग उपलब्ध नहीं होगी.</translation>
-<translation id="7667184304362487902"><ph name="PRODUCT_NAME" /> और ARC-ऐप्लिकेशन के लिए प्रॉक्सी सेटिंग कॉन्फ़िगर करती है.
-
-      यह पॉलिसी अभी तक उपयोग के लिए तैयार नहीं है, कृपया इसका उपयोग ना करें.</translation>
 <translation id="76810863974142048">वह URL जहां दूरस्‍थ ऐक्‍सेस क्‍लाइंट को अपना प्रमाणीकरण टोकन प्राप्‍त करना चाहिए.
 
           यदि यह पॉलिसी सेट की जाती है, तो दूरस्‍थ ऐक्‍सेस होस्‍ट को कनेक्‍ट करने हेतु इस URL से प्रमाणीकरण टोकन प्राप्‍त करने के लिए प्रमाणीकरण क्‍लाइंट की आवश्‍यकता होगी. इसका उपयोग RemoteAccessHostTokenValidationUrl के संयोजन में किया जाना चाहिए.
@@ -2121,6 +2053,7 @@
 
       नीति मान मिलीसेकंड में निर्दिष्ट होना चाहिए.</translation>
 <translation id="8344454543174932833">पहली बार चलाने पर सामान्य ब्राउज़र से बुकमार्क आयात करें</translation>
+<translation id="8359734107661430198">02/09/2008 से ExampleDeprecatedFeature API सक्षम है</translation>
 <translation id="8360452361555133173">OS अपग्रेड होने के बाद पहले ब्राउज़र लॉन्‍च पर स्‍वागत पृष्‍ठ दिखाना सक्षम करें.
 
       यदि यह नीति सत्य पर सेट की जाती है या कॉन्‍फ़िगर नहीं की जाती है, तो ब्राउज़र किसी OS अपग्रेड होने के बाद पहले लॉन्‍च पर स्‍वागत पृष्‍ठ को फिर से दिखाएगा.
diff --git a/components/policy/resources/policy_templates_hr.xtb b/components/policy/resources/policy_templates_hr.xtb
index 4f04e4c..59fd4f32 100644
--- a/components/policy/resources/policy_templates_hr.xtb
+++ b/components/policy/resources/policy_templates_hr.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="hr">
 <translation id="101438888985615157">Zakreni zaslon 180 stupnjeva</translation>
-<translation id="1015272884520659144">Definira popis USB uređaja za koje je dopušteno odvajanje od upravljačkog programa jezgre radi upotrebe putem API-ja chrome.usb izravno unutar web-aplikacije. Unosi su parovi identifikatora dobavljača i identifikatora proizvoda USB uređaja, a služe za prepoznavanje određenog hardvera.
-
-      Ako se pravilo ne konfigurira, popis uklonjivih USB uređaja smatra se praznim.</translation>
 <translation id="1017967144265860778">Upravljanje napajanjem na zaslonu za prijavu</translation>
 <translation id="1019101089073227242">Postavi imenik korisničkih podataka</translation>
 <translation id="1022361784792428773">ID-jevi proširenja u čijem bi instaliranju korisnik trebao biti spriječen (ili * za sve)</translation>
@@ -65,7 +62,6 @@
       Ako se to pravilo ne postavi ili se postavi na "False", RC4 paketi šifri u TLS-u neće biti omogućeni. U protivnom se može postaviti na "True" radi održanja kompatibilnosti sa zastarjelim poslužiteljem. To je privremena mjera i poslužitelj se treba ponovo konfigurirati.</translation>
 <translation id="1297182715641689552">Upotrijebi .pac proxy skriptu</translation>
 <translation id="1304973015437969093">ID-jevi proširenja/aplikacija i URL-ovi ažuriranja koja će se instalirati u pozadini</translation>
-<translation id="1310699457130669094">Ovdje možete odrediti URL za .pac datoteku proxy poslužitelja. Ovo pravilo vrijedi samo ako ste odabrali ručne postavke proxy poslužitelja u stavci "Odabir načina određivanja postavki proxy poslužitelja". Ne postavljajte ovo pravilo ako ste odabrali bilo koji drugi način postavljanja pravila za proxy poslužitelje. Za podrobne primjere posjetite: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Određuje postotak odgode skaliranja zatamnjivanja zaslona kada se uoči aktivnosti korisnika dok se zaslon zatamnjuje ili ubrzo nakon što se zaslon isključi.
 
           Ako se to pravilo postavi, ono određuje postotak odgode skaliranja zatamnjivanja zaslona kada se uoči aktivnosti korisnika dok se zaslon zatamnjuje ili ubrzo nakon što se zaslon isključi. Kada se odgoda zatamnjivanja skalira, odgode isključivanja zaslona, zaključavanja zaslona i mirovanja podešavaju se kako bi se zadržali isti vremenski odmaci za odgodu zatamnjivanja zaslona koji su izvorno konfigurirani.
@@ -146,18 +142,6 @@
 <translation id="1561424797596341174">Nadjačavanja pravila za međuverzije za otklanjanje pogrešaka hosta daljinskog pristupa</translation>
 <translation id="1583248206450240930">Upotrijebi <ph name="PRODUCT_FRAME_NAME" /> kao zadano</translation>
 <translation id="1608755754295374538">URL-ovi koji će dobiti pristup uređajima za snimanje zvuka bez postavljanja upita</translation>
-<translation id="1613574633990410986">Omogućuje vam da odredite proxy poslužitelj kojim se koriste <ph name="PRODUCT_NAME" /> i ARC aplikacije, a korisnicima onemogućuje promjenu postavki proxyja.
-
-      Ako odaberete da se proxy poslužitelj nikad ne upotrebljava i da se veza uvijek uspostavlja izravno, sve se ostale opcije zanemaruju.
-
-      Ako odaberete automatsko otkrivanje proxy poslužitelja, sve se ostale opcije zanemaruju.
-
-      Detaljne primjere možete pronaći ovdje:
-      <ph name="PROXY_HELP_URL" />
-
-      Ako omogućite tu postavku, <ph name="PRODUCT_NAME" /> i ARC aplikacije zanemarivat će sve opcije u vezi s proxy poslužiteljem određene naredbenim retkom.
-
-      Ako se ta pravila ne postave, korisnici će moći sami odabrati postavke proxyja.</translation>
 <translation id="1617235075406854669">Omogući brisanje povijesti preglednika i preuzimanja</translation>
 <translation id="1617384279878333801">Omogućivanje dodavanja osobe u upravitelju profila</translation>
 <translation id="1655229863189977773">Postavite veličinu predmemorije diska u bajtovima</translation>
@@ -242,7 +226,6 @@
       Ako je omogućeno, na programskoj traci prikazuje se veliki, crveni gumb za odjavu dok je sesija aktivna, a zaslon nije zaključan.
 
       Ako je onemogućeno ili nije navedeno, na programskoj traci ne prikazuje se veliki crveni gumb za odjavu.</translation>
-<translation id="1942957375738056236">Ovdje možete odrediti URL proxy poslužitelja. Ovo se pravilo primjenjuje samo ako ste odabrali ručno postavljanje proxy poslužitelja u stavci "Odabir načina određivanja postavki proxy poslužitelja". Ne postavljajte ovo pravilo ako ste odabrali neki drugi način za postavljanje pravila proxy poslužitelja. Za više mogućnosti i podrobne primjere posjetite: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Konfigurira upravljanje potrošnjom energije na zaslonu za prijavu u proizvodu <ph name="PRODUCT_OS_NAME" />.
 
       Tim pravilom možete konfigurirati kako se <ph name="PRODUCT_OS_NAME" /> ponaša kada neko vrijeme nema korisničke aktivnosti dok se prikazuje zaslon za prijavu. Pravilo upravlja većim brojem postavki. Semantika i rasponi vrijednosti pojedinačnih postavki mogu se pronaći u odgovarajućim pravilima koja upravljaju potrošnjom energije u okviru sesije. Jedina su odstupanja od tih pravila sljedeća:
@@ -605,24 +588,6 @@
 <translation id="3072847235228302527">Postavi Uvjete pružanja usluge za lokalni račun na uređaju</translation>
 <translation id="3096595567015595053">Popis omogućenih dodataka</translation>
 <translation id="3101501961102569744">Odaberi način određivanja postavki proxy poslužitelja</translation>
-<translation id="3125884964575432854">Omogućuje vam da odredite proxy poslužitelj kojim se koriste <ph name="PRODUCT_NAME" /> i ARC aplikacije, a korisnicima onemogućuje promjenu postavki proxyja.
-
-          Ako odaberete da se proxy poslužitelj nikada ne upotrebljava i da se veza uvijek uspostavlja izravno, sve se ostale opcije zanemaruju.
-
-          Ako odaberete upotrebu sistemskih postavki proxyja, sve se ostale opcije zanemaruju.
-
-          Ako odaberete automatsko otkrivanje proxy poslužitelja, sve se ostale opcije zanemaruju.
-
-          Ako odaberete način fiksnog proxy poslužitelja, možete odrediti dodatne opcije pod stavkama "Adresa ili URL proxy poslužitelja" i "Popis pravila proxy zaobilaženja odvojenih zarezima". ARC aplikacije upotrebljavat će samo HTTP proxy poslužitelj najvišeg prioriteta.
-
-          Ako odaberete upotrebu .pac skripte proxy poslužitelja, morate navesti URL prema skripti u odjeljku "URL prema .pac datoteci proxy poslužitelja".
-
-          Detaljne primjere možete pronaći ovdje:
-          <ph name="PROXY_HELP_URL" />
-
-          Ako omogućite tu postavku, <ph name="PRODUCT_NAME" /> i ARC aplikacije zanemarivat će sve opcije u vezi s proxy poslužiteljem određene naredbenim retkom.
-
-          Ako se to pravilo ne postavi, korisnici će moći sami odabrati postavke proxyja.</translation>
 <translation id="3153348162326497318">Omogućuje da odredite koja proširenja korisnici NE mogu instalirati. Proširenja koja su već instalirana bit će uklonjena ako se nalaze na popisu zabranjenih proširenja. Vrijednost popisa zabranjenih proširenja "*" znači da nije dopušteno nijedno proširenje, osim ako nisu izričito navedena na popisu dopuštenih. Ako pravilo nije postavljeno, korisnik može instalirati bilo koje proširenje u <ph name="PRODUCT_NAME" />.</translation>
 <translation id="316778957754360075">To se pravilo ne upotrebljava od verzije 29 sustava <ph name="PRODUCT_NAME" />. Preporučuje se da se pri postavljanju zbirki proširenja ili aplikacija koje hostira određena organizacija web-lokacija koja hostira CRX pakete uključi u pravilo ExtensionInstallSources te da se u pakete na web-stanici postave izravne veze za preuzimanje. Pokretač za tu web-stranicu može se izraditi pomoću pravila ExtensionInstallForcelist.</translation>
 <translation id="3185009703220253572">od verzije <ph name="SINCE_VERSION" /></translation>
@@ -683,6 +648,7 @@
 <translation id="3273221114520206906">Zadana postavka JavaScripta</translation>
 <translation id="3288595667065905535">Kanal izdanja</translation>
 <translation id="3292147213643666827">Omogućuje da se proizvod <ph name="PRODUCT_NAME" /> ponaša kao proxy između pisača iz oblaka <ph name="CLOUD_PRINT_NAME" /> i pisača iz starog sustava povezanih s računalom. Ako je ova postavka onemogućena ili nije konfigurirana, korisnici mogu omogućiti proxy ispisivanja na oblaku autentifikacijom putem svojih Google računa. Ako je ova postavka onemogućena, korisnici ne mogu omogućiti proxy, a računalu neće biti dopušteno dijeljenje pisača s oblakom <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Omogućuje završavanje postupaka u Upravitelju zadataka</translation>
 <translation id="3322771899429619102">Omogućuje postavljanje popisa uzoraka URL-ova koji određuju web-lokacije koje smiju upotrebljavati generiranje ključeva. Ako je uzorak URL-ova u pravilu "KeygenBlockedForUrls", to nadjačava ove iznimke.
 
           Ako se to pravilo ne postavi, globalna zadana vrijednost upotrebljavat će se za sve web-lokacije iz pravila "DefaultKeygenSetting" ako je postavljeno, a u suprotnom iz korisnikove osobne konfiguracije.</translation>
@@ -852,22 +818,6 @@
          Ako se pravilo postavi na "Zadrži kolačiće za vrijeme trajanja sesije", kolačići će se izbrisati po završetku sesije. Ako se <ph name="PRODUCT_NAME" /> izvodi u pozadini, sesija se možda neće završiti dok se ne zatvori posljednji prozor. Više informacija o konfiguriranju tog ponašanja potražite u pravilu "BackgroundModeEnabled".
 
           Ako se to pravilo ne postavi, koristit će se pravilo "AllowCookies" i korisnik će ga moći promijeniti.</translation>
-<translation id="4098957623809244159">To je pravilo zastarjelo, a umjesto njega upotrijebite ProxyMode.
-
-          Omogućuje vam da odredite proxy poslužitelj kojim se koriste <ph name="PRODUCT_NAME" /> i ARC aplikacije, a korisnicima onemogućuje promjenu postavki proxyja.
-
-          Ako odaberete da se proxy poslužitelj nikad ne upotrebljava i da se veza uvijek uspostavlja izravno, sve se ostale opcije zanemaruju.
-
-          Ako odaberete upotrebu sistemskih postavki proxyja ili automatsko otkrivanje proxy poslužitelja, sve se ostale opcije zanemaruju.
-
-          Ako odaberete ručne postavke proxy poslužitelja, dodatne opcije možete navesti pod stavkama "Adresa ili URL proxy poslužitelja, "URL prema .pac datoteci proxy poslužitelja" i "Popis pravila proxy zaobilaženja odvojenih zarezima".
-
-          Detaljne primjere možete pronaći ovdje:
-          <ph name="PROXY_HELP_URL" />
-
-          Ako omogućite tu postavku, <ph name="PRODUCT_NAME" /> zanemarivat će sve opcije u vezi s proxy poslužiteljem određene naredbenim retkom.
-
-          Ako se to pravilo ne postavi, korisnici će moći sami odabrati postavke proxy poslužitelja.</translation>
 <translation id="4103289232974211388">Preusmjeri na SAML IdP nakon korisnikove potvrde</translation>
 <translation id="410478022164847452">Određuje koliko vremena treba proteći bez aktivnosti korisnika da bi se izvršila radnja neaktivnosti tijekom napajanja izmjeničnom strujom.
 
@@ -1298,14 +1248,6 @@
 <translation id="5893553533827140852">Ako je ta postavka omogućena, zahtjevi autentifikacije "gnubby" proslijedit će se putem proxyja vezom udaljenog hosta.
 
           Ako je ta postavka onemogućena ili nije konfigurirana, zahtjevi autentifikacije "gnubby" neće se prosljeđivati putem proxyja.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> i ARC aplikacije zaobilazit će sve proxy poslužitelje na ovdje navedenom popisu hostova.
-
-          To će pravilo vrijediti samo ako odaberete ručne postavke proxyja pod stavkom "Odaberi način određivanja postavki proxy poslužitelja".
-
-          Ne postavljajte to pravilo ako ste odabrali bilo koji drugi način postavljanja pravila za proxy poslužitelje.
-
-          Detaljne primjere možete pronaći ovdje:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Dopusti preuzimanja automatskog ažuriranja putem HTTP-a</translation>
 <translation id="5921888683953999946">Postavi zadano stanje značajke pristupačnosti velikog pokazivača na zaslonu za prijavu.
 
@@ -1785,9 +1727,6 @@
 <translation id="7632724434767231364">Naziv GSSAPI biblioteke</translation>
 <translation id="7635471475589566552">Konfigurira oznaku zemlje/jezika aplikacije u proizvodu <ph name="PRODUCT_NAME" /> i sprječava korisnike da promijene oznaku zemlje/jezika. Ako omogućite ovu postavku, <ph name="PRODUCT_NAME" /> upotrebljavat će navedenu oznaku zemlje/jezika. Ako konfigurirana oznaka zemlje/jezika nije podržana, upotrebljavat će se "en-US". Ako je ova postavka onemogućena ili nije postavljena, <ph name="PRODUCT_NAME" /> upotrebljavat će oznaku zemlje/jezika koju odredi korisnik (ako je konfigurirana), oznaku zemlje/jezika sustava ili standardnu oznaku zemlje/jezika "en-US".</translation>
 <translation id="7651739109954974365">Utvrđuje treba li roaming podataka biti omogućen za uređaj. Ako je to pravilo postavljeno na "istinito", roaming podataka bit će dopušten. Ako to pravilo nije konfigurirano ili je postavljeno na "lažno", roaming podataka neće biti dostupan.</translation>
-<translation id="7667184304362487902">Konfigurira postavke proxyja za <ph name="PRODUCT_NAME" /> i ARC aplikacije.
-
-      To pravilo još nije spremno za upotrebu, tako da ga nemojte upotrebljavati.</translation>
 <translation id="76810863974142048">URL na kojem klijenti daljinskog pristupa trebaju dobiti autentifikacijsku oznaku.
 
           Ako se to pravilo postavi, host daljinskog pristupa zahtijevat će od klijenata koji se autentificiraju pribavljanje autentifikacijske oznake s tog URL-a da bi se povezali. Pravilo se mora upotrebljavati zajedno s pravilom RemoteAccessHostTokenValidationUrl.
@@ -2000,6 +1939,7 @@
 
       Vrijednost pravila trebala bi biti navedena u milisekundama.</translation>
 <translation id="8344454543174932833">Uvoz oznaka iz zadanog preglednika pri prvom pokretanju</translation>
+<translation id="8359734107661430198">Omogući ExampleDeprecatedFeature API do 2008/09/02</translation>
 <translation id="8360452361555133173">Omogućuje prikazivanje stranice dobrodošlice prilikom prvog pokretanja preglednika nakon nadogradnje OS-a.
 
       Ako se to pravilo postavi na "istinito" ili se ne konfigurira, preglednik će ponovo prikazati stranicu dobrodošlice prilikom prvog pokretanja nakon nadogradnje OS-a.
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb
index d98ea8e8..327c2b15 100644
--- a/components/policy/resources/policy_templates_hu.xtb
+++ b/components/policy/resources/policy_templates_hu.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="hu">
 <translation id="101438888985615157">Képernyő elforgatása 180 fokkal</translation>
-<translation id="1015272884520659144">Azoknak az USB-eszközöknek a listáját határozza meg, amelyeknek megengedett a kernelmódú illesztőprogramjukról való leválasztása annak érdekében, hogy a chrome.usb API-n keresztül, közvetlenül valamilyen internetes alkalmazásban lehessen használni őket. A bejegyzéseket az adott hardver azonosítására szolgáló, az USB-gyártóazonosítóból és az USB-termékazonosítóból álló párok alkotják.
-
-      Ha a házirend nincs beállítva, akkor a rendszer üresnek tekinti a leválasztható USB-eszközök listáját.</translation>
 <translation id="1017967144265860778">Energiagazdálkodás a bejelentkezési képernyőn</translation>
 <translation id="1019101089073227242">Felhasználói adatok könyvtárának beállítása</translation>
 <translation id="1022361784792428773">Bővítményazonosítók, amelyek felhasználói telepítését meg kell akadályozni (vagy * az összes esetén)</translation>
@@ -64,7 +61,6 @@
       Ha a házirend nincs beállítva, illetve értéke hamis, akkor a TLS protokoll RC4 rejtjelezési csomagjai nem lesznek engedélyezve. Igaz értékre állítva megmarad a kompatibilitás az elavult szerverekkel. Ez átmeneti intézkedés, a szervert újra kell konfigurálni.</translation>
 <translation id="1297182715641689552">Használjon .pac proxyszkriptet</translation>
 <translation id="1304973015437969093">Bővítmény- és alkalmazásazonosítók és frissítési URL-ek csendes telepítése</translation>
-<translation id="1310699457130669094">Itt megadhatja egy proxy .pac fájl URL-jét. Ez a házirend csak akkor lép érvénybe, ha a manuális proxybeállításokat választotta a "Válassza ki, hogyan adja meg a proxyszerver beállításait" résznél. Ha valamilyen más módját választotta a proxyházirendek beállításának, akkor hagyja ezt a házirendet konfigurálatlanul. További részletes példákért látogassa meg a következő oldalt: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Azt a százalékot adja meg, amelynek alapján a képernyő-elsötétítési késleltetés skálázódik, ha az elsötétedés során, vagy röviddel a képernyő kikapcsolódása után felhasználói tevékenység történik.
 
           Ha a házirend be van állítva, megadja azt a százalékos értéket, amelynek alapján a képernyő-elsötétítési késleltetés skálázódik, ha az elsötétedés során, vagy röviddel a képernyő kikapcsolódása után felhasználói tevékenység történik. Az elsötétedési késleltetés skálázása esetén a képernyő-kikapcsolási, képernyő-zárolási és tétlenségi késleltetések is módosulnak, hogy ugyanannyi idő teljen el köztük a képernyő-elsötétítési késleltetéstől számítva, mint ami eredetileg be lett állítva.
@@ -145,18 +141,6 @@
 <translation id="1561424797596341174">A házirend felülírja a távoli elérésű gazdagép hibakeresés végzésére szolgáló buildjeit</translation>
 <translation id="1583248206450240930">A <ph name="PRODUCT_FRAME_NAME" /> használata alapértelmezés szerint</translation>
 <translation id="1608755754295374538">Azon URL-ek, amelyek rákérdezés nélkül hozzáférést kapnak a hangrögzítő eszközökhöz</translation>
-<translation id="1613574633990410986">Lehetővé teszi a <ph name="PRODUCT_NAME" /> és az ARC-alkalmazások által használt proxyszerver meghatározását, és megakadályozza, hogy a felhasználók megváltoztassák a proxybeállításokat.
-
-      Ha úgy dönt, hogy soha nem használ proxyszervert, és mindig közvetlenül kapcsolódik, az összes többi lehetőség figyelmen kívül marad.
-
-      Ha a proxyszerver automatikus észlelése mellett dönt, az összes többi lehetőség figyelmen kívül marad.
-
-      Részletes példákért látogasson el a következő címre:
-      <ph name="PROXY_HELP_URL" />
-
-      Ha engedélyezi ezt a házirendet, a <ph name="PRODUCT_NAME" /> és az ARC-alkalmazások figyelmen kívül hagynak a proxyval kapcsolatban a parancssorból megadott minden beállítást.
-
-      Ha beállítatlanul hagyja ezeket a házirendeket, akkor a felhasználók maguk választhatják ki proxybeállításaikat.</translation>
 <translation id="1617235075406854669">Böngészési és letöltési előzmények törlésének engedélyezése</translation>
 <translation id="1617384279878333801">Engedélyezi a személyek hozzáadását a profilkezelőben</translation>
 <translation id="1655229863189977773">Lemezgyorsítótár méretének beállítása bájtban</translation>
@@ -242,7 +226,6 @@
       Ha engedélyezett, akkor egy nagy vörös kijelentkezés gomb látható a tálcán, amíg a munkamenet aktív, és a képernyő nincs zárolva.
 
       Ha tiltott vagy nincs megadva, akkor nem jelenik meg a nagy vörös gomb a tálcán.</translation>
-<translation id="1942957375738056236">Itt határozhatja meg a proxyszerver URL-jét. Ez a házirend csak akkor lép érvénybe, ha a manuális proxybeállításokat választotta a "Válassza ki, hogyan adja meg a proxyszerver beállításait" résznél. Ha valamilyen más módját választotta a proxyházirendek beállításának, akkor hagyja ezt a házirendet konfigurálatlanul. További beállításokért és részletes példákért látogassa meg a következő oldalt: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Energiagazdálkodás konfigurálása a bejelentkezési képernyőn a(z) <ph name="PRODUCT_OS_NAME" /> rendszerben.
 
       A házirend segítségével beállíthatja, hogy a(z) <ph name="PRODUCT_OS_NAME" /> hogyan viselkedjen, ha egy ideig nem történik felhasználói tevékenység a bejelentkezési képernyő megjelenítése során. A házirend több beállítást irányít. Az egyes beállítások egyedi szemantikáját és értéktartományait azokban a megfelelő házirendekben tekintheti meg, amelyek egy munkamenet során irányítják az energiagazdálkodást. A házirendektől való eltérések csak a következők lehetnek:
@@ -603,24 +586,6 @@
 <translation id="3072847235228302527">Általános Szerződési Feltételek beállítása egy eszközszinten helyi fiók számára</translation>
 <translation id="3096595567015595053">Engedélyezett bővítmények listája</translation>
 <translation id="3101501961102569744">Válassza ki, hogyan adja meg a proxyszerver beállításait</translation>
-<translation id="3125884964575432854">Lehetővé teszi, hogy Ön adja meg a <ph name="PRODUCT_NAME" /> és az ARC-alkalmazások által használt proxyszervert, és megakadályozza, hogy a felhasználók megváltoztassák a proxybeállításokat.
-
-          Ha úgy dönt, hogy soha nem használ proxyszervert, és mindig közvetlenül kapcsolódik, az összes többi beállítás figyelmen kívül marad.
-
-          Ha úgy dönt, hogy a rendszer proxybeállításait használja, az összes többi beállítás figyelmen kívül marad.
-
-          Ha a proxyszerver automatikus észlelése mellett dönt, az összes többi beállítás figyelmen kívül marad.
-
-          Ha a fix proxyszerver módot választja, további beállításokat adhat meg "A proxyszerver címe vagy URL-je" és a "Proxykihagyási szabályok vesszővel elválasztott listája" lehetőségeknél. Az ARC-alkalmazások csak a legmagasabb prioritású HTTP-proxyszervert használják.
-
-          Ha .pac proxy szkriptet használ, meg kell adnia a szkript URL-jét "A proxy .pac fájl URL-je" lehetőségnél.
-
-          Részletes példákért látogassa meg a következő címet:
-          <ph name="PROXY_HELP_URL" />
-
-          Ha engedélyezi ezt a házirendet, a <ph name="PRODUCT_NAME" /> és az ARC-alkalmazások figyelmen kívül hagynak a proxyval kapcsolatban a parancssorból megadott minden beállítást.
-
-          Ha beállítatlanul hagyja ezt a házirendet, akkor a felhasználók saját maguk választhatják ki a proxybeállításaikat.</translation>
 <translation id="3153348162326497318">Lehetővé teszi annak meghatározását, hogy melyek azok a bővítmények, amelyeket NEM telepíthetnek a felhasználók. A már telepített, de a tiltólistán szereplő bővítményeket a rendszer eltávolítja. A tiltólista "*" értéke azt jelenti, hogy az összes bővítmény tiltólistás, kivéve, ha az adott bővítményt az engedélyezőlista tartalmazza. Ha ez a házirend beállítatlanul marad, a felhasználó bármilyen bővítményt telepíthet a(z) <ph name="PRODUCT_NAME" /> alkalmazásban.</translation>
 <translation id="316778957754360075">Ez a házirend többé nincs jelen a <ph name="PRODUCT_NAME" /> 29-es verziójától kezdve. A szervezet által tárolt bővítmény- és alkalmazásgyűjtemények beállításához azt javasoljuk, hogy a CRX-csomagokat tartalmazó webhelyet vegye fel az ExtensionInstallSources házirendbe, és helyezzen el a csomagokra mutató közvetlen letöltési linkeket egy weboldalon. A weboldalhoz az ExtensionInstallForcelist házirend használatával lehet indítót létrehozni.</translation>
 <translation id="3185009703220253572">a(z) <ph name="SINCE_VERSION" /> verzió óta</translation>
@@ -685,6 +650,7 @@
       Ha ez a beállítás be van kapcsolva vagy nincs megadva, a felhasználók Google Fiókjuk érvényesítésével bekapcsolhatják a cloud print proxyt.
 
       Ha a beállítás ki van kapcsolva, a felhasználók nem kapcsolhatják be a proxyt, és a számítógép számára nem lesz engedélyezett a nyomtatók megosztása a(z) <ph name="CLOUD_PRINT_NAME" /> szolgáltatással.</translation>
+<translation id="3297010562646015826">Lehetővé teszi a folyamatok befejezését a Feladatkezelőben</translation>
 <translation id="3322771899429619102">Lehetővé teszi, hogy létrehozza az olyan webhelyeket megadó URL-minták egy listáját, ahol engedélyezett a kulcslétrehozás. Ha valamelyik URL-minta a „KeygenBlockedForUrls” házirendben található, akkor az felülírja ezen kivételeket.
 
           Ha a házirend konfigurálatlanul marad, akkor a rendszer a globális alapértelmezett értéket használja a „DefaultKeygenSetting” házirendből (ha az be van állítva), egyéb esetben pedig a felhasználó saját személyes beállításából.</translation>
@@ -855,22 +821,6 @@
           A „Cookie-k megtartása a munkamenet idejére” beállítás esetében a munkamenet befejezése után a cookie-k törlődnek. Felhívjuk figyelmét, hogy ha a <ph name="PRODUCT_NAME" /> „háttérmódban” fut, akkor előfordulhat, hogy a munkamenet nem fejeződik be az utolsó ablak bezárásakor. E viselkedés konfigurálásáról a „BackgroundModeEnabled” házirendnél talál további tájékoztatást.
 
           Ha nem állítja be ezt a házirendet, akkor a böngésző az „AllowCookies” beállítást fogja használni, amelyet a felhasználó módosíthat.</translation>
-<translation id="4098957623809244159">Ez a házirend már megszűnt – használja helyette a ProxyMode házirendet.
-
-          Lehetővé teszi a <ph name="PRODUCT_NAME" /> és az ARC-alkalmazások által használt proxyszerver meghatározását, és megakadályozza, hogy a felhasználók megváltoztassák a proxybeállításokat.
-
-          Ha úgy dönt, hogy soha nem használ proxyszervert, és mindig közvetlenül kapcsolódik, az összes többi beállítás figyelmen kívül marad.
-
-          Ha úgy dönt, hogy a rendszer proxybeállításait használja, vagy automatikusan észleli a proxyszervert, az összes többi beállítás figyelmen kívül marad.
-
-          Ha a proxybeállítások manuális megadását választja, további beállításokat adhat meg a „Proxyszerver címe vagy URL-je” és „A proxykihagyási szabályok vesszővel elválasztott listája” lehetőségeknél.
-
-          Részletes példákért látogassa meg a következő címet:
-          <ph name="PROXY_HELP_URL" />
-
-          Ha engedélyezi ezt a beállítást, a <ph name="PRODUCT_NAME" /> figyelmen kívül hagyja a  proxyval kapcsolatban a parancssorból megadott összes beállítást.
-
-          Ha beállítatlanul hagyja ezt a házirendet, akkor a felhasználók saját maguk választhatják ki a proxybeállításaikat.</translation>
 <translation id="4103289232974211388">A felhasználó megerősítését követően átirányítás a SAML IdP-hez</translation>
 <translation id="410478022164847452">Meghatározza azt a felhasználói bevitel nélkül eltelt időtartamot, amely után a rendszer tétlen állapotba kerül, ha hálózati áramról működik.
 
@@ -1297,14 +1247,6 @@
 <translation id="5893553533827140852">Ha ez a beállítás engedélyezett, akkor a gnubby hitelesítési kéréseket a rendszer távoli szerverkapcsolaton keresztül proxyzza.
 
           Ha a beállítás tiltva van, vagy nincs konfigurálva, akkor a rendszer nem proxyzza a gnubby hitelesítési kéréseket.</translation>
-<translation id="5900959132054596599">A <ph name="PRODUCT_NAME" /> és az ARC-alkalmazások figyelmen kívül hagynak bármilyen proxyt a listán megadott gazdagépek esetében.
-
-          Ez a házirend csak akkor lép érvénybe, ha a manuális proxybeállításokat választotta a "Válassza ki, hogyan adja meg a proxyszerver beállításait" résznél.
-
-          Ha valamilyen más módját választotta a proxyházirendek beállításának, akkor hagyja ezt a házirendet konfigurálatlanul.
-
-          További részletes példákért látogassa meg a következő oldalt:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Automatikus frissítési letöltések engedélyezése HTTP-n keresztül</translation>
 <translation id="5921888683953999946">A nagy egérmutató kisegítő lehetőség alapértelmezett állapotának megadása a bejelentkezési képernyőn.
 
@@ -1788,9 +1730,6 @@
 <translation id="7632724434767231364">GSSAPI könyvtár neve</translation>
 <translation id="7635471475589566552">Beállítja az alkalmazás nyelv- és országkódját a következőben: <ph name="PRODUCT_NAME" />, és megakadályozza, hogy a felhasználók megváltoztassák a kódot. Ha engedélyezi ezt a beállítást, a(z) <ph name="PRODUCT_NAME" /> a megadott nyelv- és országkódot fogja használni. Ha a megadott nyelv- és országkód nem támogatott, az "en-US" lehetőséget használja helyette. Ha ez a beállítás ki van kapcsolva, vagy nincs beállítva, a(z) <ph name="PRODUCT_NAME" /> vagy a felhasználó által meghatározott nyelv- és országkódot használja (ha konfigurálva van), vagy a tartalék "en-US" lehetőséget.</translation>
 <translation id="7651739109954974365">Meghatározza, hogy engedélyezett legyen-e az adatbarangolás az eszköz esetében. Ha a beállítás igaz, akkor az adatbarangolás engedélyezett. Ha nincs beállítva, vagy a beállítás hamis, akkor az adatbarangolás nem érhető el.</translation>
-<translation id="7667184304362487902">Konfigurálja a <ph name="PRODUCT_NAME" /> és az ARC-alkalmazások proxybeállításait.
-
-      Ez a házirend még nem áll készen a használatra, úgyhogy kérjük, ne használja.</translation>
 <translation id="76810863974142048">Az az URL, ahonnan a távoli elérésű ügyfelek beszerezhetik a hitelesítőtokent.
 
           Ha be van állítva ez a házirend, a távoli elérésű gazdagép a csatlakozáshoz megköveteli a hitelesítő-ügyfelektől a hitelesítőtoken lehívását erről az URL-ről. A RemoteAccessHostTokenValidationUrl szabállyal együtt kell használni.
@@ -2004,6 +1943,7 @@
 
       A házirend értékét ezredmásodpercben kell megadni.</translation>
 <translation id="8344454543174932833">Könyvjelzők importálása az alapértelmezett böngészőből az első indításkor</translation>
+<translation id="8359734107661430198">Az ExampleDeprecatedFeature API engedélyezése 2008. 09. 02-ig</translation>
 <translation id="8360452361555133173">Engedélyezi az üdvözlőoldal megjelenítését az operációs rendszer frissítését követő első böngészőindításkor.
 
       Ha a házirend értéke igaz, vagy ha nincs beállítva, akkor a böngésző ismét megjeleníti az üdvözlőoldalt az operációs rendszer frissítése utáni első elindításakor.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 732e241..5b46c6c 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="id">
 <translation id="101438888985615157">Putar layar sebesar 180 derajat</translation>
-<translation id="1015272884520659144">Menjelaskan daftar perangkat USB yang diizinkan untuk dilepas dari driver kernelnya, agar dapat langsung digunakan melalui API chrome.usb dalam aplikasi web. Entri berupa pasangan Pengenal Vendor USB dan Pengenal Produk untuk mengidentifikasi perangkat keras tertentu.
-
-      Jika kebijakan ini tidak dikonfigurasi, daftar perangkat USB yang dapat dilepas akan dianggap kosong.</translation>
 <translation id="1017967144265860778">Pengelolaan daya di layar masuk</translation>
 <translation id="1019101089073227242">Menyetel direktori data pengguna</translation>
 <translation id="1022361784792428773">ID ekstensi yang tidak diizinkan dipasang pengguna (atau * untuk semua)</translation>
@@ -65,7 +62,6 @@
       Jika kebijakan tidak disetel, atau disetel ke False, maka cipher suite RC4 di TLS tidak akan diaktifkan. Jika kebijakan disetel ke True, kebijakan akan tetap berlaku untuk mempertahankan kompatibilitas dengan server yang sudah usang. Tindakan ini hanya untuk sementara dan server sebaiknya dikonfigurasi ulang.</translation>
 <translation id="1297182715641689552">Gunakan skrip proxy .pac</translation>
 <translation id="1304973015437969093">ID Ekstensi/Aplikasi dan URL pembaruan akan dipasang di latar belakang</translation>
-<translation id="1310699457130669094">Anda dapat menentukan URL ke file .pac proxy di sini. Kebijakan ini hanya berlaku jika Anda telah memilih setelan proxy manual di 'Pilih cara menentukan setelan server proxy'. Anda harus membiarkan kebijakan ini tidak disetel jika telah memilih mode lain untuk kebijakan proxy setelan. Untuk contoh mendetail, kunjungi: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Menentukan persentase yang digunakan untuk menskalakan penundaan layar redup saat mengamati aktivitas pengguna selagi layar diredupkan atau tak lama setelah layar dimatikan.
 
           Jika kebijakan ini disetel, kebijakan ini menentukan persentase yang digunakan untuk menskalakan penundaan layar redup saat mengamati aktivitas pengguna selagi layar diredupkan atau tak lama setelah layar dimatikan. Saat penundaan redup diskalakan, penundaan status menganggur, layar kunci, layar mati juga disesuaikan agar jarak waktu dari penundaan layar redup sesuai konfigurasi asli.
@@ -146,18 +142,6 @@
 <translation id="1561424797596341174">Penggantian kebijakan untuk versi Debug host akses jarak jauh</translation>
 <translation id="1583248206450240930">Gunakan <ph name="PRODUCT_FRAME_NAME" /> jika tidak diubah</translation>
 <translation id="1608755754295374538">URL yang akan diberi akses ke perangkat perekam audio tanpa peringatan</translation>
-<translation id="1613574633990410986">Memungkinkan Anda menentukan server proxy yang digunakan oleh <ph name="PRODUCT_NAME" /> dan aplikasi ARC, serta mencegah pengguna mengubah setelan proxy.
-
-      Jika Anda memilih untuk tidak pernah menggunakan server proxy dan selalu tersambung secara langsung, semua opsi lain akan diabaikan.
-
-      Jika Anda memilih untuk otomatis mendeteksi server proxy, semua opsi lain akan diabaikan.
-
-      Untuk contoh detailnya, buka:
-      <ph name="PROXY_HELP_URL" />
-
-      Jika Anda mengaktifkan setelan ini, <ph name="PRODUCT_NAME" /> dan aplikasi ARC mengabaikan semua opsi terkait proxy yang ditentukan dalam baris perintah.
-
-      Dengan tidak menyetel kebijakan ini, Anda memungkinkan pengguna memilih setelan proxy sesuai keinginannya sendiri.</translation>
 <translation id="1617235075406854669">Aktifkan penghapusan riwayat unduhan atau browser</translation>
 <translation id="1617384279878333801">Mengaktifkan tambahkan orang di pengelola profil</translation>
 <translation id="1655229863189977773">Setel ukuran cache disk dalam bita</translation>
@@ -242,7 +226,6 @@
       Jika diaktifkan, tombol keluar yang besar dan berwarna merah ditampilkan di baki sistem saat sesi aktif dan layar tidak dikunci.
 
       Jika dinonaktifkan atau tidak ditentukan, tidak ada tombol keluar yang besar dan berwarna merah yang ditampilkan di baki sistem.</translation>
-<translation id="1942957375738056236">Anda dapat menentukan URL proxy server di sini. Kebijakan ini hanya berlaku jika Anda telah memilih setelan proxy manual di 'Pilih cara menentukan setelan server proxy'. Anda harus membiarkan kebijakan ini tidak disetel jika Anda telah memilih mode lain untuk menyetel kebijakan proxy. Untuk opsi lain dan contoh mendetail, kunjungi: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Mengonfigurasi pengelolaan daya di layar masuk pada <ph name="PRODUCT_OS_NAME" />.
 
       Kebijakan ini memungkinkan Anda mengonfigurasi bagaimana <ph name="PRODUCT_OS_NAME" /> berperilaku saat tidak ada aktivitas pengguna untuk jangka waktu tertentu saat layar masuk ditampilkan. Kebijakan mengontrol beberapa setelan. Untuk rentang nilai dan semantik individunya, lihat kebijakan terkait yang mengontrol pengelolaan daya dalam satu sesi. Penyimpangan dari kebijakan ini hanya:
@@ -606,24 +589,6 @@
 <translation id="3072847235228302527">Menyetel Persyaratan Layanan untuk akun lokal perangkat</translation>
 <translation id="3096595567015595053">Daftar plugin yang diaktifkan</translation>
 <translation id="3101501961102569744">Pilih cara menentukan setelan server proxy</translation>
-<translation id="3125884964575432854">Memungkinkan Anda menentukan server proxy yang digunakan oleh <ph name="PRODUCT_NAME" /> dan aplikasi ARC, serta mencegah pengguna mengubah setelan proxy.
-
-          Jika Anda memilih untuk tidak pernah menggunakan server proxy dan selalu tersambung secara langsung, semua opsi lain akan diabaikan.
-
-          Jika Anda memilih untuk menggunakan setelan proxy sistem, semua opsi lain akan diabaikan.
-
-          Jika Anda memilih untuk otomatis mendeteksi server proxy, semua opsi lain akan diabaikan.
-
-          Jika Anda memilih mode proxy server tetap, Anda dapat menentukan opsi selanjutnya di 'Address or URL of proxy server' (Alamat atau URL server proxy) dan 'Comma-separated list of proxy bypass rules' (Daftar yang dipisahkan koma untuk aturan pengabaian proxy). Aplikasi ARC hanya akan menggunakan server proxy HTTP dengan prioritas tertinggi.
-
-          Jika Anda memilih untuk menggunakan skrip proxy .pac, Anda harus menentukan URL ke skrip di 'URL to a proxy .pac file' (URL ke file .pac proxy).
-
-          Untuk contoh detailnya, buka:
-          <ph name="PROXY_HELP_URL" />
-
-          Jika Anda mengaktifkan setelan ini, <ph name="PRODUCT_NAME" /> dan aplikasi ARC mengabaikan semua opsi terkait proxy yang ditentukan dalam baris perintah.
-
-          Dengan tidak menyetel kebijakan ini, Anda memungkinkan pengguna memilih setelan proxy sesuai keinginannya sendiri.</translation>
 <translation id="3153348162326497318">Memungkinkan Anda menentukan ekstensi mana yang TIDAK dapat dipasang oleh pengguna. Ekstensi yang sudah terpasang akan dihapus jika masuk dalam daftar hitam. Nilai daftar hitam '*' berarti semua ekstensi tercantum dalam daftar hitam kecuali secara eksplisit tercantum dalam daftar putih. Jika kebijakan ini dibiarkan tanpa disetel, pengguna dapat memasang ekstensi apa pun di <ph name="PRODUCT_NAME" />.</translation>
 <translation id="316778957754360075">Setelan ini tidak lagi digunakan sejak <ph name="PRODUCT_NAME" /> versi 29. Cara yang disarankan untuk menyiapkan koleksi aplikasi/ekstensi yang dihosting organisasi adalah dengan menyertakan situs yang menghosting paket CRX di ExtensionInstallSources dan meletakkan tautan unduhan langsung di paket dalam laman web. Peluncur untuk laman web tersebut dapat dibuat menggunakan kebijakan ExtensionInstallForcelist.</translation>
 <translation id="3185009703220253572">sejak versi <ph name="SINCE_VERSION" /></translation>
@@ -688,6 +653,7 @@
       Jika setelan ini diaktifkan atau tidak dikonfigurasi, pengguna dapat mengaktifkan proxy cloud print lewat autentikasi dengan akun Google.
 
       Jika setelan ini dinonaktifkan, pengguna tidak dapat mengaktifkan proxy tersebut, dan komputer tidak akan diizinkan berbagi printernya dengan <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Memungkinkan proses diakhiri di Pengelola Tugas</translation>
 <translation id="3322771899429619102">Memungkinkan Anda menyetel daftar pola URL guna menentukan situs yang diizinkan untuk menggunakan pembuatan kunci. Jika pola URL ada di dalam 'KeygenBlockedForUrls', maka pola tersebut akan mengganti pengecualian ini.
 
           Jika kebijakan ini tidak disetel, nilai default global akan digunakan untuk semua situs dari kebijakan 'DefaultKeygenSetting' jika disetel, atau dari konfigurasi pribadi pengguna.</translation>
@@ -858,22 +824,6 @@
           Jika kebijakan ini disetel ke 'Simpan cookie untuk durasi sesi', cookie akan dihapus saat sesi ditutup. Perhatikan bahwa jika <ph name="PRODUCT_NAME" /> dijalankan dalam 'mode latar belakang', sesi mungkin tidak ditutup saat jendela terakhir ditutup. Lihat kebijakan 'BackgroundModeEnabled' untuk informasi selengkapnya tentang cara mengonfigurasi perilaku ini.
 
           Jika kebijakan ini tidak disetel, 'AllowCookies' akan digunakan dan pengguna dapat mengubahnya.</translation>
-<translation id="4098957623809244159">Kebijakan ini sudah tidak digunakan, gunakan ProxyMode sebagai gantinya.
-
-          Memungkinkan Anda menentukan server proxy yang digunakan oleh <ph name="PRODUCT_NAME" /> dan aplikasi ARC, serta mencegah pengguna mengubah setelan proxy.
-
-          Jika Anda memilih untuk tidak pernah menggunakan server proxy dan selalu tersambung secara langsung, semua opsi lain akan diabaikan.
-
-          Jika Anda memilih untuk menggunakan setelan proxy sistem atau otomatis mendeteksi server proxy, semua opsi lain akan diabaikan.
-
-          Jika Anda memilih setelan proxy manual, Anda dapat menentukan opsi selanjutnya di 'Address or URL of proxy server' (Alamat atau URL server proxy), 'URL to a proxy .pac file' (URL ke file .pac proxy), dan 'Comma-separated list of proxy bypass rules' (Daftar yang dipisahkan koma untuk aturan pengabaian proxy).
-
-          Untuk contoh detailnya, buka:
-          <ph name="PROXY_HELP_URL" />
-
-          Jika Anda mengaktifkan setelan ini, <ph name="PRODUCT_NAME" /> mengabaikan semua opsi terkait proxy yang ditentukan dalam baris perintah.
-
-          Dengan tidak menyetel kebijakan ini, Anda akan memungkinkan pengguna memilih setelan proxy sesuai keinginannya sendiri.</translation>
 <translation id="4103289232974211388">Alihkan ke SAML IdP setelah konfirmasi pengguna</translation>
 <translation id="410478022164847452">Menentukan panjang waktu tanpa masukan pengguna sebelum tindakan menganggur diambil saat menggunakan daya AC.
 
@@ -1300,14 +1250,6 @@
 <translation id="5893553533827140852">Jika setelan ini diaktifkan, permintaan autentikasi gnubby akan dilakukan melalui proxy lewat sambungan hosting jarak jauh.
 
           Jika setelan ini dinonaktifkan atau tidak dikonfigurasi, permintaan autentikasi gnubby tidak akan dilakukan melalui proxy.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> dan aplikasi ARC akan mengabaikan proxy apa pun untuk daftar host yang diberikan di sini.
-
-          Kebijakan ini hanya berlaku jika Anda telah memilih setelan proxy manual di 'Choose how to specify proxy server settings' (Pilih cara menentukan setelan server proxy).
-
-          Anda harus membiarkan kebijakan ini tidak disetel jika telah memilih mode lain apa pun untuk kebijakan proxy setelan.
-
-          Untuk contoh yang lebih mendetail, buka:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Izinkan pengunduhan pembaruan otomatis melalui HTTP</translation>
 <translation id="5921888683953999946">Menyetel status default fitur aksesibilitas kursor besar di layar masuk.
 
@@ -1791,9 +1733,6 @@
 <translation id="7632724434767231364">Nama pustaka GSSAPI</translation>
 <translation id="7635471475589566552">Mengonfigurasi lokal aplikasi di <ph name="PRODUCT_NAME" /> dan mencegah pengguna mengubah lokal tersebut. Jika Anda mengaktifkan setelan ini, <ph name="PRODUCT_NAME" /> akan menggunakan lokal yang ditentukan. Jika lokal terkonfigurasi tidak didukung, 'en-US' akan digunakan. Jika setelan ini dinonaktifkan atau tidak disetel, <ph name="PRODUCT_NAME" /> akan menggunakan lokal terpilih yang ditentukan pengguna (jika dikonfigurasi), lokal sistem, atau lokal pengganti 'en-US'.</translation>
 <translation id="7651739109954974365">Menentukan apakah roaming data harus diaktifkan untuk perangkat. Jika disetel ke true, roaming data akan diizinkan. Jika dibiarkan tanpa konfigurasi atau disetel ke false, roaming data tidak akan tersedia.</translation>
-<translation id="7667184304362487902">Mengonfigurasi setelan proxy untuk <ph name="PRODUCT_NAME" /> dan aplikasi ARC.
-
-      Kebijakan ini belum siap digunakan, jangan menggunakannya.</translation>
 <translation id="76810863974142048">URL tempat klien akses jarak jauh seharusnya mendapatkan token autentikasinya.
 
           Jika kebijakan ini disetel, host akses jarak jauh akan mewajibkan klien yang mengautentikasi memperoleh token autentikasi dari URL ini untuk menyambung. Harus digunakan bersama dengan RemoteAccessHostTokenValidationUrl.
@@ -2007,6 +1946,7 @@
 
       Nilai kebijakan harus ditentukan dalam milidetik.</translation>
 <translation id="8344454543174932833">Impor bookmark dari browser default saat pertama kali dijalankan</translation>
+<translation id="8359734107661430198">Aktifkan API ExampleDeprecatedFeature hingga 02/09/2008</translation>
 <translation id="8360452361555133173">Memungkinkan menampilkan laman selamat datang saat peluncuran browser pertama setelah peningkatan versi OS.
 
       Jika kebijakan ini disetel ke True atau tidak dikonfigurasi, browser akan menampilkan kembali laman selamat datang saat peluncuran pertama setelah peningkatan versi OS.
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index 2905c6ba..7ce302be 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="it">
 <translation id="101438888985615157">Ruota lo schermo di 180°</translation>
-<translation id="1015272884520659144">Definisce l'elenco di dispositivi USB a cui è consentito scollegarsi dal driver del kernel per essere utilizzati tramite l'API chrome.usb direttamente all'interno di un'applicazione web. Le voci sono coppie costituite dall'ID fornitore USB e dall'ID prodotto per identificare un hardware specifico.
-
-      Se la norma non è configurata, l'elenco di dispositivi USB scollegabili è considerato vuoto.</translation>
 <translation id="1017967144265860778">Gestione dell'alimentazione nella schermata di accesso</translation>
 <translation id="1019101089073227242">Imposta directory dati utente</translation>
 <translation id="1022361784792428773">ID delle estensioni (oppure * per tutte le estensioni) per cui non è consentita l'installazione</translation>
@@ -62,7 +59,6 @@
       Se la norma non viene impostata o se viene impostata su false, i pacchetti di crittografia RC4 in TLS non saranno attivati. In alternativa, la norma può essere impostata su true per mantenere la compatibilità con un server obsoleto. Si tratta di una soluzione temporanea ed è necessario configurare nuovamente il server.</translation>
 <translation id="1297182715641689552">Utilizza uno script proxy .pac</translation>
 <translation id="1304973015437969093">ID app/estensioni e URL di aggiornamento da installare automaticamente</translation>
-<translation id="1310699457130669094">Qui puoi specificare un URL che rimanda a un file proxy .pac. Questa norma viene applicata soltanto se sono state selezionate le impostazioni proxy manuali in "Scegli come specificare le impostazioni del server proxy". Se hai selezionato un'altra modalità per l'impostazione delle norme relative al proxy, non dovresti impostare questa norma. Per esempi dettagliati, visita il sito all'indirizzo: <ph name="PROXY_HELP_URL" />.</translation>
 <translation id="1313457536529613143">Consente di specificare la percentuale di regolazione del ritardo di oscuramento dello schermo quando viene osservata l'attività dell'utente mentre lo schermo è oscurato o subito dopo lo spegnimento dello schermo.
 
 Se questa norma viene impostata, consente di specificare la percentuale di regolazione del ritardo di oscuramento dello schermo quando viene osservata l'attività dell'utente mentre lo schermo è oscurato o subito dopo lo spegnimento dello schermo. Quando il ritardo di oscuramento viene regolato, i ritardi di spegnimento, blocco e inattività dello schermo vengono regolati per mantenere gli stessi distacchi dal ritardo di oscuramento dello schermo configurato in origine.
@@ -139,18 +135,6 @@
 <translation id="1561424797596341174">La norma sostituisce le build di debug dell'host di accesso remoto</translation>
 <translation id="1583248206450240930">Utilizza <ph name="PRODUCT_FRAME_NAME" /> per impostazione predefinita</translation>
 <translation id="1608755754295374538">URL a cui verrà concesso l'accesso ai dispositivi di acquisizione audio senza richieste</translation>
-<translation id="1613574633990410986">Consente di specificare il server proxy utilizzato da <ph name="PRODUCT_NAME" /> e dalle app ARC e impedisce agli utenti di modificare le impostazioni proxy.
-
-      Se scegli di non utilizzare mai un server proxy e di connetterti sempre direttamente, tutte le altre opzioni vengono ignorate.
-
-      Se scegli di rilevare automaticamente il server proxy, tutte le altre opzioni vengono ignorate.
-
-      Per esempi dettagliati, visita il sito:
-      <ph name="PROXY_HELP_URL" />
-
-      Se viene attivata questa impostazione, <ph name="PRODUCT_NAME" /> e le app ARC ignorano tutte le opzioni relative al proxy specificate dalla riga di comando.
-
-      Se queste norme non vengono impostate, gli utenti potranno scegliere autonomamente le impostazioni proxy.</translation>
 <translation id="1617235075406854669">Attiva eliminazione cronologia del browser e dei download</translation>
 <translation id="1617384279878333801">Attiva la funzione Aggiungi persona in Profile Manager</translation>
 <translation id="1655229863189977773">Imposta le dimensioni della cache su disco in byte</translation>
@@ -231,7 +215,6 @@
       Se il criterio è attivato, nell'area di notifica viene visualizzato un grosso pulsante di uscita rosso quando è attiva una sessione e lo schermo non è bloccato.
 
       Se il criterio è disattivato o non specificato, non viene visualizzato il grosso pulsante di uscita rosso nell'area di notifica.</translation>
-<translation id="1942957375738056236">Qui puoi specificare l'URL del server proxy. Questa norma viene applicata soltanto se sono state selezionate le impostazioni proxy manuali in "Scegli come specificare le impostazioni del server proxy". Se hai selezionato un'altra modalità per l'impostazione delle norme relative al proxy, non dovresti impostare questa norma. Per ulteriori opzioni ed esempi dettagliati, visita il sito all'indirizzo: <ph name="PROXY_HELP_URL" />.</translation>
 <translation id="1956493342242507974">Questa norma consente di configurare la gestione dell'alimentazione in relazione alla schermata di accesso di <ph name="PRODUCT_OS_NAME" />.
 
       Questa norma consente di configurare il comportamento di <ph name="PRODUCT_OS_NAME" /> quando non c'è attività dell'utente per un periodo di tempo mentre è visualizzata la schermata di accesso. La norma consente di controllare diverse impostazioni. Per conoscere la semantica e gli intervalli di valori di ogni impostazione, leggi le norme corrispondenti che consentono di controllare la gestione dell'alimentazione all'interno di una sessione. Le uniche differenze rispetto a queste norme sono:
@@ -588,24 +571,6 @@
 <translation id="3072847235228302527">Imposta i Termini di servizio di un account locale del dispositivo</translation>
 <translation id="3096595567015595053">Elenco dei plug-in attivati</translation>
 <translation id="3101501961102569744">Scegli come specificare le impostazioni del server proxy</translation>
-<translation id="3125884964575432854">Consente di specificare il server proxy utilizzato da <ph name="PRODUCT_NAME" /> e dalle app ARC e impedisce agli utenti di modificare le impostazioni proxy.
-
-          Se scegli di non utilizzare mai un server proxy e di connetterti sempre direttamente, tutte le altre opzioni vengono ignorate.
-
-          Se scegli di utilizzare le impostazioni proxy del sistema, tutte le altre opzioni vengono ignorate.
-
-          Se scegli di rilevare automaticamente il server proxy, tutte le altre opzioni vengono ignorate.
-
-          Se scegli di utilizzare la modalità server proxy definito, puoi specificare ulteriori opzioni in "Indirizzo o URL del server proxy" ed "Elenco separato da virgole delle regole bypass proxy". Le app ARC utilizzeranno solo il server proxy HTTP con la priorità più alta.
-
-          Se scegli di utilizzare uno script proxy .pac, devi specificare l'URL per lo script in "URL per file proxy .pac".
-
-          Per esempi dettagliati, visita il sito:
-          <ph name="PROXY_HELP_URL" />
-
-          Se viene attivata questa impostazione, <ph name="PRODUCT_NAME" /> e le app ARC ignorano tutte le opzioni relative al proxy specificate dalla riga di comando.
-
-          Se queste norme non vengono impostate, gli utenti potranno scegliere autonomamente le impostazioni proxy.</translation>
 <translation id="3153348162326497318">Consente di specificare le estensioni che gli utenti NON possono installare. Se presenti nella blacklist, le estensioni precedentemente installate verranno rimosse. Un valore "*" riportato nella blacklist indica che tutte le estensioni sono state inserite nella blacklist a meno che non siano espressamente elencate nella whitelist. Se questa norma non viene impostata, gli utenti potranno installare qualsiasi estensione in <ph name="PRODUCT_NAME" />.</translation>
 <translation id="316778957754360075">Questa impostazione non è più supportata a partire dalla versione 29 di <ph name="PRODUCT_NAME" />. Il metodo consigliato per la configurazione di raccolte di estensioni/app ospitate dall'organizzazione consiste nell'includere il sito che ospita i pacchetti CRX in ExtensionInstallSources e inserire link di download diretti per i pacchetti in una pagina web. È possibile creare una funzione Avvio applicazioni per la pagina web utilizzando la norma ExtensionInstallForcelist.</translation>
 <translation id="3185009703220253572">a partire dalla versione <ph name="SINCE_VERSION" /></translation>
@@ -670,6 +635,7 @@
       Se l'impostazione è attivata o non è configurata, gli utenti possono attivare il proxy Cloud Print attraverso l'autenticazione con il proprio account Google.
 
       Se l'impostazione è disattivata, gli utenti non possono attivare il proxy e il computer non può condividere le stampanti con <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Consente di terminare i processi in Task Manager</translation>
 <translation id="3322771899429619102">Consente di impostare un elenco di pattern URL che specificano i siti in cui è consentito l'utilizzo della generazione di chiavi. Se un pattern URL è indicato nella norma "KeygenBlockedForUrls", quest'ultima ha la precedenza su queste eccezioni.
 
           Se questa norma non viene impostata, per tutti i siti verrà utilizzato il valore predefinito globale della norma "DefaultKeygenSetting", se è impostata, oppure verrà utilizzata la configurazione personale dell'utente.</translation>
@@ -831,22 +797,6 @@
           Se questa norma viene impostata su "Conserva cookie per tutta la durata della sessione", i cookie vengono cancellati alla chiusura della sessione. Quando <ph name="PRODUCT_NAME" /> è in esecuzione in "modalità background", è possibile che la sessione non si chiuda quando viene chiusa l'ultima finestra. Leggere la norma "BackgroundModeEnabled" per avere ulteriori informazioni sulla configurazione di questo comportamento.
 
           Se questa norma non viene impostata, verrà utilizzata la norma "AllowCookies", che potrà essere modificata dall'utente.</translation>
-<translation id="4098957623809244159">Questa norma è obsoleta, utilizza ProxyMode al suo posto.
-
-          Consente di specificare il server proxy utilizzato da <ph name="PRODUCT_NAME" /> e dalle app ARC e impedisce agli utenti di modificare le impostazioni proxy.
-
-          Se scegli di non utilizzare mai un server proxy e di connetterti sempre direttamente, tutte le altre opzioni vengono ignorate.
-
-          Se scegli di utilizzare le impostazioni proxy del sistema o di rilevare automaticamente il server proxy, tutte le altre opzioni vengono ignorate.
-
-          Se scegli le impostazioni proxy manuali, puoi specificare ulteriori opzioni in "Indirizzo o URL del server proxy", "URL per file proxy .pac" ed "Elenco separato da virgole delle regole bypass proxy".
-
-          Per esempi dettagliati, visita il sito:
-          <ph name="PROXY_HELP_URL" />
-
-          Se attivi questa impostazione, <ph name="PRODUCT_NAME" /> ignora tutte le opzioni correlate al proxy specificate dalla riga di comando.
-
-          Se questa norma non viene impostata, gli utenti potranno scegliere autonomamente le impostazioni del proxy.</translation>
 <translation id="4103289232974211388">Reindirizza a IdP SAML dopo la conferma dell'utente</translation>
 <translation id="410478022164847452">Consente di specificare il periodo di tempo senza input dell'utente trascorso il quale viene compiuta l'azione stabilita per l'inattività quando viene utilizzata la corrente alternata.
 
@@ -1266,14 +1216,6 @@
 <translation id="5893553533827140852">Se questa impostazione è attivata, le richieste di autenticazione Gnubby verranno trasferite al proxy attraverso una connessione host remota.
 
           Se questa impostazione è disattivata o non configurata, le richieste di autenticazione Gnubby non verranno trasferite al proxy.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> e le app ARC ignoreranno i proxy relativi all'elenco di host specificato qui.
-
-          Questa norma viene applicata soltanto se sono state selezionate le impostazioni proxy manuali in "Scegli come specificare le impostazioni del server proxy".
-
-          Se hai selezionato un'altra modalità per l'impostazione delle norme relative al proxy, non dovresti impostare questa norma.
-
-          Per esempi più dettagliati, visita il sito:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Permetti download di aggiornamento automatico tramite HTTP</translation>
 <translation id="5921888683953999946">Consente di impostare lo stato predefinito della funzione di accessibilità del puntatore grande nella schermata di accesso.
 
@@ -1742,9 +1684,6 @@
 <translation id="7632724434767231364">Nome della libreria GSSAPI</translation>
 <translation id="7635471475589566552">Consente di configurare in <ph name="PRODUCT_NAME" /> le impostazioni della lingua e di impedirne la modifica agli utenti. Se attivi questa impostazione, <ph name="PRODUCT_NAME" /> utilizzerà le impostazioni della lingua specificate. Se la lingua configurata non è supportata, verrà utilizzata la lingua "en-US". Se questa impostazione viene disattivata o non viene impostata, <ph name="PRODUCT_NAME" /> utilizzerà la lingua preferita specificata dall'utente (se configurata), quella del sistema o la lingua di fallback "en-US".</translation>
 <translation id="7651739109954974365">È possibile stabilire se attivare o meno il roaming dei dati per il dispositivo. Se la norma viene impostata su true, il roaming dei dati sarà consentito. Se non viene configurata o viene impostata su false, il roaming dei dati non sarà disponibile.</translation>
-<translation id="7667184304362487902">Consente di configurare le impostazioni proxy per <ph name="PRODUCT_NAME" /> e le app ARC.
-
-      Questa norma non è ancora pronta per essere utilizzata, pertanto invitiamo a non utilizzarla.</translation>
 <translation id="76810863974142048">URL in cui i client di accesso remoto devono ottenere il proprio token di autenticazione.
 
           Se viene impostata questa norma, l'host di accesso remoto richiederà che il client di autenticazione ottenga un token di autenticazione da questo URL per consentire la connessione. Deve essere utilizzato insieme a RemoteAccessHostTokenValidationUrl.
@@ -1952,6 +1891,7 @@
 
       Il valore della norma deve essere specificato in millisecondi.</translation>
 <translation id="8344454543174932833">Importa Preferiti dal browser predefinito alla prima esecuzione</translation>
+<translation id="8359734107661430198">Attiva l'API ExampleDeprecatedFeature valida fino al 02/09/2008</translation>
 <translation id="8360452361555133173">Consente di attivare la visualizzazione della pagina di benvenuto al primo avvio del browser successivo all'upgrade del sistema operativo.
 
       Se questa norma viene impostata su true o non viene configurata, nel browser viene mostrata di nuovo la pagina di benvenuto al primo avvio successivo a un upgrade del sistema operativo.
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb
index 27c9372..827c818 100644
--- a/components/policy/resources/policy_templates_iw.xtb
+++ b/components/policy/resources/policy_templates_iw.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="iw">
 <translation id="101438888985615157">סובב את המסך ב-180 מעלות</translation>
-<translation id="1015272884520659144">‏מדיניות זו מגדירה רשימת מכשירי USB שניתן לנתק ממנהל התקן הליבה שלהם, במטרה להשתמש במכשירים באמצעות ה-API ‏chrome.usb ישירות בתוך אפליקציית אינטרנט. כל רשומה כוללת זוג מזהים - מזהה ספק USB ומזהה מוצר - שמציינים חומרה ספציפית.
-
-      אם מדיניות זו לא תוגדר, רשימת מכשירי ה-USB הניתנים לניתוק תיחשב כריקה.</translation>
 <translation id="1017967144265860778">ניהול צריכת החשמל במסך ההתחברות</translation>
 <translation id="1019101089073227242">הגדר ספרייה של נתוני משתמשים</translation>
 <translation id="1022361784792428773">מזהי תוספים שיש למנוע מהמשתמש להתקין אותם (או * לכולם)</translation>
@@ -64,7 +61,6 @@
       אם המדיניות לא תוגדר או תוגדר כ-false, חבילות הצפנים של RC4 ב-TLS (אבטחת שכבת התעבורה) לא יופעלו. כדי למנוע זאת, אפשר להגדיר את המדיניות כ-true וכך לשמור על תאימות לשרת מיושן. זהו פתרון זמני, ויש להגדיר את השרת מחדש.</translation>
 <translation id="1297182715641689552">‏השתמש בסקריפט Proxy מסוג ‎.pac</translation>
 <translation id="1304973015437969093">מזהי תוספים/אפליקציות וכתובות אתרים של עדכונים המיועדים להתקנה שקטה</translation>
-<translation id="1310699457130669094">‏תוכל לציין כאן כתובת אתר לקובץ ‎.pac של שרת Proxy. מדיניות זו תקפה רק אם בחרת באופן ידני באפשרות 'בחר כיצד לציין הגדרות שרת Proxy' בהגדרות שרת Proxy. אין צורך להגדיר מדיניות זו אם בחרת בכל מצב אחר להגדרת קווי מדיניות של שרת Proxy. לדוגמאות מפורטות, היכנס ל-<ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">הגדרת האחוז שלפיו ייקבע שינוי קנה המידה של השהיית עמעום המסך כאשר מובחנת פעילות משתמש בזמן שהמסך מעומעם או מיד לאחר כיבוי המסך.
 
           אם מדיניות זו מוגדרת, היא מציינת את האחוז שלפיו ייקבע שינוי קנה המידה של השהיית עמעום המסך כאשר מובחנת פעילות משתמש בזמן שהמסך מעומעם או מיד לאחר כיבוי המסך. בעת שינוי קנה המידה של עמעום המסך, ההשהיות של כיבוי מסך, נעילת מסך ומצב סרק יותאמו לשמירה על אותם הפרשים מהשהיית עמעום המסך שהוגדרו במקור.
@@ -144,18 +140,6 @@
 <translation id="1561424797596341174">‏שינויי מדיניות עבור גרסאות Build של ניפוי באגים של מארח הגישה מרחוק</translation>
 <translation id="1583248206450240930">השתמש ב-<ph name="PRODUCT_FRAME_NAME" /> כברירת מחדל</translation>
 <translation id="1608755754295374538">כתובות אתרים שיקבלו גישה למכשירי הקלטת אודיו ללא הצגת בקשה</translation>
-<translation id="1613574633990410986">‏מאפשרת לך לציין את שרת ה-proxy שבו משתמשים <ph name="PRODUCT_NAME" /> ויישומי ARC ומונעת ממשתמשים לשנות את הגדרות שרת ה-proxy.
-
-      אם תבחר לעולם לא להשתמש בשרת proxy ותמיד להתחבר ישירות, כל האפשרויות האחרות אינן מובאות בחשבון.
-
-      אם תבחר לזהות באופן אוטומטי את שרת ה-proxy, כל האפשרויות האחרות אינן מובאות בחשבון.
-
-      תוכל למצוא דוגמאות מפורטות בכתובת הבאה:
-      <ph name="PROXY_HELP_URL" />
-
-      אם תפעיל את ההגדרה הזו, <ph name="PRODUCT_NAME" /> ויישומי ARC יתעלמו מכל האפשרויות הקשורות לשרת proxy שצוינו מפקודת השורה.
-
-      אם לא תגדיר את אפשרויות המדיניות האלה, משתמשים יוכלו לבחור את הגדרות שרת ה-proxy בעצמם.</translation>
 <translation id="1617235075406854669">הפעל את מחיקת היסטוריית הדפדפן וההורדות</translation>
 <translation id="1617384279878333801">הפעלת הוספת אדם במנהל הפרופיל</translation>
 <translation id="1655229863189977773">הגדר גודל קובץ שמור של דיסק בבייטיים</translation>
@@ -237,7 +221,6 @@
       אם אפשרות זו מופעלת, לחצן התנתקות אדום גדול מוצג במגש המערכת בזמן פעילות והמסך אינו נעול.
 
       אם אפשרות זו מושבתת או לא מוגדרת, לא יוצג לחצן התנתקות אדום גדול במגש המערכת.</translation>
-<translation id="1942957375738056236">‏כאן תוכל לציין את כתובת האתר של שרת ה-Proxy. מדיניות זו מופעלת רק אם בחרת הגדרות Proxy ידניות ב'בחר כיצד לציין את הגדרות שרת ה-Proxy'. עליך להימנע מהגדרת המדיניות אם בחרת אחד מהמצבים האחרים להגדרת מדיניות Proxy. לקבלת אפשרויות נוספות ודוגמאות מפורטות, היכנס לכתובת: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">הגדר ניהול צריכת חשמל במסך ההתחברות ב-<ph name="PRODUCT_OS_NAME" />.
 
       המדיניות הזו מאפשרת לך להגדיר את ההתנהגות של <ph name="PRODUCT_OS_NAME" /> במצב שבו אין פעילות של המשתמש למשך זמן מסוים, כאשר מסך ההתחברות מוצג. המדיניות קובעת מספר הגדרות. לעיון בפרטים ובטווחי ערכים, קרא את המדיניות המתאימה המגדירה את ניהול צריכת החשמל במהלך הפעלה. החריגים היחידים מהמדיניות הזו הם:
@@ -600,24 +583,6 @@
 <translation id="3072847235228302527">הגדר את התנאים וההגבלות עבור חשבון מקומי של מכשיר</translation>
 <translation id="3096595567015595053">רשימת יישומי פלאגין מופעלים</translation>
 <translation id="3101501961102569744">‏בחר כיצד לציין הגדרות שרת Proxy</translation>
-<translation id="3125884964575432854">‏מאפשרת לך לציין את שרת ה-proxy שבו משתמש <ph name="PRODUCT_NAME" /> ויישומי ARC ומונעת ממשתמשים לשנות את הגדרות שרת ה-proxy.
-          
-          אם תבחר לעולם לא להשתמש בשרת proxy ותמיד להתחבר ישירות, כל האפשרויות האחרות אינן מובאות בחשבון.
-
-          אם תבחר להשתמש בהגדרות שרת ה-proxy של המערכת, כל האפשרויות האחרות אינן מובאות בחשבון.
-
-          אם תבחר לזהות באופן אוטומטי את שרת ה-proxy, כל האפשרויות האחרות אינן מובאות בחשבון.
-
-          אם תבחר במצב של שרת proxy קבוע, תוכל לציין אפשרויות נוספות ב'כתובת או כתובת אתר של שרת proxy' וב'רשימה מופרדת בפסיקים של כללי מעקף של שרת proxy'. יישומי ARC ישתמשו רק בשרת ה-proxy ל-HTTP שקיבל את העדיפות הגבוהה ביותר.
-
-          אם תבחר להשתמש בסקריפט ‎.pac לשרת proxy, עליך לציין את כתובת האתר בסקריפט ב'כתובת אתר לקובץ ‎.pac של שרת proxy'.
-
-          תוכל למצוא דוגמאות מפורטות בכתובת הבאה:
-          <ph name="PROXY_HELP_URL" />
-
-          אם תפעיל את ההגדרה הזו, <ph name="PRODUCT_NAME" /> ויישומי ARC יתעלמו מכל האפשרויות הקשורות לשרת proxy שצוינו משורת הפקודה.
-
-          אם לא תגדיר את המדיניות הזו, משתמשים יוכלו לבחור את הגדרות שרת ה-proxy בעצמם.</translation>
 <translation id="3153348162326497318">מאפשר לך לציין אילו תוספים המשתמשים לא יכולים להתקין. תוספים מותקנים שנוספו לרשימה השחורה יוסרו. הערך (*) ברשימה השחורה פירושו שכל התוספים יתווספו לרשימה השחורה אלא אם כן הם רשומים בבירור ברשימה הלבנה. אם מדיניות זו לא הוגדרה המשתמש יכול להתקין כל תוסף שירצה ב-<ph name="PRODUCT_NAME" />.</translation>
 <translation id="316778957754360075">‏מדיניות זו הופסקה החל מגרסה 29 של <ph name="PRODUCT_NAME" />. הדרך המומלצת להגדרת אוספים של תוספים/יישומים המתארחים בארגון היא לכלול את האתר המארח את חבילות ה-CRX ב-ExtensionInstallSources ולהציב קישורים להורדה ישירה של החבילות בדף אינטרנט. ניתן ליצור מפעיל עבור דף אינטרנט זה באמצעות המדיניות ExtensionInstallForcelist.</translation>
 <translation id="3185009703220253572">מאז גרסה <ph name="SINCE_VERSION" /></translation>
@@ -682,6 +647,7 @@
       אם הגדרה זו מופעלת או אינה מוגדרת, המשתמשים יכולים להפעיל את ה-proxy של הדפסה בענן על ידי אימות באמצעות חשבון Google שלהם.
 
       אם הגדרה זו מושבתת, המשתמשים אינם יכולים להפעיל את ה-proxy, והמחשב לא יוכל לשתף את המדפסות שלו עם <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">מאפשרת לסיים תהליכים במנהל המשימות</translation>
 <translation id="3322771899429619102">‏מדיניות זו מאפשרת לך להגדיר רשימה של דפוסי כתובות אתר המפרטת אתרים שיש להם הרשאה להפעיל יצירת מפתחות. אם דפוס כתובת אתר הוא ב-'KeygenBlockedForUrls', מדיניות זו מבטלת את החריגות האלה.
 
       אם מדיניות זו לא הוגדרה, המערכת תשתמש בערך ברירת המחדל הכללי עבור כל האתרים לפי המדיניות 'DefaultKeygenSetting' במקרה שהוגדרה, או לפי התצורה האישית שקבע המשתמש במקרה שלא הוגדרה.</translation>
@@ -849,22 +815,6 @@
           אם מדיניות זו תוגדר לאפשרות 'שמור את קובצי ה-Cookie למשך כל ההפעלה', קובצי ה-Cookie יימחקו כשההפעלה תסתיים. שים לב שאם <ph name="PRODUCT_NAME" /> פועל ב'מצב רקע', ייתכן שההפעלה לא תסתיים כשהחלון האחרון ייסגר. עיין במדיניות BackgroundModeEnabled למידע נוסף על הגדרת התנהגות זו.
 
           אם מדיניות זו לא תוגדר, המדיניות AllowCookies תהיה בשימוש והמשתמש יוכל לשנות אותה.</translation>
-<translation id="4098957623809244159">‏המדיניות הזו יצאה משימוש. השתמש במקומה ב-ProxyMode.
-          
-          מאפשרת לך להגדיר את שרת ה-proxy שבו נעשה שימוש על-ידי <ph name="PRODUCT_NAME" /> ויישומי ARC ומונעת ממשתמשים לשנות את הגדרות שרת ה-proxy.
-          
-          אם תבחר לעולם לא להשתמש בשרת proxy ותמיד להתחבר ישירות, כל האפשרויות האחרות אינן מובאות בחשבון.
-
-          אם תבחר להשתמש בהגדרות שרת ה-proxy של המערכת או לזהות באופן אוטומטי את שרת ה-proxy, כל האפשרויות האחרות אינן מובאות בחשבון.
-
-          אם תבחר בהגדרות ידניות של שרת proxy, תוכל לציין אפשרויות נוספות ב'כתובת או כתובת אתר של שרת proxy', ב'כתובת אתר לקובץ ‎.pac של שרת proxy' וב'רשימה מופרדת בפסיקים של כללי מעקף של שרת proxy'.
-
-          תוכל למצוא דוגמאות מפורטות בכתובת:
-          <ph name="PROXY_HELP_URL" />
-
-          אם תפעיל את ההגדרה הזו, <ph name="PRODUCT_NAME" /> יתעלם מכל האפשרויות הקשורות לשרת proxy שצוינו משורת הפקודה.
-
-         אם לא תגדיר את המדיניות הזו, משתמשים יוכלו לבחור את הגדרות שרת ה-proxy בעצמם.</translation>
 <translation id="4103289232974211388">‏הפנייה מחדש אל SAML IdP לאחר אישור המשתמש</translation>
 <translation id="410478022164847452">מציינת את משך הזמן ללא קלט משתמש שלאחריו מבוצעת הפעולה המוגדרת למצב לא פעיל בזמן שימוש בשקע חשמל.
 
@@ -1284,14 +1234,6 @@
 <translation id="5893553533827140852">‏אם ההגדרה הזו פועלת, בקשות אימות של Gnubby יועברו דרך שרת proxy בחיבור מארח מרוחק.
 
           אם ההגדרה הזו מושבתת או אינה מוגדרת, בקשות אימות של Gnubby לא יועברו דרך שרת proxy.</translation>
-<translation id="5900959132054596599">‏<ph name="PRODUCT_NAME" /> ויישומי ARC יעקפו כל שרת proxy לרשימת המארחים המסופקת כאן. 
-
-          במדיניות זו נעשה שימוש רק אם בחרת הגדרות proxy ידניות באפשרות 'בחר כיצד לציין את הגדרות שרת ה-proxy'. 
-
-          אין להגדיר מדיניות זו אם בחרת במצב אחר להגדרת אפשרויות מדיניות של שרת proxy.
-
-         תוכל למצוא דוגמאות מפורטות נוספות בכתובת:
-         <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">‏אפשר הורדות של עדכונים אוטומטיים דרך HTTP</translation>
 <translation id="5921888683953999946">‏הגדר את מצב ברירת המחדל של תכונת הנגישות של הסמן הגדול במסך ההתחברות.
 
@@ -1763,9 +1705,6 @@
 <translation id="7632724434767231364">‏שם ספריית GSSAPI</translation>
 <translation id="7635471475589566552">‏המדיניות מגדירה את אזור היישום ב-<ph name="PRODUCT_NAME" /> ומונעת מהמשתמשים לשנות זאת. אם תהפוך הגדרה זו לפעילה, <ph name="PRODUCT_NAME" /> ישתמש באזור שצוין. אם האזור המוגדר אינו נתמך, המערכת תשתמש ב-'en-US' במקום זאת. אם הגדרה זו מושבתת או לא מוגדרת, <ph name="PRODUCT_NAME" /> משתמש באזור המועדף שציין המשתמש (אם הוגדר), באזור המערכת או באזור הגיבוי 'en-US'.</translation>
 <translation id="7651739109954974365">קובעת אם נתוני הנדידה יופעלו עבור המכשיר. אם מוגדרת כ'אמת', תתאפשר נדידת נתונים. אם אינה מוגדרת, או מוגדרת כ'שקר', נדידת נתונים תהיה לא זמינה.</translation>
-<translation id="7667184304362487902">‏קובעת את הגדרות ה-proxy ל-<ph name="PRODUCT_NAME" /> וליישומי ARC.
-
-      מדיניות זו עדיין אינה מוכנה לשימוש, אל תשתמש בה.</translation>
 <translation id="76810863974142048">‏כתובת האתר שממנה לקוחות של גישה מרחוק צריכים להשיג את אסימון האימות שלהם.
 
           אם מדיניות זו מוגדרת, מארח הגישה מרחוק יחייב לקוחות שעוברים אימות להשיג אסימון אימות מכתובת אתר זו על מנת להתחבר. יש להשתמש במדיניות זו בשילוב עם המדיניות RemoteAccessHostTokenValidationUrl.
@@ -1977,6 +1916,7 @@
 
       הערך של המדיניות צריך להיות מוגדר באלפיות השנייה.</translation>
 <translation id="8344454543174932833">ייבא ​​סימניות מדפדפן ברירת המחדל בהפעלה הראשונה</translation>
+<translation id="8359734107661430198">‏הפעל את ממשק ה-API ‏של ExampleDeprecatedFeature עד 2.9.2008</translation>
 <translation id="8360452361555133173">‏הפעל הצגה של של דף הפתיחה בעת הפעלה ראשונה של הדפדפן לאחר שדרוג של מערכת ההפעלה.
 
       אם מדיניות זו תוגדר כ-true או לא תוגדר, הדפדפן יציג שוב את דף הפתיחה בהפעלה הראשונה לאחר שדרוג של מערכת ההפעלה.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index 1f54bf0..32c01ac 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ja">
 <translation id="101438888985615157">画面を 180 度回転</translation>
-<translation id="1015272884520659144">ウェブ アプリケーション内で直接 chrome.usb API を通じて使用できるようにするため、カーネル ドライバから分離することが許可されている USB デバイスの一覧を定義します。個々のハードウェアを特定できるように入力値は USB ベンダー ID と商品 ID のペアとします。
-
-      このポリシーが設定されていない場合、分離可能な USB デバイスのリストは空であると見なされます。</translation>
 <translation id="1017967144265860778">ログイン画面の電源管理</translation>
 <translation id="1019101089073227242">ユーザー データ ディレクトリを設定する</translation>
 <translation id="1022361784792428773">ユーザーに対してインストールを禁止する拡張機能 ID (すべて指定する場合は *)</translation>
@@ -64,7 +61,6 @@
       このポリシーが未設定または false に設定されている場合、TLS の RC4 暗号スイートは有効化されません。古いサーバーに対応するため、true に設定しておくこともできますが、あくまで暫定的な措置であり、サーバーを再設定する必要があります。</translation>
 <translation id="1297182715641689552">.pac プロキシ スクリプトを使用する</translation>
 <translation id="1304973015437969093">サイレント インストールされる拡張機能 / アプリの ID と更新 URL</translation>
-<translation id="1310699457130669094">ここでプロキシ .pac ファイルへの URL を指定できます。このポリシーは、[プロキシ サーバー設定の指定方法を選択する] で手動のプロキシ設定を選択した場合にのみ有効になります。プロキシ ポリシーの設定でその他のモードを選択している場合、このポリシーは設定しないでください。詳細な例については、<ph name="PROXY_HELP_URL" /> をご覧ください。</translation>
 <translation id="1313457536529613143">画面を暗くするまでの時間に掛ける倍率を指定します。これは、画面が暗くなっているときや画面の電源がオフになった直後にユーザー操作が検出された場合に使用されます。
 
           このポリシーを設定すると、画面が暗くなっているときや画面の電源がオフになった直後にユーザー操作が検出された場合に、このポリシーで指定された倍率が画面を暗くするまでの時間に掛けられます。画面を暗くするまでの時間が変更されるときは、画面の電源オフまでの時間、画面ロックまでの時間、およびアイドル時間も調整されます。これは、画面を暗くするまでの時間との差を当初の設定どおりに維持するためです。
@@ -147,18 +143,6 @@
 <translation id="1561424797596341174">リモート アクセス ホストの Debug ビルドでのポリシー オーバーライド</translation>
 <translation id="1583248206450240930">デフォルトで <ph name="PRODUCT_FRAME_NAME" /> を使用する</translation>
 <translation id="1608755754295374538">ユーザー確認なしで音声キャプチャ デバイスへのアクセスが許可される URL</translation>
-<translation id="1613574633990410986"><ph name="PRODUCT_NAME" /> と ARC アプリが使用するプロキシ サーバーを指定できます。この場合、ユーザーがプロキシ設定を変更することはできません。
-
-      プロキシ サーバーを使用せず常に直接接続することを選択した場合、他の設定はすべて無視されます。
-
-      プロキシ サーバーを自動検出することを選択した場合、他の設定はすべて無視されます。
-
-      詳しい例については、次の URL をご覧ください。
-      <ph name="PROXY_HELP_URL" />
-
-      この設定を有効にした場合、<ph name="PRODUCT_NAME" /> と ARC アプリでは、コマンドラインで指定されたプロキシ関連の設定がすべて無視されます。
-
-      このポリシーが未設定の場合、ユーザーは自分でプロキシ設定を選択できます。</translation>
 <translation id="1617235075406854669">閲覧とダウンロードの履歴を削除可能にする</translation>
 <translation id="1617384279878333801">プロフィール マネージャでユーザーを追加することを有効にする</translation>
 <translation id="1655229863189977773">ディスク キャッシュ サイズをバイト単位で設定する</translation>
@@ -243,7 +227,6 @@
       有効な場合、セッションがアクティブで画面がロックされていない間は、システム トレイに赤色の大きなログアウト ボタンが表示されます。
 
       無効または指定されていない場合、システム トレイに赤色の大きなログアウト ボタンは表示されません。</translation>
-<translation id="1942957375738056236">ここではプロキシ サーバーの URL を指定できます。このポリシーは [プロキシ サーバー設定の指定方法を選択する] で手動のプロキシ設定を選択した場合にのみ有効です。プロキシ ポリシーの設定でそれ以外のモードを選択した場合はこのポリシーを設定しないでください。オプションと具体的な例については、次の URL をご覧ください: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974"><ph name="PRODUCT_OS_NAME" /> のログイン画面での電源管理方法を設定します。
 
       このポリシーでは、ログイン画面が表示されている状態で一定時間ユーザー操作がなかったときの <ph name="PRODUCT_OS_NAME" /> の動作方法を設定できます。このポリシーでは複数の設定を管理します。各設定の説明と値の範囲については、セッションの電源管理に関する該当のポリシーをご覧ください。このポリシーがセッションのポリシーと異なるのは次の 2 点です:
@@ -600,24 +583,6 @@
 <translation id="3072847235228302527">デバイスのローカル アカウントの利用規約を設定する</translation>
 <translation id="3096595567015595053">有効なプラグインのリスト</translation>
 <translation id="3101501961102569744">プロキシ サーバー設定の指定方法を選択する</translation>
-<translation id="3125884964575432854"><ph name="PRODUCT_NAME" /> と ARC アプリが使用するプロキシ サーバーを指定できます。この場合、ユーザーがプロキシ設定を変更することはできません。
-
-          プロキシ サーバーを使用せず常に直接接続することを選択した場合、他の設定はすべて無視されます。
-
-          システムのプロキシ設定を使用することを選択した場合、他の設定はすべて無視されます。
-
-          プロキシ サーバーを自動検出することを選択した場合、他の設定はすべて無視されます。
-
-          固定サーバー プロキシ モードを選択した場合は、[プロキシ サーバーのアドレスまたは URL] と [プロキシ バイパス ルールのカンマ区切りリスト] で詳細を指定できます。ARC アプリでは最も優先度の高い HTTP プロキシ サーバーのみが使用されます。
-
-          .pac プロキシ スクリプトを使用することを選択した場合は、[プロキシ .pac ファイルへの URL] でスクリプトの URL を指定する必要があります。
-
-          詳しい例については、次の URL をご覧ください。
-          <ph name="PROXY_HELP_URL" />
-
-          この設定を有効にした場合、<ph name="PRODUCT_NAME" /> と ARC アプリでは、コマンドラインで指定されたプロキシ関連の設定がすべて無視されます。
-
-          このポリシーが未設定の場合、ユーザーは自分でプロキシ設定を選択できます。</translation>
 <translation id="3153348162326497318">ユーザーがインストールできない拡張機能を指定できます。インストール済みの拡張機能がブラックリストに登録されると、削除されます。ブラックリストに値「*」を登録すると、すべての拡張機能が禁止されます(明示的にホワイトリストに登録されている拡張機能を除きます)。このポリシーが未設定の場合、ユーザーは <ph name="PRODUCT_NAME" /> にすべての拡張機能をインストールできます。</translation>
 <translation id="316778957754360075">この設定は <ph name="PRODUCT_NAME" /> バージョン 29 で廃止されました。組織でホストする拡張機能/アプリのコレクションを設定するには、CRX パッケージをホストするサイトを ExtensionInstallSources の中で指定し、パッケージへの直接ダウンロード リンクをウェブページに置くことをおすすめします。そのウェブページのランチャーは、ExtensionInstallForcelist ポリシーを使用して作成できます。</translation>
 <translation id="3185009703220253572">バージョン <ph name="SINCE_VERSION" /> 以降</translation>
@@ -682,6 +647,7 @@
       この設定が有効な場合または未設定の場合、ユーザーは Google アカウントでの認証によってクラウド プリント プロキシを有効にできます。
 
       この設定が無効な場合、ユーザーはプロキシを有効にできず、パソコンはプリンタを <ph name="CLOUD_PRINT_NAME" /> と共有できません。</translation>
+<translation id="3297010562646015826">タスク マネージャでプロセスを終了できるようにする</translation>
 <translation id="3322771899429619102">キー生成を使用できるサイトの URL パターンを登録します。URL パターンが「KeygenBlockedForUrls」にも含まれる場合、この例外ポリシーは無視されます。
 
           このポリシーが未設定の場合は、「DefaultKeygenSetting」ポリシー(設定されている場合)またはユーザー個人の設定で指定されているすべてのサイトに対し、共通の既定値が使用されます。</translation>
@@ -848,22 +814,6 @@
 このポリシーが [セッションの継続中は Cookie を保存する] に設定されている場合、Cookie はセッション終了時に消去されます。なお、<ph name="PRODUCT_NAME" /> が「バックグラウンド モード」で実行されている場合は、最後のウィンドウを閉じてもセッションが終了とならないことがあります。この動作の設定について詳しくは、「BackgroundModeEnabled」ポリシーの説明をご覧ください。
 
 このポリシーが未設定の場合は、「AllowCookies」が使用され、ユーザーは設定を変更できます。</translation>
-<translation id="4098957623809244159">このポリシーはサポート終了となりました。代わりに ProxyMode を使用してください。
-
-          <ph name="PRODUCT_NAME" /> と ARC アプリが使用するプロキシ サーバーを指定できます。この場合、ユーザーがプロキシ設定を変更することはできません。
-
-          プロキシ サーバーを使用せず常に直接接続することを選択した場合、他の設定はすべて無視されます。
-
-          システムのプロキシ設定を使用する、またはプロキシ サーバーを自動検出することを選択した場合、他の設定はすべて無視されます。
-
-          手動によるプロキシ設定を選択した場合は、[プロキシ サーバーのアドレスまたは URL]、[プロキシ .pac ファイルへの URL]、[プロキシ バイパス ルールのカンマ区切りリスト] で詳細を指定できます。
-
-          詳しい例については、次の URL をご覧ください。
-          <ph name="PROXY_HELP_URL" />
-
-          この設定を有効にした場合、<ph name="PRODUCT_NAME" /> では、コマンドラインで指定されたプロキシ関連の設定がすべて無視されます。
-
-          このポリシーが未設定の場合、ユーザーは自分でプロキシ設定を選択できます。</translation>
 <translation id="4103289232974211388">ユーザーの確認後に SAML IdP にリダイレクトする</translation>
 <translation id="410478022164847452">AC 電源での実行時に、ユーザー入力が行われなくなってからアイドル操作が行われるまでの時間を指定します。
 
@@ -1289,14 +1239,6 @@
 <translation id="5893553533827140852">この設定が有効になっている場合、gnubby 認証リクエストはリモート ホスト接続でプロキシ送信されます。
 
           この設定が無効になっているか設定されていない場合、gnubby 認証リクエストはプロキシ送信されません。</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> と ARC アプリは、ここで指定したホストのリストに対し、プロキシをバイパスします。
-
-          このポリシーが適用されるのは、[プロキシ サーバー設定の指定方法を選択する] で手動によるプロキシ設定を選択した場合のみです。
-
-          プロキシ ポリシーの設定で他のモードを選択した場合、このポリシーは設定しないでください。
-
-          詳しい例については、次の URL をご覧ください。
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">HTTP 経由での自動更新ダウンロードを許可する</translation>
 <translation id="5921888683953999946">ログイン画面でのユーザー補助機能「大きいカーソル」のデフォルト状態を設定します。
 
@@ -1785,9 +1727,6 @@
 <translation id="7632724434767231364">GSSAPI ライブラリ名</translation>
 <translation id="7635471475589566552"><ph name="PRODUCT_NAME" /> のアプリケーションの言語/地域を設定し、ユーザーが言語/地域を変更できないようにします。この設定を有効にすると、<ph name="PRODUCT_NAME" /> では指定された言語/地域が使用されます。設定した言語/地域がサポートされない場合、「en-US」が使用されます。この設定を無効にするか設定しないと、<ph name="PRODUCT_NAME" /> ではユーザー指定の適切な言語/地域(設定されている場合)、システムの言語/地域、代替の言語/地域「en-US」のいずれかが使用されます。</translation>
 <translation id="7651739109954974365">データ ローミングを端末に対して有効にするかどうかを指定します。true に設定した場合、データ ローミングが許可されます。未設定または false に設定した場合、データ ローミングは利用できません。</translation>
-<translation id="7667184304362487902"><ph name="PRODUCT_NAME" /> と ARC アプリ用のプロキシ設定を指定します。
-
-      このポリシーはまだ準備段階のため、使用しないでください。</translation>
 <translation id="76810863974142048">リモート アクセス クライアントが認証トークンを取得する場所の URL。
 
           このポリシーが設定されている場合、リモート アクセス ホストは、認証するクライアントが接続する際にこの URL から認証トークンを取得するよう要求します。このポリシーは必ず RemoteAccessHostTokenValidationUrl と共に使用します。
@@ -1995,6 +1934,7 @@
 
       ポリシーの値は、ミリ秒単位で指定する必要があります。</translation>
 <translation id="8344454543174932833">初回実行時にデフォルトのブラウザからブックマークをインポートする</translation>
+<translation id="8359734107661430198">ExampleDeprecatedFeature API を 2008 年 9 月 2 日いっぱい有効にする</translation>
 <translation id="8360452361555133173">OS のアップグレード後に初めてブラウザを起動したときのウェルカム ページの表示を有効にします。
 
       このポリシーを true に設定した場合や未設定の場合、OS のアップグレード後に初めてブラウザを起動したときにウェルカム ページが再表示されます。
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb
index c9b3c567..796a93a 100644
--- a/components/policy/resources/policy_templates_kn.xtb
+++ b/components/policy/resources/policy_templates_kn.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="kn">
 <translation id="101438888985615157">ಪರದೆಯನ್ನು 180 ಡಿಗ್ರಿಗಳಿಗೆ ತಿರುಗಿಸಿ</translation>
-<translation id="1015272884520659144">ವೆಬ್ ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿ chrome.usb API ಮೂಲಕ ನೇರವಾಗಿ ಬಳಸಬೇಕಾಗಿರುವ ತಮ್ಮ ಕೆರ್ನಲ್ ಡ್ರೈವರ್‌ನಿಂದ ಪ್ರತ್ಯೇಕಿಸಲು USB ಸಾಧನಗಳ ಪಟ್ಟಿಯನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುತ್ತದೆ. ನಿರ್ದಿಷ್ಟ ಹಾರ್ಡ್‌ವೇರ್ ಗುರುತಿಸಲು USB ವೆಂಡರ್ ಗುರುತಿಸುವಿಕೆ ಮತ್ತು ಉತ್ಪನ್ನ ಗುರುತಿಸುವಿಕೆ ನಮೂದುಗಳು ಜೋಡಿಯಾಗಿವೆ. 
-
-       ಈ ನೀತಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡದೇ ಇದ್ದಲ್ಲಿ, ಪ್ರತ್ಯೇಕಿಸಬಹುದಾದ USB ಸಾಧನಗಳ ಪಟ್ಟಿಯನ್ನು ಖಾಲಿ ಎಂದು ಪರಿಗಣಿಸಲಾಗುತ್ತದೆ.</translation>
 <translation id="1017967144265860778">ಲಾಗಿನ್‌ ಪರದೆ ಮೇಲಿನ ವಿದ್ಯುತ್‌ ನಿರ್ವಹಣೆ</translation>
 <translation id="1019101089073227242">ಬಳಕೆದಾರ ಡೇಟಾ ಡೈರಕ್ಟರಿಯನ್ನು ಹೊಂದಿಸು</translation>
 <translation id="1022361784792428773">ಸ್ಥಾಪಿಸುವುದರಿಂದ ಬಳಕೆದಾರನನ್ನು ತಡೆಯಬೇಕಾದ ವಿಸ್ತರಣೆ IDಗಳು (ಅಥವಾ * ಎಲ್ಲಕ್ಕೂ)</translation>
@@ -60,14 +57,6 @@
       ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಇದ್ದರೆ ಅಥವಾ ತಪ್ಪು ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸಿದರೆ, ಆಗ TLS ನಲ್ಲಿ RC4 ಸೈಫರ್ ಸ್ಯೂಟ್ಸ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುವುದಿಲ್ಲ. ಇಲ್ಲದಿದ್ದರೆ, ಅವಧಿ ಮೀರಿದ ಸರ್ವರ್ ಜೊತೆಗೆ ಹೊಂದಾಣಿಕೆಯನ್ನು ಉಳಿಸಿಕೊಳ್ಳಲು ಅದನ್ನು ಸರಿ ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸಲಾಗಬಹುದು. ಇದು ತಾತ್ಕಾಲಿಕ ಕ್ರಮವಾಗಿರುತ್ತದೆ ಮತ್ತು ಸರ್ವರ್ ಅನ್ನು ಮರುಕಾನ್ಫಿಗರ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.</translation>
 <translation id="1297182715641689552">.pac ಪ್ರಾಕ್ಸಿ ಸ್ಕ್ರಿಪ್ಟ್ ಅನ್ನು ಬಳಸಿ</translation>
 <translation id="1304973015437969093">ವಿಸ್ತರಣೆ IDಗಳು ಮತ್ತು ಅಪ್‌ಡೇಟ್‌‌ URLಗಳನ್ನು ನಿಶ್ಯಬ್ದವಾಗಿ ಸ್ಥಾಪಿಸಬೇಕು</translation>
-<translation id="1310699457130669094">ಪ್ರಾಕ್ಸಿ .pac ಫೈಲ್‌ಗೆ ನೀವು URL ಅನ್ನು ಇಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಬಹುದು.
-
-          'ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಹೇಗೆ ನಿರ್ದಿಷ್ಟಪಡಿಸಬೇಕೆಂದು ಆರಿಸು' ರಲ್ಲಿ ನೀವು ಹಸ್ತಚಾಲಿತ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿದ್ದರೆ ಮಾತ್ರ ಈ ನೀತಿಯು ಕಾರ್ಯಗತಗೊಳ್ಳುತ್ತದೆ.
-
-          ಪ್ರಾಕ್ಸಿ ನೀತಿಗಳನ್ನು ಹೊಂದಿಸುವುದಕ್ಕಾಗಿ ನೀವು ಬೇರೆ ಯಾವುದಾದರೂ ಇತರ ಮೋಡ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿಕೊಂಡಿದ್ದರೆ ನೀವು ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೆ ಬಿಡಬೇಕಾಗುತ್ತದೆ.
-
-          ವಿವರವಾದ ಉದಾಹರಣೆಗಳಿಗಾಗಿ, ಇಲ್ಲಿ ಭೇಟಿ ನೀಡಿ:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">ಪರದೆಯು ಮಸುಕಾಗಿರುವ ಸಂದರ್ಭದಲ್ಲಿ ಬಳಕೆದಾರರ ಚಟುವಟಿಕೆಯನ್ನು ಗಮನಿಸುತ್ತಿರುವಾಗ ಅಥವಾ ಪರದೆಯನ್ನು ಆಫ್ ಮಾಡಿದ ತಕ್ಷಣ ಕೆಲವೇ ಸಮಯ ನಂತರ ಯಾವ ಪರದೆ ಮಸುಕು ವಿಳಂಬವನ್ನು ಅಳತೆ ಮಾಡಲಾಗಿದೆ ಎಂಬುದರ ಮೂಲಕ ಪ್ರತಿಶತವನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ.
 
           ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸಿದರೆ, ಪರದೆಯು ಮಸುಕಾಗಿರುವ ಸಂದರ್ಭದಲ್ಲಿ ಬಳಕೆದಾರರ ಚಟುವಟಿಕೆಯನ್ನು ಗಮನಿಸುತ್ತಿರುವಾಗ ಅಥವಾ ಪರದೆಯನ್ನು ಆಫ್ ಮಾಡಿದ ತರುವಾಯ ಕೆಲವೇ ಸಮಯ ನಂತರ ಯಾವ ಪರದೆ ಮಸುಕು ವಿಳಂಬವನ್ನು ಅಳತೆ ಮಾಡಲಾಗಿದೆ ಎಂಬುದರ ಮೂಲಕ ಇದು ಪ್ರತಿಶತವನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ. ಮಸುಕು ವಿಳಂಬವನ್ನು ಅಳತೆ ಮಾಡುವಾಗ, ಮೂಲತಃ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿರುವಂತೆ ಪರದೆ ಮಸುಕಿನಿಂದ ಅದೇ ಅಂತರಗಳನ್ನು ಕಾಯ್ದುಕೊಳ್ಳವುದಕ್ಕಾಗಿ ಸರಿಹೊಂದಿಕೊಳ್ಳಲು ಪರದೆ ಆಫ್, ಪರದೆ ಲಾಕ್ ಮತ್ತು ಐಡಲ್ ವಿಳಂಬಗೊಳ್ಳುತ್ತವೆ.
@@ -143,18 +132,6 @@
 <translation id="1561424797596341174">ರಿಮೋಟ್ ಪ್ರವೇಶ ಹೋಸ್ಟ್‌ನ ಡೀಬಗ್ ನಿರ್ಮಾಣಗಳಿಗಾಗಿ ನೀತಿಯನ್ನು ಅತಿಕ್ರಮಿಸುತ್ತದೆ</translation>
 <translation id="1583248206450240930"><ph name="PRODUCT_FRAME_NAME" /> ಅನ್ನು ಡೀಫಾಲ್ಟ್ ಆಗಿ ಬಳಸಿ</translation>
 <translation id="1608755754295374538">ಪ್ರಾಂಪ್ಟ್ ಇಲ್ಲದೆಯೇ ಆಡಿಯೊ ಸೆರೆಹಿಡಿಯುವಿಕೆ ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಪೂರೈಸುವಂತಹ URL ಗಳು</translation>
-<translation id="1613574633990410986"><ph name="PRODUCT_NAME" /> ಮತ್ತು ARC-ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಬಳಸಿದ ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ನಿರ್ದಿಷ್ಟಪಡಿಸಲು ನಿಮಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ ಮತ್ತು ಬಳಕೆದಾರರು ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬದಲಾಯಿಸುವುದನ್ನು ತಡೆಗಟ್ಟುತ್ತದೆ.
-
-     ಎಂದಿಗೂ ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ಬಳಸದೇ ಇರಲು ಮತ್ತು ಯಾವಾಗಲೂ ನೇರವಾಗಿ ಸಂಪರ್ಕಗೊಳ್ಳಲು ನೀವು ಆಯ್ಕೆಮಾಡಿಕೊಂಡರೆ, ಇತರ ಎಲ್ಲಾ ಆಯ್ಕೆಗಳನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ.
-
-      ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ಅನ್ನು ಸ್ವಯಂ ಪತ್ತೆಹಚ್ಚಲು ನೀವು ಆಯ್ಕೆಮಾಡಿಕೊಂಡರೆ, ಇತರ ಎಲ್ಲಾ ಆಯ್ಕೆಗಳನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ.
-
-      ವಿವರವಾದ ಉದಾಹರಣೆಗಳಿಗೆ, ಇಲ್ಲಿ ಭೇಟಿ ನೀಡಿ:
-      <ph name="PROXY_HELP_URL" />
-
-      ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನೀವು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, <ph name="PRODUCT_NAME" /> ಮತ್ತು ARC-ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಆದೇಶ ಸಾಲಿನಿಂದ ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಎಲ್ಲಾ ಪ್ರಾಕ್ಸಿ-ಸಂಬಂಧಿತ ಆಯ್ಕೆಗಳನ್ನು ನಿರ್ಲಕ್ಷಿಸುತ್ತವೆ.
-
-      ಈ ನೀತಿಗಳನ್ನು ಹೊಂದಿಸದೇ ಹಾಗೆಯೇ ಬಿಟ್ಟರೆ ಬಳಕೆದಾರರಿಗೆ ಸ್ವಂತವಾಗಿ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿಕೊಳ್ಳಲು ಅವಕಾಶ ದೊರೆಯುತ್ತದೆ.</translation>
 <translation id="1617235075406854669">ಬ್ರೌಸರ್ ಅನ್ನು ಅಳಿಸುವುದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ ಮತ್ತು ಇತಿಹಾಸವನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ</translation>
 <translation id="1617384279878333801">ಪ್ರೊಫೈಲ್ ಮ್ಯಾನೇಜರ್‌ನಲ್ಲಿ ವ್ಯಕ್ತಿ ಸೇರಿಸು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="1655229863189977773">ಡಿಸ್ಕ್ ಸಂಗ್ರಹ ಗಾತ್ರವನ್ನು ಬೈಟ್‌ಗಳಲ್ಲಿ ಹೊಂದಿಸಿ</translation>
@@ -234,7 +211,6 @@
       ಸಕ್ರಿಯಗೊಳಿಸಿದ್ದರೆ, ಸೆಷನ್ ಸಕ್ರಿಯವಾಗಿರುವಾಗ ಮತ್ತು ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಆಗಿಲ್ಲದಿರುವಾಗ, ಸಿಸ್ಟಂ ಟ್ರೇನಲ್ಲಿ ಒಂದು ದೊಡ್ಡದಾದ, ಕೆಂಪು ಲಾಗ್ಔಟ್ ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗುತ್ತದೆ.
 
       ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದ್ದರೆ ಅಥವಾ ನಿರ್ದಿಷ್ಟಪಡಿಸಿಲ್ಲದಿದ್ದರೆ, ಸಿಸ್ಟಂ ಟ್ರೇನಲ್ಲಿ ಯಾವುದೇ ದೊಡ್ಡದಾದ, ಕೆಂಪು ಲಾಗ್ಔಟ್ ಬಟನ್ ಅನ್ನು ತೋರಿಸಲಾಗುವುದಿಲ್ಲ.</translation>
-<translation id="1942957375738056236">ನೀವು ಇಲ್ಲಿ ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್‌ನ URL ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಬಹುದು. ನೀವು 'ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಲು ಹೇಗೆ ಆರಿಸುವುದು' ಎಂಬುದರಲ್ಲಿ ಹಸ್ತಚಾಲಿತ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿದಲ್ಲಿ ಈ ನೀತಿಯು ಕಾರ್ಯಗತಗೊಳ್ಳುತ್ತದೆ. ನೀವು ಸೆಟ್ಟಿಂಗ್ ಪ್ರಾಕ್ಸಿ ನೀತಿಗಳಿಗಾಗಿ ಯಾವುದೇ ಇತರೆ ಮೋಡ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿದಲ್ಲಿ ಹೊಂದಿಸದಿರುವ ಈ ನೀತಿಯನ್ನು ಬಿಡಬೇಕಾಗುತ್ತದೆ. ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು ಮತ್ತು ವಿವರವಾದ ಉದಾಹರಣೆಗಳಿಗಾಗಿ, ಇಲ್ಲಿ ಭೇಟಿ ನೀಡಿ: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974"><ph name="PRODUCT_OS_NAME" /> ನಲ್ಲಿ ಲಾಗಿನ್ ಪರದೆ ಮೇಲೆ ಪವರ್ ನಿರ್ವಹಣೆಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ.
 
 ಲಾಗಿನ್ ಪರದೆಯನ್ನು ತೋರಿಸುವಾಗ ಕೆಲವು ಸಮಯ ಬಳಕೆದಾರರ ಚಟುವಟಿಕೆ ಇಲ್ಲದಿರುವಾಗ <ph name="PRODUCT_OS_NAME" /> ಹೇಗೆ ವರ್ತಿಸಬೇಕು ಎಂಬುದನ್ನು ಈ ನೀತಿಯು ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತದೆ. ನೀತಿಯು ಬಹು ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ನಿಯಂತ್ರಿಸುತ್ತದೆ. ಅವುಗಳ ಪ್ರತ್ಯೇಕ ಶಬ್ದಾರ್ಥ ಮತ್ತು ಮೌಲ್ಯ ಶ್ರೇಣಿಗಳಿಗಾಗಿ ಅವಧಿಯ ವ್ಯಾಪ್ತಿಯೊಳಗೆ ಪವರ್ ನಿರ್ವಹಣೆಯನ್ನು ನಿಯಂತ್ರಿಸುವ ಅನುಗುಣವಾದ ನೀತಿಗಳನ್ನು ನೋಡಿ. ಈ ನೀತಿಗಳಿಂದ ಉಂಟಾಗುವ ವ್ಯತ್ಯಾಸಗಳೆಂದರೆ:
@@ -588,24 +564,6 @@
 <translation id="3072847235228302527">ಸಾಧನ-ಸ್ಥಳೀಯ ಖಾತೆಗಾಗಿ ಸೇವಾ ನಿಯಮಗಳನ್ನು ಹೊಂದಿಸಿ</translation>
 <translation id="3096595567015595053">ಸಕ್ರಿಯಗೊಳಿಸಲಾದ ಪ್ಲಗಿನ್‌ಗಳ ಪಟ್ಟಿ</translation>
 <translation id="3101501961102569744">ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಹೇಗೆ ನಿರ್ದಿಷ್ಟಪಡಿಸುವುದು ಎಂಬುದನ್ನು ಆರಿಸಿ</translation>
-<translation id="3125884964575432854"><ph name="PRODUCT_NAME" /> ಮತ್ತು ARC-ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಬಳಸಿದ ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ನಿರ್ದಿಷ್ಟಪಡಿಸಲು ನಿಮಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ ಮತ್ತು ಬಳಕೆದಾರರು ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬದಲಾಯಿಸುವುದನ್ನು ತಡೆಗಟ್ಟುತ್ತದೆ.
-
-          ಎಂದಿಗೂ ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ಬಳಸದೇ ಇರಲು ಮತ್ತು ಯಾವಾಗಲೂ ನೇರವಾಗಿ ಸಂಪರ್ಕಗೊಳ್ಳಲು ನೀವು ಆಯ್ಕೆಮಾಡಿಕೊಂಡರೆ, ಇತರ ಎಲ್ಲಾ ಆಯ್ಕೆಗಳನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ.
-
-          ಸಿಸ್ಟಂ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬಳಸಲು ನೀವು ಆಯ್ಕೆಮಾಡಿಕೊಂಡರೆ, ಇತರ ಎಲ್ಲಾ ಆಯ್ಕೆಗಳನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ.
-
-          ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ಅನ್ನು ಸ್ವಯಂ ಪತ್ತೆಹಚ್ಚಲು ನೀವು ಆಯ್ಕೆಮಾಡಿಕೊಂಡರೆ, ಇತರ ಎಲ್ಲಾ ಆಯ್ಕೆಗಳನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ.
-
-          ನೀವು ಸ್ಥಿರ ಸರ್ವರ್ ಪ್ರಾಕ್ಸಿ ಮೋಡ್ ಆಯ್ಕೆಮಾಡಿಕೊಂಡರೆ, ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳನ್ನು ನೀವು 'ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್‌ನ ವಿಳಾಸ ಅಥವಾ URL' ಮತ್ತು 'ಪ್ರಾಕ್ಸಿ ಬೈಪಾಸ್ ನಿಯಮಗಳ ಅಲ್ಪವಿರಾಮ-ಪ್ರತ್ಯೇಕಿತ ಪಟ್ಟಿ' ಯಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಬಹುದು. ARC-ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಅತ್ಯಧಿಕ ಆದ್ಯತೆಯ ಜೊತೆಗೆ ಕೇವಲ HTTP ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ಅನ್ನು ಮಾತ್ರ ಬಳಸುತ್ತವೆ
-
-          ನೀವು .pac ಪ್ರಾಕ್ಸಿ ಸ್ಕ್ರಿಪ್ಟ್ ಬಳಸಲು ಆಯ್ಕೆಮಾಡಿಕೊಂಡರೆ, ನೀವು ಸ್ಕ್ರಿಪ್ಟ್ URL ಅನ್ನು 'ಪ್ರಾಕ್ಸಿ .pac ಫೈಲ್‌ನ URL' ನಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಬೇಕು.
-
-          ವಿವರವಾದ ಉದಾಹರಣೆಗಳಿಗೆ, ಇಲ್ಲಿಗೆ ಭೇಟಿ ನೀಡಿ:
-          <ph name="PROXY_HELP_URL" />
-
-          ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನೀವು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, <ph name="PRODUCT_NAME" /> ಮತ್ತು ARC-ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಆದೇಶ ಸಾಲಿನಿಂದ ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಎಲ್ಲಾ ಪ್ರಾಕ್ಸಿ-ಸಂಬಂಧಿತ ಆಯ್ಕೆಗಳನ್ನು ನಿರ್ಲಕ್ಷಿಸುತ್ತವೆ.
-
-          ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಹಾಗೆಯೇ ಬಿಟ್ಟರೆ ಬಳಕೆದಾರರಿಗೆ ಸ್ವಂತವಾಗಿ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿಕೊಳ್ಳಲು ಅವಕಾಶ ಸಿಗುತ್ತದೆ.</translation>
 <translation id="3153348162326497318">ಬಳಕೆದಾರರು ಯಾವ ವಿಸ್ತರಣೆಗಳನ್ನು ಸ್ಥಾಪಿಸಲಾಗುವುದಿಲ್ಲ ಎಂಬುದನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಲು ಇದು ನಿಮಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಕಪ್ಪುಪಟ್ಟಿಯಲ್ಲಿದ್ದರೆ ಈಗಾಗಲೇ ಸ್ಥಾಪಿಸಲಾದ ವಿಸ್ತರಣೆಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ. '*' ನ ಕಪ್ಪುಪಟ್ಟಿ ಮೌಲ್ಯ ಎಂದರೆ ಶ್ವೇತಪಟ್ಟಿಯಲ್ಲಿ ಅವುಗಳನ್ನು ಬಹಿರಂಗವಾಗಿ ಪಟ್ಟಿ ಮಾಡದ ಹೊರತು ಎಲ್ಲ ವಿಸ್ತರಣೆಗಳನ್ನು ಕಪ್ಪುಪಟ್ಟಿಗೆ ಸೇರಿಸಲಾಗುತ್ತದೆ. ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಇದ್ದರೆ ಬಳಕೆದಾರರು <ph name="PRODUCT_NAME" /> ರಲ್ಲಿ ಯಾವುದೇ ವಿಸ್ತರಣೆಯನ್ನು ಸ್ಥಾಪಿಸಬಹುದಾಗಿದೆ.</translation>
 <translation id="316778957754360075">ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು <ph name="PRODUCT_NAME" /> ನ ಆವೃತ್ತಿ 29 ರಂತೆ ನಿವೃತ್ತಿಗೊಳಿಸಲಾಗಿದೆ. ಸಂಸ್ಥೆ ಹೋಸ್ಟ್ ಮಾಡಲಾದ ವಿಸ್ತರಣೆ/ಅಪ್ಲಿಕೇಶನ್ ಸಂಗ್ರಹಣೆಗಳನ್ನು ಹೊಂದಿಸಲು ExtensionInstallSources ನಲ್ಲಿ CRX ಪ್ಯಾಕೇಜ್‌ಗಳನ್ನು ಹೋಸ್ಟ್ ಮಾಡುವ ಸೈಟ್ ಅನ್ನು ಸೇರಿಸುವುದು ಮತ್ತು ಮತ್ತು ವೆಬ್ ಪುಟದಲ್ಲಿ ಪ್ಯಾಕೇಜ್‌ಗಳಿಗೆ ನೇರವಾದ ಡೌನ್‌ಲೋಡ್ ಲಿಂಕ್‌ಗಳನ್ನು ಇರಿಸುವಂತೆ ಶಿಫಾರಸು ಮಾಡಲಾದ ವಿಧಾನವಾಗಿದೆ. ExtensionInstallForcelist ನೀತಿಯನ್ನು ಬಳಸಿಕೊಂಡು ಆ ವೆಬ್ ಪುಟಕ್ಕಾಗಿ ಲಾಂಚರ್ ಅನ್ನು ರಚಿಸಬಹುದಾಗಿರುತ್ತದೆ.</translation>
 <translation id="3185009703220253572"><ph name="SINCE_VERSION" /> ಆವೃತ್ತಿಯಿಂದಲೂ</translation>
@@ -670,6 +628,7 @@
       ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ ಅಥವಾ ಕಾನ್ಫಿಗರ್ ಮಾಡದೆ ಇದ್ದಲ್ಲಿ, ಬಳಕೆದಾರರು ತಮ್ಮ Google ಖಾತೆಯೊಂದಿಗೆ ಪ್ರಮಾಣೀಕರಣದ ಮೂಲಕ ಮೇಘ ಮುದ್ರಣ ಪ್ರಾಕ್ಸಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬಹುದು.
 
       ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಬಳಕೆದಾರರು ಪ್ರಾಕ್ಸಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುವುದಿಲ್ಲ, ಮತ್ತು ಯಂತ್ರವನ್ನು ತನ್ನ ಪ್ರಿಂಟರ್‌ಗಳಾದ  <ph name="CLOUD_PRINT_NAME" /> ರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಲು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ.</translation>
+<translation id="3297010562646015826">ಕಾರ್ಯ ನಿರ್ವಾಹಕದಲ್ಲಿ ಕೊನೆಗೊಳ್ಳುವ ಪ್ರಕ್ರಿಯೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ</translation>
 <translation id="3322771899429619102">ಕೀ ರಚನೆ ಬಳಸಲು ಅನುಮತಿಸಲಾಗುವ ಸೈಟ್‌ಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುವ ಯುಆರ್‌ಎಲ್ ಪ್ಯಾಟರ್ನ್‌ಗಳ ಪಟ್ಟಿಯನ್ನು ಹೊಂದಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಯುಆರ್‌ಎಲ್ ಪ್ಯಾಟರ್ನ್ 'KeygenBlockedForUrls' ನಲ್ಲಿದ್ದರೆ, ಈ ವಿನಾಯತಿಗಳನ್ನು ಅದು ಅತಿಕ್ರಮಿಸುತ್ತದೆ.
 
           ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೆ ಬಿಟ್ಟರೆ, 'DefaultKeygenSetting' ನೀತಿಯಿಂದಾಗಲಿ ಅಥವಾ ಬಳಕೆದಾರರ ವೈಯಕ್ತಿಕ ಕಾನ್ಫಿಗರೇಶನ್‌ನಿಂದಾಗಲಿ ಎಲ್ಲ ಸೈಟ್‌ಗಳಿಗೆ ಜಾಗತಿಕ ಡಿಫಾಲ್ಟ್ ಮೌಲ್ಯವನ್ನು ಬಳಸಲಾಗುತ್ತದೆ.</translation>
@@ -844,22 +803,6 @@
           ಒಂದು ವೇಳೆ ಈ ನೀತಿಯನ್ನು ‘ಸೆಷನ್ ಕಾಲಾವಧಿಗೆ ಕುಕೀಗಳನ್ನು ಇರಿಸು’ ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸಿದರೆ, ಸೆಷನ್ ಮುಕ್ತಾಯಗೊಂಡಾಗ ಕುಕೀಗಳನ್ನು ತೆರವುಗೊಳಿಸಲಾಗುತ್ತದೆ. ‘ಹಿನ್ನೆಲೆ ಮೋಡ್’ನಲ್ಲಿ <ph name="PRODUCT_NAME" /> ರನ್ ಆಗುತ್ತಿದ್ದರೆ, ಕೊನೆಯ ವಿಂಡೊ ಮುಚ್ಚಲ್ಪಟ್ಟಾಗ ಸೆಷನ್ ಮುಚ್ಚದೇ ಇರಬಹುದು. ಈ ವರ್ತನೆಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುವ ಕುರಿತು ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗೆ 'BackgroundModeEnabled' ನೀತಿಯನ್ನು ನೋಡಿ.
 
           ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಇದ್ದರೆ, ‘AllowCookies’ ಬಳಸಲಾಗುತ್ತದೆ ಮತ್ತು ಅದನ್ನು ಬದಲಾಯಿಸಲು ಬಳಕೆದಾರರಿಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ.</translation>
-<translation id="4098957623809244159">ಈ ನೀತಿಯನ್ನು ತಡೆಹಿಡಿಯಲಾಗಿದೆ, ಬದಲಿಗೆ ProxyMode ಬಳಸಿ.
-
-          <ph name="PRODUCT_NAME" /> ಮತ್ತು ARC-ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಬಳಸಿದ ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ನಿರ್ದಿಷ್ಟಪಡಿಸಲು ನಿಮಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ ಮತ್ತು ಬಳಕೆದಾರರು ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬದಲಾಯಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ.
-
-          ಎಂದಿಗೂ ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ಬಳಸದೇ ಇರಲು ಮತ್ತು ಯಾವಾಗಲೂ ನೇರವಾಗಿ ಸಂಪರ್ಕಗೊಳ್ಳಲು ನೀವು ಆಯ್ಕೆಮಾಡಿಕೊಂಡರೆ, ಇತರ ಎಲ್ಲಾ ಆಯ್ಕೆಗಳನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ.
-
-          ಸಿಸ್ಟಂ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬಳಸಲು ನೀವು ಆಯ್ಕೆಮಾಡಿಕೊಂಡರೆ, ಇತರ ಎಲ್ಲಾ ಆಯ್ಕೆಗಳನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ.
-
-          ಹಸ್ತಚಾಲಿತ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ನೀವು ಆಯ್ಕೆಮಾಡಿಕೊಂಡರೆ, ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳನ್ನು ನೀವು 'ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್‌ನ ವಿಳಾಸ ಅಥವಾ URL', 'ಪ್ರಾಕ್ಸಿ .pac ಫೈಲ್‌ನ URL' ಮತ್ತು 'ಪ್ರಾಕ್ಸಿ ಬೈಪಾಸ್ ನಿಯಮಗಳ ಅಲ್ಪವಿರಾಮ-ಪ್ರತ್ಯೇಕಿತ ಪಟ್ಟಿ' ಯಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಬಹುದು.
-
-          ವಿವರವಾದ ಉದಾಹರಣೆಗಳಿಗೆ, ಇಲ್ಲಿಗೆ ಭೇಟಿ ನೀಡಿ:
-          <ph name="PROXY_HELP_URL" />
-
-          ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನೀವು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಕಮ್ಯಾಂಡ್ ಲೈನ್‌ನಿಂದ ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಎಲ್ಲಾ ಪ್ರಾಕ್ಸಿ-ಸಂಬಂಧಿತ ಆಯ್ಕೆಗಳನ್ನು <ph name="PRODUCT_NAME" /> ನಿರ್ಲಕ್ಷಿಸುತ್ತದೆ.
-
-          ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಹಾಗೆಯೇ ಬಿಟ್ಟರೆ ಬಳಕೆದಾರರಿಗೆ ಸ್ವಂತವಾಗಿ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿಕೊಳ್ಳಲು ಅವಕಾಶ ಸಿಗುತ್ತದೆ.</translation>
 <translation id="4103289232974211388">ಬಳಕೆದಾರರ ದೃಢೀಕರಣದ ನಂತರ SAML IdP ಮರುನಿರ್ದೇಶಿಸು</translation>
 <translation id="410478022164847452">AC ಪವರ್‌ನಲ್ಲಿ ಚಾಲನೆಗೊಳ್ಳುವಾಗ ನಿಷ್ಫಲ ಕ್ರಿಯೆಯ ನಂತರ ಬಳಕೆದಾರರ ಇನ್‌ಪುಟ್ ಇಲ್ಲದೆಯೇ ಸಮಯದ ಅಳತೆಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ.
 
@@ -1282,14 +1225,6 @@
 <translation id="5893553533827140852">ಈ ಸೆಟ್ಟಿಂಗ್‌ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ನಂತರ gnubby ದೃಢೀಕರಣ ವಿನಂತಿಗಳನ್ನು ರಿಮೋಟ್‌ ಹೋಸ್ಟ್‌ ಸಂಪರ್ಕದಾದ್ಯಂತ ಪ್ರಾಕ್ಸಿ ಮಾಡಲಾಗುವುದು.
            
            ಈ ಸೆಟ್ಟಿಂಗ್‌ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ ಅಥವಾ ಕಾನ್ಫಿಗರ್ ಮಾಡದಿದ್ದರೆ, gnubby ದೃಢೀಕರಣ ವಿನಂತಿಗಳನ್ನು ಪ್ರಾಕ್ಸಿ ಮಾಡಲಾಗುವುದಿಲ್ಲ.</translation>
-<translation id="5900959132054596599">ಇಲ್ಲಿ ನೀಡಲಾದ ಹೋಸ್ಟ್‌ಗಳ ಪಟ್ಟಿಗೆ <ph name="PRODUCT_NAME" /> ಮತ್ತು ARC-ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಯಾವುದೇ ಪ್ರಾಕ್ಸಿಯನ್ನು ಬೈಪಾಸ್ ಮಾಡುತ್ತದೆ.
-
-          ನೀವು 'ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಹೇಗೆ ನಿರ್ದಿಷ್ಟಪಡಿಸಬೇಕೆಂದು ಆಯ್ಕೆಮಾಡು' ನಲ್ಲಿ ಹಸ್ತಚಾಲಿತ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿಕೊಂಡಿದ್ದರೆ ಮಾತ್ರ ಈ ನೀತಿಯು ಕಾರ್ಯಗತಗೊಳ್ಳುತ್ತದೆ.
-
-          ಪ್ರಾಕ್ಸಿ ನೀತಿಗಳನ್ನು ಹೊಂದಿಸಲು ಇತರ ಯಾವುದೇ ಮೋಡ್ ಅನ್ನು ನೀವು ಆಯ್ಕೆಮಾಡಿಕೊಂಡಿದ್ದರೆ ಈ ನೀತಿಯನ್ನು ನೀವು ಹೊಂದಿಸದೇ ಹಾಗೇ ಬಿಡಬೇಕು.
-
-          ಹೆಚ್ಚು ವಿವರವಾದ ಉದಾಹರಣೆಗಳಿಗೆ, ಇಲ್ಲಿಗೆ ಭೇಟಿ ನೀಡಿ:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">HTTP ಮೂಲಕ ಸ್ವಯಂನವೀಕರಣ ಡೌನ್‌ಲೋಡ್‌ಗಳಿಗೆ ಅನುಮತಿಸಿ</translation>
 <translation id="5921888683953999946">ಲಾಗಿನ್ ಪರದೆಯಲ್ಲಿ ದೊಡ್ಡ ಕರ್ಸರ್ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯದ ಡೀಫಾಲ್ಟ್ ಸ್ಥಿತಿಯನ್ನು ಹೊಂದಿಸಿ.
 
@@ -1770,9 +1705,6 @@
 <translation id="7632724434767231364">GSSAPI ಲೈಬ್ರರಿ ಹೆಸರು</translation>
 <translation id="7635471475589566552"><ph name="PRODUCT_NAME" /> ರಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್‌ನ ಸ್ಥಳವನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಬಳಕೆದಾರರು ಸ್ಥಳವನ್ನು ಬದಲಿಸುವುದರಿಂದ ತಡೆಯುತ್ತದೆ. ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನೀವು ಸಕ್ರಿಯಗೊಳಿಸಿದಲ್ಲಿ, <ph name="PRODUCT_NAME" /> ನಿರ್ದಿಷ್ಟ ಸ್ಥಳವನ್ನು ಬಳಸುತ್ತದೆ. ಕಾನ್ಫಿಗರ್ ಮಾಡಿದ ಸ್ಥಳವನ್ನು ಬೆಂಬಲಿಸದಿದ್ದರೆ, ಬದಲಿಗೆ 'en-US' ಅನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ ಅಥವಾ ಹೊಂದಿಸದಿದ್ದಲ್ಲಿ, ಬಳಕೆದಾರ ನಿರ್ದಿಷ್ಟ ಪಡಿಸಿದ ಪ್ರಾಶಸ್ತ್ಯ ಸ್ಥಳವನ್ನು (ಕಾನ್ಫಿಗರ್ ಮಾಡಿದರೆ) <ph name="PRODUCT_NAME" /> ಬಳಸುತ್ತದೆ, ಸಿಸ್ಟಂ ಸ್ಥಳ ಅಥವಾ 'en-US' ನ ಹಿನ್ನೆಲೆಯ ಸ್ಥಳವನ್ನು ಬಳಸುತ್ತದೆ.</translation>
 <translation id="7651739109954974365">ಸಾಧನಕ್ಕಾಗಿ ಡೇಟಾ ರೋಮಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದೆಯೇ ಎಂಬುದನ್ನು ನಿರ್ಧರಿಸುತ್ತದೆ. 'ನಿಜ' ಎಂದು ಹೊಂದಿಸಿದರೆ, ಡೇಟಾ ರೋಮಿಂಗ್ ಅನ್ನು ಅನುಮತಿಸಲಾಗುತ್ತದೆ. ಕಾನ್ಫಿಗರ್ ಮಾಡದೆ ಹಾಗೆ ಬಿಟ್ಟರೆ ಅಥವಾ 'ತಪ್ಪು' ಎಂದು ಹೊಂದಿಸಿದರೆ, ಡೇಟಾ ರೋಮಿಂಗ್ ಲಭ್ಯವಿರುವುದಿಲ್ಲ.</translation>
-<translation id="7667184304362487902"><ph name="PRODUCT_NAME" /> ಮತ್ತು ARC-ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತದೆ.
-
-      ಈ ನೀತಿಯು ಬಳಕೆಗೆ ಇನ್ನೂ ಸಿದ್ಧವಾಗಿಲ್ಲ, ದಯವಿಟ್ಟು ಅದನ್ನು ಬಳಸಬೇಡಿ.</translation>
 <translation id="76810863974142048">ರಿಮೋಟ್ ಪ್ರವೇಶ ಕ್ಲೈಂಟ್‌ಗಳು ಅದರ ಪ್ರಮಾಣೀಕರಣ ಟೋಕನ್ ಪಡೆಯಬೇಕಾದ URL.
 
           ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸಿದಲ್ಲಿ, ರಿಮೋಟ್ ಪ್ರವೇಶ ಹೋಸ್ಟ್ ಸಂಪರ್ಕಿಸುವ ಸಲುವಾಗಿ ಈ URL ನಿಂದ ಪ್ರಮಾಣೀಕರಣದ ಟೋಕನ್ ಪಡೆಯಲು ಪ್ರಮಾಣೀಕರಿಸುವ ಕ್ಲೈಂಟ್‌ಗಳು ಅಗತ್ಯವಿರುತ್ತವೆ. RemoteAccessHostTokenValidationUrl ಸಂಯೋಗದೊಂದಿಗೆ ಬಳಸಬೇಕಾಗಿರುತ್ತದೆ.
@@ -1980,6 +1912,7 @@
           ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೆ ಬಿಟ್ಟರೆ, 'BlockKeygen' ಅನ್ನು ಬಳಸಲಾಗುತ್ತದೆ ಮತ್ತು ಅದನ್ನು ಬಳಕೆದಾರರಿಗೆ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗಬಹುದು.</translation>
 <translation id="8329984337216493753">ಈ ನೀತಿ ಕೇವಲ ಚಿಲ್ಲರೆ ಮೋಡ್‌ನಲ್ಲಿ ಸಕ್ರಿಯವಾಗಿದೆ. DeviceIdleLogoutTimeout ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿದಾಗ ಲಾಗ್ ಔಟ್ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದಕ್ಕೂ ಮುನ್ನ ಬಳಕೆದಾರನಿಗೆ ತೋರಿಸುವಂತಹ ಕ್ಷಣಗಣನೆ ಕಾಲಮಾಪಕದೊಂದಿಗೆ ಎಚ್ಚರಿಕೆ ಪೆಟ್ಟಿಗೆಯ ಅವಧಿಯನ್ನು ಈ ಪಾಲಿಸಿ ವಿವರಿಸುತ್ತದೆ. ಪಾಲಿಸಿ ಮೌಲ್ಯವನ್ನು ಮಿಲಿಸೆಕುಂಡುಗಳಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಬೇಕಾಗುತ್ತದೆ.</translation>
 <translation id="8344454543174932833">ಮೊದಲ ಚಾಲನೆಯಲ್ಲಿ ಡೀಫಾಲ್ಟ್ ಬ್ರೌಸರ್‌ನಿಂದ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳನ್ನು ಆಮದು ಮಾಡಿ</translation>
+<translation id="8359734107661430198">2008/09/02 ಮೂಲಕ ಉದಾಹರಣೆಗೆ ಅಸಮ್ಮತಿಸಿದ API ವೈಶಿಷ್ಟ್ಯವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="8360452361555133173">OS ಅಪ್‌ಗ್ರೇಡ್ ನಂತರ ಮೊದಲ ಬಾರಿಗೆ ಬ್ರೌಸರ್ ಪ್ರಾರಂಭಗೊಳ್ಳುವ ಸಮಯದಲ್ಲಿ ಸ್ವಾಗತ ಪುಟ ತೋರಿಸಲ್ಪಡುವುದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.
 
       ನೀತಿಯನ್ನು ಸರಿ ಎಂಬುದಾಗಿ ಹೊಂದಿಸಲಾಗಿದ್ದರೆ ಅಥವಾ ಕಾನ್ಫಿಗರ್ ಮಾಡದೇ ಇದ್ದರೆ, OS ಅಪ್‌ಗ್ರೇಡ್ ನಂತರ ಮೊದಲ ಬಾರಿಗೆ ಪ್ರಾರಂಭಿಸುವ ಸಮಯದಲ್ಲಿ ಸ್ವಾಗತ ಪುಟವನ್ನು ಬ್ರೌಸರ್ ಮತ್ತೆ ತೋರಿಸುತ್ತದೆ.
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index 0dfa99a..bb6b05f 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ko">
 <translation id="101438888985615157">180도 화면 회전</translation>
-<translation id="1015272884520659144">웹 애플리케이션 내에서 chrome.usb API를 통해 사용하기 위해 커널 드라이버에서 분리될 수 있는 USB 기기 목록을 정의합니다. 항목은 특정 하드웨어를 판별하기 위한 USB 공급업체 식별자 및 제품 식별자 페어입니다.
-
-      이 정책이 구성되지 않은 경우 분리 가능한 USB 기기 목록은 빈 것으로 간주됩니다.</translation>
 <translation id="1017967144265860778">로그인 화면의 전원 관리</translation>
 <translation id="1019101089073227242">사용자 데이터 디렉토리 설정</translation>
 <translation id="1022361784792428773">사용자가 설치할 수 없는 확장 프로그램 ID(또는 전체 확장 프로그램의 경우 *)</translation>
@@ -73,14 +70,6 @@
       이 정책이 설정되지 않았거나 'false'로 설정된 경우 TLS RC4 암호화 기술이 사용되지 않습니다. 그렇지 않으면 정책을 'true'로 설정해 오래된 서버와의 호환성을 유지할 수 있습니다. 이는 임시 조치이며 서버는 다시 구성해야 합니다.</translation>
 <translation id="1297182715641689552">.pac 프록시 스크립트 사용</translation>
 <translation id="1304973015437969093">자동으로 설치되는 확장 프로그램/앱 ID와 업데이트 URL</translation>
-<translation id="1310699457130669094">여기에서 프록시.pac 파일에 대한 URL을 지정할 수 있습니다.
-
-          이 정책은 '프록시 서버 설정을 지정하는 방법 선택'에서 수동 프록시 설정을 선택한 경우에만 적용됩니다.
-
-          프록시 정책 설정에서 다른 모드를 선택한 경우 이 정책을 설정하지 않아야 합니다.
-
-          자세한 예를 보려면 다음 페이지를 참조하세요.
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">화면을 어둡게 하거나 화면을 끈 직후 사용자의 활동이 감지될 때 화면 어둡게 하기 지연 시간이 조정되는 비율을 지정합니다.
 
           이 정책이 설정된 경우 화면을 어둡게 하거나 화면을 끈 직후 사용자의 활동이 감지될 때 화면 어둡게 하기 지연 시간이 조정되는 비율을 지정합니다. 화면 어둡게 하기 지연 시간이 조정되면, 화면 꺼짐 지연 시간, 화면 잠금 지연 시간 및 유휴 지연 시간이 조정되어 원래 설정된 화면 어둡게 하기 지연 시간과 같은 간격을 유지하도록 조정됩니다.
@@ -163,18 +152,6 @@
 <translation id="1561424797596341174">정책은 원격 액세스 호스트의 디버그 빌드를 무시합니다.</translation>
 <translation id="1583248206450240930">기본으로 <ph name="PRODUCT_FRAME_NAME" /> 사용</translation>
 <translation id="1608755754295374538">별도 메시지를 표시하지 않고 오디오 캡처 기기에 대한 액세스 권한이 부여되는 URL입니다.</translation>
-<translation id="1613574633990410986"><ph name="PRODUCT_NAME" /> 및 ARC 앱이 사용하는 프록시 서버를 지정하도록 하며 사용자가 프록시 설정을 변경하지 못하게 합니다.
-
-      프록시 서버를 사용하지 않고 항상 직접 연결하도록 선택하면 다른 옵션은 모두 무시됩니다.
-
-      프록시 서버를 자동 감지하도록 선택하면 다른 옵션은 모두 무시됩니다.
-
-      자세한 예를 보려면 다음 페이지에 방문하세요.
-      <ph name="PROXY_HELP_URL" />
-
-      이 설정을 사용하도록 설정하면 <ph name="PRODUCT_NAME" /> 및 ARC 앱이 명령줄에서 지정한 모든 프록시 관련 옵션을 무시합니다.
-
-      이 정책을 설정하지 않은 경우 사용자가 직접 프록시 설정을 선택할 수 있습니다.</translation>
 <translation id="1617235075406854669">브라우저 및 다운로드 기록을 삭제하도록 설정합니다.</translation>
 <translation id="1617384279878333801">프로필 관리자에서 사용자 추가 사용 설정</translation>
 <translation id="1655229863189977773">디스크 캐시 크기 설정(바이트)</translation>
@@ -265,14 +242,6 @@
       사용하도록 설정하면 세션이 활성화되고 화면이 잠기지 않은 동안 작업 표시줄에 크고 빨간색인 로그아웃 버튼이 표시됩니다.
 
       사용중지하거나 지정하지 않으면 작업 표시줄에 큰 빨간색의 로그아웃 버튼이 표시되지 않습니다.</translation>
-<translation id="1942957375738056236">여기에서 프록시 서버의 URL을 지정할 수 있습니다.
-
-          이 정책은 '프록시 서버 설정을 지정하는 방법 선택'에서 수동 프록시 설정을 선택한 경우에만 적용됩니다.
-
-          프록시 정책 설정에서 다른 모드를 선택한 경우 이 정책을 설정하지 않아야 합니다.
-
-          더 많은 옵션 및 예제를 보려면 다음 페이지를 참조하세요.
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974"><ph name="PRODUCT_OS_NAME" /> 로그인 화면의 전원 관리를 설정합니다.
 
       이 정책을 사용하면 로그인 화면이 표시된 채 일정 시간 동안 사용자 활동이 없는 경우 <ph name="PRODUCT_OS_NAME" />에서 수행할 작업을 설정할 수 있습니다. 이 정책은 여러 설정을 관리합니다. 개별적인 의미와 값 범위는 세션 내에서 전원 관리를 제어하는 해당 정책을 참조하시기 바랍니다. 이러한 정책의 유일한 예외는 다음과 같습니다.
@@ -661,24 +630,6 @@
 <translation id="3072847235228302527">기기 로컬 계정에 대한 서비스 약관 설정</translation>
 <translation id="3096595567015595053">사용 가능한 플러그인 목록</translation>
 <translation id="3101501961102569744">프록시 서버 설정을 지정하는 방법 선택</translation>
-<translation id="3125884964575432854"><ph name="PRODUCT_NAME" /> 및 ARC 앱이 사용하는 프록시 서버를 지정하도록 하며 사용자가 프록시 설정을 변경하지 못하게 합니다.
-
-          프록시 서버를 사용하지 않고 항상 직접 연결하도록 선택하면 다른 옵션은 모두 무시됩니다.
-
-          시스템 프록시 설정을 사용하도록 선택하면 다른 옵션은 모두 무시됩니다.
-
-          프록시 서버를 자동 감지하도록 선택하면 다른 옵션은 모두 무시됩니다.
-
-          고정 서버 프록시 모드를 선택하면 '프록시 서버의 주소 또는 URL'과 '쉼표로 구분된 프록시 우회 규칙 목록'에서 추가 옵션을 지정할 수 있습니다. ARC 앱은 우선순위가 높은 HTTP 프록시 서버만 사용합니다.
-
-          .pac 프록시 스크립트를 사용하도록 선택하면 URL을 'proxy .pac 파일 관련 URL'의 스크립트로 지정해야 합니다.
-
-          자세한 내용은 다음 페이지를 참조하세요.
-          <ph name="PROXY_HELP_URL" />
-
-          이 설정을 사용하도록 설정하면 <ph name="PRODUCT_NAME" /> 및 ARC 앱은 명령줄에서 지정된 모든 프록시 관련 옵션을 무시합니다.
-
-          이 정책을 설정하지 않은 경우 사용자가 직접 프록시 설정을 선택할 수 있습니다.</translation>
 <translation id="3153348162326497318">사용자가 설치할 수 없는 확장 프로그램을 지정하도록 허용합니다. 이미 설치된 확장 프로그램의 경우 삭제됩니다.
 
           차단목록 값 '*'는 허용목록에 명시적으로 나열되지 않은 경우 모든 확장 프로그램이 차단됨을 의미합니다.
@@ -751,6 +702,7 @@
       이 설정을 사용하거나 설정하지 않으면 사용자는 Google 계정에서 인증한 클라우드 프린트 프록시를 사용할 수 있습니다.
 
       이 설정을 사용중지하면 사용자는 프록시를 사용할 수 없으며 컴퓨터는 <ph name="CLOUD_PRINT_NAME" />와(과)의 프린터 공유를 허용하지 않습니다.</translation>
+<translation id="3297010562646015826">작업 관리자의 종료 프로세스 사용 설정</translation>
 <translation id="3322771899429619102">키 생성 사용이 허용되는 사이트를 지정하는 URL 패턴 목록을 설정할 수 있습니다. URL 패턴이 'KeygenBlockedForUrls'에 있는 경우 이 예외를 무시합니다.
 
           이 정책을 설정하지 않은 경우 'DefaultKeygenSetting' 정책이 설정되어 있으면 해당 정책의 글로벌 기본값이, 그렇지 않으면 사용자 개인 설정의 글로벌 기본값이 모든 사이트에서 사용됩니다.</translation>
@@ -931,22 +883,6 @@
           정책이 '세션이 지속되는 동안 쿠키를 유지합니다'로 설정된 경우에는 세션이 종료되면 쿠키가 삭제됩니다. <ph name="PRODUCT_NAME" />이(가) '백그라운드 모드'로 실행 중인 경우 마지막 창이 닫혀도 세션이 종료되지 않을 수 있습니다. 이 동작 설정에 관한 자세한 내용은 'BackgroundModeEnabled' 정책을 참조하세요.
 
           이 정책이 설정되어 있지 않은 경우에는 'AllowCookies'가 사용되며 사용자가 설정을 변경할 수 있습니다.</translation>
-<translation id="4098957623809244159">이 정책은 사용 중단되었으며 대신 프록시 모드를 사용합니다.
-
-          <ph name="PRODUCT_NAME" />이(가) 사용하는 프록시 서버를 지정할 수 있으며 사용자가 프록시 설정을 변경하지 못하게 합니다.
-
-          프록시 서버를 사용하지 않고 항상 직접 연결하도록 선택하면 다른 옵션은 모두 무시됩니다.
-
-          시스템 프록시 설정을 사용하거나 프록시 서버를 자동 감지하도록 선택하면 다른 옵션은 모두 무시됩니다.
-
-          수동 프록시 설정을 선택하면 '프록시 서버의 주소 또는 URL', 'proxy .pac 파일로 연결되는 URL' 및 '쉼표로 구분된 프록시 우회 규칙 목록'에서 추가 옵션을 지정할 수 있습니다.
-
-          자세한 예를 보려면 다음 페이지에 방문하세요.
-          <ph name="PROXY_HELP_URL" />
-
-          이 설정을 사용하면 <ph name="PRODUCT_NAME" />은(는) 명령줄에서 지정된 모든 프록시 관련 옵션을 무시합니다.
-
-          이 정책을 설정하지 않으면 사용자가 직접 프록시 설정을 선택할 수 있습니다.</translation>
 <translation id="4103289232974211388">사용자 확인 후 SAML IdP로 리디렉션</translation>
 <translation id="410478022164847452">AC 전원으로 실행할 때 사용자 입력이 없어서 유휴 조치가 취해질 때까지 걸리는 시간을 지정합니다.
 
@@ -1426,14 +1362,6 @@
 <translation id="5893553533827140852">이 설정을 사용하도록 설정하면 gnubby 인증 요청이 원격 호스트 연결을 통해 프록시됩니다.
 
           이 설정을 사용 중지하거나 구성하지 않으면 gnubby 인증 요청이 프록시되지 않습니다.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> 및 ARC 앱은 여기에 지정된 호스트 목록에 해당하는 프록시를 우회합니다.
-
-          이 정책은 '프록시 서버 설정을 지정하는 방법 선택'에서 수동 프록시 설정을 선택한 경우에만 적용됩니다.
-
-          프록시 정책을 설정하기 위해 다른 모드를 선택한 경우 이 정책을 설정하지 않아야 합니다.
-
-          자세한 예를 보려면 다음 페이지에 방문하세요.
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">HTTP를 통한 자동 업데이트 다운로드 허용</translation>
 <translation id="5921888683953999946">로그인 화면에서 큰 커서 접근성 기능의 기본 상태를 설정합니다.
 
@@ -1962,9 +1890,6 @@
 
       이 설정을 사용 중지하거나 설정하지 않으면 <ph name="PRODUCT_NAME" />은(는) 사용자가 지정한 기본 언어(설정한 경우)나 시스템 언어 또는 대체 언어인 'en-US'를 사용합니다.</translation>
 <translation id="7651739109954974365">데이터 로밍을 기기에 사용할 지 여부를 결정합니다. true로 설정하면 데이터 로밍이 허용됩니다. 구성하지 않거나 false로 설정하면 데이터 로밍은 사용할 수 없습니다.</translation>
-<translation id="7667184304362487902"><ph name="PRODUCT_NAME" /> 및 ARC 앱 관련 프록시를 설정합니다.
-
-      이 정책은 아직 준비되지 않았으므로 사용하지 마세요.</translation>
 <translation id="76810863974142048">원격 액세스 클라이언트가 인증 토큰을 받는 URL입니다.
 
           이 정책을 설정하면 원격 액세스 호스트에서 연결을 위해 인증 클라이언트에 이 URL로부터 인증 토큰을 받을 것을 요구합니다. RemoteAccessHostTokenValidationUrl과 함께 사용되어야 합니다.
@@ -2194,6 +2119,7 @@
 
       이 정책 값은 밀리초 단위로 지정되어야 합니다.</translation>
 <translation id="8344454543174932833">처음 실행 시 기본 브라우저에서 북마크 가져오기</translation>
+<translation id="8359734107661430198">ExampleDeprecatedFeature API를 2008년 9월 2일까지 사용하도록 설정</translation>
 <translation id="8360452361555133173">OS 업그레이드 후 처음 브라우저를 실행하면 시작 페이지가 표시되도록 합니다.
 
       이 정책이 true로 설정되거나 설정되지 않으면 OS 업그레이드 후 처음 실행할 때 브라우저가 시작 페이지를 다시 표시합니다.
diff --git a/components/policy/resources/policy_templates_lt.xtb b/components/policy/resources/policy_templates_lt.xtb
index a5fca5b..adc9b24 100644
--- a/components/policy/resources/policy_templates_lt.xtb
+++ b/components/policy/resources/policy_templates_lt.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="lt">
 <translation id="101438888985615157">Pasukti ekraną 180 laipsnių kampu</translation>
-<translation id="1015272884520659144">Apibrėžiamas USB įrenginių, kuriuos leidžiama atjungti nuo branduolio tvarkyklės, kad būtų galima naudoti naudojant chrome.usb API tiesiai žiniatinklio programoje, sąrašas. Įrašai – tai USB paslaugos teikėjo identifikatoriaus ir produkto identifikatoriaus poros, nurodančios konkrečią aparatinę įrangą.
-
-      Jei ši politika nesukonfigūruota, manoma, kad atjungiamų USB įrenginių sąrašas tuščias.</translation>
 <translation id="1017967144265860778">Energijos valdymas prisijungimo ekrane</translation>
 <translation id="1019101089073227242">Nustatyti naudotojo duomenų katalogą</translation>
 <translation id="1022361784792428773">Plėtinių, kurių diegti naudotojams turi būti neleidžiama (arba „*“, jei neleidžiama nė vieno), ID</translation>
@@ -73,14 +70,6 @@
       Jei politika nenustatyta arba nustatyta į „false“, TLS RC4 šifruotieji programų komplektai nebus įgalinti. Priešingu atveju ją galima nustatyti į „true“, kad būtų išsaugotas suderinamumas su pasenusiu serveriu. Tai laikina priemonė; serverį reikia iš naujo sukonfigūruoti.</translation>
 <translation id="1297182715641689552">Naudoti .pac tarpinio serverio scenarijų</translation>
 <translation id="1304973015437969093">Automatiškai diegiami plėtinių / programų ID ir atnaujinimo URL</translation>
-<translation id="1310699457130669094">Čia galite nurodyti URL, siejantį su įgaliotojo serverio .pac failu.
-
-          Ši politika galioja, tik jei skiltyje „Pasirinkti, kaip nurodyti įgaliotojo serverio nustatymus“ pasirinkote rankinius įgaliotojo serverio nustatymus.
-
-          Jei pasirinkote kokį nors kitą įgaliotojo serverio politikos nustatymo režimą, neturėtumėte nustatyti šios politikos.
-
-          Jei reikia išsamių pavyzdžių, apsilankykite šiuo adresu:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Nurodomas ekrano užtemdymo delsos mastelio keitimo procentas, kai aptinkama naudotojo veikla ekranui esant užtemdytam ar iškart po to, kai ekranas išjungiamas.
 
          Jei ši politika nustatyta, ji nurodo ekrano užtemdymo delsos mastelio keitimo procentą, kai aptinkama naudotojo veikla ekranui esant užtemdytam ar iškart po to, kai ekranas išjungiamas. Kai užtemdymo delsa nustatyta, ekrano išjungimo, užrakinimo ir neveikos būsenos delsos koreguojamos siekiant išlaikyti vienodą laiką nuo pirminės sukonfigūruotos užtemdymo delsos.
@@ -163,18 +152,6 @@
 <translation id="1561424797596341174">Nuotolinės prieigos prieglobos derinimo versijų politikos pakeitimai</translation>
 <translation id="1583248206450240930">Naudoti „<ph name="PRODUCT_FRAME_NAME" />“ pagal numatytuosius nustatymus</translation>
 <translation id="1608755754295374538">URL, kuriems bus suteikta prieiga prie garso užfiksavimo įrenginių be paraginimo</translation>
-<translation id="1613574633990410986">Leidžia nurodyti „<ph name="PRODUCT_NAME" />“ ir ARC programų naudojamą tarpinį serverį ir neleidžia naudotojams keisti tarpinio serverio nustatymų.
-
-      Jei pasirinksite niekada nenaudoti tarpinio serverio ir visada prisijungti tiesiogiai, bus nepaisoma visų kitų parinkčių.
-
-      Jei pasirinksite automatiškai aptikti tarpinį serverį, bus nepaisoma visų kitų parinkčių.
-
-      Jei reikia išsamių pavyzdžių, apsilankykite adresu
-      <ph name="PROXY_HELP_URL" />
-
-      Jei įgalinsite šį nustatymą, „<ph name="PRODUCT_NAME" />“ ir ARC programos nepaisys visų su tarpiniu serveriu susijusių parinkčių, nurodytų komandos eilutėje.
-
-      Jei šios politikos nuostatos nebus nustatytos, naudotojai galės patys pasirinkti tarpinio serverio nustatymus.</translation>
 <translation id="1617235075406854669">Įgalinti naršyklės ištrynimą ir atsisiuntimo istoriją</translation>
 <translation id="1617384279878333801">Asmens pridėjimo profilių tvarkymo priemonėje įgalinimas</translation>
 <translation id="1655229863189977773">Nustatyti disko talpyklos dydį baitais</translation>
@@ -265,14 +242,6 @@
       Jei įgalinta, kai sesija aktyvi ir ekranas neužrakintas, sistemos dėkle rodomas didelis, raudonas atsijungimo mygtukas.
 
       Jei neleidžiama arba nenurodyta, sistemos dėkle didelis, raudonas atsijungimo mygtukas nerodomas.</translation>
-<translation id="1942957375738056236">Čia galite nurodyti įgaliotojo serverio URL.
-
-          Ši politika pradeda galioti, tik jei pasirinkote rankinius įgaliotojo serverio nustatymus skiltyje „Pasirinkti, kaip nurodyti įgaliotojo serverio nustatymus“.
-
-          Jei pasirinkote kokį nors kitą įgaliotojo serverio politikos nustatymo režimą, turėtumėte nenustatyti šios politikos.
-
-          Jei reikia daugiau parinkčių ir išsamių pavyzdžių, apsilankykite šiuo adresu:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Konfigūruokite maitinimo tvarkymą „<ph name="PRODUCT_OS_NAME" />“ prisijungimo ekrane.
 
       Pagal šią politiką leidžiama konfigūruoti, kaip „<ph name="PRODUCT_OS_NAME" />“ elgiasi, kai tam tikrą laiką naudotojas neatlieka jokių veiksmų, kol rodomas prisijungimo ekranas. Pagal politiką tvarkomi keli nustatymai. Jei norite nustatyti individualią semantiką ir verčių diapazonus, žr. atitinkamą politiką, pagal kurią tvarkomas maitinimas per sesiją. Yra tik du šios politikos nukrypimai:
@@ -663,24 +632,6 @@
 <translation id="3072847235228302527">Nustatyti vietinės įrenginio paskyros paslaugų teikimo sąlygas</translation>
 <translation id="3096595567015595053">Įgalintų papildinių sąrašas</translation>
 <translation id="3101501961102569744">Pasirinkti, kaip nurodyti tarpinio serverio nustatymus</translation>
-<translation id="3125884964575432854">Leidžiama nurodyti „<ph name="PRODUCT_NAME" />“ ir ARC programų naudojamą tarpinį serverį ir naudotojams neleidžiama keisti tarpinio serverio nustatymų.
-
-          Jei pasirinksite niekada nenaudoti tarpinio serverio ir visada prisijungti tiesiogiai, bus nepaisoma visų kitų parinkčių.
-
-          Jei pasirinksite naudoti sistemos tarpinio serverio nustatymus, bus nepaisoma visų kitų parinkčių.
-
-          Jei pasirinksite automatiškai aptikti tarpinį serverį, bus nepaisoma visų kitų parinkčių.
-
-          Jei pasirinksite naudoti fiksuoto tarpinio serverio režimą, galėsite nurodyti kitas parinktis skiltyse „Tarpinio serverio adresas ar URL“ ir „Kableliais atskirtų tarpinio serverio apėjimo taisyklių sąrašas“. ARC programos HTTP tarpinį serverį naudos tik tuo atveju, jei jam bus nustatytas didžiausias pirmumas.
-
-          Jei pasirinksite naudoti .pac tarpinio serverio scenarijų, turėsite nurodyti scenarijaus URL skiltyje „Tarpinio serverio .pac failo URL“.
-
-          Jei reikia išsamių pavyzdžių, apsilankykite adresu
-          <ph name="PROXY_HELP_URL" />
-
-          Jei įgalinsite šį nustatymą, „<ph name="PRODUCT_NAME" />“ ir ARC programos nepaisys visų su tarpiniu serveriu susijusių parinkčių, nurodytų komandos eilutėje.
-
-          Jei ši politika nebus nustatyta, naudotojai galės patys pasirinkti tarpinio serverio nustatymus.</translation>
 <translation id="3153348162326497318">Leidžiama nurodyti, kurių plėtinių naudotojas (-a) NEGALI įdiegti. Jau įdiegti plėtiniai bus pašalinti, jei jie įtraukti į juodąjį sąrašą.
 
           Juodojo sąrašo vertė „*“ reiškia, kad visi plėtiniai įtraukti į juodąjį sąrašą, nebent jie išskirtinai pateikti baltajame sąraše.
@@ -753,6 +704,7 @@
       Jei įgalinsite šį nustatymą arba jo nekonfigūruosite, naudotojai galės įgalinti spausdinimo iš debesies įgaliotąjį serverį, tapatumą nustatydami pagal savo „Google“ paskyrą.
 
       Jei šio nustatymo neleisite, naudotojai negalės įgalinti tarpinio serverio, o kompiuteriui bus neleidžiama bendrinti prijungtų spausdintuvų su „<ph name="CLOUD_PRINT_NAME" />“.</translation>
+<translation id="3297010562646015826">Galėsite užbaigti procesus užduočių tvarkytuvėje</translation>
 <translation id="3322771899429619102">Leidžiama nustatyti URL šablonų, nurodančių svetaines, kuriose leidžiama naudoti rakto generavimą, sąrašą. Jei URL šablonas yra politikoje „KeygenBlockedForUrls“, šių išimčių nepaisoma.
 
           Nenustačius šios politikos visose svetainėse bus naudojama visuotinė numatytoji vertė iš politikos „DefaultKeygenSetting“ (jei nustatyta) arba naudotojo asmeninės konfigūracijos.</translation>
@@ -939,22 +891,6 @@
           Jei ši politika nustatyta į „Palikti slapukus, kol sesija aktyvi“, tada slapukai bus išvalyti uždarius sesiją. Atminkite, kad jei „<ph name="PRODUCT_NAME" />“ veikia foninio atkūrimo režimu, sesijos negalima uždaryti, kai uždaromas paskutinis langas. Daugiau informacijos apie šio veikimo konfigūravimą galite gauti peržiūrėję politiką „BackgroundModeEnabled“.
 
           Jei ši politika nenustatyta, bus naudojama parinktis „AllowCookies“ ir naudotojas galės ją pakeisti.</translation>
-<translation id="4098957623809244159">Ši politika nebenaudojama, vietoje jos naudokite „ProxyMode“.
-
-          Leidžiama nustatyti „<ph name="PRODUCT_NAME" />“ ir ARC programų naudojamą tarpinį serverį ir naudotojams neleidžiama keisti tarpinio serverio nustatymų.
-
-          Jei pasirinksite niekada nenaudoti tarpinio serverio ir visada prisijungti tiesiogiai, bus nepaisoma visų kitų parinkčių.
-
-         Jei pasirinksite naudoti sistemos tarpinį serverį arba automatiškai aptikti tarpinį serverį, bus nepaisoma visų kitų parinkčių.
-
-          Jei pasirinksite neautomatinius tarpinio serverio nustatymus, kitas parinktis galėsite nurodyti skiltyse „Tarpinio serverio adresas ar URL“, „Tarpinio serverio .pac failo URL“ ir „Kableliais atskirtų tarpinio serverio apėjimo taisyklių sąrašas“.
-
-          Jei reikia išsamių pavyzdžių, apsilankykite adresu
-          <ph name="PROXY_HELP_URL" />
-
-          Jei įgalinsite šį nustatymą, „<ph name="PRODUCT_NAME" />“ nepaisys visų su tarpiniu serveriu susijusių parinkčių, nurodytų komandos eilutėje.
-
-          Jei ši politika bus nenustatyta, naudotojai galės patys pasirinkti tarpinio serverio nustatymus.</translation>
 <translation id="4103289232974211388">Patvirtinus naudotoją peradresuoti į „SAML IdP“</translation>
 <translation id="410478022164847452">Nurodoma laiko trukmė be naudotojo įvesties, po kurios neveikos veiksmai atliekami, kai naudojama kintamosios srovės energija.
 
@@ -1437,14 +1373,6 @@
 <translation id="5893553533827140852">Jei šis nustatymas įgalintas, „Gnubby“ autentifikavimo užklausos bus perduotos įgaliotajam serveriui nuotolinės prieglobos ryšiu.
 
           Jei šis nustatymas išjungtas arba nesukonfigūruotas, „Gnubby“ autentifikavimo užklausos nebus perduotos įgaliotajam serveriui.</translation>
-<translation id="5900959132054596599">„<ph name="PRODUCT_NAME" />“ ir ARC programos apeis bet kokį tarpinį serverį iš čia pateikto prieglobų sąrašo.
-
-          Ši politika galioja tik tuo atveju, jei pasirinkote neautomatinius tarpinio serverio nustatymus skiltyje „Pasirinkti, kaip nurodyti tarpinio serverio nustatymus“.
-
-          Jei pasirinkote kokį nors kitą tarpinio serverio politikos nustatymo režimą, šios politikos neturėtumėte nustatyti.
-
-          Jei reikia išsamesnių pavyzdžių, apsilankykite adresu
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Leisti automatinio naujinio atsisiuntimus naudojant HTTP</translation>
 <translation id="5921888683953999946">Nustatyti numatytąją didelio žymeklio pasiekiamumo funkciją prisijungimo ekrane.
 
@@ -1973,9 +1901,6 @@
 
       Jei šio nustatymo neleisite arba nekonfigūruosite, „<ph name="PRODUCT_NAME" />“ naudos naudotojo nurodytą pageidaujamą lokalę (jei ji sukonfigūruota), sistemos lokalę arba atsarginę lokalę „en-US“.</translation>
 <translation id="7651739109954974365">Nustatoma, ar įrenginyje turėtų būti įgalintas duomenų tarptinklinis ryšys. Jei nustatyta į „true“ (tiesa), leidžiamas duomenų tarptinklinis ryšys. Jei nesukonfigūruojama ar nustatoma į „false“, duomenų tarptinklinis ryšys nepasiekiamas.</translation>
-<translation id="7667184304362487902">Sukonfigūruojami „<ph name="PRODUCT_NAME" />“ ir ARC programų tarpinio serverio nustatymai.
-
-      Ši politika dar neparengta naudoti, nenaudokite jos.</translation>
 <translation id="76810863974142048">URL, kur nuotolinės prieigos klientai turėtų gauti autentifikavimo prieigos raktą.
 
           Nustačius šią politiką, nuotolinės prieigos prieglobai reikės autentifikuoti klientus, kad gautų autentifikavimo prieigos raktą iš šio URL, kad galėtų prisijungti. Reikia naudoti su „RemoteAccessHostTokenValidationUrl“.
@@ -2207,6 +2132,7 @@
 
       Politikos vertė turėtų būti nurodyta milisekundėmis.</translation>
 <translation id="8344454543174932833">Importuoti žymes iš numatytosios naršyklės paleidžiant pirmą kartą</translation>
+<translation id="8359734107661430198">Įgalinkite „ExampleDeprecatedFeature“ API iki 2008-09-02</translation>
 <translation id="8360452361555133173">Įgalinamas darbo pradžios puslapio rodymas pirmą kartą paleidus naršyklę po OS naujovinimo.
 
       Jei ši politika nustatyta į „true“ arba yra nesukonfigūruota, naršyklė iš naujo rodys darbo pradžios puslapį pirmą kartą paleidus naršyklę po OS naujovinimo.
diff --git a/components/policy/resources/policy_templates_lv.xtb b/components/policy/resources/policy_templates_lv.xtb
index a7dbd6e..1c939dd5 100644
--- a/components/policy/resources/policy_templates_lv.xtb
+++ b/components/policy/resources/policy_templates_lv.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="lv">
 <translation id="101438888985615157">Pagriezt ekrānu par 180 grādiem</translation>
-<translation id="1015272884520659144">Definē USB ierīces, kuras ir atļauts atvienot no kodola draiveriem, lai tās izmantotu ar chrome.usb API tieši tīmekļa lietojumprogrammā. Katru ierakstu veido USB pakalpojumu sniedzēja identifikators un produkta identifikators, kas identificē aparatūru.
-
-      Ja šī politika netiek konfigurēta, atvienojami USB ierīču saraksts tiek uzskatīts par tukšu.</translation>
 <translation id="1017967144265860778">Barošanas pārvaldība pieteikšanās ekrānā</translation>
 <translation id="1019101089073227242">Iestata lietotāja datu direktoriju</translation>
 <translation id="1022361784792428773">Paplašinājumu ID numuri, kurus lietotājam nav atļauts instalēt (vai *, lai iestatītu visus)</translation>
@@ -73,14 +70,6 @@
       Ja politika nav iestatīta vai ir iestatīta vērtība Nepatiesa, RC4 šifra komplekti standartā TLS netiks iespējoti. Politikai var iestatīt vērtību Patiesa, lai saglabātu saderību ar novecojušu serveri. Tas ir pagaidu risinājums, un serveris ir jākonfigurē atkārtoti.</translation>
 <translation id="1297182715641689552">Izmantot .pac starpniekservera skriptu</translation>
 <translation id="1304973015437969093">Paplašinājumu/lietotņu ID un atjauninājumu vietrāži URL instalēšanai klusajā režīmā</translation>
-<translation id="1310699457130669094">Šeit varat norādīt starpniekservera .pac faila vietrādi URL.
-
-          Šī politika ir spēkā tikai tad, ja iestatījumā Izvēlieties, kādā veidā jānorāda starpniekserveru iestatījumi ir atlasīti manuālie starpniekserveru iestatījumi.
-
-          Šī politika nav jāiestata, ja ir atlasīts jebkurš cits starpniekserveru politiku iestatīšanas režīms.
-
-          Detalizētus piemērus skatiet vietnē:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Norāda aizkavi (procentos) līdz ekrāna aptumšošanai, kad tiek novērota lietotāja darbība, kamēr ekrāns ir aptumšots vai drīz pēc ekrāna izslēgšanas.
 
           Ja šī politika ir iestatīta, tā norāda aizkavi (procentos) līdz ekrāna aptumšošanai, kad tiek novērota lietotāja darbība, kamēr ekrāns ir aptumšots vai drīz pēc ekrāna izslēgšanas. Ja aptumšošanas aizkave ir mainīta, ekrāna izslēgšanas, ekrāna bloķēšanas un gaidstāves aizkaves tiek pielāgotas, lai nodrošinātu tādu pašu starplaiku no ekrāna aptumšošanas aizkaves, kāds bija sākotnēji konfigurēts.
@@ -163,18 +152,6 @@
 <translation id="1561424797596341174">Politikas ignorēšana attālās piekļuves saimniekdatora atkļūdošanas versijām</translation>
 <translation id="1583248206450240930">Pēc noklusējuma lietot <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="1608755754295374538">Vietrāži URL, kuriem tiks nodrošināta piekļuve audio tveršanas ierīcēm bez uzvednes parādīšanas.</translation>
-<translation id="1613574633990410986">Ļauj norādīt <ph name="PRODUCT_NAME" /> un ARC lietotņu izmantoto starpniekserveri un neļauj lietotājiem mainīt starpniekserveru iestatījumus.
-
-      Ja tiek izvēlēts nekad nelietot starpniekserveri un vienmēr lietot tiešo savienojumu, visas pārējās opcijas tiek ignorētas.
-
-      Ja tiek izvēlēts automātiski noteikt starpniekserveri, visas pārējās opcijas tiek ignorētas.
-
-      Detalizēti piemēri ir pieejami vietnē:
-      <ph name="PROXY_HELP_URL" />
-
-      Ja šis iestatījums ir iespējots, <ph name="PRODUCT_NAME" /> un ARC lietotnes ignorē visas ar starpniekserveri saistītās komandrindā norādītās opcijas.
-
-      Ja šīs politikas nav iestatītas, lietotāji varēs izvēlēties savus starpniekserveru iestatījumus.</translation>
 <translation id="1617235075406854669">Iespējot pārlūka un lejupielādes vēstures dzēšanu</translation>
 <translation id="1617384279878333801">Personas pievienošanas iespējošana profilu pārvaldniekā</translation>
 <translation id="1655229863189977773">Iestatīt diska kešatmiņas lielumu baitos</translation>
@@ -265,14 +242,6 @@
       Ja opcija būs iespējota, sistēmas teknē tiks attēlota liela atteikšanās poga sarkanā krāsā, kamēr sesija būs aktīva.
 
       Ja opcija būs atspējota vai nebūs norādīta, sistēmas teknē netiks rādīta liela atteikšanās pogas sarkanā krāsā.</translation>
-<translation id="1942957375738056236">Šeit varat norādīt starpniekservera URL.
-
-          Šī politika ir spēkā tikai tad, ja iestatījumā Izvēlieties, kādā veidā jānorāda starpniekserveru iestatījumi ir atlasīti manuālie starpniekserveru iestatījumi.
-
-          Šī politika nav jāiestata, ja ir atlasīts jebkurš cits starpniekserveru politiku iestatīšanas režīms.
-
-          Citas iespējas un detalizētus piemērus skatiet vietnē:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Konfigurējiet barošanas pārvaldību operētājsistēmas <ph name="PRODUCT_OS_NAME" /> pieteikšanās ekrānā.
 
       Šī politika ļauj konfigurēt, kā operētājsistēma <ph name="PRODUCT_OS_NAME" /> darbosies, ja lietotājs noteiktā laika periodā neveiks nekādas darbības, kamēr tiek rādīts pieteikšanās ekrāns. Politika nosaka vairākus iestatījumus. Šo iestatījumu nozīmi un vērtību diapazonus skatiet atbilstošajās politikās, kas regulē barošanas pārvaldību sesijas ietvaros. Vienīgās novirzes no šīm politikām ir šādas:
@@ -664,24 +633,6 @@
 <translation id="3072847235228302527">Ierīces lokālā konta pakalpojumu sniegšanas noteikumu iestatīšana</translation>
 <translation id="3096595567015595053">Iespējoto spraudņu saraksts</translation>
 <translation id="3101501961102569744">Izvēlas, kā jānorāda starpniekservera iestatījumi</translation>
-<translation id="3125884964575432854">Ļauj norādīt <ph name="PRODUCT_NAME" /> un ARC lietotņu izmantoto starpniekserveri un neļauj lietotājiem mainīt starpniekserveru iestatījumus.
-
-          Ja tiek izvēlēts nekad nelietot starpniekserveri un vienmēr lietot tiešo savienojumu, visas pārējās opcijas tiek ignorētas.
-
-          Ja tiek izvēlēts lietot sistēmas starpniekservera iestatījumus, visas pārējās opcijas tiek ignorētas.
-
-          Ja tiek izvēlēts automātiski noteikt starpniekserveri, visas pārējās opcijas tiek ignorētas.
-
-          Ja tiek izvēlēts fiksēta servera starpniekservera režīms, laukos “Starpniekservera adrese vai URL” un “Ar komatu atdalītu starpniekserveru apiešanas kārtulu saraksts” var norādīt papildu opcijas. ARC lietotnēs tiks izmantots tikai tas HTTP starpniekserveris, kuram būs augstākā prioritāte.
-
-          Ja tiek izvēlēts izmantot .pac starpniekservera skriptu, laukā “URL uz starpniekservera .pac failu” ir jānorāda šī skripta URL.
-
-          Detalizēti piemēri ir pieejami vietnē:
-          <ph name="PROXY_HELP_URL" />
-
-          Ja šis iestatījums ir iespējots, <ph name="PRODUCT_NAME" /> un ARC lietotnes ignorē visas ar starpniekserveri saistītās komandrindā norādītās opcijas.
-
-          Ja šīs politikas nav iestatītas, lietotāji varēs izvēlēties savus starpniekserveru iestatījumus.</translation>
 <translation id="3153348162326497318">Ļauj norādīt, kurus paplašinājumus lietotājiem NAV atļauts instalēt. Jau instalētie paplašinājumi, ja tie ir iekļauti melnajā sarakstā, tiks noņemti.
 
           Melnā saraksta vērtība * nozīmē to, ka melnajā sarakstā ir iekļauti visi paplašinājumi, ja vien tie nav īpaši iekļauti baltajā sarakstā.
@@ -754,6 +705,7 @@
       Ja šis iestatījums ir iespējots vai nav konfigurēts, lietotāji var iespējot mākoņdrukas starpniekserveri, autentifikācijai izmantojot savu Google kontu.
 
       Ja šis iestatījums ir atspējots, lietotāji nevarēs iespējot starpniekserveri un ierīce nevarēs koplietot tai pievienotos printerus ar <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Iespējo procesu beigšanu uzdevumu pārvaldniekā</translation>
 <translation id="3322771899429619102">Ļauj iestatīt URL šablonu sarakstu, kurā ir norādītas vietnes, kam ir atļauts izmantot atslēgu ģenerēšanu. Ja URL šablons ir iestatīts politikā “KeygenBlockedForUrls”, šie izņēmumi tiek ignorēti.
 
           Ja šī politika nav iestatīta, visām vietnēm tiks izmantota globālā noklusējuma vērtība no politikas “DefaultKeygenSetting” (ja tā ir iestatīta) vai pretējā gadījumā no lietotāja personīgās konfigurācijas.</translation>
@@ -938,22 +890,6 @@
           Ja politikai tiek iestatīta vērtība “Sīkfailu saglabāšana sesijas laikā”, sesijas beigās sīkfaili tiek notīrīti. Ņemiet vērā: ja pārlūks <ph name="PRODUCT_NAME" /> darbojas fona režīmā, sesija var netikt aizvērta līdz ar pārlūka pēdējā loga aizvēršanu. Plašāku informāciju par šādas darbības konfigurēšanu skatiet politikā BackgroundModeEnabled.
 
           Ja šī politika nav iestatīta, tiek izmantota politika AllowCookies, un lietotājs var to mainīt.</translation>
-<translation id="4098957623809244159">Šī politika ir novecojusi. Tās vietā lietojiet ProxyMode.
-
-          Ļauj norādīt <ph name="PRODUCT_NAME" /> un ARC lietotņu izmantoto starpniekserveri un neļauj lietotājiem mainīt starpniekserveru iestatījumus.
-
-          Ja tiek izvēlēts nekad nelietot starpniekserveri un vienmēr lietot tiešo savienojumu, visas pārējās opcijas tiek ignorētas.
-
-          Ja tiek izvēlēts lietot sistēmas starpniekservera iestatījumus vai automātiski noteikt starpniekserveri, visas pārējās opcijas tiek ignorētas.
-
-           Ja tiek izvēlēti manuāli starpniekservera iestatījumi, laukos “Starpniekservera adrese vai URL”, “URL uz starpniekservera .pac failu” un “Ar komatu atdalītu starpniekserveru apiešanas kārtulu saraksts” var norādīt papildu opcijas.
-
-          Detalizēti piemēri ir pieejami vietnē:
-          <ph name="PROXY_HELP_URL" />
-
-          Ja šis iestatījums ir iespējots, <ph name="PRODUCT_NAME" /> ignorē visas ar starpniekserveri saistītās komandrindā norādītās opcijas.
-
-          Ja šīs politikas nav iestatītas, lietotāji varēs izvēlēties savus starpniekserveru iestatījumus.</translation>
 <translation id="4103289232974211388">Pēc lietotāja apstiprinājuma saņemšanas novirzīt uz SAML identitātes nodrošinātāju</translation>
 <translation id="410478022164847452">Tiek norādīts laika periods, kurā lietotājam ir jāveic kāda darbība, pretējā gadījumā rodas dīkstāve (ja ierīce darbojas ar maiņstrāvu).
 
@@ -1437,14 +1373,6 @@
 <translation id="5893553533827140852">Ja šis iestatījums ir iespējots, Gnubby autentifikācijas pieprasījumiem tiks izmantoti starpniekserveri attālā saimniekdatora tīklā.
 
           Ja šis iestatījums ir atspējots vai nav konfigurēts, Gnubby autentifikācijas pieprasījumiem netiks izmantoti starpniekserveri.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> un ARC lietotnes apies visus šajā sarakstā iekļauto saimniekdatoru starpniekserverus.
-
-          Šī politika ir spēkā tikai tad, ja iestatījumā “Izvēlieties, kā jānorāda starpniekserveru iestatījumi” ir atlasīti manuālie starpniekserveru iestatījumi.
-
-          Šī politika nav jāiestata, ja ir atlasīts jebkurš cits starpniekserveru politiku iestatīšanas režīms.
-
-          Detalizētus piemērus skatiet vietnē:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Atļaut automātiski atjaunināt lejupielādes, izmantojot HTTP</translation>
 <translation id="5921888683953999946">Iestatiet lielā kursora pieejamības funkcijas noklusējuma stāvokli pieteikšanās ekrānā.
 
@@ -1970,9 +1898,6 @@
 
       Ja šis iestatījums ir atspējots vai nav iestatīts, <ph name="PRODUCT_NAME" /> lieto lietotāja vēlamo lokalizāciju (ja tā ir konfigurēta), sistēmas lokalizāciju vai atkāpšanās lokalizāciju en-US.</translation>
 <translation id="7651739109954974365">Nosaka, vai datu viesabonēšana ir jāiespējo ierīcei. Ja politika ir iestatīta uz Patiesa, datu viesabonēšana ir atļauta. Ja politika nav konfigurēta vai iestatīta uz Aplama, datu viesabonēšana nav atļauta.</translation>
-<translation id="7667184304362487902">Konfigurē pakalpojuma <ph name="PRODUCT_NAME" /> un ARC lietotņu starpniekservera iestatījumus.
-
-      Šī politika nav vēl gatava lietošanai; nelietojiet to.</translation>
 <translation id="76810863974142048">Vietrādis URL, kurā attālās piekļuves klientiem ir jāiegūst autentifikācijas pilnvara.
 
           Ja šī politika ir iestatīta, attālās piekļuves saimniekdatorā klientiem, kas autentificējas, tiek prasīts iegūt autentifikācijas pilnvaru no šī vietrāža URL, lai izveidotu savienojumu. Jāizmanto kopā ar politiku RemoteAccessHostTokenValidationUrl.
@@ -2205,6 +2130,7 @@
 
       Politikas vērtība ir jānorāda milisekundēs.</translation>
 <translation id="8344454543174932833">Grāmatzīmju importēšana no noklusējuma pārlūka pirmajā palaišanas reizē</translation>
+<translation id="8359734107661430198">Iespējot ExampleDeprecatedFeature API, kas bija derīgs līdz 02.09.2008.</translation>
 <translation id="8360452361555133173">Tiek iespējota sveiciena lapas rādīšana, pēc operētājsistēmas jaunināšanas pirmo reizi palaižot pārlūku.
 
       Ja politikai ir iestatīta vērtība Patiesa vai tā nav konfigurēta, pārlūkā tiks atkārtoti rādīta sveiciena lapa, pēc operētājsistēmas jaunināšanas pirmo reizi palaižot pārlūku.
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb
index e68e2d89..f4b2b665 100644
--- a/components/policy/resources/policy_templates_ml.xtb
+++ b/components/policy/resources/policy_templates_ml.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ml">
 <translation id="101438888985615157">സ്‌ക്രീൻ 180 ഡിഗ്രി തിരിക്കുക</translation>
-<translation id="1015272884520659144">ഒരു വെബ് അപ്ലിക്കേഷനിൽ chrome.usb API വഴി ഉപയോഗിക്കുന്നതിന്, kernel ഡ്രൈവറിൽ നിന്ന് വേർപെടുത്താൻ അനുവാദമുള്ള USB ഉപകരണങ്ങളുടെ ലിസ്‌റ്റ് നിർവ്വചിക്കുന്നു. ഒരു നിർദ്ദിഷ്‌ട ഹാർഡ്‌വെയർ തിരിച്ചറിയുന്നതിനുള്ള USB വെൻഡർ ഐഡന്റിഫയർ, ഉൽപ്പന്ന ഐഡന്റിഫയർ എന്നിവയുടെ ജോടികളാണ് എൻട്രികൾ.
-
-      ഈ നയം കോൺ‌ഫിഗർ ചെയ്‌തിട്ടില്ലെങ്കിൽ, വേർപെടുത്താനാകുന്ന USB ഉപകരണങ്ങളുടെ ലിസ്‌റ്റ് ശൂന്യമായി കണക്കാക്കുന്നതാണ്.</translation>
 <translation id="1017967144265860778">ലോഗിൻ സ്‌ക്രീനിലെ പവർ മാനേജുമെന്റ്</translation>
 <translation id="1019101089073227242">ഉപയോക്തൃ ഡാറ്റ ഡയറക്‌ടറി ക്രമീകരിക്കുക</translation>
 <translation id="1022361784792428773">ഇന്‍സ്റ്റാള്‍ ചെയ്യുന്നതില്‍ നിന്ന് ഉപയോക്താവ് തടയേണ്ട വിപുലീകരണ ID-കള്‍ (അല്ലെങ്കില്‍ എല്ലാത്തിനുമായി *)</translation>
@@ -71,14 +68,6 @@
       നയം സജ്ജമാക്കിയിട്ടില്ലെങ്കിലോ, ഈ നയം false ആയി സജ്ജമാക്കിയെങ്കിലോ TLS-ലെ RC4 സൈഫർ സ്യൂട്ടുകൾ പ്രവർത്തനക്ഷമമാക്കില്ല. അല്ല്ലെങ്കിൽ ഇത് ഒരു കാലഹരണപ്പെട്ട സെർവറുമായി അനുയോജ്യത നിലനിർത്താൻ true ആയി സജ്ജമാക്കിയേക്കാം. ഇതൊരു സ്‌റ്റോപ്പ്ഗ്യാപ്പ് അളവായതിനാൽ സെർവർ വീണ്ടും കോൺഫിഗർ ചെയ്യേണ്ടതുണ്ട്.</translation>
 <translation id="1297182715641689552">ഒരു .pac പ്രോക്സി സ്ക്രിപ്റ്റ് ഉപയോഗിക്കുക</translation>
 <translation id="1304973015437969093">ഉപയോക്തൃ ശ്രദ്ധ ആവശ്യമില്ലാതെ തന്നെ ഇൻസ്റ്റാളുചെയ്യേണ്ട വിപുലീകരണ/ആപ്പ് ഐഡികളും അപ്‌ഡേറ്റ് URL-കളും</translation>
-<translation id="1310699457130669094">ഒരു പ്രോക്സി .pac ഫയലിലേക്കായി ഇവിടെ നിങ്ങൾക്കൊരു URL നിർദ്ദേശിക്കാം.
-
-          'Choose how to specify proxy server settings' എന്നതിൽ മാനുവൽ പ്രോക്സി ക്രമീകരണം തിരഞ്ഞെടുത്തെങ്കിൽ മാത്രമേ ഈ നയം പ്രാബല്യത്തിൽ വരികയുള്ളൂ.
-
-          നിങ്ങൾ മറ്റെതെങ്കിലും പ്രോക്സി ക്രമീകരണം തിരഞ്ഞെടുത്തിട്ടുണ്ടെങ്കിൽ ഈ നയം നിങ്ങൾ വിടേണ്ടതാണ്.
-
-          വിശദമായ വിവരങ്ങൾക്ക്, സന്ദർശിക്കുക:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">സ്‌ക്രീൻ മങ്ങുന്നതിനിടയിലോ സ്‌ക്രീൻ ഓഫായ ഉടനെയോ ഉപയോക്താവിന്റെ പ്രവർത്തനം നിരീക്ഷിക്കപ്പെടുമ്പോൾ സ്‌ക്രീൻ മങ്ങുന്നതിന്റെ കാലതാമസമനുസരിച്ചുള്ള ശതമാനം വ്യക്തമാക്കുന്നു.
 
          ഈ നയം സജ്ജമാക്കുകയാണെങ്കിൽ, സ്‌ക്രീൻ മങ്ങുന്നതിനിടയിലോ സ്‌ക്രീൻ ഓഫായ ഉടനെയോ ഉപയോക്താവിന്റെ പ്രവർത്തനം നിരീക്ഷിക്കപ്പെടുമ്പോൾ സ്‌ക്രീൻ മങ്ങുന്നതിന്റെ കാലതാമസമനുസരിച്ചുള്ള ശതമാനം വ്യക്തമാക്കുന്നു. സ്‌ക്രീൻ മങ്ങുന്നതിന്റെ കാലതാമസം സ്‌കെയിൽ ചെയ്‌തിരിക്കുമ്പോൾ, സ്‌ക്രീൻ ഓഫാകുന്നതിനും സ്‌ക്രീൻ ലോക്കാകുന്നതിനും നിഷ്‌ക്രിയമാകുന്നതിനുമുള്ള കാലതാമസം, സ്‌ക്രീൻ മങ്ങുന്നതിന്റെ കാലതാമസവുമായുള്ള സമാന സമയം തന്നെ നിലനിർത്തുന്നതിനായി തുടക്കത്തിൽ തന്നെ കോൺഫിഗർ ചെയ്‌തിരിക്കുന്ന രീതിയിൽ ക്രമീകരിക്കപ്പെടുന്നു.
@@ -161,18 +150,6 @@
 <translation id="1561424797596341174">റിമോട്ട് ആക്‌സസ്സ് ഹോസ്‌റ്റിന്റെ ഡീബഗ് ബിൽഡുകൾക്കായി നയം അസാധുവാക്കുന്നു</translation>
 <translation id="1583248206450240930">സ്ഥിരസ്ഥിതിയായി <ph name="PRODUCT_FRAME_NAME" /> ഉപയോഗിക്കുക</translation>
 <translation id="1608755754295374538">ആവശ്യപ്പെടാതെ തന്നെ ഓഡിയോ ക്യാപ്‌ചർ ഉപകരണങ്ങളിലേക്ക് ആക്‌സസ്സ് ലഭിക്കുന്ന URL-കൾ</translation>
-<translation id="1613574633990410986"><ph name="PRODUCT_NAME" />, ARC-ആപ്‌സ് എന്നിവ ഉപയോഗിക്കുന്ന പ്രോക്‌സി സെർവർ വ്യക്തമാക്കാനും, പ്രോക്‌സി ക്രമീകരണം മാറ്റുന്നതിൽ നിന്ന് ഉപയോക്താക്കളെ തടയാനും നിങ്ങളെ അനുവദിക്കുന്നു.
-
-      ഒരിക്കലും പ്രോക്‌സി സെർവർ ഉപയോഗിക്കാതിരിക്കാനും എല്ലായ്‌പ്പോഴും നേരിട്ട് കണക്‌റ്റുചെയ്യാനും നിങ്ങൾ തീരുമാനിക്കുകയാണെങ്കിൽ മറ്റെല്ലാ ഓപ്‌ഷനുകളും അവഗണിക്കപ്പെടും.
-
-      നിങ്ങൾ പ്രോക്‌സി സെർവറിനെ സ്വയം കണ്ടെത്താൻ തിരഞ്ഞെടുക്കുകയാണെങ്കിൽ, മറ്റെല്ലാ ഓപ്‌ഷനുകളും അവഗണിക്കപ്പെടും.
-
-      വിശദമായ ഉദാഹരണങ്ങൾക്ക്, ഇത് സന്ദർശിക്കുക:
-      <ph name="PROXY_HELP_URL" />
-
-      നിങ്ങൾ ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കുകയാണെങ്കിൽ, <ph name="PRODUCT_NAME" />, ARC-ആപ്‌സ് എന്നിവ കമാൻഡ് ലൈനിൽ നിന്ന് വ്യക്തമാക്കിയ പ്രോക്‌സിയുമായി ബന്ധപ്പെട്ട എല്ലാ ഓപ്‌ഷനുകളെയും അവഗണിക്കും.
-
-      ഈ നയങ്ങൾ സജ്ജമാക്കാതെ വിടുന്നത്, ഉപയോക്താക്കളെ പ്രോക്‌സി ക്രമീകരണം സ്വയം തിരഞ്ഞെടുക്കാൻ അനുവദിക്കുന്നതാണ്.</translation>
 <translation id="1617235075406854669">ബ്രൗസർ, ഡൗൺലോഡ് ചരിത്രം എന്നിവ ഇല്ലാതാക്കുന്നത് പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="1617384279878333801">പ്രൊഫൈൽ മാനേജറിൽ വ്യക്തിയേ ചേർക്കുന്നത്  പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="1655229863189977773">ഡിസ്‌ക് കാഷെ വലുപ്പം ബൈറ്റുകളിൽ സജ്ജമാക്കുക</translation>
@@ -265,14 +242,6 @@
       പ്രാപ്‌തമാക്കിയെങ്കിൽ, സെഷൻ സജീവമായി, സ്‌ക്രീൻ ലോക്ക് ആകാതെയിരിക്കുമ്പോൾ ഒരു വലിയ ചുവപ്പ് വർണ്ണത്തിലുള്ള ലോഗ്ഔട്ട് ബട്ടൺ കാണിക്കും.
 
       അപ്രാപ്‌തമാക്കിയിരിക്കുകയോ നിർദ്ദേശിച്ചിട്ടില്ലെങ്കിലോ സിസ്റ്റം ട്രേയിൽ വലിയ ചുവപ്പ് വർണ്ണത്തിലുള്ള ലോഗ്ഔട്ട് ബട്ടൺ കാണിക്കില്ല.</translation>
-<translation id="1942957375738056236">പ്രോക്‌സി സെർവറിന്റെ URL നിങ്ങൾക്ക് ഇവിടെ വ്യക്തമാക്കാൻ കഴിയുന്നതാണ്.
-
-          'പ്രോക്‌സി സെർവർ ക്രമീകരണം എങ്ങനെ വ്യക്തമാക്കാമെന്ന് തിരഞ്ഞെടുക്കുക' എന്നതിൽ നിങ്ങൾ സ്വമേധയാലുള്ള പ്രോക്‌സി ക്രമീകരണം തിരഞ്ഞെടുക്കുകയാണെങ്കിൽ മാത്രമേ ഈ നയം പ്രാബല്യത്തിൽ വരുകയുള്ളൂ.
-
-          ക്രമീകരണ പ്രോക്‌സി നയങ്ങൾക്കായി മറ്റേതെങ്കിലും മോഡ് തിരഞ്ഞെടുത്താൽ നിങ്ങൾ ഈ നയം സജ്ജീകരിക്കാത്ത നിലയിലാക്കണം.
-
-          കൂടുതൽ ഓപ്‌ഷനുകൾക്കും വിശദമായ ഉദാഹരണങ്ങൾക്കും, സന്ദർശിക്കുക:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974"><ph name="PRODUCT_OS_NAME" /> എന്നതിലെ ലോഗിൻ സ്ക്രീനിൽ പവർ മാനേജുമെന്റ് കോൺഫിഗർ ചെയ്യുക.
 
       ലോഗിൻ സ്ക്രീൻ കാണിച്ചിരിക്കുമ്പോൾ കുറച്ച് സമയത്തേയ്ക്ക് ഉപയോക്തൃ പ്രവർത്തനങ്ങൾ ഒന്നും ഇല്ലാതിരിക്കുമ്പോൾ <ph name="PRODUCT_OS_NAME" /> എങ്ങനെ പ്രവർത്തിക്കുന്നുവെന്ന് കോൺഫിഗർ ചെയ്യാൻ ഈ നയം നിങ്ങളെ അനുവദിക്കുന്നു. ഈ നയം ഒന്നിലേറെ ക്രമീകരണങ്ങളെ നിയന്ത്രിക്കുന്നു. അവയുടെ വ്യക്തിഗത സെമാന്റിക്കുകൾക്കും മൂല്യ ശ്രേണികൾക്കും, ഒരു സെഷനിലെ പവർ മാനേജുമെന്റ് നിയന്ത്രിയ്ക്കുന്ന അനുബന്ധ നയങ്ങൾ കാണുക. ഈ നയങ്ങളിൽ വ്യക്തമാക്കിയിട്ടുള്ളതിൽ നിന്നും വ്യത്യസ്‌തമായി സംഭവിക്കുന്നവ ഇവയാണ്:
@@ -665,24 +634,6 @@
 <translation id="3072847235228302527">ഒരു ഉപകരണ-പ്രാദേശിക അക്കൗണ്ടിനായി സേവന നിബന്ധനകൾ സജ്ജമാക്കുക</translation>
 <translation id="3096595567015595053">പ്രാപ്തമാക്കിയ പ്ലഗിനുകളുടെ ലിസ്റ്റ്</translation>
 <translation id="3101501961102569744">പ്രോക്സി സെര്‍വര്‍ ക്രമീകരണം എങ്ങനെ നിര്‍ദേശിക്കണമെന്ന് തെരഞ്ഞെടുക്കുക</translation>
-<translation id="3125884964575432854"><ph name="PRODUCT_NAME" />, ARC-ആപ്‌സ് എന്നിവ ഉപയോഗിക്കുന്ന പ്രോക്‌സി സെർവർ വ്യക്തമാക്കാനും, പ്രോക്‌സി ക്രമീകരണം മാറ്റുന്നതിൽ നിന്ന് ഉപയോക്താക്കളെ തടയാനും നിങ്ങളെ അനുവദിക്കുന്നു.
-
-          ഒരിക്കലും പ്രോക്‌സി സെർവർ ഉപയോഗിക്കാതിരിക്കാനും എല്ലായ്‌പ്പോഴും നേരിട്ട് കണക്‌റ്റുചെയ്യാനും നിങ്ങൾ തീരുമാനിക്കുകയാണെങ്കിൽ, മറ്റെല്ലാ ഓപ്‌ഷനുകളും അവഗണിക്കപ്പെടും.
-
-          നിങ്ങൾ സിസ്‌റ്റം പ്രോക്‌സി ക്രമീകരണം ഉപയോഗിക്കാനാണ് തീരുമാനിക്കുന്നതെങ്കിൽ, മറ്റെല്ലാ ഓപ്‌ഷനുകളും അവഗണിക്കപ്പെടും.
-
-          നിങ്ങൾ പ്രോക്‌സി സെർവർ സ്വയം കണ്ടെത്താൻ തീരുമാനിക്കുകയാണെങ്കിൽ, മറ്റെല്ലാ ഓപ്‌ഷനുകളും അവഗണിക്കപ്പെടും.
-
-          ഫിക്‌സഡ് സെർവർ പ്രോക്‌സി മോഡ് തിരഞ്ഞെടുക്കുകയാണെങ്കിൽ, നിങ്ങൾക്ക് ' പ്രോക്‌സി സെർവറിന്റെ വിലാസം അല്ലെങ്കിൽ URL', 'പ്രോക്‌സി ബൈപ്പാസ് നയങ്ങളുടെ കോമയാൽ വേർതിരിക്കപ്പെട്ട ലിസ്‌റ്റ്' എന്നിവയിൽ തുടർന്നുള്ള ഓപ്‌ഷനുകൾ വ്യക്തമാക്കാൻ കഴിയും. ARC-ആപ്‌സ്, കൂടുതൽ മുൻഗണനയോടെ HTTP പ്രോക്‌സി സെർവർ മാത്രമേ ഉപയോഗിക്കുകയുള്ളൂ.
-
-          ഒരു .pac പ്രോക്‌സി സ്‌ക്രിപ്‌റ്റ് ഉപയോഗിക്കാൻ തീരുമാനിക്കുകയാണെങ്കിൽ, നിങ്ങൾ 'ഒരു പ്രോക്‌സി .pac ഫയലിലേക്കുള്ള URL' എന്നതിലെ സ്‌ക്രിപ്‌റ്റിൽ URL വ്യക്തമാക്കേണ്ടതാണ്.
-
-          വിശദമായ ഉദാഹരണങ്ങൾക്ക്, ഇത് സന്ദർശിക്കുക:
-          <ph name="PROXY_HELP_URL" />
-
-          നിങ്ങൾ ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കുകയാണെങ്കിൽ, <ph name="PRODUCT_NAME" />, ARC-ആപ്‌സ് എന്നിവ കമാൻഡ് ലൈനിൽ നിന്നും വ്യക്തമാക്കിയ പ്രോക്‌സിയുമായി ബന്ധപ്പെട്ട എല്ലാ ഓപ്‌ഷനുകളെയും അവഗണിക്കും.
-
-          ഈ നയം സജ്ജമാക്കാതെ വിടുന്നത് ഉപയോക്താക്കളെ പ്രോക്‌സി ക്രമീകരണം സ്വയം തിരഞ്ഞെടുക്കാൻ അനുവദിക്കും.</translation>
 <translation id="3153348162326497318">ഏതെല്ലാം വിപുലീകരണങ്ങളാണ് ഉപയോക്താക്കൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ കഴിയാത്തതെന്ന് വ്യക്തമാക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. ഇതിനകം ഇൻസ്റ്റാൾ ചെയ്‌ത വിപുലീകരണങ്ങൾ ബ്ലാക്ക്‌ലിസ്റ്റിൽ ഉൾപ്പെട്ടവയാണെങ്കിൽ അവ നീക്കംചെയ്യപ്പെടും.
 
           '*' എന്നതിന്റെ ഒരു ബ്ലാക്ക്‌ലിസ്റ്റ് മൂല്യം എന്നതിനർത്ഥം വൈറ്റ്‌ലിസ്റ്റിൽ സ്‌പഷ്‌ടമായി ലിസ്റ്റുചെയ്യാത്ത എല്ലാ വിപുലീകരണങ്ങളും ബ്ലാക്ക്‌ലിസ്റ്റിൽ ഉൾപ്പെടുത്തുമെന്നതാണ്.
@@ -755,6 +706,7 @@
       ഈ ക്രമീകരണം പ്രാപ്‌തമാക്കിയിട്ടുണ്ട് അല്ലെങ്കിൽ കോൺഫിഗർ ചെയ്‌തില്ലെങ്കിൽ, ഉപയോക്താക്കൾക്ക് അവരുടെ Google അക്കൗണ്ട് ഉപയോഗിച്ചുള്ള പ്രമാണീകരണം വഴി ക്ലൗഡ് പ്രിന്റ് പ്രാപ്‌തമാക്കാൻ കഴിയും.
 
       ഈ ക്രമീകരണം അപ്രാപ്‌തമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഉപയോക്താക്കൾക്ക് പ്രോക്‌സി പ്രാപ്‌തമാക്കാൻ കഴിയില്ല, മെഷീനുകൾ അവയുടെ പ്രിന്ററുകളെ <ph name="CLOUD_PRINT_NAME" /> എന്നതിനോടൊപ്പം പങ്കിടുന്നതിന് അനുവദിക്കില്ല.</translation>
+<translation id="3297010562646015826">ടാസ്‌ക് മാനേജറിൽ അവസാനിപ്പിക്കുന്ന പ്രോസസ്സുകൾ പ്രവർത്തനക്ഷമമാക്കുന്നു</translation>
 <translation id="3322771899429619102">കീ സൃഷ്‌ടിക്കലിന് ഉപയോഗിക്കാൻ അനുവദിക്കുന്ന സൈറ്റുകൾ വ്യക്തമാക്കുന്ന url പാറ്റേണുകളുടെ ഒരു ലിസ്‌റ്റ് സജ്ജമാക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. url പാറ്റേൺ 'KeygenBlockedForUrls'-ൽ ആണെങ്കിൽ, അത് ഈ ഒഴിവാക്കലുകളെ അസാധുവാക്കുന്നു.
 
           ഈ നയം സജ്ജമാക്കാത്ത നിലയിലാണെങ്കിൽ എല്ലാ സൈറ്റുകൾക്കുമുള്ള ഗ്ലോബൽ ഡിഫോൾട്ട് മൂല്യം, 'DefaultKeygenSetting' നയം സജ്ജമാക്കിയിട്ടുണ്ടെങ്കിൽ അതിൽ നിന്നോ അല്ലെങ്കിൽ ഉപയോക്താവിന്റെ വ്യക്തിപരമായ കോൺഫിഗറേഷനിൽ നിന്നോ, ഉപയോഗിക്കുന്നതാണ്.</translation>
@@ -939,22 +891,6 @@
           ഈ നയത്തെ 'സെഷന്റെ സമയദൈർഘ്യം വരെ കുക്കികൾ സൂക്ഷിക്കുക' എന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, സെഷൻ കഴിയുമ്പോൾ കുക്കികൾ മായ്‌ക്കപ്പെടും. <ph name="PRODUCT_NAME" /> 'പശ്ചാത്തല മോഡിൽ' പ്രവർത്തിക്കുകയാണെങ്കിൽ, അവസാന വിൻഡോ അടയ്‌ക്കുമ്പോൾ സെഷൻ അവസാനിച്ചേക്കില്ല. ഈ രീതി കോൺഫിഗർ ചെയ്യുന്നതിനെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്ക് 'BackgroundModeEnabled' കാണുക.
 
           ഈ നയം സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, 'AllowCookies' എന്നത് ഉപയോഗിക്കും. അത് ഉപയോക്താവിന് മാറ്റാനാകും.</translation>
-<translation id="4098957623809244159">ഈ നയം അവസാനിപ്പിച്ചിരിക്കുന്നു, പകരം ProxyMode ഉപയോഗിക്കുക.
-
-          <ph name="PRODUCT_NAME" />, ARC-ആപ്‌സ് എന്നിവ ഉപയോഗിക്കുന്ന പ്രോക്‌സി സെർവർ വ്യക്തമാക്കാനും, പ്രോക്‌സി ക്രമീകരണം മാറ്റുന്നതിൽ നിന്ന് ഉപയോക്താക്കളെ തടയാനും നിങ്ങളെ അനുവദിക്കുന്നു.
-
-          ഒരിക്കലും പ്രോക്‌സി സെർവർ ഉപയോഗിക്കാതിരിക്കാനും എല്ലായ്‌പ്പോഴും നേരിട്ട് കണക്‌റ്റുചെയ്യാനും നിങ്ങൾ തീരുമാനിക്കുകയാണെങ്കിൽ, മറ്റെല്ലാ ഓപ്‌ഷനുകളും അവഗണിക്കപ്പെടും.
-
-          നിങ്ങൾ സിസ്‌റ്റം പ്രോക്‌സി ക്രമീകരണം ഉപയോഗിക്കാനോ പ്രോക്‌സി സെർവർ സ്വയം കണ്ടെത്താനോ ആണ് തീരുമാനിക്കുന്നതെങ്കിൽ, മറ്റെല്ലാ ഓപ്‌ഷനുകളും അവഗണിക്കപ്പെടും.
-
-          സ്വമേധയായുള്ള പ്രോക്‌സി ക്രമീകരണം തിരഞ്ഞെടുക്കുകയാണെങ്കിൽ, 'പ്രോക്‌സി സെർവറിന്റെ വിലാസം അല്ലെങ്കിൽ URL', 'ഒരു പ്രോക്‌സി .pac ഫയലിലേക്കുള്ള URL', 'പ്രോക്‌സി ബൈപാസ് നയങ്ങളുടെ കോമയാൽ വേർതിരിക്കപ്പെട്ട ലിസ്‌റ്റ്' എന്നിവയിൽ തുടർന്നുള്ള ഓപ്‌ഷനുകൾ വ്യക്തമാക്കാൻ കഴിയും.
-
-          വിശദമായ ഉദാഹരണങ്ങൾക്ക്, ഇത് സന്ദർശിക്കുക:
-          <ph name="PROXY_HELP_URL" />
-
-          നിങ്ങൾ ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കുകയാണെങ്കിൽ, <ph name="PRODUCT_NAME" /> കമാൻഡ് ലൈനിൽ നിന്ന് വ്യക്തമാക്കിയ പ്രോക്‌സിയുമായി ബന്ധപ്പെട്ട എല്ലാ ഓപ്‌ഷനുകളും അവഗണിക്കുന്നു.
-
-          ഈ നയം സജ്ജമാക്കാതെ വിടുന്നത്, ഉപയോക്താക്കളെ പ്രോക്‌സി ക്രമീകരണം സ്വയം തിരഞ്ഞെടുക്കാൻ അനുവദിക്കും.</translation>
 <translation id="4103289232974211388">ഉപയോക്തൃ സ്ഥിരീകരണത്തിന് ശേഷം SAML IdP-യിലേക്ക് റീഡയറക്‌ടുചെയ്യുക</translation>
 <translation id="410478022164847452">AC പവറിൽ പ്രവർത്തിക്കുമ്പോൾ നിഷ്‌ക്രിയ പ്രവർത്തനത്തിനുശേഷം, ഉപയോക്തൃ ഇൻപുട്ടില്ലാതെ സമയദൈർഘ്യം വ്യക്തമാക്കുന്നു.
 
@@ -1440,14 +1376,6 @@
 <translation id="5893553533827140852">ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുകയാണെങ്കിൽ, ഒരു വിദൂര ഹോസ്‌റ്റ് കണക്ഷനിലുടനീളം നുബ്ബി പ്രമാണീകരണ അഭ്യർത്ഥനകൾ അംഗീകരിക്കപ്പെടും.
 
           ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിലോ കോൺഫിഗർചെയ്‌തിട്ടില്ലെങ്കിലോ, നുബ്ബി പ്രമാണീകരണ അഭ്യർത്ഥനകൾ അംഗീകരിക്കപ്പെടില്ല.</translation>
-<translation id="5900959132054596599">ഇവിടെ നൽകിയിരിക്കുന്ന ഹോസ്‌റ്റുകളുടെ ലിസ്‌റ്റിനുവേണ്ടി <ph name="PRODUCT_NAME" />, ARC-ആപ്‌സ് എന്നിവ ഏത് പ്രോക്‌സിയും ബൈപാസുചെയ്യും.
-
-          'പ്രോക്‌സി സെർവർ ക്രമീകരണം എങ്ങനെ വ്യക്തമാക്കണമെന്നത് തിരഞ്ഞെടുക്കുക' എന്നതിൽ നിങ്ങൾ പ്രോക്‌സി ക്രമീകരണം സ്വമേധയാ തിരഞ്ഞെടുത്താൽ മാത്രമേ ഈ നയം പ്രാബല്യത്തിൽ വരൂ.
-
-          പ്രോക്‌സി നയങ്ങൾ സജ്ജമാക്കാൻ മറ്റേതെങ്കിലും മോഡാണ് നിങ്ങൾ തിരഞ്ഞെടുത്തിട്ടുള്ളതെങ്കിൽ ഈ നയം സജ്ജമാക്കാതെ വിടേണ്ടതാണ്.
-
-          കൂടുതൽ വിശദമായ ഉദാഹരണങ്ങൾക്ക്, ഇത് സന്ദർശിക്കുക:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">HTTP മുഖേന യാന്ത്രിക അപ്‌ഡേറ്റ് ഡൗൺലോഡുകൾ അനുവദിക്കുക</translation>
 <translation id="5921888683953999946">ലോഗിൻ സ്‌ക്രീനിൽ വലിയ കഴ്‌സറിന്റെ പ്രവേശനക്ഷമത സവിശേഷതയുടെ സ്ഥിര അവസ്ഥ സജ്ജമാക്കുക.
 
@@ -1974,9 +1902,6 @@
 
       ഈ ക്രമീകരണം അപ്രാപ്തമാക്കിയിട്ടുണ്ട് അല്ലെങ്കില്‍ സജ്ജമാക്കിയിട്ടില്ലെങ്കിൽ, <ph name="PRODUCT_NAME" /> ഒന്നുകില്‍ ഉപയോക്തൃ-നിര്‍ദിഷ്ട ലോക്കേൽ (കോണ്‍ഫിഗര്‍ ചെയ്തിട്ടുണ്ടെങ്കില്‍), സിസ്റ്റം ലോക്കേൽ  ഉപയോഗിക്കും അല്ലെങ്കില്‍ 'en-US' ലോക്കെൽ എന്ന ഇതരമാര്‍ഗം ഉപയോഗിക്കും.</translation>
 <translation id="7651739109954974365">ഉപകരണത്തിനായി ഡാറ്റ റോമിംഗ് പ്രാപ്‌തമാക്കിയിട്ടുണ്ടോ എന്നത് നിർണ്ണയിക്കുന്നു. ട്രൂ എന്നായി സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, ഡാറ്റ റോമിംഗ് അനുവദിക്കും. കോൺഫിഗർ ചെയ്‌തിട്ടില്ലെങ്കിലോ ഫാൾസ് എന്നായി സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിലോ, ഡാറ്റ റോമിംഗ് ലഭ്യമാകില്ല.</translation>
-<translation id="7667184304362487902"><ph name="PRODUCT_NAME" />, ARC-ആപ്‌സ് എന്നിവയ്‌ക്കുള്ള പ്രോക്‌സി ക്രമീകരണം കോൺഫിഗർ ചെയ്യുന്നു.
-
-      ഈ നയം ഇതുവരെ ഉപയോഗിക്കാൻ തയ്യാറായിട്ടില്ല, ഇത് ഉപയോഗിക്കരുത്.</translation>
 <translation id="76810863974142048">ക്ലയന്റുകൾക്കുള്ള റിമോട്ട് ആക്‌സസ്സിന് URL അവരുടെ പ്രാമാണീകരണ ടോക്കൺ നേടേണ്ടതുണ്ട്.
 
           ഈ നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, റിമോട്ട് ആക്‌സസ്സ് ഹോസ്‌റ്റിന്, ഈ URL-ൽ നിന്ന് പ്രാമാണീകരണ ടോക്കൺ നേടുന്നതിന് പ്രാമാണീകരണ ക്ലയന്റുകൾ ആവശ്യമായിവരും. RemoteAccessHostTokenValidationUrl ബന്ധപ്പെട്ട് ഉപയോഗിക്കേണ്ടതുണ്ട്.
@@ -2209,6 +2134,7 @@
 
       ഈ നയ മൂല്യം മില്ലിസെക്കൻഡിൽ വ്യക്തമാക്കിയിരിക്കണം.</translation>
 <translation id="8344454543174932833">ആദ്യ റൺ ചെയ്യലിലെ സ്ഥിരസ്ഥിതി ബ്രൗസറിൽ നിന്നുമുള്ള ബുക്ക്മാർക്കുകൾ ഇംപോർട്ട് ചെയ്യുക</translation>
+<translation id="8359734107661430198">2008/09/02 എന്നതിലൂടെ ExampleDeprecatedFeature API പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="8360452361555133173">OS അപ്‌ഗ്രേഡിനെ തുടർന്നുള്ള ആദ്യ ബ്രൗസർ സമാരംഭിക്കലിൽ സ്വാഗത പേജ് കാണിക്കുന്നത് പ്രവർത്തനക്ഷമമാക്കുക.
 
       ഈ നയം "true" എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിലോ കോൺഫിഗർചെയ്‌തിട്ടില്ലെങ്കിലോ, OS അപ്‌ഗ്രേഡിനുശേഷം ബ്രൗസർ ആദ്യ സമാരംഭിക്കലിൽ വീണ്ടും സ്വാഗത പേജ് കാണിക്കും.
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb
index 4163ac2..a366c79 100644
--- a/components/policy/resources/policy_templates_mr.xtb
+++ b/components/policy/resources/policy_templates_mr.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="mr">
 <translation id="101438888985615157">स्क्रीन 180 अंश फिरवा</translation>
-<translation id="1015272884520659144">वेब अनुप्रयोगामध्ये थेट chrome.usb API मधून वापरण्यासाठी कर्नल ड्राइव्हर पासून वेगळे करण्याची अनुमती असलेल्या USB डिव्हाइसेसची सूची परिभाषित करते. विशिष्ट हार्डवेअर ओळखण्यासाठी प्रविष्टी या USB विक्रेता अभिज्ञापक आणि उत्पादन अभिज्ञापकाच्या जोडण्या असतात.
-
-      हे धोरण कॉन्फिगर केले नसल्यास, वेगळे करण्यायोग्य USB डिव्हाइसेसची सूची रिक्त असल्याचे विचारात घेतले जाते.</translation>
 <translation id="1017967144265860778">लॉग इन स्क्रीनवरील उर्जा व्यवस्थापन</translation>
 <translation id="1019101089073227242">वापरकर्ता डेटा निर्देशिका सेट करा</translation>
 <translation id="1022361784792428773">विस्तार ID ज्यांना स्थापित करण्यापासून वापरकर्त्यास प्रतिबंधित करावे (किंवा सर्वांसाठी * )</translation>
@@ -69,14 +66,6 @@
       धोरण सेट केले नसल्यास किंवा असत्य वर सेट केले असल्यास, TLS मध्ये योग्य असणारे RC4 सायफर सक्षम केले जाणार नाही. अन्यथा कालबाह्य सर्व्हरसह सुसंगतता टिकवून ठेवण्यासाठी ते सत्य वर सेट केले जाऊ शकते. हा एक तात्पुरता बदली उपाय आहे आणि सर्व्हर पुन्हा कॉन्फिगर केले जावे.</translation>
 <translation id="1297182715641689552">.pac प्रॉक्सी स्क्रिप्टचा वापर करा</translation>
 <translation id="1304973015437969093">शांतपणे स्थापित केले जाणारे विस्तार/अॅप ID आणि अद्यतन URL</translation>
-<translation id="1310699457130669094">आपण प्रॉक्सी .pac फाइलला येथे URL निर्दिष्‍ट करु शकता. 
-
-          आपण 'प्रॉक्सी सर्व्हर सेटिंग्ज कशा निर्दिष्‍ट कराव्यात ते निवडा' येथे व्यक्तिचलित प्रॉक्सी सेटिंग्ज निवडल्या असतील तरच हे धोरण प्रभावी होते.
-
-          आपण प्रॉक्सी धोरणांसाठी आपण इतर कोणताही मोड निवडला असल्यास आपण हे धोरण सेट न करता सोडणे आवश्‍यक आहे.
-
-          तपशीलवार उदाहरणांसाठी, भेट द्या:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">स्क्रीन मंद असताना किंवा स्क्रीन बंद केल्यानंतर लवकर जेव्हा वापरकर्ता गतिविधीवर लक्ष ठेवले जाते तेव्हा स्क्रीन मंद होण्याचा विलंब मोजण्याची टक्केवारी निर्दिष्ट करते.
 
           हे धोरण सेट असल्यास, ते स्क्रीन मंद असताना वापरकर्ता गतिविधीवर लक्ष ठेवले जाते तेव्हा किंवा स्क्रीन बंद केल्यानंतर लगेच स्क्रीन मंद होण्याचा विलंब मोजली जाणारी टक्केवारी निर्दिष्ट करते. जेव्हा मंद असण्याचा विलंब मोजला जातो, तेव्हा स्क्रीन बंद असणे, स्क्रीन लॉक आणि निष्क्रिय विलंब मूळतः कॉन्फिगर केल्याप्रमाणे स्क्रीन मंद होण्याच्या विलंबातील समान अंतर कायम ठेवण्यासाठी समायोजित केले जातात.
@@ -154,18 +143,6 @@
 <translation id="1561424797596341174">दूरस्थ प्रवेश होस्टच्या डीबग बिल्डसाठी धोरण अधिशून्य होईल</translation>
 <translation id="1583248206450240930">डीफॉल्टनुसार <ph name="PRODUCT_FRAME_NAME" /> वापरा</translation>
 <translation id="1608755754295374538">सूचनेशिवाय ऑडिओ कॅप्चर डिव्हाइसेसवर प्रवेश मंजूर करणार असलेल्या URL</translation>
-<translation id="1613574633990410986"><ph name="PRODUCT_NAME" /> आणि ARC-अॅप्स ने वापरलेले प्रॉक्सी सर्व्हर निर्दिष्ट करण्याची आपल्याला अनुमती देते आणि वापरकर्त्यांना प्रॉक्सी सेटिंग्ज बदलण्यास प्रतिबंधित करते.
-
-      आपण प्रॉक्सी सर्व्हर कधीही न वापरण्याचे आणि नेहमी थेट कनेक्ट करण्याचे निवडल्यास, इतर सर्व पर्याय दुर्लक्षित केले जातात.
-
-      आपण प्रॉक्सी सर्व्हर स्वयं शोधणे निवडल्यास, इतर सर्व पर्याय दुर्लक्षित केले जातात.
-
-      तपशीलवार उदाहरणांसाठी, येथे भेट द्या:
-      <ph name="PROXY_HELP_URL" />
-
-      आपण हे सेटिंग सक्षम केल्यास, <ph name="PRODUCT_NAME" /> आणि ARC-अॅप्स आदेश ओळीमधील निर्दिष्ट केलेले सर्व प्रॉक्सी-संबंधित पर्याय दुर्लक्षित करतात.
-
-      ही धोरणे सेट न केलेली ठेवल्यामुळे वापरकर्त्यांना प्रॉक्सी सेटिंग निवडण्याची अनुमती मिळेल.</translation>
 <translation id="1617235075406854669">ब्राउझर आणि डाउनलोड इतिहास हटविणे सक्षम करा</translation>
 <translation id="1617384279878333801">प्रोफाईल व्‍यवस्‍थापकामध्ये व्यक्ती जोडा सक्षम करा</translation>
 <translation id="1655229863189977773">डिस्क कॅशे आकार बाइटमध्‍ये सेट करा</translation>
@@ -253,14 +230,6 @@
       सक्षम केलेले असल्यास, सत्र सक्रिय असताना आणि स्क्रीन लॉक केलेली नसताना  एक मोठे, लाल लॉग आउट बटण सिस्टीम ट्रे वर दर्शविले जाते.
 
       अक्षम केलेले असल्यास किंवा निर्दिष्ट नसल्यास, कोणतेही मोठे, लाल लॉग आउट बटण सिस्टीम ट्रे वर दर्शविले जात नाही.</translation>
-<translation id="1942957375738056236">आपण येथे प्रॉक्सी सर्व्हरची URL निर्दिष्‍ट करु शकता.  
-
-          आपण 'प्रॉक्सी सर्व्हर सेटिंग्ज कशी निर्दिष्‍ट करावी ते निवडा' मध्‍ये व्यक्तीचलित प्रॉक्सी सेटिंग्ज निवडल्यासच हे धोरण प्रभावी होते.
-
-          प्रॉक्सी धोरणे सेट करण्‍यासाठी आपण इतर वेगळे प्रकार निवडले असल्यास आपण हे धोरण सेट न करता सोडू शकता.  
-
-          अधिक पर्याय आणि तपशीलवार उदाहरणांसाठी भेट द्या:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974"><ph name="PRODUCT_OS_NAME" /> मधील लॉगिन स्क्रीनवरील उर्जा व्यवस्थापन कॉन्फिगर करा.
 
       लॉग इन स्क्रीन दर्शविली जात असताना काही वेळेसाठी कोणताही वापरकर्ता क्रियाकलाप नसतो तेव्हा <ph name="PRODUCT_OS_NAME" /> कसे वर्तन करते हे धोरण आपल्याला हे कॉन्फिगर करू देते. धोरण एकाधिक सेटिंग्ज नियंत्रित करते. त्यांच्या वैयक्तिक अर्थव्यवस्था आणि मूल्य श्रेण्यांसाठी, एका सत्रामधील उर्जा व्यवस्थापन नियंत्रित करणारी संबंधित धोरणे पहा. केवळ या धोरणांमधील विचलने अशी आहेत:
@@ -653,24 +622,6 @@
 <translation id="3072847235228302527">एका डिव्हाइस-स्थानिक खात्यासाठी सेवा अटी सेट करा</translation>
 <translation id="3096595567015595053">सक्षम केलेल्या प्लगइनची सूची</translation>
 <translation id="3101501961102569744">प्रॉक्सी सर्व्हर सेटिंग्ज कशी निर्दिष्ट करायची ते निवडा</translation>
-<translation id="3125884964575432854">आपल्याला <ph name="PRODUCT_NAME" /> द्वारे ARC-अॅप्स द्वारे वापरले जाणारे प्रॉक्सी सर्व्हर निर्दिष्ट करण्याची अनुमती देते आणि वापरकर्त्यांना प्रॉक्सी सेटिंग बदलण्यास प्रतिबंधित करते.
-
-          आपण कधीही प्रॉक्सी सर्व्हर न वापरणे आणि नेहमी थेट कनेक्ट होणे निवडल्यास, इतर सर्व पर्यायांकडे दुर्लक्ष केले जातात.
-
-          आपण सिस्टीम प्रॉक्सी सेटिंग्ज वापरणे निवडल्यास, इतर सर्व पर्यायांकडे दुर्लक्ष केले जाते.
-
-         आपण प्रॉक्सी सर्व्हर स्वयं शोधणे निवडल्यास, इतर सर्व पर्यायांकडे दुर्लक्ष केले जाते.
-
-          आपण निश्चित सर्व्हर प्रॉक्सी सर्व्हर मोड निवडल्यास, आपण 'प्रॉक्सी सर्व्हरचा पत्ता किंवा URL' आणि 'स्वल्पविरामाने विभक्त केलेल्या प्रॉक्सी बायपास नियमांची सूची' मध्ये पुढील पर्याय निर्दिष्ट करू शकता. ARC-अॅप्स केवळ उच्च प्राथमिकतेसह HTTP प्रॉक्सी सर्व्हर वापरेल.
-
-          आपण .pac प्रॉक्सी स्क्रिप्ट वापरणे निवडल्यास, आपल्याला ''प्रॉक्सी .pac फाईलसाठी URL' मध्ये स्क्रिप्टसाठी URL निर्दिष्ट करणे आवश्यक आहे.
-
-          तपशीलवार उदाहरणांसाठी, यास भेट द्या:
-          <ph name="PROXY_HELP_URL" />
-
-         आपण ही सेटिंग सक्षम केल्यास, <ph name="PRODUCT_NAME" /> आणि ARC-अॅप्स, आदेश ओळीवरू न निर्दिष्ट केलेल्या सर्व प्रॉक्सी-संबंधित पर्यायांकडे दुर्लक्ष करतात.
-
-          हे धोरण सेट न करणे वापरकर्त्यांना स्वत: प्रॉक्सी सेटिंग्ज निवडण्याची अनुमती देईल.</translation>
 <translation id="3153348162326497318">वापरकर्ते कोणते विस्तार स्‍थापन करु शकत नाहीत ते निर्दिष्‍ट करण्‍याची आपल्याला अनुमती देते. याआधीच स्‍थापित करण्‍यात आलेले विस्तार काळ्या सूचीमध्ये टाकले असतील तर ते काढून टाकले जातील.
 '*' चे काळ्यासूचीचे मूल्य म्हणजे ते स्पष्‍टपणे श्वेतसूचीमध्‍ये सूचीबद्ध केले जाईपर्यंत ते काळ्यासूचीमध्‍ये रहातील.
 धोरण सेट न करता सोडल्यास वापरकर्ता <ph name="PRODUCT_NAME" /> मध्‍ये कोणताही विस्‍तार स्‍थापन करु शकतो.</translation>
@@ -739,6 +690,7 @@
       हे सेटिंग सक्षम असल्यास किंवा कॉन्फिगर नसल्यास, वापरकर्ते त्यांच्या Google खात्यासह प्रमाणीकरणाद्वारे मेघ मुद्रण प्रॉक्सी सक्षम करू शकतात.
 
       हे सेटिंग अक्षम झाल्यास, वापरकर्ते प्रॉक्सी सक्षम करू शकत नाहीत आणि मशीनला त्याचे प्रिंटर <ph name="CLOUD_PRINT_NAME" /> सह सामायिक करण्यास अनुमती दिली जाणार नाही.</translation>
+<translation id="3297010562646015826">कार्य व्यवस्थापकमध्ये प्रक्रिया समाप्त करणे सक्षम करते.</translation>
 <translation id="3322771899429619102">की निर्मिती वापरण्याची अनुमती दिलेल्या साइटना निर्दिष्ट करणाऱ्या url नमुन्यांची सूची सेट करण्याची आपल्याला अनुमती देते. url नमुना 'KeygenBlockedForUrls' मध्ये असल्यास, तो या अपवादांना अधिशून्य करतो.
 
 
@@ -923,22 +875,6 @@
          हे धोरण 'सत्राच्या कालावधीसाठी कुकी ठेवा' वर सेट केल्‍यास सत्र बंद झाल्‍यावर कुकी साफ केल्‍या जातील. लक्षात ठेवा की 'पार्श्वभूमी मोडमध्‍ये' जर <ph name="PRODUCT_NAME" /> चालत असेल, तर शेवटची विंडो बंद केल्यानंतर कदाचित सत्र बंद होऊ शकणार नाही. हे वर्तन कॉन्फिगर करण्याबद्दलच्या अधिक माहितीसाठी कृपया 'BackgroundModeEnabled' धोरण पहा.
 
           हे धोरण सेट न करता सोडल्यास, 'AllowCookies' वापरली जाईल आणि वापरकर्ता त्याला बदलू शकेल.</translation>
-<translation id="4098957623809244159">हे धोरण बहिष्कृत केले आहे, त्याऐवजी ProxyMode वापरा
-
-          आपल्याला <ph name="PRODUCT_NAME" /> द्वारे आणि ARC-अॅप्स द्वारे वापरले जाणारे प्रॉक्सी सर्व्हर निर्दिष्ट करण्याची अनुमती देते आणि वापरकर्त्यांना प्रॉक्सी सेटिंग बदलण्यास प्रतिबंधित करते.
-
-          आपण कधीही प्रॉक्सी सर्व्हर न वापरणे आणि नेहमी थेट कनेक्ट होणे निवडल्यास, इतर सर्व पर्यायांकडे दुर्लक्ष केले जातात.
-
-          आपण सिस्टीम प्रॉक्सी सेटिंग्ज वापरणे किंवा प्रॉक्सी सर्व्हर स्वयं शोधणे निवडल्यास, इतर सर्व पर्यायांकडे दुर्लक्ष केले जाते.
-
-          आपण व्यक्तिचलित प्रॉक्सी सेटिंग्ज निवडल्यास, आपण 'प्रॉक्सी सर्व्हरचा पत्ता किंवा URL', 'प्रॉक्सी .pac फाईल ची URL' आणि 'स्वल्पविरामाने विभक्त केलेल्या प्रॉक्सी बायपास नियमांची सूची' मध्ये पुढील पर्याय निर्दिष्ट करू शकता.
-
-          तपशीलवार उदाहरणांसाठी, यास भेट द्या:
-          <ph name="PROXY_HELP_URL" />
-
-         आपण ही सेटिंग सक्षम केल्यास, <ph name="PRODUCT_NAME" /> आदेश ओळीवरून निर्दिष्ट केलेल्या सर्व प्रॉक्सी-संबंधित पर्यायांकडे दुर्लक्ष करतात.
-
-          हे धोरण सेट न करणे वापरकर्त्यांना स्वत: प्रॉक्सी सेटिंग्ज निवडण्याची अनुमती देईल.</translation>
 <translation id="4103289232974211388">वापरकर्ता पुष्टीकरणानंतर SAML IdP पुनर्निदेशित करा</translation>
 <translation id="410478022164847452">वापरकर्ता इनपुटशिवाय वेळेची लांबी निर्दिष्ट करते ज्यानंतर AC उर्जेवर चालताना निष्क्रिय कारवाई केली जाते.
 
@@ -1410,14 +1346,6 @@
 <translation id="5893553533827140852">हे सेटिंग सक्षम असल्यास, दूरस्थ होस्ट कनेक्शनवर gnubby प्रमाणीकरण विनंत्या प्रॉक्सी केल्या जातील.
 
           हे सेटिंग अक्षम असल्यास किंवा कॉन्फिगर न केल्यास, gnubby प्रमाणीकरण विनंत्या प्रॉक्सी केल्या जाणार नाहीत.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> आणि ARC-अॅप्स येथे दिलेल्या होस्टच्या सूचीसाठी कोणतेही प्रॉक्सी बायपास करेल.
-
-          हे धोरण केवळ आपण 'प्रॉक्सी सर्व्हर सेटिंग्ज कशा निर्दिष्ट कराव्या ते निवडा' वर व्यक्तिचलित प्रॉक्सी सेटिंग्ज निवडलेल्या असल्यास प्रभावी होते.
-
-          प्रॉक्सी धोरणे सेट करण्यासाठी आपण इतर प्रकार निवडले असल्यास आपण हे धोरण सेट न केलेले राहू द्यावे.
-
-          तपशीलवार उदाहरणांसाठी, यास भेट द्या:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">HTTP द्वारे स्वयंअद्यतन डाउनलोडला अनुमती द्या</translation>
 <translation id="5921888683953999946">लॉगिन स्क्रीनवरील मोठा कर्सर प्रवेशयोग्यता वैशिष्ट्याची डीफॉल्ट स्थिती सेट करा.
 
@@ -1925,9 +1853,6 @@
 <translation id="7632724434767231364">GSSAPI लायब्ररी नाव</translation>
 <translation id="7635471475589566552"><ph name="PRODUCT_NAME" /> मध्ये अनुप्रयोग लोकॅल कॉन्फिगर करते आणि वापरकर्त्यांना लोकॅल बदलण्यापासून प्रतिबंधित करते. आपण हे सेटिंग सक्षम केल्यास, <ph name="PRODUCT_NAME" /> निर्दिष्ट केलेले लोकॅल वापरते. कॉन्फिगर केलेले लोकॅल समर्थित नसल्यास, त्याऐवजी 'en-US' वापरले जाते. हे सेटिंग अक्षम केलेले किंवा कॉन्फिगर केलेले नसल्यास, <ph name="PRODUCT_NAME" /> वापरकर्त्याने-निर्दिष्ट केलेले लोकॅल (कॉन्फिगर असल्यास), सिस्टम लोकॅल किंवा फॉलबॅक लोकॅल 'en-US' पैकी एक वापरेल.</translation>
 <translation id="7651739109954974365">डिव्हाइससाठी डेटा रोमिंग सक्षम करावे किंवा नाही हे निर्धारित करते. खरे वर सेट केल्यास, डेटा रोमिंगला अनुमती दिली जाते. तो कॉन्फिगर न करता सोडल्यास किंवा चुकीचे वर सेट केल्यास, डेटा रोमिंग उपलब्ध असणार नाही.</translation>
-<translation id="7667184304362487902"><ph name="PRODUCT_NAME" /> आणि  ARC-अॅप्स साठी प्रॉक्सी सेटिंग्ज कॉन्फिगर करते.
-
-      हे धोरण अद्याप वापरासाठी तयार नाही, कृपया त्याचा वापर करू नका.</translation>
 <translation id="76810863974142048">दूरस्थ प्रवेश क्लायंटनी त्यांचे प्रमाणीकरण टोकन जेथे मिळवावे ती URL.
 
           हे धोरण सेट केले असल्यास, दूरस्थ प्रवेश होस्टला कनेक्‍ट करण्‍यासाठी URL वरून टोकन मिळविण्यासाठी प्रमाणीकरण करणार्‍या क्लायंटची आवश्‍यकता असेल. RemoteAccessHostTokenValidationUrl सह वापरणे आवश्‍यक आहे.
@@ -2155,6 +2080,7 @@
 
       धोरणाचे मूल्य मिलिसेकंदात निर्दिष्‍ट करावे.</translation>
 <translation id="8344454543174932833">प्रथमच चालताना डीफॉल्ट ब्राउझरमधून बुकमार्क आयात करा</translation>
+<translation id="8359734107661430198">2008/09/02 द्वारे ExampleDeprecatedFeature API सक्षम करा</translation>
 <translation id="8360452361555133173">OS श्रेणीसुधारणेनंतर प्रथम ब्राउझर लाँच केल्‍यावर स्वागत पृष्‍ठ दर्शविणे सक्षम करा.
 
       धोरण सत्य वर सेट केल्‍यास किंवा कॉन्फिगर न केल्‍यास, OS श्रेणीसुधारणेनंतर प्रथम लाँच केल्‍यावर ब्राउझर स्वागत पृष्‍ठ पुन्हा दर्शवेल.
@@ -2348,7 +2274,7 @@
 
           धोरण मूल्य मिलिसेकंदांमध्ये निर्दिष्ट केले जावे. मूल्ये निष्क्रिय विलंबापेक्षा कमी करण्यासाठी पकडली जातात.</translation>
 <translation id="891435090623616439">JSON स्ट्रिंग म्हणून संकेतनात लिहीले, तपशीलासाठी <ph name="COMPLEX_POLICIES_URL" /> पहा</translation>
-<translation id="8929359433203547810">हे धोरण असत्य वर सेट केल्यास, <ph name="PRODUCT_OS_NAME" /> Bluetooth ला अक्षम करेल आणि वापरकर्ता परत ते सक्षम करू शकत नाही.
+<translation id="8929359433203547810">हे धोरण असत्य वर सेट केल्यास, <ph name="PRODUCT_OS_NAME" /> Bluetooth अक्षम करेल आणि वापरकर्ता परत ते सक्षम करू शकत नाही.
 
       हे धोरण सत्य वर सेट केल्यास किंवा अनसेट केलेले ठेवल्यास, वापरकर्ता त्याच्या इच्छेनुसार Bluetooth सक्षम किंवा अक्षम करण्यात सक्षम असेल.
 
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb
index f06247c0..129a427 100644
--- a/components/policy/resources/policy_templates_ms.xtb
+++ b/components/policy/resources/policy_templates_ms.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ms">
 <translation id="101438888985615157">Putar skrin 180 darjah</translation>
-<translation id="1015272884520659144">Menentukan senarai peranti USB yang dibenarkan untuk ditanggalkan daripada pemacu inti peranti tersebut untuk digunakan menerusi API chrome.usb terus dalam aplikasi web. Entri ialah pasangan Pengecam Vendor USB dan Pengecam Produk untuk mengenal pasti perkakasan khusus.
-
-      Jika dasar ini tidak dikonfigurasikan, senarai peranti USB yang boleh ditanggalkan akan dianggap sebagai kosong.</translation>
 <translation id="1017967144265860778">Pengurusan kuasa pada skrin log masuk</translation>
 <translation id="1019101089073227242">Tetapkan direktori data pengguna</translation>
 <translation id="1022361784792428773">ID sambungan pengguna perlu dihalang daripada memasang (atau * untuk semua)</translation>
@@ -73,14 +70,6 @@
       Jika dasar ini tidak ditetapkan atau ditetapkan kepada palsu, maka suit sifer RC4 dalam TLS tidak akan didayakan. Jika tidak, dasar mungkin ditetapkan kepada benar untuk mengekalkan keserasian dengan pelayan yang sudah lapuk. Ini adalah langkah sementara dan pelayan harus dikonfigurasi semula.</translation>
 <translation id="1297182715641689552">Gunakan skrip proksi .pac</translation>
 <translation id="1304973015437969093">ID Sambungan/Apl dan URL kemas kini untuk dipasang secara senyap</translation>
-<translation id="1310699457130669094">Anda boleh menetapkan URL untuk fail .pac proksi di sini.
-
-          Dasar ini hanya berkuat kuasa jika anda telah memilih tetapan proksi manual pada 'Pilih cara hendak menetapkan tetapan pelayan proksi'.
-
-          Anda harus membiarkan dasar ini tanpa ditetapkan jika anda telah memilih mana-mana mod lain untuk menetapkan dasar proksi.
-
-          Untuk melihat contoh terperinci, lawati:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Menentukan peratusan yang akan digunakan untuk menskala kelewatan pemalapan skrin apabila aktiviti pengguna diperhatikan semasa skrin dimalapkan atau tidak lama selepas skrin telah dimatikan. 
 
           Jika dasar ini ditetapkan, dasar ini menetapkan peratusan yang akan menskalakan kelewatan pemalapan skrin apabila aktiviti pengguna diperhatikan semasa skrin dimalapkan atau tidak lama selepas skrin telah dimatikan. Apabila kelewatan pemalapan diskalakan, kelewatan matikan skrin, kunci skrin dan melahu akan dilaraskan untuk mengekalkan jarak yang sama dari kelewatan pemalapan skrin seperti konfigurasi asal.
@@ -163,18 +152,6 @@
 <translation id="1561424797596341174">Pembatalan dasar untuk binaan Nyahpepijat bagi hos akses jauh</translation>
 <translation id="1583248206450240930">Gunakan <ph name="PRODUCT_FRAME_NAME" /> secara lalai</translation>
 <translation id="1608755754295374538">URL yang akan diberikan akses kepada peranti tangkapan audio tanpa gesaan</translation>
-<translation id="1613574633990410986">Membolehkan anda menentukan pelayan proksi yang digunakan oleh <ph name="PRODUCT_NAME" /> dan apl ARC serta menghalang pengguna daripada menukar tetapan proksi.
-
-      Jika anda memilih untuk tidak akan menggunakan pelayan proksi dan sentiasa menyambung secara terus, semua pilihan lain akan diabaikan.
-
-      Jika anda memilih untuk mengesan pelayan proksi secara automatik, semua pilihan lain akan diabaikan.
-
-      Untuk melihat contoh terperinci, lawati:
-      <ph name="PROXY_HELP_URL" />
-
-      Jika anda mendayakan tetapan ini, <ph name="PRODUCT_NAME" /> dan apl ARC mengabaikan semua pilihan berkaitan proksi yang ditentukan daripada baris perintah.
-
-      Apabila dasar ini tidak ditetapkan, pengguna akan dibenarkan untuk memilih sendiri tetapan proksi mereka.</translation>
 <translation id="1617235075406854669">Dayakan pemadaman sejarah penyemak imbas dan muat turun</translation>
 <translation id="1617384279878333801">Dayakan tambah orang dalam pengurus profil</translation>
 <translation id="1655229863189977773">Tetapkan saiz cache cakera dalam bait</translation>
@@ -269,14 +246,6 @@
       Jika didayakan, butang log keluar besar berwarna merah dipaparkan dalam dulang sistem semasa sesi aktif dan skrin tidak dikunci.
 
       Jika dilumpuhkan atau tidak ditetapkan, tiada butang log keluar besar berwarna merah dipaparkan dalam dulang sistem.</translation>
-<translation id="1942957375738056236">Anda boleh menetapkan URL pelayan proksi di sini.
-
-          Dasar ini hanya berkuat kuasa jika anda telah memilih tetapan proksi manual pada 'Pilih cara untuk menentukan tetapan pelayan proksi'.
-
-          Anda harus membiarkan dasar ini tanpa ditetapkan jika anda telah memilih mana-mana mod lain untuk menetapkan dasar proksi.
-
-          Untuk melihat lebih banyak pilihan dan contoh terperinci, lawati:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Konfigurasikan pengurusan kuasa pada skrin log masuk dalam <ph name="PRODUCT_OS_NAME" />.
 
       Dasar ini membolehkan anda mengkonfigurasikan cara <ph name="PRODUCT_OS_NAME" /> bertingkah laku apabila tiada aktiviti pengguna untuk suatu tempoh masa semasa skrin log masuk ditunjukkan. Dasar ini mengawal berbilang tetapan. Untuk setiap semantik dan julat nilai, lihat dasar sepadan yang mengawal pengurusan kuasa dalam sesi. Satu-satunya penyimpangan daripada dasar ini ialah:
@@ -664,24 +633,6 @@
 <translation id="3072847235228302527">Tetapkan Syarat Perkhidmatan untuk akaun setempat peranti</translation>
 <translation id="3096595567015595053">Senarai pemalam yang didayakan</translation>
 <translation id="3101501961102569744">Pilih cara untuk menentukan tetapan pelayan proksi</translation>
-<translation id="3125884964575432854">Membolehkan anda menentukan pelayan proksi yang digunakan oleh <ph name="PRODUCT_NAME" /> dan apl ARC serta menghalang pengguna daripada menukar tetapan proksi.
-
-          Jika anda memilih untuk tidak akan menggunakan pelayan proksi dan sentiasa menyambung secara terus, semua pilihan lain akan diabaikan.
-
-          Jika anda memilih untuk menggunakan tetapan proksi sistem, semua pilihan lain akan diabaikan.
-
-          Jika anda memilih untuk mengesan pelayan proksi secara automatik, semua pilihan lain akan diabaikan.
-
-          Jika anda memilih mod proksi pelayan tetap, anda boleh menentukan pilihan lanjut dalam 'Alamat atau URL pelayan proksi' dan 'Senarai peraturan pintasan proksi yang dipisahkan koma'. Apl ARC hanya akan menggunakan pelayan proksi HTTP dengan keutamaan tertinggi.
-
-          Jika anda memilih untuk menggunakan skrip proksi .pac, anda mesti menentukan URL ke skrip itu dalam 'URL ke fail .pac proksi'.
-
-          Untuk melihat contoh terperinci, lawati:
-          <ph name="PROXY_HELP_URL" />
-
-          Jika anda mendayakan tetapan ini, <ph name="PRODUCT_NAME" /> dan apl ARC mengabaikan semua pilihan berkaitan proksi yang ditentukan daripada baris perintah.
-
-          Apabila dasar ini tidak ditetapkan, pengguna akan dibenarkan untuk memilih sendiri tetapan proksi mereka.</translation>
 <translation id="3153348162326497318">Membolehkan anda menentukan sambungan yang TIDAK boleh dipasang oleh pengguna. Sambungan yang telah dipasang akan dialih keluar jika telah disenaraihitamkan.
 
           Nilai senarai hitam '*' bermaksud semua sambungan telah disenaraihitamkan kecuali ia disenaraikan dengan jelas dalam senarai putih.
@@ -754,6 +705,7 @@
       Jika tetapan ini didayakan atau tidak dikonfigurasi, pengguna boleh mendayakan proksi cetakan awan melalui pengesahan dengan akaun Google mereka.
 
       Jika tetapan ini dilumpuhkan, pengguna tidak dapat mendayakan proksi, dan mesin tidak akan dibenarkan untuk berkongsi pencetaknya dengan <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Membolehkan tindakan menamatkan proses dalam Pengurus Tugas</translation>
 <translation id="3322771899429619102">Membenarkan anda menetapkan senarai pola url yang menentukan tapak yang dibenarkan untuk menggunakan penghasilan kunci. Pengecualian akan dibatalkan jika pola url berada dalam 'KeygenBlockedForUrls'.
 
           Jika dasar ini dibiarkan tanpa ditetapkan, nilai lalai global akan digunakan untuk semua tapak, sama ada daripada dasar 'DefaultKeygenSetting' jika ditetapkan atau konfigurasi peribadi pengguna jika tidak ditetapkan.</translation>
@@ -940,22 +892,6 @@
           Jika dasar ini ditetapkan kepada 'Keep cookies for the duration of the session', maka kuki akan dikosongkan apabila sesi ditutup. Beri perhatian bahawa jika <ph name="PRODUCT_NAME" /> sedang dijalankan dalam 'background mode', sesi itu mungkin tidak ditutup apabila tetingkap terakhir ditutup. Sila lihat dasar 'BackgroundModeEnabled' untuk mendapatkan maklumat lanjut tentang mengkonfigurasi gelagat ini.
 
           Jika dasar ini dibiarkan tanpa ditetapkan, 'AllowCookies' akan digunakan dan pengguna akan dapat mengubahnya.</translation>
-<translation id="4098957623809244159">Dasar ini telah ditamatkan, gunakan ProxyMode sebagai ganti.
-
-          Membolehkan anda menentukan pelayan proksi yang digunakan oleh <ph name="PRODUCT_NAME" /> dan apl ARC serta menghalang pengguna daripada menukar tetapan proksi.
-
-          Jika anda memilih untuk tidak akan menggunakan pelayan proksi dan sentiasa menyambung secara terus, semua pilihan lain akan diabaikan.
-
-          Jika anda memilih untuk menggunakan tetapan proksi sistem atau mengesan pelayan proksi secara automatik, semua pilihan lain akan diabaikan.
-
-          Jika anda memilih tetapan proksi manual, anda boleh menentukan pilihan lanjut dalam ''Alamat atau URL pelayan proksi', ''URL ke fail .pac proksi' dan ''Senarai peraturan pintasan proksi yang dipisahkan koma'.
-
-          Untuk melihat contoh terperinci, lawati:
-          <ph name="PROXY_HELP_URL" />
-
-          Jika anda mendayakan tetapan ini, <ph name="PRODUCT_NAME" /> mengabaikan semua pilihan berkaitan proksi yang ditentukan daripada baris perintah.
-
-          Apabila dasar ini tidak ditetapkan, pengguna akan dibenarkan untuk memilih sendiri tetapan proksi mereka.</translation>
 <translation id="4103289232974211388">Ubah hala ke SAML IdP selepas pengesahan pengguna</translation>
 <translation id="410478022164847452">Menyatakan panjang masa tanpa input pengguna dan tindakan melahu akan dilaksanakan selepas tamat masa tersebut apabila dijalan dengan kuasa AC.
 
@@ -1435,14 +1371,6 @@
 <translation id="5893553533827140852">Jika tetapan ini didayakan, maka permintaan pengesahan gnubby akan diproksikan merentas sambungan hos jauh.
 
           Jika tetapan ini dilumpuhkan atau tidak dikonfigurasikan, permintaan pengesahan gnubby tidak akan diproksikan.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> dan apl ARC akan melangkau mana-mana proksi untuk senarai hos yang dinyatakan di sini.
-
-          Dasar ini hanya berkuat kuasa jika anda telah memilih tetapan proksi manual di 'Pilih cara untuk menentukan tetapan pelayan proksi'.
-
-          Anda harus membiarkan dasar ini tanpa ditetapkan jika anda telah memilih mana-mana mod lain untuk menetapkan dasar proksi.
-
-          Untuk melihat contoh terperinci, lawati:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Benarkan muat turun auto kemas kini melalui HTTP</translation>
 <translation id="5921888683953999946">Tetapkan keadaan lalai ciri kebolehcapaian kursor besar pada skrin log masuk. 
 
@@ -1968,9 +1896,6 @@
 
       Jika tetapan ini dilumpuhkan atau tidak dikonfigurasi, <ph name="PRODUCT_NAME" /> menggunakan sama ada penempatan pilihan yang ditentukan pengguna (jika dikonfigurasi), penempatan sistem atau penempatan bertahan 'en-US'.</translation>
 <translation id="7651739109954974365">Menentukan sama ada data perayauan perlu didayakan untuk peranti. Jika ditetapkan kepada benar, perayauan data dibenarkan. Jika dibiarkan tanpa dikonfigurasi atau ditetapkan kepada palsu, perayauan data tidak akan tersedia.</translation>
-<translation id="7667184304362487902">Mengkonfigurasi tetapan proksi untuk <ph name="PRODUCT_NAME" /> dan apl ACR.
-
-      Dasar ini belum sedia untuk digunakan lagi, oleh itu jangan gunakannya.</translation>
 <translation id="76810863974142048">URL di mana pelanggan akses jauh harus mendapatkan token pengesahan mereka.
 
           Jika dasar ini ditetapkan, hos akses jauh memerlukan pelanggan yang mengesahkan supaya mendapatkan token pengesahan daripada URL ini agar dapat menyambung.  Hendaklah digunakan bersama dengan RemoteAccessHostTokenValidationUrl.
@@ -2204,6 +2129,7 @@
 
       Nilai dasar ini harus ditetapkan dalam milisaat.</translation>
 <translation id="8344454543174932833">Import penanda halaman daripada penyemak imbas lalai pada kali pertama menjalankannya</translation>
+<translation id="8359734107661430198">Dayakan API ExampleDeprecatedFeature sehingga 2008/09/02</translation>
 <translation id="8360452361555133173">Dayakan pemaparan halaman aluan semasa pelancaran penyemak imbas yang pertama sesudah peningkatan OS.
 
      Jika dasar ini ditetapkan kepada benar atau tidak dikonfigurasikan, penyemak imbas akan memaparkan semula halaman aluan semasa pelancaran penyemak imbas yang pertama sesudah peningkatan OS.
@@ -2408,7 +2334,7 @@
 
           Nilai dasar harus dinyatakan dalam milisaat. Nilai diapit supaya kurang daripada kelewatan melahu.</translation>
 <translation id="891435090623616439">dikodkan sebagai rentetan JSON, untuk mendapatkan butiran lanjut, lihat <ph name="COMPLEX_POLICIES_URL" /></translation>
-<translation id="8929359433203547810">Jika dasar ini ditetapkan kepada salah, <ph name="PRODUCT_OS_NAME" /> akan melumpuhkan Bluetooth dan pengguna tidak akan dapat mendayakannya semula.
+<translation id="8929359433203547810">Jika dasar ini ditetapkan kepada palsu, <ph name="PRODUCT_OS_NAME" /> akan melumpuhkan Bluetooth dan pengguna tidak akan dapat mendayakannya semula.
 
       Jika dasar ini ditetapkan kepada benar atau dibiarkan tidak ditetapkan, pengguna akan dapat mendayakan atau melumpuhkan Bluetooth semahunya.
 
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index 82b24f2..0930f6bc 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="nl">
 <translation id="101438888985615157">Scherm 180 graden draaien</translation>
-<translation id="1015272884520659144">Hiermee wordt de lijst met USB-apparaten gedefinieerd die mogen worden ontkoppeld van hun kernel-driver, zodat ze via de chrome.usb-API rechtstreeks kunnen worden gebruikt in een web-app. Items zijn paren van de ID van de USB-leverancier en de ID van het product, zodat specifieke hardware kan worden geïdentificeerd.
-
-      Als dit beleid niet is geconfigureerd, wordt aangenomen dat de lijst met USB-apparaten die kunnen worden ontkoppeld, leeg is.</translation>
 <translation id="1017967144265860778">Energiebeheer op het inlogscherm</translation>
 <translation id="1019101089073227242">Gegevensdirectory voor gebruiker instellen</translation>
 <translation id="1022361784792428773">Id's van extensies die de gebruiker niet mag installeren (of '*' voor alle extensies)</translation>
@@ -68,14 +65,6 @@
       Als het beleid niet is ingesteld of is ingesteld op 'onwaar', worden de RC4-coderingssuites in TLS niet ingeschakeld. Anders kan het worden ingesteld op 'waar' om compatibiliteit met een verouderde server te behouden. Dit is een tijdelijke oplossing en de server moet opnieuw worden geconfigureerd.</translation>
 <translation id="1297182715641689552">Een PAC-script voor de proxy gebruiken</translation>
 <translation id="1304973015437969093">ID's voor extensies/apps en URL's voor updates die op de achtergrond moeten worden geïnstalleerd</translation>
-<translation id="1310699457130669094">Je kunt hier een URL naar een PAC-bestand voor de proxy opgeven.
-
-          Dit beleid wordt alleen van kracht als je handmatige proxyinstellingen hebt geselecteerd bij 'Kies hoe je proxyserverinstellingen wilt opgeven'.
-
-          Stel dit beleid niet in als een je andere modus hebt geselecteerd voor het instellen van je proxybeleid.
-
-          Ga voor gedetailleerde voorbeelden naar:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Bepaalt het percentage waarmee de dimvertraging van het scherm wordt geschaald wanneer er activiteit van de gebruiker wordt waargenomen terwijl het scherm is gedimd of kort nadat het scherm is uitgeschakeld.
 
           Als dit beleid is ingeschakeld, bepaalt het het percentage waarmee de dimvertraging van het scherm wordt geschaald wanneer er activiteit van de gebruiker wordt waargenomen terwijl het scherm is gedimd of kort nadat het scherm is uitgeschakeld. Wanneer de dimvertraging is geschaald, worden de vertragingen 'Scherm uit', 'Schermvergrendeling' en 'Inactief' aangepast om dezelfde afstand van de dimvertraging van het scherm te behouden zoals oorspronkelijk was geconfigureerd.
@@ -154,18 +143,6 @@
 <translation id="1561424797596341174">Beleid overschrijft Debug-builds van de host voor externe toegang</translation>
 <translation id="1583248206450240930"><ph name="PRODUCT_FRAME_NAME" /> standaard gebruiken</translation>
 <translation id="1608755754295374538">URL's die zonder prompt toegang krijgen tot apparaten voor het vastleggen van audio</translation>
-<translation id="1613574633990410986">Hiermee kun je de proxyserver specificeren die wordt gebruikt door <ph name="PRODUCT_NAME" /> en ARC-apps en voorkom je dat gebruikers proxyinstellingen kunnen wijzigen.
-
-      Als je ervoor kiest nooit een proxyserver te gebruiken en altijd rechtstreeks verbinding te maken, worden alle andere opties genegeerd.
-
-      Als je ervoor kiest de proxyserver automatisch te detecteren, worden alle andere opties genegeerd.
-
-      Ga voor gedetailleerde voorbeelden naar:
-      <ph name="PROXY_HELP_URL" />
-
-      Als je deze instelling inschakelt, negeren <ph name="PRODUCT_NAME" /> en ARC-apps alle aan proxy's gerelateerde opties die worden gespecificeerd in de opdrachtregel.
-
-      Als dit beleid niet is ingesteld, kunnen gebruikers zelf de proxyinstellingen kiezen.</translation>
 <translation id="1617235075406854669">Verwijderen van browser- en downloadgeschiedenis inschakelen</translation>
 <translation id="1617384279878333801">'Persoon toevoegen in profielbeheer' toestaan</translation>
 <translation id="1655229863189977773">Grootte van schijfcache in bytes instellen</translation>
@@ -256,14 +233,6 @@
       Als dit beleid is ingeschakeld, wordt een grote rode afmeldknop weergegeven in de systeembalk terwijl een sessie actief is en het scherm niet is vergrendeld.
 
       Als dit beleid is uitgeschakeld of niet is gespecificeerd, wordt er geen grote rode afmeldknop weergegeven in de systeembalk.</translation>
-<translation id="1942957375738056236">Je kunt de URL van de proxyserver hier opgeven.
-
-          Dit beleid wordt alleen van kracht als je handmatige proxyinstellingen heeft geselecteerd bij 'Kies hoe je proxyserverinstellingen wilt opgeven'.
-
-          Stel dit beleid niet in als je een andere modus hebt geselecteerd voor het instellen van het proxybeleid.
-
-          Ga voor meer opties en gedetailleerde voorbeelden naar:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Energiebeheer configureren op het inlogscherm in <ph name="PRODUCT_OS_NAME" />.
 
       Met dit beleid kun je configureren hoe <ph name="PRODUCT_OS_NAME" /> zich gedraagt wanneer er enige tijd geen gebruikersactiviteit is terwijl het inlogscherm wordt weergegeven. Het beleid beheerst meerdere instellingen. Voor de afzonderlijke semantiek en waardebereiken bekijk je de bijbehorende beleidsregels die energiebeheer in een sessie beheersen. De enige afwijkingen van deze beleidsregels zijn:
@@ -653,24 +622,6 @@
 <translation id="3072847235228302527">De Servicevoorwaarden instellen voor een apparaat-lokaal account</translation>
 <translation id="3096595567015595053">Lijst met ingeschakelde plug-ins</translation>
 <translation id="3101501961102569744">Kies hoe je proxyserverinstellingen wilt specificeren</translation>
-<translation id="3125884964575432854">Hiermee kun je de proxyserver specificeren die wordt gebruikt door <ph name="PRODUCT_NAME" /> en ARC-apps en voorkom je dat gebruikers proxyinstellingen kunnen wijzigen.
-
-          Als je ervoor kiest nooit een proxyserver te gebruiken en altijd rechtstreeks verbinding te maken, worden alle andere opties genegeerd.
-
-          Als je ervoor kiest de proxyinstellingen van het systeem te gebruiken, worden alle andere opties genegeerd.
-
-          Als je ervoor kiest de proxyserver automatisch te detecteren, worden alle andere opties genegeerd.
-
-          Als je de modus voor een vaste proxyserver kiest, kun je verdere opties specificeren in 'Adres of URL van proxyserver' en 'Door komma's gescheiden lijst van regels voor proxyomzeiling'. ARC-apps gebruiken alleen de HTTP-proxyserver met de hoogste prioriteit.
-
-          Als je een proxyscript in een PAC-bestand gebruikt, moet je de URL met het script specificeren in 'URL naar een PAC-bestand voor de proxy'.
-
-          Ga voor gedetailleerde voorbeelden naar:
-          <ph name="PROXY_HELP_URL" />
-
-          Als je deze instelling inschakelt, negeren <ph name="PRODUCT_NAME" /> en ARC-apps alle aan proxy's gerelateerde opties die via de opdrachtregel worden opgegeven.
-
-          Als dit beleid niet is ingesteld, kunnen gebruikers zelf de proxyinstellingen kiezen.</translation>
 <translation id="3153348162326497318">Hiermee kun je specificeren welke extensies gebruikers NIET kunnen installeren. Als geïnstalleerde extensies op de zwarte lijst voorkomen, worden ze verwijderd.
 
           De waarde '*' van een zwarte lijst houdt in dat alle extensies op de zwarte lijst worden geplaatst, tenzij ze expliciet op de witte lijst worden vermeld.
@@ -743,6 +694,7 @@
       Als deze instelling is ingeschakeld of niet is geconfigureerd, kunnen gebruikers de proxy voor Cloudprinter inschakelen met authenticatie via hun Google-account.
 
       Als deze instelling is uitgeschakeld, kunnen gebruikers de proxy niet inschakelen en kan de computer zijn printers niet delen met <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Hiermee wordt het beëindigen van processen in Taakbeheer mogelijk gemaakt</translation>
 <translation id="3322771899429619102">Hiermee kun je een lijst met URL-patronen instellen waarmee sites worden gespecificeerd die sleutels mogen genereren. Als een URL-patroon in 'KeygenBlockedForUrls' staat, worden deze uitzonderingen daardoor overschreven.
 
           Als dit beleid niet wordt ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites op basis van het beleid 'DefaultKeygenSetting' (als dit is ingesteld), of anders op basis van de persoonlijke configuratie van de gebruiker.</translation>
@@ -922,22 +874,6 @@
           Als dit beleid is ingesteld op 'Cookies bewaren voor de duur van de sessie', worden cookies gewist wanneer de sessie wordt beëindigd. Let op dat als <ph name="PRODUCT_NAME" /> in de achtergrondmodus wordt uitgevoerd, de sessie mogelijk niet wordt beëindigd wanneer het laatste venster wordt gesloten. Zie het beleid BackgroundModeEnabled voor meer informatie over het configureren van dit gedrag.
 
           Als er geen instelling voor dit beleid wordt opgegeven, wordt AllowCookies gebruikt en kan de gebruiker dit wijzigen.</translation>
-<translation id="4098957623809244159">Dit beleid is beëindigd. Gebruik in plaats daarvan ProxyMode.
-
-          Hiermee kun je de proxyserver specificeren die wordt gebruikt door <ph name="PRODUCT_NAME" /> en ARC-apps en voorkom je dat gebruikers de proxyinstellingen kunnen wijzigen.
-
-          Als je ervoor kiest nooit een proxyserver te gebruiken en altijd rechtstreeks verbinding te maken, worden alle andere opties genegeerd.
-
-          Als je ervoor kiest de proxyinstellingen van het systeem te gebruiken of de proxyserver automatisch te detecteren, worden alle andere opties genegeerd.
-
-          Als je handmatige proxyinstellingen kiest, kun je verdere opties specificeren in 'Adres of URL van proxyserver', 'URL naar een PAC-bestand voor de proxy' en 'Door komma's gescheiden lijst van regels voor proxyomzeiling'.
-
-          Ga voor gedetailleerde voorbeelden naar:
-          <ph name="PROXY_HELP_URL" />
-
-          Als je deze instelling inschakelt, negeert <ph name="PRODUCT_NAME" /> alle aan proxy's gerelateerde opties die via de opdrachtregel worden opgegeven.
-
-          Als dit beleid niet is ingesteld, kunnen gebruikers zelf de proxyinstellingen kiezen.</translation>
 <translation id="4103289232974211388">Omleiden naar SAML IdP na bevestiging van de gebruiker</translation>
 <translation id="410478022164847452">Hiermee wordt de tijdsduur zonder input van gebruikers gespecificeerd waarna de vertragingsactie wordt ondernomen wanneer op netstroom wordt gewerkt.
 
@@ -1418,14 +1354,6 @@
 <translation id="5893553533827140852">Als deze instelling is ingeschakeld, worden gnubby-verificatieverzoeken verzonden via een proxy met een externe hostverbinding.
 
           Als deze instelling uitgeschakeld of niet geconfigureerd is, worden gnubby-verificatieverzoeken niet via een proxy verzonden.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> en ARC-apps omzeilen elke proxy voor de lijst met hosts die hier wordt gespecificeerd.
-
-          Dit beleid wordt alleen van kracht als je handmatig proxyinstellingen hebt geselecteerd bij 'Kies hoe je proxyserverinstellingen wilt specificeren'.
-
-          Stel dit beleid niet in als je een andere modus voor het instellen van je proxybeleid hebt geselecteerd.
-
-          Ga voor meer gedetailleerde voorbeelden naar:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Downloads voor automatische updates via HTTP toestaan</translation>
 <translation id="5921888683953999946">De standaardstatus van de toegankelijkheidsfunctie 'Grote muisaanwijzer' op het inlogscherm instellen.
 
@@ -1942,9 +1870,6 @@
 
       Als deze instelling is uitgeschakeld of niet is ingesteld, gebruikt <ph name="PRODUCT_NAME" /> de door de gebruiker gespecificeerde landinstelling (indien geconfigureerd), de landinstelling voor het systeem of 'en-US'.</translation>
 <translation id="7651739109954974365">Bepaalt of gegevensroaming moet worden ingeschakeld voor het apparaat. Als dit is ingesteld op 'true', wordt gegevensroaming toegestaan. Als de instelling niet wordt geconfigureerd of op 'false' is ingesteld, is gegevensroaming niet beschikbaar.</translation>
-<translation id="7667184304362487902">Hiermee configureer je de proxyinstellingen voor <ph name="PRODUCT_NAME" /> en ARC-apps.
-
-      Dit beleid is nog niet klaar voor gebruik. Gebruik het dus niet.</translation>
 <translation id="76810863974142048">URL waarop clients met externe toegang hun verificatietoken moeten ophalen.
 
           Als dit beleid is ingesteld, moet de host voor externe toegang clients verifiëren om een verificatietoken van deze URL te verkrijgen en zo verbinding te kunnen maken. Moet samen met het beleid 'RemoteAccessHostTokenValidationUrl' worden gebruikt.
@@ -2176,6 +2101,7 @@
 
       De beleidswaarde moet worden opgegeven in milliseconden.</translation>
 <translation id="8344454543174932833">Bladwijzers importeren uit standaardbrowser bij eerste uitvoering</translation>
+<translation id="8359734107661430198">API voor ExampleDeprecatedFeature tot en met 02-09-2008 inschakelen</translation>
 <translation id="8360452361555133173">Inschakelen dat de welkomstpagina wordt weergegeven bij de eerste keer opstarten van de browser na een upgrade van het besturingssysteem.
 
       Als dit beleid wordt ingesteld op 'waar' of niet wordt geconfigureerd, geeft de browser de welkomstpagina opnieuw weer bij de eerste keer opstarten na een upgrade van het besturingssysteem.
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb
index 0c136c5..4db2338 100644
--- a/components/policy/resources/policy_templates_no.xtb
+++ b/components/policy/resources/policy_templates_no.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="no">
 <translation id="101438888985615157">Rotér skjermen 180 grader</translation>
-<translation id="1015272884520659144">Definerer listen over USB-enheter som kan kobles fra kjernedriveren, så de kan brukes via chrome.usb API direkte i nettprogrammer. Oppføringene er par av leverandør- og produktkoder som identifiserer spesifikke USB-enheter.
-
-      Hvis denne regelen ikke er spesifisert, anses listen over frakoblingsbare USB-enheter for å være tom.</translation>
 <translation id="1017967144265860778">Strømstyring på påloggingssiden</translation>
 <translation id="1019101089073227242">Angi katalog for brukerdata</translation>
 <translation id="1022361784792428773">Utvidelses-ID-er brukeren skal hindres i å installere (eller * for alle)</translation>
@@ -68,14 +65,6 @@
       Hvis regelen ikke er angitt eller er satt til false (usann), er ikke RC4-chifferserier i TLS slått på. Ellers kan den settes til true (sann) for å sikre kompatibilitet med en utdatert tjener. Dette er en midlertidig løsning, og tjeneren bør konfigureres på nytt.</translation>
 <translation id="1297182715641689552">Bruk et .pac-skript for mellomtjener</translation>
 <translation id="1304973015437969093">ID-er for utvidelser/apper og oppdateringsnettadresser som skal installeres stille</translation>
-<translation id="1310699457130669094">Du kan angi nettadresse til en .pac-fil til mellomtjener her.
-
-          Denne retningslinjen trer i kraft bare hvis du har valgt manuelle mellomtjenerinnstulinger under «Velg hvordan du skal angi proxytjenerinnstillinger».
-
-          Du bør la være å angi denne retningslinjen hvis du har valgt en annen modus for å stille inn retningslinjer for mellomtjener.
-
-          Hvis du vil ha detaljerte eksempler, kan du gå hit:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Angir hvordan prosentandelen for forsinkelse av skjermdemping skaleres når brukeraktiviteten observeres mens skjermen er dempet, eller kort tid etter skjermen er slått av.
 
           Hvis denne innstillingen angis, spesifiserer den hvordan prosentandelen for forsinkelse av skjermdemping skaleres når brukeraktiviteten observeres mens skjermen dempes, eller kort tid etter skjermen er slått av. Når dempingsforsinkelsen er skalert, blir forsinkelsen for avslått, låst og inaktiv skjerm justert slik at de har samme lengde fra skjermdempingsforsinkelsen som i den opprinnelige konfigurasjonen.
@@ -158,18 +147,6 @@
 <translation id="1561424797596341174">Overstyring av regler for delversjoner for feilsøking på fjerntilgangsverten</translation>
 <translation id="1583248206450240930">Bruk <ph name="PRODUCT_FRAME_NAME" /> som standard</translation>
 <translation id="1608755754295374538">Nettadresser som uten forespørsel blir gitt tilgang til enheter med lydopptak</translation>
-<translation id="1613574633990410986">Lar deg spesifisere hvilken proxy-tjener som skal brukes av <ph name="PRODUCT_NAME" /> og ARC-apper, og hindrer brukerne i å endre innstillingene for proxy-tjenere.
-
-      Hvis du velger at det aldri skal brukes proxy-tjenere og alltid kobles til direkte, ignoreres alle andre alternativer.
-
-      Hvis du velger at proxy-tjenere skal oppdages automatisk, ignoreres alle andre alternativer.
-
-      Du finner detaljerte eksempler her:
-      <ph name="PROXY_HELP_URL" />
-
-      Hvis du slår på denne innstillingen, ignorerer <ph name="PRODUCT_NAME" /> og ARC-apper alle proxy-tjenerrelaterte alternativer som spesifiseres fra kommandolinjen.
-
-      Hvis du ikke spesifiserer disse reglene, kan brukerne velge egne innstillinger for proxy-tjenere.</translation>
 <translation id="1617235075406854669">Gjør det mulig å slette nettleser- og nedlastingslogg</translation>
 <translation id="1617384279878333801">Slå på «Legg til person» i profilbehandlingen</translation>
 <translation id="1655229863189977773">Angi størrelse på diskbuffer i byte</translation>
@@ -258,10 +235,6 @@
       Hvis dette aktiveres, vises en rød avlogginsknapp i systemstatusfeltet mens en økt er aktiv og skjermen ikke er låst.
 
       Hvis det deaktiveres eller ikke spesifiseres, vises det ingen stor, rød knapp i systemstatusfeltet.</translation>
-<translation id="1942957375738056236">Du kan angi nettadressen til proxytjeneren her.
-
-          Denne retningslinjen iverksettes bare hvis du har valgt manuelle proxytjenerinnstillinger under «Velg hvordan proxytjenerinnstillinger skal angis».
-          Du bør la være å angi denne retningslinjen hvis du har valgt en annen modus for innstilling av mellomtjenerretningslinjer. Hvis du vil ha flere alternativer og detaljerte eksempler, kan du gå til <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Konfigurer strømstrømstyring på påloggingssiden i <ph name="PRODUCT_OS_NAME" />.
 
       Med denne planen kan du konfigurere hvordan <ph name="PRODUCT_OS_NAME" /> skal oppføre seg når det ikke har vært noen brukeraktivitet på en stund mens påloggingsskjermen vises. Planen styrer flere innstillinger. For verdiområder og semantikk for enkeltinnstillinger kan du se tilsvarende planer som kontrollerer strømstyring innad i økten. De eneste avvikene fra disse planene er:
@@ -640,24 +613,6 @@
 <translation id="3072847235228302527">Angi bruksvilkårene for en konto på enheten</translation>
 <translation id="3096595567015595053">Liste over aktiverte programtillegg</translation>
 <translation id="3101501961102569744">Velg hvordan innstillinger for proxy-tjener angis</translation>
-<translation id="3125884964575432854">Lar deg spesifisere hvilken proxy-tjener som skal brukes av <ph name="PRODUCT_NAME" /> og ARC-apper, og hindrer brukerne i å endre innstillingene for proxy-tjenere.
-
-          Hvis du velger at det aldri skal brukes proxy-tjenere og alltid kobles til direkte, ignoreres alle andre alternativer.
-
-          Hvis du velger å bruke systeminnstillingene for proxy-tjenere, ignoreres alle andre alternativer.
-
-          Hvis du velger å oppdage proxy-tjenere automatisk, ignoreres alle andre alternativer.
-
-          Hvis du velger modusen for faste proxy-tjenere, kan du spesifisere flere alternativer i «Adresse eller nettadresse for proxy-tjener» og «Kommadelt liste over regler for å omgå proxy-tjener». ARC-apper bruker bare den HTTP-proxy-tjeneren som har høyest prioritet.
-
-          Hvis du velger å bruke et pac-skript for proxy-tjenere, må du spesifisere nettadressen for skriptet i «Nettadresse til en .pac-fil for proxy-tjener».
-
-          Du finner detaljerte eksempler her:
-          <ph name="PROXY_HELP_URL" />
-
-          Hvis du slår på denne innstillingen, ignorerer <ph name="PRODUCT_NAME" /> og ARC-apper alle proxy-tjenerrelaterte alternativer som spesifiseres fra kommandolinjen.
-
-          Hvis du ikke spesifiserer denne regelen, kan brukerne velge egne innstillinger for proxy-tjenere.</translation>
 <translation id="3153348162326497318">Gjør at du kan angi hvilke utvidelser brukerne IKKE kan installere. Utvidelser som allerede er installert, fjernes eller svartelistes.
 
           En svartelisteverdi på * betyr at alle utvidelser er svartelistet med mindre de er uttrykkelig oppført på godkjenningslisten.
@@ -722,6 +677,7 @@
 <translation id="3273221114520206906">Standard JavaScript-innstilling</translation>
 <translation id="3288595667065905535">Utgivelseskanal</translation>
 <translation id="3292147213643666827">Aktiverer <ph name="PRODUCT_NAME" /> til å fungere som mellomtjener mellom <ph name="CLOUD_PRINT_NAME" /> og tidligere skrivere tilkoblet denne datamaskinen. Hvis innstillingen er aktivert eller ikke konfigurert, kan brukerne aktivere mellomtjener for Google Cloud Print ved hjelp av autentisering i Google-kontoen. Hvis denne innstillingen er deaktivert, kan ikke brukere aktivere mellomtjeneren, og får ikke tilgang til å dele datamaskinens skrivere med <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Slår på muligheten for å avslutte prosesser i oppgavebehandlingen</translation>
 <translation id="3322771899429619102">Gjør det mulig å definere en liste med nettadressemønstre for å spesifisere nettsteder som har tillatelse til å bruke nøkkelgenerering. Hvis det er et nettadressemønster i «KeygenBlockedForUrls», overstyrer det disse unntakene.
 
           Hvis denne regelen ikke angis, brukes den globale standardverdien for alle nettstedene, enten fra regelen «DefaultKeygenSetting» hvis den er angitt, eller fra brukerens personlige konfigurasjon.</translation>
@@ -894,22 +850,6 @@
           Hvis denne regelen settes til «Behold informasjonskapsler så lenge økten varer», blir informasjonskapslene slettet når økten avsluttes. Vær oppmerksom på at hvis <ph name="PRODUCT_NAME" /> kjører i «bakgrunnsmodus», kan det hende økten ikke avsluttes når det siste vinduet lukkes. Se regelen «BackgroundModeEnabled» for å få mer informasjon om konfigurering av denne atferden.
 
           Hvis denne regelen ikke spesifiseres, brukes «AllowCookies», og brukeren kan endre innstillingen.</translation>
-<translation id="4098957623809244159">Denne regelen er avviklet. Bruk ProxyMode i stedet.
-
-          Med denne regelen kan du spesifisere hvilken proxy-tjener som skal brukes av <ph name="PRODUCT_NAME" /> og ARC-apper, og hindre brukere i å endre innstillingene for proxy-tjenere.
-
-          Hvis du velger at det aldri skal brukes proxy-tjenere og alltid kobles til direkte, ignoreres alle andre alternativer.
-
-          Hvis du velger å bruke systeminnstillingene for proxy-tjenere eller oppdage proxy-tjenere automatisk, ignoreres alle andre alternativer.
-
-          Hvis du velger manuelle innstillinger for proxy-tjenere, kan du spesifisere ytterligere alternativer i «Adresse eller nettadresse for proxy-tjener», «Nettadresse til en .pac-fil for proxy-tjener» og «Kommadelt liste over regler for å omgå proxy-tjener».
-
-          Du finner detaljerte eksempler her:
-          <ph name="PROXY_HELP_URL" />
-
-          Hvis du slår på denne innstillingen, ignorerer <ph name="PRODUCT_NAME" /> alle proxy-tjenerrelaterte alternativer som spesifiseres fra kommandolinjen.
-
-          Hvis du ikke spesifiserer denne regelen, kan brukerne velge egne innstillinger for proxy-tjenere.</translation>
 <translation id="4103289232974211388">Viderekoble til SAML IdP etter at brukeren har bekreftet</translation>
 <translation id="410478022164847452">Angir hvor lenge brukeren kan være inaktiv før inaktivitetshandlingen blir utført når enheten kjører på vekselstrøm.
 
@@ -1383,13 +1323,6 @@
 <translation id="5893553533827140852">Hvis denne innstillingen er aktivert sendes gnubby-godkjenningsforespørsler via en proxy-tjener på en ekstern tjenertilkobling.
 
           Hvis denne innstillingen ikke er aktivert sendes ikke gnubby-godkjenningsforespørsler via en proxy-tjener.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> og ARC-apper omgår alle proxy-tjenere for listen med verter som spesifiseres her.
-
-          Denne regelen trer bare i kraft hvis du har valgt manuelle innstillinger for proxy-tjenere under «Velg hvordan innstillinger for proxy-tjener angis».
-          Du bør ikke spesifisere denne regelen hvis du har valgt en annen modus for spesifisering av regler for proxy-tjenere.
-
-          Du finner detaljerte eksempler her:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Tillat automatisk oppdatering av nedlastinger via HTTP</translation>
 <translation id="5921888683953999946">Angi standardtilstand for den store musepekerens tilgjengelighet på påloggingssiden.
 
@@ -1909,9 +1842,6 @@
 
       Hvis denne innstillingen er deakivert eller ikke angis, bruker <ph name="PRODUCT_NAME" /> enten det brukerspesifikke foretrukne språket (hvis dette er konfiguert), systemspråket eller, som siste mulighet, en-US.</translation>
 <translation id="7651739109954974365">Avgjør om datastreifing skal aktiveres for enheten. Hvis innstillingen er angitt som Sann, tillates datastreifing. Hvis innstillingen er angitt som Usann eller ikke er konfigurert, blir ikke datastreifing tilgjengelig.</translation>
-<translation id="7667184304362487902">Konfigurerer innstillingene for proxy-tjenere for <ph name="PRODUCT_NAME" /> og ARC-apper.
-
-      Denne regelen er ikke klar til bruk ennå, så ikke bruk den.</translation>
 <translation id="76810863974142048">Nettadressen fjerntilgangsklienter skal hente autentiseringstoken fra.
 
           Hvis denne regelen spesifiseres, krever fjerntilgangsverten at autentiseringsklientene innhenter et autentiseringstoken fra nettadressen som er oppgitt, før de kobles til. Denne regelen må brukes sammen med RemoteAccessHostTokenValidationUrl.
@@ -2136,6 +2066,7 @@
 
       Retningslinjeverdien må angis i millisekunder.</translation>
 <translation id="8344454543174932833">Importer bokmerker fra standard nettleser ved første kjøring</translation>
+<translation id="8359734107661430198">Slå på ExampleDeprecatedFeature API frem til og med 2008/09/02</translation>
 <translation id="8360452361555133173">Slå på visning av velkomstsiden ved den første oppstarten av nettleseren etter at operativsystemet er oppgradert.
 
       Hvis denne regelen settes til «true» (sann) eller ikke konfigureres, vises velkomstsiden på nytt i nettleseren ved den første oppstarten etter at operativsystemet er oppgradert.
@@ -2333,7 +2264,7 @@
 
       Hvis denne regelen spesifiseres, kan ikke brukerne endre eller overstyre den.
 
-      Når Bluetooth har blitt slått på, må enheten startes på nytt for at endringene skal tre i kraft. (Det er ikke nødvendig å starte enheten på nytt når Bluetooth slås av).</translation>
+      Når Bluetooth er slått på, må enheten startes på nytt for at endringene skal tre i kraft. (Det er ikke nødvendig å starte enheten på nytt når Bluetooth slås av).</translation>
 <translation id="8947415621777543415">Rapportering av enhetsposisjonen</translation>
 <translation id="8951350807133946005">Angi katalog for diskbufring</translation>
 <translation id="8955719471735800169">Tilbake til toppen</translation>
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb
index d9a99065..214208d 100644
--- a/components/policy/resources/policy_templates_pl.xtb
+++ b/components/policy/resources/policy_templates_pl.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="pl">
 <translation id="101438888985615157">Obróć ekran o 180 stopni</translation>
-<translation id="1015272884520659144">Definiuje listę urządzeń USB, które można odłączać od sterownika jądra i stosować za pomocą interfejsu chrome.usb API bezpośrednio w aplikacji internetowej. W celu wskazania konkretnego urządzenia lista obejmuje pary identyfikatora dostawcy urządzenia USB i identyfikatora produktu.
-
-      Jeśli nie skonfigurujesz tej zasady, lista odłączanych urządzeń USB będzie uważana za pustą.</translation>
 <translation id="1017967144265860778">Zarządzanie energią na ekranie logowania</translation>
 <translation id="1019101089073227242">Ustaw katalog danych użytkownika</translation>
 <translation id="1022361784792428773">Identyfikatory rozszerzeń, których nie może instalować użytkownik (wartość * oznacza wszystkie)</translation>
@@ -64,7 +61,6 @@
       Jeśli ta zasada nie jest ustawiona lub jest wyłączona, to mechanizmy szyfrowania RC4 w TLS będą wyłączone. Można ją włączyć dla zachowania zgodności z przestarzałym serwerem. Jest to rozwiązanie tymczasowe i konieczna jest zmiana konfiguracji serwera.</translation>
 <translation id="1297182715641689552">Używaj skryptu PAC serwera proxy</translation>
 <translation id="1304973015437969093">Identyfikatory rozszerzeń/aplikacji i adresy URL aktualizacji, które mają być instalowane dyskretnie</translation>
-<translation id="1310699457130669094">W tym miejscu możesz podać URL pliku PAC serwera proxy. Ta zasada obowiązuje tylko po wybraniu ręcznego konfigurowania ustawień proxy za pomocą opcji „Wybierz sposób określenia ustawień serwera proxy”. Szczegółowe przykłady można znaleźć na  <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Określa wartość procentową skalowania opóźnienia przyciemnienia ekranu, gdy aktywność użytkownika zostanie wykryta po przyciemnieniu lub wkrótce po wyłączeniu ekranu.
 
           Ustawienie tej zasady pozwala określić wartość procentową skalowania opóźnienia przyciemnienia ekranu, gdy aktywność użytkownika zostanie wykryta po przyciemnieniu lub wkrótce po wyłączeniu ekranu. Skalowanie opóźnienia przyciemnienia powoduje, że opóźnienia wyłączenia i zablokowania ekranu oraz opóźnienie bezczynności są tak dostosowywane, by zachować pierwotnie ustawione odstępy od opóźnienia przyciemnienia ekranu.
@@ -147,18 +143,6 @@
 <translation id="1561424797596341174">Zasada zastępuje kompilacje hosta dostępu zdalnego w trybie debugowania</translation>
 <translation id="1583248206450240930">Używaj domyślnie wtyczki <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="1608755754295374538">Adresy URL, które bez pytania otrzymają dostęp do urządzeń do nagrywania dźwięku</translation>
-<translation id="1613574633990410986">Pozwala określić serwer proxy używany w <ph name="PRODUCT_NAME" /> oraz aplikacjach ARC i uniemożliwia użytkownikom zmianę jego ustawień.
-
-      Jeśli zdecydujesz się nie korzystać z serwera proxy i zawsze bezpośrednio nawiązywać połączenia, wszystkie pozostałe opcje będą ignorowane.
-
-      Są one też ignorowane w przypadku automatycznego wykrywania serwera proxy.
-
-      Szczegółowe przykłady znajdziesz na stronie:
-      <ph name="PROXY_HELP_URL" />
-
-      Jeśli ustawienie jest włączone, <ph name="PRODUCT_NAME" /> i aplikacje ARC ignorują wszystkie opcje dotyczące serwera proxy określone w wierszu polecenia.
-
-      Jeśli te zasady nie zostaną ustawione, użytkownicy mogą samodzielnie określić ustawienia serwera proxy.</translation>
 <translation id="1617235075406854669">Włącz usuwanie historii przeglądarki i pobierania</translation>
 <translation id="1617384279878333801">Włącz dodawanie osób w menedżerze profili</translation>
 <translation id="1655229863189977773">Ustaw rozmiar dyskowej pamięci podręcznej w bajtach</translation>
@@ -235,7 +219,6 @@
       Po włączeniu tej opcji, gdy sesja jest aktywna a ekran niezablokowany, na pasku zadań jest wyświetlany duży czerwony przycisk wylogowania.
 
       Jeśli ta opcja jest wyłączona, na pasku zadań nie jest wyświetlany duży czerwony przycisk wylogowania.</translation>
-<translation id="1942957375738056236">W tym miejscu możesz podać URL serwera proxy. Ta zasada obowiązuje tylko wówczas, gdy zdecydujesz się ręcznie wprowadzić ustawienia serwera proxy za pomocą opcji „Wybierz sposób określenia ustawień serwera proxy”. Nie ustawiaj tej zasady w przypadku wybrania innego trybu ustawiania zasad proxy. Więcej opcji i szczegółowych przykładów znajdziesz na <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Konfiguruje zarządzanie energią na ekranie logowania w <ph name="PRODUCT_OS_NAME" />.
 
       Zasada pozwala skonfigurować, jak <ph name="PRODUCT_OS_NAME" /> ma się zachować, gdy po wyświetleniu ekranu logowania użytkownik przez pewien czas nie wykona żadnej czynności. Kontroluje ona wiele ustawień. Ich objaśnienia i zakresy wartości znajdziesz w opisach odpowiednich zasad, które sterują zarządzaniem energią podczas sesji. Jedyne różnice w stosunku do tych zasad to:
@@ -602,24 +585,6 @@
 <translation id="3072847235228302527">Określ Warunki korzystania z usługi dla lokalnego konta na urządzeniu</translation>
 <translation id="3096595567015595053">Lista włączonych wtyczek</translation>
 <translation id="3101501961102569744">Wybierz sposób określenia ustawień serwera proxy</translation>
-<translation id="3125884964575432854">Pozwala określić serwer proxy używany w <ph name="PRODUCT_NAME" /> oraz aplikacjach ARC i uniemożliwia użytkownikom zmianę jego ustawień.
-
-          Jeśli zdecydujesz się nie korzystać z serwera proxy i zawsze bezpośrednio nawiązywać połączenia, wszystkie pozostałe opcje będą ignorowane.
-
-          Są one też ignorowane w przypadku użycia systemowych ustawień serwera proxy.
-
-          Są one też ignorowane w przypadku automatycznego wykrywania serwera proxy.
-
-          Jeśli wybierzesz tryb stałego serwera proxy, możesz określić dodatkowe opcje w polach „Adres IP lub URL serwera proxy” i „Lista rozdzielonych przecinkami reguł omijania serwera proxy”. Aplikacje ARC używają tylko serwera proxy HTTP z najwyższym priorytetem.
-
-          W przypadku użycia skryptu PAC serwera proxy musisz określić adres URL skryptu w polu „Adres URL pliku PAC serwera proxy”.
-
-          Szczegółowe przykłady znajdziesz na stronie:
-          <ph name="PROXY_HELP_URL" />
-
-          Jeśli ustawienie jest włączone, <ph name="PRODUCT_NAME" /> i aplikacje ARC ignorują wszystkie opcje dotyczące serwera proxy określone w wierszu polecenia.
-
-          Jeśli ta zasada nie zostanie ustawiona, użytkownicy mogą samodzielnie określić ustawienia serwera proxy.</translation>
 <translation id="3153348162326497318">Pozwala określić rozszerzenia, których użytkownicy NIE mogą instalować. Zainstalowane rozszerzenia zostaną usunięte w przypadku umieszczenia ich na tej liście. Wartość „*” na liście blokad oznacza, że zablokowane są wszystkie rozszerzenia, które nie znajdują się na liście dozwolonych rozszerzeń. Jeśli zasada ta nie zostanie skonfigurowana, użytkownicy mogą instalować dowolne rozszerzenia w <ph name="PRODUCT_NAME" />.</translation>
 <translation id="316778957754360075">To ustawienie zostało wycofane w <ph name="PRODUCT_NAME" /> w wersji 29. Zalecany sposób konfigurowania kolekcji rozszerzeń lub aplikacji udostępnianych przez organizację polega na tym, że witrynę z pakietami CRX umieszcza się w zasadzie ExtensionInstallSources, a na stronie internetowej udostępnia się bezpośrednie linki do pakietów do pobrania. Program uruchamiający tę stronę internetową można utworzyć, korzystając z zasady ExtensionInstallForcelist.</translation>
 <translation id="3185009703220253572">od wersji <ph name="SINCE_VERSION" /></translation>
@@ -684,6 +649,7 @@
       Jeśli to ustawienie jest włączone lub nieskonfigurowane, użytkownicy mogą włączyć serwer proxy drukowania w chmurze, uwierzytelniając się na swoim koncie Google.
 
       W przypadku wyłączenia ustawienia użytkownicy nie mogą włączyć serwera proxy ani udostępnić w <ph name="CLOUD_PRINT_NAME" /> drukarek podłączonych do komputera.</translation>
+<translation id="3297010562646015826">Umożliwia kończenie procesów w Menedżerze zadań</translation>
 <translation id="3322771899429619102">Umożliwia skonfigurowanie listy wzorcowych URL-i określających witryny, w których mogą być generowane klucze. Jeśli wzorzec adresu URL znajduje się w zasadzie „KeygenBlockedForUrls”, zastępuje to te wyjątki.
 
           Jeśli ta zasada nie zostanie skonfigurowana, dla wszystkich witryn będzie używana globalna wartość domyślna pochodząca z zasady „DefaultKeygenSetting” (jeśli została skonfigurowana) lub z osobistej konfiguracji użytkownika.</translation>
@@ -857,22 +823,6 @@
           Jeśli ta zasada zostanie ustawiona na „Zachowaj pliki cookie na czas trwania sesji”, pliki cookie będą usuwane przy zamknięciu sesji. Pamiętaj, że jeśli <ph name="PRODUCT_NAME" /> działa w tle, nawet po zamknięciu ostatniego okna sesja może pozostać aktywna. Przeczytaj o zasadzie BackgroundModeEnabled, by dowiedzieć się więcej o konfigurowaniu tego działania.
 
           Jeśli ta zasada pozostanie nieskonfigurowana, będzie używane ustawienie AllowCookies, a użytkownik będzie mógł je zmienić.</translation>
-<translation id="4098957623809244159">Ta zasada jest przestarzała. Zamiast niej użyj zasady ProxyMode.
-
-          Pozwala określić serwer proxy używany w <ph name="PRODUCT_NAME" /> oraz aplikacjach ARC i uniemożliwia użytkownikom zmianę jego ustawień.
-
-          Jeśli zdecydujesz się nie korzystać z serwera proxy i zawsze bezpośrednio nawiązywać połączenia, wszystkie pozostałe opcje będą ignorowane.
-
-          Są one też ignorowane w przypadku użycia systemowych ustawień serwera proxy lub automatycznego wykrywania serwera proxy.
-
-          Jeśli chcesz ręcznie wprowadzić ustawienia serwera proxy, możesz określić dodatkowe opcje w polach „Adres IP lub URL serwera proxy”, „Adres URL pliku PAC serwera proxy” i „Lista rozdzielonych przecinkami reguł omijania serwera proxy”.
-
-          Szczegółowe przykłady znajdziesz na stronie:
-          <ph name="PROXY_HELP_URL" />
-
-          Jeśli ustawienie jest włączone, <ph name="PRODUCT_NAME" /> ignoruje wszystkie opcje dotyczące serwera proxy określone w wierszu polecenia.
-
-          Jeśli ta zasada nie zostanie ustawiona, użytkownicy mogą samodzielnie określić ustawienia serwera proxy.</translation>
 <translation id="4103289232974211388">Przekieruj do dostawcy tożsamości SAML po potwierdzeniu przez użytkownika</translation>
 <translation id="410478022164847452">Określa, po jakim czasie nieaktywności użytkownika podejmowane jest działanie po bezczynności przy zasilaniu z sieci.
 
@@ -1299,14 +1249,6 @@
 <translation id="5893553533827140852">Jeśli włączysz to ustawienie, żądania uwierzytelniania Gnubby będą przesyłane przez serwer proxy podczas zdalnego połączenia z hostem.
 
           Jeśli wyłączysz to ustawienie lub go nie skonfigurujesz, żądania uwierzytelniania Gnubby nie będą przesyłane przez serwer proxy.</translation>
-<translation id="5900959132054596599">W przypadku hostów wymienionych na tej liście <ph name="PRODUCT_NAME" /> i aplikacje ARC omijają serwer proxy.
-
-          Ta zasada obowiązuje tylko wtedy, gdy ręcznie wprowadzisz ustawienia serwera proxy za pomocą opcji „Wybierz sposób określenia ustawień serwera proxy”.
-
-          Nie ustawiaj tej zasady w przypadku wybrania innego trybu ustawiania zasad serwera proxy.
-
-          Szczegółowe przykłady znajdziesz na stronie:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Zezwalaj na pobieranie aktualizacji automatycznych przez HTTP</translation>
 <translation id="5921888683953999946">Ustawia domyślny stan funkcji ułatwień dostępu w postaci dużego kursora na ekranie logowania.
 
@@ -1780,9 +1722,6 @@
 <translation id="7632724434767231364">Nazwa biblioteki GSSAPI</translation>
 <translation id="7635471475589566552">Pozwala skonfigurować język w przeglądarce <ph name="PRODUCT_NAME" /> i uniemożliwia użytkownikom jego zmianę. Jeśli włączysz to ustawienie, w <ph name="PRODUCT_NAME" /> będzie używany określony język. W przypadku, gdy skonfigurowany język nie jest obsługiwany, wybierana jest opcja „en-US”. Jeśli ustawienie jest wyłączone lub nieskonfigurowane, w <ph name="PRODUCT_NAME" /> używany jest preferowany język określony przez użytkownika (jeśli został skonfigurowany), język ustawiony w systemie lub zastępcza opcja „en-US”.</translation>
 <translation id="7651739109954974365">Określa, czy na urządzeniu powinno być włączone przesyłanie danych w roamingu. W przypadku włączenia tej zasady przesyłanie danych w roamingu będzie dozwolone. Jeśli zasada będzie wyłączona lub nieskonfigurowana, przesyłanie danych w roamingu będzie niedostępne.</translation>
-<translation id="7667184304362487902">Konfiguruje ustawienia serwera proxy dla <ph name="PRODUCT_NAME" /> i aplikacji ARC.
-
-      Zasada nie jest jeszcze gotowa, więc nie należy jej używać.</translation>
 <translation id="76810863974142048">Adres URL, pod którym klienty zdalnego dostępu otrzymują token uwierzytelniania.
 
           Jeśli ustawisz tę zasadę, host zdalnego dostępu będzie wymagał od łączących się klientów uzyskania tokena uwierzytelniania z tego adresu URL. Musisz jej używać w połączeniu z zasadą RemoteAccessHostTokenValidationUrl.
@@ -1996,6 +1935,7 @@
 
       Wartość zasady należy podać w milisekundach.</translation>
 <translation id="8344454543174932833">Importuj zakładki z przeglądarki domyślnej przy pierwszym uruchomieniu</translation>
+<translation id="8359734107661430198">Włącz interfejs API ExampleDeprecatedFeature od 2 września 2008 r.</translation>
 <translation id="8360452361555133173">Włącz wyświetlanie strony powitalnej przy pierwszym uruchomieniu przeglądarki po uaktualnieniu systemu operacyjnego.
 
       Jeśli ta zasada jest włączona lub nieskonfigurowana, przeglądarka ponownie wyświetli stronę powitalną przy pierwszym uruchomieniu po uaktualnieniu systemu operacyjnego.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index 8874f09..f2eefb9 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="pt-BR">
 <translation id="101438888985615157">Girar a tela em 180 graus</translation>
-<translation id="1015272884520659144">Define a lista de dispositivos USB que estão autorizados a serem removidos do seu driver de kernel para uso pela API chrome.usb diretamente dentro de um aplicativo da Web. As entradas são pares de um identificador de fornecedor e um identificador do produto USB, para identificar um hardware específico.
-
-      Se esta política não é configurada, a lista de dispositivos USB removíveis é considerada como vazia.</translation>
 <translation id="1017967144265860778">Gerenciamento de energia na tela de login</translation>
 <translation id="1019101089073227242">Definir diretório de dados do usuário</translation>
 <translation id="1022361784792428773">IDs de extensão que devem ser impedidos de serem instalados pelo usuário (ou * para todos)</translation>
@@ -61,7 +58,6 @@
       Se a política ainda não estiver configurada ou estiver configurada como "false", os pacotes de criptografia RC4 em TLS não serão ativados. Caso contrário, ela poderá ser configurada como "true" para manter a compatibilidade com um servidor desatualizado. Esta é uma medida temporária, e o servidor deve ser reconfigurado.</translation>
 <translation id="1297182715641689552">Usar um script de proxy .pac</translation>
 <translation id="1304973015437969093">IDs de extensões//aplicativos e URLs de atualização deverão ser instalados silenciosamente</translation>
-<translation id="1310699457130669094">Você pode especificar um URL para um arquivo proxy .pac aqui. Esta política só tem efeito se você tiver selecionado configurações manuais de proxy em "Escolha como especificar as configurações do servidor proxy". Você deve deixar esta política sem definição caso tenha selecionado qualquer outro modo de definição de políticas proxy. Para obter exemplos detalhados, visite: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Especifica o percentual pelo qual calcular o intervalo de escurecimento da tela quando é observada atividade do usuário enquanto a tela está esmaecida ou logo após a tela ser desligada.
 
           Se esta política for definida, especificará o percentual pelo qual calcular o intervalo de escurecimento da tela quando é observada atividade do usuário enquanto a tela está esmaecida ou logo após a tela ser desligada. Quando o intervalo de escurecimento é calculado, o desligamento, o bloqueio da tela e os intervalos de inatividade são ajustados para manter as mesmas distâncias do intervalo de escurecimento da configuração original.
@@ -142,18 +138,6 @@
 <translation id="1561424797596341174">A política modifica as versões de depuração do host de acesso remoto</translation>
 <translation id="1583248206450240930">Usar o <ph name="PRODUCT_FRAME_NAME" /> por padrão</translation>
 <translation id="1608755754295374538">URLs que terão acesso a dispositivos de captura de áudio sem solicitação</translation>
-<translation id="1613574633990410986">Permite que você especifique o servidor proxy usado pelo <ph name="PRODUCT_NAME" /> e por apps ARC e impede que os usuários alterem as configurações de proxy.
-
-      Se você optar por nunca usar um servidor proxy e sempre se conectar diretamente, todas as outras opções serão ignoradas.
-
-      Se você optar pela detecção automática do servidor proxy, todas as outras opções serão ignoradas.
-
-      Para ver exemplos detalhados, visite:
-      <ph name="PROXY_HELP_URL" />
-
-      Se você ativar esta configuração, o <ph name="PRODUCT_NAME" /> e os apps ARC ignorarão todas as opções relacionadas ao proxy especificadas na linha de comando.
-
-      Se estas políticas não forem definidas, os usuários poderão escolher as próprias configurações de proxy.</translation>
 <translation id="1617235075406854669">Ativar exclusão do histórico do navegador e de downloads</translation>
 <translation id="1617384279878333801">Ativar a adição de pessoa no gerenciador de perfil</translation>
 <translation id="1655229863189977773">Define o tamanho do cache de disco em bytes</translation>
@@ -230,7 +214,6 @@
       Se esta opção estiver ativada, um grande botão vermelho de logout será mostrado na bandeja do sistema enquanto uma sessão estiver ativa e a tela não estiver bloqueada.
 
       Se esta opção estiver desativada ou não especificada, esse botão não será exibido na bandeja do sistema.</translation>
-<translation id="1942957375738056236">Você pode especificar o URL do servidor de proxy aqui. Esta política só tem efeito caso você tenha selecionado as configurações de proxy manual em "Escolha como especificar as configurações do servidor proxy". Você deve deixar esta política sem definição caso tenha selecionado qualquer outro modo de definição de políticas proxy. Para obter mais opções e exemplos detalhados, visite: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Configurar o gerenciamento de energia na tela de login do <ph name="PRODUCT_OS_NAME" />.
 
       Esta política permite configurar o comportamento do <ph name="PRODUCT_OS_NAME" /> quando não há atividade do usuário por algum tempo enquanto a tela de login é exibida. A política controla diversas configurações. Para ver a semântica específica e os intervalos de valores de cada uma delas, consulte as políticas correspondentes que controlam o gerenciamento de energia durante uma sessão. Os únicos desvios dessas políticas são os seguintes:
@@ -589,24 +572,6 @@
 <translation id="3072847235228302527">Definir os Termos de Serviço para uma conta local do dispositivo</translation>
 <translation id="3096595567015595053">Lista de plug-ins ativados</translation>
 <translation id="3101501961102569744">Escolher o modo de especificar as configurações do servidor proxy</translation>
-<translation id="3125884964575432854">Permite que você especifique o servidor proxy usado pelo <ph name="PRODUCT_NAME" /> e por apps ARC e impede que os usuários alterem as configurações de proxy.
-
-          Se você optar por nunca usar um servidor proxy e sempre se conectar diretamente, todas as outras opções serão ignoradas.
-
-          Se você optar por usar as configurações de proxy do sistema, todas as outras opções serão ignoradas.
-
-          Se você optar por detectar automaticamente o servidor proxy, todas as outras opções serão ignoradas.
-
-          Se você optar pelo modo de servidor proxy fixo, pode especificar opções adicionais no "Endereço ou URL do servidor proxy" e na "Lista separada por vírgulas das regras de proxies ignoráveis". Apps ARC usarão apenas o servidor proxy HTTP com a maior prioridade.
-
-          Se você optar por usar um script de proxy .pac, precisará especificar o URL do script em "URL de um arquivo proxy .pac".
-
-          Para ver exemplos detalhados, visite:
-          <ph name="PROXY_HELP_URL" />
-
-          Se você ativar esta configuração, o <ph name="PRODUCT_NAME" /> e os apps ARC ignorarão todas as opções relacionadas ao proxy especificadas na linha de comando.
-
-          Se esta política não for definida, os usuários poderão escolher as próprias configurações de proxy.</translation>
 <translation id="3153348162326497318">Permite que você especifique quais extensões os usuários NÃO podem instalar. Extensões já instaladas serão removidas se adicionadas à lista negra. Um valor "*" na lista negra significa que todas as extensões são proibidas a menos que sejam listadas explicitamente na lista de permissões. Se esta política for deixada sem definição, o usuário pode instalar qualquer extensão em <ph name="PRODUCT_NAME" /> .</translation>
 <translation id="316778957754360075">Esta configuração foi descontinuada a partir da versão 29 do <ph name="PRODUCT_NAME" />. O modo recomendado de configurar as coleções de extensões/aplicativos hospedados pela organização é incluir na hospedagem do site os pacotes CRX em ExtensionInstallSources e colocar links de download direto para os pacotes em uma página da Web. É possível criar um iniciador da página da Web usando a política ExtensionInstallForcelist.</translation>
 <translation id="3185009703220253572">desde a versão <ph name="SINCE_VERSION" /></translation>
@@ -839,22 +804,6 @@
           Se esta política é configurada para "Manter cookies enquanto durar a sessão", os cookies são apagados quando a sessão é encerrada. Se o <ph name="PRODUCT_NAME" /> é executado no "modo de segundo plano", é possível que a sessão não seja encerrada quando a última janela é fechada. Consulte a política "BackgroundModeEnabled" para ver mais informações sobre como configurar esse comportamento.
 
           Se esta política não é configurada, "AllowCookies" é usada, e o usuário pode alterá-la.</translation>
-<translation id="4098957623809244159">O uso desta política foi suspenso. Use ProxyMode em vez dela.
-
-          Permite que você especifique o servidor proxy usado pelo <ph name="PRODUCT_NAME" /> e pelos apps ARC e impede que os usuários alterem as configurações de proxy.
-
-          Se você optar por nunca usar um servidor e sempre conectar diretamente, todas as outras opções serão ignoradas.
-
-          Se você optar por usar as configurações de proxy do sistema ou detectar automaticamente o servidor proxy, todas as outras opções serão ignoradas.
-
-          Se você optar por usar as configurações manuais de proxy, poderá especificar opções adicionais no "Endereço ou URL do servidor proxy", "URL de um arquivo proxy .pac" e "Lista separada por vírgulas das regras proxies ignoráveis".
-
-          Para ver exemplos detalhados, visite:
-          <ph name="PROXY_HELP_URL" />
-
-          Se você ativar esta configuração, o <ph name="PRODUCT_NAME" /> ignorará todas as opções relacionadas ao proxy especificadas na linha de comando.
-
-          Se esta política não for definida, os usuários poderão escolher as próprias configurações de proxy.</translation>
 <translation id="4103289232974211388">Redireciona para IdP de SAML após confirmação do usuário</translation>
 <translation id="410478022164847452">Especifica depois de quanto tempo de inatividade do usuário é executada a ação de inatividade no funcionamento com alimentação CA.
 
@@ -1273,14 +1222,6 @@
 <translation id="5893553533827140852">Quando essa configuração está ativada, as solicitações de autenticação gnubby são transmitidas por proxy por meio de uma conexão de host remoto.
 
            Se essa configuração não está ativada ou configurada, as solicitações de autenticação gnubby não são transmitidas por proxy.</translation>
-<translation id="5900959132054596599">O <ph name="PRODUCT_NAME" /> e apps ARC ignorarão qualquer proxy para a lista de hosts apresentada aqui.
-
-          Esta política só tem efeito se você selecionou configurações manuais de proxy em "Escolher como especificar as configurações do servidor proxy".
-
-          Você deve deixar esta política sem definição se tiver selecionado qualquer outro modo de definição de políticas de proxy.
-
-          Para ver exemplos mais detalhados, visite:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Permitir atualização automática de downloads via HTTP</translation>
 <translation id="5921888683953999946">Definir o estado padrão do recurso de acessibilidade do cursor grande na tela de login.
 
@@ -1762,9 +1703,6 @@
 <translation id="7632724434767231364">Nome da biblioteca GSSAPI</translation>
 <translation id="7635471475589566552">Configura a localidade do aplicativo em <ph name="PRODUCT_NAME" /> e impede que os usuários a alterem. Se ativar esta configuração, <ph name="PRODUCT_NAME" /> utilizará a localidade especificada. Se a localidade configurada não for compatível, "pt-BR" será utilizada. Se esta configuração for desativada ou não for configurada, <ph name="PRODUCT_NAME" /> utilizará a localidade preferida especificada pelo usuário (se configurada), a localidade do sistema ou a localidade padrão "pt-BR".</translation>
 <translation id="7651739109954974365">Determina se o roaming de dados deve ser ativado para o dispositivo. Se configurado para true, o roaming de dados será permitido. Se não for configurado ou for configurado como false, o roaming de dados não estará disponível.</translation>
-<translation id="7667184304362487902">Define as configurações de proxy para o <ph name="PRODUCT_NAME" /> e apps ARC.
-
-      Esta política ainda não está pronta para uso. Não a utilize.</translation>
 <translation id="76810863974142048">URL no qual os clientes de acesso remoto devem conseguir o token de autenticação.
 
         Quando esta política é definida, o host de acesso remoto precisa de clientes autenticados para conseguir um token de autenticação desse URL para conectar-se. Deve ser usada juntamente com RemoteAccessHostTokenValidationUrl.
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb
index c0b9b56c..1826c25 100644
--- a/components/policy/resources/policy_templates_pt-PT.xtb
+++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="pt-PT">
 <translation id="101438888985615157">Rodar o ecrã 180 graus</translation>
-<translation id="1015272884520659144">Define a lista de dispositivos USB que estão autorizados a ser desligados do respetivo controlador de kernel para serem utilizados diretamente através da API chrome.usb numa aplicação Web. As entradas são pares de identificador de fornecedor de USB e identificador de produto para identificar um hardware específico.
-
-      Se esta política não estiver configurada, a lista de dispositivos USB amovíveis é considerada como estando vazia.</translation>
 <translation id="1017967144265860778">Gestão de energia no ecrã de início de sessão</translation>
 <translation id="1019101089073227242">Definir diretório de dados do utilizador</translation>
 <translation id="1022361784792428773">IDs das extensões que os utilizadores não poderão instalar (ou * para todas)</translation>
@@ -65,14 +62,6 @@
       Se a política não for definida ou for definida como falsa, os conjuntos de cifras RC4 no TLS não estão ativados. Caso contrário, pode ser definida como verdadeira para manter a compatibilidade com um servidor desatualizado. Esta é uma medida temporária e é necessário voltar a configurar o servidor.</translation>
 <translation id="1297182715641689552">Utilizar um script de proxy .pac</translation>
 <translation id="1304973015437969093">Instalar IDs de extensões/aplicações e URLs de atualização silenciosamente</translation>
-<translation id="1310699457130669094">Pode especificar um URL para um ficheiro .pac de proxy aqui.
-
-          Esta política só é aplicada se selecionar definições de proxy manuais em "Escolher como indicar as definições do servidor proxy".
-
-          Deixe esta política por definir se tiver selecionado qualquer outro modo para definir políticas de proxy.
-
-          Para obter exemplos detalhados, visite:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Especifica a percentagem que determina a escala do atraso do esbatimento do ecrã quando há atividade da parte do utilizador, enquanto o ecrã é esbatido ou pouco depois de o ecrã ter sido desligado.
 
           Se esta política estiver definida, especifica a percentagem que determina a escala do atraso do esbatimento do ecrã quando há atividade da parte do utilizador, enquanto o ecrã é esbatido ou pouco depois de o ecrã ter sido desligado. Quando se determina a escala do atraso do esbatimento, o bloqueio e a ação de desligar o ecrã e atrasos inativos são ajustados para manter as mesmas distâncias do atraso de esbatimento do ecrã, conforme foi configurado originalmente.
@@ -153,18 +142,6 @@
 <translation id="1561424797596341174">Substituições da política para compilações de Depuração do anfitrião de acesso remoto</translation>
 <translation id="1583248206450240930">Utilizar o <ph name="PRODUCT_FRAME_NAME" /> por predefinição</translation>
 <translation id="1608755754295374538">URLs aos quais será concedido acesso a dispositivos de captura de áudio imediatamente</translation>
-<translation id="1613574633990410986">Permite-lhe especificar o servidor proxy utilizado pelo <ph name="PRODUCT_NAME" /> e pelas aplicações ARC e impede os utilizadores de alterar as definições de proxy.
-
-      Se optar por nunca utilizar um servidor proxy e estabelecer sempre ligação diretamente, todas as outras opções são ignoradas.
-
-      Se optar por detetar automaticamente o servidor proxy, todas as outras opções são ignoradas.
-
-      Para obter exemplos detalhados, aceda a:
-      <ph name="PROXY_HELP_URL" />
-
-      Se ativar esta definição, o <ph name="PRODUCT_NAME" /> e as aplicações ARC ignoram todas as opções relacionadas com o proxy especificadas a partir da linha de comandos.
-
-      Se deixar estas políticas por definir, permite que os utilizadores selecionem as definições de proxy conforme pretendam.</translation>
 <translation id="1617235075406854669">Ativar a eliminação do histórico de transferências e do navegador</translation>
 <translation id="1617384279878333801">Ativar adicionar pessoa no gestor de perfis</translation>
 <translation id="1655229863189977773">Definir o tamanho da cache do disco em bytes</translation>
@@ -249,7 +226,6 @@
       Se estiver ativado, é mostrado um botão vermelho grande para terminar sessão no tabuleiro do sistema enquanto uma sessão estiver ativa e o ecrã não estiver bloqueado.
 
       Se estiver desativado ou não especificado, não é mostrado nenhum botão vermelho grande para terminar sessão no tabuleiro do sistema.</translation>
-<translation id="1942957375738056236">Pode especificar o URL do servidor proxy aqui. Esta política só é aplicada se tiver selecionado definições de proxy manuais em "Escolher como indicar as definições do servidor proxy". Deixe esta política por definir se tiver selecionado qualquer outro modo para definir políticas de proxy. Para mais opções e exemplos detalhados, visite: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Configure a gestão de energia no ecrã de início de sessão no <ph name="PRODUCT_OS_NAME" />.
 
       Esta política permite configurar o comportamento do <ph name="PRODUCT_OS_NAME" /> quando não existe qualquer atividade do utilizador durante um determinado período enquanto o ecrã de início de sessão está a ser apresentado. A política controla várias definições. Para consultar a sua semântica e intervalos de valores individuais, veja as políticas correspondentes que controlam a gestão de energia dentro de uma sessão. As únicas exceções a estas políticas são:
@@ -612,24 +588,6 @@
 <translation id="3072847235228302527">Definir os Termos de Utilização para uma conta local do dispositivo</translation>
 <translation id="3096595567015595053">Lista de plug-ins ativados</translation>
 <translation id="3101501961102569744">Escolher como indicar as definições do servidor proxy</translation>
-<translation id="3125884964575432854">Permite-lhe especificar o servidor proxy utilizado pelo <ph name="PRODUCT_NAME" /> e pelas aplicações ARC e impede os utilizadores de alterar as definições de proxy.
-
-          Se optar por nunca utilizar um servidor proxy e estabelecer sempre ligação diretamente, todas as outras opções são ignoradas.
-
-          Se optar por utilizar as definições de proxy do sistema, todas as outras opções são ignoradas.
-
-          Se optar por detetar automaticamente o servidor proxy, todas as outras opções são ignoradas.
-
-          Se selecionar o modo de servidor proxy fixo, pode especificar outras opções em "Endereço ou URL do servidor proxy" e "Lista separada por vírgulas das regras para ignorar o proxy". As aplicações ARC utilizam apenas o servidor proxy HTTP com a prioridade mais elevada.
-
-          Se optar por utilizar um script de proxy .pac, tem de especificar o URL para o script em "URL para um ficheiro .pac de proxy".
-
-          Para obter exemplos detalhados, aceda a:
-          <ph name="PROXY_HELP_URL" />
-
-          Se ativar esta definição, o <ph name="PRODUCT_NAME" /> e as aplicações ARC ignoram todas as opções relacionadas com o proxy especificadas a partir da linha de comandos.
-
-          Se deixar esta política por definir, permite que os utilizadores selecionem as definições de proxy conforme pretendam.</translation>
 <translation id="3153348162326497318">Permite especificar as extensões que NÃO podem ser instaladas pelos utilizadores. Se constarem da lista negra, as extensões já instaladas serão removidas. Um valor de lista negra "*" significa que todas as extensões constam da lista negra, a menos que estejam expressamente indicadas na lista de autorizações. Se esta política não for definida, o utilizador pode instalar qualquer extensão no <ph name="PRODUCT_NAME" />.</translation>
 <translation id="316778957754360075">Esta definição foi removida a partir da versão 29 do <ph name="PRODUCT_NAME" />. A forma recomendada de configurar coleções de extensões/aplicações alojadas na entidade é incluir no alojamento do site os pacotes CRX em ExtensionInstallSources e colocar links de transferência diretos para os pacotes numa página Web. Pode ser criado um iniciador para essa página Web utilizando a política ExtensionInstallForcelist.</translation>
 <translation id="3185009703220253572">desde a versão <ph name="SINCE_VERSION" /></translation>
@@ -694,6 +652,7 @@
 Se esta definição estiver ativada ou por configurar, os utilizadores podem ativar o proxy do "cloud print" através da autenticação junto da respetiva Conta Google.
 
 Se esta definição estiver desativada, os utilizadores não podem ativar o proxy e o computador não poderá partilhar as impressoras nele instaladas com o <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Ativa a conclusão de processos no Gestor de tarefas</translation>
 <translation id="3322771899429619102">Permite definir uma lista de padrões de URL que especificam os sites autorizados a utilizar a geração de chaves. Se um padrão do URL estiver incluído em "KeygenBlockedForUrls", tal substitui estas exceções.
 
           Se esta política não for definida, é utilizado o valor global predefinido para todos os sites, seja a partir da política "DefaultKeygenSetting", se estiver definida, ou a partir da configuração pessoal do utilizador.</translation>
@@ -864,22 +823,6 @@
           Se esta política estiver definida como "Manter cookies durante toda a sessão", os cookies são apagados quando a sessão for fechada. Tenha em atenção que se o <ph name="PRODUCT_NAME" /> estiver em execução no "modo de segundo plano", a sessão pode não ser fechada quando a última janela for fechada. Consulte a política "BackgroundModeEnabled" para obter mais informações acerca da configuração deste comportamento.
 
           Se esta política não for definida, "AllowCookies" é utilizada e o utilizador pode alterá-la.</translation>
-<translation id="4098957623809244159">Esta política foi descontinuada. Em alternativa, utilize ProxyMode.
-
-          Permite-lhe especificar o servidor proxy utilizado pelo <ph name="PRODUCT_NAME" /> e pelas aplicações ARC e impede os utilizadores de alterar as definições de proxy.
-
-          Se optar por nunca utilizar um servidor proxy e estabelecer sempre ligação diretamente, todas as outras opções são ignoradas.
-
-          Se optar por utilizar as definições de proxy do sistema ou detetar automaticamente o servidor proxy, todas as outras opções são ignoradas.
-
-          Se selecionar as definições de proxy manuais, pode especificar outras opções em "Endereço ou URL do servidor proxy", "URL para um ficheiro .pac de proxy" e "Lista separada por vírgulas das regras para ignorar o proxy".
-
-          Para obter exemplos detalhados, aceda a:
-          <ph name="PROXY_HELP_URL" />
-
-          Se ativar esta definição, o <ph name="PRODUCT_NAME" /> ignora todas as opções relacionadas com o proxy especificadas a partir da linha de comandos.
-
-          Se deixar esta política por definir, permite que os utilizadores selecionem as definições de proxy conforme pretendam.</translation>
 <translation id="4103289232974211388">Redirecionar para SAML IdP após confirmação do utilizador</translation>
 <translation id="410478022164847452">Especifica o período de tempo sem atividade por parte do utilizador após o qual se realiza a ação de inatividade quando o dispositivo está ligado à eletricidade.
 
@@ -1306,14 +1249,6 @@
 <translation id="5893553533827140852">Se esta definição estiver ativada, os pedidos de autenticação gnubby serão utilizados com proxy numa ligação de anfitrião remoto.
 
           Se esta definição estiver desativada ou não estiver configurada, os pedidos de autenticação não serão utilizados com proxy.</translation>
-<translation id="5900959132054596599">O <ph name="PRODUCT_NAME" /> e as aplicações ARC ignoram qualquer proxy para a lista de anfitriões fornecida aqui.
-
-          Esta política só é aplicada se tiver selecionado as definições de proxy manuais em "Escolher como especificar as definições do servidor proxy".
-
-          Deixe esta política por definir se tiver selecionado qualquer outro modo para a definição de políticas de proxy.
-
-          Para obter exemplos mais detalhados, aceda a:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Permitir transferências de atualização automática por HTTP</translation>
 <translation id="5921888683953999946">Definir o estado predefinido da funcionalidade de acessibilidade do cursor grande no ecrã de início de sessão.
 
@@ -1797,9 +1732,6 @@
 <translation id="7632724434767231364">Nome da biblioteca GSSAPI</translation>
 <translation id="7635471475589566552">Configura o local da aplicação no <ph name="PRODUCT_NAME" /> e impede que os utilizadores o alterem. Se ativar esta definição, o <ph name="PRODUCT_NAME" /> utilizará o local indicado. Se o local configurado não for suportado, será utilizado "en-US". Se esta definição estiver desativada ou não for definida, o <ph name="PRODUCT_NAME" /> utilizará o local preferencial indicado pelo utilizador (se estiver configurado), o local do sistema ou o local alternativo "en-US".</translation>
 <translation id="7651739109954974365">Determina se o roaming de dados deve estar ativado para o aparelho. Se a política estiver definida como verdadeira, o roaming de dados é permitido. Se ficar por configurar ou for definida como falsa, o roaming de dados não estará disponível.</translation>
-<translation id="7667184304362487902">Configura as definições de proxy para o <ph name="PRODUCT_NAME" /> e as aplicações ARC.
-
-      Esta política ainda não está pronta para ser utilizada, por isso, não a utilize.</translation>
 <translation id="76810863974142048">URL onde os clientes de acesso remoto devem obter o respetivo símbolo de autenticação.
 
           Se esta política estiver definida, o anfitrião de acesso remoto exige que os clientes que tentam efetuar a autenticação obtenham um símbolo de autenticação a partir deste URL para estabelecer ligação. Deve utilizá-la em conjunto com a política RemoteAccessHostTokenValidationUrl.
@@ -2012,6 +1944,7 @@
 
       O valor da política deve ser especificado em milissegundos.</translation>
 <translation id="8344454543174932833">Importar marcadores a partir do navegador predefinido na primeira execução</translation>
+<translation id="8359734107661430198">Ativar a API ExampleDeprecatedFeature através de 2008/09/02</translation>
 <translation id="8360452361555133173">Ativa a apresentação da página de boas-vindas da primeira vez que o navegador for iniciado após uma atualização do SO.
 
       Se esta política estiver definida como verdadeira ou não estiver configurada, o navegador volta a apresentar a página de boas-vindas da primeira vez que for iniciado após uma atualização do SO.
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb
index 9e4a874c..49377cb1 100644
--- a/components/policy/resources/policy_templates_ro.xtb
+++ b/components/policy/resources/policy_templates_ro.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ro">
 <translation id="101438888985615157">Rotește ecranul la 180 de grade</translation>
-<translation id="1015272884520659144">Definește lista de dispozitive USB care pot fi detașate de driverul kernel pentru a fi folosite prin API-ul chrome.usb direct într-o aplicație web. Pentru a se identifica un anumit hardware, intrările sunt perechi formate din Identificatorul furnizorului USB și Identificatorul produsului USB.
-
-      Dacă această politică nu este configurată, lista de dispozitive USB detașabile este considerată necompletată.</translation>
 <translation id="1017967144265860778">Gestionarea consumului de energie pe ecranul de conectare</translation>
 <translation id="1019101089073227242">Setează directorul pentru datele utilizatorului</translation>
 <translation id="1022361784792428773">ID-urile extensiilor pe care utilizatorul nu are permisiunea să le instaleze (sau * pentru toate)</translation>
@@ -66,7 +63,6 @@
       Dacă această politică nu este configurată sau dacă este dezactivată, suitele de codificare RC4 din TLS nu vor fi activate. În caz contrar, politica poate fi activată pentru a se menține compatibilitatea cu un server învechit. Aceasta este o măsură temporară, iar serverul trebuie să fie reconfigurat.</translation>
 <translation id="1297182715641689552">Utilizează un script .pac pentru proxy</translation>
 <translation id="1304973015437969093">ID-uri pentru extensii/aplicații și adrese URL pentru actualizări de instalat în fundal</translation>
-<translation id="1310699457130669094">Aici puteți specifica adresa URL a unui fișier .pac pentru proxy. Această politică are efect numai dacă ați selectat manual setările proxy la „Alegeți modul de specificare a setărilor serverului proxy”. Trebuie să lăsați această politică nesetată dacă ați selectat alt mod pentru setarea politicilor de proxy. Pentru mai multe opțiuni și exemple detaliate, accesați: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Specifică procentul de ajustare a intervalului până la reducerea luminozității ecranului atunci când se înregistrează activități ale utilizatorului în timp ce luminozitatea ecranului este redusă sau la scurt timp după ce ecranul a fost oprit.
 
           Dacă această politică este configurată, ea specifică procentul cu care este ajustat intervalul până la reducerea luminozității ecranului când se înregistrează activități ale utilizatorului în timp ce luminozitatea ecranului este redusă sau la scurt timp după ce ecranul a fost oprit. Dacă intervalul până la reducerea luminozității este ajustat, intervalele până la oprirea ecranului, blocarea ecranului sau trecerea la modul inactiv sunt modificate pentru a se păstra aceleași distanțe configurate inițial față de intervalul până la reducerea luminozității ecranului.
@@ -148,18 +144,6 @@
 <translation id="1561424797596341174">Suprascrieri de politici pentru versiunile de depanare ale gazdei de acces la distanță</translation>
 <translation id="1583248206450240930">Utilizează <ph name="PRODUCT_FRAME_NAME" /> în mod prestabilit</translation>
 <translation id="1608755754295374538">Adresele URL cărora li se va acorda acces automat la dispozitivele de capturare a conținutului audio</translation>
-<translation id="1613574633990410986">Îți permite să specifici serverul proxy folosit de <ph name="PRODUCT_NAME" /> și de aplicațiile ARC și împiedică utilizatorii să modifice setările de proxy.
-
-      Dacă alegi să nu folosești niciodată un server proxy și să te conectezi întotdeauna direct, toate celelalte opțiuni sunt ignorate.
-
-      Dacă alegi detectarea automată a serverului proxy, toate celelalte opțiuni sunt ignorate:
-
-      Pentru exemple detaliate, accesează:
-      <ph name="PROXY_HELP_URL" />
-
-      Dacă activezi această setare, <ph name="PRODUCT_NAME" /> și aplicațiile ARC vor ignora toate opțiunile privind serverul proxy specificate din linia de comandă.
-
-      Dacă nu configurezi politicile, utilizatorii vor avea permisiunea să aleagă setările de proxy.</translation>
 <translation id="1617235075406854669">Permite ștergerea istoricului browserului și a istoricului descărcărilor</translation>
 <translation id="1617384279878333801">Activează adăugarea persoanelor în managerul de profiluri</translation>
 <translation id="1655229863189977773">Setați dimensiunea în octeți a memoriei cache pe disc</translation>
@@ -248,7 +232,6 @@
       Dacă este activată, un buton mare, roșu, de deconectare, este afișat în bara de sistem cât timp sesiunea este activă și ecranul nu este blocat.
 
       Dacă este dezactivată sau nu este specificată, în bara de sistem nu apare niciun buton mare, roșu, de deconectare.</translation>
-<translation id="1942957375738056236">Puteți să specificați aici adresa URL a serverului proxy. Această politică are efect numai dacă ați selectat manual setările pentru proxy la „Alegeți cum să specificați setările pentru serverul proxy”. Trebuie să lăsați această politică nesetată dacă ați selectat orice alt mod pentru setarea politicilor de proxy. Pentru mai multe opțiuni și exemple detaliate, accesați: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Configurează gestionarea consumului de energie pe ecranul de conectare din <ph name="PRODUCT_OS_NAME" />.
 
       Această politică vă permite să configurați comportamentul <ph name="PRODUCT_OS_NAME" /> în cazul în care nu a existat o activitate inițiată de utilizator într-un interval de timp în care s-a afișat ecranul de conectare. Politica controlează mai multe setări. Pentru intervalele de valori și semantica fiecăreia dintre acestea, consultați politicile corespunzătoare care controlează gestionarea consumului de energie în timpul unei sesiuni. Singurele abateri de la această politică sunt următoarele:
@@ -613,25 +596,6 @@
 <translation id="3072847235228302527">Setați Termenii și condițiile pentru un cont local de pe dispozitiv</translation>
 <translation id="3096595567015595053">Lista de pluginuri activate</translation>
 <translation id="3101501961102569744">Alege modul de specificare a setărilor serverului proxy</translation>
-<translation id="3125884964575432854">Îți permite să specifici serverul proxy folosit de <ph name="PRODUCT_NAME" /> 
-și de aplicațiile ARC și împiedică utilizatorii să modifice setările de proxy.
-
-          Dacă alegi să nu folosești niciodată un server proxy și să te conectezi întotdeauna direct, toate celelalte opțiuni sunt ignorate.
-
-          Dacă alegi să folosești setările de proxy ale sistemului, toate celelalte opțiuni sunt ignorate.
-
-          Dacă alegi detectarea automată a serverului proxy, toate celelalte opțiuni sunt ignorate.
-
-          Dacă alegi modul server proxy fix, poți specifica opțiuni suplimentare în „Adresa IP sau adresa URL a serverului proxy” și „Lista cu valori separate prin virgulă a regulilor de ocolire a proxy-ului”. Aplicațiile ARC vor folosi numai serverul proxy HTTP cu cea mai mare prioritate.
-
-          Dacă alegi să folosești un script .pac pentru proxy, trebuie să specifici adresa URL a scriptului în „Adresa URL a unui fișier .pac pentru proxy”.
-
-          Pentru exemple detaliate, accesează:
-          <ph name="PROXY_HELP_URL" />
-
-          Dacă activezi această setare, <ph name="PRODUCT_NAME" /> și aplicațiile ARC vor ignora toate opțiunile privind serverul proxy specificate din linia de comandă.
-
-          Dacă nu configurezi politica, utilizatorii vor avea permisiunea să aleagă setările proxy.</translation>
 <translation id="3153348162326497318">Vă permite să specificați extensiile pe care utilizatorii NU le pot instala. Extensiile deja instalate vor fi eliminate, dacă sunt pe lista neagră. O valoare „*” din lista neagră înseamnă că toate extensiile apar în lista neagră, cu excepția cazului în care acestea sunt explicit specificate în lista albă. Dacă această politică este lăsată nesetată, utilizatorul poate instala orice extensie în <ph name="PRODUCT_NAME" />.</translation>
 <translation id="316778957754360075">Această politică a fost retrasă începând cu <ph name="PRODUCT_NAME" /> versiunea 29. Pentru a crea colecții de extensii/aplicații găzduite la nivel de organizație, se recomandă să includeți site-ul care găzduiește pachetele CRX în ExtensionInstallSources și să afișați pe o pagină web linkuri de descărcare directă spre pachete. Puteți crea un lansator pentru respectiva pagină web utilizând politica ExtensionInstallForcelist.</translation>
 <translation id="3185009703220253572">de la versiunea <ph name="SINCE_VERSION" /></translation>
@@ -696,6 +660,7 @@
       Dacă această setare este activată sau nu este configurată, utilizatorii pot activa proxy-ul Cloud Print autentificându-se cu Contul Google.
 
       Dacă această setare este dezactivată, utilizatorii nu pot activa proxy-ul, iar computerul nu va putea să permită accesul <ph name="CLOUD_PRINT_NAME" /> la imprimantele sale.</translation>
+<translation id="3297010562646015826">Activează oprirea proceselor în Managerul de activități</translation>
 <translation id="3322771899429619102">Îți permite să setezi o listă de șabloane de adrese URL care specifică site-urile ce au permisiunea să folosească generarea cheilor. Dacă în „KeygenBlockedForUrls” este specificat un șablon de adresă URL, această politică va modifica aceste excepții.
 
           Dacă politica nu este configurată, valoarea prestabilită la nivel global va fi folosită pentru toate site-urile, fie din politica „DefaultKeygenSetting”, în cazul în care aceasta este configurată, fie din configurația personală a utilizatorului, în caz contrar.</translation>
@@ -872,22 +837,6 @@
           Dacă această politică este setată la „Păstrează cookie-urile pe durata sesiunii”, cookie-urile vor fi șterse la finalizarea sesiunii. Reține că, dacă <ph name="PRODUCT_NAME" /> rulează în „modul fundal”, este posibil ca sesiunea să nu se închidă atunci când ultima fereastră este închisă. Consultă politica „BackgroundModeEnabled” pentru mai multe informații despre configurarea acestui comportament.
 
           Dacă politica nu este configurată, va fi folosită politica „AllowCookies”, iar utilizatorul o va putea schimba.</translation>
-<translation id="4098957623809244159">Această politică este învechită, folosește ProxyMode.
-
-          Îți permite să specifici serverul proxy folosit de <ph name="PRODUCT_NAME" /> și de aplicațiile ARC și împiedică utilizatorii să modifice setările de proxy.
-
-          Dacă alegi să nu folosești niciodată un server proxy și să te conectezi întotdeauna direct, toate celelalte opțiuni sunt ignorate.
-
-          Dacă alegi să folosești setările de proxy ale sistemului sau detectarea automată a serverului proxy, toate celelalte opțiuni sunt ignorate.
-
-          Dacă alegi setările de proxy manuale, poți specifica opțiuni suplimentare în „Adresa IP sau adresa URL a serverului proxy”, „Adresa URL a unui fișier .pac pentru proxy” și „Lista cu valori separate prin virgulă a regulilor de ocolire a proxy-ului”.
-
-          Pentru exemple detaliate, accesează:
-          <ph name="PROXY_HELP_URL" />
-
-          Dacă activezi această setare, <ph name="PRODUCT_NAME" /> va ignora toate opțiunile privind serverul proxy specificate din linia de comandă.
-
-          Dacă nu configurezi politica, utilizatorii vor avea permisiunea să aleagă setările de proxy.</translation>
 <translation id="4103289232974211388">Redirecționează către furnizorul de identitate SAML după confirmarea utilizatorului</translation>
 <translation id="410478022164847452">Specifică intervalul de timp fără intervenția utilizatorului după care se ia măsura pentru inactivitate la funcționarea pe c.a.
 
@@ -1318,14 +1267,6 @@
 <translation id="5893553533827140852">Dacă această setare este activată, solicitările de autentificare gnubby vor fi trimise printr-un proxy folosindu-se o conexiune a gazdei la distanță.
 
           Dacă această setare este dezactivată sau nu este configurată, solicitările de autentificare gnubby nu vor fi trimise printr-un proxy.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> și aplicațiile ARC vor ocoli toate proxy-urile pentru lista de gazde indicată aici.
-
-          Această politică are efect doar dacă ai selectat setările de proxy manuale la „Alege modul de specificare a setărilor serverului proxy”.
-
-          Ar trebui să lași această politică neconfigurată dacă ai selectat oricare alt mod de setare a politicilor de proxy.
-
-          Pentru mai multe exemple detaliate, accesează:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Permite descărcarea actualizărilor automate prin HTTP</translation>
 <translation id="5921888683953999946">Setați funcția de accesibilitate pentru cursorul mare ca stare prestabilită pe ecranul de conectare.
 
@@ -1810,9 +1751,6 @@
 <translation id="7632724434767231364">Nume bibliotecă GSSAPI</translation>
 <translation id="7635471475589566552">Configurează limba aplicației din <ph name="PRODUCT_NAME" /> și împiedică modificarea limbii de către utilizatori. Dacă activați această setare, <ph name="PRODUCT_NAME" /> utilizează limba indicată. Dacă limba configurată nu este acceptată, este utilizată „en-US”. Dacă această setare este dezactivată sau nu este configurată, <ph name="PRODUCT_NAME" /> utilizează limba preferată specificată de utilizator (dacă este configurată), limba sistemului sau limba „en-US” alternativă.</translation>
 <translation id="7651739109954974365">Această politică stabilește dacă roamingul de date trebuie să fie activat pentru dispozitiv. Dacă această politică este activată, roamingul de date este permis. Dacă politica nu este configurată sau este neactivată, roamingul de date nu va fi disponibil.</translation>
-<translation id="7667184304362487902">Configurează setările de proxy pentru <ph name="PRODUCT_NAME" /> și aplicațiile ARC.
-
-      Această politică încă nu este gata pentru utilizare. Nu o folosi.</translation>
 <translation id="76810863974142048">Adresa URL de la care clienții cu acces la distanță trebuie să își obțină indicativul de autentificare.
 
           Dacă această politică este setată, gazda de acces de la distanță va solicita clienților care se autentifică să obțină un indicativ de autentificare de la această adresă URL, pentru a se conecta. Trebuie să fie folosită împreună cu RemoteAccessHostTokenValidationUrl.
@@ -2028,6 +1966,7 @@
 
       Valoarea politicii ar trebui să fie specificată în milisecunde.</translation>
 <translation id="8344454543174932833">Importați marcaje din browserul prestabilit, la prima rulare</translation>
+<translation id="8359734107661430198">Activează API-ul ExampleDeprecatedFeature până pe 02.09.2008</translation>
 <translation id="8360452361555133173">Activează afișarea paginii de întâmpinare la prima lansare a browserului după upgrade-ul sistemului de operare.
 
       Dacă această politică este activată sau nu este configurată, browserul va afișa din nou pagina de întâmpinare la prima lansare după upgrade-ul sistemului de operare.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 9f17ea1f..d068f68 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ru">
 <translation id="101438888985615157">Повернуть экран на 180 градусов</translation>
-<translation id="1015272884520659144">Определяет список USB-устройств, которые можно использовать напрямую в веб-приложениях через chrome.usb API (в обход драйвера ядра). Каждая запись содержит пару идентификаторов (продавца и товара), чтобы точно определить устройство.
-
-      Если это правило не настроено, список отсоединяемых USB-устройств считается пустым.</translation>
 <translation id="1017967144265860778">Управление питанием на экране входа</translation>
 <translation id="1019101089073227242">Указать каталог для пользовательских данных</translation>
 <translation id="1022361784792428773">Идентификаторы расширений, которые запрещено устанавливать пользователям ("*" запрещает установку всех расширений)</translation>
@@ -63,7 +60,6 @@
       Если правило не настроено или для него выбрано значение False, наборы шифров RC4 в TLS не будут включены. Если указано значение True, совместимость с устаревшим сервером сохранится. Однако помните, что это временная мера и сервер необходимо перенастроить.</translation>
 <translation id="1297182715641689552">Использовать скрипт PAC для прокси-сервера</translation>
 <translation id="1304973015437969093">Устанавливать идентификаторы расширений/приложений и URL обновлений без подтверждения пользователя</translation>
-<translation id="1310699457130669094">Здесь указывается URL PAC-файла прокси-сервера. Это правило действует, только если в разделе "Выбрать способ настройки прокси-сервера" выбрана настройка вручную. Если выбран какой-либо другой режим, не настраивайте это правило. Подробные сведения и примеры можно найти здесь: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Коэффициент увеличения задержки затемнения экрана, если пользователь выполняет действия на устройстве после затемнения или вскоре после отключения экрана.
 
           Если это правило настроено, оно обозначает, на сколько процентов изменяется время задержки затемнения экрана, если пользователь выполняет действия на устройстве после затемнения или вскоре после отключения экрана. При этом соответствующим образом изменяется задержка отключения, блокировки экрана и перехода в режим ожидания.
@@ -135,18 +131,6 @@
 <translation id="1561424797596341174">Позволяет изменить правила сборок для отладки хоста удаленного доступа</translation>
 <translation id="1583248206450240930">Использовать <ph name="PRODUCT_FRAME_NAME" /> по умолчанию</translation>
 <translation id="1608755754295374538">URL, которым доступ к аудиозаписывающим устройствам предоставляется без запроса</translation>
-<translation id="1613574633990410986">Позволяет задать прокси-сервер, используемый <ph name="PRODUCT_NAME" /> и приложениями ARC, а также запрещает пользователям менять его настройки.
-
-      Если вы решите отказаться от использования прокси-сервера и всегда устанавливать прямое соединение, все остальные параметры будут игнорироваться.
-
-      Если вы предпочтете автоматически определять прокси-сервер, все остальные параметры будут игнорироваться.
-
-      Подробные примеры приведены на странице
-      <ph name="PROXY_HELP_URL" />.
-
-      Если этот параметр включен, <ph name="PRODUCT_NAME" /> и приложения ARC игнорируют все настройки прокси-сервера, указанные с помощью командной строки.
-
-      Если он не задан, пользователи могут менять настройки самостоятельно.</translation>
 <translation id="1617235075406854669">Удаление истории просмотров и загрузок браузера</translation>
 <translation id="1617384279878333801">Разрешить добавлять людей через менеджер профилей</translation>
 <translation id="1655229863189977773">Задать объем кеша в байтах</translation>
@@ -224,7 +208,6 @@
 Если параметр включен, в области уведомлений появится крупная красная кнопка. Для этого необходимо предварительно выполнить вход, а экран не должен быть заблокирован.
 
 Если параметр отключен или не задан, кнопка выхода отображаться не будет.</translation>
-<translation id="1942957375738056236">Здесь указывается URL прокси-сервера. Это правило действует, только если в разделе "Выбрать способ настройки прокси-сервера" выбрана настройка вручную. Если выбран какой-либо другой режим, не настраивайте это правило. Подробные сведения и примеры можно найти здесь: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Управление электропитанием на экране входа в <ph name="PRODUCT_OS_NAME" />.
 
       Это правило позволяет выбрать действия <ph name="PRODUCT_OS_NAME" /> после определенного периода неактивности, если отображается экран входа. Оно регулирует сразу несколько настроек. Диапазоны значений для каждой из них задаются с помощью отдельных правил управления электропитанием во время сеанса. В данном случае для указанных правил действуют только два ограничения:
@@ -585,24 +568,6 @@
 <translation id="3072847235228302527">Установить Условия использования локального аккаунта</translation>
 <translation id="3096595567015595053">Список включенных плагинов</translation>
 <translation id="3101501961102569744">Выбрать способ настройки прокси-сервера</translation>
-<translation id="3125884964575432854">Позволяет задать прокси-сервер, используемый <ph name="PRODUCT_NAME" /> и приложениями ARC, а также запрещает пользователям менять его настройки.
-
-          Если вы решите отказаться от использования прокси-сервера и всегда устанавливать прямое соединение, все остальные параметры будут игнорироваться.
-
-          Если вы предпочтете использовать системные настройки прокси-сервера, все остальные параметры будут игнорироваться.
-
-          Если вы решите определять прокси-сервер автоматически, все остальные параметры будут игнорироваться.
-
-          Если будет использоваться конкретный прокси-сервер, его параметры можно указать в полях "Адрес или URL прокси-сервера" и "Список правил для игнорирования прокси-сервера". Приложения ARC будут использовать только прокси-сервер HTTP с наивысшим приоритетом.
-
-          Если вы предпочитаете использовать PAC-скрипт, укажите его URL в поле "URL файла PAC прокси-сервера".
-
-          Подробные примеры приведены на странице
-          <ph name="PROXY_HELP_URL" />.
-
-          Если этот параметр включен, <ph name="PRODUCT_NAME" /> и приложения ARC игнорируют все настройки прокси-сервера, указанные с помощью командной строки.
-
-          Если он не задан, пользователи могут менять настройки самостоятельно.</translation>
 <translation id="3153348162326497318">Позволяет задать расширения, которые пользователи НЕ МОГУТ устанавливать. Уже установленные расширения, входящие в этот черный список, будут удалены. Звездочка (*) запрещает все расширения, кроме тех, которые внесены в белый список. Если это правило не настроено, пользователи могут добавлять в <ph name="PRODUCT_NAME" /> любые расширения.</translation>
 <translation id="316778957754360075">Это правило не поддерживается в <ph name="PRODUCT_NAME" /> версии 29 и будет исключено из более поздних версий. Чтобы создать коллекцию приложений и расширений организации, рекомендуем указать адрес сайта, где хранятся CRX-пакеты, в правиле ExtensionInstallSources и разместить прямые ссылки на скачивание приложений на специальной веб-странице. Панель запуска для этой страницы можно создать с помощью правила ExtensionInstallForcelist.</translation>
 <translation id="3185009703220253572">начиная с версии <ph name="SINCE_VERSION" /></translation>
@@ -667,6 +632,7 @@
 Если этот параметр включен или не настроен, пользователи могут включить прокси-сервер виртуального принтера, войдя в аккаунт Google.
 
 Если этот параметр отключен, пользователи не могут включить прокси-сервер, и принтеры на этом компьютере нельзя будет использовать как <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Разрешает завершение процессов в диспетчере задач</translation>
 <translation id="3322771899429619102">Позволяет задать список шаблонов URL для сайтов, которым разрешено создавать ключи. При этом, если указанный шаблон подпадает под действие правила KeygenBlockedForUrls, сайту все равно будет разрешено создавать ключи. Если правило KeygenAllowedForUrls не настроено, для всех сайтов используется значение по умолчанию на основе правила DefaultKeygenSetting (если оно настроено, в противном случае – на основе пользовательской конфигурации).</translation>
 <translation id="3381968327636295719">Использовать по умолчанию основной браузер</translation>
 <translation id="3398137877608138703">Позволяет включить или отключить функции записи видео.
@@ -834,22 +800,6 @@
           Если вы выберете вариант "Хранить файлы cookie до конца сеанса", учтите следующее: когда <ph name="PRODUCT_NAME" /> работает в фоновом режиме, сеанс не завершается даже после того, как закрываются все окна. Подробную информацию вы найдете в описании правила BackgroundModeEnabled.
 
           Если вы не настроите DefaultCookiesSetting, будет действовать правило AllowCookies и пользователи смогут самостоятельно изменить его значение.</translation>
-<translation id="4098957623809244159">Это правило устарело, используйте вместо него ProxyMode.
-
-          Позволяет задать прокси-сервер, используемый <ph name="PRODUCT_NAME" /> и приложениями ARC, а также запрещает пользователям менять его настройки.
-
-          Если вы решите отказаться от использования прокси-сервера и всегда устанавливать прямое соединение, все остальные параметры будут игнорироваться.
-
-          Если вы предпочтете использовать системные настройки прокси-сервера или определять его автоматически, все остальные параметры будут игнорироваться.
-
-          Если вам требуется настроить прокси-сервер вручную, его параметры можно указать в полях "Адрес или URL прокси-сервера", "URL файла PAC прокси-сервера" и "Список правил для игнорирования прокси-сервера".
-
-          Подробные примеры приведены на странице
-          <ph name="PROXY_HELP_URL" />.
-
-          Если этот параметр включен, <ph name="PRODUCT_NAME" /> игнорирует все настройки прокси-сервера, указанные с помощью командной строки.
-
-          Если он не задан, пользователи могут менять настройки самостоятельно.</translation>
 <translation id="4103289232974211388">Входить с помощью поставщика услуг SAML (нужно подтверждение пользователя)</translation>
 <translation id="410478022164847452">Определяет, через какое время бездействия блокируется экран при работе от сети.
 
@@ -1275,14 +1225,6 @@
 <translation id="5893553533827140852">Если этот параметр включен, запросы на авторизацию Gnubby будут передаваться через подключение к удаленному хосту.
 
           Если этот параметр отключен или не задан, запросы на авторизацию Gnubby не будут передаваться через прокси.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> и приложения ARC будут обходить прокси-серверы для перечисленных здесь хостов.
-
-          Правило действует, только если в разделе "Выбрать способ настройки прокси-сервера" выбрана настройка вручную.
-
-          Если включен какой-либо другой режим, не устанавливайте это правило.
-
-          Подробные примеры приведены на странице
-          <ph name="PROXY_HELP_URL" />.</translation>
 <translation id="5921713479449475707">Разрешить автоматическое скачивание обновлений по протоколу HTTP</translation>
 <translation id="5921888683953999946">Наличие или отсутствие большого курсора по умолчанию на экране входа.
 
@@ -1766,9 +1708,6 @@
 <translation id="7632724434767231364">название библиотеки GSSAPI</translation>
 <translation id="7635471475589566552">Устанавливает региональные настройки приложения в <ph name="PRODUCT_NAME" /> и запрещает пользователям менять их. Если этот параметр включен, <ph name="PRODUCT_NAME" /> использует указанные региональные настройки. Если они не поддерживаются, используется вариант en-US. Если этот параметр отключен или не настроен, <ph name="PRODUCT_NAME" /> использует региональные настройки пользователя (если они выбраны), системные региональные настройки либо резервный вариант en-US.</translation>
 <translation id="7651739109954974365">Устанавливает возможность для роуминга данных для устройства. Если параметр задан, роуминг данных разрешен. Если нет (по умолчанию), роуминг данных будет недоступен.</translation>
-<translation id="7667184304362487902">Позволяет задать настройки прокси-сервера для <ph name="PRODUCT_NAME" /> и приложений ARC.
-
-      Правило находится в стадии разработки, поэтому его использование не рекомендуется.</translation>
 <translation id="76810863974142048">URL, по которому клиенты удаленного доступа должны получать токены аутентификации.
 
           Если это правило настроено, то для подключения хост удаленного доступа потребует от клиента токен, полученный по указанному URL. Правило используется совместно с RemoteAccessHostTokenValidationUrl.
@@ -1979,6 +1918,7 @@
 
       Значения этих правил должны быть указаны в миллисекундах.</translation>
 <translation id="8344454543174932833">Импорт закладок из браузера, используемого по умолчанию, при первом запуске</translation>
+<translation id="8359734107661430198">Включить ExampleDeprecatedFeature API (2008/09/02)</translation>
 <translation id="8360452361555133173">Показывать страницу приветствия при первом запуске браузера после обновления ОС.
 
       Если это правило включено (значение True) или не установлено, при первом запуске браузера после обновления системы будет отображаться стартовая страница.
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb
index 68129f6..163f1eb7 100644
--- a/components/policy/resources/policy_templates_sk.xtb
+++ b/components/policy/resources/policy_templates_sk.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sk">
 <translation id="101438888985615157">Otočiť obrazovku o 180 stupňov</translation>
-<translation id="1015272884520659144">Definuje zoznam zariadení USB, ktoré je možné odpojiť od ovládača jadra, aby sa dali použiť prostredníctvom rozhrania chrome.usb API priamo vo webovej aplikácii. Záznamy predstavujú páry identifikátor dodávateľa USB – identifikátor produktu na určenie konkrétneho hardvéru.
-
-      Ak toto pravidlo nie je nakonfigurované, zoznam odpojiteľných zariadení USB sa považuje za prázdny.</translation>
 <translation id="1017967144265860778">Správa možností napájania na prihlasovacej obrazovke</translation>
 <translation id="1019101089073227242">Nastaviť adresár používateľských údajov</translation>
 <translation id="1022361784792428773">ID rozšírení, ktorých inštalácia by mala byť používateľovi zakázaná (alebo hodnota * pre všetky)</translation>
@@ -72,14 +69,6 @@
       Ak toto pravidlo nie je nastavené alebo je nastavené na hodnotu False, v protokole TLS nebudú povolené šifrovacie súpravy RC4. Nastavením tohto pravidla na hodnotu True je možné zaistiť kompatibilitu so zastaraným serverom. Ide o krátkodobé riešenie, takže konfigurácia príslušného servera by mala byť upravená.</translation>
 <translation id="1297182715641689552">Použiť skript servera proxy vo formáte PAC</translation>
 <translation id="1304973015437969093">ID rozšírení/aplikácií a webové adresy aktualizácií, ktoré sa majú nainštalovať na pozadí</translation>
-<translation id="1310699457130669094">Tu môžete zadať webovú adresu súboru PAC servera proxy.
-
-          Toto pravidlo sa prejaví len v prípade, ak ste v časti „Zvoľte spôsob konfigurácie nastavení servera proxy“ zvolili ručné nastavenia servera proxy.
-
-          Ak ste zvolili akýkoľvek iný režim nastavenia pravidiel servera proxy, mali by ste toto pravidlo ponechať nenastavené.
-
-          Podrobné príklady nájdete na adrese:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Určuje percentuálnu hodnotu, o ktorú sa predĺži oneskorenie stmavenia obrazovky, keď sa zaznamená aktivita používateľa počas doby, keď je obrazovka stmavená, alebo krátko po vypnutí obrazovky.
 
           Ak je toto pravidlo nastavené, určuje percentuálnu hodnotu, o ktorú sa predĺži oneskorenie stmavenia obrazovky, keď sa zaznamená aktivita používateľa počas doby, keď je obrazovka stmavená, alebo krátko po vypnutí obrazovky. Po predĺžení oneskorenia stmavenia obrazovky sa oneskorenia pre vypnutie, uzamknutie a nečinnosť obrazovky prispôsobia tak, aby si zachovali rovnaké odstupy od stmavenia obrazovky ako pri pôvodnej konfigurácii.
@@ -158,18 +147,6 @@
 <translation id="1561424797596341174">Prepísania pravidiel pre zostavy ladenia používané hostiteľom vzdialeného prístupu</translation>
 <translation id="1583248206450240930">Používať v predvolenom nastavení doplnok <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="1608755754295374538">Webové adresy, ktorým bude udelený prístup k zariadeniam na zachytávanie zvuku bez zobrazenia výzvy</translation>
-<translation id="1613574633990410986">Umožní zadať aplikácie ARC a proxy server, ktorý bude <ph name="PRODUCT_NAME" /> používať. Zabraňuje používateľom zmeniť nastavenia proxy servera.
-
-      Ak sa rozhodnete proxy server nikdy nepoužívať a vždy sa pripájať ručne, budú všetky ostatné možnosti ignorované.
-
-      Ak zvolíte možnosť automatického zisťovania proxy servera, budú všetky ostatné možnosti ignorované.
-
-      Podrobné príklady nájdete na adrese:
-      <ph name="PROXY_HELP_URL" />
-
-      Ak toto nastavenie povolíte, <ph name="PRODUCT_NAME" /> a aplikácie ARC budú ignorovať všetky možnosti týkajúce sa proxy serverov zadané pomocou príkazového riadka.
-
-      Ak toto pravidlo ponecháte nenastavené, umožní to používateľom zvoliť si proxy server samostatne.</translation>
 <translation id="1617235075406854669">Povoliť odstránenie histórie prehliadača a sťahovania</translation>
 <translation id="1617384279878333801">Povoliť pridanie osoby pomocou správcu profilov</translation>
 <translation id="1655229863189977773">Nastaviť veľkosť vyrovnávacej pamäte disku v bajtoch</translation>
@@ -260,14 +237,6 @@
       Ak je toto nastavenie povolené, v oblasti oznámení sa počas aktívnej relácie zobrazuje veľké červené tlačidlo odhlásenia (pokiaľ nie je obrazovka uzamknutá).
 
       Ak je toto nastavenie zakázané alebo nie je nastavené, v oblasti oznámení sa nezobrazuje žiadne veľké červené tlačidlo odhlásenia.</translation>
-<translation id="1942957375738056236">Tu môžete zadať webovú adresu servera proxy.
-
-          Toto pravidlo sa prejaví len v prípade, ak ste v časti „Zvoľte spôsob konfigurácie nastavení servera proxy“ zvolili ručné nastavenia servera proxy.
-
-          Ak ste zvolili akýkoľvek iný režim nastavenia pravidiel proxy, mali by ste toto pravidlo ponechať nenastavené.
-
-          Viac možností a podrobné príklady nájdete na adrese:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Konfigurácia správy napájania na prihlasovacej obrazovke systému <ph name="PRODUCT_OS_NAME" />.
 
       Toto pravidlo umožňuje nakonfigurovať správanie systému <ph name="PRODUCT_OS_NAME" /> v prípadoch, keď je zobrazená prihlasovacia obrazovka a používateľ určitý čas nevykonáva žiadnu činnosť. Toto pravidlo riadi niekoľko nastavení. Ak chcete zobraziť ich individuálnu sémantiku a rozsahy hodnôt, prejdite na zodpovedajúce pravidlá, ktoré riadia správu napájania v rámci relácie. Jedinými výnimkami z týchto pravidiel sú:
@@ -660,24 +629,6 @@
 <translation id="3072847235228302527">Nastaviť Zmluvné podmienky pre miestny účet v zariadení</translation>
 <translation id="3096595567015595053">Zoznam povolených doplnkov</translation>
 <translation id="3101501961102569744">Zvoľte spôsob konfigurácie nastavení servera proxy</translation>
-<translation id="3125884964575432854">Umožní zadať aplikácie ARC a proxy server, ktorý bude <ph name="PRODUCT_NAME" /> používať. Zabraňuje používateľom zmeniť nastavenia proxy servera.
-
-          Ak sa rozhodnete proxy server nikdy nepoužívať a vždy sa pripájať ručne, budú všetky ostatné možnosti ignorované.
-
-          Ak sa rozhodnete používať systémové nastavenia proxy servera, budú všetky ostatné možnosti ignorované.
-
-          Ak zvolíte možnosť automatického zisťovania proxy servera, budú všetky ostatné možnosti ignorované.
-
-          Ak zvolíte režim pevne daného proxy servera, môžete zvoliť ďalšie možnosti v častiach „Adresa alebo webová adresa servera proxy“ a „Zoznam pravidiel vynechania servera proxy oddelených čiarkami“. Aplikácie ARC budú používať iba proxy server HTTP s najvyššou prioritou.
-
-          Ak sa rozhodnete použiť skript .pac proxy servera, je potrebné zadať v časti „Webová adresa súboru .pac proxy servera“ webovú adresu.
-
-          Podrobné príklady nájdete na adrese:
-          <ph name="PROXY_HELP_URL" />
-
-          Ak toto nastavenie povolíte, <ph name="PRODUCT_NAME" /> a aplikácie ARC budú ignorovať všetky možnosti týkajúce sa proxy serverov zadané pomocou príkazového riadka.
-
-          Ak toto pravidlo nenastavíte, umožníte tým používateľom zvoliť si svoje vlastné nastavenia proxy servera.</translation>
 <translation id="3153348162326497318">Umožňuje určiť rozšírenia, ktoré používatelia NEMÔŽU nainštalovať. Ak sa v zozname zakázaných rozšírení vyskytuje rozšírenie, ktoré už bolo nainštalované, bude odstránené.
 
           Ak je v zozname uvedená hodnota „*“, znamená to, že sú zakázané všetky rozšírenia, ktoré nie sú explicitne uvedené v zozname povolených rozšírení.
@@ -749,6 +700,7 @@
       Ak je toto nastavenie povolené alebo nebolo nakonfigurované, používatelia môžu povoliť server proxy pre tlač z cloudu prostredníctvom overenia totožnosti pomocou účtu Google.
 
       Ak je toto nastavenie zakázané, používatelia nebudú môcť povoliť server proxy a počítač nebude môcť zdieľať pripojené tlačiarne so službou <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Povoľuje ukončovanie procesov v Správcovi úloh</translation>
 <translation id="3322771899429619102">Umožňuje nastaviť zoznam vzorov webových adries určujúcich webové stránky, ktoré môžu používať generovanie kľúčov. Ak sa vzor webovej adresy nachádza v zozname KeygenBlockedForUrls, tieto výnimky sa prepíšu.
 
           Ak toto pravidlo ponecháte nenastavené, pre všetky stránky sa použije globálna predvolená hodnota buď z pravidla DefaultKeygenSetting (ak je nastavené), alebo z osobnej konfigurácie používateľa.</translation>
@@ -930,22 +882,6 @@
           Ak je toto pravidlo nastavené na možnosť Uchovať súbory cookie počas trvania relácie, súbory cookie sa po ukončení relácie vymažú. Upozorňujeme, že ak je prehliadač <ph name="PRODUCT_NAME" /> spustený v režime na pozadí, relácia sa nemusí ukončiť po zavretí posledného okna. Ďalšie informácie o konfigurácii tohto správania nájdete pri pravidle BackgroundModeEnabled.
 
           Ak ponecháte toto pravidlo nenastavené, použije sa pravidlo AllowCookies a používateľ ho bude môcť zmeniť.</translation>
-<translation id="4098957623809244159">Toto pravidlo je zastarané, použite namiesto neho režim ProxyMode.
-
-          Umožní zadať aplikácie ARC a proxy server, ktorý bude <ph name="PRODUCT_NAME" /> používať. Zabraňuje používateľom zmeniť nastavenia proxy servera.
-
-          Ak sa rozhodnete proxy server nikdy nepoužívať a vždy sa pripájať ručne, budú všetky ostatné možnosti ignorované.
-
-          Ak sa rozhodnete používať systémové nastavenia proxy servera alebo proxy server zisťovať automaticky, budú všetky ostatné možnosti ignorované.
-
-          Ak zvolíte možnosť ručného nastavenia proxy servera, môžete zvoliť ďalšie možnosti v častiach „Adresa alebo webová adresa proxy servera“, „Webová adresa súboru .pac proxy servera“ a „Zoznam pravidiel vynechania proxy servera oddelených čiarkami“.
-
-          Podrobné príklady nájdete na adrese:
-          <ph name="PROXY_HELP_URL" />
-
-          Ak toto nastavenie povolíte, <ph name="PRODUCT_NAME" /> bude ignorovať všetky možnosti týkajúce sa proxy serverov zadané pomocou príkazového riadka.
-
-          Ak toto pravidlo nenastavíte, umožníte tým používateľom zvoliť si svoje vlastné nastavenia proxy servera.</translation>
 <translation id="4103289232974211388">Presmerovanie na poskytovateľa identity SAML po potvrdení používateľom</translation>
 <translation id="410478022164847452">Určuje dobu nečinnosti používateľa, po ktorej systém vykoná príslušnú akciu nečinnosti pri používaní napájacieho zdroja.
 
@@ -1428,14 +1364,6 @@
 <translation id="5893553533827140852">Ak je toto nastavenie povolené, žiadosti o overenie gnubby budú sprostredkované cez vzdialené pripojenie hostiteľa.
 
           Ak je toto nastavenie zakázané alebo nie je nakonfigurované, žiadosti o overenie gnubby nebudú sprostredkované.</translation>
-<translation id="5900959132054596599">Pri hostiteľoch v uvedenom zozname <ph name="PRODUCT_NAME" /> a aplikácie ARC vynechajú všetky proxy servery.
-
-          Toto pravidlo sa prejaví len v prípade, ak ste v časti „Zvoľte spôsob konfigurácie nastavení proxy servera“ zvolili ručné nastavenia proxy servera.
-
-          Ak ste zvolili akýkoľvek iný režim nastavenia pravidiel proxy, mali by ste toto pravidlo ponechať nenastavené.
-
-          Viac podrobných príkladov nájdete na adrese:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Povoliť stiahnutia automatických aktualizácií prostredníctvom protokolu HTTP</translation>
 <translation id="5921888683953999946">Nastaví predvolený stav veľkého kurzora (funkcia na uľahčenie prístupu) na prihlasovacej obrazovke.
 
@@ -1958,9 +1886,6 @@
 
       Ak je toto nastavenie zakázané alebo nenastavené, prehliadač <ph name="PRODUCT_NAME" /> použije preferované miestne nastavenie určené používateľom (ak je nakonfigurované) alebo miestne nastavenie systému alebo záložné nastavenie en-US.</translation>
 <translation id="7651739109954974365">Určuje, či bude v zariadení povolený roaming pre dátové prenosy. Ak je pravidlo nastavené na hodnotu true, roaming pre dátové prenosy bude povolený. Ak ho ponecháte nenakonfigurované alebo ho nastavíte na hodnotu false, roaming pre dátové prenosy nebude k dispozícii.</translation>
-<translation id="7667184304362487902">Nakonfiguruje nastavenia servera proxy pre <ph name="PRODUCT_NAME" /> a aplikácie ARC.
-
-      Toto pravidlo ešte nie je pripravené na používanie, preto ho radšej nepoužívajte.</translation>
 <translation id="76810863974142048">Webová adresa, kde klienti so vzdialeným prístupom získajú token na overenie totožnosti.
 
           Ak nastavíte toto pravidlo, hostiteľ vzdialeného prístupu bude od klientov overujúcich svoju totožnosť vyžadovať token na overenie totožnosti z tejto webovej adresy, aby ich mohol pripojiť. Musíte ho použiť v kombinácii s pravidlom RemoteAccessHostTokenValidationUrl.
@@ -2191,6 +2116,7 @@
 
       Hodnota pre toto pravidlo by mala byť zadaná v milisekundách.</translation>
 <translation id="8344454543174932833">Importovanie záložiek z predvoleného prehliadača pri prvom spustení</translation>
+<translation id="8359734107661430198">Povoliť rozhranie ExampleDeprecatedFeature API platné do 2. 9. 2008</translation>
 <translation id="8360452361555133173">Aktivuje zobrazenie uvítacej stránky pri prvom spustení prehliadača po prechode na vyššiu verziu OS.
 
       Ak je toto pravidlo nastavené na možnosť True alebo nie je nakonfigurované, prehliadač bude zobrazovať uvítaciu stránku pri prvom spustení po prechode na vyššiu verziu OS.
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb
index f83d60c7..516b65f 100644
--- a/components/policy/resources/policy_templates_sl.xtb
+++ b/components/policy/resources/policy_templates_sl.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sl">
 <translation id="101438888985615157">Sukanje zaslona za 180 stopinj</translation>
-<translation id="1015272884520659144">Določa seznam naprav USB, za katere je dovoljena prekinitev povezave z gonilnikom jedra zaradi uporabe prek API-ja chrome.usb neposredno v spletni aplikaciji. Vnosi so pari, sestavljeni iz identifikatorja proizvajalca za USB in identifikatorja izdelka, ki omogočajo prepoznavo določene strojne opreme.
-
-      Če ta pravilnik ni nastavljen, se obravnava, da je seznam naprav USB, katerih povezavo je mogoče prekiniti, prazen.</translation>
 <translation id="1017967144265860778">Upravljanje porabe na zaslonu za prijavo</translation>
 <translation id="1019101089073227242">Nastavitev imenika za uporabniške podatke</translation>
 <translation id="1022361784792428773">ID-ji razširitev, katerih namestitev je treba uporabniku preprečiti (ali * za vse)</translation>
@@ -73,14 +70,6 @@
       Če pravilnik ni nastavljen ali je onemogočen, šifrirane zbirke v protokolu TLS ne bodo omogočene, sicer pa je lahko omogočen zaradi ohranjanja združljivosti z zastarelim strežnikom. To je začasen ukrep in strežnik je treba na novo konfigurirati.</translation>
 <translation id="1297182715641689552">Uporabi skript .pac za proxy</translation>
 <translation id="1304973015437969093">ID-ji razširitev/aplikacij in URL-ji posodobitev se namestijo brez obveščanja</translation>
-<translation id="1310699457130669094">Tu lahko določite URL za datoteko .pac strežnika proxy.
-
-          Ta pravilnik velja le, če ste v »Izberite, kako določiti nastavitve strežnika proxy« izbrali ročne nastavitve.
-
-         Če ste za nastavitve pravilnika za strežnik proxy izbrali drug način, tega pravilnika ne nastavljajte.
-
-          Če želite podrobnejše primere, obiščite:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Določa odstotek spremembe zakasnitve zatemnitve zaslona, kadar se zazna dejavnost uporabnika, medtem ko je zaslon v zatemnjenem načinu ali kmalu potem ko je bil izklopljen.
 
 Če je nastavljen ta pravilnik, določa odstotek spremembe zakasnitve zatemnitve zaslona, kadar se zazna dejavnost uporabnika, medtem ko je zaslon v zatemnjenem načinu ali kmalu potem ko je bil izklopljen. S prilagoditvijo zatemnitve zaslona se prilagodijo tudi zakasnitve za izklop zaslona, zaklepanje zaslona in čas nedejavnosti, tako da se ohranijo enake razdalje od prvotno nastavljene zakasnitve za zatemnitev zaslona.
@@ -163,18 +152,6 @@
 <translation id="1561424797596341174">Preglasitve pravilnika za delovne različice gostitelja za oddaljeni dostop, namenjene odpravljanju napak</translation>
 <translation id="1583248206450240930">Privzeto uporabi <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="1608755754295374538">URL-ji, ki jim bo brez poziva dovoljen dostop do naprav za zajem zvoka</translation>
-<translation id="1613574633990410986">Omogoča izbiro strežnika proxy, ki naj ga uporabljajo <ph name="PRODUCT_NAME" /> in aplikacije ARC ter uporabnikom prepreči spreminjanje nastavitev strežnika proxy.
-
-      Če izberete, da se proxy nikoli ne uporablja in se vedno vzpostavi neposredna povezava, so vse druge možnosti prezrte.
-
-      Če izberete samodejno zaznavanje strežnika proxy, so vse druge možnosti prezrte.
-
-      Podrobne primere si lahko ogledate tukaj:
-      <ph name="PROXY_HELP_URL" />
-
-      Če omogočite to nastavitev, <ph name="PRODUCT_NAME" /> in aplikacije ARC prezrejo vse možnosti, povezane s strežnikom proxy, navedene v ukazni vrstici.
-
-      Če teh pravilnikov ne nastavite, lahko uporabniki sami izberejo nastavitve strežnika proxy.</translation>
 <translation id="1617235075406854669">Omogočanje brisanja zgodovine brskalnika in prenosov</translation>
 <translation id="1617384279878333801">Omogočanje dodajanja oseb v upravitelju profilov</translation>
 <translation id="1655229863189977773">Nastavi velikost predpomnilnika diska v bajtih</translation>
@@ -265,14 +242,6 @@
       Če je ta pravilnik omogočen, je v sistemski vrstici prikazan velik rdeč gumb za odjavo, ko je seja aktivna in zaslon ni zaklenjen.
 
       Če je ta pravilnik onemogočen ali ni določen, v sistemski vrstici ni velikega rdečega gumba za odjavo.</translation>
-<translation id="1942957375738056236">Tu lahko določite URL strežnika proxy.
-
-          Ta pravilnik velja samo, če ste pod »Izberite, kako določiti nastavitve strežnika proxy« izbrali ročne nastavitve.
-
-          Če ste izbrali drug način nastavljanja pravilnikov za strežnik proxy, tega pravilnika ne nastavljajte.
-
-          Več o drugih možnostih in podrobnejše primere najdete na:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Nastavitev upravljanja porabe na prijavnem zaslonu v sistemu <ph name="PRODUCT_OS_NAME" />.
 
       S tem pravilnikom lahko nastavite, kako deluje <ph name="PRODUCT_OS_NAME" />, ko uporabnik nekaj časa ni dejaven in je prikazan prijavni zaslon. Pravilnik nadzira več nastavitev. Za podrobnosti posameznih nastavitev in njihove obsege vrednosti si oglejte ustrezne pravilnike, ki v seji nadzirajo upravljanje porabe. Edini odstopanji od teh pravilnikov sta:
@@ -663,24 +632,6 @@
 <translation id="3072847235228302527">Nastavitev pogojev storitve za lokalni račun v napravi.</translation>
 <translation id="3096595567015595053">Seznam omogočenih vtičnikov</translation>
 <translation id="3101501961102569744">Izberite, kako določiti nastavitve strežnika proxy</translation>
-<translation id="3125884964575432854">Omogoča izbiro strežnika proxy, ki naj ga uporabljajo <ph name="PRODUCT_NAME" /> in aplikacije ARC ter uporabnikom prepreči spreminjanje nastavitev strežnika proxy.
-
-          Če izberete, da se proxy nikoli ne uporablja in se vedno vzpostavi neposredna povezava, so vse druge možnosti prezrte.
-
-          Če izberete sistemske nastavitve strežnika proxy, so vse druge možnosti prezrte.
-
-          Če izberete samodejno zaznavanje strežnika proxy, so vse druge možnosti prezrte.
-
-          Če izberete fiksni način strežnika proxy, lahko v možnostih »Naslov ali URL strežnika proxy« in »Seznam pravil za obvod proxyja, ločenih z vejicami« izberete dodatne nastavitve. Aplikacije ARC bodo uporabljale samo strežnik proxy HTTP z največjo prednostjo.
-
-          Če za proxy izberete uporabo skripta .pac, morate v možnosti »URL datoteke .pac za proxy« navesti URL skripta.
-
-          Podrobne primere si lahko ogledate tukaj:
-          <ph name="PROXY_HELP_URL" />
-
-          Če omogočite to nastavitev, <ph name="PRODUCT_NAME" /> in aplikacije ARC prezrejo vse možnosti, povezane s proxyjem, navedene v ukazni vrstici.
-
-          Če ta pravilnik ni nastavljen, lahko uporabniki sami izberejo nastavitve strežnika proxy.</translation>
 <translation id="3153348162326497318">Omogoča nastavitev, katerih razširitev uporabniki NE morejo namestiti. Že nameščene razširitve bodo odstranjene, če so na seznamu blokiranih.
 
           Vrednost * na seznamu blokiranih pomeni, da so vse razširitve na seznamu blokirane, razen če so izrecno navedene na seznamu dovoljenih.
@@ -753,6 +704,7 @@
       Če je ta nastavitev omogočena ali ni nastavljena, lahko uporabniki s preverjanjem pristnosti prek računa za Google omogočijo proxy za tiskanje v oblaku.
 
       Če je ta nastavitev onemogočena, uporabniki ne morejo omogočiti proxyja, računalnik pa tiskalnikov ne bo smel dati v skupno rabo s storitvijo <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Omogoča procese prekinitve v upravitelju opravil</translation>
 <translation id="3322771899429619102">Omogoča nastavitev seznama vzorcev URL-jev, s katerim so določena mesta, ki smejo uporabljati ustvarjanje ključev. Če je vzorec URL-ja v »KeygenBlockedForUrls«, to preglasi te izjeme.
 
          Če ta pravilnik ni nastavljen, bo za vsa spletna mesta uporabljena splošna privzeta vrednost iz pravilnika »DefaultKeygenSetting«, kadar je ta nastavljen, ali iz uporabnikove osebne konfiguracije, kadar pravilnik »DefaultKeygenSetting« ni nastavljen.</translation>
@@ -939,22 +891,6 @@
           Če je ta pravilnik nastavljen na »Ohrani piškotke za obdobje trajanja seje«, se ob zaprtju seje piškotki izbrišejo. Če se <ph name="PRODUCT_NAME" /> izvaja v ozadju, se seja ob zaprtju zadnjega okna morda ne bo zaprla. Več informacij o konfiguriranju tega delovanja je na voljo v pravilniku »BackgroundModeEnabled«.
 
           Če ta pravilnik ni nastavljen, se uporabi »AllowCookies« in uporabnik bo lahko to spremenil.</translation>
-<translation id="4098957623809244159">Ta pravilnik je zastarel, namesto njega uporabite ProxyMode.
-
-          Omogoča nastavitev strežnika proxy, ki ga uporabljajo <ph name="PRODUCT_NAME" /> in aplikacije ARC, ter uporabnikom prepreči spreminjanje nastavitev strežnika proxy.
-
-          Če izberete, da se proxy nikoli ne uporablja in se vedno vzpostavi neposredna povezava, so vse druge možnosti prezrte.
-
-          Če izberete uporabo sistemskih nastavitev strežnika proxy ali samodejno zaznavanje strežnika proxy, so vse druge možnosti prezrte.
-
-          Če izberete ročno nastavitev strežnika proxy, lahko v možnostih »Naslov ali URL strežnika proxy«, »URL datoteke .pac za proxy« in »Seznam pravil za obvod strežnika proxy, ločenih z vejicami« izberete dodatne nastavitve.
-
-          Podrobne primere si lahko ogledate tukaj:
-          <ph name="PROXY_HELP_URL" />
-
-          Če omogočite to nastavitev, <ph name="PRODUCT_NAME" /> prezre vse možnosti, povezane s strežnikom proxy, navedene v ukazni vrstici.
-
-          Če ta pravilnik ni nastavljen, lahko uporabniki sami izberejo nastavitve strežnika proxy.</translation>
 <translation id="4103289232974211388">Preusmeritev na SAML IdP po potrditvi uporabnika</translation>
 <translation id="410478022164847452">Določa trajanje uporabnikove nedejavnosti, po preteku katere se izvede dejanje ob nedejavnosti, če se naprava napaja iz električnega omrežja.
 
@@ -1436,14 +1372,6 @@
 <translation id="5893553533827140852">Če je ta nastavitev omogočena, bodo zahteve za preverjanje pristnosti »gnubby« posredovane prek povezave z oddaljenim gostiteljem.
 
           Če je ta nastavitev onemogočena ali ni konfigurirana, zahteve za preverjanje pristnosti »gnubby« ne bodo posredovane.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> in aplikacije ARC bodo obšle vse strežnike proxy za seznam gostiteljev, naveden tukaj.
-
-          Ta pravilnik velja le, če ste v »Izberite, kako določiti nastavitve strežnika proxy« izbrali ročne nastavitve.
-
-          Če ste za nastavitve pravilnika za strežnik proxy izbrali drug način, tega pravilnika ne nastavljajte.
-
-          Če želite podrobnejše primere, obiščite:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Dovoli samoposodobitvene prenose prek HTTP</translation>
 <translation id="5921888683953999946">Nastavitev privzetega stanja funkcije velikega kazalca za ljudi s posebnimi potrebami na prijavnem zaslonu.
 
@@ -1973,9 +1901,6 @@
 
      Če to nastavitev onemogočite ali je ne nastavite, <ph name="PRODUCT_NAME" /> uporabi prednostne območne nastavitve, ki jih izbere uporabnik (če so nastavljene), sistemske območne nastavitve ali rezervne območne nastavitve (»en-US«).</translation>
 <translation id="7651739109954974365">Določa, ali je podatkovno gostovanje za napravo omogočeno. Če je pravilnik omogočen, je podatkovno gostovanje omogočeno. Če ni nastavljen ali je onemogočen, podatkovno gostovanje ni na voljo.</translation>
-<translation id="7667184304362487902">Določi nastavitve proxyja za izdelek <ph name="PRODUCT_NAME" /> in aplikacije ARC.
-
-      Ta pravilnik še ni primeren za uporabo, zato ga ne uporabljajte.</translation>
 <translation id="76810863974142048">URL, na katerem morajo odjemalci za oddaljeni dostop pridobiti žeton za preverjanje pristnosti.
 
           Če je ta pravilnik nastavljen, bo gostitelj za oddaljeni dostop zahteval, da odjemalci pridobijo žeton za preverjanje na tem URL-ju, če želijo vzpostaviti povezavo. Uporabljati ga je treba v povezavi s pravilnikom RemoteAccessHostTokenValidationUrl.
@@ -2205,6 +2130,7 @@
 
       Vrednost pravilnika mora biti v milisekundah.</translation>
 <translation id="8344454543174932833">Uvoz zaznamkov privzetega brskalnika ob prvem zagonu</translation>
+<translation id="8359734107661430198">Omogočanje API-ja ExampleDeprecatedFeature API do vključno 2. 9. 2008</translation>
 <translation id="8360452361555133173">Omogoča prikaz pozdravne strani od prvem zagonu brskalnika po nadgradnji operacijskega sistema.
 
       Če je ta pravilnik omogočen ali ni nastavljen, bo brskalnik ob prvem zagonu po nadgradnji operacijskega sistema znova prikazal pozdravno stran.
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb
index 9c54a0f..6b2d235d 100644
--- a/components/policy/resources/policy_templates_sr.xtb
+++ b/components/policy/resources/policy_templates_sr.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sr">
 <translation id="101438888985615157">Ротира екран за 180 степени</translation>
-<translation id="1015272884520659144">Дефинише листу USB уређаја којима је дозвољено да се одвоје од свог управљачког програма за језгро да би могли да се користе преко API-ја chrome.usb директно унутар веб-апликације. Уноси су парови Идентификатора продавца USB-а и Идентификатора производа како би се одређени хардвер идентификовао.
-
-      Ако ове смернице нису конфигурисане, листа одвојивих USB уређаја се сматра празном.</translation>
 <translation id="1017967144265860778">Управљање енергијом на екрану за пријављивање</translation>
 <translation id="1019101089073227242">Подеси директоријум корисничких података</translation>
 <translation id="1022361784792428773">ИД-ови додатака које корисник треба да буде спречен да инсталира (или * за све)</translation>
@@ -73,14 +70,6 @@
       Ако не подесите ове смернице или их подесите на Нетачно, онда RC4 пакети за шифровање у TLS-у неће бити омогућени. У супротном можете да их подесите на Тачно да би се очувала компатибилност са застарелим сервером. То је привремена мера и сервер треба да се поново конфигурише.</translation>
 <translation id="1297182715641689552">Користи .pac скрипту проксија</translation>
 <translation id="1304973015437969093">ИД-ови додатака/апликација и URL-ови за ажурирања који ће бити неприметно инсталирани</translation>
-<translation id="1310699457130669094">Овде можете да одредите URL адресу за .pac датотеку проксија.
-
-          Ове смернице ступају на снагу само ако сте изабрали ручна подешавања проксија у кораку „Одаберите како се одређују подешавања прокси сервера“.
-
-          Ако сте изабрали неки други режим за подешавања смерница за прокси, немојте да подешавате ове смернице.
-
-          Више детаљних примера потражите овде:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Одређују проценат до кога се време до замрачивања екрана мења када се региструје активност корисника док је екран замрачен или убрзо после искључивања екрана.
 
           Ако се ове смернице подесе, оне одређују проценат до кога се време до замрачивања екрана мења када се региструје активност корисника док је екран замрачен или убрзо после искључивања екрана. Када се време до замрачивања екрана промени, прилагођава се време до искључивања екрана, закључавања екрана или његовог преласка у стање мировања како би се одржале исте разлике између њих и времена до замрачивања екрана које су првобитно конфигурисане.
@@ -162,18 +151,6 @@
 <translation id="1561424797596341174">Замене смерница у верзијама хоста са даљинским приступом које служе за отклањање грешака</translation>
 <translation id="1583248206450240930">Користи <ph name="PRODUCT_FRAME_NAME" /> подразумевано</translation>
 <translation id="1608755754295374538">URL-ови којима ће бити одобрен приступ уређајима за снимање звука без приказивања упита</translation>
-<translation id="1613574633990410986">Омогућавају вам да наведете прокси сервер који користе <ph name="PRODUCT_NAME" /> и ARC апликације и спречавају кориснике да мењају подешавања проксија.
-
-      Ако изаберете да никада не користите прокси сервер и да се увек повезујете директно, све друге опције ће бити занемарене.
-
-      Ако изаберете аутоматско откривање прокси сервера, све друге опције ће бити занемарене.
-
-      Детаљне примере потражите на:
-      <ph name="PROXY_HELP_URL" />
-
-      Ако омогућите ово подешавање, <ph name="PRODUCT_NAME" /> и ARC апликације занемарују све опције у вези са проксијем наведене из командне линије.
-
-      Ако не подесите ове смернице, омогућићете корисницима да сами бирају подешавања проксија.</translation>
 <translation id="1617235075406854669">Омогућавање брисања историје прегледача и преузимања</translation>
 <translation id="1617384279878333801">Омогући додавање особа у менаџер профила</translation>
 <translation id="1655229863189977773">Подешавање величине кеша диска у бајтовима</translation>
@@ -264,14 +241,6 @@
       Ако је омогућено, на системској палети се приказује велико, црвено дугме за одјављивање док је сесија активна, а екран се не закључава.
 
       Ако је онемогућено или није наведена вредност, на системској палети се не приказује велико, црвено дугме за одјављивање.</translation>
-<translation id="1942957375738056236">Овде можете да наведете URL адресу прокси сервера.
-
-          Ове смернице ступају на снагу само ако сте изабрали ручна подешавања проксија у кораку „Одаберите како се одређују подешавања прокси сервера“.
-
-          Ако сте изабрали неки други режим за подешавања смерница за прокси, немојте да подешавате ове смернице.
-
-          Више детаљнијих примера потражите овде:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Конфигуришите управљање енергијом на екрану за пријављивање у <ph name="PRODUCT_OS_NAME" />-у.
 
       Ове смернице вам омогућавају да конфигуришете како се <ph name="PRODUCT_OS_NAME" /> понаша када неко време нема корисничких активности док се приказује екран за пријављивање. Смернице контролишу више подешавања. Њихову појединачну семантику и опсеге вредности потражите у одговарајућим смерницама које контролишу управљање енергијом у оквиру сесије. Једина одступања од ових смерница су следећа:
@@ -654,24 +623,6 @@
 <translation id="3072847235228302527">Подешавање Услова коришћења услуге за локални налог на уређају</translation>
 <translation id="3096595567015595053">Листа омогућених додатних компоненти</translation>
 <translation id="3101501961102569744">Изаберите како се наводе подешавања прокси сервера</translation>
-<translation id="3125884964575432854">Омогућавају вам да наведете прокси сервер који користе <ph name="PRODUCT_NAME" /> и ARC апликације и спречавају кориснике да мењају подешавања проксија.
-
-          Ако изаберете да никада не користите прокси сервер и да се увек повезујете директно, све друге опције ће бити занемарене.
-
-          Ако изаберете да користите системска подешавања проксија, све друге опције ће бити занемарене.
-
-          Ако изаберете аутоматско откривање прокси сервера, све друге опције ће бити занемарене.
-
-          Ако изаберете фиксни режим прокси сервера, можете да наведете додатне опције у оквиру ставке „Адреса или URL прокси сервера“ и „Листа правила за заобилажење проксија раздвојена зарезима“. ARC апликације ће користити само HTTP прокси сервер са највећим приоритетом.
-
-          Ако изаберете да користите .pac скрипту проксија, морате да наведете URL до скрипте у „URL до .pac датотеке проксија“.
-
-          Детаљне примере потражите на:
-          <ph name="PROXY_HELP_URL" />
-
-          Ако омогућите ово подешавање, <ph name="PRODUCT_NAME" /> и ARC апликације занемарују све опције у вези са проксијем наведене из командне линије.
-
-          Ако не подесите ове смернице, омогућићете корисницима да сами бирају подешавања проксија.</translation>
 <translation id="3153348162326497318">Омогућава вам да наведете које додатке корисници НЕ МОГУ да инсталирају. Претходно инсталирани додаци ће бити уклоњени ако се налазе на црној листи.
 
            Вредност „*“ на црној листи значи да су сви додаци на црној листи, осим ако нису изричито наведени на белој листи.
@@ -744,6 +695,7 @@
       Ако је ово подешавање омогућено или није конфигурисано, корисници могу да омогуће прокси Cloud штампања потврдом аутентичности помоћу Google налога.
 
       Ако је ово подешавање онемогућено, корисници не могу да омогуће прокси, а рачунар неће моћи да дели штампаче са услугом <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Омогућава заустављање процеса у Менаџеру задатака</translation>
 <translation id="3322771899429619102">Омогућава вам да подесите листу образаца URL-ова који наводе сајтове којима је дозвољено да користе генерисање шифара. Ако се URL образац налази у смерницама „KeygenBlockedForUrls“, то замењује ове изузетке.
 
           Ако ове смернице нису подешене, за све сајтове ће се користити глобална подразумевана вредност из смерница „DefaultKeygenSetting“ уколико су оне подешене, а ако нису, из личне конфигурације корисника.</translation>
@@ -924,22 +876,6 @@
           Ако подесите ове смернице на „Чувај колачиће током трајања сесије“, колачићи ће бити избрисани када се сесија затвори. Имајте на уму да сесија не може да се затвори када се затвори последњи прозор ако <ph name="PRODUCT_NAME" /> ради у „позадинском режиму“. Више информација о конфигурисању овог понашања потражите у смерницама „BackgroundModeEnabled“.
 
           Ако не подесите ове смернице, користиће се „AllowCookies“, а корисник ће то моћи да промени.</translation>
-<translation id="4098957623809244159">Ове смернице су застареле. Уместо њих, користите ProxyMode.
-
-          Омогућавају вам да наведете прокси сервер који користе <ph name="PRODUCT_NAME" /> и ARC апликације и спречавају кориснике да мењају подешавања проксија.
-
-          Ако изаберете да никада не користите прокси сервер и да се увек повезујете директно, све друге опције ће бити занемарене.
-
-          Ако изаберете да користите системска подешавања проксија или да се прокси сервер аутоматски открива, све друге опције ће бити занемарене.
-
-          Ако изаберете ручна подешавања проксија, можете да наведете додатне опције у оквиру ставки „Адреса или URL прокси сервера“, „URL до .pac датотеке проксија“ и „Листа правила за заобилажење проксија раздвојена зарезима“.
-
-          Детаљне примере потражите на:
-          <ph name="PROXY_HELP_URL" />
-
-          Ако омогућите ово подешавање, <ph name="PRODUCT_NAME" /> занемарује све опције у вези са проксијем наведене из командне линије.
-
-          Ако не подесите ове смернице, омогућићете корисницима да сами бирају подешавања проксија.</translation>
 <translation id="4103289232974211388">Преусмери на SAML IdP после потврде корисника</translation>
 <translation id="410478022164847452">Наводе период без корисничких уноса после кога се предузима радња у случају мировања када је уређај прикључен на струју.
 
@@ -1419,14 +1355,6 @@
 <translation id="5893553533827140852">Ако је ово подешавање омогућено, захтеви за gnubby потврду аутентичности ће се слати преко прокси везе са удаљеним хостом.
 
           Ако је ово подешавање онемогућено или није конфигурисано, захтеви за gnubby потврду аутентичности се неће слати преко проксија.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> и ARC апликације ће заобићи све проксије за листу хостова која је овде наведена.
-
-          Ове смернице ступају на снагу само ако сте изабрали ручна подешавања проксија у кораку „Изаберите како се одређују подешавања прокси сервера“.
-
-          Ако сте изабрали неки други режим за подешавања смерница за прокси, немојте да подешавате ове смернице.
-
-          Више детаљних примера потражите на:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Дозволи преузимања аутоматских ажурирања преко HTTP-а</translation>
 <translation id="5921888683953999946">Подешавање подразумеваног статуса функције приступачности за велики курсор на екрану за пријављивање.
 
@@ -1950,9 +1878,6 @@
 
       Ако је ово подешавање онемогућено или није подешено, <ph name="PRODUCT_NAME" /> користи корисников жељени локалитет (ако је конфигурисан), локалитет система или резервни локалитет „en-US“.</translation>
 <translation id="7651739109954974365">Одређују да ли треба омогућити роминг за податке за уређај. Ако буду подешене на Тачно, роминг за податке ће бити дозвољен. Ако не буду конфигурисане или буду подешене на Нетачно, роминг за податке неће бити доступан.</translation>
-<translation id="7667184304362487902">Конфигуришу подешавања проксија за <ph name="PRODUCT_NAME" /> и ARC апликације.
-
-      Ове смернице још увек нису спремне за коришћење. Немојте да их користите.</translation>
 <translation id="76810863974142048">URL где клијенти са даљинским приступом треба да добију токен за потврду аутентичности.
 
           Ако подесите ове смернице, хост са даљинским приступом ће захтевати да клијенти за потврду аутентичности добију токен за потврду аутентичности са овог URL-а да би могли да се повежу. Морате да користите ове смернице у комбинацији са смерницама RemoteAccessHostTokenValidationUrl.
@@ -2183,6 +2108,7 @@
 
       Вредност смерница треба да буде наведена у милисекундама.</translation>
 <translation id="8344454543174932833">Увези обележиваче из подразумеваног прегледача при првом покретању</translation>
+<translation id="8359734107661430198">Омогући ExampleDeprecatedFeature API за 2.9.2008.</translation>
 <translation id="8360452361555133173">Омогућава приказивање странице за добродошлицу при првом покретању прегледача након надоградње ОС-а.
 
       Ако сте ове смернице подесили на Тачно или их нисте конфигурисали, прегледач ће поново приказати страницу за добродошлицу при првом покретању прегледача након надоградње ОС-а.
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb
index 47bced7..c9bda0b7 100644
--- a/components/policy/resources/policy_templates_sv.xtb
+++ b/components/policy/resources/policy_templates_sv.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sv">
 <translation id="101438888985615157">Rotera skärmen 180 grader</translation>
-<translation id="1015272884520659144">Definierar vilka USB-enheter som får kopplas bort från sina kärndrivrutiner så att de kan användas direkt i en webbapp med API:et chrome.usb. Posterna i listan består av id-par för USB, leverantörs-id och produkt-id, som tillsammans identifierar maskinvaran.
-
-      Om principen inte har konfigurerats betraktas listan med frånkopplingsbara USB-enheter som tom.</translation>
 <translation id="1017967144265860778">Energibesparing på inloggningssidan</translation>
 <translation id="1019101089073227242">Ange katalog för användardata</translation>
 <translation id="1022361784792428773">Tilläggs-ID:n som användaren inte får installera (eller * om det gäller alla)</translation>
@@ -73,14 +70,6 @@
       Om principen inte har ställts in eller är inställd på falskt kommer RC4-krypteringssviter inte att aktiveras. Principen kan ställas in som sant om kompatibilitet med en föråldrad server önskas bibehållas. Detta är en nödlösning, och servern bör omkonfigureras.</translation>
 <translation id="1297182715641689552">Använd en PAC-proxyskript</translation>
 <translation id="1304973015437969093">Tilläggs-/app-id:n och uppdateringsadresser som ska installeras obemärkt</translation>
-<translation id="1310699457130669094">Här kan du ange webbadressen till en PAC-fil för proxy.
-
-          Den här policyn gäller bara om du har valt manuella proxyinställningar vid Välj hur inställningar för proxyserver ska anges.
-
-          Ange inte den här policyn om du har valt något annat läge för inställning av proxypolicyer.
-
-          Detaljerade exempel finns på:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Anger den procentsats med vilken fördröjningen av skärmdämpningen skalanpassas när användaren gör något då skärmen är dämpad eller strax efter det att skärmen har stängts av.
 
           Om den här principen är inställd anges den procentsats med vilken fördröjningen av skärmdämpningen skalanpassas när användaren gör något eller strax efter det att skärmen har stängts av. När dämpningsfördröjningen skalanpassas anpassas fördröjningen av avstängningen av skärmen, skärmlåset och dödtiden så att samma avstånd från den ursprungligen angivna fördröjningen av skärmdämpningen bibehålls.
@@ -163,18 +152,6 @@
 <translation id="1561424797596341174">Åsidosättningar av policyn för felsökningsversioner av fjärråtkomstvärden</translation>
 <translation id="1583248206450240930">Använd <ph name="PRODUCT_FRAME_NAME" /> som standard</translation>
 <translation id="1608755754295374538">Webbadresser som ska ges tillgång till ljudinspelningsenheter utan meddelande</translation>
-<translation id="1613574633990410986">Med den här principen kan du ange vilken proxyserver som används av <ph name="PRODUCT_NAME" /> och ARC-apparna samt förhindra att användare ändrar sina proxyinställningar.
-
-      Om du väljer att aldrig använda en proxyserver och alltid ansluta direkt ignoreras alla andra alternativ.
-
-      Om du väljer att proxyservrar ska upptäckas automatiskt ignoreras alla andra alternativ.
-
-      Mer ingående exempel hittar du på:
-      <ph name="PROXY_HELP_URL" />
-
-      Om du aktiverar inställningen ignorerar <ph name="PRODUCT_NAME" /> och ARC-appar alla proxyrelaterade alternativ som har angetts i kommandoraden.
-
-      Om du inte anger inställningarna kan användarna själva välja proxyinställningar.</translation>
 <translation id="1617235075406854669">Aktivera borttagning av webb- och nedladdningshistorik</translation>
 <translation id="1617384279878333801">Gör att en person kan läggas till i profilhanteraren</translation>
 <translation id="1655229863189977773">Ange enhetens cachestorlek i byte</translation>
@@ -269,14 +246,6 @@
       Om funktionen aktiveras visas en stor röd utloggningsknapp i systemfältet medan en session är aktiv och skärmen inte är låst.
 
       Om funktionen inaktiveras eller inte används visas ingen stor röd utloggningsknapp i systemfältet.</translation>
-<translation id="1942957375738056236">Här kan du ange proxyserverns webbadress.
-
-          Den här policyn används bara om du har valt manuella proxyinställningar under Välj hur inställningar för proxyserver ska anges.
-
-          Ställ inte in den här policyn om du har valt något annat läge för inställningar av proxypolicyer.
-
-          Fler alternativ och detaljerade exempel finns på:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Konfigurera  energihanteringen på inloggningsskärmen i <ph name="PRODUCT_OS_NAME" />.
 
       Med den här principen kan du konfigurera hur <ph name="PRODUCT_OS_NAME" /> ska fungera om inte användaren gör något under en viss tid när inloggningsskärmen visas. Den här principen styr flera inställningar. Deras enskilda semantik och värdeintervaller finns i motsvarande principer som styr energihanteringen under en session. Det här är enda avvikelserna från dessa principer:
@@ -667,24 +636,6 @@
 <translation id="3072847235228302527">Ange användarvillkor för ett lokalt enhetskonto</translation>
 <translation id="3096595567015595053">Lista med aktiverade plugin-program</translation>
 <translation id="3101501961102569744">Välj hur inställningar för proxyserver ska anges</translation>
-<translation id="3125884964575432854">Med den här principen kan du ange vilken proxyserver som används av <ph name="PRODUCT_NAME" /> och ARC-appar samt förhindra att användare ändrar sina proxyinställningar.
-
-          Om du väljer att aldrig använda en proxyserver och alltid ansluta direkt ignoreras alla andra alternativ.
-
-          Om du väljer att använda datorns proxyinställningar ignoreras alla andra alternativ.
-
-          Om du väljer att proxyservrar ska upptäckas automatiskt ignoreras alla andra alternativ.
-
-          Om du väljer läget för fast serverproxy kan du ange fler alternativ i fälten Proxyserverns adress eller webbadress och Kommaavgränsad lista med regler för proxybypass. ARC-appar använder bara den HTTP-proxyserver som har högst prioritet.
-
-          Om du väljer att använda ett pac-proxyskript måste du ange webbadressen till skriptet i fältet Webbadress till en pac-proxyfil.
-
-      Mer ingående exempel hittar du på:
-      <ph name="PROXY_HELP_URL" />
-
-      Om du aktiverar inställningen ignorerar <ph name="PRODUCT_NAME" /> och ARC-appar alla proxyrelaterade alternativ som har angetts i kommandoraden.
-
-      Om du inte anger inställningarna kan användarna själva välja proxyinställningar.</translation>
 <translation id="3153348162326497318">Policyn gör att du kan ange vilka tillägg användarna INTE får installera. Tillägg som redan finns installerade tas bort om du svartlistar dem.
 
           Om du svartlistar värdet * svartlistas alla tillägg som du inte uttryckligen tillåter på vitlistan.
@@ -757,6 +708,7 @@
       Om inställningen är aktiverad eller inte har konfigurerats kan användarna aktivera molnutskriftsproxyn genom autentisering med deras Google-konton.
 
       Om inställningen inte är inaktiverad kan användarna inte aktivera proxyn och datorn tillåts inte att dela skrivare med <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Gör det möjligt att avsluta processer i Aktivitetshanteraren</translation>
 <translation id="3322771899429619102">Policyn gör att du kan ange en lista med webbadressmönster som anger vilka webbplatser som får använda nyckelgenerering. Om ett webbadressmönster har policyn KeygenBlockedForUrls åsidosätts dessa undantag.
 
           Om policyn inte anges används den globala standardpolicyn för alla webbplatser. Standardvärdet hämtas antingen från policyn DefaultKeygenSetting om den har angetts, eller från användarens personliga konfiguration om den inte har det.</translation>
@@ -943,22 +895,6 @@
           Om principen är inställd på Behåll cookies under hela sessionen kommer cookies att tas bort när sessionen avslutas. Observera att om <ph name="PRODUCT_NAME" /> körs i bakgrundsläge kan det hända att sessionen inte avslutas även om det sista fönstret stängs. Se principen BackgroundModeEnabled för mer information om konfigurering av detta.
 
           Om inget värde anges för principen används AllowCookies och användaren kan ändra inställningen.</translation>
-<translation id="4098957623809244159">Den här principen är utfasad. Använd ProxyMode istället.
-
-          Med den här principen kan du ange vilken proxyserver som används av <ph name="PRODUCT_NAME" /> och ARC-appar samt förhindra att användare ändrar sina proxyinställningar.
-
-          Om du väljer att aldrig använda en proxyserver och alltid ansluta direkt ignoreras alla andra alternativ.
-
-          Om du väljer att använda datorns proxyinställningar eller att proxyservern ska upptäckas automatiskt ignoreras alla andra alternativ.
-
-          Om du väljer manuella proxyinställningar kan du ange fler alternativ i fälten Proxyserverns adress eller webbadress och Kommaavgränsad lista med regler för proxybypass.
-
-          Mer ingående exempel hittar du på:
-          <ph name="PROXY_HELP_URL" />
-
-          Om du aktiverar inställningen ignorerar <ph name="PRODUCT_NAME" /> och ARC-appar alla proxyrelaterade alternativ som har angetts i kommandoraden.
-
-          Om du inte anger inställningarna kan användarna själva välja proxyinställningar.</translation>
 <translation id="4103289232974211388">Omdirigera till SAML IdP när användaren har bekräftat</translation>
 <translation id="410478022164847452">Anger efter hur lång tid utan åtgärd från användaren som inaktivitetsåtgärden vidtas när enheten är ansluten till elnätet.
 
@@ -1442,15 +1378,6 @@
 <translation id="5893553533827140852">Om inställningen är aktiverad kommer gnubby-autentiseringsbegäranden att skickas via proxy via en fjärranslutning.
 
           Om inställningen är inaktiverad eller inte konfigurerad kommer gnubby-autentiseringsbegäranden inte att skickas via proxy.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> förbigår proxyn för listan med värdenheter som anges här.
-
-          Den här principen används bara om du har valt manuella proxyinställningar i Välj hur inställningar för proxyserver ska anges.
-
-          Ange inte den här principen om du har valt något annat läge för inställning av proxyprinciper.
-
-          Mer ingående exempel hittar du på:
-
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Tillåt nedladdning av automatiska uppdateringar via HTTP</translation>
 <translation id="5921888683953999946">Ange standardläget för hjälpmedelsfunktionen med en stor markör på inloggningsskärmen.
 
@@ -1979,9 +1906,6 @@
 
       Om inställningen inaktiveras eller inte är konfigurerad använder <ph name="PRODUCT_NAME" /> antingen den språkversion som användaren anger (om den är konfigurerad), samma språk som datorn eller standardversionen en-US.</translation>
 <translation id="7651739109954974365">Avgör om dataroaming ska vara tillåtet för enheten. Om värdet är sant är dataroaming tillåten. Om policyn inte är konfigurerad eller om värdet är falskt är dataroaming inte tillåten.</translation>
-<translation id="7667184304362487902">Konfigurerar proxyinställningarna för <ph name="PRODUCT_NAME" /> och ARC-appar.
-
-      Använd inte den här principen. Den är inte färdig ännu.</translation>
 <translation id="76810863974142048">Webbadress där fjärråtkomstklienter erhåller sin autentiseringstoken.
 
           Om den här policyn är inställd kräver fjärråtkomstvärden autentisering av klienter för att de ska kunna erhålla en autentiseringstoken från webbadressen och kunna ansluta. Måste användas i samband med RemoteAccessHostTokenValidationUrl.
@@ -2213,6 +2137,7 @@
 
       Policyns värde anges i millisekunder.</translation>
 <translation id="8344454543174932833">Importera bokmärken från standardwebbläsaren första gången den körs</translation>
+<translation id="8359734107661430198">Aktivera API:et ExampleDeprecatedFeature sedan 2008-09-02.</translation>
 <translation id="8360452361555133173">Visa välkomstsidan när webbläsaren startas första gången efter en uppgradering av operativsystemet.
 
       Om policyn är inställd på sant eller inte har konfigurerats visas välkomstsidan på nytt i webbläsaren när den startas för första gången efter en uppgradering av operativsystemet.
diff --git a/components/policy/resources/policy_templates_sw.xtb b/components/policy/resources/policy_templates_sw.xtb
index b9c9d2f..df0cfe7 100644
--- a/components/policy/resources/policy_templates_sw.xtb
+++ b/components/policy/resources/policy_templates_sw.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sw">
 <translation id="101438888985615157">Zungusha skrini kwa digrii 180</translation>
-<translation id="1015272884520659144">Hufafanua orodha ya vifaa vya USB vinavyoruhusiwa kutenganishwa na kiendeshaji chake ili vitumie kwenye API ya chrome.usb moja kwa moja ndani ya programu ya wavuti. Uingizaji ni jozi za Kitambulisho cha Muuzaji wa USB na Kitambulisho cha Bidhaa za kutambua maunzi mahususi.
-
-      Ikiwa sera hii haitasanidiwa, orodha ya vifaa vya USB vinavyoweza kutenganishwa itachukuliwa kuwa tupu.</translation>
 <translation id="1017967144265860778">Udhibiti wa nishati kwenye skrini ya kuingia</translation>
 <translation id="1019101089073227242">Weka saraka ya data ya mtumiaji</translation>
 <translation id="1022361784792428773">Vitambuslisho vya Kiendelezi ambacho mtumiaji anahitaji kuzuiwa kusakinisha (au * kwa zote)</translation>
@@ -71,14 +68,6 @@
      Sera hii isipowekwa, au ikiwekwa kuwa sivyo basi mipangilio ya kriptografia ya RC4 katika TLS haitawashwa. Vinginevyo inaweza kuwekwa kuwa ndivyo ili kudumisha muoano na seva iliyokwisha muda. Huu ni mkakati tu wa muda na seva inapaswa kuwekwa mipangilio.</translation>
 <translation id="1297182715641689552">Tumia hati ya  proksi ya .pac</translation>
 <translation id="1304973015437969093">Vitambulisho vya Viendelezi/Programu na URL za sasisho vitasakinishwa kimyakimya</translation>
-<translation id="1310699457130669094">Unaweza kubainisha URL ya faili ya proksi ya .pac hapa.
-
-          Ser hii inaanza kufanya tu kazi ikiwa umechagua mipangilio ya mwongozo wa proksi kwenye 'Chagua namna ya kubainisha mipangilio ya proksi ya seva'.
-
-          Iache sera hii bila kuwekwa ikiwa umechagua modi nyingine yoyote ya kuweka  sera za proksi.
-
-          Kwa mifano ya kina, tembelea:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Hubainisha asilimia ambayo kuchelewa kwa mwangaza wa skrini kutaongezwa wakati shughuli ya mtumiaji inazingatiwa wakati skrini inapunguza mwangaza au mara baada ya skrini kuzimwa. 
 
 Kama sera hii imewekwa, inabainisha asilimia ambayo kuchelewa kwa mwangaza wa skrini huongezwa wakati shughuli ya mtumiaji inazingatiwa wakati skrini inapunguza mwangaza au mara baada ya skrini kuzimwa. Kuchelewa kwa mwangaza kunapoongezwa, kuzimwa kwa skrini, kufungwa kwa skrini na kucheleweshwa kwa kutofanya kitu hurekebishwa ili kudumisha umbali sawa kutoka kwa kucheleweshwa kwa mwangaza wa skrini kama ilivyosanidiwa kiasili. 
@@ -155,18 +144,6 @@
 <translation id="1561424797596341174">Ubatilishaji wa sera kwa miundo ya Hitilafu ya seva pangishi ya ufikiaji wa mbali</translation>
 <translation id="1583248206450240930">Tumia <ph name="PRODUCT_FRAME_NAME" /> kwa chaguo-msingi</translation>
 <translation id="1608755754295374538">URL ambazo zitapewa ufikiaji wa vifaa vya kunasa sauti bila ushawishi</translation>
-<translation id="1613574633990410986">Hukuruhusu kubainisha seva mbadala inayotumiwa na <ph name="PRODUCT_NAME" /> na programu za ARC na huwazuia watumiaji kubadilisha mipangilio ya seva mbadala.
-
-      Ukichagua kutotumia seva mbadala kamwe na kuunganisha moja kwa moja kila wakati, chaguo nyingine zote zitapuuzwa.
-
-      Ukichagua kugundua seva mbadala kiotomatiki, chaguo nyingine zote zitapuuzwa.
-
-      Kwa mifano ya kina, tembelea:
-      <ph name="PROXY_HELP_URL" />
-
-      Ukiwasha mipangilio hii, <ph name="PRODUCT_NAME" /> na programu za ARC zipuuze chaguo zote zinazohusishwa na seva mbadala zilizobainishwa kwenye mstari wa amri.
-
-      Kuacha sera hizi bila kuwekwa kutawaruhusu watumiaji kuchagua mipangilio ya seva mbadala wenyewe.</translation>
 <translation id="1617235075406854669">Washa ufutaji wa historia ya upakuaji na kivinjari</translation>
 <translation id="1617384279878333801">Washa kipengee cha kuongeza mtu katika kidhibiti cha wasifu</translation>
 <translation id="1655229863189977773">Weka ukubwa wa akiba ya diski katika baiti</translation>
@@ -259,14 +236,6 @@
       Kikiwashwa, kitufe kikubwa cha kuondoka chekundu kitaonyeshwa katika chano la mfumo kipindi kinapowaka na skrini haitafungwa.
 
       Iwapo kitafungwa au kutobainishwa, hakuna kitufe kikubwa chekundu cha kuondoka kitaonyeshwa katika chano la mfumo.</translation>
-<translation id="1942957375738056236">Unaweza kubainisha URL ya seva ya proksi hapa.
-
-          Sera hii inatumika tu ikiwa umechagua mipangilio ya seva mwenyewe katika "Chagua jinsi ya kubainisha mipangilio ya seva ya proksi'.
-
-          Unafaa kuacha sera hii kama haijawekwa ikiwa umechagua modi nyingine yoyote ya kuweka sera za proksi.
-
-          Kwa chaguo zaidi na mifano ya kina, tembelea:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Sanidi usimamizi wa nishati kwenye skrini ya kuingia katika akaunti ya <ph name="PRODUCT_OS_NAME" />. 
 
 Sera hii hukuruhusu kusanidi jinsi <ph name="PRODUCT_OS_NAME" /> hufanya kazi kunapokuwa hakuna shughuli ya mtumiaji kwa muda huku skrini ya kuingia katika akaunti ikiwa inaonyeshwa. Sera hii hudhibiti mipangilio mingi. Kwa vigezo maalum na mfululizo wa thamani, tazama sera zinazolingana ambazo hudhibiti usimamizi wa nishati wakati wa kipindi. Tofauti za pekee zilizoko kwenye sera hizi ni:
@@ -648,24 +617,6 @@
 <translation id="3072847235228302527">Weka Sheria na Masharti kwa akaunti ya kifaa cha karibu nawe</translation>
 <translation id="3096595567015595053">Orodha ya programu jalizi zilizowezeshwa</translation>
 <translation id="3101501961102569744">Chagua jinsi ya kubainisha mipangilio ya seva mbadala</translation>
-<translation id="3125884964575432854">Hukuruhusu kubainisha seva mbadala inayotumiwa na <ph name="PRODUCT_NAME" /> na programu za ARC na huwazuia watumiaji kubadilisha mipangilio ya seva mbadala.
-
-          Ukichagua kutotumia seva mbadala kamwe na kuunganisha moja kwa moja kila wakati, chaguo nyingine zote zitapuuzwa.
-
-          Ukichagua kutumia mipangilio ya mfumo wa seva mbadala, chaguo nyingine zote zitapuuzwa.
-
-          Ukichagua kugundua seva mbadala kiotomatiki, chaguo nyingine zote zitapuuzwa.
-
-          Ukichagua hali isiyobadilika ya seva mbadala, unaweza kubainisha chaguo nyingine katika 'Anwani au URL ya seva mbadala' na 'orodha iliyotenganishwa kwa koma ya sheria za ukwepaji seva mbadala'. Programu za ARC zitatumia tu seva mbadala ya  HTTP yenye umuhimu wa juu.
-
-         Ukichagua kutumia hati ya seva mbadala ya .pac, lazima ubainishe URL ya hati katika 'URL kwenye faili ya .pac ya seva mbadala'.
-
-         Kwa mifano ya kina, tembelea:
-          <ph name="PROXY_HELP_URL" />
-
-          Ukiwasha mipangilio hii, <ph name="PRODUCT_NAME" /> na programu za ARC zitapuuza chaguo nyingine zote zinazohusishwa na seva mbadala zilizobainishwa kwenye mstari wa amri.
-
-          Kuacha sera hii bila kuiweka kutaruhusu watumiaji wachague mipangilio ya seva mbadala wenyewe.</translation>
 <translation id="3153348162326497318">Inakuruhusu kubainisha viendelezi vipi ambavyo watumiaji HAWAWEZI kusakinisha. Viendelezi ambavyo tayari vimesakinishwa vitaondolewa ikiwa vitaondolewa idhini.
 
           Thamani ilioondolewa idhini ya '*' inamaanisha viendelezi vyote vimeondolewa idhini isipokuwa vimeorodheshwa bayana katika orodha ya kutoa idhini.
@@ -738,6 +689,7 @@
       Iwapo mpangilio huu utawashwa au hutasanidiwa, watumiaji wanaweza kutumia proksi ya kuchipisha ya wingu ili kuthibitisha akaunti ya Google.
 
       Iwapo mpangilio huu utafungwa, watumiaji hawawezi kuwasha proksi, na mashine haitaruhusiwa kushiriki printa zake na <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Huwasha kipengele cha kutamatisha shughuli katika Kidhibiti cha Shughuli kwenye Chrome</translation>
 <translation id="3322771899429619102">Hukuruhusu kuweka orodha ya ruwaza za url zinazobainisha tovuti zinazoruhusiwa kuunda ufunguo. Ikiwa ruwaza ya url iko katika 'KeygenBlockedForUrls', hiyo hubatilisha vighairi hivi.
 
           Sera hii ikiachwa bila kuwekwa, thamani chaguo-msingi ya kote duniani itatumiwa kwenye tovuti zote iwe ni kutoka sera ya 'DefaultKeygenSetting', ikiwa imewekwa, la sivyo mipangilio ya kibinafsi ya mtumiaji itatumika.</translation>
@@ -921,22 +873,6 @@
          Sera hii ikiwekwa 'Weka vidakuzi kwa muda wa kipindi' basi vidakuzi vitafutwa kipindi kikifungwa. Kumbuka kwamba ikiwa <ph name="PRODUCT_NAME" /> inatekeleza katika 'hali ya chini chini', huenda kipindi kisifungwe wakati dirisha la mwisho litakapofungwa. Tafadhali angalia sera ya 'BackgroundModeEnabled' kwa maelezo zaidi kuhusu kusanidi tabia hii.
 
           Sera hii ikiachwa bila kuwekwa, kipengee cha 'AllowCookies' kitatumiwa na mtumiaji ataweza kukibadilisha.</translation>
-<translation id="4098957623809244159">Sera hii imeacha kufanya kazi, tumia ProxyMode badala yake.
-
-          Hukuruhusu kubainisha seva mbadala inayotumiwa na <ph name="PRODUCT_NAME" /> na programu za ARC-na huwazuia watumiaji kubadilisha mipangilio ya seva mbadala.
-
-          Ukichagua kutotumia seva mbadala kamwe na kuunganisha moja kwa moja kila wakati, chaguo nyingine zote zitapuuzwa.
-
-          Ukichagua kutumia mipangilio ya mfumo wa seva mbadala au kugundua seva mbadala kiotomatiki, chaguo nyingine zote zitapuuzwa.
-
-          Ukichagua mipangilio ya kujiundia ya seva mbadala, unaweza kubainisha chaguo zaidi katika 'Anwani au URL ya seva mbadala',  'URL ya seva mbadala ya faili ya .pac' na 'orodha iliyotenganishwa kwa koma ya sheria za ukwepaji wa seva mbadala'.
-
-          Kwa mifano ya kina, tembelea:
-          <ph name="PROXY_HELP_URL" />
-
-          Ukiwasha mipangilio hii, <ph name="PRODUCT_NAME" /> itapuuza chaguo zote zinazohusiana na seva mbadala zilizobainishwa kwenye mstari wa amri.
-
-          Ukiacha sera hii bila kuweka, utawaruhusu watumiaji kuchagua mipangilio ya seva mbadala wenyewe.</translation>
 <translation id="4103289232974211388">Elekeza kwenye SAML IdP baada ya uthibitishaji wa mtumiaji</translation>
 <translation id="410478022164847452">Hubainisha urefu wa muda bila mchango wa mtumiaji ambao baadaye hatua isiyo na shughuli huchukuliwa inapoendeshwa kwenye nishati ya AC.
 
@@ -1412,14 +1348,6 @@
 <translation id="5893553533827140852">Mpangilio huu ukiwashwa, basi maombi ya uthibitisho ya gnubby yatawekwa kama proksi kupitia muunganisho wa mpangishi wa mbali. 
 
        Mpangilio huu ukizimwa au usisanidiwe, maombi ya uthibitisho ya gnubby hayatawekwa kama proksi.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> na programu za ARC zitakwepa seva mbadala yoyote ya orodha ya seva pangishi zilizotolewa hapa.
-
-          Sera hii itatekelezwa tu ikiwa umechagua mipangilio ya seva mbadala kwenye "Chagua jinsi ya kubainisha mipangilio ya seva mbadala'.
-
-          Unapaswa kuacha sera hii bila kuwekwa ikiwa umechagua hali nyingine yoyote ya kuweka sera za seva mbadala.
-
-          Kwa mifano zaidi ya kina, tembelea:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Ruhusu vipakuliwa vya kusasisha kiotomatiki kupitia HTTP</translation>
 <translation id="5921888683953999946">Weka hali chaguo-msingi ya kipengele cha upatikanaji wa kishale kikubwa kwenye skrini  ya kuingia katika akaunti. 
 
@@ -1938,9 +1866,6 @@
 
       Ikiwa mpangilio huu utalemazwa au haujawekwa, <ph name="PRODUCT_NAME" /> hutumia lugha inayopendelewa iliyobainishwa na mtumiaji (ikiwa imesanidiwa), lugha ya mfumo au lugha mbadala 'en-US'.</translation>
 <translation id="7651739109954974365">Inathibitisha iwapo utumiaji wa data nje ya mtandao wako unapaswa kuwezeshwa kwa kifaa. Ikiwa itawekwa kuwa Ndivyo, utumiaji wa data nje ya mtandao wako unawezeshwa. Ikiwa hautasanidiwa au kuwekwa kuwa siyo Ndivyo, utumiaji wa data nje ya mtandao wako hautapatikana.</translation>
-<translation id="7667184304362487902">Huweka mipangilio ya seva mbadala ya <ph name="PRODUCT_NAME" /> na programu za ARC.
-
-      Sera hii bado haiko tayari kwa matumizi, tafadhali usiitumie.</translation>
 <translation id="76810863974142048">URL ambapo seva teja za uwezo wa kufikia kwa mbali zanapaswa kupata tokeni yao ya uthibitishaji.
 
           Sera hii ikiwekwa, seva pangishi ya uwezo wa kufikia kwa mbali itahitaji seva teja zinazothibitisha kupata tokeni ya uthibitishaji kutoka kwenye URL hii ili kuunganisha. Lazima itumiwe pamoja na RemoteAccessHostTokenValidationUrl.
@@ -2165,6 +2090,7 @@
 
       Thamani ya sera inastahili kubainishwa katika milisekunde.</translation>
 <translation id="8344454543174932833">Ingiza alamisho kutoka kivinjari chaguo-msingi wakati wa uendeshaji wa kwanza</translation>
+<translation id="8359734107661430198">Washa API ya ExampleDeprecatedFeature kupitia 2008/09/02</translation>
 <translation id="8360452361555133173">Washa kipengee cha kuonyesha ukurasa wa kukaribisha unapofungua kivinjari kwa mara ya kwanza baada ya kupata toleo jipya la Mfumo wa Uendeshaji.
 
      Sera hii ikiwekwa kuwa ndivyo au isiposanidiwa, kivinjari kitaonyesha tena ukurasa wa kukaribisha unapofungua kwa mara ya kwanza baada ya kupata toleo jipya la Mfumo wa Uendeshaji.
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb
index a46a16b..2de311b3 100644
--- a/components/policy/resources/policy_templates_ta.xtb
+++ b/components/policy/resources/policy_templates_ta.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ta">
 <translation id="101438888985615157">திரையை 180 டிகிரிக்குச் சுழற்று</translation>
-<translation id="1015272884520659144">chrome.usb API வழியே நேரடியாக இணையப் பயன்பாட்டில் பயன்படுத்துவதற்காக, கெர்னல் இயக்கியிலிருந்து அகற்ற அனுமதிக்கும் USB சாதனங்களின் பட்டியலை வரையறுக்கும். உள்ளீடுகள் என்பவை குறிப்பிட்ட வன்பொருளை அடையாளப்படுத்த, USB விற்பனையாளர் அடையாளங்காட்டி மற்றும் தயாரிப்பு அடையாளங்காட்டியின் இணைகளாகும்.
-
-      இந்தக் கொள்கை உள்ளமைக்கப்படவில்லை எனில், அகற்றத்தக்க USB சாதனங்களின் பட்டியல் காலியாக இருப்பதாகவே கருதப்படும்.</translation>
 <translation id="1017967144265860778">உள்நுழைவுத் திரையில் ஆற்றல் நிர்வகிப்பு</translation>
 <translation id="1019101089073227242">பயனர் தரவு கோப்பகத்தை அமை</translation>
 <translation id="1022361784792428773">பயனர்கள் நிறுவுவதிலிருந்து தடுக்க வேண்டிய நீட்டிப்பு IDகள் (அல்லது அனைத்தையும் தடுக்க * )</translation>
@@ -59,7 +56,6 @@
       கொள்கை அமைக்கப்படாவிட்டால், அல்லது false என அமைக்கப்பட்டால், TLS இல் உள்ள சைஃபர் பொதிகள் இயக்கப்படாது. அல்லது காலாவதியான சேவையகத்துடனான இணக்கத்தன்மையைத் தொடர அது true என அமைக்கப்படலாம். இது ஒரு இடைக்கால நடவடிக்கையாகும், சேவையகம் மீண்டும் உள்ளமைக்கப்பட வேண்டும்.</translation>
 <translation id="1297182715641689552">.pac ப்ராக்ஸி ஸ்கிரிப்ட்டைப் பயன்படுத்து</translation>
 <translation id="1304973015437969093">பின்னணியில் நிறுவப்பட வேண்டிய நீட்டிப்பு/பயன்பாட்டு ஐடிகளும் புதுப்பிப்பு URLகளும்</translation>
-<translation id="1310699457130669094">ப்ராக்ஸி .pac கோப்பிற்கான URL ஐ நீங்கள் இங்கே குறிப்பிடலாம். 'ப்ராக்ஸி சேவையக அமைப்புகளை எப்படி குறிப்பிடுவது என்பதைத் தேர்வுசெய்க' என்பதில், கைமுறை ப்ராக்ஸி அமைப்புகள் என்பதை நீங்கள் தேர்ந்தெடுத்திருந்தால் மட்டுமே இந்த கொள்கை நடைமுறைப்படுத்தப்படும். ப்ராக்ஸி கொள்கைகளை அமைப்பதற்கு, நீங்கள் வேறு ஏதேனும் முறையைத் தேர்ந்தெடுத்திருந்தால், இந்தக் கொள்கையை அமைக்காமல் விடவேண்டும். மேலும் விவரங்களுக்கு பார்வையிடுக: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">திரை மங்கலாகும்போது அல்லது திரை முடக்கப்பட்டவுடன் பயனரின் நடவடிக்கையைக் கண்காணிக்கும்போது அளவிடப்படும் மங்கல் தாமதத்தின் சதவீதத்தைக் குறிப்பிடுகிறது.
 
           இந்தக் கொள்கை அமைக்கப்பட்டால், திரை மங்கலாகும்போது அல்லது திரை முடக்கப்பட்டவுடன் பயனரின் நடவடிக்கையைக் கண்காணிக்கும்போது அளவிடப்படும் மங்கல் தாமதத்தின் சதவீதத்தைக் குறிப்பிடும். மங்கல் தாமதம் அளவிடப்படும்போது, மங்கல் தாமதத்திலிருந்து முதலில் உள்ளமைக்கப்பட்டபோது இருந்த அதே இடைவெளிகத் தொடர்வதற்குத் திரை முடக்கம், திரைப் பூட்டு மற்றும் செயலற்ற நிலை தாமதங்கள் சரிசெய்யப்படும்.
@@ -138,18 +134,6 @@
 <translation id="1561424797596341174">தொலைநிலை அணுகல் ஹோஸ்ட்டின் பிழைத்திருத்தப் பதிப்புகளை கொள்கை மேலெழுதும்</translation>
 <translation id="1583248206450240930"><ph name="PRODUCT_FRAME_NAME" /> ஐ இயல்புநிலையாகப் பயன்படுத்து</translation>
 <translation id="1608755754295374538">அறிவுறுத்தல் இல்லாமல் ஆடியோ பிடிப்புச் சாதனங்களுக்கு அணுகல் உள்ள URLகள்</translation>
-<translation id="1613574633990410986"><ph name="PRODUCT_NAME" /> மற்றும் ARC-பயன்பாடுகள் பயன்படுத்தும் ப்ராக்ஸி சர்வரைக் குறிப்பிட அனுமதித்து, ப்ராக்ஸி அமைப்புகளை மாற்றுவதிலிருந்து பயனர்களைத் தடுக்கிறது.
-
-      ப்ராக்ஸி சர்வரை ஒருபோதும் பயன்படுத்தாமல் எப்போதும் நேரடியாக இணைக்கத் தேர்வுசெய்தால், எல்லா பிற விருப்பங்களும் புறக்கணிக்கப்படும்.
-
-      ப்ராக்ஸி சர்வரைத் தானாகக் கண்டறிய தேர்வுசெய்தால், எல்லா பிற விருப்பங்களும் புறக்கணிக்கப்படும்.
-
-      விரிவான எடுத்துக்காட்டுகளுக்கு, பின்வரும் இணைப்பிற்குச் செல்லவும்:
-      <ph name="PROXY_HELP_URL" />
-
-      இந்த அமைப்பை இயக்கினால், கட்டளை வரியிலிருந்து குறிப்பிடப்பட்ட எல்லா ப்ராக்ஸி தொடர்பான விருப்பங்களையும் <ph name="PRODUCT_NAME" /> மற்றும் ARC-பயன்பாடுகள் புறக்கணிக்கும்.
-
-      இந்தக் கொள்கைகளை அமைக்காமல் விடுவது, பயனர்கள் தாங்களாகவே ப்ராக்ஸி அமைப்புகளைத் தேர்வுசெய்ய அனுமதிக்கும்.</translation>
 <translation id="1617235075406854669">உலாவி மற்றும் பதிவிறக்க வரலாற்றின் நீக்கத்தை இயக்கு</translation>
 <translation id="1617384279878333801">சுயவிவர நிர்வாகியில் நபரைச் சேர் என்பதை இயக்கும்</translation>
 <translation id="1655229863189977773">வட்டு தற்காலிக சேமிப்பு அளவை பைட்களில் அமை</translation>
@@ -218,9 +202,9 @@
 <translation id="1865417998205858223">விசை அனுமதிகள்</translation>
 <translation id="186719019195685253">AC ஆற்றலில் இயங்கும்போது செயலற்ற தாமதநிலையை அடைந்தவுடன் செய்ய வேண்டிய செயல்</translation>
 <translation id="187819629719252111">கோப்பு தேர்வு உரையாடல்களைக் காண்பிக்க, <ph name="PRODUCT_NAME" /> ஐ அனுமதிப்பதன் மூலமாக, கணினியில் உள்ள அக கோப்புகளுக்கான அணுகலை அனுமதிக்கிறது. இந்த அமைப்பை இயக்கினால், பயனர்கள் இயல்பாக கோப்பு தேர்வு உரையாடல்களைத் திறக்கலாம். இந்த அமைப்பை முடக்கினால், கோப்பு தேர்வு உரையாடலைத் தொடங்கக்கூடிய ஏதேனும் ஒரு செயலை பயனர் செய்தால், (அதாவது, புக்மார்க்குகளை இறக்குமதி செய்தல், கோப்புகளைப் பதிவேற்றுதல், இணைப்புகளை சேமித்தல் போன்றவை) பயனர், கோப்பு தேர்வு உரையாடல் பெட்டியில் ரத்து என்பதைக் கிளிக் செய்துவிட்டதாக கருதப்பட்டு ஒரு செய்தி காண்பிக்கப்படும். இந்த அமைப்பு அமைக்கப்படவில்லை என்றால், வழக்கம்போலவே கோப்பு தேர்வு உரையாடல்களை பயனர்கள் திறக்கலாம்.</translation>
-<translation id="1879485426724769439">சாதனத்தில் பயன்படுத்த வேண்டிய நேரமண்டலத்தைக் குறிப்பிடும். தற்போதைய அமர்வுக்கான குறிப்பிடப்பட்ட நேரமண்டலத்தைப் பயனர்கள் மேலெழுதலாம். எனினும், வெளியேறும் போது அது குறிப்பிடப்பட்ட நேரமண்டலத்திற்கு மாற்றியமைக்கப்படும். தவறான மதிப்பு வழங்கப்பட்டால், அதற்குப் பதில் "GMT"ஐப் பயன்படுத்தி கொள்கையானது தொடர்ந்து செயல்படுத்தப்படும். காலியான எழுத்துச்சரம் வழங்கப்பட்டால், கொள்கையானது நிராகரிக்கப்படும்.
+<translation id="1879485426724769439">சாதனத்தில் பயன்படுத்த வேண்டிய நேரமண்டலத்தைக் குறிப்பிடும். தற்போதைய அமர்வுக்கான குறிப்பிடப்பட்ட நேரமண்டலத்தைப் பயனர்கள் புறக்கணித்து மாற்றலாம். எனினும், வெளியேறும் போது அது குறிப்பிடப்பட்ட நேரமண்டலத்திற்கு மாற்றியமைக்கப்படும். தவறான மதிப்பு வழங்கப்பட்டால், அதற்குப் பதில் "GMT"ஐப் பயன்படுத்தி கொள்கையானது தொடர்ந்து செயல்படுத்தப்படும். காலியான எழுத்துச்சரம் வழங்கப்பட்டால், கொள்கையானது நிராகரிக்கப்படும்.
 
-      இந்தக் கொள்கைப் பயன்படுத்தப்படவில்லை எனில், தற்போது செயல்பாட்டிலுள்ள நேரமண்டலம் தொடர்ந்து பயன்பாட்டில் இருக்கும், இருப்பினும் பயனர்கள் நேரமண்டலத்தை மாற்றலாம், மேலும் மாற்றமானது நிரந்தரமாகிவிடும். இப்படி ஒரு பயனர் செய்யும் மாற்றமானது உள்நுழைவு திரையையும் மற்ற எல்லா பயனர்களையும் பாதிக்கும்.
+      இந்தக் கொள்கை பயன்படுத்தப்படவில்லை எனில், தற்போது செயல்பாட்டிலுள்ள நேரமண்டலம் தொடர்ந்து பயன்பாட்டில் இருக்கும், இருப்பினும் பயனர்கள் நேரமண்டலத்தை மாற்றலாம், மேலும் மாற்றமானது நிரந்தரமாகிவிடும். இப்படி ஒரு பயனர் செய்யும் மாற்றமானது உள்நுழைவு திரையையும் மற்ற எல்லா பயனர்களையும் பாதிக்கும்.
 
       "அமெரிக்கா/பசிஃபிக்" என்ற நேரமண்டல அமைவுடன் புதிய சாதனங்கள் தொடங்கும்.
 
@@ -235,7 +219,6 @@
       செயலாக்கப்பட்டிருந்தால், அமர்வு இயக்கத்தில் இருக்கும்போது மற்றும் திரை பூட்டப்பட்டிருக்காதபோது பெரிய, சிவப்பு நிற வெளியேற்று பொத்தான் கணினி ட்ரேயில் காண்பிக்கப்படும்.
 
       முடக்கப்பட்டிருந்தால் அல்லது குறிப்பிடப்படவில்லை எனில், கணினி திரையில் மேற்குறிப்பிட்ட எதுவும் காண்பிக்கப்படாது.</translation>
-<translation id="1942957375738056236">ப்ராக்ஸி சேவையகத்தின் URL ஐ நீங்கள் இங்கே குறிப்பிடலாம். 'ப்ராக்ஸி சேவையக அமைப்புகளை எவ்வாறு குறிப்பிடுவது என்பதைத் தேர்வுசெய்க' என்பதில் கைமுறை ப்ராக்ஸி அமைப்புகளை தேர்ந்தெடுத்தால் மட்டுமே இந்த கொள்கை செயல்படும். ப்ராக்ஸி கொள்கைகளின் அமைப்பிற்கு மற்ற முறையை நீங்கள் தேர்ந்தெடுத்தால், இந்த கொள்கையை அமைக்காமல் விடவும். மேலும் விருப்பங்கள் மற்றும் விரிவான எடுத்துக்காட்டுகளுக்கு இங்கே பார்வையிடுக: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974"><ph name="PRODUCT_OS_NAME" /> இல் உள்ள உள்நுழைவு திரையில் ஆற்றல் மேலாண்மையை உள்ளமைக்கவும்.
 
       இந்தக் கொள்கையானது, உள்நுழைவு திரை காண்பிக்கப்படும்போது, சிறிது நேரம் பயனர் செயல்பாடு எதுவும் நடைபெறவில்லை என்றால்  <ph name="PRODUCT_OS_NAME" /> ஆனது எப்படி செயல்படவேண்டும் என்பதை உள்ளமைக்க உங்களை அனுமதிக்கிறது. கொள்கையானது பல அமைப்புகளைக் கட்டுப்படுத்துகிறது. அவற்றிற்குரிய தனித்தனியான பொருட்கள் மற்றும் மதிப்புகளின் வரம்புகளுக்கு, அமர்வில் ஆற்றல் மேலாண்மையைக் கட்டுப்படுத்தும் அவற்றிற்குரிய சரியான கொள்கைகளைப் பார்க்கவும். இந்தக் கொள்கையில் உள்ள சில விதிவிலக்குகளாவன:
@@ -591,25 +574,6 @@
 <translation id="3072847235228302527">சாதன-அகக் கணக்கிற்கான சேவை விதிமுறைகளை அமைக்கவும்</translation>
 <translation id="3096595567015595053">இயக்கப்பட்ட செருகுநிரல்களின் பட்டியல்</translation>
 <translation id="3101501961102569744">ப்ராக்ஸி சர்வர் அமைப்புகளை எப்படி குறிப்பிடுவது என்று தேர்வு செய்க</translation>
-<translation id="3125884964575432854"><ph name="PRODUCT_NAME" /> மற்றும் ARC-பயன்பாடுகள் பயன்படுத்தும் ப்ராக்ஸி சர்வரைக் குறிப்பிட அனுமதித்து, ப்ராக்ஸி அமைப்புகளை மாற்றுவதிலிருந்து பயனர்களைத் தடுக்கிறது.
-
-          ப்ராக்ஸி சர்வரை ஒருபோதும் பயன்படுத்தாமல் எப்போதும் நேரடியாக இணைக்கத் தேர்வுசெய்தால், எல்லா பிற விருப்பங்களும் புறக்கணிக்கப்படும்.
-
-          முறைமை ப்ராக்ஸி சர்வரைப் பயன்படுத்தத் தேர்வுசெய்தால், எல்லா பிற விருப்பங்களும் புறக்கணிக்கப்படும்.
-
-          ப்ராக்ஸி சர்வரைத் தானாகக் கண்டறிய தேர்வுசெய்தால், எல்லா பிற விருப்பங்களும் புறக்கணிக்கப்படும்.
-
-
-          நிலையான சர்வர் ப்ராக்ஸி பயன்முறையைத் தேர்வுசெய்தால், 'ப்ராக்ஸி சர்வரின் முகவரி அல்லது URL ' மற்றும் 'ப்ராக்ஸி பைபாஸ் விதிகளின் காற்புள்ளியால் பிரிக்கப்பட்ட பட்டியல்' ஆகியவற்றில் மேற்கொண்டு விருப்பங்களைக் குறிப்பிடலாம். அதிகப்படியான முன்னுரிமையைப் பெற்ற HTTP ப்ராக்ஸி சர்வரை மட்டுமே ARC-பயன்பாடுகள் பயன்படுத்தும்.
-
-          .pac ப்ராக்ஸி ஸ்கிரிப்டைப் பயன்படுத்தத் தேர்வுசெய்தால், 'ப்ராக்ஸி .pac கோப்பிற்கான URL' என்பதில் ஸ்கிரிப்டிற்கான URLஐக் குறிப்பிட வேண்டும்.
-
-          விரிவான எடுத்துக்காட்டுகளுக்கு, பின்வரும் இணைப்பிற்குச் செல்லவும்:
-          <ph name="PROXY_HELP_URL" />
-
-         இந்த அமைப்பை இயக்கினால், கட்டளை வரியில் குறிப்பிடப்பட்ட எல்லா ப்ராக்ஸி தொடர்பான விருப்பங்களையும் <ph name="PRODUCT_NAME" /> மற்றும் ARC-பயன்பாடுகள் புறக்கணிக்கும்.
-
-         இந்தக் கொள்கையை அமைக்காமல் விடுவது, பயனர்கள் தாங்களாகவே ப்ராக்ஸி அமைப்புகளைத் தேர்வுசெய்ய அனுமதிக்கும்.</translation>
 <translation id="3153348162326497318">பயனர்கள் எந்த நீட்டிப்புகளை நிறுவக்கூடாது என்பதைக் குறிப்பிட அனுமதிக்கிறது. தடுக்கப்பட்டவையாக இருந்தால், ஏற்கனவே நிறுவப்பட்டிருக்கும் நீட்டிப்புகளிலிருந்து அது நீக்கப்படும். '*' என்ற தடுக்கப்படும் மதிப்பு, வெளிப்படையாக அனுமதிக்கும் பட்டியலில் குறிப்பிடும் வரை எல்லா நீட்டிப்புகளும் தடுக்கப்பட்டவைகளாக கருதப்படும். இந்தக் கொள்கை அமைக்கப்படாமல் இருந்தால், <ph name="PRODUCT_NAME" /> இல் எந்த நீட்டிப்பையும் பயனர் நிறுவலாம்.</translation>
 <translation id="316778957754360075">இந்த அமைப்பானது <ph name="PRODUCT_NAME" /> பதிப்பு 29க்கு பின்பு முடக்கப்பட்டுள்ளது. நிறுவனம் சார்ந்த நீட்டிப்பு/பயன்பாட்டு தொகுப்புகளை அமைக்க பரிந்துரைக்கப்படும் வழி, ExtensionInstallSources இல் உள்ள CRX தொகுப்புகளை வழங்கும் தளத்தைச் சேர்த்து, தொகுப்புகளுக்கான நேரடி பதிவிறக்க இணைப்புகளை இணையப்பக்கத்தில் வழங்குவதாகும். ExtensionInstallForcelist கொள்கையைப் பயன்படுத்தி அந்த இணையப்பக்கத்திற்கான துவக்கியை உருவாக்கலாம்.</translation>
 <translation id="3185009703220253572">பதிப்பு <ph name="SINCE_VERSION" /> முதல்</translation>
@@ -674,16 +638,17 @@
       இந்த அமைப்பு இயக்கப்பட்டிருந்தால் அல்லது உள்ளமைக்கப்படவில்லை என்றால், பயனர்கள், மேகக்கணி அச்சுப் பிராக்ஸியை, தங்களின் Google கணக்குடனான அங்கீகரிப்பின் மூலம் இயக்க முடியும்.
 
       இந்த அமைப்பு முடக்கப்பட்டிருந்தால், பயனர்களால் பிராக்ஸியை இயக்க முடியாது, மேலும் கணினி அதன் பிரிண்டர்களை <ph name="CLOUD_PRINT_NAME" /> உடன் பகிர்ந்து கொள்ள அனுமதிக்கப்படாது.</translation>
+<translation id="3297010562646015826">காரிய நிர்வாகியில்  செயல்முறைகளை முடிப்பதை இயக்கும்</translation>
 <translation id="3322771899429619102">விசை உருவாக்கத்தைப் பயன்படுத்த அனுமதிக்கும் தளங்களைக் குறிப்பிடும் url வடிவங்களின்  பட்டியலை அமைக்க உங்களை அனுமதிக்கும். Url வடிவமானது 'KeygenBlockedForUrls' என்பதில் இருந்தால், இந்த விதிவிலக்குகளை அது மேலெழுதும்.
 
           இந்தக் கொள்கை அமைக்கப்படாமல் விடப்பட்டால், எல்லா தளங்களுக்குமான ஒட்டுமொத்த இயல்புநிலை மதிப்பானது 'DefaultKeygenSetting' கொள்கை அமைக்கப்பட்டிருந்தால் அதிலிருந்து பயன்படுத்தப்படும் அல்லது பயனரின் தனிப்பட்ட உள்ளமைவின்படி பயன்படுத்தப்படும்.</translation>
 <translation id="3381968327636295719">இயல்புநிலையாக ஹோஸ்ட் உலாவியைப் பயன்படுத்து</translation>
 <translation id="3398137877608138703">வீடியோ பதிவை அனுமதி அல்லது தடு.
 
-      இயக்கப்பட்டிருந்தால் அல்லது உள்ளமைக்கப்படாமல் (இயல்புநிலையில்) இருந்தால், அறிவுறுத்தல் இல்லாமல் அணுகல் வழங்கப்படும் VideoCaptureAllowedUrls பட்டியலில் உள்ளமைக்கப்பட்ட URLகளைத் தவிர்த்து வீடியோ பதிவு அணுகலுக்கு பயனர் அறிவுறுத்தப்படுவார்.
+      இயக்கப்பட்டிருந்தால் அல்லது உள்ளமைக்கப்படாமல் (இயல்புநிலையில்) இருந்தால், பயனரைக் கேட்காமல் அணுகல் வழங்கப்படும் VideoCaptureAllowedUrls பட்டியலில் உள்ளமைக்கப்பட்ட URLகளைத் தவிர்த்து பிறவற்றுக்கு பயனரிடம் வீடியோ பதிவு அணுகலுக்காகக் கேட்கப்படும்.
       ARC-பயன்பாடுகளுக்கு அனுமதி அளிக்கப்பட்டிருந்தால் அவற்றால் கேமராவை அணுக முடியும்.
 
-      இந்தக் கொள்கை முடக்கப்படும் போது, பயனருக்கு ஒருபோதும் அறிவுறுத்தப்படாது, மேலும் VideoCaptureAllowedUrls இல் உள்ளமைக்கப்பட்ட URLகளுக்கு மட்டுமே வீடியோ பதிவு கிடைக்கும்.
+      இந்தக் கொள்கை முடக்கப்படும் போது, ஒருபோதும் பயனரிடம் கேட்கப்படாது, VideoCaptureAllowedUrls இல் உள்ளமைக்கப்பட்ட URLகளுக்கு மட்டுமே வீடியோ பதிவு கிடைக்கும்.
       ARC-பயன்பாடுகளால் கேமராவை அணுக முடியாது.
 
       ARC-பயன்பாடுகளுக்கு வெளியே, உள்ளமைக்கப்பட்ட கேமரா மட்டுமல்லாமல் எல்லா வகைகளான வீடியோ உள்ளீடுகளையும் இந்தக் கொள்கை பாதிக்கும்.</translation>
@@ -843,22 +808,6 @@
           இந்தக் கொள்கையில் 'அமர்வு நிகழும் போது குக்கீகளை வைத்திரு' என அமைக்கப்பட்டால், அமர்வு முடிவடையும் போது குக்கீகள் அழிக்கப்படும். <ph name="PRODUCT_NAME" /> பின்னணி பயன்முறையில்' இயங்கினால், கடைசி சாளரம் மூடப்படும் போது அமர்வு நிறைவடையாமல் இருக்கலாம் என்பதை மனதில் கொள்ளவும். இந்தச் செயல்பாட்டை உள்ளமைப்பது பற்றிய மேலும் தகவலுக்கு 'BackgroundModeEnabled' கொள்கையைப் பார்க்கவும்.
 
           இந்தக் கொள்கை அமைக்கப்படாமல் விடப்பட்டால், 'AllowCookies' பயன்படுத்தப்படும், பயனரால் அதனை மாற்ற முடியும்.</translation>
-<translation id="4098957623809244159">இந்தக் கொள்கைத் தடுக்கப்பட்டுள்ளது, அதற்குப் பதிலாக ProxyModeஐப் பயன்படுத்தவும்.
-
-          <ph name="PRODUCT_NAME" /> மற்றும் ARC-பயன்பாடுகள் பயன்படுத்தும் ப்ராக்ஸி சர்வரைக் குறிப்பிட அனுமதித்து, ப்ராக்ஸி அமைப்புகளை மாற்றுவதிலிருந்து பயனர்களைத் தடுக்கிறது.
-
-          ஒருபோதும் ப்ராக்ஸி சர்வரைப் பயன்படுத்தாமல் எப்போதும் நேரடியாக இணைக்கத் தேர்வுசெய்தால், எல்லா பிற விருப்பங்களும் புறக்கணிக்கப்படும்.
-
-          முறைமை ப்ராக்ஸி அமைப்புகள் அல்லது ப்ராக்ஸி சர்வரைத் தானாகக் கண்டறிய தேர்வுசெய்தால், எல்லா பிற விருப்பங்களும் புறக்கணிக்கப்படும்.
-
-          கைமுறை ப்ராக்ஸி அமைப்புகளைத் தேர்வுசெய்தால், 'ப்ராக்ஸி சர்வரின் முகவரி அல்லது URL' மற்றும் 'ப்ராக்ஸி பைபாஸ் விதிகளின் காற்புள்ளியால் பிரிக்கப்பட்ட பட்டியல்' ஆகியவற்றில் மேற்கொண்டு விருப்பங்களைக் குறிப்பிடலாம்.
-
-          விரிவான எடுத்துக்காட்டுகளுக்கு, பின்வரும் இணைப்பிற்குச் செல்லவும்:
-          <ph name="PROXY_HELP_URL" />
-
-          இந்த அமைப்பை இயக்கினால், கட்டளை வரியில் குறிப்பிடப்பட்ட எல்லா ப்ராக்ஸி தொடர்பான விருப்பங்களையும், <ph name="PRODUCT_NAME" /> புறக்கணிக்கும்.
-
-          இந்தக் கொள்கையை அமைக்காமல் விடுவது, பயனர்கள் தாங்களாகவே ப்ராக்ஸி அமைப்புகளைத் தேர்வுசெய்ய அனுமதிக்கும்.</translation>
 <translation id="4103289232974211388">பயனர் உறுதிப்படுத்தியதும் SAML IdPக்குத் திசைதிருப்பு</translation>
 <translation id="410478022164847452">AC சக்தியில் இயங்கும்போது செயலற்ற நிலை நடவடிக்கை எடுக்கப்பட்ட பிறகு பயனர் உள்ளீடின்றி நேரத்தின் அளவைக் குறிப்பிடுகிறது.
 
@@ -1284,14 +1233,6 @@
 <translation id="5893553533827140852">இந்த அமைப்பு இயக்கப்பட்டிருந்தால், தொலைநிலை ஹோஸ்ட் இணைப்பில் gnubby அங்கீகரிப்புக் கோரிக்கைகள் ப்ராக்ஸி செய்யப்படும்.
 
          இந்த அமைப்பு முடக்கப்பட்டிருந்தால் அல்லது உள்ளமைக்கப்படாமல் இருந்தால், gnubby அங்கீகரிப்புக் கோரிக்கைகள் ப்ராக்ஸி செய்யப்படாது.</translation>
-<translation id="5900959132054596599">இங்கே கொடுக்கப்பட்டுள்ள ஹோஸ்டுகளின் பட்டியலுக்கு எந்த ப்ராக்ஸியையும் <ph name="PRODUCT_NAME" /> மற்றும் ARC-பயன்பாடுகள் பைபாஸ் செய்யும்.
-
-          'ப்ராக்ஸி சர்வர் அமைப்புகளை எவ்வாறு குறிப்பிடுவது என்பதைத் தேர்வு செய்க' என்பதில் நீங்கள் கைமுறை ப்ராக்ஸி அமைப்புகளைத் தேர்ந்தெடுத்திருந்தால் மட்டுமே இந்த கொள்கை நடைமுறைப்படுத்தப்படும்.
-
-          ப்ராக்ஸி கொள்கைகளை அமைப்பதற்கு, வேறு ஏதேனும் முறையைத் தேர்ந்தெடுத்திருந்தால், இந்தக் கொள்கையை அமைக்காமல் விடவேண்டும்.
-
-          மேலும் விரிவான எடுத்துக்காட்டுகளுக்கு, பின்வரும் இணைப்பிற்குச் செல்லவும்:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">தானியங்குப் புதுப்பிப்பு பதிவிறக்கங்களை HTTP வழியாக அனுமதி</translation>
 <translation id="5921888683953999946">பெரிய இடஞ்சுட்டியின் இயல்புநிலை அணுகல்தன்மை அம்சத்தை உள்நுழைவுத் திரையில் அமைக்கவும்.
 
@@ -1767,9 +1708,6 @@
 <translation id="7632724434767231364">GSSAPI லைப்ரரி பெயர்</translation>
 <translation id="7635471475589566552"><ph name="PRODUCT_NAME" /> இல் பயன்பாட்டின் மொழியை உள்ளமைக்கிறது மற்றும் பயனர்கள் அதை மாற்றுவதைத் தடுக்கிறது. நீங்கள் இந்த அமைப்பை இயக்கினால், <ph name="PRODUCT_NAME" /> ஆனது குறிப்பிடப்பட்ட மொழியைப் பயன்படுத்தும். உள்ளமைக்கப்பட்ட மொழியானது ஆதரிக்கப்படவில்லை என்றால், அதற்கு மாற்றாக 'en-US' பயன்படுத்தப்படும். இந்த அமைப்பு முடக்கப்பட்டிருந்தால் அல்லது உள்ளமைக்கப்படவில்லை என்றால், <ph name="PRODUCT_NAME" /> ஆனது பயனர் குறிப்பிட்ட மொழியைப் பயன்படுத்தும் (உள்ளமைக்கப்பட்டால்), கணினியின் மொழியைப் பயன்படுத்தும் அல்லது 'en-US' க்கு மீட்டமைக்கப்படும்.</translation>
 <translation id="7651739109954974365">சாதனத்திற்கு தரவு ரோமிங்கை இயக்கலாமா என்பதை தீர்மானிக்கும்.  true என அமைக்கப்பட்டிருந்தால், தரவு ரோமிங் அனுமதிக்கப்படும். உள்ளமைக்கப்படாமல் விடுபட்டாலோ அல்லது false என அமைக்கப்பட்டாலோ, தரவு ரோமிங் கிடைக்காமல் போகலாம்.</translation>
-<translation id="7667184304362487902"><ph name="PRODUCT_NAME" /> மற்றும் ARC-பயன்பாடுகளுக்கான ப்ராக்ஸி அமைப்புகளை உள்ளமைக்கும்.
-
-      இந்தக் கொள்கையானது இன்னும் பயன்படுத்தத் தயாராக இல்லை, எனவே இதைப் பயன்படுத்த வேண்டாம்.</translation>
 <translation id="76810863974142048">தொலைநிலை அணுகல் க்ளையன்ட்கள் தங்கள் அங்கீகரிப்பு டோக்கனைப் பெற வேண்டிய URL.
 
           இந்தக் கொள்கை அமைக்கப்பட்டால், இணைப்பதற்காக, அங்கீகரிக்கும் க்ளையண்ட்கள் இந்த URL இலிருந்து அங்கீகரிப்பு டோக்கனைப் பெற்றிருக்க வேண்டும் என்று தொலைநிலை அணுகல் ஹோஸ்ட் கோரும். RemoteAccessHostTokenValidationUrl உடன் சேர்த்து பயன்படுத்தப்படலாம்.
@@ -1976,6 +1914,7 @@
           இந்தக் கொள்கை அமைக்கப்படாமல் விடப்பட்டால், 'BlockKeygen' பயன்படுத்தப்படும், பயனரால் அதனை மாற்ற முடியும்.</translation>
 <translation id="8329984337216493753">இந்தக் கொள்கை விற்பனைப் பயன்முறையில் மட்டுமே செயலில் இருக்கும். DeviceIdleLogoutTimeout குறிப்பிட்டிருந்தால், இந்தக் கொள்கை கவுண்டவுன் நேரத்துடன் எச்சரிக்கைப் பெட்டியின் கால நேரத்தைக் குறிப்பிடும், பயனர் வெளியறுவதற்கு முன்பாக இது காண்பிக்கப்படும். இந்தக் கொள்கையின் மதிப்பு மில்லிவினாடிகளில் குறிப்பிடப்படும்.</translation>
 <translation id="8344454543174932833">முதல் இயக்கத்தின்போதே இயல்புநிலை உலாவலிருந்து புக்மார்க்ஸை இறக்குமதி செய்</translation>
+<translation id="8359734107661430198">ExampleDeprecatedFeature API ட்ரூ 2008/09/02ஐ இயக்கு</translation>
 <translation id="8360452361555133173">OS மேம்படுத்தலைத் தொடர்ந்து முதல்முறையாக உலாவி தொடங்கும் போது வரவேற்புப் பக்கத்தைக் காட்டுவதை இயக்கவும்.
 
       இந்தக் கொள்கை true என அமைக்கப்பட்டாலோ அல்லது உள்ளமைக்கப்படாமல் இருந்தாலோ, OS மேம்படுத்தலைத் தொடர்ந்து முதல்முறைத் தொடங்கும் போது வரவேற்புப் பக்கத்தை உலாவி மீண்டும் காட்டும்.
@@ -2151,7 +2090,7 @@
 
       இந்தக் கொள்கை சரி என அமைக்கப்பட்டாலோ அமைக்கப்படவில்லை என்றாலோ, பயனர் அவரது விருப்பத்தின்படி புளூடூத்தை இயக்கலாம் அல்லது முடக்கலாம்.
 
-      இந்தக் கொள்கை அமைக்கப்பட்டால், அதைப் பயனரால் மாற்றவோ மேலெழுதவோ முடியாது.
+      இந்தக் கொள்கை அமைக்கப்பட்டால், அதைப் பயனரால் மாற்றவோ மீறி செயல்படவோ முடியாது.
 
       புளூடூத்தை இயக்கிய பிறகு, மாற்றங்கள் செயல்பட சாதனம் மறுதொடக்கம் செய்யப்பட வேண்டும் (புளூடூத்தை முடக்கும் போது, சாதனத்தை மறுதொடக்கம் செய்ய வேண்டியதில்லை).</translation>
 <translation id="8947415621777543415">சாதனத்தின் இருப்பிடத்தைப் புகாரளி</translation>
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb
index 4ed2db7..b52fcb04 100644
--- a/components/policy/resources/policy_templates_te.xtb
+++ b/components/policy/resources/policy_templates_te.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="te">
 <translation id="101438888985615157">స్క్రీన్‌ను 180 డిగ్రీల మేర తిప్పండి</translation>
-<translation id="1015272884520659144">నేరుగా వెబ్ అనువర్తనంలో chrome.usb API ద్వారా ఉపయోగించడం కోసం వాటి కెర్నల్ డ్రైవర్ నుండి వేరు చేయడానికి అనుమతించబడిన USB పరికరాల జాబితాను నిర్వచిస్తుంది. నమోదులు నిర్దిష్ట హార్డ్‌వేర్‌ను గుర్తించడానికి ఉద్దేశించిన USB విక్రేత ఐడెంటిఫైయర్ మరియు ఉత్పత్తి ఐడెంటిఫైయర్ జతలు.
-
-     ఈ విధానాన్ని కాన్ఫిగర్ చేయకుంటే, వేరు చేయగల USB పరికరాల జాబితా ఖాళీగా ఉన్నట్లు పరిగణించబడుతుంది.</translation>
 <translation id="1017967144265860778">లాగిన్ స్క్రీన్‌లో శక్తి నిర్వహణ</translation>
 <translation id="1019101089073227242">వినియోగదారు డేటా డైరెక్టరీని సెట్ చెయ్యి</translation>
 <translation id="1022361784792428773">వినియోగదారు పొడిగింపు IDల వ్యవస్థాపితం చెయ్యడం నుండి నిరోధించబడుతారు (లేదా * అన్నింటికి)</translation>
@@ -65,7 +62,6 @@
       విధానాన్ని సెట్ చేయకుంటే లేదా తప్పుకు సెట్ చేస్తే, అప్పుడు TLSలోని RC4 సైఫర్ సూట్‌లు ప్రారంభించబడవు. లేదా కాలం చెల్లిన సర్వర్‌తో అనుకూలతను అలాగే కలిగి ఉండటానికి దీన్ని ఒప్పుకు సెట్ చేయవచ్చు. ఇది విరామ సమయ కొలత ప్రమాణం మరియు సర్వర్‌ను మళ్లీ కాన్ఫిగర్ చేయాలి.</translation>
 <translation id="1297182715641689552">.pac ప్రాక్సీ స్క్రిప్ట్‌ని ఉపయోగించండి</translation>
 <translation id="1304973015437969093">పొడిగింపు/అనువర్తన IDలు మరియు నవీకరణ URLలు నిశ్శబ్దంగా ఇన్‌స్టాల్ చేయాలి</translation>
-<translation id="1310699457130669094">మీరు ప్రాక్సీ .pac ఫైల్‌కు URLను ఇక్కడ పేర్కొనవచ్చు. ఈ విధానం మీరు 'ప్రాక్సీ సర్వర్ సెట్టింగ్‌లను ఎలా పేర్కొనాలో ఎంచుకోండి' వద్ద మాన్యువల్ ప్రాక్సీ సెట్టింగ్‌లను ఎంచుకున్నప్పుడు మాత్రమే ప్రభావంతమవుతుంది. మీరు ప్రాక్సీ విధానాలను సెట్ చేయడానికి ఏదైనా ఇతర మోడ్‌ను ఎంచుకొని ఉంటే మీరు ఈ సెట్ చేయకుండా వదిలిపెట్టాలి. మరిన్ని వివరణాత్మక ఉదాహరణల కోసం, దీన్ని సందర్శించండి: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">స్క్రీన్ కాంతివిహీనంగా ఉన్నప్పుడు లేదా స్క్రీన్ ఆపివేయబడిన వెంటనే వినియోగదారు కార్యాచరణను గుర్తించినప్పుడు స్క్రీన్ కాంతివిహీనత ఆలస్యాన్ని లెక్కించే శాతాన్ని నిర్దేశిస్తుంది.
 
           ఈ విధానాన్ని సెట్ చేస్తే, ఇది స్క్రీన్ కాంతివిహీనంగా ఉన్నప్పుడు లేదా స్క్రీన్ ఆపివేయబడిన వెంటనే వినియోగదారు కార్యాచరణను గుర్తించినప్పుడు స్క్రీన్ కాంతివిహీనత ఆలస్యాన్ని లెక్కించే శాతాన్ని నిర్దేశిస్తుంది. కాంతివిహీనత ఆలస్యం లెక్కించబడినప్పుడు, స్క్రీన్ ఆపివేత, స్క్రీన్ లాక్ మరియు నిష్క్రియ ఆలస్యాలు వాస్తవంగా కాన్ఫిగర్ చేయబడిన విధంగానే స్క్రీన్ కాంతివిహీనత ఆలస్యంతో ఒకే రకమైన వ్యత్యాసాన్ని కలిగి ఉండేలా సర్దుబాటు చేయబడతాయి.
@@ -146,18 +142,6 @@
 <translation id="1561424797596341174">విధానం రిమోట్ ప్రాప్యత హోస్ట్ యొక్క డీబగ్ బిల్డ్‌ల కోసం భర్తీ చేస్తుంది</translation>
 <translation id="1583248206450240930"><ph name="PRODUCT_FRAME_NAME" />ని డిఫాల్ట్‌గా ఉపయోగించు</translation>
 <translation id="1608755754295374538">ప్రాంప్ట్ చేయబడకుండా ఆడియో క్యాప్చర్ పరికరాలకు ప్రాప్యత మంజూరు చేయబడే URLలు</translation>
-<translation id="1613574633990410986"><ph name="PRODUCT_NAME" /> మరియు ARC అనువర్తనాల ద్వారా ఉపయోగించబడే ప్రాక్సీ సర్వర్‌ను పేర్కొనడానికి మిమ్మల్ని అనుమతిస్తుంది మరియు ప్రాక్సీ సెట్టింగ్‌లను మార్చనీయకుండా వినియోగదారులను నిరోధిస్తుంది.
-
-      మీరు ఎప్పటికీ ప్రాక్సీ సర్వర్ ఉపయోగించకూడదని మరియు ఎల్లవేళలా నేరుగా కనెక్ట్ చేయాలని ఎంచుకుంటే, మిగిలిన అన్ని ఎంపికలు విస్మరించబడతాయి.
-
-      మీరు ప్రాక్సీ సర్వర్‌ స్వయంచాలకంగా గుర్తించబడాలని ఎంచుకుంటే, మిగిలిన అన్ని ఎంపికలు విస్మరించబడతాయి.
-
-      వివరణాత్మక ఉదాహరణల కోసం, ఈ లింక్‌ను సందర్శించండి:
-      <ph name="PROXY_HELP_URL" />
-
-      మీరు ఈ సెట్టింగ్‌ను ప్రారంభిస్తే, <ph name="PRODUCT_NAME" /> మరియు ARC అనువర్తనాలు ఆదేశ పంక్తి నుండి పేర్కొన్న అన్ని ప్రాక్సీ సంబంధిత ఎంపికలను విస్మరిస్తాయి.
-
-      ఈ విధానాలను సెట్ చేయకుండా వదిలివేస్తే వినియోగదారులు వారి స్వంత అభీష్టం మేరకు ప్రాక్సీ సెట్టింగ్‌లను ఎంచుకోవడానికి అనుమతించబడతారు.</translation>
 <translation id="1617235075406854669">బ్రౌజర్ మరియు డౌన్‌లోడ్ చరిత్ర తొలగింపును ప్రారంభించండి</translation>
 <translation id="1617384279878333801">ప్రొఫైల్ నిర్వాహికిలో వ్యక్తిని జోడించగల సామర్థ్యాన్ని ప్రారంభిస్తుంది</translation>
 <translation id="1655229863189977773">డిస్క్ కాష్ పరిమాణాన్ని బైట్‌ల్లో సెట్ చేయండి</translation>
@@ -238,7 +222,6 @@
       ప్రారంభిస్తే, సెషన్ సక్రియంగా ఉన్నప్పడు సిస్టమ్ ట్రేలో పెద్ద ఎర్రటి లాగ్‌అవుట్ బటన్ చూపబడుతుంది మరియు స్క్రీన్ లాక్ చేయబడదు.
 
       నిలిపివేస్తే లేదా పేర్కొనకపోతే, సిస్టమ్ ట్రేలో పెద్ద ఎర్రటి లాగ్‌అవుట్ బటన్ చూపబడదు.</translation>
-<translation id="1942957375738056236">మీరు ప్రాక్సీ సర్వర్ యొక్క URLను ఇక్కడ పేర్కొనవచ్చు. ఈ విధానం కేవలం మీరు 'ప్రాక్సీ సర్వర్ సెట్టింగ్‌లను ఎలా పేర్కొనాలి'లో మాన్యువల్ ప్రాక్సీ సెట్టింగ్‌లను ఎంచుకుంటే మాత్రమే అమలుచేయబడుతుంది. ఏ ఇతర మోడ్‌నయినా ప్రాక్సీ సెట్టింగ్ విధానాల కోసం ఎంచుకుని ఉంటే ఈ విధానాన్ని మీరు  సెట్ చేయకుండా వదిలేయాలి.  మరిన్ని ఎంపికలు మరియు వివరణాత్మక ఉదాహరణల కోసం, దీన్ని సందర్శించండి: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974"><ph name="PRODUCT_OS_NAME" />లోని లాగిన్ స్క్రీన్‌లో పవర్ నిర్వహణను కాన్ఫిగర్ చేయండి.
 
       ఈ విధానం లాగిన్ స్క్రీన్ చూపబడుతున్న సమయంలో కొంత కాలవ్యవధి వరకు వినియోగదారు కార్యాచరణ లేనప్పుడు <ph name="PRODUCT_OS_NAME" /> ఎలా ప్రవర్తించాలో కాన్ఫిగర్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. విధానం బహుళ సెట్టింగ్‌లను నియంత్రిస్తుంది. వాటి ప్రత్యేక అర్థవిచారాలు మరియు విలువ పరిధుల కోసం, సెషన్‌లో పవర్ నిర్వహణను నియంత్రించే సంబంధిత విధానాలను చూడండి. ఇవి మాత్రమే ఈ విధానాల్లోని వ్యత్యాసాలు:
@@ -608,24 +591,6 @@
 <translation id="3072847235228302527">పరికరం-స్థానిక ఖాతా కోసం సేవా నిబంధనలను సెట్ చేయడం</translation>
 <translation id="3096595567015595053">ప్రారంభించబడిన ప్లగ్‌ఇన్‌ల జాబితా</translation>
 <translation id="3101501961102569744">ప్రాక్సీ సర్వర్ సెట్టింగ్‌లని ఎలా పేర్కొనాలో ఎంచుకోండి</translation>
-<translation id="3125884964575432854"><ph name="PRODUCT_NAME" /> మరియు ARC అనువర్తనాల ద్వారా ఉపయోగించబడే ప్రాక్సీ సర్వర్‌ను పేర్కొనడానికి మిమ్మల్ని అనుమతిస్తుంది మరియు ప్రాక్సీ సెట్టింగ్‌లను మార్చనీయకుండా వినియోగదారులను నిరోధిస్తుంది.
-
-          మీరు ఎప్పటికీ ప్రాక్సీ సర్వర్ ఉపయోగించకూడదని మరియు ఎల్లవేళలా నేరుగా కనెక్ట్ చేయాలని ఎంచుకుంటే, మిగిలిన అన్ని ఎంపికలు విస్మరించబడతాయి.
-
-          మీరు సిస్టమ్ ప్రాక్సీ సెట్టింగ్‌లను ఉపయోగించాలని ఎంచుకుంటే, మిగిలిన అన్ని ఎంపికలు విస్మరించబడతాయి.
-
-          మీరు ప్రాక్సీ సర్వర్‌ స్వయంచాలకంగా గుర్తించబడాలని ఎంచుకుంటే, మిగిలిన అన్ని ఎంపికలు విస్మరించబడతాయి.
-
-          మీరు స్థిర సర్వర్ ప్రాక్సీ మోడ్‌ను ఎంచుకుంటే, 'ప్రాక్సీ సర్వర్ చిరునామా లేదా URL' మరియు 'కామాతో వేరు చేసిన ప్రాక్సీ దాటివేత నియమాల జాబితా'లో మరిన్ని ఎంపికలను పేర్కొనవచ్చు. ARC అనువర్తనాలు అత్యధిక ప్రాధాన్యత గల HTTP ప్రాక్సీ సర్వర్‌ను మాత్రమే ఉపయోగిస్తాయి.
-
-          మీరు .pac ప్రాక్సీ స్క్రిప్ట్‌ను ఉపయోగించాలని ఎంచుకుంటే, 'ప్రాక్సీ .pac ఫైల్‌కు URL'లో తప్పనిసరిగా స్క్రిప్ట్‌కు URLను పేర్కొనాలి.
-
-          వివరణాత్మక ఉదాహరణల కోసం, ఈ లింక్‌ను సందర్శించండి:
-          <ph name="PROXY_HELP_URL" />
-
-          మీరు ఈ సెట్టింగ్‌ను ప్రారంభిస్తే, <ph name="PRODUCT_NAME" /> మరియు ARC అనువర్తనాలు ఆదేశ పంక్తి నుండి పేర్కొన్న అన్ని ప్రాక్సీ సంబంధిత ఎంపికలను విస్మరిస్తాయి.
-
-          ఈ విధానాన్ని సెట్ చేయకుండా వదిలివేస్తే వినియోగదారులు వారి స్వంత అభీష్టం మేరకు ప్రాక్సీ సెట్టింగ్‌లను ఎంచుకోవడానికి అనుమతించబడతారు.</translation>
 <translation id="3153348162326497318">వినియోగదారులు ఏ పొడిగింపులను ఇన్‌స్టాల్ చేయలేరో పేర్కొనడానికి మిమ్మల్ని అనుమతిస్తుంది. ఇప్పటికే ఇన్‌స్టాల్ చేసిన పొడిగింపులను బ్లాక్‌లిస్ట్  చేసినట్లయితే, అవి తీసివేయబడతాయి. ఒక బ్లాక్‌లిస్ట్ జాబితా విలువ '*' అయితే స్పష్టంగా వైట్‌లిస్ట్‌లో పేర్కొనబడితే మినహా అన్ని పొడిగింపులు బ్లాక్‌లిస్ట్ చేయబడతాయి. ఈ విధానాన్ని సెట్ చేయకుండా ఉంటే, వినియోగదారు <ph name="PRODUCT_NAME" />లో ఏ పొడిగింపునైనా ఇన్‌స్టాల్ చేయగలరు.</translation>
 <translation id="316778957754360075">ఈ సెట్టింగ్ <ph name="PRODUCT_NAME" /> సంస్కరణ 29 నుండి విరమించబడింది. సంస్థ-హోస్ట్ చేసిన పొడిగింపు/అనువర్తన సేకరణలను సెటప్ చేయడానికి ExtensionInstallSourcesలో CRX ప్యాకేజీలను హోస్ట్ చేస్తున్న సైట్‌ను చేర్చి, వెబ్ పేజీలో ప్యాకేజీలకు ప్రత్యక్ష డౌన్‌లోడ్ లింక్‌లను ఉంచడం అనేది సిఫార్సు చేయబడిన మార్గం. ఆ వెబ్ పేజీ కోసం లాంచర్ ExtensionInstallForcelist policyని ఉపయోగించి సృష్టించబడుతుంది.</translation>
 <translation id="3185009703220253572"><ph name="SINCE_VERSION" />వ సంస్కరణ నుండి</translation>
@@ -690,6 +655,7 @@
       ఈ సెట్టింగ్ ప్రారంభించబడినా లేదా కాన్ఫిగర్ చేయకపోయినా, వినియోగదారులు వారి Google ఖాతాతో ప్రామాణీకరణ ద్వారా మేఘ ముద్రణ ప్రాక్సీని ప్రారంభించవచ్చు.
 
       ఈ సెట్టింగ్‌ను నిలిపివేస్తే, వినియోగదారులు ప్రాక్సీని ప్రారంభించలేరు మరియు మెషీన్ దాని ప్రింటర్‌లను <ph name="CLOUD_PRINT_NAME" />తో భాగస్వామ్యం చేయడానికి అనుమతించబడదు.</translation>
+<translation id="3297010562646015826">విధి నిర్వాహికిలో ప్రాసెస్‌లను ముగించడాన్ని ప్రారంభిస్తుంది</translation>
 <translation id="3322771899429619102">కీ ఉత్పాదనను ఉపయోగించడానికి అనుమతించబడే సైట్‌లను పేర్కొనే url నమూనాల జాబితాను సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఒకవేళ url నమూనా 'KeygenBlockedForUrls'లో ఉంటే, అది ఈ మినహాయింపులను భర్తీ చేస్తుంది.
 
           ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, అన్ని సైట్‌ల కోసం 'DefaultKeygenSetting' విధానం సెట్ చేసి ఉంటే దాని నుండి లేదా వినియోగదారు వ్యక్తిగత కాన్ఫిగరేషన్ నుండి సార్వజనీన డిఫాల్ట్ విలువ ఉపయోగించబడుతుంది.</translation>
@@ -866,22 +832,6 @@
           ఈ విధానాన్ని 'కుక్కీలను సెషన్ ముగిసే వరకు అలాగే ఉంచు'కి సెట్ చేస్తే సెషన్ ముగిసినప్పుడు కుక్కీలు తీసివేయబడతాయి. <ph name="PRODUCT_NAME" /> 'నేపథ్య మోడ్'లో అమలవుతుంటే, చివరి విండోను మూసివేసినా సెషన్ ముగియకపోవచ్చని గుర్తుంచుకోండి. దయచేసి ఈ ప్రవర్తనను కాన్ఫిగర్ చేయడం గురించి మరింత సమాచారం కోసం 'BackgroundModeEnabled' విధానాన్ని చూడండి.
 
           ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, 'AllowCookies' ఉపయోగించబడుతుంది మరియు వినియోగదారు దీన్ని మార్చగలరు.</translation>
-<translation id="4098957623809244159">ఈ విధానం నిలిపివేయబడింది, బదులుగా ProxyMode ఉపయోగించండి.
-
-          <ph name="PRODUCT_NAME" /> మరియు ARC అనువర్తనాల ద్వారా ఉపయోగించబడే ప్రాక్సీ సర్వర్‌ను పేర్కొనడానికి మిమ్మల్ని అనుమతిస్తుంది మరియు ప్రాక్సీ సెట్టింగ్‌లను మార్చనీయకుండా వినియోగదారులను నిరోధిస్తుంది.
-
-          మీరు ఎప్పటికీ ప్రాక్సీ సర్వర్ ఉపయోగించకూడదని మరియు ఎల్లవేళలా నేరుగా కనెక్ట్ చేయాలని ఎంచుకుంటే, మిగిలిన అన్ని ఎంపికలు విస్మరించబడతాయి.
-
-          మీరు సిస్టమ్ ప్రాక్సీ సెట్టింగ్‌లను ఉపయోగించాలని లేదా ప్రాక్సీ సర్వర్ స్వయంచాలకంగా గుర్తించబడాలని ఎంచుకుంటే, మిగిలిన అన్ని ఎంపికలు విస్మరించబడతాయి.
-
-          మీరు మాన్యువల్ ప్రాక్సీ సెట్టింగ్‌లను ఎంచుకుంటే, 'ప్రాక్సీ సర్వర్ చిరునామా లేదా URL', 'ప్రాక్సీ .pac ఫైల్‌కి URL' మరియు 'కామాతో వేరు చేసిన ప్రాక్సీ దాటివేత నియమాల జాబితా'లో మరిన్ని ఎంపికలను పేర్కొనవచ్చు.
-
-          వివరణాత్మక ఉదాహరణల కోసం, ఈ లింక్‌ను సందర్శించండి:
-          <ph name="PROXY_HELP_URL" />
-
-          మీరు ఈ సెట్టింగ్‌ను ప్రారంభిస్తే, <ph name="PRODUCT_NAME" /> ఆదేశ పంక్తి నుండి పేర్కొన్న అన్ని ప్రాక్సీ సంబంధిత ఎంపికలను విస్మరిస్తుంది.
-
-          ఈ విధానాన్ని సెట్ చేయకుండా వదిలివేస్తే వినియోగదారులు వారి స్వంత అభీష్టం మేరకు ప్రాక్సీ సెట్టింగ్‌లను ఎంచుకోవడానికి అనుమతించబడతారు.</translation>
 <translation id="4103289232974211388">వినియోగదారు నిర్ధారణ తర్వాత SAML IdPకి మళ్లింపు</translation>
 <translation id="410478022164847452">AC శక్తితో అమలవుతున్నప్పుడు ఎంత సమయం పాటు వినియోగదారు ఇన్‌పుట్ లేకుంటే నిష్క్రియ చర్య తీసుకోబడుతుందో పేర్కొంటుంది.
 
@@ -1312,14 +1262,6 @@
 <translation id="5893553533827140852">ఈ సెట్టింగ్ ప్రారంభించబడితే, gnubby ప్రామాణీకరణ అభ్యర్థనలు రిమోట్ హోస్ట్ కనెక్షన్‌లో ప్రాక్సీ చేయబడతాయి.
 
           ఈ సెట్టింగ్ నిలిపివేయబడితే లేదా కాన్ఫిగర్ చేయబడకపోతే, gnubby ప్రామాణీకరణ అభ్యర్థనలు ప్రాక్సీ చేయబడవు.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> మరియు ARC అనువర్తనాలు ఇక్కడ అందించిన హోస్ట్‌ల జాబితా కోసం ఏ ప్రాక్సీని అయినా దాటవేస్తాయి.
-
-          మీరు 'ప్రాక్సీ సర్వర్ సెట్టింగ్‌లను ఎలా పేర్కొనాలో ఎంచుకోండి' ఎంపికలో మాన్యువల్ ప్రాక్సీ సెట్టింగ్‌లను ఎంచుకున్నప్పుడు మాత్రమే ఈ విధానం ప్రభావవంతమవుతుంది.
-
-          మీరు ప్రాక్సీ విధానాలను సెట్ చేయడానికి ఏదైనా ఇతర మోడ్‌ను ఎంచుకొని ఉంటే ఈ విధానాన్ని సెట్ చేయకుండా వదిలిపెట్టాలి.
-
-          మరిన్ని వివరణాత్మక ఉదాహరణల కోసం, ఈ లింక్‌ను సందర్శించండి:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">స్వీయ నవీకరణ డౌన్‌లోడ్‌లను HTTP ద్వారా అనుమతించండి</translation>
 <translation id="5921888683953999946">లాగిన్ స్క్రీన్‌లో పెద్ద కర్సర్ ప్రాప్యత లక్షణం యొక్క డిఫాల్ట్ స్థితిని సెట్ చేయండి.
 
@@ -1803,9 +1745,6 @@
 <translation id="7632724434767231364">GSSAPI లైబ్రరీ పేరు</translation>
 <translation id="7635471475589566552"><ph name="PRODUCT_NAME" />లో అనువర్తన లొకేల్‌ని కాన్ఫిగర్ చేస్తుంది మరియు వినియోగదారులు లొకేల్‌ని మార్చనివ్వకుండా నిరోధిస్తుంది. మీరు ఈ సెట్టింగ్‌ని ప్రారంభిస్తే, <ph name="PRODUCT_NAME" /> పేర్కొన్న లొకేల్‌ని ఉపయోగిస్తుంది. కాన్ఫిగర్ చేసిన లొకేల్ మద్దతివ్వకపోతే, బదులుగా 'en-US' ఉపయోగించబడుతుంది. ఈ సెట్టింగ్‌ని ఆపివేసినా లేదా సెట్ చేయకపోయినా, <ph name="PRODUCT_NAME" /> వినియోగదారు-పేర్కొన్న ప్రాధాన్య లొకేల్‌ని (కాన్ఫిగర్ చేసి ఉంటే), సిస్టమ్ లొకేల్‌ని లేదా ఫాల్‌బ్యాక్ 'en-US' లొకేల్‌ని ఉపయోగిస్తుంది.</translation>
 <translation id="7651739109954974365">ఈ పరికరం కోసం డేటా రోమింగ్ ప్రారంభించబడాలో లేదో అనే దాన్ని నిశ్చయిస్తుంది. ఒప్పుకు సెట్ చేయబడితే, డేటా రోమింగ్ ప్రారంభించబడుతుంది. కాన్ఫిగర్ చేయకుండా ఉంటే లేదా తప్పుకు సెట్ చేస్తే, డేటా రోమింగ్ అందుబాటులో ఉండదు.</translation>
-<translation id="7667184304362487902"><ph name="PRODUCT_NAME" /> మరియు ARC అనువర్తనాల కోసం ప్రాక్సీ సెట్టింగ్‌లను కాన్ఫిగర్ చేస్తుంది.
-
-      ఈ విధానం ఇంకా వినియోగించడానికి సిద్ధంగా లేదు, దయచేసి దీన్ని ఉపయోగించవద్దు.</translation>
 <translation id="76810863974142048">రిమోట్ ప్రాప్యత క్లయింట్‌లు వారి ప్రామాణీకరణ టోకెన్‌ను పొందగల URL.
 
           ఈ విధానాన్ని సెట్ చేస్తే, రిమోట్ ప్రాప్యత హోస్ట్‌ కనెక్ట్ అయ్యే క్రమంలో క్లయింట్‌లు ఈ URL నుండి ప్రామాణీకరణ టోకెన్‌ను పొందేలా ప్రామాణీకరించడం అవసరం. ఖచ్చితంగా RemoteAccessHostTokenValidationUrlతో కలయికలో ఉపయోగించాలి.
@@ -2021,6 +1960,7 @@
 
       విధానం విలువ తప్పనిసరిగా మిల్లీ సెకన్లల్లో పేర్కొనబడాలి.</translation>
 <translation id="8344454543174932833">మొదటి అమలులోనే డిఫాల్ట్ బ్రౌజర్ నుండి బుక్‌మార్క్‌లను దిగుమతి చేయి</translation>
+<translation id="8359734107661430198">2008/09/02 ద్వారా ExampleDeprecatedFeature APIని ప్రారంభించండి</translation>
 <translation id="8360452361555133173">OS అప్‌గ్రేడ్ చేసిన అనంతరం మొదటిసారి బ్రౌజర్‌ను ప్రారంభించినప్పుడు స్వాగత పేజీని చూపడం ప్రారంభిస్తుంది.
 
       ఈ విధానాన్ని ఒప్పుకు సెట్ చేస్తే లేదా కాన్ఫిగర్ చేయకుంటే, OS అప్‌గ్రేడ్ చేసిన అనంతరం మొదటిసారి బ్రౌజర్‌ను ప్రారంభించినప్పుడు స్వాగత పేజీని మళ్లీ చూపుతుంది.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index 215b8226..8ec4112 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="th">
 <translation id="101438888985615157">หมุนหน้าจอ 180 องศา</translation>
-<translation id="1015272884520659144">กำหนดรายการอุปกรณ์ USB ที่ได้รับอนุญาตให้ถอดออกจากไดรเวอร์ Kernel เพื่อที่จะใช้งานผ่าน chrome.usb API ภายในเว็บแอปพลิเคชันโดยตรง รายการต่างๆ เป็นการจับคู่ระหว่างตัวระบุผู้ให้บริการ USB และตัวระบุผลิตภัณฑ์เพื่อที่จะระบุฮาร์ดแวร์ที่เจาะจง
-
-      หากไม่มีการกำหนดค่านโยบายนี้ จะถือว่ารายการอุปกรณ์ USB ที่ถอดได้นั้นว่างเปล่า</translation>
 <translation id="1017967144265860778">การจัดการพลังงานบนหน้าจอการเข้าสู่ระบบ</translation>
 <translation id="1019101089073227242">ตั้งค่าไดเรกทอรีข้อมูลผู้ใช้</translation>
 <translation id="1022361784792428773">รหัสส่วนขยายที่ผู้ใช้ควรป้องกันไม่ให้มีการติดตั้ง (หรือ * สำหรับทั้งหมด)</translation>
@@ -65,7 +62,6 @@
       หากไม่มีการตั้งค่านโยบายนี้หรือตั้งค่าเป็น False จะทำให้ไม่มีการเปิดใช้ชุดการเข้ารหัสของ RC4 ใน TLS มิเช่นนั้น อาจตั้งค่าเป็น True เพื่อรักษาความเข้ากันได้กับเซิร์ฟเวอร์ที่ล้าสมัย ซึ่งการดำเนินการนี้เป็นเพียงมาตรการชั่วคราวและควรกำหนดค่าเซิร์ฟเวอร์อีกครั้ง</translation>
 <translation id="1297182715641689552">ใช้สคริปต์พร็อกซี .pac</translation>
 <translation id="1304973015437969093">รหัสส่วนขยาย/แอปและ URL การอัปเดตจะติดตั้งอยู่ในพื้นหลัง</translation>
-<translation id="1310699457130669094">คุณสามารถระบุ URL ไปยังไฟล์ .pac พร็อกซีได้ที่นี่ นโยบายนี้จะมีผลในกรณีที่คุณเลือกการตั้งค่าพร็อกซีด้วยตนเองที่ "เลือกวิธีการระบุการตั้งค่าพร็อกซีเซิร์ฟเวอร์" เท่านั้น คุณควรปล่อยให้นโยบายนี้ไม่ได้ตั้งค่าหากคุณได้เลือกโหมดอื่นใดแล้วสำหรับการตั้งค่านโยบายพร็อกซี สำหรับตัวอย่างโดยละเอียด โปรดไปที่: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">ระบุเปอร์เซ็นต์ของระดับการปรับการหน่วงเวลาการสลัวหน้าจอเมื่อสังเกตพบกิจกรรมของผู้ใช้ในขณะที่หน้าจอสลัวลง หรือไม่นานหลังจากที่หน้าจอถูกปิดไป
 
           หากนโยบายนี้มีการตั้งค่า นโยบายจะระบุเปอร์เซ็นต์ของระดับการปรับการหน่วงเวลาการสลัวหน้าจอเมื่อสังเกตพบกิจกรรมของผู้ใช้ในขณะที่หน้าจอสลัวลง หรือไม่นานหลังจากที่หน้าจอถูกปิดไป เมื่อมีการปรับระดับการหน่วงเวลาการสลัว การปิดหน้าจอ การล็อกหน้าจอ และการหน่วงเวลาการไม่ใช้งานจะได้รับการปรับเปลี่ยนเพื่อรักษาระยะจากการหน่วงเวลาการสลัวหน้าจอให้อยู่ในระดับเดียวกันกับค่ากำหนดเดิม
@@ -142,18 +138,6 @@
 <translation id="1561424797596341174">การลบล้างนโยบายสำหรับเวอร์ชันการแก้ปัญหาของโฮสต์การเข้าถึงระยะไกล</translation>
 <translation id="1583248206450240930">ใช้ <ph name="PRODUCT_FRAME_NAME" /> โดยค่าเริ่มต้น</translation>
 <translation id="1608755754295374538">URL ที่จะได้รับสิทธิ์การเข้าถึงอุปกรณ์จับเสียงโดยไม่ต้องแจ้ง</translation>
-<translation id="1613574633990410986">อนุญาตให้คุณระบุพร็อกซีเซิร์ฟเวอร์ที่ <ph name="PRODUCT_NAME" /> และแอป ARC ใช้ ตลอดจนป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่าพร็อกซี
-
-      หากคุณเลือกที่จะไม่ใช้พร็อกซีเซิร์ฟเวอร์และเชื่อมต่อโดยตรงทุกครั้ง ระบบจะไม่สนใจตัวเลือกอื่นๆ ทั้งหมด
-
-      หากคุณเลือกที่จะตรวจหาพร็อกซีเซิร์ฟเวอร์โดยอัตโนมัติ ระบบจะไม่สนใจตัวเลือกอื่นๆ ทั้งหมด
-
-      สำหรับตัวอย่างอย่างละเอียด โปรดไปที่:
-      <ph name="PROXY_HELP_URL" />
-
-      หากคุณเปิดใช้การตั้งค่านี้ <ph name="PRODUCT_NAME" /> และแอป ARC จะไม่สนใจตัวเลือกที่เกี่ยวข้องกับพร็อกซีทั้งหมดซึ่งระบุจากบรรทัดคำสั่ง
-
-      การไม่ตั้งค่านโยบายนี้จะอนุญาตให้ผู้ใช้เลือกการตั้งค่าพร็อกซีด้วยตนเอง</translation>
 <translation id="1617235075406854669">เปิดใช้งานการนำออกเบราว์เซอร์และประวัติการดาวน์โหลด</translation>
 <translation id="1617384279878333801">เปิดใช้การเพิ่มบุคคลลงในตัวจัดการโปรไฟล์</translation>
 <translation id="1655229863189977773">ตั้งค่าขนาดแคชของดิสก์เป็นไบต์</translation>
@@ -238,7 +222,6 @@
       หากเปิดใช้งาน ปุ่มออกจากระบบสีแดงขนาดใหญ่จะแสดงในถาดระบบในขณะที่ใช้งานเซสชันอยู่และไม่ได้ล็อกหน้าจอ
 
       หากปิดใช้งานหรือไม่ได้ระบุ ปุ่มออกจากระบบสีแดงขนาดใหญ่จะไม่แสดงขึ้นในถาดระบบ</translation>
-<translation id="1942957375738056236">คุณสามารถระบุ URL ของพร็อกซีเซิร์ฟเวอร์ได้ที่นี่ นโยบายนี้จะมีผลหากคุณเลือกการตั้งค่าพร็อกซีด้วยตนเองที่ "เลือกวิธีระบุการตั้งค่าพร็อกซีเซิร์ฟเวอร์" เท่านั้น คุณควรปล่อยให้นโยบายไม่มีการตั้งค่าหากคุณได้เลือกโหมดอื่นใดสำหรับตั้งค่านโยบายพร็อกซี  สำหรับตัวเลือกเพิ่มเติมและตัวอย่างโดยละเอียด โปรดไปที่: <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">กำหนดค่าการจัดการพลังงานบนหน้าจอเข้าสู่ระบบใน <ph name="PRODUCT_OS_NAME" />
 
       นโยบายนี้ให้คุณกำหนดค่าวิธีการทำงานของ <ph name="PRODUCT_OS_NAME" /> เมื่อไม่มีกิจกรรมของผู้ใช้เป็นระยะเวลาหนึ่งๆ ขณะที่กำลังแสดงหน้าจอเข้าสู่ระบบ นโยบายจะควบคุมการตั้งค่าหลายอย่าง สำหรับอรรถศาสตร์ส่วนบุคคลและช่วงค่า โปรดดูนโยบายที่เกี่ยวข้องซึ่งควบคุมการจัดการพลังงานภายในเซสชัน ความคลาดเคลื่อนเดียวจากนโยบายดังกล่าวได้แก่
@@ -599,24 +582,6 @@
 <translation id="3072847235228302527">ตั้งข้อกำหนดในการให้บริการสำหรับบัญชีภายในอุปกรณ์</translation>
 <translation id="3096595567015595053">รายการปลั๊กอินที่เปิดใช้งาน</translation>
 <translation id="3101501961102569744">เลือกวิธีระบุการตั้งค่าพร็อกซีเซิร์ฟเวอร์</translation>
-<translation id="3125884964575432854">อนุญาตให้คุณระบุพร็อกซีเซิร์ฟเวอร์ที่ <ph name="PRODUCT_NAME" /> และแอป ARC ใช้ ตลอดจนป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่าพร็อกซี
-
-          หากคุณเลือกที่จะไม่ใช้พร็อกซีเซิร์ฟเวอร์และเชื่อมต่อโดยตรงทุกครั้ง ระบบจะไม่สนใจตัวเลือกอื่นๆ ทั้งหมด
-
-          หากคุณเลือกที่จะใช้การตั้งค่าพร็อกซีของระบบ ระบบจะไม่สนใจตัวเลือกอื่นๆ ทั้งหมด
-
-          หากคุณเลือกที่จะตรวจหาพร็อกซีเซิร์ฟเวอร์โดยอัตโนมัติ ระบบจะไม่สนใจตัวเลือกอื่นๆ ทั้งหมด
-
-          หากคุณเลือกโหมดเซิร์ฟเวอร์พร็อกซีแบบตายตัว คุณสามารถระบุตัวเลือกเพิ่มเติมใน "ที่อยู่หรือ URL ของพร็อกซีเซิร์ฟเวอร์" และ "รายการกฎการข้ามพร็อกซีที่คั่นด้วยเครื่องหมายจุลภาค" แอป ARC จะใช้เฉพาะพร็อกซีเซิร์ฟเวอร์ HTTP ที่มีลำดับความสำคัญสูงสุด
-
-          หากคุณเลือกที่จะใช้สคริปต์พร็อกซี .pac คุณต้องระบุ URL ของสคริปต์ใน "ไฟล์ .pac ของ URL ไปยังสคริปต์"
-
-          สำหรับตัวอย่างอย่างละเอียด โปรดไปที่:
-          <ph name="PROXY_HELP_URL" />
-
-          หากคุณเปิดใช้การตั้งค่านี้ <ph name="PRODUCT_NAME" /> และแอป ARC จะไม่สนใจตัวเลือกที่เกี่ยวข้องกับพร็อกซีทั้งหมดซึ่งระบุจากบรรทัดคำสั่ง
-
-          การไม่ตั้งค่านโยบายนี้จะอนุญาตให้ผู้ใช้เลือกการตั้งค่าพร็อกซีด้วยตนเอง</translation>
 <translation id="3153348162326497318">ช่วยให้คุณสามารถระบุส่วนขยายที่ผู้ใช้ไม่สามารถติดตั้ง ส่วนขยายที่ติดตั้งไว้แล้วจะถูกลบหากอยู่ในรายการที่ไม่อนุญาต ค่ารายการที่ไม่อนุญาต "*" หมายถึงส่วนขยายทั้งหมดอยู่ในรายการที่ไม่อนุญาตนอกจากว่าจะได้รับการระบุไว้อย่างชัดเจนในรายการที่อนุญาต หากนโยบายนี้ไม่มีการตั้งค่าไว้ ผู้ใช้จะสามารถติดตั้งส่วนขยายใดก็ได้ใน <ph name="PRODUCT_NAME" /></translation>
 <translation id="316778957754360075">การตั้งค่านี้ถูกยกเลิกไปตั้งแต่ <ph name="PRODUCT_NAME" /> เวอร์ชัน 29 วิธีที่แนะนำในการตั้งค่าคอลเล็กชันส่วนขยาย/แอปที่โฮสต์โดยองค์กรคือการรวมไซต์ที่โฮสต์แพ็กเกจ CRX ใน ExtensionInstallSources และการวางลิงก์ดาวน์โหลดโดยตรงไปยังแพ็กเกจบนหน้าเว็บ ตัวเรียกใช้งานสำหรับหน้าเว็บนั้นสามารถถูกสร้างขึ้นโดยใช้นโยบาย ExtensionInstallForcelist</translation>
 <translation id="3185009703220253572">ตั้งแต่รุ่น <ph name="SINCE_VERSION" /></translation>
@@ -681,6 +646,7 @@
       หากมีการเปิดการตั้งค่านี้หรือไม่ได้กำหนดค่าไว้ ผู้ใช้จะสามารถเปิดใช้งานพร็อกซี Cloud Print โดยการตรวจสอบสิทธิ์กับบัญชี Google ของตน
 
       หากปิดการตั้งค่านี้ ผู้ใช้จะไม่สามารถเปิดใช้งานพร็อกซีและเครื่องจะไม่ได้รับอนุญาตให้แชร์เครื่องพิมพ์กับ <ph name="CLOUD_PRINT_NAME" /></translation>
+<translation id="3297010562646015826">เปิดใช้ขั้นตอนการสิ้นสุดในตัวจัดการงาน</translation>
 <translation id="3322771899429619102">ช่วยให้คุณกำหนดรายการรูปแบบ URL ที่ระบุเว็บไซต์ที่ได้รับอนุญาตให้ใช้การสร้างคีย์ หากรูปแบบ URL อยู่ใน "KeygenBlockedForUrls" นโยบายนี้จะลบล้างข้อยกเว้นเหล่านี้
 
           หากไม่ได้ตั้งค่านโยบายนี้ไว้ ระบบจะใช้ค่าเริ่มต้นทั่วไปสำหรับเว็บไซต์ทั้งหมด ทั้งจากนโยบาย "DefaultKeygenSetting" หากมีการตั้งค่าไว้ หรือจากการกำหนดค่าส่วนตัวของผู้ใช้เอง</translation>
@@ -852,22 +818,6 @@
           หากตั้งค่านโยบายเป็น "เก็บคุกกี้ไว้ภายในช่วงเวลาของเซสชัน" ระบบจะล้างคุกกี้เมื่อเซสชันปิดลง โปรดทราบว่าหาก <ph name="PRODUCT_NAME" /> ทำงานใน "โหมดพื้นหลัง" เซสชันอาจไม่ปิดเมื่อคุณปิดหน้าต่างบานสุดท้าย โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่าลักษณะการทำงานนี้ได้จากนโยบาย "BackgroundModeEnabled"
 
           หากไม่ได้ตั้งค่านโยบายนี้ไว้ ระบบจะนำ "AllowCookies" มาใช้ และผู้ใช้จะสามารถเปลี่ยนแปลงค่าได้</translation>
-<translation id="4098957623809244159">เลิกใช้งานนโยบายนี้แล้ว โปรดใช้ ProxyMode แทน
-
-          อนุญาตให้คุณระบุพร็อกซีเซิร์ฟเวอร์ที่ <ph name="PRODUCT_NAME" /> และแอป ARC ใช้ ตลอดจนป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่าพร็อกซี
-
-          หากคุณเลือกที่จะไม่ใช้พร็อกซีเซิร์ฟเวอร์และเชื่อมต่อโดยตรงทุกครั้ง ระบบจะไม่สนใจตัวเลือกอื่นๆ ทั้งหมด
-
-          หากคุณเลือกที่จะใช้การตั้งค่าพร็อกซีของระบบ หรือตรวจหาพร็อกซีเซอร์เวอร์โดยอัตโนมัติ ระบบจะไม่สนใจตัวเลือกอื่นๆ ทั้งหมด
-
-          หากคุณเลือกการตั้งค่าพร็อกซีด้วยตนเอง คุณสามารถระบุตัวเลือกเพิ่มเติมใน "ที่อยู่หรือ URL ของพร็อกซีเซิร์ฟเวอร์", "ไฟล์ .pac ของ URL ไปยังพร็อกซี" และ "รายการกฎการข้ามพร็อกซีที่คั่นด้วยเครื่องหมายจุลภาค"
-
-          สำหรับตัวอย่างอย่างละเอียด โปรดไปที่:
-          <ph name="PROXY_HELP_URL" />
-
-          หากคุณเปิดใช้การตั้งค่านี้ <ph name="PRODUCT_NAME" /> จะไม่สนใจตัวเลือกที่เกี่ยวข้องกับพร็อกซีทั้งหมดที่ระบุจากบรรทัดคำสั่ง
-
-          การไม่ตั้งค่านโยบายนี้จะอนุญาตให้ผู้ใช้เลือกการตั้งค่าพร็อกซีด้วยตนเอง</translation>
 <translation id="4103289232974211388">เปลี่ยนเส้นทางไปยัง SAML IdP หลังจากผู้ใช้ยืนยัน</translation>
 <translation id="410478022164847452">ระบุระยะเวลาก่อนตอบสนองการไม่มีการใช้งานเมื่อไม่มีการป้อนข้อมูลจากผู้ใช้ขณะใช้ไฟ AC
 
@@ -1294,14 +1244,6 @@
 <translation id="5893553533827140852">หากเปิดใช้การตั้งค่านี้ คำขอตรวจสอบสิทธิ์ Gnubby จะส่งผ่านพร็อกซีโดยใช้การเชื่อมต่อโฮสต์ระยะไกล
 
           หากปิดใช้การตั้งค่านี้หรือไม่ได้กำหนดค่า คำขอตรวจสอบสิทธิ์ Gnubby จะไม่ส่งผ่านพร็อกซี</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> และแอป ARC จะข้ามพร็อกซีสำหรับรายการของโฮสต์ที่ให้ไว้ในที่นี้
-
-          นโยบายนี้จะมีผลในกรณีที่คุณเลือกการตั้งค่าพร็อกซีด้วยตนเองที่ "เลือกวิธีการระบุการตั้งค่าพร็อกซีเซิร์ฟเวอร์" เท่านั้น
-
-          คุณควรปล่อยให้นโยบายนี้ไม่มีการตั้งค่าหากคุณได้เลือกโหมดอื่นแล้วสำหรับการตั้งค่านโยบายพร็อกซี
-
-          สำหรับตัวอย่างโดยละเอียดเพิ่มเติม โปรดไปที่:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">อนุญาตการดาวน์โหลดการอัปเดตอัตโนมัติผ่านทาง HTTP</translation>
 <translation id="5921888683953999946">ตั้งค่าสถานะเริ่มต้นของคุณลักษณะการเข้าถึงเคอร์เซอร์ขนาดใหญ่บนหน้าจอการเข้าสู่ระบบ
 
@@ -1790,9 +1732,6 @@
 <translation id="7632724434767231364">ชื่อไลบรารี GSSAPI</translation>
 <translation id="7635471475589566552">กำหนดค่าภาษาแอปพลิเคชันใน <ph name="PRODUCT_NAME" /> และป้องกันไม่ให้ผู้ใช้เปลี่ยนภาษาดังกล่าว หากคุณเปิดใช้งานการตั้งค่านี้ <ph name="PRODUCT_NAME" /> จะใช้ภาษาที่ระบุ หากภาษาที่กำหนดค่าไว้ไม่ได้รับการสนับสนุน "en-US" จะถูกนำมาใช้แทน หากคุณปิดใช้งานหรือไม่ได้กำหนดค่าการตั้งค่านี้ <ph name="PRODUCT_NAME" /> อาจใช้ภาษาที่ต้องการตามที่ผู้ใช้ระบุ (หากกำหนดค่าไว้) ภาษาของระบบ หรือภาษาทางเลือก "en-US"</translation>
 <translation id="7651739109954974365">กำหนดว่าควรจะเปิดใช้งานการโรมมิ่งข้อมูลสำหรับอุปกรณ์หรือไม่ หากตั้งค่าเป็น "จริง" การโรมมิ่งข้อมูลจะได้รับอนุญาต หากไม่กำหนดค่าหรือตั้งค่าเป็น "เท็จ" จะไม่สามารถใช้การโรมมิ่งข้อมูลได้</translation>
-<translation id="7667184304362487902">กำหนดการตั้งค่าพร็อกซีสำหรับ <ph name="PRODUCT_NAME" /> และแอป ARC
-
-      นโยบายนี้ยังไม่พร้อมใช้งาน โปรดอย่าใช้นโยบายนี้</translation>
 <translation id="76810863974142048">URL ที่ไคลเอ็นต์การเข้าถึงระยะไกลควรรับโทเค็นการตรวจสอบสิทธิ์
 
           หากมีการตั้งนโยบายนี้ โฮสต์การเข้าถึงระยะไกลจะต้องมีการตรวจสอบสิทธิ์ไคลเอ็นต์เพื่อรับโทเค็นการตรวจสอบสิทธิ์จาก URL นี้จึงจะเชื่อมต่อได้ และต้องใช้ร่วมกับ RemoteAccessHostTokenValidationUrl
@@ -2005,6 +1944,7 @@
 
       ควรระบุค่าของนโยบายเป็นมิลลิวินาที</translation>
 <translation id="8344454543174932833">นำเข้าบุ๊กมาร์กจากเบราว์เซอร์เริ่มต้นในการเรียกใช้งานครั้งแรก</translation>
+<translation id="8359734107661430198">เปิดใช้ ExampleDeprecatedFeature API ได้ถึง 02/09/2008</translation>
 <translation id="8360452361555133173">เปิดใช้การแสดงหน้าต้อนรับเมื่อเรียกใช้เบราว์เซอร์ครั้งแรกหลังการอัปเกรดระบบปฏิบัติการ
 
       หากตั้งค่านโยบายนี้เป็น True หรือไม่ได้กำหนดค่า เบราว์เซอร์จะแสดงหน้าต้อนรับอีกครั้งเมื่อเรียกใช้เบราว์เซอร์ครั้งแรกหลังการอัปเกรดระบบปฏิบัติการ
@@ -2189,7 +2129,7 @@
 
       หากมีการตั้งค่านโยบายนี้ ผู้ใช้จะไม่สามารถเปลี่ยนหรือลบล้างได้
 
-      หลังจากเปิดใช้บลูทูธแล้ว จะต้องมีการเริ่มต้นอุปกรณ์ใหม่เพื่อให้การเปลี่ยนแปลงมีผล (ไม่จำเป็นต้องเริ่มต้นอุปกรณ์ใหม่ขณะที่ปิดใช้บลูทูธ)</translation>
+      หลังจากเปิดใช้บลูทูธแล้ว จะต้องมีการเริ่มต้นอุปกรณ์ใหม่เพื่อให้การเปลี่ยนแปลงมีผล (ไม่จำเป็นต้องเริ่มต้นอุปกรณ์ใหม่เมื่อปิดใช้บลูทูธ)</translation>
 <translation id="8947415621777543415">รายงานตำแหน่งอุปกรณ์</translation>
 <translation id="8951350807133946005">ตั้งค่าไดเรกทอรีสำหรับแคชของดิสก์</translation>
 <translation id="8955719471735800169">กลับไปด้านบน</translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index b675407..3f2a346 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="tr">
 <translation id="101438888985615157">Ekranı 180 derece döndür</translation>
-<translation id="1015272884520659144">chrome.usb API'sı aracılığıyla doğrudan bir web uygulaması içinde kullanılması için çekirdek sürücüsünden çıkarılmasına izin verilen USB cihazlarının listesini tanımlar. Girişler, belirli bir donanımı tanımlamak için kullanılan USB Tedarikçi Tanımlayıcısı ve Ürün Tanımlayıcısı çiftlerinden oluşmaktadır.
-
-      Bu politika yapılandırılmazsa çıkarılabilecek USB cihazları listesi boş olarak değerlendirilir.</translation>
 <translation id="1017967144265860778">Giriş ekranında güç yönetimi</translation>
 <translation id="1019101089073227242">Kullanıcı veri dizinini ayarla</translation>
 <translation id="1022361784792428773">Kullanıcının yüklemesine engel olunacak uzantı kimlikleri (veya tümü için *)</translation>
@@ -73,14 +70,6 @@
       Politika ayarlanmamışsa veya yanlış seçeneğine ayarlanmışsa, TLS'deki RC4 şifre paketleri etkinleştirilmez. Aksi takdirde, eski bir sunucuyla uyumluluğun korunması için doğru seçeneğine ayarlanabilir. Bu geçici bir tedbirdir ve sunucu yeniden yapılandırılmalıdır.</translation>
 <translation id="1297182715641689552">.pac proxy komut dosyası kullan</translation>
 <translation id="1304973015437969093">Uzantı/Uygulama kimlikleri ve güncelleme URL'leri sessizce yüklenir</translation>
-<translation id="1310699457130669094">Bir proxy .pac dosyasının URL'sini burada belirtebilirsiniz.
-
-          Bu politika yalnızca 'Proxy sunucu ayarlarının nasıl belirtileceğini seçin' alanında el ile proxy ayarlarını seçtiyseniz etkili olur.
-
-          Proxy politikalarının ayarlanmasıyla ilgili başka bir mod seçtiyseniz, bu politikayı ayarlamadan bırakmanız gerekir.
-
-          Ayrıntılı örnekler için şu adresi ziyaret edin:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Ekran kararmış durumdayken veya kapandıktan hemen sonra bir kullanıcı etkinliği algılandığında, ekranın kararmasındaki gecikmenin ölçekleneceği yüzdeyi belirtir.
 
           Bu politika ayarlanırsa, ekran karardığında veya ekran kapandıktan hemen sonra bir kullanıcı etkinliği algılandığında, ekranın kararmasındaki gecikmenin ölçekleneceği yüzdeyi belirtir. Ekran kararma gecikmesi ölçeklendiğinde, ekran kapanması, ekran kilidi ve boşta bekleme gecikmeleriyle ilgili süreler, orijinal olarak yapılandırılan ekran kararma gecikmesine göre aynı oran korunacak biçimde ayarlanır.
@@ -165,18 +154,6 @@
 <translation id="1561424797596341174">Politika, uzaktan erişim ana makinesinin Hata Ayıklama yapılarını geçersiz kılar</translation>
 <translation id="1583248206450240930">Varsayılan olarak <ph name="PRODUCT_FRAME_NAME" /> ürününü kullan</translation>
 <translation id="1608755754295374538">Soru sorulmadan ses yakalama cihazlarına erişim verilecek URL'ler</translation>
-<translation id="1613574633990410986"><ph name="PRODUCT_NAME" /> ve ARC uygulamaları tarafından kullanılan proxy sunucusunu belirtmenize olanak tanır ve kullanıcıların proxy ayarlarını değiştirmelerini engeller.
-
-      Hiçbir zaman proxy sunucusu kullanmamayı ve her zaman doğrudan bağlanmayı seçerseniz diğer tüm seçenekler yoksayılır.
-
-      Proxy sunucusunu otomatik olarak algılamayı seçerseniz diğer tüm seçenekler yoksayılır.
-
-      Ayrıntılı örnekler için şu sayfayı ziyaret edin:
-      <ph name="PROXY_HELP_URL" />
-
-      Bu ayarı etkinleştirirseniz <ph name="PRODUCT_NAME" /> ve ARC uygulamaları, komut satırından belirtilen proxy ile ilgili tüm seçenekleri yoksayar.
-
-      Bu politikalar ayarlanmadan bırakılırsa kullanıcıların kendi proxy ayarlarını seçmelerine izin verilir.</translation>
 <translation id="1617235075406854669">Tarayıcı ve indirme geçmişinin silinmesini etkinleştir</translation>
 <translation id="1617384279878333801">Profil yöneticisinde kişi eklemeyi etkinleştir</translation>
 <translation id="1655229863189977773">Disk önbelleği boyutunu bayt olarak ayarla</translation>
@@ -271,14 +248,6 @@
       Etkinleştirilirse, bir oturum etkinken sistem tepsisinde büyük, kırmızı bir çıkış düğmesi gösterilir ve ekran kilitlenmez.
 
       Devre dışı bırakılırsa veya hiç belirtilmezse, sistem tepsisinde büyük, kırmızı renkli çıkış düğmesi gösterilmez.</translation>
-<translation id="1942957375738056236">Proxy sunucunun URL'sini burada belirtebilirsiniz.
-
-          Bu politika yalnızca 'Proxy sunucu ayarlarının nasıl belirtileceğini seçin' seçeneğinde el ile proxy ayarlarını seçtiyseniz yürürlüğe girer.
-
-          Proxy politikalarını ayarlamak için başka bir mod seçtiyseniz, bu politikayı ayarlamadan bırakmanız gerekir.
-
-          Diğer seçenekler ve ayrıntılı örnekler için şu sayfayı ziyaret edin:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974"><ph name="PRODUCT_OS_NAME" /> sisteminde güç yönetimini giriş ekranında yapılandır.
 
       Bu politika, giriş ekranı gösterilirken belli bir süre hiçbir kullanıcı etkinliği olmadığında <ph name="PRODUCT_OS_NAME" /> sisteminin ne yapacağını yapılandırmanıza olanak verir. Bu politika çeşitli ayarları denetler. Tek tek anlamları ve değer aralıkları için bir oturum içinde güç yönetimini denetleyen ilgili politikalara bakın. Bu politikalardaki istisnalar şunlardır:
@@ -667,24 +636,6 @@
 <translation id="3072847235228302527">Bir cihaz yerel hesabı için Hizmet Şartları'nı ayarlama</translation>
 <translation id="3096595567015595053">Etkin eklentilerin listesi</translation>
 <translation id="3101501961102569744">Proxy sunucu ayarlarının nasıl belirtileceğini seç</translation>
-<translation id="3125884964575432854"><ph name="PRODUCT_NAME" /> ve ARC uygulamaları tarafından kullanılan proxy sunucusunu belirtmenize olanak tanır ve kullanıcıların proxy ayarlarını değiştirmelerini engeller.
-
-          Hiçbir zaman proxy sunucusu kullanmamayı ve her zaman doğrudan bağlanmayı seçerseniz diğer tüm seçenekler yoksayılır.
-
-          Sistem proxy ayarlarını kullanmayı seçerseniz diğer tüm seçenekler yoksayılır.
-
-          Proxy sunucusunu otomatik olarak algılamayı seçerseniz diğer tüm seçenekler yoksayılır.
-
-          Sabit sunucu proxy modunu seçerseniz "Proxy sunucusunun adresi veya URL'si" ve "Proxy atlama kurallarının virgülle ayrılmış listesi" alanlarında başka seçenekler de belirtebilirsiniz. ARC uygulamaları yalnızca en yüksek önceliğe sahip HTTP proxy sunucusunu kullanır.
-
-          Bir .pac proxy komut dosyası kullanmayı seçerseniz "Proxy .pac dosyasının URL'si" alanında komut dosyasının URL'sini belirtmeniz gerekir.
-
-          Ayrıntılı örnekler için şu sayfayı ziyaret edin:
-          <ph name="PROXY_HELP_URL" />
-
-          Bu ayarı etkinleştirirseniz <ph name="PRODUCT_NAME" /> ve ARC uygulamaları, komut satırından belirtilen proxy ile ilgili tüm seçenekleri yoksayar.
-
-          Bu politika ayarlanmadan bırakılırsa kullanıcıların kendi proxy ayarlarını seçmelerine izin verilir.</translation>
 <translation id="3153348162326497318">Kullanıcıların YÜKLEYEMEYECEĞİ uzantıları belirtmenize olanak tanır. Önceden yüklenen uzantılar, kara listeye alınırlarsa kaldırılırlar.
 
           '*' kara liste değeri, açık bir şekilde beyaz listede listelenmedikçe tüm uzantıların kara listeye alınacağını belirtir.
@@ -757,6 +708,7 @@
       Bu ayar etkinleştirilirse veya yapılandırılmazsa, kullanıcılar kendi Google hesaplarından kimlik doğrulama ile bulut (cloud) yazdırma proxy'sini etkinleştirebilirler.
 
       Bu ayar devre dışı bırakılırsa, kullanıcılar proxy'yi etkinleştiremezler ve makinenin, yazıcılarını <ph name="CLOUD_PRINT_NAME" /> ile paylaşmasına izin verilmez.</translation>
+<translation id="3297010562646015826">Görev Yöneticisi'ndeki işlemlerin sona erdirilebilmesini sağlar</translation>
 <translation id="3322771899429619102">Anahtar oluşturmasına izin verilen sitelerin belirtildiği bir URL kalıpları listesi ayarlamanıza olanak tanır. Bir URL kalıbı "KeygenBlockedForUrls" içindeyse, bu istisnalar geçersiz kılınır.
 
           Bu politika ayarlanmadan bırakıldığında, ayarlandıysa "DefaultKeygenSetting" politikasının değeri, değilse kullanıcının kişisel yapılandırmasındaki değer tüm siteler için genel varsayılan değer olarak kullanılır.</translation>
@@ -930,22 +882,6 @@
           Bu politika, "Oturum süresince çerezleri tut" seçeneğine ayarlanırsa, oturum kapatıldığında çerezler temizlenir. <ph name="PRODUCT_NAME" /> "arka plan modunda" çalışıyorsa, son pencere kapatıldığında oturumun kapatılmayabileceğini unutmayın. Bu çalışma biçimini yapılandırma ile ilgili daha fazla bilgi için lütfen "BackgroundModeEnabled" politikasına bakın.
 
           Bu politika ayarlanmamış halde bırakılırsa "AllowCookies" kullanılır ve kullanıcı bunu değiştirebilir.</translation>
-<translation id="4098957623809244159">Bu politika kullanımdan kaldırılmıştır. Bunun yerine ProxyMode politikasını kullanın.
-
-          <ph name="PRODUCT_NAME" /> ve ARC uygulamaları tarafından kullanılan proxy sunucusunu belirtmenize olanak tanır ve kullanıcıların proxy ayarlarını değiştirmelerini engeller.
-
-          Hiçbir zaman proxy sunucusu kullanmamayı ve her zaman doğrudan bağlanmayı seçerseniz diğer tüm seçenekler yoksayılır.
-
-          Sistem proxy ayarlarını kullanmayı veya proxy sunucusunu otomatik algılamayı seçerseniz diğer tüm seçenekler yoksayılır.
-
-          Manuel proxy ayarlarını seçerseniz "Proxy sunucusunun adresi veya URL'si", "Proxy .pac dosyasının URL'si" ve "Proxy atlama kurallarının virgülle ayrılmış listesi" alanlarında başka seçenekler belirtebilirsiniz. 
-
-          Ayrıntılı örnekler için şu sayfayı ziyaret edin:
-          <ph name="PROXY_HELP_URL" />
-
-          Bu ayarı etkinleştirirseniz <ph name="PRODUCT_NAME" />, komut satırından belirtilen proxy ile ilgili tüm seçenekleri yoksayar.
-
-          Bu politika ayarlanmadan bırakılırsa kullanıcıların kendi proxy ayarlarını seçmelerine izin verilir.</translation>
 <translation id="4103289232974211388">Kullanıcı onayından sonra SAML IdP'ye yönlendir</translation>
 <translation id="410478022164847452">AC güçle çalışırken, boşta kalma işleminin uygulanmasından önce kullanıcı girişi olmadan geçecek süreyi belirtir.
 
@@ -1425,14 +1361,6 @@
 <translation id="5893553533827140852">Bu ayar etkinleştirilirse gnubby kimlik doğrulama isteklerinde uzaktan ana bilgisayar bağlantısı üzerinden proxy kullanılır.
 
           Bu ayar devre dışı bırakılır veya yapılandırılmazsa gnubby kimlik doğrulama isteklerinde proxy kullanılmaz.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> ve ARC uygulamaları, burada belirtilen ana makine listesi için tüm proxy'leri atlar.
-
-          Bu politika yalnızca "Proxy sunucu ayarlarının nasıl belirtileceğini seçin" alanında manuel proxy ayarlarını seçtiyseniz uygulanır.
-
-          Proxy politikalarının ayarlanmasıyla ilgili olarak başka bir mod seçtiyseniz, bu politikayı ayarlamadan bırakmanız gerekir.
-
-          Daha ayrıntılı örnekler için şu adresi ziyaret edin:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">HTTP aracılığıyla otomatik güncelleme indirmeye izin ver</translation>
 <translation id="5921888683953999946">Giriş ekranında büyük imleç erişilebilirlik özelliğinin varsayılan durumunu ayarla.
 
@@ -1956,9 +1884,6 @@
 
       Bu ayar devre dışı bırakılırsa veya yapılandırılmazsa, <ph name="PRODUCT_NAME" /> ya kullanıcının belirttiği tercih edilen yerel ayarı (yapılandırıldıysa), ya sistem yerel ayarını ya da yedek yerel ayarı ('en-US') kullanır.</translation>
 <translation id="7651739109954974365">Veri dolaşımının etkin olup olmayacağını belirler. True olarak ayarlanırsa, veri dolaşımına izin verilir. Hiç ayarlanmazsa veya false değerine ayarlanırsa, veri dolaşımına izin verilmez.</translation>
-<translation id="7667184304362487902"><ph name="PRODUCT_NAME" /> ve ARC uygulamaları için proxy ayarlarını yapılandırır.
-
-      Bu politika henüz kullanıma hazır değildir, lütfen kullanmayın.</translation>
 <translation id="76810863974142048">Uzaktan erişim istemcilerinin kimlik doğrulama jetonunu edinmesi gereken URL.
 
           Bu politika ayarlanırsa uzaktan erişim ana makinesi, kimlik doğrulaması yapan istemcilerin bağlanmak için bu URL'den bir kimlik doğrulama jetonu almasını gerektirir. RemoteAccessHostTokenValidationUrl ile birlikte kullanılmalıdır.
@@ -2186,6 +2111,7 @@
 
       Politika değeri mili saniye olarak belirtilmelidir.</translation>
 <translation id="8344454543174932833">İlk çalıştırmada yer işaretlerini varsayılan tarayıcıdan içe aktar</translation>
+<translation id="8359734107661430198">ExampleDeprecatedFeature API'sını 02.09.2008'e kadar etkinleştirin</translation>
 <translation id="8360452361555133173">OS'nin yeni sürüme geçirilmesinden sonra, tarayıcı ilk başlatıldığında karşılama sayfasının gösterilmesini etkinleştirin.
 
       Bu politika doğru seçeneğine ayarlanırsa veya yapılandırılmazsa, tarayıcı OS'nin yeni sürüme geçirilmesinden sonra ilk başlatmada karşılama sayfasını tekrar gösterir.
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index 69373c1..4b9c72c 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="uk">
 <translation id="101438888985615157">Обернути екран на 180 градусів</translation>
-<translation id="1015272884520659144">Визначає список USB-пристроїв, які можна від’єднувати від їх драйвера ядра, щоб використовувати через API chrome.usb безпосередньо у веб-додатку. Записи є парами ідентифікатора постачальника USB й ідентифікатора продукту для визначення певного апаратного забезпечення.
-
-      Якщо це правило не налаштовано, список USB-пристроїв, які можна від’єднувати, вважається порожнім.</translation>
 <translation id="1017967144265860778">Керувати живленням на екрані входу</translation>
 <translation id="1019101089073227242">Установити каталог даних користувача</translation>
 <translation id="1022361784792428773">Ідентифікатори розширень, які користувач не має права встановлювати (або * для всіх)</translation>
@@ -65,7 +62,6 @@
       Якщо це правило не налаштовано або має значення "false", набори шифрів RC4 в TLS не працюватимуть. Або для правила можна вибрати значення "true", щоб підтримувати сумісність із застарілим сервером. Це тимчасовий захід. Налаштування сервера буде змінено.</translation>
 <translation id="1297182715641689552">Використовувати сценарій .pac проксі-сервера</translation>
 <translation id="1304973015437969093">Ідентифікатори розширень або додатків і URL-адреси оновлень, які встановлюються без попередження</translation>
-<translation id="1310699457130669094">Тут можна вказати URL-адресу файлу .pac проксі-сервера. Це правило діє, лише коли вибрано налаштування проксі-сервера вручну в розділі "Вибрати спосіб визначення налаштувань проксі-сервера". Це правило не потрібно встановлювати, якщо вибрано інший режим налаштування правил для проксі-сервера. Детальні приклади – на сторінці <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Указує відсоток, за яким масштабують затримку затемнення екрана, коли помічено активність користувача під час затемнення екрана чи невдовзі після його вимкнення.
 
           Якщо це правило встановлено, указується відсоток, за яким масштабується затримка затемнення екрана, коли помічено активність користувача під час затемнення екрана чи невдовзі після його вимкнення. Якщо затримку затемнення екрана масштабовано, відповідно налаштовуються затримки вимкнення та блокування екрана та затримка через неактивність, щоб зберігати такі самі проміжки часу від затримки затемнення екрана, як налаштовано раніше.
@@ -148,18 +144,6 @@
 <translation id="1561424797596341174">Правило замінює налагоджувальні складання хосту віддаленого доступу</translation>
 <translation id="1583248206450240930">Використовувати <ph name="PRODUCT_FRAME_NAME" /> за умовчанням</translation>
 <translation id="1608755754295374538">URL-адреси, яким завжди надаватиметься доступ до пристроїв запису аудіо</translation>
-<translation id="1613574633990410986">Дозволяє вказувати проксі-сервер, який використовують <ph name="PRODUCT_NAME" /> та додатки ARC, і забороняє користувачам змінювати налаштування проксі-сервера.
-
-      Якщо відмовитися від використання проксі-сервера та завжди під’єднуватися напряму, усі інші опції ігноруватимуться.
-
-      Якщо вибрати автоматичне визначення проксі-сервера, усі інші опції ігноруватимуться.
-
-      Щоб переглянути детальні приклади, відвідайте сторінку
-      <ph name="PROXY_HELP_URL" />
-
-      Якщо ввімкнути це налаштування, <ph name="PRODUCT_NAME" /> і додатки ARC ігноруватимуть усі опції проксі-сервера, указані в командному рядку.
-
-      Якщо ці правила не налаштовано, користувачі зможуть вибирати параметри проксі-сервера самостійно.</translation>
 <translation id="1617235075406854669">Увімкнути видалення історії веб-перегляду та завантажень</translation>
 <translation id="1617384279878333801">Додавати користувачів у менеджері профілю</translation>
 <translation id="1655229863189977773">Установити кеш-пам’ять диска в байтах</translation>
@@ -244,7 +228,6 @@
       Якщо ввімкнено, у системній області відображається велика червона кнопка виходу, коли сеанс активний і екран не заблоковано.
 
       Якщо вимкнено чи не вказано, у системній області не відображається велика червона кнопка виходу.</translation>
-<translation id="1942957375738056236">Тут можна вказати URL-адресу проксі-сервера. Це правило діє, лише коли вибрано налаштування проксі-сервера вручну в розділі "Вибрати спосіб визначення налаштувань проксі-сервера". Не потрібно встановлювати це правило, якщо вибрано інший режим для налаштування правил проксі-сервера. Інші параметри та детальні приклади – на сторінці <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Налаштовувати керування живленням на екрані входу в <ph name="PRODUCT_OS_NAME" />.
 
       Це правило дозволяє налаштувати поведінку <ph name="PRODUCT_OS_NAME" />, коли відображається екран входу, а користувач певний час неактивний. Це правило контролює декілька налаштувань. Щоб дізнатися семантику та діапазони значень цих налаштувань, перегляньте відповідні правила, які контролюють керування живленням протягом сеансу. Нижче наведено єдині винятки з цих правил.
@@ -608,24 +591,6 @@
 <translation id="3072847235228302527">Установити Умови використання для локального облікового запису на пристрої</translation>
 <translation id="3096595567015595053">Список увімкнених плагінів</translation>
 <translation id="3101501961102569744">Вибрати спосіб визначення налаштувань проксі-сервера</translation>
-<translation id="3125884964575432854">Дозволяє вказати, який проксі-сервер використовують <ph name="PRODUCT_NAME" /> та додатки ARC, і забороняє користувачам змінювати налаштування проксі-сервера.
-
-          Якщо відмовитися від використання проксі-сервера та завжди під’єднуватися напряму, усі інші опції ігноруватимуться.
-
-          Якщо завжди використовувати системні налаштування проксі-сервера, усі інші опції ігноруватимуться.
-
-          Якщо вибрати автоматичне визначення проксі-сервера, усі інші опції ігноруватимуться.
-
-          Якщо вибрати режим фіксованого проксі-сервера, інші опції можна вказати в полях "Адреса чи URL-адреса проксі-сервера" та "Розділений комами список правил обходу проксі-сервера". Додатки ARC використовуватимуть лише проксі-сервер HTTP з найвищим пріоритетом.
-
-          Якщо використовувати сценарій проксі-сервера у файлі .pac, потрібно вказати URL-адресу сценарію в полі "URL-адреса для файлу .pac проксі-сервера".
-
-          Щоб переглянути детальніші приклади, відвідайте сторінку
-          <ph name="PROXY_HELP_URL" />
-
-          Якщо ввімкнути це налаштування, <ph name="PRODUCT_NAME" /> і додатки ARC ігноруватимуть усі опції проксі-сервера, указані в командному рядку.
-
-          Якщо ці правила не налаштовано, користувачі зможуть вибирати параметри проксі-сервера самостійно.</translation>
 <translation id="3153348162326497318">Дозволяє вказувати розширення, які користувачі НЕ можуть установлювати. Уже встановлені розширення буде видалено, якщо їх внесено в чорний список. Значення чорного списку "*" означає, що всі розширення внесено в чорний список, якщо вони чітко не вказані в списку дозволених розширень. Якщо це правило не встановлено, користувач може встановити будь-яке розширення в <ph name="PRODUCT_NAME" />.</translation>
 <translation id="316778957754360075">Це налаштування не підтримується від 29-ї версії <ph name="PRODUCT_NAME" />. Рекомендований спосіб налаштування груп розширень і програм, розміщених на корпоративних серверах, – включити сайт, на якому розміщено пакети CRX у правило ExtensionInstallSources і розмістити прямі посилання для завантаження в пакети на веб-сторінці. Панель запуску для веб-сторінки можна створити за допомогою правила ExtensionInstallForcelist.</translation>
 <translation id="3185009703220253572">від версії <ph name="SINCE_VERSION" /></translation>
@@ -690,6 +655,7 @@
       Якщо це налаштування вимкнено або не налаштовано, користувачі можуть вмикати проксі-сервер Cloud Print. Для цього потрібно виконати автентифікацію, використовуючи дані облікового запису Google.
 
       Якщо це налаштування вимкнено, користувачі не можуть вмикати проксі-сервер і комп’ютер не надає <ph name="CLOUD_PRINT_NAME" /> доступ до принтерів.</translation>
+<translation id="3297010562646015826">Можна завершувати процеси в Диспетчері завдань</translation>
 <translation id="3322771899429619102">Можна створити список шаблонів URL-адрес сайтів, яким дозволено генерувати ключі. Якщо для шаблону URL-адреси вказано правило KeygenBlockedForUrls, воно замінює цей виняток.
 
           Якщо це правило не налаштовано, до всіх сайтів застосовується загальне правило за умовчанням: DefaultKeygenSetting (якщо налаштовано) або правило користувача.</translation>
@@ -860,22 +826,6 @@
           Якщо для цього правила вибрати опцію "Зберігати файли cookie впродовж сеансу", файли cookie видалятимуться після завершення сеансу. Зверніть увагу: якщо <ph name="PRODUCT_NAME" /> працює у фоновому режимі, сеанс може не завершитися, коли ви закриєте останнє вікно. Щоб дізнатися більше про налаштування цієї поведінки, перегляньте правило "BackgroundModeEnabled".
 
           Якщо це правило не налаштовано, застосовуватиметься правило "AllowCookies", і користувач зможе його змінити.</translation>
-<translation id="4098957623809244159">Це правило більше не використовується. Натомість застосовуйте правило ProxyMode.
-
-          Дозволяє вказувати проксі-сервер, який використовують <ph name="PRODUCT_NAME" /> та додатки ARC, і забороняє користувачам змінювати налаштування проксі-сервера.
-
-          Якщо відмовитися від використання проксі-сервера та завжди під’єднуватися напряму, усі інші опції ігноруватимуться.
-
-          Якщо вибрати використання системних налаштувань проксі-сервера чи автоматичне визначення проксі-сервера, усі інші опції ігноруватимуться.
-
-          Якщо вибрати ручне введення налаштувань проксі-сервера, інші опції можна вказати в полях "Адреса чи URL-адреса проксі-сервера" та "Розділений комами список правил обходу проксі-сервера".
-
-          Щоб переглянути детальніші приклади, відвідайте сторінку
-          <ph name="PROXY_HELP_URL" />
-
-          Якщо це правило налаштовано, <ph name="PRODUCT_NAME" /> і додатки ARC ігноруватимуть усі опції проксі-сервера, указані в командному рядку.
-
-          Якщо ці правила не налаштовано, користувачі зможуть вибирати параметри проксі-сервера самостійно.</translation>
 <translation id="4103289232974211388">Перенаправлення на постачальника ідентифікатора SAML після підтвердження користувача</translation>
 <translation id="410478022164847452">Визначає період часу неактивності користувача, після якого вмикається режим неактивності, якщо використовується живлення від мережі.
 
@@ -1302,14 +1252,6 @@
 <translation id="5893553533827140852">Якщо цей параметр увімкнено, запити на автентифікацію розширення Gnubby надсилаються через віддалене з’єднанння з хостом.
 
           Якщо цей параметр вимкнено або не налаштовано, запити на автентифікацію розширення Gnubby не надсилаються.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> і додатки ARC обходитимуть усі проксі-сервери з наведеного тут списку хостів.
-
-          Це правило діє, лише коли вибрано налаштування проксі-сервера вручну в розділі "Вибрати спосіб визначення параметрів проксі-сервера".
-
-          Це правило не потрібно встановлювати, якщо вибрано інший режим налаштування правил для проксі-сервера.
-
-          Щоб переглянути детальні приклади, відвідайте сторінку
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Дозволити завантаження автоматичних оновлень через HTTP</translation>
 <translation id="5921888683953999946">Налаштувати стан за умовчанням для функції доступності великого курсора на екрані входу.
 
@@ -1791,9 +1733,6 @@
 <translation id="7632724434767231364">Назва бібліотеки GSSAPI</translation>
 <translation id="7635471475589566552">Установлює мовний код програми в <ph name="PRODUCT_NAME" /> і не дозволяє користувачам змінювати його. Якщо це налаштування ввімкнено, <ph name="PRODUCT_NAME" /> використовує вказаний мовний код. Якщо встановлений мовний код не підтримується, замість нього використовується "en-US". Якщо це налаштування вимкнено чи не встановлено, <ph name="PRODUCT_NAME" /> використовує вказаний користувачем мовний код (якщо налаштовано), мовний код системи або вихідний мовний код "en-US".</translation>
 <translation id="7651739109954974365">Визначає, чи має бути ввімкнено роумінг даних для пристрою. Якщо значення правила встановлено як "true", роумінг даних дозволено. Якщо правило не налаштовано чи його значення встановлено як "false", роумінг даних буде недоступним.</translation>
-<translation id="7667184304362487902">Установлює налаштування проксі-сервера для <ph name="PRODUCT_NAME" /> і додатків ARC.
-
-      Це правило ще не готове до використання. Не користуйтеся ним.</translation>
 <translation id="76810863974142048">URL-адреса сторінки, де клієнти віддаленого доступу можуть отримати маркер автентифікації.
 
           Якщо налаштувати це правило, хост віддаленого доступу під час з’єднання проситиме клієнтів надати маркер автентифікації з цієї сторінки. Це правило потрібно використовувати разом із правилом "RemoteAccessHostTokenValidationUrl".
@@ -2007,6 +1946,7 @@
 
       Значення правила потрібно вказувати в мілісекундах.</translation>
 <translation id="8344454543174932833">Імпорт закладок із веб-переглядача за умовчанням під час першого запуску</translation>
+<translation id="8359734107661430198">Увімкнути API функції ExampleDeprecatedFeature, що підтримувалася до 02.09.2008.</translation>
 <translation id="8360452361555133173">Показує сторінку привітання під час першого запуску веб-переглядача після оновлення ОС.
 
       Якщо це правило не налаштовано або має значення "true", веб-переглядач показуватиме сторінку привітання під час першого запуску після оновлення ОС.
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index d049ee9..e3d30fc 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="vi">
 <translation id="101438888985615157">Xoay màn hình 180 độ</translation>
-<translation id="1015272884520659144">Xác định dang sách thiết bị USB được phép tách khỏi trình điều khiển nhân hệ điều hành để sử dụng thông qua API chrome.usb ngay bên trong ứng dụng web. Mục nhập là các cặp Số nhận dạng nhà cung cấp USB và Số nhận dạng sản phẩm để xác định một phần cứng cụ thể.
-
-      Nếu chính sách này chưa được định cấu hình, danh sách thiết bị USB có thể tách sẽ được coi là trống.</translation>
 <translation id="1017967144265860778">Quản lý nguồn trên màn hình đăng nhập</translation>
 <translation id="1019101089073227242">Thiết lập thư mục dữ liệu người dùng</translation>
 <translation id="1022361784792428773">Các ID tiện ích mà bạn nên ngăn người dùng cài đặt (hoặc * cho tất cả)</translation>
@@ -73,14 +70,6 @@
       Nếu chính sách này không được đặt hoặc được đặt thành false thì bộ mã hóa RC4 trong TLS sẽ không được bật. Ngoài ra, chính sách có thể được đặt thành true để duy trì khả năng tương thích với máy chủ lỗi thời. Đây là một biện pháp tạm thời và cần phải định cấu hình lại máy chủ.</translation>
 <translation id="1297182715641689552">Sử dụng tập lệnh proxy .pac</translation>
 <translation id="1304973015437969093">Cần ID tiện ích/ứng dụng và URL cập nhật để tự động cài đặt</translation>
-<translation id="1310699457130669094">Bạn có thể chỉ định URL tới tệp .pac proxy tại đây.
-
-          Chính sách này chỉ có hiệu lực nếu bạn đã chọn cài đặt proxy theo cách thủ công tại 'Chọn cách chỉ định cài đặt máy chủ proxy'.
-
-          Bạn không nên thiết lập chính sách này nếu bạn đã chọn bất kỳ chế độ nào khác để thiết lập chính sách proxy.
-
-         Để biết thêm ví dụ cụ thể, truy cập:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">Chỉ định tỷ lệ phần trăm theo đó độ trễ mờ màn hình được xác định khi hoạt động của người dùng được quan sát thấy lúc màn hình bị làm mờ hoặc ngay sau khi màn hình tắt.
 
           Nếu chính sách này được đặt, chính sách chỉ định tỷ lệ phần trăm theo đó độ trễ mờ màn hình được xác định khi hoạt động của người dùng được quan sát thấy lúc màn hình bị làm mờ hoặc ngay sau khi màn hình tắt. Khi độ trễ mờ màn hình được xác định tỷ lệ, độ trễ tắt màn hình, độ trễ khóa màn hình và độ trễ khi không hoạt động được điều chỉnh để duy trì cùng khoảng cách với độ trễ mờ màn hình như được định cấu hình ban đầu.
@@ -163,18 +152,6 @@
 <translation id="1561424797596341174">Chính sách ghi đè dành cho bản dựng Gỡ lỗi của máy chủ truy cập từ xa</translation>
 <translation id="1583248206450240930">Sử dụng <ph name="PRODUCT_FRAME_NAME" /> theo mặc định</translation>
 <translation id="1608755754295374538">Các URL sẽ được cấp quyền truy cập thiết bị ghi âm mà không cần phải hiển thị lời nhắc</translation>
-<translation id="1613574633990410986">Cho phép bạn chỉ định máy chủ proxy mà <ph name="PRODUCT_NAME" /> và ứng dụng ARC sử dụng, đồng thời ngăn người dùng thay đổi cài đặt proxy.
-
-      Nếu bạn chọn không bao giờ sử dụng máy chủ proxy và luôn kết nối trực tiếp, tất cả các tùy chọn khác sẽ được bỏ qua.
-
-      Nếu bạn chọn tự động phát hiện máy chủ proxy, tất cả các tùy chọn khác sẽ được bỏ qua.
-
-      Để biết các ví dụ chi tiết, hãy truy cập:
-      <ph name="PROXY_HELP_URL" />
-
-      Nếu bạn bật cài đặt này, <ph name="PRODUCT_NAME" /> và ứng dụng ARC sẽ bỏ qua tất cả các tùy chọn liên quan đến proxy được chỉ định từ dòng lệnh.
-
-      Không đặt các trường này sẽ cho phép người dùng tự chọn cài đặt proxy.</translation>
 <translation id="1617235075406854669">Bật xóa lịch sử trình duyệt và lịch sử tải xuống</translation>
 <translation id="1617384279878333801">Bật tính năng thêm người trong trình quản lý hồ sơ</translation>
 <translation id="1655229863189977773">Đặt kích thước bộ nhớ cache của đĩa theo byte</translation>
@@ -263,14 +240,6 @@
       Nếu được bật, một nút đăng xuất màu đỏ, lớn được hiển thị trong khay hệ thống khi phiên hoạt động và màn hình không bị khóa.
 
       Nếu bị tắt hoặc không được chỉ định, không có nút đăng xuất màu đỏ, lớn nào hiển thị trong khay hệ thống.</translation>
-<translation id="1942957375738056236">Bạn có thể chỉ định URL của máy chủ proxy ở đây.
-
-          Chính sách này chỉ có hiệu lực nếu bạn đã chọn cài đặt proxy thủ công tại 'Chọn cách chỉ định cài đặt máy chủ proxy'.
-
-          Bạn không nên thiết lập chính sách này nếu bạn đã chọn bất kỳ chế độ nào khác để thiết lập chính sách proxy.
-
-          Để có thêm tùy chọn và các ví dụ cụ thể, hãy truy cập:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">Định cấu hình quản lý điện năng trên màn hình đăng nhập trong <ph name="PRODUCT_OS_NAME" />.
 
       Chính sách này cho phép bạn định cấu hình cách <ph name="PRODUCT_OS_NAME" /> hoạt động khi không có hoạt động nào của người dùng trong một khoảng thời gian khi màn hình đăng nhập đang hiển thị. Chính sách này kiểm soát nhiều cài đặt. Để biết từng vùng giá trị và ngữ nghĩa học của các cài đặt, hãy xem các chính sách tương ứng kiểm soát quản lý điện năng trong phiên. Sai lệch duy nhất so với các chính sách này là:
@@ -658,24 +627,6 @@
 <translation id="3072847235228302527">Đặt Điều khoản dịch vụ cho một tài khoản cục bộ trên thiết bị</translation>
 <translation id="3096595567015595053">Danh sách plugin được kích hoạt</translation>
 <translation id="3101501961102569744">Chọn cách chỉ định cài đặt máy chủ proxy</translation>
-<translation id="3125884964575432854">Cho phép bạn chỉ định máy chủ proxy mà <ph name="PRODUCT_NAME" /> và ứng dụng ARC sử dụng, đồng thời ngăn người dùng thay đổi cài đặt proxy.
-
-          Nếu bạn chọn không bao giờ sử dụng máy chủ proxy và luôn kết nối trực tiếp, tất cả các tùy chọn khác đều được bỏ qua.
-
-          Nếu bạn chọn sử dụng cài đặt máy chủ proxy, tất cả các tùy chọn khác sẽ được bỏ qua.
-
-          Nếu bạn chọn tự động phát hiện máy chủ proxy, tất cả các tùy chọn khác sẽ được bỏ qua.
-
-          Nếu chọn chế độ proxy máy chủ cố định, bạn có thể chỉ định thêm tùy chọn trong 'Địa chỉ hoặc URL của máy chủ proxy' và 'Danh sách được phân cách bằng dấu phẩy các quy tắc bỏ qua proxy'. Ứng dụng ARC sẽ chỉ sử dụng máy chủ proxy HTTP có mức độ ưu tiên cao nhất.
-
-          Nếu chọn sử dụng tập lệnh proxy .pac, bạn phải chỉ định URL cho tập lệnh trong 'URL cho tệp .pac proxy'.
-
-          Để biết các ví dụ chi tiết, hãy truy cập:
-          <ph name="PROXY_HELP_URL" />
-
-          Nếu bạn bật cài đặt này, <ph name="PRODUCT_NAME" /> và ứng dụng ARC sẽ bỏ qua tất cả các tùy chọn liên quan đến proxy đã chỉ định từ dòng lệnh.
-
-          Không đặt các trường này sẽ cho phép người dùng tự chọn cài đặt proxy.</translation>
 <translation id="3153348162326497318">Cho phép bạn chỉ định những tiện ích mà người dùng KHÔNG thể cài đặt. Các tiện ích đã được cài đặt sẽ bị xóa nếu nằm trong danh sách đen.
 
           Giá trị danh sách đen của '*' có nghĩa là tất cả tiện ích đều nằm trong danh sách đen trừ khi chúng được liệt kê rõ ràng trong danh sách trắng.
@@ -748,6 +699,7 @@
       Nếu cài đặt này được bật hoặc không được định cấu hình, người dùng có thể bật proxy máy in máy chủ ảo bằng cách xác thực bằng tài khoản Google của họ.
 
       Nếu cài đặt này được bật, người dùng không thể bật proxy và máy sẽ không được phép chia sẻ máy in với <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3297010562646015826">Bật kết thúc quá trình trong Trình quản lý tác vụ</translation>
 <translation id="3322771899429619102">Cho phép bạn thiết lập danh sách các mẫu URL chỉ định những trang web được phép sử dụng tạo khóa. Nếu một mẫu URL nằm trong 'KeygenBlockedForUrls', chính sách đó sẽ ghi đè các ngoại lệ này.
 
           Nếu không thiết lập chính sách này, giá trị mặc định chung sẽ được sử dụng cho tất cả trang web từ chính sách 'DefaultKeygenSetting' nếu chính sách này được đặt hoặc từ cấu hình cá nhân của người dùng.</translation>
@@ -928,22 +880,6 @@
           Nếu chính sách này được đặt thành 'Lưu giữ cookie trong thời hạn của phiên' thì cookie sẽ bị xóa khi phiên đóng. Xin lưu ý rằng nếu <ph name="PRODUCT_NAME" /> đang chạy trong 'chế độ nền', phiên có thể không đóng khi cửa sổ cuối cùng đóng. Vui lòng xem chính sách 'BackgroundModeEnabled' để biết thêm thông tin về cách định cấu hình thao tác này.
 
           Nếu chính sách này không được đặt, 'AllowCookies' sẽ được sử dụng và người dùng có thể thay đổi tùy chọn đó.</translation>
-<translation id="4098957623809244159">Chính sách này không được dùng nữa, thay vào đó hãy sử dụng ProxyMode.
-
-          Cho phép bạn chỉ định máy chủ proxy mà <ph name="PRODUCT_NAME" /> và ứng dụng ARC sử dụng và ngăn người dùng thay đổi cài đặt proxy.
-
-          Nếu bạn chọn không bao giờ sử dụng máy chủ proxy và luôn kết nối trực tiếp, tất cả các tùy chọn khác đều được bỏ qua.
-
-          Nếu bạn chọn sử dụng máy chủ proxy hoặc tự động phát hiện máy chủ proxy, tất cả các tùy chọn khác đều được bỏ qua.
-
-          Nếu chọn cài đặt proxy thủ công, bạn có thể chỉ định thêm tùy chọn trong 'Địa chỉ hoặc URL của máy chủ proxy', 'URL tới tệp .pac proxy' và 'Danh sách các quy tắc bỏ qua proxy được phân cách bằng dấu phẩy'.
-
-          Để xem ví dụ chi tiết, hãy truy cập:
-          <ph name="PROXY_HELP_URL" />
-
-          Nếu bạn bật cài đặt này, <ph name="PRODUCT_NAME" /> sẽ bỏ qua tất cả các tùy chọn liên quan đến proxy được chỉ định từ dòng lệnh.
-
-          Không đặt chính sách này sẽ cho phép người dùng tự chọn cài đặt proxy.</translation>
 <translation id="4103289232974211388">Chuyển hướng tới SAML IdP sau khi xác nhận người dùng</translation>
 <translation id="410478022164847452">Chỉ định khoảng thời gian không có thao tác nhập của người dùng mà sau khoảng thời gian đó hành động không sử dụng được thực hiện khi chạy trên nguồn AC.
 
@@ -1424,14 +1360,6 @@
 <translation id="5893553533827140852">Nếu cài đặt này được bật, yêu cầu xác thực gnubby sẽ được proxy qua kết nối máy chủ từ xa.
 
           Nếu cài đặt này bị tắt hoặc không được định cấu hình, yêu cầu xác thực gnubby sẽ không được proxy.</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> và ứng dụng ARC sẽ bỏ qua mọi proxy cho danh sách các máy chủ lưu trữ được cung cấp ở đây.
-
-          Chính sách này chỉ có hiệu lực nếu bạn đã chọn cài đặt proxy thủ công tại 'Chọn cách chỉ định cài đặt máy chủ proxy'.
-
-          Bạn không nên đặt chính sách này nếu bạn đã chọn bất kỳ chế độ nào khác để đặt chính sách proxy.
-
-          Để biết thêm ví dụ cụ thể, hãy truy cập:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">Cho phép tài nguyên đã tải xuống tự động cập nhật qua HTTP</translation>
 <translation id="5921888683953999946">Đặt trạng thái mặc định của tính năng trợ năng con trỏ lớn trên màn hình đăng nhập.
 
@@ -1949,9 +1877,6 @@
 <translation id="7632724434767231364">Tên thư viện GSSAPI</translation>
 <translation id="7635471475589566552">Định cấu hình ngôn ngữ ứng dụng trong <ph name="PRODUCT_NAME" /> và ngăn người dùng thay đổi ngôn ngữ này. Nếu bạn bật cài đặt này, <ph name="PRODUCT_NAME" /> sẽ sử dụng ngôn ngữ được chỉ định. Nếu ngôn ngữ được định cấu hình không được hỗ trợ, 'en-US' sẽ được sử dụng thay thế. Nếu bạn tắt hoặc không thiết lập cài đặt này, <ph name="PRODUCT_NAME" /> sẽ sử dụng ngôn ngữ ưa thích do người dùng chỉ định (nếu được định cấu hình), ngôn ngữ hệ thống hoặc ngôn ngữ dự phòng 'en-US'.</translation>
 <translation id="7651739109954974365">Xác định liệu chuyển vùng dữ liệu có được bật cho thiết bị hay không. Nếu được đặt thành đúng, chuyển vùng dữ liệu sẽ được phép. Nếu không được định cấu hình hoặc được đặt thành sai, chuyển vùng dữ liệu sẽ không khả dụng.</translation>
-<translation id="7667184304362487902">Định cấu hình cài đặt proxy cho <ph name="PRODUCT_NAME" /> và ứng dụng ARC.
-
-      Chính sách chưa sẵn sàng để sử dụng, vui lòng không sử dụng chính sách này.</translation>
 <translation id="76810863974142048">URL nơi ứng dụng truy cập từ xa sẽ lấy mã thông báo xác thực.
 
           Nếu chính sách này được đặt thì máy chủ truy cập từ xa sẽ yêu cầu xác thực ứng dụng để lấy mã thông báo xác thực từ URL này nhằm mục đích kết nối. Phải sử dụng chính sách này cùng với RemoteAccessHostTokenValidationUrl.
@@ -2177,6 +2102,7 @@
 
       Giá trị của chính sách phải được chỉ định theo mili giây.</translation>
 <translation id="8344454543174932833">Nhập dấu trang từ trình duyệt mặc định trong lần chạy đầu tiên</translation>
+<translation id="8359734107661430198">Bật API ExampleDeprecatedFeature đến ngày 2 tháng 9 năm 2008</translation>
 <translation id="8360452361555133173">Bật hiển thị trang chào mừng vào lần khởi chạy trình duyệt đầu tiên sau khi nâng cấp hệ điều hành.
 
       Nếu chính sách này được đặt thành true hoặc không được định cấu hình, trình duyệt sẽ hiển thị lại trang chào mừng vào lần khởi chạy đầu tiên sau khi nâng cấp hệ điều hành.
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index 5b88909..7402bf38 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="zh-CN">
 <translation id="101438888985615157">将屏幕旋转 180 度</translation>
-<translation id="1015272884520659144">定义可从其内核驱动程序分离以便直接通过网络应用内的 chrome.usb API 使用的 USB 设备列表。列表中的条目是成对的用于标识特定硬件的 USB 供应商标识符和产品标识符。
-
-      如果此政策未配置,系统会将分离式 USB 设备列表视为空白。</translation>
 <translation id="1017967144265860778">登录屏幕的电源管理设置</translation>
 <translation id="1019101089073227242">设置用户数据目录</translation>
 <translation id="1022361784792428773">应禁止用户安装的扩展程序的 ID(或者用“*”表示禁止安装所有扩展程序)</translation>
@@ -63,7 +60,6 @@
       如果此政策未设置或设为 false,系统将不会在 TLS 中启用 RC4 加密套件。您也可以将此政策设为 true,以便与过时的服务器保持兼容。但这只是一种权宜之计,对服务器进行重新配置才是正确之道。</translation>
 <translation id="1297182715641689552">使用 .pac 代理脚本</translation>
 <translation id="1304973015437969093">要静默安装的扩展程序/应用的 ID 和更新网址</translation>
-<translation id="1310699457130669094">您可以在此指定代理 .pac 文件的网址。只有当您在“选择如何指定代理服务器设置”中选择了手动代理设置后,此政策才会生效。如果您选择了其他任何模式来设置代理政策,就不应设置此政策。要查看详细示例,请访问:<ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">指定系统在屏幕变暗或屏幕关闭不久后察觉到用户活动时,对屏幕变暗延迟时间的调整幅度(百分比)。
 
           如果设置此政策,则会指定系统在屏幕变暗或屏幕关闭后不久察觉到用户活动时,对屏幕变暗延迟时间的调整幅度(百分比)。屏幕变暗延迟时间调整后,系统会调整屏幕关闭、锁定和待机的延迟时间,使其与屏幕变暗延迟时间之间的差值与原有配置下的差值相同。
@@ -137,18 +133,6 @@
 <translation id="1561424797596341174">覆盖与远程访问主机的调试版本号相关的政策</translation>
 <translation id="1583248206450240930">默认情况下使用“<ph name="PRODUCT_FRAME_NAME" />”</translation>
 <translation id="1608755754295374538">无需提示用户即可使用音频捕获设备的网址</translation>
-<translation id="1613574633990410986">可让您指定 <ph name="PRODUCT_NAME" /> 和 ARC 应用使用的代理服务器,并禁止用户更改代理设置。
-
-      如果您选择永不使用代理服务器,并且一律直接连接,则系统会忽略其他所有选项。
-
-      如果您选择自动检测代理服务器,则系统也会忽略其他所有选项。
-
-      要查看详细示例,请访问以下网址:
-      <ph name="PROXY_HELP_URL" />
-
-      如果您启用此设置,则 <ph name="PRODUCT_NAME" /> 和 ARC 应用会忽略通过命令行指定的所有代理相关选项。
-
-      如果未设置这些政策,则用户可以自行选择代理设置。</translation>
 <translation id="1617235075406854669">允许删除浏览器历史记录和下载记录</translation>
 <translation id="1617384279878333801">允许通过个人资料管理器添加用户</translation>
 <translation id="1655229863189977773">设置磁盘缓存大小(字节)</translation>
@@ -229,7 +213,6 @@
       如果已启用,当会话处于活动状态且屏幕未处于锁定状态时,系统任务栏中会显示大型红色退出按钮。
 
       如果已停用或未指定,系统任务栏中不会显示任何大型红色退出按钮。</translation>
-<translation id="1942957375738056236">您可以在此指定代理服务器的网址。只有当您在“选择如何指定代理服务器设置”中选择了手动代理设置后,此政策才会生效。如果您选择了其他任何模式来设置代理政策,就不应设置此政策。要查看更多选项和详细示例,请访问:<ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">指定<ph name="PRODUCT_OS_NAME" />中登录屏幕的电源管理设置。
 
       此政策可让您指定在系统显示登录屏幕时用户停止操作一定时间后<ph name="PRODUCT_OS_NAME" />的行为。此政策能够控制多个设置。有关各个设置的语义和值范围,请参见控制会话内电源管理的相应政策。此政策与这些政策之间仅存在以下差异:
@@ -583,24 +566,6 @@
 <translation id="3072847235228302527">为设备本地帐户设置服务条款</translation>
 <translation id="3096595567015595053">已启用插件的列表</translation>
 <translation id="3101501961102569744">选择如何指定代理服务器设置</translation>
-<translation id="3125884964575432854">可让您指定 <ph name="PRODUCT_NAME" /> 和 ARC 应用使用的代理服务器,并禁止用户更改代理设置。
-
-          如果您选择永不使用代理服务器,并且一律直接连接,则系统会忽略其他所有选项。
-
-          如果您选择使用系统代理设置,则系统会忽略所有其他选项。
-
-          如果您选择自动检测代理服务器,则系统会忽略所有其他选项。
-
-          如果您选择固定服务器代理模式,则可进一步指定“代理服务器的地址或网址”以及“代理绕过规则的逗号分隔列表”中的选项。ARC 应用将仅使用优先级最高的 HTTP 代理服务器。
-
-          如果您选择使用 .pac 代理脚本,则必须在“代理 .pac 文件的网址”中指定该脚本的网址。
-
-          要查看详细示例,请访问以下网址:
-          <ph name="PROXY_HELP_URL" />
-
-          如果您启用此设置,则 <ph name="PRODUCT_NAME" /> 和 ARC 应用会忽略通过命令行指定的所有代理相关选项。
-
-          如果未设置此政策,用户则可以自行选择代理设置。</translation>
 <translation id="3153348162326497318">可让您指定哪些扩展程序是用户无法安装的。已安装的扩展程序如果列入黑名单,就会遭到删除。黑名单中的“*”值表示:除了在白名单中明确列出的扩展程序,其他所有扩展程序均列入黑名单。如果未设置此政策,用户就可以在 <ph name="PRODUCT_NAME" />中安装任何扩展程序。</translation>
 <translation id="316778957754360075">此设置从 <ph name="PRODUCT_NAME" />版本 29 起开始弃用。我们建议您将托管 CRX 软件包的网站包含在 ExtensionInstallSources 中,然后将上述软件包的直接下载链接放在某网页上,从而建立一个由企业托管的扩展程序/应用包。相关网页的启动器可使用 ExtensionInstallForcelist 政策创建。</translation>
 <translation id="3185009703220253572">从版本 <ph name="SINCE_VERSION" /> 开始</translation>
@@ -665,6 +630,7 @@
       如果已启用或未配置此设置,用户就可以用自己的 Google 帐户进行身份验证,从而启用云打印代理。
 
       如果已停用此设置,用户将无法启用代理,该计算机也就无法与 <ph name="CLOUD_PRINT_NAME" />共享其打印机。</translation>
+<translation id="3297010562646015826">允许在任务管理器中结束进程</translation>
 <translation id="3322771899429619102">可让您设置一个网址格式列表,以便指定哪些网站可以使用密钥生成功能。对于同时还包含在“KeygenBlockedForUrls”中的网址格式,系统将应用“KeygenBlockedForUrls”政策而忽略此政策。
 
           如果此政策未设置,系统将根据“DefaultKeygenSetting”政策(如果此政策已设置)或用户的个人配置为所有网站使用全局默认值。</translation>
@@ -826,22 +792,6 @@
           如果此政策设为“在会话期间保留 Cookie”,系统将在会话结束后清除 Cookie。请注意,如果 <ph name="PRODUCT_NAME" /> 以“后台模式”运行,那么在最后一个窗口关闭后,会话可能不会结束。如需关于配置此行为的更多信息,请参见“BackgroundModeEnabled”政策。
 
           如果此政策未设置,系统将使用“AllowCookies”,并且用户可以更改此政策。</translation>
-<translation id="4098957623809244159">此政策已弃用,请改用 ProxyMode。
-
-          可让您指定 <ph name="PRODUCT_NAME" /> 和 ARC 应用使用的代理服务器,并禁止用户更改代理设置。
-
-          如果您选择永不使用代理服务器,并且一律直接连接,则系统会忽略其他所有选项。
-
-          如果您选择使用系统代理设置或自动检测代理服务器,则系统也会忽略其他所有选项。
-
-          如果您选择手动代理设置,则可以进一步指定“代理服务器的地址或网址”、“代理 .pac 文件的网址”和“代理绕过规则的逗号分隔列表”中的选项。
-
-          要查看详细示例,请访问以下网址:
-          <ph name="PROXY_HELP_URL" />
-
-          如果您启用此设置,则 <ph name="PRODUCT_NAME" /> 会忽略通过命令行指定的所有代理相关选项。
-
-          如果未设置此政策,用户则可以自行选择代理设置。</translation>
 <translation id="4103289232974211388">用户确认后重定向至 SAML IdP</translation>
 <translation id="410478022164847452">指定在使用交流电源供电时用户停止输入后隔多久才采取闲置操作。
 
@@ -1267,14 +1217,6 @@
 <translation id="5893553533827140852">如果启用此设置,系统将通过远程主机连接经由代理处理gnubby身份验证请求。
 
           如果您已停用或未配置此设置,那么系统将不会经由代理处理gnubby身份验证请求。</translation>
-<translation id="5900959132054596599"><ph name="PRODUCT_NAME" /> 和 ARC 应用将针对此处给定的主机列表绕过任何代理。
-
-          只有当您在“选择如何指定代理服务器设置”中选择手动代理设置后,此政策才会生效。
-
-          如果您选择了任何其他代理政策设置模式,请勿设置此政策。
-
-          要查看更多详细示例,请访问以下网址:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">允许通过 HTTP 自动更新下载内容</translation>
 <translation id="5921888683953999946">设置登录屏幕上大号光标辅助功能的默认状态。
 
@@ -1755,9 +1697,6 @@
 <translation id="7632724434767231364">GSSAPI 库名称</translation>
 <translation id="7635471475589566552">在 <ph name="PRODUCT_NAME" />中配置应用的语言区域,并禁止用户更改语言区域。如果您启用了此设置,<ph name="PRODUCT_NAME" />就会使用指定的语言区域。如果配置的语言区域不受支持,就会改用“en-US”。如果已停用或未配置此设置,<ph name="PRODUCT_NAME" />就会使用由用户指定的首选语言区域(如果已配置)、系统语言区域或备用语言区域“en-US”。</translation>
 <translation id="7651739109954974365">确定是否应为设备启用数据漫游。如果将此政策设置为 true,数据漫游就可以使用。如果未配置此政策或将其设置为 false,数据漫游就无法使用。</translation>
-<translation id="7667184304362487902">配置 <ph name="PRODUCT_NAME" /> 和 ARC 应用的代理设置。
-
-      此政策尚无法使用,因此请勿使用此政策。</translation>
 <translation id="76810863974142048">远程访问客户端获取身份验证令牌的网址。
 
           如果此政策已设置,远程访问主机将要求身份验证客户端从该网址获取身份验证令牌,以便建立连接。此政策必须与 RemoteAccessHostTokenValidationUrl 结合使用。
@@ -1966,6 +1905,7 @@
 
       应以毫秒为单位指定此政策的值。</translation>
 <translation id="8344454543174932833">首次运行时,从默认浏览器导入书签</translation>
+<translation id="8359734107661430198">启用 ExampleDeprecatedFeature API(直到 2008 年 9 月 2 日)</translation>
 <translation id="8360452361555133173">在操作系统升级后,允许该浏览器首次启动时显示欢迎页面。
 
       如果此政策设为 true 或未配置,在操作系统升级后,该浏览器首次启动时将重新显示欢迎页面。
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index 92c3458..f83f6cb 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -2,9 +2,6 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="zh-TW">
 <translation id="101438888985615157">將畫面旋轉 180 度</translation>
-<translation id="1015272884520659144">定義可從核心驅動程式卸離的 USB 裝置 (以便直接在網路應用程式中透過 chrome.usb API 使用) 清單。清單中的項目必須是一組 USB 供應商識別碼和產品識別碼,用於識別特定硬體。
-
-      如果未設定這項政策,系統會認定卸離式 USB 裝置清單中沒有任何項目。</translation>
 <translation id="1017967144265860778">位於登入畫面中的電源管理設定</translation>
 <translation id="1019101089073227242">設定使用者資料目錄</translation>
 <translation id="1022361784792428773">使用者應避免安裝的擴充功能 ID (使用星號 (*) 排除所有擴充功能)</translation>
@@ -65,7 +62,6 @@
       如果未設定這項政策或將其設為 False,系統就不會在 TLS 中啟用 RC4 加密套件。您也可以將這項政策設為 True,以保持與過舊伺服器的相容性。這種方法是權宜之計,伺服器應重新設定,才是正確的做法。</translation>
 <translation id="1297182715641689552">使用 .pac Proxy 指令碼</translation>
 <translation id="1304973015437969093">自動在背景中安裝的擴充功能/應用程式 ID 和更新網址</translation>
-<translation id="1310699457130669094">您可以在這裡為 Proxy .pac 檔案指定網址。只有當您在「選擇如何指定 Proxy 伺服器設定」中選取手動 Proxy 設定,這項政策才會生效。如果您已選取任何其他模式來設定 Proxy 政策,則不需設定這項政策。如需詳細範例,請造訪:<ph name="PROXY_HELP_URL" /></translation>
 <translation id="1313457536529613143">指定裝置在螢幕變暗時或螢幕關閉後不久偵測到使用者活動時的調暗延遲時間延長百分比。
 
           如果您設定這項政策,表示裝置會在螢幕變暗時或螢幕關閉後不久偵測到使用者活動時,根據指定的百分比延長調暗延遲時間。如果延遲時間延長,關閉螢幕、鎖定螢幕和閒置狀態的延遲時間也會隨之調整,以維持原本所設定的相同時間比例。
@@ -146,18 +142,6 @@
 <translation id="1561424797596341174">針對遠端存取主機的偵錯版本覆寫政策</translation>
 <translation id="1583248206450240930">根據預設使用 <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="1608755754295374538">系統會直接授權存取音訊擷取裝置而不需提示的網址</translation>
-<translation id="1613574633990410986">允許您指定 <ph name="PRODUCT_NAME" /> 和 ARC 應用程式使用的 Proxy 伺服器,並禁止使用者變更 Proxy 設定。
-
-      如果您決定完全不使用 Proxy 伺服器,一律採用直接連線,系統會忽略其他所有選項。
-
-      如果您選擇自動偵測 Proxy 伺服器,系統也會忽略其他所有選項。
-
-      如需參考具體的設定範例,請造訪以下網址:
-      <ph name="PROXY_HELP_URL" />
-
-      如果您啟用這項設定,<ph name="PRODUCT_NAME" /> 和 ARC 應用程式會忽略所有從命令列指定的 Proxy 相關選項。
-
-      如果不設定這些政策,使用者即可自行選擇 Proxy 設定。</translation>
 <translation id="1617235075406854669">啟用刪除瀏覽器和下載紀錄</translation>
 <translation id="1617384279878333801">允許在設定檔管理員中新增使用者</translation>
 <translation id="1655229863189977773">設定磁碟快取大小 (以位元組為單位)</translation>
@@ -242,7 +226,6 @@
       如果您啟用這項設定,當工作階段啟動且螢幕未鎖定時,系統列就會顯示紅色的大型登出按鈕。
 
       如果您停用或未指定這項設定,系統列就不會顯示紅色的大型登出按鈕。</translation>
-<translation id="1942957375738056236">您可以在這裡指定 Proxy 伺服器的網址。只有當您在「選擇如何指定 Proxy 伺服器設定」中選取手動 Proxy 設定時,這項政策才會生效。如果您已選取任何其他模式來設定 Proxy 政策,則不需設定這項政策。如需更多選項或詳例,請造訪:<ph name="PROXY_HELP_URL" /></translation>
 <translation id="1956493342242507974">設置 <ph name="PRODUCT_OS_NAME" /> 登入畫面的電源管理設定。
 
       這項政策可讓您設定當 <ph name="PRODUCT_OS_NAME" /> 停留在登入畫面,並且一段時間沒有使用者活動時,系統應該採取哪些動作。這項政策可控管多項設定,如要瞭解個別設定的語義和數值範圍,請參閱控管工作階段電源管理的相應政策。這些政策不能指定的只有以下兩點:
@@ -602,24 +585,6 @@
 <translation id="3072847235228302527">為裝置本機帳戶設定《服務條款》</translation>
 <translation id="3096595567015595053">啟用的外掛程式清單</translation>
 <translation id="3101501961102569744">選擇如何指定 Proxy 伺服器設定</translation>
-<translation id="3125884964575432854">允許您指定 <ph name="PRODUCT_NAME" /> 和 ARC 應用程式使用的 Proxy 伺服器,並禁止使用者變更 Proxy 設定。
-
-          如果您決定完全不使用 Proxy 伺服器,一律採用直接連線,系統會忽略其他所有選項。
-
-          如果您選擇使用系統 Proxy 設定,系統會忽略其他所有選項。
-
-          如果您選擇自動偵測 Proxy 伺服器,系統也會忽略其他所有選項。
-
-          如果您選擇固定的伺服器 Proxy 模式,可進一步指定「Proxy 伺服器位址或網址」和「以逗號分隔的 Proxy 略過規則清單」中的選項。ARC 僅會使用優先程度最高的 HTTP Proxy 伺服器。
-
-          如果您選擇使用 .pac Proxy 指令碼,則必須在「Proxy .pac 檔案網址」中指定指令碼網址。
-
-          如需參考具體的設定範例,請造訪以下網址:
-          <ph name="PROXY_HELP_URL" />
-
-          如果您啟用這項設定,<ph name="PRODUCT_NAME" /> 和 ARC 應用程式會忽略所有從命令列指定的 Proxy 相關選項。
-
-          如果不設定這項政策,使用者即可自行選擇 Proxy 設定。</translation>
 <translation id="3153348162326497318">允許您指定使用者不得安裝的擴充功能。如果已安裝的擴充功能在黑名單中,就會遭到移除。星號「*」代表排除所有的擴充功能,除非您特別將部分擴充功能列入許可清單。如果未設定這項政策,使用者即可在「<ph name="PRODUCT_NAME" />」中安裝任何擴充功能。</translation>
 <translation id="316778957754360075">我們已於 <ph name="PRODUCT_NAME" /> 版本 29 移除這項設定。如要設定機構代管的擴充功能/應用程式集合,建議您將代管 CRX 封裝檔的網站加入 ExtensionInstallSources 中,並在網頁上提供該封裝檔的直接下載連結。您可以透過 ExtensionInstallForcelist 政策建立該網頁專用的啟動器。</translation>
 <translation id="3185009703220253572">自第 <ph name="SINCE_VERSION" /> 版起</translation>
@@ -684,6 +649,7 @@
       不論這項政策處於啟用或未設定的狀態,使用者都可以透過 Google 帳戶驗證來啟用雲端列印 Proxy。
 
       如果您停用這項設定,使用者就無法啟用 Proxy,而且本機不得與 <ph name="CLOUD_PRINT_NAME" /> 共用自己的印表機。</translation>
+<translation id="3297010562646015826">允許在工作管理員中結束處理程序</translation>
 <translation id="3322771899429619102">允許您設定網址模式清單,指定可以使用金鑰產生功能的網站。如果網址模式為「KeygenBlockedForUrls」,則會覆寫這類例外狀況。
 
           如果未設定這項政策,系統會根據「DefaultKeygenSetting」政策 (如果有設定的話) 或使用者的個人設定,將通用預設值套用到所有網站。</translation>
@@ -854,22 +820,6 @@
           如果將這項政策設為 [在工作階段期間保留 Cookie],系統會在工作階段結束時清除 Cookie。請注意,如果 <ph name="PRODUCT_NAME" /> 是在「背景模式」中執行,工作階段可能不會在最後一個視窗關閉時結束。如需深入瞭解如何設定這項行為,請參閱「BackgroundModeEnabled」政策。
 
           如未設定這項政策,系統會使用「AllowCookies」,使用者之後可以自行變更這項設定。</translation>
-<translation id="4098957623809244159">這項政策已淘汰,請改用 ProxyMode。
-
-          允許您指定 <ph name="PRODUCT_NAME" /> 和 ARC 應用程式使用的 Proxy 伺服器,並禁止使用者變更 Proxy 設定。
-
-          如果您決定完全不使用 Proxy 伺服器,一律採用直接連線,系統會忽略其他所有選項。
-
-          如果您選擇使用系統 Proxy 設定或自動偵測 Proxy 伺服器,系統也會忽略其他所有選項。
-
-          如果您選擇手動 Proxy 設定,可進一步指定「Proxy 伺服器位址或網址」、「Proxy .pac 檔案網址」和「以逗號分隔的 Proxy 略過規則清單」中的選項。
-
-          如需參考具體的設定範例,請造訪以下網址:
-          <ph name="PROXY_HELP_URL" />
-
-          如果您啟用這項設定,<ph name="PRODUCT_NAME" /> 會忽略所有從命令列指定的 Proxy 相關選項。
-
-          如果不設定這項政策,使用者即可自行選擇 Proxy 設定。</translation>
 <translation id="4103289232974211388">經使用者確認後重新導向 SAML IdP</translation>
 <translation id="410478022164847452">指定時間長度,如果系統在 AC 供電環境下執行且未偵測到使用者輸入行為,就會在這段時間過後採取動作。
 
@@ -1295,14 +1245,6 @@
 <translation id="5893553533827140852">啟用這項設定時,系統將透過遠端主機連線以 Proxy 處理 gnubby 驗證要求。
 
           如果停用或不設定這項設定,系統將不會以 Proxy 處理 gnubby 驗證要求。</translation>
-<translation id="5900959132054596599">如果在這裡提供的主機清單有任何 Proxy,<ph name="PRODUCT_NAME" /> 和 ARC 應用程式一律會略過。
-
-          您必須在「選擇如何指定 Proxy 伺服器設定」選取手動 Proxy 設定,這項政策才會生效。
-
-          如果您選取了任何其他 Proxy 政策設定模式,則請勿設定這項政策。
-
-          如需參考更具體的設定範例,請造訪以下網址:
-          <ph name="PROXY_HELP_URL" /></translation>
 <translation id="5921713479449475707">允許透過 HTTP 自動更新下載</translation>
 <translation id="5921888683953999946">設定大型游標協助功能在登入畫面的預設狀態。
 
@@ -1784,9 +1726,6 @@
 <translation id="7632724434767231364">GSSAPI 資料庫名稱</translation>
 <translation id="7635471475589566552">設定「<ph name="PRODUCT_NAME" />」的應用程式語言代碼,並且禁止使用者變更語言代碼。如果您啟用這項設定,「<ph name="PRODUCT_NAME" />」就會使用指定的語言代碼。如果設定的語言代碼不受支援,就會改用「en-US」。如果停用或尚未調整這項設定,「<ph name="PRODUCT_NAME" />」就會使用使用者指定的偏好語言代碼 (如果已設定)、系統語言代碼或備用語言代碼「en-US」。</translation>
 <translation id="7651739109954974365">決定是否要為裝置啟用數據漫遊。如果設為 True,就會允許數據漫遊。如未設定或設為 False,就不支援數據漫遊。</translation>
-<translation id="7667184304362487902">指定 <ph name="PRODUCT_NAME" /> 和 ARC 應用程式的 Proxy 設定。
-
-      這項政策尚未開放使用,請勿使用。</translation>
 <translation id="76810863974142048">遠端存取用戶端取得驗證憑證的來源網址。
 
           如果設定這項政策,遠端存取主機會要求驗證用戶端透過這個網址取得驗證憑證,才能建立連線 (必須和 RemoteAccessHostTokenValidationUrl 配合使用)。
@@ -1998,6 +1937,7 @@
 
       應以毫秒數指定政策值。</translation>
 <translation id="8344454543174932833">第一次執行時從預設瀏覽器匯入書籤</translation>
+<translation id="8359734107661430198">從 2008 年 9 月 2 日開始啟用 ExampleDeprecatedFeature API</translation>
 <translation id="8360452361555133173">允許在作業系統升級後,瀏覽器首次啟動時顯示歡迎網頁。
 
       如果這項政策設為 True 或未設定,瀏覽器會在作業系統升級後首次啟動時重新顯示歡迎網頁。
diff --git a/components/resource_provider/android/android_hooks.cc b/components/resource_provider/android/android_hooks.cc
index 4cf2687..b312e1af 100644
--- a/components/resource_provider/android/android_hooks.cc
+++ b/components/resource_provider/android/android_hooks.cc
@@ -46,7 +46,6 @@
 extern "C" JNI_EXPORT void InitApplicationContext(
     const base::android::JavaRef<jobject>& context) {
   JNIEnv* env = base::android::AttachCurrentThread();
-  base::android::InitApplicationContext(env, context);
   resource_provider::Java_Main_init(
       env, base::android::GetApplicationContext());
 }
diff --git a/components/resource_provider/android/java/org/chromium/resource_provider/Main.java b/components/resource_provider/android/java/org/chromium/resource_provider/Main.java
index 6395262..a65e6917 100644
--- a/components/resource_provider/android/java/org/chromium/resource_provider/Main.java
+++ b/components/resource_provider/android/java/org/chromium/resource_provider/Main.java
@@ -6,6 +6,7 @@
 
 import android.content.Context;
 
+import org.chromium.base.ContextUtils;
 import org.chromium.base.PathUtils;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
@@ -22,6 +23,7 @@
     @SuppressWarnings("unused")
     @CalledByNative
     private static void init(Context context) {
+        ContextUtils.initApplicationContext(context.getApplicationContext());
         PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX, context);
     }
 }
diff --git a/components/safe_browsing_db.gypi b/components/safe_browsing_db.gypi
index 932f2e1..f6cab217 100644
--- a/components/safe_browsing_db.gypi
+++ b/components/safe_browsing_db.gypi
@@ -24,14 +24,10 @@
         'safe_browsing_db/prefix_set.cc',
         'safe_browsing_db/util.h',
         'safe_browsing_db/util.cc',
-        'safe_browsing_db/v4_local_database_manager.h',
-        'safe_browsing_db/v4_local_database_manager.cc',
         'safe_browsing_db/v4_protocol_manager_util.h',
         'safe_browsing_db/v4_protocol_manager_util.cc',
         'safe_browsing_db/v4_get_hash_protocol_manager.h',
         'safe_browsing_db/v4_get_hash_protocol_manager.cc',
-        'safe_browsing_db/v4_update_protocol_manager.h',
-        'safe_browsing_db/v4_update_protocol_manager.cc',
       ],
       'include_dirs': [
         '..',
@@ -45,8 +41,13 @@
       'type': 'static_library',
       'dependencies': [
         ':safe_browsing_db_shared',
+        ':safebrowsing_proto',
       ],
       'sources': [
+        'safe_browsing_db/v4_local_database_manager.h',
+        'safe_browsing_db/v4_local_database_manager.cc',
+        'safe_browsing_db/v4_update_protocol_manager.h',
+        'safe_browsing_db/v4_update_protocol_manager.cc',
       ],
       'include_dirs': [
         '..',
diff --git a/components/safe_browsing_db/BUILD.gn b/components/safe_browsing_db/BUILD.gn
index 4f91591..d36c5e5 100644
--- a/components/safe_browsing_db/BUILD.gn
+++ b/components/safe_browsing_db/BUILD.gn
@@ -30,6 +30,7 @@
 group("safe_browsing_db") {
   deps = [
     ":safe_browsing_db_shared",
+    ":v4_local_database_manager",
     ":v4_update_protocol_manager",
   ]
 }
@@ -179,6 +180,7 @@
   deps = [
     ":database_manager",
     ":hit_report",
+    ":proto",
     ":v4_protocol_manager_util",
     ":v4_update_protocol_manager",
     "//base",
diff --git a/components/safe_browsing_db/database_manager_unittest.cc b/components/safe_browsing_db/database_manager_unittest.cc
index 8abd111f..db8fd9c 100644
--- a/components/safe_browsing_db/database_manager_unittest.cc
+++ b/components/safe_browsing_db/database_manager_unittest.cc
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
@@ -117,8 +118,8 @@
 class SafeBrowsingDatabaseManagerTest : public testing::Test {
  protected:
   void SetUp() override {
-    TestV4GetHashProtocolManagerFactory get_hash_pm_factory;
-    V4GetHashProtocolManager::RegisterFactory(&get_hash_pm_factory);
+    V4GetHashProtocolManager::RegisterFactory(
+        base::WrapUnique(new TestV4GetHashProtocolManagerFactory()));
 
     db_manager_ = new TestSafeBrowsingDatabaseManager();
     db_manager_->StartOnIOThread(NULL, V4ProtocolConfig());
@@ -127,6 +128,7 @@
   void TearDown() override {
     base::RunLoop().RunUntilIdle();
     db_manager_->StopOnIOThread(false);
+    V4GetHashProtocolManager::RegisterFactory(nullptr);
   }
 
   scoped_refptr<SafeBrowsingDatabaseManager> db_manager_;
diff --git a/components/safe_browsing_db/v4_get_hash_protocol_manager.cc b/components/safe_browsing_db/v4_get_hash_protocol_manager.cc
index 2f050a72..6131566 100644
--- a/components/safe_browsing_db/v4_get_hash_protocol_manager.cc
+++ b/components/safe_browsing_db/v4_get_hash_protocol_manager.cc
@@ -122,6 +122,14 @@
   hash_requests_.clear();
 }
 
+// static
+void V4GetHashProtocolManager::RegisterFactory(
+    std::unique_ptr<V4GetHashProtocolManagerFactory> factory) {
+  if (factory_)
+    delete factory_;
+  factory_ = factory.release();
+}
+
 std::string V4GetHashProtocolManager::GetHashRequest(
     const std::vector<SBPrefix>& prefixes,
     const std::vector<PlatformType>& platforms,
diff --git a/components/safe_browsing_db/v4_get_hash_protocol_manager.h b/components/safe_browsing_db/v4_get_hash_protocol_manager.h
index 72f01e01..85fb177 100644
--- a/components/safe_browsing_db/v4_get_hash_protocol_manager.h
+++ b/components/safe_browsing_db/v4_get_hash_protocol_manager.h
@@ -52,9 +52,8 @@
 
   // Makes the passed |factory| the factory used to instantiate
   // a V4GetHashProtocolManager. Useful for tests.
-  static void RegisterFactory(V4GetHashProtocolManagerFactory* factory) {
-    factory_ = factory;
-  }
+  static void RegisterFactory(
+      std::unique_ptr<V4GetHashProtocolManagerFactory> factory);
 
   // Create an instance of the safe browsing v4 protocol manager.
   static V4GetHashProtocolManager* Create(
diff --git a/components/safe_browsing_db/v4_local_database_manager.cc b/components/safe_browsing_db/v4_local_database_manager.cc
index bc6c2c5d..376d26ed 100644
--- a/components/safe_browsing_db/v4_local_database_manager.cc
+++ b/components/safe_browsing_db/v4_local_database_manager.cc
@@ -6,6 +6,7 @@
 
 #include <vector>
 
+#include "components/safe_browsing_db/safebrowsing.pb.h"
 #include "content/public/browser/browser_thread.h"
 
 using content::BrowserThread;
@@ -138,10 +139,24 @@
 void V4LocalDatabaseManager::StartOnIOThread(
     net::URLRequestContextGetter* request_context_getter,
     const V4ProtocolConfig& config) {
-  // TODO(vakh): Implement this skeleton.
-  VLOG(1) << "V4LocalDatabaseManager starting";
   SafeBrowsingDatabaseManager::StartOnIOThread(request_context_getter, config);
 
+#if defined(OS_WIN) || defined (OS_LINUX) || defined (OS_MACOSX)
+  // TODO(vakh): Remove this if/endif block when the V4Database is implemented.
+  // Filed as http://crbug.com/608075
+  UpdateListIdentifier update_list_identifier;
+#if defined(OS_WIN)
+  update_list_identifier.platform_type = WINDOWS_PLATFORM;
+#elif defined (OS_LINUX)
+  update_list_identifier.platform_type = LINUX_PLATFORM;
+#else
+  update_list_identifier.platform_type = OSX_PLATFORM;
+#endif
+  update_list_identifier.threat_entry_type = URL_EXPRESSION;
+  update_list_identifier.threat_type = MALWARE_THREAT;
+  current_list_states_[update_list_identifier] = "";
+#endif
+
   V4UpdateCallback callback = base::Bind(
       &V4LocalDatabaseManager::UpdateRequestCompleted, base::Unretained(this));
   v4_update_protocol_manager_ = V4UpdateProtocolManager::Create(
@@ -152,7 +167,6 @@
 
 void V4LocalDatabaseManager::StopOnIOThread(bool shutdown) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DVLOG(1) << "V4LocalDatabaseManager stopping";
 
   // Delete the V4UpdateProtocolManager.
   // This cancels any in-flight update request.
diff --git a/components/safe_browsing_db/v4_update_protocol_manager.cc b/components/safe_browsing_db/v4_update_protocol_manager.cc
index 21305bc..71b4ade0 100644
--- a/components/safe_browsing_db/v4_update_protocol_manager.cc
+++ b/components/safe_browsing_db/v4_update_protocol_manager.cc
@@ -159,6 +159,8 @@
     next = V4ProtocolManagerUtil::GetNextBackOffInterval(
         &update_error_count_, &update_back_off_mult_);
   }
+  DVLOG(1) << "V4UpdateProtocolManager::GetNextUpdateInterval: "
+           << "next_interval: " << next;
   return next;
 }
 
@@ -311,8 +313,11 @@
 
 GURL V4UpdateProtocolManager::GetUpdateUrl(
     const std::string& req_base64) const {
-  return V4ProtocolManagerUtil::GetRequestUrl(req_base64, "encodedUpdates",
-                                              config_);
+  GURL url = V4ProtocolManagerUtil::GetRequestUrl(req_base64, "encodedUpdates",
+                                                  config_);
+  DVLOG(1) << "V4UpdateProtocolManager::GetUpdateUrl: "
+           << "url: " << url;
+  return url;
 }
 
 }  // namespace safe_browsing
diff --git a/components/scheduler/renderer/renderer_scheduler_impl.cc b/components/scheduler/renderer/renderer_scheduler_impl.cc
index f241d7b..3ae79913 100644
--- a/components/scheduler/renderer/renderer_scheduler_impl.cc
+++ b/components/scheduler/renderer/renderer_scheduler_impl.cc
@@ -30,6 +30,9 @@
 const double kTimerTaskEstimationPercentile = 99;
 const int kShortIdlePeriodDurationSampleCount = 10;
 const double kShortIdlePeriodDurationPercentile = 50;
+// Amount of idle time left in a frame (as a ratio of the vsync interval) above
+// which main thread compositing can be considered fast.
+const double kFastCompositingIdleTimeThreshold = .2;
 }  // namespace
 
 RendererSchedulerImpl::RendererSchedulerImpl(
@@ -679,6 +682,14 @@
     MainThreadOnly().current_policy_expiration_time = base::TimeTicks();
   }
 
+  // Avoid prioritizing main thread compositing (e.g., rAF) if it is extremely
+  // slow, because that can cause starvation in other task sources.
+  bool main_thread_compositing_is_fast =
+      MainThreadOnly().idle_time_estimator.GetExpectedIdleDuration(
+          MainThreadOnly().compositor_frame_interval) >
+      MainThreadOnly().compositor_frame_interval *
+          kFastCompositingIdleTimeThreshold;
+
   Policy new_policy;
   ExpensiveTaskPolicy expensive_task_policy = ExpensiveTaskPolicy::RUN;
   switch (use_case) {
@@ -697,7 +708,9 @@
       break;
 
     case UseCase::SYNCHRONIZED_GESTURE:
-      new_policy.compositor_queue_policy.priority = TaskQueue::HIGH_PRIORITY;
+      new_policy.compositor_queue_policy.priority =
+          main_thread_compositing_is_fast ? TaskQueue::HIGH_PRIORITY
+                                          : TaskQueue::NORMAL_PRIORITY;
       if (touchstart_expected_soon) {
         expensive_task_policy = ExpensiveTaskPolicy::BLOCK;
       } else {
@@ -710,7 +723,9 @@
       // things we should be prioritizing, so we don't attempt to block
       // expensive tasks because we don't know whether they were integral to the
       // page's functionality or not.
-      new_policy.compositor_queue_policy.priority = TaskQueue::HIGH_PRIORITY;
+      new_policy.compositor_queue_policy.priority =
+          main_thread_compositing_is_fast ? TaskQueue::HIGH_PRIORITY
+                                          : TaskQueue::NORMAL_PRIORITY;
       break;
 
     case UseCase::TOUCHSTART:
diff --git a/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc b/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc
index 69bdc5c..1a894444 100644
--- a/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc
+++ b/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc
@@ -2808,4 +2808,85 @@
             ForceUpdatePolicyAndGetCurrentUseCase());
 }
 
+TEST_F(RendererSchedulerImplTest, SYNCHRONIZED_GESTURE_CompositingExpensive) {
+  SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START);
+
+  // With the compositor task taking 20ms, there is not enough time to run
+  // other tasks in the same 16ms frame. To avoid starvation, compositing tasks
+  // should therefore not get prioritized.
+  std::vector<std::string> run_order;
+  for (int i = 0; i < 1000; i++)
+    PostTestTasks(&run_order, "T1");
+
+  for (int i = 0; i < 100; i++) {
+    cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create(
+        BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(),
+        base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL);
+    begin_frame_args.on_critical_path = true;
+    scheduler_->WillBeginFrame(begin_frame_args);
+    scheduler_->DidHandleInputEventOnCompositorThread(
+        FakeInputEvent(blink::WebInputEvent::GestureScrollUpdate),
+        RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR);
+
+    simulate_compositor_task_ran_ = false;
+    compositor_task_runner_->PostTask(
+        FROM_HERE,
+        base::Bind(&RendererSchedulerImplTest::SimulateMainThreadCompositorTask,
+                   base::Unretained(this),
+                   base::TimeDelta::FromMilliseconds(20)));
+
+    mock_task_runner_->RunTasksWhile(
+        base::Bind(&RendererSchedulerImplTest::SimulatedCompositorTaskPending,
+                   base::Unretained(this)));
+    EXPECT_EQ(UseCase::SYNCHRONIZED_GESTURE, CurrentUseCase()) << "i = " << i;
+  }
+
+  // Timer tasks should not have been starved by the expensive compositor
+  // tasks.
+  EXPECT_EQ(TaskQueue::NORMAL_PRIORITY,
+            scheduler_->CompositorTaskRunner()->GetQueuePriority());
+  EXPECT_EQ(1000u, run_order.size());
+}
+
+TEST_F(RendererSchedulerImplTest, MAIN_THREAD_GESTURE_CompositingExpensive) {
+  SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START,
+                                 blink::WebInputEvent::GestureScrollBegin);
+
+  // With the compositor task taking 20ms, there is not enough time to run
+  // other tasks in the same 16ms frame. To avoid starvation, compositing tasks
+  // should therefore not get prioritized.
+  std::vector<std::string> run_order;
+  for (int i = 0; i < 1000; i++)
+    PostTestTasks(&run_order, "T1");
+
+  for (int i = 0; i < 100; i++) {
+    cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create(
+        BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(),
+        base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL);
+    begin_frame_args.on_critical_path = true;
+    scheduler_->WillBeginFrame(begin_frame_args);
+    scheduler_->DidHandleInputEventOnCompositorThread(
+        FakeInputEvent(blink::WebInputEvent::GestureScrollUpdate),
+        RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
+
+    simulate_compositor_task_ran_ = false;
+    compositor_task_runner_->PostTask(
+        FROM_HERE,
+        base::Bind(&RendererSchedulerImplTest::SimulateMainThreadCompositorTask,
+                   base::Unretained(this),
+                   base::TimeDelta::FromMilliseconds(20)));
+
+    mock_task_runner_->RunTasksWhile(
+        base::Bind(&RendererSchedulerImplTest::SimulatedCompositorTaskPending,
+                   base::Unretained(this)));
+    EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()) << "i = " << i;
+  }
+
+  // Timer tasks should not have been starved by the expensive compositor
+  // tasks.
+  EXPECT_EQ(TaskQueue::NORMAL_PRIORITY,
+            scheduler_->CompositorTaskRunner()->GetQueuePriority());
+  EXPECT_EQ(1000u, run_order.size());
+}
+
 }  // namespace scheduler
diff --git a/components/sessions/core/session_service_commands.cc b/components/sessions/core/session_service_commands.cc
index 5d3cbf4..ca02f49 100644
--- a/components/sessions/core/session_service_commands.cc
+++ b/components/sessions/core/session_service_commands.cc
@@ -42,6 +42,7 @@
 static const SessionCommand::id_type kCommandSessionStorageAssociated = 19;
 static const SessionCommand::id_type kCommandSetActiveWindow = 20;
 static const SessionCommand::id_type kCommandLastActiveTime = 21;
+static const SessionCommand::id_type kCommandSetWindowWorkspace = 22;
 
 namespace {
 
@@ -580,6 +581,21 @@
         break;
       }
 
+      case kCommandSetWindowWorkspace: {
+        std::unique_ptr<base::Pickle> pickle(command->PayloadAsPickle());
+        base::PickleIterator it(*pickle);
+        const SessionID::id_type* window_id;
+        std::string workspace;
+        if (!it.ReadBytes(reinterpret_cast<const char**>(&window_id),
+                          sizeof(*window_id)) ||
+            !it.ReadString(&workspace)) {
+          DVLOG(1) << "Failed reading command " << command->id();
+          return true;
+        }
+        GetWindow(*window_id, windows)->workspace = workspace;
+        break;
+      }
+
       default:
         // TODO(skuhne): This might call back into a callback handler to extend
         // the command set for specific implementations.
@@ -739,6 +755,18 @@
   return command;
 }
 
+std::unique_ptr<SessionCommand> CreateSetWindowWorkspaceCommand(
+    const SessionID& window_id,
+    const std::string& workspace) {
+  base::Pickle pickle;
+  pickle.WriteBytes(static_cast<const void*>(&window_id), sizeof(window_id));
+  pickle.WriteString(workspace);
+  std::unique_ptr<SessionCommand> command(
+      new SessionCommand(kCommandSetWindowWorkspace, pickle.size()));
+  memcpy(command->contents(), pickle.data(), pickle.size());
+  return command;
+}
+
 std::unique_ptr<SessionCommand> CreateTabNavigationPathPrunedFromBackCommand(
     const SessionID& tab_id,
     int count) {
diff --git a/components/sessions/core/session_service_commands.h b/components/sessions/core/session_service_commands.h
index 9aa22a7..495743f1 100644
--- a/components/sessions/core/session_service_commands.h
+++ b/components/sessions/core/session_service_commands.h
@@ -76,6 +76,10 @@
     const SessionID& tab_id,
     base::TimeTicks last_active_time);
 
+SESSIONS_EXPORT std::unique_ptr<SessionCommand> CreateSetWindowWorkspaceCommand(
+    const SessionID& window_id,
+    const std::string& workspace);
+
 // Searches for a pending command using |base_session_service| that can be
 // replaced with |command|. If one is found, pending command is removed, the
 // command is added to the pending commands (taken ownership) and true is
diff --git a/components/sessions/core/session_types.cc b/components/sessions/core/session_types.cc
index a035a41a..df2ae12 100644
--- a/components/sessions/core/session_types.cc
+++ b/components/sessions/core/session_types.cc
@@ -68,8 +68,7 @@
     : selected_tab_index(-1),
       type(TYPE_TABBED),
       is_constrained(true),
-      show_state(ui::SHOW_STATE_DEFAULT) {
-}
+      show_state(ui::SHOW_STATE_DEFAULT) {}
 
 SessionWindow::~SessionWindow() {
   STLDeleteElements(&tabs);
diff --git a/components/sessions/core/session_types.h b/components/sessions/core/session_types.h
index 5ec30b2..f7de2925 100644
--- a/components/sessions/core/session_types.h
+++ b/components/sessions/core/session_types.h
@@ -140,6 +140,9 @@
   // Bounds of the window.
   gfx::Rect bounds;
 
+  // The workspace in which the window resides.
+  std::string workspace;
+
   // Index of the selected tab in tabs; -1 if no tab is selected. After restore
   // this value is guaranteed to be a valid index into tabs.
   //
diff --git a/components/signin/core/browser/signin_investigator.cc b/components/signin/core/browser/signin_investigator.cc
index 994a936..83961de 100644
--- a/components/signin/core/browser/signin_investigator.cc
+++ b/components/signin/core/browser/signin_investigator.cc
@@ -28,7 +28,7 @@
       current_id_(current_id),
       provider_(provider) {
   DCHECK(!current_email_.empty());
-  DCHECK(!current_id_.empty());
+  DCHECK(provider);
 }
 
 SigninInvestigator::~SigninInvestigator() {}
diff --git a/components/signin/core/browser/signin_investigator_unittest.cc b/components/signin/core/browser/signin_investigator_unittest.cc
index 0f5d25f..c0318651 100644
--- a/components/signin/core/browser/signin_investigator_unittest.cc
+++ b/components/signin/core/browser/signin_investigator_unittest.cc
@@ -42,10 +42,16 @@
                              const std::string& id,
                              bool equals_expectated,
                              AccountEquality histogram_expected) {
-    base::HistogramTester histogram_tester;
     FakeProvider provider(email, id);
     SigninInvestigator investigator(kSameEmail, kSameId, &provider);
-    bool equals_actual = investigator.AreAccountsEqualWithFallback();
+    AssertAccountEquality(&investigator, equals_expectated, histogram_expected);
+  }
+
+  void AssertAccountEquality(SigninInvestigator* investigator,
+                             bool equals_expectated,
+                             AccountEquality histogram_expected) {
+    base::HistogramTester histogram_tester;
+    bool equals_actual = investigator->AreAccountsEqualWithFallback();
     ASSERT_EQ(equals_expectated, equals_actual);
     histogram_tester.ExpectUniqueSample(
         "Signin.AccountEquality", static_cast<int>(histogram_expected), 1);
@@ -93,6 +99,18 @@
                         AccountEquality::EMAIL_FALLBACK);
 }
 
+TEST_F(SigninInvestigatorTest, EqualitySameEmailFallbackEmptyCurrentId) {
+  FakeProvider provider(kSameEmail, kDifferentId);
+  SigninInvestigator investigator(kSameEmail, kEmptyId, &provider);
+  AssertAccountEquality(&investigator, true, AccountEquality::EMAIL_FALLBACK);
+}
+
+TEST_F(SigninInvestigatorTest, EqualityDifferentEmailFallbackEmptyCurrentId) {
+  FakeProvider provider(kDifferentId, kDifferentId);
+  SigninInvestigator investigator(kSameEmail, kEmptyId, &provider);
+  AssertAccountEquality(&investigator, false, AccountEquality::EMAIL_FALLBACK);
+}
+
 TEST_F(SigninInvestigatorTest, InvestigateSameAccount) {
   AssertInvestigatedScenario(kSameEmail, kSameId,
                              InvestigatedScenario::SAME_ACCOUNT);
diff --git a/components/strings/BUILD.gn b/components/strings/BUILD.gn
index fea559f..0847468 100644
--- a/components/strings/BUILD.gn
+++ b/components/strings/BUILD.gn
@@ -49,7 +49,7 @@
     "java/res/values-uk/components_strings.xml",
     "java/res/values-vi/components_strings.xml",
     "java/res/values-zh-rCN/components_strings.xml",
-    "java/res/values-zh-rTW/components_strings.xml",
+    "java/res/values-zh/components_strings.xml",
     "java/res/values/components_strings.xml",
   ]
 }
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb
index 4aa5667..c8a2b87 100644
--- a/components/strings/components_strings_am.xtb
+++ b/components/strings/components_strings_am.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">የመምሪያ መሸጎጫ እሺ</translation>
 <translation id="113188000913989374"><ph name="SITE" /> እንዲህ ይላል፦</translation>
 <translation id="1132774398110320017">የChrome ራስ-ሙላ ቅንብሮች...</translation>
+<translation id="113770840981343808">ለማረጋገጥ በካርድዎ ፊት ላይ ያለውን ባለ4 አኃዝ CVC ያስገቡ</translation>
 <translation id="1146673768181266552">ደምስስ መታወቂያ <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ሊያረጋግጥ አልቻለም፤ የደህንነት እውቅና ማረጋገጫው በኮምፒውተርዎ ስርዓተ ክወና የሚታመን አይደለም። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል።</translation>
 <translation id="1152921474424827756">የ<ph name="URL" /> <ph name="BEGIN_LINK" />የተሸጎጠ ቅጂ<ph name="END_LINK" /> ይድረሱ</translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">መመሪያ አልተገኘም</translation>
 <translation id="2213606439339815911">ግቤቶችን በማምጣት ላይ...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> አልተገኘም</translation>
-<translation id="2227695659599072496">የአውታረ መረብ ገመዱን ወይም ራውተሩን መፈተሽ</translation>
 <translation id="2230458221926704099"><ph name="BEGIN_LINK" />የመመርመሪያ መተግበሪያውን<ph name="END_LINK" /> በመጠቀም ግንኙነትዎን ያስተካክሉት</translation>
 <translation id="225207911366869382">ይህ ዋጋ ለዚህ መመሪያ ተቋርጧል።</translation>
 <translation id="2262243747453050782">የኤች ቲ ቲ ፒ ስህተት</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> የተጠቃሚ ስም እና የይለፍ ቃል ያስፈልገዋል።</translation>
 <translation id="2328300916057834155">ችላ የተባለ የመረጃ ጠቋሚ <ph name="ENTRY_INDEX" /> ልክ ያልሆነ እልባት</translation>
 <translation id="2354001756790975382">ሌላ እልባቶች</translation>
+<translation id="2357783041215512127">በ<ph name="CREDIT_CARD" /> ይክፈሉ</translation>
 <translation id="2359808026110333948">ቀጥል</translation>
 <translation id="2367567093518048410">ደረጃ</translation>
 <translation id="237718015863234333">ምንም የበይነገጽ አማራጮች አይገኙም</translation>
@@ -227,7 +228,6 @@
 <translation id="3254409185687681395">ለእዚህ ገጽ ዕልባት አብጅ</translation>
 <translation id="3270847123878663523">&amp;ዳግም ደርድርን ቀልብስ</translation>
 <translation id="3286538390144397061">አሁን ዳግም አስጀምር</translation>
-<translation id="3288003805934695103">ገጹን እንደገና መጫን</translation>
 <translation id="3305707030755673451">የእርስዎ ውሂብ <ph name="TIME" /> ላይ በእርስዎ የስምረት የይለፍ ቃል ተመስጥሯል። ስምረትን ለመጀመር ያስገቡት።</translation>
 <translation id="333371639341676808">ይህ ገጽ ተጨማሪ ማገናኛዎችን እንዳይፈጥር አግድ።</translation>
 <translation id="3340978935015468852">ቅንብሮች</translation>
@@ -299,7 +299,6 @@
 <translation id="3963721102035795474">የአንባቢ ሁነታ</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> ታግዷል</translation>
 <translation id="4021036232240155012">ዲኤንኤስ የአንድ ድር ጣቢያ ስም ወደ የእሱ የበይነመረብ አድራሻ የሚተረጉም የአውታረ መረብ አገልግሎት ነው።</translation>
-<translation id="4021376465026729077">የእርስዎን ቅጥያዎች ማሰናከል</translation>
 <translation id="4030383055268325496">&amp;አክልን ቀልብስ</translation>
 <translation id="4032534284272647190">የ<ph name="URL" /> መዳረሻ ተከልክሏል።</translation>
 <translation id="404928562651467259">ማስጠንቀቂያ</translation>
@@ -397,7 +396,6 @@
 <translation id="5251803541071282808">ደመና</translation>
 <translation id="5299298092464848405">መምሪያን መተንተን ላይ ስህተት</translation>
 <translation id="5300589172476337783">አሳይ</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />የእርስዎን ኩኪዎች ማጽዳት<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">የብልሽት ሪፖርት ማድረግ ተሰናክሏል።</translation>
 <translation id="5317780077021120954">አስቀምጥ</translation>
 <translation id="5327248766486351172">ስም</translation>
@@ -433,6 +431,7 @@
 <translation id="5629630648637658800">የመምሪያ ቅንብሮችን መጫን አልተሳካም</translation>
 <translation id="5631439013527180824">ልክ ያልሆነ የመሣሪያ አስተዳደር ማስመሰያ</translation>
 <translation id="5650551054760837876">ምንም የፍለጋ ውጤቶች አልተገኙም።</translation>
+<translation id="5663999524854166235">ለማረጋገጥ በካርድዎ ኋላ ላይ ያለውን ባለ3 አኃዝ CVC ያስገቡ</translation>
 <translation id="5677928146339483299">ታግዷል</translation>
 <translation id="5710435578057952990">የዚህ ድረ-ገጽ ማንነት አልተረጋገጠም።</translation>
 <translation id="5720705177508910913">የአሁኑ ተጠቃሚ</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> ፍለጋ</translation>
 <translation id="6634865548447745291"><ph name="BEGIN_LINK" />ይህ የእውቅና ማረጋገጫ ስለተሻረ<ph name="END_LINK" /> <ph name="SITE" />ን መጎብኘት አይችሉም። የአውታረ መረብ ስህተቶች እና ጥቃቶች አብዛኛው ጊዜ ጊዜያዊ ብቻ ናቸው፣ ስለዚህ ይህ ገጽ በኋላ ላይ ሊሰራ ይችላል።</translation>
 <translation id="6637478299472506933">ማውረድ አልተሳካም</translation>
-<translation id="6642894344118208103">ሞደሙን ወይም ራውተሩን ዳግም ማስጀመር</translation>
 <translation id="6644283850729428850">ይህ መመሪያ ተቋርጧል።</translation>
 <translation id="6646897916597483132">በካርድዎ ፊት ላይ ያለውን ባለ4 አኃዝ CVCን ያስገቡ</translation>
 <translation id="6656103420185847513">አቃፊ ያርትዑ</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index 4d4d75c..51f0feb 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">ذاكرة التخزين المؤقت للسياسة بحالة جيدة</translation>
 <translation id="113188000913989374"><ph name="SITE" /> يعرض:</translation>
 <translation id="1132774398110320017">‏إعدادات الملء التلقائي في Chrome...</translation>
+<translation id="113770840981343808">‏أدخل رمز التحقق من البطاقة (CVC) المكون من أربعة أرقام من الجزء الأمامي من بطاقتك للتحقق</translation>
 <translation id="1146673768181266552">معرِّف العطل <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ بل إنه شهادة أمان غير موثقة من خلال نظام تشغيل الكمبيوتر. وربما يكون السبب في ذلك خطأ في التكوين أو مهاجمًا يعترض الاتصال.</translation>
 <translation id="1152921474424827756">الدخول إلى <ph name="BEGIN_LINK" />النسخة المخزنة مؤقتًا<ph name="END_LINK" /> من <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">تعذر العثور على السياسة</translation>
 <translation id="2213606439339815911">جارٍ جلب الإدخالات...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> غير متوفّر</translation>
-<translation id="2227695659599072496">التحقق من كبل الشبكة أو جهاز التوجيه</translation>
 <translation id="2230458221926704099">إصلاح الاتصال باستخدام <ph name="BEGIN_LINK" />تطبيق بيانات التشخيص<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">تم تجاهل القيمة لهذه السياسة.</translation>
 <translation id="2262243747453050782">‏خطأ HTTP</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535">يتطلَّب <ph name="DOMAIN" /> اسم مستخدم وكلمة مرور.</translation>
 <translation id="2328300916057834155">تم تجاهل الإشارة المرجعية غير الصالحة في الفهرس <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">الإشارات الأخرى</translation>
+<translation id="2357783041215512127">الدفع باستخدام <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">المتابعة</translation>
 <translation id="2367567093518048410">المستوى</translation>
 <translation id="237718015863234333">لا توجد بدائل لعناصر واجهة المستخدم</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">وضع إشارة على هذه الصفحة</translation>
 <translation id="3270847123878663523">تراجع عن إعادة الت&amp;رتيب</translation>
 <translation id="3286538390144397061">إعادة التشغيل الآن</translation>
-<translation id="3288003805934695103">إعادة تحميل الصفحة</translation>
 <translation id="3305707030755673451">تم تشفير بياناتك باستخدام عبارة مرور المزامنة في <ph name="TIME" />. أدخلها لبدء المزامنة.</translation>
 <translation id="333371639341676808">منع هذه الصفحة من إنشاء مربّعات حوار إضافية.</translation>
 <translation id="3340978935015468852">الإعدادات</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">وضع القارئ</translation>
 <translation id="3973234410852337861">تم حظر <ph name="HOST_NAME" /></translation>
 <translation id="4021036232240155012">‏يُعد نظام أسماء النطاقات (DNS) هو خدمة الشبكة التي تترجم اسم موقع ويب إلى عنوانه على شبكة الإنترنت.</translation>
-<translation id="4021376465026729077">تعطيل الإضافات</translation>
 <translation id="4030383055268325496">تراجع عن الإ&amp;ضافة</translation>
 <translation id="4032534284272647190">تم رفض الدخول إلى<ph name="URL" />.</translation>
 <translation id="404928562651467259">تحذير</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">السحاب</translation>
 <translation id="5299298092464848405">خطأ في تحليل السياسة</translation>
 <translation id="5300589172476337783">عرض</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />محو ملفات تعريف الارتباط<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">ميزة الإبلاغ عن الأعطال معطلة.</translation>
 <translation id="5317780077021120954">حفظ</translation>
 <translation id="5327248766486351172">الاسم</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">أخفق تحميل إعدادات السياسة</translation>
 <translation id="5631439013527180824">الرمز المميز لإدارة الجهاز غير صالح</translation>
 <translation id="5650551054760837876">لم يتمّ العثور على أي نتائج بحث.</translation>
+<translation id="5663999524854166235">‏أدخل رمز التحقق من البطاقة (CVC) المكون من ثلاثة أرقام من الجزء الخلفي من بطاقتك للتحقق</translation>
 <translation id="5677928146339483299">تم المنع</translation>
 <translation id="5710435578057952990">لم  يتمّ التحقق من هوية هذا الموقع.</translation>
 <translation id="5720705177508910913">المستخدم الحالي</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685">بحث <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">لا يمكنك زيارة <ph name="SITE" /> الآن لأنه <ph name="BEGIN_LINK" />تم إبطال هذه الشهادة<ph name="END_LINK" />. أخطاء الشبكة والهجمات عليها عادةً ما تكون مؤقتة، لذا ستعمل هذه الصفحة لاحقًا على الأرجح.</translation>
 <translation id="6637478299472506933">إخفاق التنزيل</translation>
-<translation id="6642894344118208103">إعادة تعيين المودم أو جهاز التوجيه</translation>
 <translation id="6644283850729428850">تم تجاهل هذه السياسة.</translation>
 <translation id="6646897916597483132">‏أدخل رمز التحقق من البطاقة (CVC) المكون من أربعة أرقام من الجزء الأمامي من بطاقتك</translation>
 <translation id="6656103420185847513">تعديل مجلد</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb
index a9ba40e..350a10c 100644
--- a/components/strings/components_strings_bg.xtb
+++ b/components/strings/components_strings_bg.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Кешът на правилото е в добро състояние</translation>
 <translation id="113188000913989374"><ph name="SITE" /> изпраща подкана:</translation>
 <translation id="1132774398110320017">Настройки за Автоматично попълване в Chrome...</translation>
+<translation id="113770840981343808">За потвърждение въведете четирицифрения код за проверка от лицевата страна на картата си</translation>
 <translation id="1146673768181266552">Идентификатор на срива <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Сървърът не можа да докаже, че е <ph name="DOMAIN" />; операционната система на компютъра ви няма доверие на сертификата му за сигурност. Това може да се дължи на неправилно конфигуриране или на прихващане на връзката ви от атакуващ.</translation>
 <translation id="1152921474424827756">Вижте <ph name="BEGIN_LINK" />кеширано копие<ph name="END_LINK" /> на <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Правилото не е намерено</translation>
 <translation id="2213606439339815911">Записите се извличат...</translation>
 <translation id="2214283295778284209">Няма достъп до <ph name="SITE" /></translation>
-<translation id="2227695659599072496">Проверете мрежовия кабел или маршрутизатора.</translation>
 <translation id="2230458221926704099">Поправете връзката си посредством <ph name="BEGIN_LINK" />приложението за диагностика<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Стойността е оттеглена за това правило.</translation>
 <translation id="2262243747453050782">HTTP грешка</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535">Изискват се потребителско име и парола за <ph name="DOMAIN" />.</translation>
 <translation id="2328300916057834155">Пренебрегната бе невалидна отметка в индекс <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Други отметки</translation>
+<translation id="2357783041215512127">Плащане чрез <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Напред</translation>
 <translation id="2367567093518048410">Ниво</translation>
 <translation id="237718015863234333">Няма алтернативи на потребителския интерфейс</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Запазване на отметка към тази страница</translation>
 <translation id="3270847123878663523">&amp;Отмяна на пренареждането</translation>
 <translation id="3286538390144397061">Рестартиране сега</translation>
-<translation id="3288003805934695103">Презаредете страницата.</translation>
 <translation id="3305707030755673451">На <ph name="TIME" /> данните ви бяха шифровани с пропуска ви за синхронизиране. Въведете го, за да стартирате синхронизирането.</translation>
 <translation id="333371639341676808">Да не се показват допълнителни диалогови прозорци от тази страница.</translation>
 <translation id="3340978935015468852">настройки</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">Режим за четене</translation>
 <translation id="3973234410852337861">Хостът <ph name="HOST_NAME" /> е блокиран</translation>
 <translation id="4021036232240155012">DNS е услугата за мрежи, която преобразува имената на уебсайтовете към техните адреси в интернет.</translation>
-<translation id="4021376465026729077">Деактивирайте разширенията си.</translation>
 <translation id="4030383055268325496">&amp;Отмяна на добавянето</translation>
 <translation id="4032534284272647190">Достъпът до <ph name="URL" /> бе отказан.</translation>
 <translation id="404928562651467259">ПРЕДУПРЕЖДЕНИЕ</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Облак</translation>
 <translation id="5299298092464848405">Грешка при синтактичния анализ на правилото</translation>
 <translation id="5300589172476337783">Показване</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Изчистете „бисквитките“<ph name="END_LINK" />.</translation>
 <translation id="5308689395849655368">Изпращането на сигнали за сривове е деактивирано.</translation>
 <translation id="5317780077021120954">Запазване</translation>
 <translation id="5327248766486351172">Име</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">Зареждането на настройките за правилото не бе успешно</translation>
 <translation id="5631439013527180824">Невалидно означение за управление на устройството</translation>
 <translation id="5650551054760837876">Не са намерени резултати от търсенето.</translation>
+<translation id="5663999524854166235">За потвърждение въведете трицифрения код за проверка от гърба на картата си</translation>
 <translation id="5677928146339483299">Блокирано</translation>
 <translation id="5710435578057952990">Самоличността на този уебсайт не е потвърдена.</translation>
 <translation id="5720705177508910913">Текущият потребител</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685">Търсене с/ъс <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">В момента не можете да посетите <ph name="SITE" />, защото <ph name="BEGIN_LINK" />този сертификат е анулиран<ph name="END_LINK" />. Обикновено грешките в мрежата и атаките срещу нея са временни, така че тази страница вероятно ще работи по-късно.</translation>
 <translation id="6637478299472506933">Неуспешно изтегляне</translation>
-<translation id="6642894344118208103">Рестартирайте модема или маршрутизатора.</translation>
 <translation id="6644283850729428850">Това правило е оттеглено.</translation>
 <translation id="6646897916597483132">Въведете четирицифрения код за проверка от лицевата страна на картата си</translation>
 <translation id="6656103420185847513">Редактиране на папката</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb
index c9514de..45a8d20 100644
--- a/components/strings/components_strings_bn.xtb
+++ b/components/strings/components_strings_bn.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">নীতি ক্যাশেটি ঠিক আছে</translation>
 <translation id="113188000913989374"><ph name="SITE" /> বলছে:</translation>
 <translation id="1132774398110320017">Chrome স্বতঃপূর্ণ সেটিংস...</translation>
+<translation id="113770840981343808">নিশ্চিতকরণের জন্য আপনার কার্ডের সামনে লেখা ৪ সংখ্যার CVC লিখুন</translation>
 <translation id="1146673768181266552">ক্র্যাশ ID <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">এই সার্ভার প্রমাণ করতে পারেনি যে এটি <ph name="DOMAIN" />; এর নিরাপত্তা শংসাপত্রটি আপনার কম্পিউটারের নিকট বিশ্বাসযোগ্য নয়। কোনো ভুল কনফিগারেশনের কারণে অথবা কোনো আক্রমণকারী আপনার সংযোগ মাঝপথে আটকে দিচ্ছে বলে এমনটা হতে পারে।</translation>
 <translation id="1152921474424827756"><ph name="URL" /> এর <ph name="BEGIN_LINK" />ক্যাশে করা অনুলিপি<ph name="END_LINK" /> অ্যাক্সেস করুন</translation>
@@ -119,7 +120,6 @@
 <translation id="2212735316055980242">নীতি পাওয়া যায়নি</translation>
 <translation id="2213606439339815911">এন্ট্রিগুলি আনা হচ্ছে...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> উপলভ্য নয়</translation>
-<translation id="2227695659599072496">নেটওয়ার্কের তার বা রাউটার পরীক্ষা করে দেখুন</translation>
 <translation id="2230458221926704099"><ph name="BEGIN_LINK" />ডায়াগনস্টিক অ্যাপ্লিকেশান<ph name="END_LINK" /> ব্যবহার করে আপনার সংযোগ ঠিক করুন</translation>
 <translation id="225207911366869382">এই মান এই নীতির জন্য অসমর্থিত হয়েছে৷</translation>
 <translation id="2262243747453050782">HTTP ত্রুটি</translation>
@@ -132,6 +132,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> এর জন্য একটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড প্রয়োজন।</translation>
 <translation id="2328300916057834155"><ph name="ENTRY_INDEX" /> সূচিতে অবৈধ বুকমার্ক এড়িয়ে যাওয়া হয়েছে</translation>
 <translation id="2354001756790975382">অন্য বুকমার্কস</translation>
+<translation id="2357783041215512127"><ph name="CREDIT_CARD" /> এর মাধ্যমে অর্থপ্রদান করুন</translation>
 <translation id="2359808026110333948">অবিরত</translation>
 <translation id="2367567093518048410">স্তর</translation>
 <translation id="237718015863234333">কোনো UI বিকল্প উপলব্ধ নেই</translation>
@@ -229,7 +230,6 @@
 <translation id="3254409185687681395">এই পৃষ্ঠাটি বুকমার্ক করুন</translation>
 <translation id="3270847123878663523">&amp;পুনর্বিন্যাসকে পূর্বাবস্থায় ফেরান</translation>
 <translation id="3286538390144397061">এখন পুর্নসূচনা করবেন</translation>
-<translation id="3288003805934695103">পৃষ্ঠাটি পুনরায় লোড করে দেখুন</translation>
 <translation id="3305707030755673451">আপনার ডেটা আপনার সিঙ্ক পাসফ্রেজ দিয়ে <ph name="TIME" /> এ এনক্রিপ্ট করা হয়েছে। সিঙ্ক শুরু করার জন্য এটি লিখুন।</translation>
 <translation id="333371639341676808">এই পৃষ্ঠাটিকে অতিরিক্ত কথোপকথন তৈরি করা থেকে আটকান৷</translation>
 <translation id="3340978935015468852">সেটিংস</translation>
@@ -301,7 +301,6 @@
 <translation id="3963721102035795474">পাঠক মোড</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> অবরুদ্ধ হয়ে রয়েছে</translation>
 <translation id="4021036232240155012">DNS সেই নেটওয়ার্ক পরিষেবা যা কোনো ওয়েবসাইটের নামকে ইন্টারনেট ঠিকানায় রুপান্তরিত করে।</translation>
-<translation id="4021376465026729077">আপনার এক্সটেনশানগুলি অক্ষম করে দেখুন</translation>
 <translation id="4030383055268325496">&amp;যোগ করাকে পূর্বাবস্থায় ফেরান</translation>
 <translation id="4032534284272647190"><ph name="URL" />তে অ্যাক্সেস অস্বীকৃত৷</translation>
 <translation id="404928562651467259">সতর্কতা</translation>
@@ -399,7 +398,6 @@
 <translation id="5251803541071282808">ক্লাউড</translation>
 <translation id="5299298092464848405">নীতি বিশ্লেষণ করার সময় ত্রুটি</translation>
 <translation id="5300589172476337783">দেখান</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />আপনার কুকিজ সাফ করে দেখুন<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">ক্র্যাশ প্রতিবেদন অক্ষম আছে৷</translation>
 <translation id="5317780077021120954">সংরক্ষণ করুন</translation>
 <translation id="5327248766486351172">নাম</translation>
@@ -433,6 +431,7 @@
 <translation id="5629630648637658800">নীতি সেটিংস লোড করতে ব্যর্থ হয়েছে</translation>
 <translation id="5631439013527180824">অবৈধ ডিভাইস পরিচালনা টোকেন</translation>
 <translation id="5650551054760837876">কোনো অনুসন্ধান ফলাফল পাওয়া যায় নি৷</translation>
+<translation id="5663999524854166235">নিশ্চিতকরণের জন্য আপনার কার্ডের পিছনে থাকা ৩ সংখ্যার CVC লিখুন</translation>
 <translation id="5677928146339483299">অবরুদ্ধ</translation>
 <translation id="5710435578057952990">এই ওয়েবসাইটির পরিচয় যাচাই করা হয় নি৷</translation>
 <translation id="5720705177508910913">বর্তমান ব্যবহারকারী</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> অনুসন্ধান</translation>
 <translation id="6634865548447745291">আপনি এখন <ph name="SITE" /> এ যেতে পারবেন না কারণ <ph name="BEGIN_LINK" /> এই শংসাপত্র প্রত্যাহার করা হয়েছে<ph name="END_LINK" />। নেটওয়ার্ক ত্রুটি এবং আক্রমণ সাধারণত সাময়িকভাবে হয়, তাই এই পৃষ্ঠা সম্ভবত পরে কাজ করবে।</translation>
 <translation id="6637478299472506933">ডাউনলোড ব্যর্থ হয়েছে</translation>
-<translation id="6642894344118208103">মডেম বা রাউটার পুনরায় সেট করে দেখুন</translation>
 <translation id="6644283850729428850">এই নীতিটি অসমর্থিত হয়েছে৷</translation>
 <translation id="6646897916597483132">আপনার কার্ডের সামনে থেকে ৪ সংখ্যার CVC লিখুন</translation>
 <translation id="6656103420185847513">ফোল্ডার সম্পাদনা করুন</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb
index 564d6ae5..cf9edfd7 100644
--- a/components/strings/components_strings_ca.xtb
+++ b/components/strings/components_strings_ca.xtb
@@ -18,6 +18,7 @@
 <translation id="112840717907525620">La memòria cau de la política està en bon estat</translation>
 <translation id="113188000913989374"><ph name="SITE" /> diu:</translation>
 <translation id="1132774398110320017">Configuració d'Emplenament automàtic de Chrome...</translation>
+<translation id="113770840981343808">Per verificar la targeta, introduïu el CVC de quatre dígits que hi ha a la part davantera</translation>
 <translation id="1146673768181266552">Identificador d'error <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Aquest servidor no ha pogut comprovar que sigui <ph name="DOMAIN" /> perquè el sistema operatiu del vostre ordinador considera que el seu certificat de seguretat no és de confiança. Això pot ser a causa d'una configuració incorrecta o d'un atacant que intercepta la vostra connexió.</translation>
 <translation id="1152921474424827756">Accediu a una <ph name="BEGIN_LINK" />còpia emmagatzemada a la memòria cau<ph name="END_LINK" /> de la pàgina <ph name="URL" />.</translation>
@@ -115,7 +116,6 @@
 <translation id="2212735316055980242">No es troba la política</translation>
 <translation id="2213606439339815911">S'estan recuperant les entrades...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> no està disponible</translation>
-<translation id="2227695659599072496">Comproveu el cable de xarxa o l'encaminador</translation>
 <translation id="2230458221926704099">Repareu la connexió amb l'<ph name="BEGIN_LINK" />aplicació de diagnòstic<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">El valor d'aquesta política és obsolet.</translation>
 <translation id="2262243747453050782">Error d'HTTP</translation>
@@ -128,6 +128,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> requereix un nom d'usuari i una contrasenya.</translation>
 <translation id="2328300916057834155">S'ha ignorat l'adreça d'interès no vàlida a l'índex <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Altres adreces d'interès</translation>
+<translation id="2357783041215512127">Pagueu amb <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Continua</translation>
 <translation id="2367567093518048410">Nivell</translation>
 <translation id="237718015863234333">No hi ha cap alternativa a la IU disponible.</translation>
@@ -225,7 +226,6 @@
 <translation id="3254409185687681395">Afegeix aquesta pàgina a les adreces d'interès</translation>
 <translation id="3270847123878663523">&amp;Desfés el canvi d'ordre</translation>
 <translation id="3286538390144397061">Reinicia ara</translation>
-<translation id="3288003805934695103">Torneu a carregar la pàgina</translation>
 <translation id="3305707030755673451">Les vostres dades es van encriptar el dia <ph name="TIME" /> amb la vostra frase de contrasenya de sincronització. Introduïu-la per començar la sincronització.</translation>
 <translation id="333371639341676808">Evita que aquesta pàgina creï diàlegs addicionals.</translation>
 <translation id="3340978935015468852">configuració</translation>
@@ -297,7 +297,6 @@
 <translation id="3963721102035795474">Mode de lector</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> està bloquejat</translation>
 <translation id="4021036232240155012">DNS és el servei de xarxa que tradueix el nom d'un lloc web en l'adreça d'Internet corresponent.</translation>
-<translation id="4021376465026729077">Desactiveu les extensions</translation>
 <translation id="4030383055268325496">&amp;Desfés l'addició</translation>
 <translation id="4032534284272647190">S'ha denegat l'accés a <ph name="URL" />.</translation>
 <translation id="404928562651467259">ADVERTIMENT</translation>
@@ -395,7 +394,6 @@
 <translation id="5251803541071282808">Núvol</translation>
 <translation id="5299298092464848405">S'ha produït un error en analitzar la política</translation>
 <translation id="5300589172476337783">Mostra</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Esborreu les galetes<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">La creació d'informes de bloqueig està desactivada.</translation>
 <translation id="5317780077021120954">Desa</translation>
 <translation id="5327248766486351172">Nom</translation>
@@ -429,6 +427,7 @@
 <translation id="5629630648637658800">No s'ha pogut carregar la configuració de la política</translation>
 <translation id="5631439013527180824">Testimoni de gestió del dispositiu no vàlid</translation>
 <translation id="5650551054760837876">No s'han trobat resultats de cerca.</translation>
+<translation id="5663999524854166235">Per verificar la targeta, introduïu el CVC de tres dígits que hi ha a la part posterior</translation>
 <translation id="5677928146339483299">Bloquejat</translation>
 <translation id="5710435578057952990">La identitat d'aquest lloc web no ha estat verificada.</translation>
 <translation id="5720705177508910913">Usuari actual</translation>
@@ -501,7 +500,6 @@
 <translation id="6628463337424475685">Cerca de <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">En aquest moment no podeu visitar <ph name="SITE" /> perquè <ph name="BEGIN_LINK" />aquest certificat s'ha revocat<ph name="END_LINK" />. Els errors de la xarxa i els atacs solen ser temporals, de manera que és probable que aquesta pàgina torni a funcionar més tard.</translation>
 <translation id="6637478299472506933">Ha fallat la baixada</translation>
-<translation id="6642894344118208103">Restabliu el mòdem o l'encaminador</translation>
 <translation id="6644283850729428850">Aquesta política ha quedat obsoleta.</translation>
 <translation id="6646897916597483132">Introduïu el CVC de quatre dígits que trobareu a la part davantera de la targeta</translation>
 <translation id="6656103420185847513">Edició de la carpeta</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb
index d57c8a1..634183d 100644
--- a/components/strings/components_strings_cs.xtb
+++ b/components/strings/components_strings_cs.xtb
@@ -18,6 +18,7 @@
 <translation id="112840717907525620">Mezipaměť zásady je v pořádku</translation>
 <translation id="113188000913989374">Web <ph name="SITE" /> říká:</translation>
 <translation id="1132774398110320017">Nastavení Automatického vyplňování v prohlížeči Chrome...</translation>
+<translation id="113770840981343808">K ověření zadejte čtyřmístný kód CVC z přední strany karty</translation>
 <translation id="1146673768181266552">ID selhání <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Server nedokázal prokázat, že patří doméně <ph name="DOMAIN" />. Operační systém vašeho počítače nedůvěřuje jeho bezpečnostnímu certifikátu.Může to být způsobeno nesprávnou konfigurací nebo tím, že vaše připojení zachytává útočník.</translation>
 <translation id="1152921474424827756">Otevřete <ph name="BEGIN_LINK" />archivovanou kopii<ph name="END_LINK" /> stránky <ph name="URL" /></translation>
@@ -112,7 +113,6 @@
 <translation id="2212735316055980242">Zásada nebyla nalezena</translation>
 <translation id="2213606439339815911">Načítání záznamů...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> není dostupná</translation>
-<translation id="2227695659599072496">Zkontrolovat síťový kabel nebo směrovač</translation>
 <translation id="2230458221926704099">Opravte připojení pomocí <ph name="BEGIN_LINK" />diagnostické aplikace<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Tato hodnota již pro tuto zásadu není podporována.</translation>
 <translation id="2262243747453050782">Chyba protokolu HTTP</translation>
@@ -125,6 +125,7 @@
 <translation id="2317259163369394535">Doména <ph name="DOMAIN" /> vyžaduje zadání uživatelského jména a hesla.</translation>
 <translation id="2328300916057834155">Byla ignorována neplatná záložka u indexu <ph name="ENTRY_INDEX" />.</translation>
 <translation id="2354001756790975382">Ostatní záložky</translation>
+<translation id="2357783041215512127">Platba kartou <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Pokračovat</translation>
 <translation id="2367567093518048410">Úroveň</translation>
 <translation id="237718015863234333">Žádné alternativy uživatelského rozhraní nejsou k dispozici</translation>
@@ -215,7 +216,6 @@
 <translation id="3254409185687681395">Přidat stránku do záložek</translation>
 <translation id="3270847123878663523">&amp;Vrátit změnu uspořádání zpět</translation>
 <translation id="3286538390144397061">Restartovat</translation>
-<translation id="3288003805934695103">Načíst stránku znovu</translation>
 <translation id="3305707030755673451">Vaše data byla <ph name="TIME" /> zašifrována pomocí heslové fráze pro synchronizaci. Chcete-li zahájit synchronizaci, zadejte ji.</translation>
 <translation id="333371639341676808">Bránit této stránce ve vytváření dalších dialogových oken.</translation>
 <translation id="3340978935015468852">nastavení</translation>
@@ -286,7 +286,6 @@
 <translation id="3963721102035795474">Režim čtečky</translation>
 <translation id="3973234410852337861">Web <ph name="HOST_NAME" /> je blokován</translation>
 <translation id="4021036232240155012">DNS je síťová služba, která překládá názvy webů na internetové adresy.</translation>
-<translation id="4021376465026729077">Zakázat rozšíření</translation>
 <translation id="4030383055268325496">&amp;Vrátit přidání zpět</translation>
 <translation id="4032534284272647190">Přístup na adresu <ph name="URL" /> odepřen.</translation>
 <translation id="404928562651467259">UPOZORNĚNÍ</translation>
@@ -384,7 +383,6 @@
 <translation id="5251803541071282808">Cloud</translation>
 <translation id="5299298092464848405">Při analýze zásady došlo k chybě</translation>
 <translation id="5300589172476337783">Zobrazit</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Vymazat soubory cookie<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Zprávy o selhání jsou zakázány.</translation>
 <translation id="5317780077021120954">Uložit</translation>
 <translation id="5327248766486351172">Název</translation>
@@ -418,6 +416,7 @@
 <translation id="5629630648637658800">Načítání nastavení zásady se nezdařilo</translation>
 <translation id="5631439013527180824">Neplatný token správy zařízení</translation>
 <translation id="5650551054760837876">Nebyly nalezeny žádné výsledky vyhledávání.</translation>
+<translation id="5663999524854166235">K ověření zadejte třípísmenný kód CVC uvedený na zadní straně karty</translation>
 <translation id="5677928146339483299">Zablokováno</translation>
 <translation id="5710435578057952990">Identita těchto webových stránek nebyla ověřena.</translation>
 <translation id="5720705177508910913">Aktuální uživatel</translation>
@@ -488,7 +487,6 @@
 <translation id="6628463337424475685">Vyhledávání <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">Web <ph name="SITE" /> nyní nemůžete navštívit, protože <ph name="BEGIN_LINK" />tento certifikát byl zrušen<ph name="END_LINK" />. Síťové chyby a útoky jsou obvykle dočasné, tato stránka pravděpodobně později bude fungovat.</translation>
 <translation id="6637478299472506933">Stažení se nezdařilo</translation>
-<translation id="6642894344118208103">Resetovat modem nebo směrovač</translation>
 <translation id="6644283850729428850">Tato zásada se již nepoužívá.</translation>
 <translation id="6646897916597483132">Zadejte čtyřmístný kód CVC z přední strany karty</translation>
 <translation id="6656103420185847513">Úprava složky</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb
index 7a09589..424df5d 100644
--- a/components/strings/components_strings_da.xtb
+++ b/components/strings/components_strings_da.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Cache for politik er OK</translation>
 <translation id="113188000913989374"><ph name="SITE" /> siger:</translation>
 <translation id="1132774398110320017">Indstillinger for Autofyld i Chrome...</translation>
+<translation id="113770840981343808">Indtast den firecifrede kontrolkode, som står på forsiden af dit kort, for at bekræfte</translation>
 <translation id="1146673768181266552">Nedbruds-id <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da operativsystemet på din computer ikke har tillid til sikkerhedscertifikatet. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse.</translation>
 <translation id="1152921474424827756">Få adgang til en <ph name="BEGIN_LINK" />cachelagret kopi<ph name="END_LINK" /> af <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Politikken blev ikke fundet</translation>
 <translation id="2213606439339815911">Indlæg hentes...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> er ikke tilgængelig</translation>
-<translation id="2227695659599072496">Kontrollere netværkskablet eller routeren</translation>
 <translation id="2230458221926704099">Ret problemerne med din forbindelse ved hjælp af <ph name="BEGIN_LINK" />diagnoseappen<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Denne værdi er forældet for denne politik.</translation>
 <translation id="2262243747453050782">HTTP-fejl</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> kræver et brugernavn og en adgangskode.</translation>
 <translation id="2328300916057834155">Ugyldigt bogmærke ved indeks <ph name="ENTRY_INDEX" /> er ignoreret</translation>
 <translation id="2354001756790975382">Andre bogmærker</translation>
+<translation id="2357783041215512127">Betal med <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Fortsæt</translation>
 <translation id="2367567093518048410">Niveau</translation>
 <translation id="237718015863234333">Der er ingen alternative grænseflader</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Tilføj denne side som bogmærke</translation>
 <translation id="3270847123878663523">&amp;Fortryd omarrangering</translation>
 <translation id="3286538390144397061">Genstart nu</translation>
-<translation id="3288003805934695103">Genindlæse siden</translation>
 <translation id="3305707030755673451">Dine data blev krypteret med din adgangssætning til synkronisering d. <ph name="TIME" />. Indtast adgangssætningen for at starte synkroniseringen.</translation>
 <translation id="333371639341676808">Undgå, at denne side laver nye dialogbokse.</translation>
 <translation id="3340978935015468852">indstillinger</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">Læser-tilstand</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> er blokeret</translation>
 <translation id="4021036232240155012">DNS er den netværkstjeneste, der oversætter navnet på et website til dets internetadresse.</translation>
-<translation id="4021376465026729077">Deaktivere dine udvidelser</translation>
 <translation id="4030383055268325496">&amp;Fortryd tilføjelse</translation>
 <translation id="4032534284272647190">Der blev nægtet adgang til <ph name="URL" />.</translation>
 <translation id="404928562651467259">ADVARSEL</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Skyen</translation>
 <translation id="5299298092464848405">Der opstod en fejl ved parsing af politik</translation>
 <translation id="5300589172476337783">Vis</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Rydde dine cookies<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Rapportering af nedbrud er deaktiveret.</translation>
 <translation id="5317780077021120954">Gem</translation>
 <translation id="5327248766486351172">Navn</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">Der kunne ikke indlæses indstillinger for politik</translation>
 <translation id="5631439013527180824">Ugyldigt token for enhedsadministration</translation>
 <translation id="5650551054760837876">Ingen søgeresultater fundet.</translation>
+<translation id="5663999524854166235">Indtast den trecifrede kontrolkode, som står på bagsiden af dit kort, for at bekræfte</translation>
 <translation id="5677928146339483299">Blokeret</translation>
 <translation id="5710435578057952990">Dette websites identitet er ikke blevet bekræftet.</translation>
 <translation id="5720705177508910913">Aktuel bruger</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> Søg</translation>
 <translation id="6634865548447745291">Du kan ikke gå til <ph name="SITE" /> lige nu, da <ph name="BEGIN_LINK" />dette certifikat er blevet tilbagekaldt<ph name="END_LINK" />. Netværksfejl og angreb er normalt midlertidige, så denne side vil sandsynligvis fungere senere.</translation>
 <translation id="6637478299472506933">Download mislykkedes</translation>
-<translation id="6642894344118208103">Nulstille modemmet eller routeren</translation>
 <translation id="6644283850729428850">Denne politik er forældet.</translation>
 <translation id="6646897916597483132">Indtast den firecifrede kontrolkode, som ses på forsiden af dit kort</translation>
 <translation id="6656103420185847513">Rediger mappe</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb
index f6b69dcb..052bbb4 100644
--- a/components/strings/components_strings_de.xtb
+++ b/components/strings/components_strings_de.xtb
@@ -22,6 +22,7 @@
 <translation id="112840717907525620">Richtlinien-Cache einwandfrei</translation>
 <translation id="113188000913989374">Unter <ph name="SITE" /> wird Folgendes angezeigt:</translation>
 <translation id="1132774398110320017">AutoFill-Einstellungen für Chrome...</translation>
+<translation id="113770840981343808">Geben Sie zur Bestätigung den vierstelligen CVC-Code auf der Vorderseite Ihrer Karte ein</translation>
 <translation id="1146673768181266552">Absturz-ID <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Dieser Server konnte nicht beweisen, dass er <ph name="DOMAIN" /> ist. Sein Sicherheitszertifikat wird vom Betriebssystem Ihres Computers als nicht vertrauenswürdig eingestuft. Mögliche Gründe sind eine fehlerhafte Konfiguration oder ein Angreifer, der Ihre Verbindung abfängt.</translation>
 <translation id="1152921474424827756">Rufen Sie eine <ph name="BEGIN_LINK" />im Cache gespeicherte Kopie<ph name="END_LINK" /> von <ph name="URL" /> auf.</translation>
@@ -119,7 +120,6 @@
 <translation id="2212735316055980242">Richtlinie nicht gefunden</translation>
 <translation id="2213606439339815911">Einträge werden abgerufen...</translation>
 <translation id="2214283295778284209">Nicht verfügbar: <ph name="SITE" /></translation>
-<translation id="2227695659599072496">Netzwerkkabel oder Router prüfen</translation>
 <translation id="2230458221926704099">Beheben Sie den Verbindungsfehler mithilfe der <ph name="BEGIN_LINK" />Diagnose-App<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Dieser Wert für die Richtlinie ist veraltet.</translation>
 <translation id="2262243747453050782">HTTP-Fehler</translation>
@@ -132,6 +132,7 @@
 <translation id="2317259163369394535">Für <ph name="DOMAIN" /> sind ein Nutzername und ein Passwort erforderlich.</translation>
 <translation id="2328300916057834155">Ungültiges Lesezeichen bei Index <ph name="ENTRY_INDEX" /> ignoriert</translation>
 <translation id="2354001756790975382">Weitere Lesezeichen</translation>
+<translation id="2357783041215512127">Mit <ph name="CREDIT_CARD" /> bezahlen</translation>
 <translation id="2359808026110333948">Weiter</translation>
 <translation id="2367567093518048410">Ebene</translation>
 <translation id="237718015863234333">Keine Alternativen für die Benutzeroberfläche verfügbar</translation>
@@ -229,7 +230,6 @@
 <translation id="3254409185687681395">Lesezeichen für diese Seite erstellen</translation>
 <translation id="3270847123878663523">&amp;Neu anordnen rückgängig machen</translation>
 <translation id="3286538390144397061">Jetzt neu starten</translation>
-<translation id="3288003805934695103">Seite aktualisieren</translation>
 <translation id="3305707030755673451">Ihre Daten wurden am <ph name="TIME" /> mit Ihrer Synchronisierungspassphrase verschlüsselt. Geben Sie diese ein, um die Synchronisierung zu starten.</translation>
 <translation id="333371639341676808">Diese Seite am Erstellen zusätzlicher Dialoge hindern</translation>
 <translation id="3340978935015468852">Einstellungen</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">Lesemodus</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> ist gesperrt</translation>
 <translation id="4021036232240155012">DNS ist der Netzwerkdienst, der den Namen einer Website in die entsprechende Internetadresse umwandelt.</translation>
-<translation id="4021376465026729077">Erweiterungen deaktivieren</translation>
 <translation id="4030383055268325496">&amp;Hinzufügen rückgängig machen</translation>
 <translation id="4032534284272647190">Zugriff auf <ph name="URL" /> verweigert</translation>
 <translation id="404928562651467259">Warnung</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Cloud</translation>
 <translation id="5299298092464848405">Fehler beim Parsen der Richtlinie</translation>
 <translation id="5300589172476337783">Anzeigen</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Cookies löschen<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Die Absturzberichtsfunktion ist deaktiviert.</translation>
 <translation id="5317780077021120954">Speichern</translation>
 <translation id="5327248766486351172">Name</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">Fehler beim Laden der Richtlinieneinstellungen</translation>
 <translation id="5631439013527180824">Ungültiges Management-Token für das Gerät</translation>
 <translation id="5650551054760837876">Keine Suchergebnisse gefunden.</translation>
+<translation id="5663999524854166235">Geben Sie zur Bestätigung den dreistelligen CVC-Code auf der Rückseite Ihrer Karte ein</translation>
 <translation id="5677928146339483299">Blockiert</translation>
 <translation id="5710435578057952990">Die Identität dieser Website wurde nicht verifiziert.</translation>
 <translation id="5720705177508910913">Aktueller Nutzer</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" />-Suche</translation>
 <translation id="6634865548447745291">Sie können <ph name="SITE" /> zurzeit nicht aufrufen, da <ph name="BEGIN_LINK" />dieses Zertifikat widerrufen wurde<ph name="END_LINK" />. Netzwerkfehler und Angriffe sind in der Regel nur vorübergehend, sodass die Seite wahrscheinlich später wieder funktioniert.</translation>
 <translation id="6637478299472506933">Fehler beim Download</translation>
-<translation id="6642894344118208103">Modem oder Router zurücksetzen</translation>
 <translation id="6644283850729428850">Diese Richtlinie ist veraltet.</translation>
 <translation id="6646897916597483132">Geben Sie den vierstelligen CVC-Code auf der Vorderseite Ihrer Karte ein.</translation>
 <translation id="6656103420185847513">Ordner bearbeiten</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb
index d153ca6..38153f7 100644
--- a/components/strings/components_strings_el.xtb
+++ b/components/strings/components_strings_el.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Η προσωρινή μνήμη της πολιτικής είναι εντάξει</translation>
 <translation id="113188000913989374">Ο ιστότοπος <ph name="SITE" /> λέει:</translation>
 <translation id="1132774398110320017">Ρυθμίσεις Αυτόματης συμπλήρωσης Chrome…</translation>
+<translation id="113770840981343808">Εισαγάγετε τον τετραψήφιο κωδικό CVC από το μπροστινό μέρος της κάρτας σας για επαλήθευση</translation>
 <translation id="1146673768181266552">Αναγνωριστικό σφάλματος <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Ο διακομιστής δεν μπόρεσε να αποδείξει ότι είναι <ph name="DOMAIN" />. Το πιστοποιητικό ασφαλείας του δεν θεωρείται έμπιστο από το λειτουργικό σύστημα της συσκευής σας. Αυτό μπορεί να οφείλεται σε λανθασμένη ρύθμιση ή σε κάποιον τρίτο που επιτίθεται στη σύνδεσή σας.</translation>
 <translation id="1152921474424827756">Πρόσβαση σε <ph name="BEGIN_LINK" />προσωρινό αντίγραφο<ph name="END_LINK" /> της διεύθυνσης <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Η πολιτική δε βρέθηκε</translation>
 <translation id="2213606439339815911">Ανάκτηση καταχωρίσεων…</translation>
 <translation id="2214283295778284209">Ο ιστότοπος <ph name="SITE" /> δεν είναι διαθέσιμος</translation>
-<translation id="2227695659599072496">Ελέγξτε το καλώδιο ή το δρομολογητή</translation>
 <translation id="2230458221926704099">Επιδιορθώστε τη σύνδεσή σας χρησιμοποιώντας την <ph name="BEGIN_LINK" />εφαρμογή διαγνωστικών ελέγχων<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Αυτή η πολιτική έχει καταργηθεί για τη συγκεκριμένη πολιτική.</translation>
 <translation id="2262243747453050782">Σφάλμα HTTP</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535">Ο τομέας <ph name="DOMAIN" /> απαιτεί ένα όνομα χρήστη και έναν κωδικό πρόσβασης.</translation>
 <translation id="2328300916057834155">Μη έγκυρος σελιδοδείκτης στο ευρετήριο <ph name="ENTRY_INDEX" /> που παραβλέφθηκε</translation>
 <translation id="2354001756790975382">Άλλοι σελιδοδείκτες</translation>
+<translation id="2357783041215512127">Πληρωμή με <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Συνέχεια</translation>
 <translation id="2367567093518048410">Επίπεδο</translation>
 <translation id="237718015863234333">Δεν διατίθενται εναλλακτικές διεπαφές</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Προσθήκη αυτής της σελίδας στους σελιδοδείκτες</translation>
 <translation id="3270847123878663523">&amp;Αναίρεση αναδιάταξης</translation>
 <translation id="3286538390144397061">Άμεση επανεκκίνηση</translation>
-<translation id="3288003805934695103">Επαναλάβετε τη φόρτωση της σελίδας</translation>
 <translation id="3305707030755673451">Τα δεδομένα σας κρυπτογραφήθηκαν με τη δική σας φράση πρόσβασης συγχρονισμού στις <ph name="TIME" />. Πληκτρολογήστε την για να ξεκινήσει ο συγχρονισμός.</translation>
 <translation id="333371639341676808">Αποτροπή δημιουργίας πρόσθετων πλαισίων διαλόγου από αυτή τη σελίδα.</translation>
 <translation id="3340978935015468852">ρυθμίσεις</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">Λειτουργία αναγνώστη</translation>
 <translation id="3973234410852337861">Ο κεντρικός υπολογιστής <ph name="HOST_NAME" /> είναι αποκλεισμένος</translation>
 <translation id="4021036232240155012">Το DNS είναι η υπηρεσία δικτύου που μεταφράζει το όνομα ενός ιστότοπου στη διεύθυνσή του στο διαδίκτυο.</translation>
-<translation id="4021376465026729077">Απενεργοποιήστε τις επεκτάσεις σας</translation>
 <translation id="4030383055268325496">&amp;Αναίρεση προσθήκης</translation>
 <translation id="4032534284272647190">Απαγορεύεται η πρόσβαση στο <ph name="URL" />.</translation>
 <translation id="404928562651467259">ΠΡΟΕΙΔΟΠΟΙΗΣΗ</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Cloud</translation>
 <translation id="5299298092464848405">Σφάλμα ανάλυσης πολιτικής</translation>
 <translation id="5300589172476337783">Εμφάνιση</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Διαγράψτε τα cookie<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Η αναφορά σφαλμάτων είναι απενεργοποιημένη.</translation>
 <translation id="5317780077021120954">Αποθήκευση</translation>
 <translation id="5327248766486351172">Όνομα</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">Αποτυχία φόρτωσης ρυθμίσεων πολιτικής</translation>
 <translation id="5631439013527180824">Μη έγκυρο διακριτικό διαχείρισης συσκευής</translation>
 <translation id="5650551054760837876">Δεν βρέθηκαν αποτελέσματα αναζήτησης.</translation>
+<translation id="5663999524854166235">Εισαγάγετε τον τριψήφιο κωδικό CVC από το πίσω μέρος της κάρτας σας για επαλήθευση</translation>
 <translation id="5677928146339483299">Αποκλεισμένος</translation>
 <translation id="5710435578057952990">Η ταυτότητα αυτού του ιστότοπου δεν έχει επαληθευτεί.</translation>
 <translation id="5720705177508910913">Τρέχων χρήστης</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685">Αναζήτηση <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">Δεν μπορείτε να επισκεφτείτε τον ιστότοπο <ph name="SITE" /> αυτήν τη στιγμή επειδή <ph name="BEGIN_LINK" />αυτό το πιστοποιητικό έχει ανακληθεί<ph name="END_LINK" />. Τα σφάλματα δικτύου και οι επιθέσεις είναι συνήθως προσωρινά, συνεπώς αυτή η σελίδα πιθανότατα θα λειτουργήσει αργότερα.</translation>
 <translation id="6637478299472506933">Αποτυχία λήψης</translation>
-<translation id="6642894344118208103">Επαναφέρετε το μόντεμ ή το δρομολογητή</translation>
 <translation id="6644283850729428850">Αυτή η πολιτική έχει αποσυρθεί.</translation>
 <translation id="6646897916597483132">Εισαγάγετε τον τετραψήφιο κωδικό CVC από το μπροστινό μέρος της κάρτας σας</translation>
 <translation id="6656103420185847513">Επεξεργασία φακέλου</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index 7e05995..ce734fd 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Policy cache OK</translation>
 <translation id="113188000913989374"><ph name="SITE" /> says:</translation>
 <translation id="1132774398110320017">Chrome Auto-fill settings...</translation>
+<translation id="113770840981343808">Enter the 4-digit CVC from the front of your card for verification</translation>
 <translation id="1146673768181266552">Crash ID <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">This server could not prove that it is <ph name="DOMAIN" />; its security certificate is not trusted by your computer's operating system. This may be caused by a misconfiguration or an attacker intercepting your connection.</translation>
 <translation id="1152921474424827756">Access a <ph name="BEGIN_LINK" />cached copy<ph name="END_LINK" /> of <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Policy not found</translation>
 <translation id="2213606439339815911">Fetching entries...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> is not available</translation>
-<translation id="2227695659599072496">Checking the network cable or router</translation>
 <translation id="2230458221926704099">Fix your connection using the <ph name="BEGIN_LINK" />diagnostics app<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">This value is deprecated for this policy.</translation>
 <translation id="2262243747453050782">HTTP error</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> requires a username and password.</translation>
 <translation id="2328300916057834155">Ignored invalid bookmark at index <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Other bookmarks</translation>
+<translation id="2357783041215512127">Pay with <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Continue</translation>
 <translation id="2367567093518048410">Level</translation>
 <translation id="237718015863234333">No UI alternatives available</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Bookmark this page</translation>
 <translation id="3270847123878663523">&amp;Undo Reorder</translation>
 <translation id="3286538390144397061">Restart Now</translation>
-<translation id="3288003805934695103">Reloading the page</translation>
 <translation id="3305707030755673451">Your data was encrypted with your sync passphrase on <ph name="TIME" />. Enter it to start sync.</translation>
 <translation id="333371639341676808">Prevent this page from creating additional dialogues.</translation>
 <translation id="3340978935015468852">settings</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">Reader Mode</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> is blocked</translation>
 <translation id="4021036232240155012">DNS is the network service that translates a website’s name to its Internet address.</translation>
-<translation id="4021376465026729077">Disabling your extensions</translation>
 <translation id="4030383055268325496">&amp;Undo add</translation>
 <translation id="4032534284272647190">Access to <ph name="URL" /> denied.</translation>
 <translation id="404928562651467259">WARNING</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Cloud</translation>
 <translation id="5299298092464848405">Error parsing policy</translation>
 <translation id="5300589172476337783">Show</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Clearing your cookies<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Crash reporting is disabled.</translation>
 <translation id="5317780077021120954">Save</translation>
 <translation id="5327248766486351172">Name</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">Failed to load policy settings</translation>
 <translation id="5631439013527180824">Invalid device management token</translation>
 <translation id="5650551054760837876">No search results found.</translation>
+<translation id="5663999524854166235">Enter the 3-digit CVC from the back of your card for verification</translation>
 <translation id="5677928146339483299">Blocked</translation>
 <translation id="5710435578057952990">The identity of this website has not been verified.</translation>
 <translation id="5720705177508910913">Current user</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> Search</translation>
 <translation id="6634865548447745291">You cannot visit <ph name="SITE" /> at the moment because <ph name="BEGIN_LINK" />this certificate has been revoked<ph name="END_LINK" />. Network errors and attacks are usually temporary, so this page will probably work later.</translation>
 <translation id="6637478299472506933">Download Failed</translation>
-<translation id="6642894344118208103">Resetting the modem or router</translation>
 <translation id="6644283850729428850">This policy has been deprecated.</translation>
 <translation id="6646897916597483132">Enter the 4-digit CVC from the front of your card</translation>
 <translation id="6656103420185847513">Edit Folder</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb
index fa223fd..9c4da87 100644
--- a/components/strings/components_strings_es-419.xtb
+++ b/components/strings/components_strings_es-419.xtb
@@ -117,7 +117,6 @@
 <translation id="2212735316055980242">No se encontró la política.</translation>
 <translation id="2213606439339815911">Recuperando entradas…</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> no está disponible.</translation>
-<translation id="2227695659599072496">Revisar el cable de red o el router.</translation>
 <translation id="2230458221926704099">Corregir la conexión con la <ph name="BEGIN_LINK" />app de diagnóstico<ph name="END_LINK" />.</translation>
 <translation id="225207911366869382">Este valor ya no se utiliza para esta política.</translation>
 <translation id="2262243747453050782">Error de HTTP</translation>
@@ -228,7 +227,6 @@
 <translation id="3254409185687681395">Agregar esta página a Marcadores</translation>
 <translation id="3270847123878663523">&amp;Deshacer Reorganizar</translation>
 <translation id="3286538390144397061">Reiniciar ahora</translation>
-<translation id="3288003805934695103">Volver a cargar la página.</translation>
 <translation id="3305707030755673451">Tus datos se encriptaron con tu frase de contraseña para sincronización el <ph name="TIME" />. Debes ingresarla para iniciar la sincronización.</translation>
 <translation id="333371639341676808">Evita que esta página cree cuadros de diálogo adicionales.</translation>
 <translation id="3340978935015468852">configuración</translation>
@@ -300,7 +298,6 @@
 <translation id="3963721102035795474">Modo de lectura</translation>
 <translation id="3973234410852337861">Se bloqueó <ph name="HOST_NAME" /></translation>
 <translation id="4021036232240155012">DNS es el servicio en red que traduce el nombre de un sitio web en su dirección de Internet.</translation>
-<translation id="4021376465026729077">Inhabilitar las extensiones.</translation>
 <translation id="4030383055268325496">&amp;Deshacer Agregar</translation>
 <translation id="4032534284272647190">Acceso a <ph name="URL" /> denegado.</translation>
 <translation id="404928562651467259">ADVERTENCIA</translation>
@@ -398,7 +395,6 @@
 <translation id="5251803541071282808">Nube</translation>
 <translation id="5299298092464848405">Error al analizar la política</translation>
 <translation id="5300589172476337783">Mostrar</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Borrar las cookies<ph name="END_LINK" />.</translation>
 <translation id="5308689395849655368">Notificación de fallas desactivada.</translation>
 <translation id="5317780077021120954">Guardar</translation>
 <translation id="5327248766486351172">Nombre</translation>
@@ -503,7 +499,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> Búsqueda</translation>
 <translation id="6634865548447745291">No puedes visitar <ph name="SITE" /> ahora porque <ph name="BEGIN_LINK" />este certificado se revocó<ph name="END_LINK" />. Los ataques y errores de red suelen ser temporales, por lo que es posible que esta página funcione más tarde.</translation>
 <translation id="6637478299472506933">Error en la descarga</translation>
-<translation id="6642894344118208103">Reiniciar el módem o router.</translation>
 <translation id="6644283850729428850">Esta política no ha sido aprobada.</translation>
 <translation id="6646897916597483132">Ingresa el CVC de 4 dígitos que figura en el frente de la tarjeta.</translation>
 <translation id="6656103420185847513">Editar carpeta</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb
index 50fb527e..4106e251 100644
--- a/components/strings/components_strings_es.xtb
+++ b/components/strings/components_strings_es.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Caché de política correcta</translation>
 <translation id="113188000913989374"><ph name="SITE" /> dice:</translation>
 <translation id="1132774398110320017">Configuración de la función Autocompletar de Chrome...</translation>
+<translation id="113770840981343808">Introduce el código CVC de cuatro dígitos que aparece en el anverso de tu tarjeta para verificarla</translation>
 <translation id="1146673768181266552">ID de error <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Este servidor no ha podido probar que su dominio es <ph name="DOMAIN" />, el sistema operativo de tu ordenador no confía en su certificado de seguridad. Este problema puede deberse a una configuración incorrecta o a que un atacante haya interceptado la conexión.</translation>
 <translation id="1152921474424827756">Accede a una <ph name="BEGIN_LINK" />copia almacenada en caché<ph name="END_LINK" /> de <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Política no encontrada</translation>
 <translation id="2213606439339815911">Recuperando entradas...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> no está disponible.</translation>
-<translation id="2227695659599072496">Comprobar el router o el cable de red</translation>
 <translation id="2230458221926704099">Soluciona los problemas de tu conexión con la <ph name="BEGIN_LINK" />aplicación de diagnóstico<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Este valor ya no se utiliza para esta política.</translation>
 <translation id="2262243747453050782">Error de HTTP</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> necesita un nombre de usuario y una contraseña.</translation>
 <translation id="2328300916057834155">Se ha ignorado un marcador no válido en el índice <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Otros marcadores</translation>
+<translation id="2357783041215512127">Pagar con <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Continuar</translation>
 <translation id="2367567093518048410">Nivel</translation>
 <translation id="237718015863234333">No hay alternativas de IU disponibles</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Añadir esta página a marcadores</translation>
 <translation id="3270847123878663523">&amp;Deshacer reorganización</translation>
 <translation id="3286538390144397061">Reiniciar ahora</translation>
-<translation id="3288003805934695103">Volver a cargar la página</translation>
 <translation id="3305707030755673451">Tus datos se cifraron con tu frase de contraseña de sincronización el <ph name="TIME" />. Introdúcela para iniciar la sincronización.</translation>
 <translation id="333371639341676808">Evita que esta página cree cuadros de diálogo adicionales.</translation>
 <translation id="3340978935015468852">configuración</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">Modo de lectura</translation>
 <translation id="3973234410852337861">La página <ph name="HOST_NAME" /> está bloqueada</translation>
 <translation id="4021036232240155012">DNS es el servicio de red que permite traducir el nombre de un sitio web a su dirección de Internet.</translation>
-<translation id="4021376465026729077">Inhabilitar las extensiones</translation>
 <translation id="4030383055268325496">&amp;Deshacer acción de añadir</translation>
 <translation id="4032534284272647190">Se ha denegado el acceso a <ph name="URL" /></translation>
 <translation id="404928562651467259">ADVERTENCIA</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Nube</translation>
 <translation id="5299298092464848405">Error al analizar la política</translation>
 <translation id="5300589172476337783">Mostrar</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Borrar las cookies<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Notificación de fallos inhabilitada</translation>
 <translation id="5317780077021120954">Guardar</translation>
 <translation id="5327248766486351172">Nombre</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">Error al cargar la configuración de la política</translation>
 <translation id="5631439013527180824">Token de administración de dispositivos no válido</translation>
 <translation id="5650551054760837876">No se han encontrado resultados de búsqueda.</translation>
+<translation id="5663999524854166235">Introduce el código CVC de tres dígitos que aparece en el reverso de tu tarjeta para verificarla</translation>
 <translation id="5677928146339483299">Con bloqueo</translation>
 <translation id="5710435578057952990">No se ha verificado la identidad de este sitio web.</translation>
 <translation id="5720705177508910913">Usuario actual</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685">Búsqueda de <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">No puedes acceder a <ph name="SITE" /> en este momento porque <ph name="BEGIN_LINK" />este certificado se ha revocado<ph name="END_LINK" />. Los ataques y los errores de red suelen ser temporales, por lo que es probable que esta página funcione más tarde.</translation>
 <translation id="6637478299472506933">Error de descarga</translation>
-<translation id="6642894344118208103">Reiniciar el módem o el router</translation>
 <translation id="6644283850729428850">Esta política está obsoleta.</translation>
 <translation id="6646897916597483132">Introduce el código CVC de cuatro dígitos que aparece en el anverso de tu tarjeta</translation>
 <translation id="6656103420185847513">Editar carpeta</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb
index bf68894c..0bcae58 100644
--- a/components/strings/components_strings_et.xtb
+++ b/components/strings/components_strings_et.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Reegli vahemälu töötab probleemideta</translation>
 <translation id="113188000913989374"><ph name="SITE" /> ütleb:</translation>
 <translation id="1132774398110320017">Chrome'i automaattäite seaded ...</translation>
+<translation id="113770840981343808">Kinnitamiseks sisestage 4-kohaline CVC kaardi esiküljelt</translation>
 <translation id="1146673768181266552">Krahhi ID <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Server ei suutnud tõestada, et see on domeen <ph name="DOMAIN" />, arvuti operatsioonisüsteem ei usalda selle turvasertifikaati. Selle põhjuseks võib olla vale seadistus või ründaja, kes on sekkunud teie ühendusse.</translation>
 <translation id="1152921474424827756">Hankige juurdepääs aadressi <ph name="URL" /> <ph name="BEGIN_LINK" />vahemällu salvestatud koopiale<ph name="END_LINK" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Reeglit ei leitud</translation>
 <translation id="2213606439339815911">Kirjete toomine ...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> pole saadaval</translation>
-<translation id="2227695659599072496">Kontrollige võrgukaablit või ruuterit</translation>
 <translation id="2230458221926704099">Parandage oma ühendus <ph name="BEGIN_LINK" />diagnostikarakenduse<ph name="END_LINK" /> abil</translation>
 <translation id="225207911366869382">Väärtus on eeskirjade jaoks aegunud.</translation>
 <translation id="2262243747453050782">HTTP viga</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535">Domeen <ph name="DOMAIN" /> nõuab kasutajanime ja parooli.</translation>
 <translation id="2328300916057834155">Ignoreeriti vale järjehoidjat registris <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Muud järjehoidjad</translation>
+<translation id="2357783041215512127">Maksa kaardiga <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Jätka</translation>
 <translation id="2367567093518048410">Tase</translation>
 <translation id="237718015863234333">Kasutajaliidese alternatiive pole saadaval</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Lisa see lehekülg järjehoidjatesse</translation>
 <translation id="3270847123878663523">&amp;Võta korrastamine tagasi</translation>
 <translation id="3286538390144397061">Taaskäivitada kohe</translation>
-<translation id="3288003805934695103">Laadige leht uuesti</translation>
 <translation id="3305707030755673451">Teie andmed krüpteeriti <ph name="TIME" /> teie sünkroonimisparooliga. Sisestage see sünkroonimise alustamiseks.</translation>
 <translation id="333371639341676808">Keela sellel leheküljel lisadialoogide loomine.</translation>
 <translation id="3340978935015468852">seaded</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">Lugejarežiim</translation>
 <translation id="3973234410852337861">Host <ph name="HOST_NAME" /> on blokeeritud</translation>
 <translation id="4021036232240155012">DNS on võrguteenus, mis tõlgib veebisaidi nime selle Interneti-aadressiks.</translation>
-<translation id="4021376465026729077">Keelake laiendused</translation>
 <translation id="4030383055268325496">&amp;Võta lisamine tagasi</translation>
 <translation id="4032534284272647190">Juurdepääs aadressile <ph name="URL" /> on keelatud.</translation>
 <translation id="404928562651467259">HOIATUS</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Pilv</translation>
 <translation id="5299298092464848405">Reegli sõelumisel ilmnes viga</translation>
 <translation id="5300589172476337783">Kuva</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Kustutage küpsised<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Krahhide aruandlus on keelatud.</translation>
 <translation id="5317780077021120954">Salvesta</translation>
 <translation id="5327248766486351172">Nimi</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">Reegli seadete laadimine ebaõnnestus</translation>
 <translation id="5631439013527180824">Seadme halduse luba on kehtetu</translation>
 <translation id="5650551054760837876">Otsingutulemusi ei leitud.</translation>
+<translation id="5663999524854166235">Kinnitamiseks sisestage 3-kohaline CVC kaardi tagaküljelt</translation>
 <translation id="5677928146339483299">Blokeeritud</translation>
 <translation id="5710435578057952990">Selle veebisaidi identiteeti pole kinnitanud.</translation>
 <translation id="5720705177508910913">Praegune kasutaja</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" />'i otsing</translation>
 <translation id="6634865548447745291">Te ei saa saiti <ph name="SITE" /> praegu külastada, sest <ph name="BEGIN_LINK" />see sertifikaat on tühistatud<ph name="END_LINK" />. Võrguvead ja -rünnakud on tavaliselt ajutised, nii et leht tõenäoliselt hiljem töötab.</translation>
 <translation id="6637478299472506933">Allalaadimine nurjus</translation>
-<translation id="6642894344118208103">Lähtestage modem või ruuter</translation>
 <translation id="6644283850729428850">See reegel on aegunud.</translation>
 <translation id="6646897916597483132">Sisestage 4-kohaline CVC kaardi tagaküljelt</translation>
 <translation id="6656103420185847513">Kausta muutmine</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb
index a166272..83009b7 100644
--- a/components/strings/components_strings_fa.xtb
+++ b/components/strings/components_strings_fa.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">حافظه پنهان خط‌مشی مورد تأیید است</translation>
 <translation id="113188000913989374"><ph name="SITE" /> می‌گوید:</translation>
 <translation id="1132774398110320017">‏تنظیمات تکمیل خودکار Chrome...</translation>
+<translation id="113770840981343808">‏کد راستی‌آزمایی چهار رقمی CVC را از روی کارتتان وارد کنید</translation>
 <translation id="1146673768181266552">شناسه خرابی <ph name="CRASH_ID" />‏ (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">این سرور نتوانست اثبات کند که این <ph name="DOMAIN" /> است؛ گواهی امنیتی آن مورد اعتماد سیستم عامل رایانه شما نیست. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجی اتصال شما را قطع کرده است.</translation>
 <translation id="1152921474424827756">دسترسی به یک <ph name="BEGIN_LINK" />نسخه ذخیره شده در حافظه پنهان<ph name="END_LINK" /> از <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">خط‌مشی یافت نشد</translation>
 <translation id="2213606439339815911">در حال واکشی موارد...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> در دسترس نیست</translation>
-<translation id="2227695659599072496">بررسی رهیاب یا کابل شبکه</translation>
 <translation id="2230458221926704099">با استفاده از <ph name="BEGIN_LINK" />برنامه عیب‌یابی<ph name="END_LINK" />، مشکل اتصالتان را برطرف کنید</translation>
 <translation id="225207911366869382">این مقدار برای این خط‌مشی منسوخ شده است؟</translation>
 <translation id="2262243747453050782">‏خطای HTTP</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> به نام کاربری و گذرواژه نیاز دارد.</translation>
 <translation id="2328300916057834155">نشانک نامعتبر در نمایه <ph name="ENTRY_INDEX" /> نادیده گرفته شد</translation>
 <translation id="2354001756790975382">نشانک‌های دیگر</translation>
+<translation id="2357783041215512127">پرداخت با <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">ادامه</translation>
 <translation id="2367567093518048410">سطح</translation>
 <translation id="237718015863234333">هیچ گزینه واسط کاربری موجود نیست</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">نشانک گذاری این صفحه</translation>
 <translation id="3270847123878663523">&amp;واگرد ترتیب‌بندی مجدد</translation>
 <translation id="3286538390144397061">راه‌اندازی مجدد اکنون</translation>
-<translation id="3288003805934695103">تازه‌سازی صفحه</translation>
 <translation id="3305707030755673451">داده‌های شما در تاریخ <ph name="TIME" /> با عبارت عبور همگام‌سازی‌تان رمزگذاری شد. برای شروع همگام‌سازی آن را وارد کنید.</translation>
 <translation id="333371639341676808">از ایجاد کادرهای گفتگوی دیگر توسط این صفحه جلوگیری شود.</translation>
 <translation id="3340978935015468852">تنظیمات</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">حالت «خواننده»</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> مسدود است</translation>
 <translation id="4021036232240155012">‏DNS خدماتی از شبکه است که نام وب‌سایت را به آدرس اینترنتی آن ترجمه می‌کند.</translation>
-<translation id="4021376465026729077">غیرفعال کردن افزونه‌ها</translation>
 <translation id="4030383055268325496">&amp;واگرد افزودن</translation>
 <translation id="4032534284272647190">دسترسی به <ph name="URL" /> رد شد.</translation>
 <translation id="404928562651467259">اخطار</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Cloud</translation>
 <translation id="5299298092464848405">خطا در تجزیه خط‌‌مشی</translation>
 <translation id="5300589172476337783">نمایش</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />پاک کردن کوکی‌ها<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">گزارش خرابی غیر فعال است.</translation>
 <translation id="5317780077021120954">ذخیره</translation>
 <translation id="5327248766486351172">نام</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">تنظیمات خط‌مشی بارگیری نشد</translation>
 <translation id="5631439013527180824">نشانه مدیریت دستگاه نامعتبر است</translation>
 <translation id="5650551054760837876">هیچ نتیجه‌ای برای جستجو یافت نشد.</translation>
+<translation id="5663999524854166235">‏کد راستی‌آزمایی سه رقمی CVC را از پشت کارت‌تان وارد کنید</translation>
 <translation id="5677928146339483299">مسدود است</translation>
 <translation id="5710435578057952990">هویت این وب سایت تأیید نشده است.</translation>
 <translation id="5720705177508910913">کاربر کنونی</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685">جستجوی <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">در حال حاضر نمی‌توانید از <ph name="SITE" /> بازدید کنید زیرا <ph name="BEGIN_LINK" />این گواهینامه باطل شده است<ph name="END_LINK" />. معمولاً خطاهای شبکه و حمله‌ها موقتی هستند، بنابراین احتمالاً این صفحه بعداً کار خواهد کرد.</translation>
 <translation id="6637478299472506933">بارگیری نشد</translation>
-<translation id="6642894344118208103">بازنشانی مودم یا رهیاب</translation>
 <translation id="6644283850729428850">این قانون قدیمی شده است.</translation>
 <translation id="6646897916597483132">‏کد تأیید چهار رقمی CVC را از روی کارت‌تان وارد کنید</translation>
 <translation id="6656103420185847513">ویرایش پوشه</translation>
@@ -619,7 +617,7 @@
 <translation id="7791543448312431591">افزودن</translation>
 <translation id="7793809570500803535">ممکن است صفحهٔ وب در <ph name="SITE" /> موقتاً خراب باشد یا ممکن است برای همیشه به یک آدرس وب جدید منتقل شده باشد.</translation>
 <translation id="7800304661137206267">اتصال با استفاده از <ph name="CIPHER" /> و با <ph name="MAC" /> برای تأیید اعتبار پیام و <ph name="KX" /> به‌عنوان مکانیسم تبدیل کلید رمزگذاری می‌شود.</translation>
-<translation id="780301667611848630">نه سپاسگزارم</translation>
+<translation id="780301667611848630">نه متشکرم</translation>
 <translation id="7805768142964895445">وضعیت</translation>
 <translation id="7813600968533626083">‏پیشنهاد فرم از Chrome پاک شود؟</translation>
 <translation id="7825436071901023927">درگاه ناامن <ph name="SITE" /></translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb
index 23f10fbd..0bedcd0c 100644
--- a/components/strings/components_strings_fi.xtb
+++ b/components/strings/components_strings_fi.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Käytännön välimuisti on OK</translation>
 <translation id="113188000913989374">Viesti osoitteesta <ph name="SITE" />:</translation>
 <translation id="1132774398110320017">Chromen automaattisen täytön asetukset…</translation>
+<translation id="113770840981343808">Anna korttisi etupuolella oleva nelinumeroinen CVC-koodi maksun vahvistusta varten.</translation>
 <translation id="1146673768181266552">Kaatumistunnus <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Palvelin ei voinut todistaa olevansa <ph name="DOMAIN" />; tietokoneesi käyttöjärjestelmä ei luota sen suojausvarmenteeseen. Tämä voi johtua määritysvirheestä tai verkkoyhteytesi siepanneesta hyökkääjästä.</translation>
 <translation id="1152921474424827756">Käytä osoitteen <ph name="URL" /> <ph name="BEGIN_LINK" />välimuistiversiota<ph name="END_LINK" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Käytäntöä ei löydy</translation>
 <translation id="2213606439339815911">Noudetaan merkintöjä…</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> ei ole käytettävissä</translation>
-<translation id="2227695659599072496">Tarkista verkkokaapeli tai reititin.</translation>
 <translation id="2230458221926704099">Korjaa yhteytesi käyttämällä <ph name="BEGIN_LINK" />diagnostiikkasovellusta<ph name="END_LINK" />.</translation>
 <translation id="225207911366869382">Tämän käytännön arvo on vanhentunut.</translation>
 <translation id="2262243747453050782">HTTP-virhe</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> pyytää käyttäjänimeä ja salasanaa.</translation>
 <translation id="2328300916057834155">Ohitettiin virheellinen kirjanmerkki kohdassa <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Muut kirjanmerkit</translation>
+<translation id="2357783041215512127">Maksutapa: <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Jatka</translation>
 <translation id="2367567093518048410">Taso</translation>
 <translation id="237718015863234333">Käyttöliittymävaihtoehtoja ei ole saatavilla</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Luo kirjanmerkki tälle sivulle</translation>
 <translation id="3270847123878663523">K&amp;umoa uudelleenjärjestely</translation>
 <translation id="3286538390144397061">Käynnistä uudelleen</translation>
-<translation id="3288003805934695103">Lataa sivu uudelleen.</translation>
 <translation id="3305707030755673451">Tietosi salattiin synkronoinnin tunnuslauseesi avulla <ph name="TIME" />. Aloita synkronointi antamalla tunnuslause.</translation>
 <translation id="333371639341676808">Estä tätä sivua luomasta muita viestejä.</translation>
 <translation id="3340978935015468852">asetuksissa</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">Lukijatila</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> on estetty</translation>
 <translation id="4021036232240155012">DNS on verkkopalvelu, joka kääntää verkkosivuston nimen sen internetosoitteeksi.</translation>
-<translation id="4021376465026729077">Poista laajennukset käytöstä.</translation>
 <translation id="4030383055268325496">K&amp;umoa lisäys</translation>
 <translation id="4032534284272647190">Pääsy sivulle <ph name="URL" /> kielletty.</translation>
 <translation id="404928562651467259">Varoitus</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Pilvi</translation>
 <translation id="5299298092464848405">Virhe jäsennettäessä käytäntöä</translation>
 <translation id="5300589172476337783">Näytä</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Tyhjennä evästeet.<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Kaatumisraportit on poistettu käytöstä.</translation>
 <translation id="5317780077021120954">Tallenna</translation>
 <translation id="5327248766486351172">Nimi</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">Käytännön asetuksien lataaminen epäonnistui</translation>
 <translation id="5631439013527180824">Laitteenhallintatunnus on virheellinen</translation>
 <translation id="5650551054760837876">Hakutuloksia ei löytynyt.</translation>
+<translation id="5663999524854166235">Anna korttisi takapuolella oleva kolminumeroinen CVC-koodi maksun vahvistusta varten.</translation>
 <translation id="5677928146339483299">Estetty</translation>
 <translation id="5710435578057952990">Tämän sivuston identiteettiä ei ole vahvistettu.</translation>
 <translation id="5720705177508910913">Nykyinen käyttäjä</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" />-haku</translation>
 <translation id="6634865548447745291">Et voi siirtyä sivustoon <ph name="SITE" /> juuri nyt, koska <ph name="BEGIN_LINK" />tämä varmenne on kumottu<ph name="END_LINK" />. Verkkovirheet ja hyökkäykset ovat yleensä väliaikaisia, joten sivu luultavasti toimii myöhemmin.</translation>
 <translation id="6637478299472506933">Lataus epäonnistui</translation>
-<translation id="6642894344118208103">Käynnistä modeemi tai reititin uudelleen.</translation>
 <translation id="6644283850729428850">Tämä käytäntö on vanhentunut.</translation>
 <translation id="6646897916597483132">Anna nelinumeroinen CVC luottokortin etupuolelta.</translation>
 <translation id="6656103420185847513">Muokkaa kansiota</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index 966ba56..bc3dec91 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">OK ang cache ng patakaran</translation>
 <translation id="113188000913989374">Isinasaad ng <ph name="SITE" /> na:</translation>
 <translation id="1132774398110320017">Mga setting ng Autofill ng Chrome...</translation>
+<translation id="113770840981343808">Ilagay ang 4 na digit na CVC mula sa harap ng iyong card para sa pag-verify</translation>
 <translation id="1146673768181266552">Crash ID <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Hindi mapatunayan ng server na ito na ito ay <ph name="DOMAIN" />; hindi pinagkakatiwalaan ng operating system ng iyong computer ang certificate ng seguridad nito. Maaaring dulot ito ng maling configuration o isang umaatake na hinahadlangan ang iyong koneksyon.</translation>
 <translation id="1152921474424827756">Mag-access ng <ph name="BEGIN_LINK" />naka-cache na kopya<ph name="END_LINK" /> ng <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Hindi nahanap ang patakaran</translation>
 <translation id="2213606439339815911">Kinukuha ang mga entry...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> ay hindi magagamit</translation>
-<translation id="2227695659599072496">Suriin ang cable o router ng network</translation>
 <translation id="2230458221926704099">Ayusin ang iyong koneksyon gamit ang <ph name="BEGIN_LINK" />diagnostics app<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Hindi na gimagamit ang halagang ito para sa patakarang ito.</translation>
 <translation id="2262243747453050782">Error sa HTTP</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535">Kailangan ng <ph name="DOMAIN" /> ng username at password.</translation>
 <translation id="2328300916057834155">Binalewalang di-wastong bookmark sa index <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Iba pang mga bookmark</translation>
+<translation id="2357783041215512127">Magbayad gamit ang <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Magpatuloy</translation>
 <translation id="2367567093518048410">Antas</translation>
 <translation id="237718015863234333">Walang mga available na alternatibo sa UI</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">I-bookmark ang page na ito</translation>
 <translation id="3270847123878663523">&amp;I-undo ang Pagbabago sa Ayos</translation>
 <translation id="3286538390144397061">I-restart Ngayon</translation>
-<translation id="3288003805934695103">I-reload ang page</translation>
 <translation id="3305707030755673451">Na-encrypt ang iyong data gamit ang iyong passphrase sa pag-sync noong <ph name="TIME" />. Ilagay ito upang simulan ang pag-sync.</translation>
 <translation id="333371639341676808">Iwasan ang pahinang ito mula sa paglikha ng karagdagang mga dialog.</translation>
 <translation id="3340978935015468852">mga setting</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">Reader Mode</translation>
 <translation id="3973234410852337861">Naka-block ang <ph name="HOST_NAME" /></translation>
 <translation id="4021036232240155012">Ang DNS ay ang serbisyo sa network na nagta-translate ng pangalan ng isang website sa Internet address nito.</translation>
-<translation id="4021376465026729077">I-disable ang iyong mga extension</translation>
 <translation id="4030383055268325496">&amp;I-undo ang pagdagdag</translation>
 <translation id="4032534284272647190">Tinanggihan ang pag-access sa <ph name="URL" />.</translation>
 <translation id="404928562651467259">BABALA</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Cloud</translation>
 <translation id="5299298092464848405">Error sa pag-parse ng patakaran</translation>
 <translation id="5300589172476337783">Ipakita</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />I-clear ang iyong cookies<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Hindi pinagana ang pag-uulat ng pag-crash.</translation>
 <translation id="5317780077021120954">I-save</translation>
 <translation id="5327248766486351172">Pangalan</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">Nabigong i-load ang mga setting ng patakaran</translation>
 <translation id="5631439013527180824">Di-wastong token sa pamamahala ng device</translation>
 <translation id="5650551054760837876">Walang nahanap na mga resulta sa paghahanap</translation>
+<translation id="5663999524854166235">Ilagay ang 3 digit na CVC mula sa likod ng iyong card para sa pag-verify</translation>
 <translation id="5677928146339483299">Naka-block</translation>
 <translation id="5710435578057952990">Ang pagkilala ng website na ito ay hindi natukoy.</translation>
 <translation id="5720705177508910913">Kasalukuyang user</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685">Paghahanap ng <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">Hindi mo maaaring bisitahin ang <ph name="SITE" /> sa ngayon dahil <ph name="BEGIN_LINK" />binawi na ang certificate na ito<ph name="END_LINK" />. Kadalasang pansamantala lang ang mga error at atake sa network, kaya malamang na gagana ang page na ito sa ibang pagkakataon.</translation>
 <translation id="6637478299472506933">Nabigo ang Download</translation>
-<translation id="6642894344118208103">I-reset ang modem o router</translation>
 <translation id="6644283850729428850">Hindi na ginagamit ang patakarang ito.</translation>
 <translation id="6646897916597483132">Ilagay ang CVC na may 4 na digit mula sa harap ng iyong card</translation>
 <translation id="6656103420185847513">I-edit ang Folder</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb
index f0acbe99d..0c70b541 100644
--- a/components/strings/components_strings_fr.xtb
+++ b/components/strings/components_strings_fr.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Cache de la règle valide.</translation>
 <translation id="113188000913989374"><ph name="SITE" /> indique :</translation>
 <translation id="1132774398110320017">Paramètres de saisie automatique de Chrome…</translation>
+<translation id="113770840981343808">Saisissez le code CVC à quatre chiffres indiqué au recto de votre carte.</translation>
 <translation id="1146673768181266552">Identifiant de plantage <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Impossible de vérifier sur le serveur qu'il s'agit bien du domaine <ph name="DOMAIN" />, car son certificat de sécurité n'est pas considéré comme fiable par le système d'exploitation de votre ordinateur. Cela peut être dû à une mauvaise configuration ou bien à l'interception de votre connexion par un pirate informatique.</translation>
 <translation id="1152921474424827756">Accédez à une <ph name="BEGIN_LINK" />copie mise en cache<ph name="END_LINK" /> de <ph name="URL" />.</translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Règle introuvable.</translation>
 <translation id="2213606439339815911">Obtention des entrées en cours…</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> n'est pas accessible</translation>
-<translation id="2227695659599072496">Vérifier le câble réseau ou le routeur</translation>
 <translation id="2230458221926704099">Vérifiez la connexion à l'aide de l'<ph name="BEGIN_LINK" />application de diagnostic<ph name="END_LINK" />.</translation>
 <translation id="225207911366869382">Cette valeur n'est plus utilisée dans le cadre de cette règle.</translation>
 <translation id="2262243747453050782">Erreur HTTP.</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> nécessite un nom d'utilisateur et un mot de passe.</translation>
 <translation id="2328300916057834155">Favori non valide ignoré (index <ph name="ENTRY_INDEX" />)</translation>
 <translation id="2354001756790975382">Autres favoris</translation>
+<translation id="2357783041215512127">Payer avec la carte <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Continuer</translation>
 <translation id="2367567093518048410">Niveau</translation>
 <translation id="237718015863234333">Aucune alternative disponible pour l'interface utilisateur</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Ajouter cette page aux favoris</translation>
 <translation id="3270847123878663523">&amp;Annuler la réorganisation</translation>
 <translation id="3286538390144397061">Redémarrer maintenant</translation>
-<translation id="3288003805934695103">Recharger la page</translation>
 <translation id="3305707030755673451">Vos données ont été chiffrées avec votre phrase secrète de synchronisation le <ph name="TIME" />. Saisissez-la pour lancer la synchronisation.</translation>
 <translation id="333371639341676808">Empêcher cette page de générer des boîtes de dialogue supplémentaires</translation>
 <translation id="3340978935015468852">paramètres</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">Mode lecture</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> est bloqué</translation>
 <translation id="4021036232240155012">DNS est le service Web qui convertit les noms de sites Web en adresses Internet.</translation>
-<translation id="4021376465026729077">Désactiver les extensions</translation>
 <translation id="4030383055268325496">&amp;Annuler l'ajout</translation>
 <translation id="4032534284272647190">Accès à <ph name="URL" /> refusé.</translation>
 <translation id="404928562651467259">AVERTISSEMENT</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Cloud</translation>
 <translation id="5299298092464848405">Erreur d'analyse de la règle.</translation>
 <translation id="5300589172476337783">Afficher</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Supprimer les cookies<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">L'envoi de rapports d'erreur est désactivé.</translation>
 <translation id="5317780077021120954">Enregistrer</translation>
 <translation id="5327248766486351172">Nom</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">Échec du chargement des paramètres de la règle.</translation>
 <translation id="5631439013527180824">Jeton de gestion de l'appareil non valide.</translation>
 <translation id="5650551054760837876">Aucun résultat de recherche trouvé</translation>
+<translation id="5663999524854166235">Saisissez le code CVC à trois chiffres indiqué au dos de votre carte.</translation>
 <translation id="5677928146339483299">Bloqué</translation>
 <translation id="5710435578057952990">L'identité de ce site Web n'a pas été vérifiée.</translation>
 <translation id="5720705177508910913">Utilisateur actuel</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685">Recherche <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">Vous ne pouvez pas consulter le site <ph name="SITE" /> pour le moment, car ce <ph name="BEGIN_LINK" />certificat a été révoqué<ph name="END_LINK" />. Les erreurs réseau et les attaques sont généralement temporaires. Vous devriez donc pouvoir accéder à cette page ultérieurement.</translation>
 <translation id="6637478299472506933">Échec téléchargement</translation>
-<translation id="6642894344118208103">Réinitialiser le modem ou le routeur</translation>
 <translation id="6644283850729428850">Cette règle est obsolète.</translation>
 <translation id="6646897916597483132">Saisissez le code CVC à quatre chiffres indiqué au recto de votre carte.</translation>
 <translation id="6656103420185847513">Modifier le dossier</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb
index 341a5891..e92c34c 100644
--- a/components/strings/components_strings_gu.xtb
+++ b/components/strings/components_strings_gu.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">નીતિ કેશ ઑકે</translation>
 <translation id="113188000913989374"><ph name="SITE" /> આ કહે છે:</translation>
 <translation id="1132774398110320017">Chrome સ્વતઃભરણ સેટિંગ્સ...</translation>
+<translation id="113770840981343808">ચકાસણી માટે તમારા કાર્ડની આગળની બાજુ પરથી 4-અંકનો CVC દાખલ કરો</translation>
 <translation id="1146673768181266552">ક્રેશ ID <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">આ સર્વર સાબિત કરી શક્યું નથી કે તે <ph name="DOMAIN" /> છે; તેનું સુરક્ષા પ્રમાણપત્ર તમારા કમ્પ્યુટરની ઑપરેટિંગ સિસ્ટમ દ્વારા વિશ્વસનીય નથી. આ કોઈ ખોટી ગોઠવણીને કારણે થયું હશે અથવા કોઈ હુમલાખોર તમારા કનેક્શનને અટકાવી રહ્યો છે.</translation>
 <translation id="1152921474424827756"><ph name="URL" /> ની <ph name="BEGIN_LINK" />કેશ કરેલ કૉપિ<ph name="END_LINK" /> ઍક્સેસ કરો</translation>
@@ -117,7 +118,6 @@
 <translation id="2212735316055980242">નીતિ મળી નથી</translation>
 <translation id="2213606439339815911">પ્રવિષ્ટિઓનું આનયન કરી રહ્યાં છે...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> ઉપલબ્ધ નથી.</translation>
-<translation id="2227695659599072496">નેટવર્ક કેબલ અથવા રાઉટર તપાસીને</translation>
 <translation id="2230458221926704099"><ph name="BEGIN_LINK" />ડાયગ્નોસ્ટિક્સ ઍપ્લિકેશન<ph name="END_LINK" />નો ઉપયોગ કરીને તમારું કનેક્શન ઠીક કરો</translation>
 <translation id="225207911366869382">આ નીતિ માટે આ મૂલ્યને નાપસંદ કરેલું છે.</translation>
 <translation id="2262243747453050782">HTTP ભૂલ</translation>
@@ -130,6 +130,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> માટે વપરાશકર્તાનામ અને પાસવર્ડ આવશ્યક છે.</translation>
 <translation id="2328300916057834155"><ph name="ENTRY_INDEX" /> અનુક્રમણિકા પર અમાન્ય બુકમાર્ક અવગ્ણ્યો</translation>
 <translation id="2354001756790975382">અન્ય બુકમાર્ક્સ</translation>
+<translation id="2357783041215512127"><ph name="CREDIT_CARD" /> વડે ચુકવણી કરો</translation>
 <translation id="2359808026110333948">ચાલુ રાખો</translation>
 <translation id="2367567093518048410">સ્તર</translation>
 <translation id="237718015863234333">કોઈ UI વિકલ્પો ઉપલબ્ધ નથી</translation>
@@ -227,7 +228,6 @@
 <translation id="3254409185687681395">આ પૃષ્ઠને બુકમાર્ક કરો</translation>
 <translation id="3270847123878663523">&amp;પુનઃક્રમાંકિત કરવું પૂર્વવત્ કરો</translation>
 <translation id="3286538390144397061">હવે ફરીથી પ્રારંભ કરો</translation>
-<translation id="3288003805934695103">પૃષ્ઠ ફરીથી લોડ કરીને</translation>
 <translation id="3305707030755673451">તમારો ડેટા <ph name="TIME" /> ના રોજ તમારા સમન્વયન પાસફ્રેઝ સાથે એન્ક્રિપ્ટ કરવામાં આવ્યો હતો. સમન્વયન શરૂ કરવા માટે તે દાખલ કરો.</translation>
 <translation id="333371639341676808">આ પૃષ્ઠને વધારાનાં સંવાદો બનાવવાથી રોકો.</translation>
 <translation id="3340978935015468852">સેટિંગ્સ</translation>
@@ -299,7 +299,6 @@
 <translation id="3963721102035795474">રીડર મોડ</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> અવરોધિત છે</translation>
 <translation id="4021036232240155012">DNS એ નેટવર્ક સેવા છે કે જે વેબસાઇટના નામનો અનુવાદ તેના ઇન્ટરનેટ સરનામાં પર કરે છે.</translation>
-<translation id="4021376465026729077">તમારા એક્સ્ટેન્શન્સને અક્ષમ કરીને</translation>
 <translation id="4030383055268325496">&amp;ઉમેરવું પૂર્વવત્ કરો</translation>
 <translation id="4032534284272647190"><ph name="URL" /> ની ઍક્સેસ નકારાઈ. </translation>
 <translation id="404928562651467259">ચેતવણી</translation>
@@ -397,7 +396,6 @@
 <translation id="5251803541071282808">મેઘ</translation>
 <translation id="5299298092464848405">ભૂલ વિશ્લેષણ નીતિ</translation>
 <translation id="5300589172476337783">બતાવો</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />તમારી કૂકીઝને સાફ કરીને<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">ક્રેશની જાણ કરવાનું અક્ષમ કર્યું છે.</translation>
 <translation id="5317780077021120954">સાચવો</translation>
 <translation id="5327248766486351172">નામ</translation>
@@ -431,6 +429,7 @@
 <translation id="5629630648637658800">નીતિ સેટિંગ્સ લોડ કરવામાં નિષ્ફળ થયાં</translation>
 <translation id="5631439013527180824">અમાન્ય ઉપકરણ સંચાલન ટોકન</translation>
 <translation id="5650551054760837876">કોઈ શોધ પરિણામ મળ્યા નથી.</translation>
+<translation id="5663999524854166235">ચકાસણી માટે તમારા કાર્ડની પાછળની બાજુ પરથી 3-અંકનો CVC દાખલ કરો</translation>
 <translation id="5677928146339483299">અવરોધિત</translation>
 <translation id="5710435578057952990">આ વેબસાઇટની ઓળખ ચકાસવામાં આવી નથી.</translation>
 <translation id="5720705177508910913">વર્તમાન વપરાશકર્તા</translation>
@@ -503,7 +502,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> શોધ</translation>
 <translation id="6634865548447745291">તમે અત્યારે <ph name="SITE" /> ની મુલાકાત લઈ શકતાં નથી કારણ કે <ph name="BEGIN_LINK" />આ પ્રમાણપત્ર રદબાતલ કરવામાં આવ્યું છે<ph name="END_LINK" />. નેટવર્ક ભૂલો અને હુમલા સામાન્ય રીતે અસ્થાયી છે, તેથી આ પૃષ્ઠ સંભવિત રૂપે પછીથી કાર્ય કરશે.</translation>
 <translation id="6637478299472506933">ડાઉનલોડ નિષ્ફળ થયું</translation>
-<translation id="6642894344118208103">મોડેમ અથવા રાઉટર ફરીથી સેટ કરીને</translation>
 <translation id="6644283850729428850">આ નીતિ દૂર કરવામાં આવેલી છે.</translation>
 <translation id="6646897916597483132">તમારા કાર્ડની આગળની બાજુ પરથી 4-અંકનો CVC દાખલ કરો</translation>
 <translation id="6656103420185847513">ફોલ્ડર સંપાદિત કરો</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index 36b9aba..260f1f5 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">नीति संचय ठीक है</translation>
 <translation id="113188000913989374"><ph name="SITE" /> का कहना है:</translation>
 <translation id="1132774398110320017">Chrome स्‍वत:-भरण सेटिंग...</translation>
+<translation id="113770840981343808">सत्यापन के लिए अपने कार्ड के सामने की ओर दिया गया 4 अंकों वाला CVC डालें</translation>
 <translation id="1146673768181266552">क्रैश आईडी <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">यह सर्वर यह नहीं प्रमाणित कर सका कि यह <ph name="DOMAIN" /> है; इसका सुरक्षा प्रमाणपत्र आपके कंप्यूटर के ऑपरेटिंग सिस्टम द्वारा विश्वसनीय नहीं है. ऐसा गलत कॉन्फ़िगरेशन या किसी आक्रमणकर्ता द्वारा आपके कनेक्शन में अवरोध डालने के कारण हो सकता है.</translation>
 <translation id="1152921474424827756"><ph name="URL" /> की <ph name="BEGIN_LINK" />संचित प्रति<ph name="END_LINK" /> एक्सेस करें</translation>
@@ -116,7 +117,6 @@
 <translation id="2212735316055980242">नीति नहीं मिली</translation>
 <translation id="2213606439339815911">प्रविष्टियां फ़ेच की जा रही हैं...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> उपलब्ध नहीं है</translation>
-<translation id="2227695659599072496">नेटवर्क केबल या राउटर की जांच करें</translation>
 <translation id="2230458221926704099"><ph name="BEGIN_LINK" />निदान ऐप्लिकेशन<ph name="END_LINK" /> का उपयोग करके अपने कनेक्शन को ठीक करें</translation>
 <translation id="225207911366869382">यह मान इस नीति के लिए हटा दिया गया है.</translation>
 <translation id="2262243747453050782">HTTP त्रुटि</translation>
@@ -129,6 +129,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> के लिए उपयोगकर्ता नाम और पासवर्ड आवश्यक है.</translation>
 <translation id="2328300916057834155"><ph name="ENTRY_INDEX" /> अनुक्रमणिका पर अमान्य बुकमार्क को अनदेखा किया गया</translation>
 <translation id="2354001756790975382">अन्य बुकमार्क</translation>
+<translation id="2357783041215512127"><ph name="CREDIT_CARD" /> से भुगतान करें</translation>
 <translation id="2359808026110333948">जारी रखें</translation>
 <translation id="2367567093518048410">स्तर</translation>
 <translation id="237718015863234333">कोई UI विकल्प उपलब्ध नहीं है</translation>
@@ -226,7 +227,6 @@
 <translation id="3254409185687681395">इस पृष्ठ को बुकमार्क करें</translation>
 <translation id="3270847123878663523">&amp;पुन: क्रमित करना वापस लाएं</translation>
 <translation id="3286538390144397061">अभी फिर से प्रारंभ करें</translation>
-<translation id="3288003805934695103">पृष्ठ को पुनः लोड करें</translation>
 <translation id="3305707030755673451">आपका डेटा आपके समन्वयन पासफ़्रेज़ के साथ <ph name="TIME" /> को एन्क्रिप्ट किया गया था. समन्वयन शुरू करने के लिए इसे डालें.</translation>
 <translation id="333371639341676808">इस पृष्ठ को अतिरिक्त ब्लॉग बनाने से रोकें.</translation>
 <translation id="3340978935015468852">सेटिंग</translation>
@@ -298,7 +298,6 @@
 <translation id="3963721102035795474">रीडर मोड</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> अवरुद्ध है</translation>
 <translation id="4021036232240155012">DNS एक नेटवर्क सेवा है जो किसी वेबसाइट के नाम को उसके इंटरनेट पते में बदलती है.</translation>
-<translation id="4021376465026729077">अपने एक्सटेंशन अक्षम करें</translation>
 <translation id="4030383055268325496">&amp;जोड़ना वापस लाएं</translation>
 <translation id="4032534284272647190"><ph name="URL" /> पर पहुंच अस्वीकृत.</translation>
 <translation id="404928562651467259">चेतावनी</translation>
@@ -396,7 +395,6 @@
 <translation id="5251803541071282808">क्लाउड</translation>
 <translation id="5299298092464848405">नीति पार्स करने में त्रुटि</translation>
 <translation id="5300589172476337783">दिखाएं</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />अपनी कुकी साफ़ करें<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">क्रैश की रिपोर्ट करना अक्षम कर दिया गया है.</translation>
 <translation id="5317780077021120954">सहेजें</translation>
 <translation id="5327248766486351172">नाम</translation>
@@ -430,6 +428,7 @@
 <translation id="5629630648637658800">नीति सेटिंग लोड करने में विफल</translation>
 <translation id="5631439013527180824">अमान्य डिवाइस प्रबंधन टोकन</translation>
 <translation id="5650551054760837876">कोई खोज परिणाम नहीं मिले.</translation>
+<translation id="5663999524854166235">सत्यापन के लिए अपने कार्ड के पीछे की ओर दिया गया 3 अंकों वाला CVC डालें</translation>
 <translation id="5677928146339483299">अवरोधित</translation>
 <translation id="5710435578057952990">इस वेबसाइट की पहचान सत्यापित नहीं की गई है.</translation>
 <translation id="5720705177508910913">वर्तमान उपयोगकर्ता</translation>
@@ -502,7 +501,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> खोज</translation>
 <translation id="6634865548447745291">आप इस समय <ph name="SITE" /> पर विज़िट नहीं कर सकते क्योंकि <ph name="BEGIN_LINK" />यह प्रमाणपत्र निरस्त कर दिया गया है<ph name="END_LINK" />. नेटवर्क की त्रुटियां और हमले आमतौर पर अस्थायी होते हैं, इसलिए संभवत: पृष्ठ बाद में काम करने लगेगा.</translation>
 <translation id="6637478299472506933">डाउनलोड विफल</translation>
-<translation id="6642894344118208103">मॉडेम या राउटर रीसेट करें</translation>
 <translation id="6644283850729428850">यह नीति हटा दी गई है.</translation>
 <translation id="6646897916597483132">अपने कार्ड के सामने की ओर दिया गया 4 अंकों वाला CVC डालें</translation>
 <translation id="6656103420185847513">फ़ोल्‍डर संपादित करें</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb
index 1aad80d..346bf02 100644
--- a/components/strings/components_strings_hr.xtb
+++ b/components/strings/components_strings_hr.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Predmemorija pravila ispravna je</translation>
 <translation id="113188000913989374"><ph name="SITE" /> navodi sljedeće:</translation>
 <translation id="1132774398110320017">Postavke Automatskog popunjavanja u Chromeu...</translation>
+<translation id="113770840981343808">Unesite četveroznamenkasti CVC s prednje strane kartice radi potvrde</translation>
 <translation id="1146673768181266552">ID rušenja <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Poslužitelj nije mogao dokazati da je <ph name="DOMAIN" />; operativni sustav vašeg računala smatra da njegov sigurnosni certifikat nije pouzdan. To može biti uzrokovano pogrešnom konfiguracijom ili napadom na vašu vezu.</translation>
 <translation id="1152921474424827756">Pristupite <ph name="BEGIN_LINK" />predmemoriranoj kopiji<ph name="END_LINK" /> stranice <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Pravilo nije pronađeno</translation>
 <translation id="2213606439339815911">Dohvaćanje unosa...</translation>
 <translation id="2214283295778284209">Web lokacija <ph name="SITE" /> nije dostupna</translation>
-<translation id="2227695659599072496">provjerite mrežni kabel ili usmjerivač</translation>
 <translation id="2230458221926704099">Riješite problem s povezivanjem pomoću <ph name="BEGIN_LINK" />dijagnostičke aplikacije<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Ta je vrijednost obustavljena za to pravilo.</translation>
 <translation id="2262243747453050782">HTTP pogreška</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> zahtijeva korisničko ime i zaporku.</translation>
 <translation id="2328300916057834155">Zanemarena nevažeća oznaka u indeksu <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Druge oznake</translation>
+<translation id="2357783041215512127">Platite karticom <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Nastavi</translation>
 <translation id="2367567093518048410">Razina</translation>
 <translation id="237718015863234333">Nema zamjenskih korisničkih sučelja</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Označi ovu stranicu</translation>
 <translation id="3270847123878663523">&amp;Poništi promjenu rasporeda</translation>
 <translation id="3286538390144397061">Ponovo pokreni sad</translation>
-<translation id="3288003805934695103">ponovo učitajte stranicu</translation>
 <translation id="3305707030755673451">Vaši su podaci šifrirani vašom šifrom za sinkronizaciju <ph name="TIME" />. Unesite je da biste pokrenuli sinkronizaciju.</translation>
 <translation id="333371639341676808">Spriječite ovu stranicu od stvaranja dodatnih dijaloga.</translation>
 <translation id="3340978935015468852">postavke</translation>
@@ -299,7 +299,6 @@
 <translation id="3963721102035795474">Način čitača</translation>
 <translation id="3973234410852337861">Host <ph name="HOST_NAME" /> je blokiran</translation>
 <translation id="4021036232240155012">DNS je mrežna usluga koja prevodi naziv web-lokacije u njezinu internetsku adresu.</translation>
-<translation id="4021376465026729077">onemogućite proširenja</translation>
 <translation id="4030383055268325496">&amp;Poništi dodavanje</translation>
 <translation id="4032534284272647190">Odbijen je pristup na <ph name="URL" />.</translation>
 <translation id="404928562651467259">UPOZORENJE</translation>
@@ -397,7 +396,6 @@
 <translation id="5251803541071282808">Oblak</translation>
 <translation id="5299298092464848405">Pogreška u pravilu analize</translation>
 <translation id="5300589172476337783">Prikaži</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />izbrišite kolačiće<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Onemogućeno je izvješćivanje o padu.</translation>
 <translation id="5317780077021120954">Spremi</translation>
 <translation id="5327248766486351172">Naziv</translation>
@@ -431,6 +429,7 @@
 <translation id="5629630648637658800">Učitavanje postavki pravila nije uspjelo</translation>
 <translation id="5631439013527180824">Token za upravljanje uređajem nije važeći</translation>
 <translation id="5650551054760837876">Nisu pronađeni rezultati pretraživanja.</translation>
+<translation id="5663999524854166235">Unesite troznamenkasti CVC sa stražnje strane kartice radi potvrde</translation>
 <translation id="5677928146339483299">Blokirano</translation>
 <translation id="5710435578057952990">Identitet ove web lokacije nije ovjeren.</translation>
 <translation id="5720705177508910913">Trenutačni korisnik:</translation>
@@ -503,7 +502,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> Pretraživanje</translation>
 <translation id="6634865548447745291">Trenutačno ne možete posjetiti <ph name="SITE" /> jer je <ph name="BEGIN_LINK" />taj certifikat opozvan<ph name="END_LINK" />. Mrežne pogreške i napadi uglavnom su privremeni i ta bi stranica kasnije trebala funkcionirati.</translation>
 <translation id="6637478299472506933">Preuzimanje nije uspjelo</translation>
-<translation id="6642894344118208103">ponovo pokrenite modem ili usmjerivač</translation>
 <translation id="6644283850729428850">Ovo je pravilo zastarjelo.</translation>
 <translation id="6646897916597483132">Unesite četveroznamenkasti CVC s prednje strane kartice</translation>
 <translation id="6656103420185847513">Uređivanje mape</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb
index 9547f6d..99a8bc3 100644
--- a/components/strings/components_strings_hu.xtb
+++ b/components/strings/components_strings_hu.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Irányelv-gyorsítótár OK</translation>
 <translation id="113188000913989374">A(z) <ph name="SITE" /> közlendője:</translation>
 <translation id="1132774398110320017">A Chrome Automatikus kitöltési beállításai…</translation>
+<translation id="113770840981343808">Adja meg a kártya elején szereplő négyjegyű CVC-kódot az ellenőrzéshez</translation>
 <translation id="1146673768181266552"><ph name="CRASH_ID" /> összeomlás-azonosító (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">A szerver nem tudta bizonyítani, hogy valóban a(z) <ph name="DOMAIN" /> domainbe tartozik; biztonsági tanúsítványa az Ön számítógépének operációs rendszere szerint nem megbízható. Ennek oka lehet konfigurációs hiba, vagy hogy egy támadó eltérítette az Ön kapcsolódását.</translation>
 <translation id="1152921474424827756">A(z) <ph name="URL" /> egy <ph name="BEGIN_LINK" />tárolt változatának<ph name="END_LINK" /> megtekintése</translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Nem találhatók irányelvek</translation>
 <translation id="2213606439339815911">Bejegyzések lekérése...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> nem érhető el</translation>
-<translation id="2227695659599072496">A hálózati kábel vagy router ellenőrzése</translation>
 <translation id="2230458221926704099">Javítsa meg kapcsolatát a <ph name="BEGIN_LINK" />diagnosztikai alkalmazás<ph name="END_LINK" /> segítségével</translation>
 <translation id="225207911366869382">Ez az érték elavult ennél a házirendnél.</translation>
 <translation id="2262243747453050782">HTTP hiba</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535">A(z) <ph name="DOMAIN" /> felhasználónevet és jelszót kér.</translation>
 <translation id="2328300916057834155">Mellőzött érvénytelen könyvjelző a(z) <ph name="ENTRY_INDEX" />. indexnél</translation>
 <translation id="2354001756790975382">További könyvjelzők</translation>
+<translation id="2357783041215512127">Fizetés a(z) <ph name="CREDIT_CARD" /> kártyával</translation>
 <translation id="2359808026110333948">Folytatás</translation>
 <translation id="2367567093518048410">Szint</translation>
 <translation id="237718015863234333">Nincsenek alternatív kezelőfelületek</translation>
@@ -226,7 +227,6 @@
 <translation id="3254409185687681395">Könyvjelző hozzáadása ehhez az oldalhoz</translation>
 <translation id="3270847123878663523">&amp;Átrendezés visszavonása</translation>
 <translation id="3286538390144397061">Újraindítás most</translation>
-<translation id="3288003805934695103">Az oldal frissítése</translation>
 <translation id="3305707030755673451">Adatainak titkosítása megtörtént összetett szinkronizálási jelszavával a következő időpontban: <ph name="TIME" />. Adja meg a jelszót a szinkronizálás megkezdéséhez.</translation>
 <translation id="333371639341676808">Ez az oldal ne nyisson meg további párbeszédablakokat.</translation>
 <translation id="3340978935015468852">beállítások</translation>
@@ -298,7 +298,6 @@
 <translation id="3963721102035795474">Olvasási mód</translation>
 <translation id="3973234410852337861">A(z) <ph name="HOST_NAME" /> le van tiltva</translation>
 <translation id="4021036232240155012">A DNS az a hálózati szolgáltatás, amely a webhelynevet az adott webhely internetes címére fordítja le.</translation>
-<translation id="4021376465026729077">A bővítmények letiltása</translation>
 <translation id="4030383055268325496">&amp;Hozzáadás visszavonása</translation>
 <translation id="4032534284272647190">Hozzáférés a(z) <ph name="URL" /> URL-hez megtagadva.</translation>
 <translation id="404928562651467259">FIGYELMEZTETÉS</translation>
@@ -396,7 +395,6 @@
 <translation id="5251803541071282808">Felhő</translation>
 <translation id="5299298092464848405">Irányelv-előfeldolgozási hiba</translation>
 <translation id="5300589172476337783">Megjelenítés</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />A cookie-k törlése<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">A hibabejelentés ki van kapcsolva.</translation>
 <translation id="5317780077021120954">Mentés</translation>
 <translation id="5327248766486351172">Név</translation>
@@ -430,6 +428,7 @@
 <translation id="5629630648637658800">Az irányelv-beállítások betöltése sikertelen</translation>
 <translation id="5631439013527180824">Érvénytelen eszközkezelési token</translation>
 <translation id="5650551054760837876">Nincs találat</translation>
+<translation id="5663999524854166235">Adja meg a kártya hátoldalán szereplő háromjegyű CVC-kódot az ellenőrzéshez</translation>
 <translation id="5677928146339483299">Letiltva</translation>
 <translation id="5710435578057952990">A webhely valódiságát nem ellenőriztük.</translation>
 <translation id="5720705177508910913">Jelenlegi felhasználó</translation>
@@ -501,7 +500,6 @@
 <translation id="6628463337424475685">Keresés: <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">Pillanatnyilag nem tudja felkeresni a(z) <ph name="SITE" /> webhelyet, mert <ph name="BEGIN_LINK" />ezt a tanúsítványt visszavonták<ph name="END_LINK" />. A hálózati hibák és támadások rendszerint átmenetiek, ezért az említett oldal később valószínűleg már működni fog.</translation>
 <translation id="6637478299472506933">Letöltés sikertelen</translation>
-<translation id="6642894344118208103">A modem vagy router újraindítása</translation>
 <translation id="6644283850729428850">Ez a házirend már elavult.</translation>
 <translation id="6646897916597483132">Adja meg a kártya elején szereplő négyjegyű CVC-kódot</translation>
 <translation id="6656103420185847513">Mappa szerkesztése</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb
index 167dfcd..20407b0 100644
--- a/components/strings/components_strings_id.xtb
+++ b/components/strings/components_strings_id.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Cache kebijakan Oke</translation>
 <translation id="113188000913989374"><ph name="SITE" /> menyatakan:</translation>
 <translation id="1132774398110320017">Setelan IsiOtomatis Chrome...</translation>
+<translation id="113770840981343808">Masukkan 4 digit CVC dari bagian depan kartu Anda untuk verifikasi</translation>
 <translation id="1146673768181266552">ID Kerusakan <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Server ini tidak dapat membuktikan bahwa ini adalah <ph name="DOMAIN" />; sertifikat keamanannya tidak dipercaya oleh sistem operasi komputer Anda. Hal ini dapat disebabkan oleh kesalahan konfigurasi atau penyerang memotong sambungan Anda.</translation>
 <translation id="1152921474424827756">Akses <ph name="BEGIN_LINK" />salinan yang disimpan dalam cache<ph name="END_LINK" /> dari <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Kebijakan tidak ditemukan</translation>
 <translation id="2213606439339815911">Mengambil entri...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> tidak tersedia</translation>
-<translation id="2227695659599072496">Memeriksa router atau kabel jaringan</translation>
 <translation id="2230458221926704099">Perbaiki sambungan menggunakan <ph name="BEGIN_LINK" />aplikasi diagnosis<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Nilai ini sudah usang untuk kebijakan ini.</translation>
 <translation id="2262243747453050782">Kesalahan HTTP</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> memerlukan nama pengguna dan sandi.</translation>
 <translation id="2328300916057834155">Mengabaikan bookmark tidak valid di indeks <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Bookmark lain</translation>
+<translation id="2357783041215512127">Bayar dengan <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Lanjut</translation>
 <translation id="2367567093518048410">Tingkat</translation>
 <translation id="237718015863234333">Tidak tersedia alternatif UI</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Bookmark laman ini</translation>
 <translation id="3270847123878663523">&amp;Urungkan Pengaturan Ulang</translation>
 <translation id="3286538390144397061">Mulai Ulang Sekarang</translation>
-<translation id="3288003805934695103">Memuat ulang laman</translation>
 <translation id="3305707030755673451">Data Anda dienkripsi dengan frasa sandi sinkronisasi pada tanggal <ph name="TIME" />. Masukkan frasa sandi untuk memulai sinkronisasi.</translation>
 <translation id="333371639341676808">Cegah dialog lain dari laman ini.</translation>
 <translation id="3340978935015468852">setelan</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">Mode Pembaca</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> diblokir.</translation>
 <translation id="4021036232240155012">DNS adalah layanan jaringan yang menerjemahkan nama situs web ke alamat Internet-nya.</translation>
-<translation id="4021376465026729077">Nonaktifkan ekstensi</translation>
 <translation id="4030383055268325496">&amp;Urungkan penambahan</translation>
 <translation id="4032534284272647190">Akses ke <ph name="URL" /> ditolak.</translation>
 <translation id="404928562651467259">PERINGATAN</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Awan</translation>
 <translation id="5299298092464848405">Kebijakan kesalahan penguraian</translation>
 <translation id="5300589172476337783">Tampilkan</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Hapus cookie<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Pelaporan kondisi ngadat dinonaktifkan.</translation>
 <translation id="5317780077021120954">Simpan</translation>
 <translation id="5327248766486351172">Nama</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">Gagal memuat setelan kebijakan</translation>
 <translation id="5631439013527180824">Token pengelolaan perangkat tidak valid</translation>
 <translation id="5650551054760837876">Tak ada hasil penelusuran yang ditemukan.</translation>
+<translation id="5663999524854166235">Masukkan 3 digit CVC dari bagian belakang kartu untuk verifikasi</translation>
 <translation id="5677928146339483299">Dicekal</translation>
 <translation id="5710435578057952990">Identitas situs Web ini belum diverifikasi.</translation>
 <translation id="5720705177508910913">Pengguna saat ini</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> Penelusuran</translation>
 <translation id="6634865548447745291">Saat ini, Anda tidak dapat mengunjungi <ph name="SITE" /> karena <ph name="BEGIN_LINK" />sertifikat ini telah dicabut<ph name="END_LINK" />. Kesalahan jaringan dan serangan biasanya bersifat sementara, jadi laman ini mungkin akan bekerja nanti.</translation>
 <translation id="6637478299472506933">Unduhan Gagal</translation>
-<translation id="6642894344118208103">Setel ulang modem atau router</translation>
 <translation id="6644283850729428850">Kebijakan ini telah usang.</translation>
 <translation id="6646897916597483132">Masukkan 4 digit CVC di depan kartu Anda</translation>
 <translation id="6656103420185847513">Edit Folder</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb
index d3d1180..5158694b 100644
--- a/components/strings/components_strings_it.xtb
+++ b/components/strings/components_strings_it.xtb
@@ -18,6 +18,7 @@
 <translation id="112840717907525620">Cache dei criteri integra</translation>
 <translation id="113188000913989374"><ph name="SITE" /> dice:</translation>
 <translation id="1132774398110320017">Impostazioni di Compilazione automatica Chrome...</translation>
+<translation id="113770840981343808">Per la verifica, inserisci il codice CVC di quattro cifre indicato sulla parte anteriore della carta.</translation>
 <translation id="1146673768181266552">ID arresto anomalo <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Questo server non è riuscito a dimostrare che si tratta di <ph name="DOMAIN" />; il relativo certificato di sicurezza non è considerato attendibile dal sistema operativo del computer. Il problema potrebbe essere dovuto a un'errata configurazione o a un malintenzionato che intercetta la connessione.</translation>
 <translation id="1152921474424827756">Accedi a una <ph name="BEGIN_LINK" />copia memorizzata nella cache<ph name="END_LINK" /> di <ph name="URL" /></translation>
@@ -112,7 +113,6 @@
 <translation id="2212735316055980242">Criterio non trovato</translation>
 <translation id="2213606439339815911">Recupero voci...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> non disponibile</translation>
-<translation id="2227695659599072496">Controllare il router o il cavo di rete</translation>
 <translation id="2230458221926704099">Correggi la connessione con l'<ph name="BEGIN_LINK" />app diagnostica<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Il valore specificato per la norma è obsoleto.</translation>
 <translation id="2262243747453050782">Errore HTTP</translation>
@@ -125,6 +125,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> richiede un nome utente e una password.</translation>
 <translation id="2328300916057834155">Preferito non valido dell'indice <ph name="ENTRY_INDEX" /> ignorato</translation>
 <translation id="2354001756790975382">Altri Preferiti</translation>
+<translation id="2357783041215512127">Paga con <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Continua</translation>
 <translation id="2367567093518048410">Livello</translation>
 <translation id="237718015863234333">Nessuna alternativa UI disponibile</translation>
@@ -215,7 +216,6 @@
 <translation id="3254409185687681395">Aggiungi ai Preferiti</translation>
 <translation id="3270847123878663523">&amp;Annulla ridisposizione</translation>
 <translation id="3286538390144397061">Riavvia adesso</translation>
-<translation id="3288003805934695103">Ricaricare la pagina</translation>
 <translation id="3305707030755673451">I tuoi dati sono stati crittografati con la tua passphrase di sincronizzazione in data <ph name="TIME" />. Inseriscila per avviare la sincronizzazione.</translation>
 <translation id="333371639341676808">Impedisci alla pagina di creare altre finestre di dialogo.</translation>
 <translation id="3340978935015468852">impostazioni</translation>
@@ -287,7 +287,6 @@
 <translation id="3963721102035795474">Modalità Reader</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> è bloccato</translation>
 <translation id="4021036232240155012">DNS è il servizio di rete che traduce il nome di un sito web nel relativo indirizzo Internet.</translation>
-<translation id="4021376465026729077">Disattivare le estensioni</translation>
 <translation id="4030383055268325496">&amp;Annulla aggiunta</translation>
 <translation id="4032534284272647190">Accesso a <ph name="URL" /> negato.</translation>
 <translation id="404928562651467259">AVVISO</translation>
@@ -385,7 +384,6 @@
 <translation id="5251803541071282808">Cloud</translation>
 <translation id="5299298092464848405">Errore durante l'analisi del criterio</translation>
 <translation id="5300589172476337783">Mostra</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Cancellare i cookie<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">La segnalazione degli arresti anomali è disattivata.</translation>
 <translation id="5317780077021120954">Salva</translation>
 <translation id="5327248766486351172">Nome</translation>
@@ -419,6 +417,7 @@
 <translation id="5629630648637658800">Caricamento delle impostazioni criterio non riuscito</translation>
 <translation id="5631439013527180824">Token di gestione del dispositivo non valido</translation>
 <translation id="5650551054760837876">Nessun risultato di ricerca trovato.</translation>
+<translation id="5663999524854166235">Per la verifica, inserisci il codice CVC di tre cifre indicato sul retro della carta.</translation>
 <translation id="5677928146339483299">Bloccati</translation>
 <translation id="5710435578057952990">L'identità di questo sito web non è stata verificata.</translation>
 <translation id="5720705177508910913">Utente corrente</translation>
@@ -489,7 +488,6 @@
 <translation id="6628463337424475685">Ricerca <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">Al momento non puoi visitare il sito <ph name="SITE" /> perché <ph name="BEGIN_LINK" />questo certificato è stato revocato<ph name="END_LINK" />. In genere gli errori di rete e gli attacchi sono temporanei, pertanto questa pagina potrebbe funzionare più tardi.</translation>
 <translation id="6637478299472506933">Download non riuscito</translation>
-<translation id="6642894344118208103">Ripristinare il modem o router</translation>
 <translation id="6644283850729428850">Questa norma è obsoleta.</translation>
 <translation id="6646897916597483132">Inserisci il codice CVC di quattro cifre indicato sulla parte anteriore della carta</translation>
 <translation id="6656103420185847513">Modifica cartella</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb
index ae03a884..3fa74ed 100644
--- a/components/strings/components_strings_iw.xtb
+++ b/components/strings/components_strings_iw.xtb
@@ -20,6 +20,7 @@
 <translation id="112840717907525620">הקובץ השמור של המדיניות תקין</translation>
 <translation id="113188000913989374"><ph name="SITE" /> אומר:</translation>
 <translation id="1132774398110320017">‏הגדרות מילוי אוטומטי של Chrome...</translation>
+<translation id="113770840981343808">הזן את קוד האימות בן ארבע הספרות המופיע בחזית הכרטיס כדי לאמת</translation>
 <translation id="1146673768181266552">מזהה קריסה <ph name="CRASH_ID" /> ‏(<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">השרת הזה לא הצליח להוכיח שהוא <ph name="DOMAIN" />. אישור האבטחה שלו לא נחשב כמהימן על ידי מערכת ההפעלה של המחשב. ייתכן שהסיבה לכך היא תצורה שגויה או תוקף המיירט את החיבור שלך.</translation>
 <translation id="1152921474424827756">גש אל <ph name="BEGIN_LINK" />עותק בקובץ שמור<ph name="END_LINK" /> של <ph name="URL" /></translation>
@@ -117,7 +118,6 @@
 <translation id="2212735316055980242">לא נמצאה מדיניות</translation>
 <translation id="2213606439339815911">מאחזר רשומות...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> אינו זמין</translation>
-<translation id="2227695659599072496">לבדוק את כבל הרשת או הנתב</translation>
 <translation id="2230458221926704099">תקן את החיבור באמצעות <ph name="BEGIN_LINK" />אפליקציית הבדיקה<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">ערך זה הוצא משימוש עבור מדיניות זו.</translation>
 <translation id="2262243747453050782">‏שגיאת HTTP</translation>
@@ -130,6 +130,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> דורש שם משתמש וסיסמה.</translation>
 <translation id="2328300916057834155">המערכת התעלמה מסימניה לא חוקית באינדקס <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">סימניות אחרות</translation>
+<translation id="2357783041215512127">שלם באמצעות <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">המשך</translation>
 <translation id="2367567093518048410">רמה</translation>
 <translation id="237718015863234333">אין חלופות זמינות עבור ממשק המשתמש</translation>
@@ -227,7 +228,6 @@
 <translation id="3254409185687681395">הוסף את הדף לסימניות</translation>
 <translation id="3270847123878663523">&amp;ביטול של שינוי סדר</translation>
 <translation id="3286538390144397061">הפעל מחדש כעת</translation>
-<translation id="3288003805934695103">לטעון מחדש את הדף</translation>
 <translation id="3305707030755673451">הנתונים שלך הוצפנו ב-<ph name="TIME" /> באמצעות ביטוי הסיסמה לסינכרון. הזן אותו כדי להתחיל בסינכרון.</translation>
 <translation id="333371639341676808">מנע מדף זה ליצור דיאלוגים נוספים.</translation>
 <translation id="3340978935015468852">הגדרות</translation>
@@ -302,7 +302,6 @@
 <translation id="3963721102035795474">מצב קורא</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> חסום</translation>
 <translation id="4021036232240155012">‏DNS הוא שירות הרשת שמתרגם שם של אתר לכתובת האינטרנט שלו.</translation>
-<translation id="4021376465026729077">להשבית את התוספים</translation>
 <translation id="4030383055268325496">&amp;ביטול הוספה</translation>
 <translation id="4032534284272647190">הגישה אל <ph name="URL" /> נדחתה.</translation>
 <translation id="404928562651467259">אזהרה</translation>
@@ -404,7 +403,6 @@
 <translation id="5251803541071282808">ענן</translation>
 <translation id="5299298092464848405">שגיאה בניתוח המדיניות</translation>
 <translation id="5300589172476337783">הצג</translation>
-<translation id="5307361445257083764">‏<ph name="BEGIN_LINK" />לנקות את קובצי ה-Cookie<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">דיווח קריסות מושבת.</translation>
 <translation id="5317780077021120954">שמור</translation>
 <translation id="5327248766486351172">שם</translation>
@@ -439,6 +437,7 @@
 <translation id="5629630648637658800">טעינת הגדרות המדיניות נכשלה</translation>
 <translation id="5631439013527180824">אסימון ניהול המכשיר אינו חוקי</translation>
 <translation id="5650551054760837876">לא נמצאו תוצאות חיפוש.</translation>
+<translation id="5663999524854166235">הזן את קוד האימות בן שלוש הספרות המופיע בצידו האחורי של הכרטיס כדי לאמת</translation>
 <translation id="5677928146339483299">במצב חסום</translation>
 <translation id="5710435578057952990">הזהות של אתר זה לא אומתה.</translation>
 <translation id="5720705177508910913">משתמש נוכחי:</translation>
@@ -511,7 +510,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> חיפוש</translation>
 <translation id="6634865548447745291">לא ניתן לבקר כעת באתר <ph name="SITE" /> מכיוון ש<ph name="BEGIN_LINK" />פג התוקף של אישור זה<ph name="END_LINK" />. שגיאות רשת ותקיפות מתרחשות בדרך כלל לזמן מוגבל, כך שסביר להניח שדף זה יפעל מאוחר יותר.</translation>
 <translation id="6637478299472506933">ההורדה נכשלה</translation>
-<translation id="6642894344118208103">לאפס את המודם או את הנתב</translation>
 <translation id="6644283850729428850">מדיניות זו אינה בתוקף.</translation>
 <translation id="6646897916597483132">‏הזן את ה-CVC בן ארבע הספרות המופיע בחזית הכרטיס</translation>
 <translation id="6656103420185847513">ערוך תיקייה</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb
index bb60a67..91d13c1 100644
--- a/components/strings/components_strings_ja.xtb
+++ b/components/strings/components_strings_ja.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">ポリシー キャッシュは正常です</translation>
 <translation id="113188000913989374"><ph name="SITE" /> の内容:</translation>
 <translation id="1132774398110320017">Chrome の自動入力設定...</translation>
+<translation id="113770840981343808">確認のため、カードの表側に記載されている 4 桁の CVC を入力してください</translation>
 <translation id="1146673768181266552">クラッシュ ID <ph name="CRASH_ID" />(<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">このサーバーが <ph name="DOMAIN" /> であることを確認できませんでした。このサーバーのセキュリティ証明書は、ご使用のパソコンのオペレーティング システムによって信頼されているものではありません。原因としては、不適切な設定や、悪意のあるユーザーによる接続妨害が考えられます。</translation>
 <translation id="1152921474424827756"><ph name="URL" /> の<ph name="BEGIN_LINK" />キャッシュ コピー<ph name="END_LINK" />にアクセスします</translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">ポリシーが見つかりません</translation>
 <translation id="2213606439339815911">エントリを取得しています...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> に接続できません</translation>
-<translation id="2227695659599072496">ネットワーク ケーブルまたはルーターを確認する</translation>
 <translation id="2230458221926704099"><ph name="BEGIN_LINK" />診断アプリ<ph name="END_LINK" />を使用して接続を修正してください</translation>
 <translation id="225207911366869382">この値は、このポリシーではサポートが終了しています。</translation>
 <translation id="2262243747453050782">HTTP エラーです</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> にはユーザー名とパスワードが必要です。</translation>
 <translation id="2328300916057834155">インデックス <ph name="ENTRY_INDEX" /> の無効なブックマークを無視しました</translation>
 <translation id="2354001756790975382">その他のブックマーク</translation>
+<translation id="2357783041215512127"><ph name="CREDIT_CARD" /> でのお支払い</translation>
 <translation id="2359808026110333948">続行</translation>
 <translation id="2367567093518048410">レベル</translation>
 <translation id="237718015863234333">代替ユーザーインターフェースはありません</translation>
@@ -227,7 +228,6 @@
 <translation id="3254409185687681395">このページをブックマークに追加します</translation>
 <translation id="3270847123878663523">順序変更の取り消し(&amp;U)</translation>
 <translation id="3286538390144397061">今すぐ再起動</translation>
-<translation id="3288003805934695103">ページを再読み込みする</translation>
 <translation id="3305707030755673451">データは <ph name="TIME" /> に同期パスフレーズで暗号化されました。同期を開始するには、同期パスフレーズを入力してください。</translation>
 <translation id="333371639341676808">このページでこれ以上ダイアログボックスを生成しない</translation>
 <translation id="3340978935015468852">設定</translation>
@@ -299,7 +299,6 @@
 <translation id="3963721102035795474">リーダーモード</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> はブロックされています</translation>
 <translation id="4021036232240155012">DNS はウェブサイトの名前をインターネット アドレスに変換するネットワーク サービスです。</translation>
-<translation id="4021376465026729077">拡張機能を無効にする</translation>
 <translation id="4030383055268325496">追加の取り消し(&amp;U)</translation>
 <translation id="4032534284272647190"><ph name="URL" /> へのアクセスが拒否されました。</translation>
 <translation id="404928562651467259">警告</translation>
@@ -397,7 +396,6 @@
 <translation id="5251803541071282808">クラウド</translation>
 <translation id="5299298092464848405">ポリシーの解析中にエラーが発生しました</translation>
 <translation id="5300589172476337783">表示</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Cookie を消去する<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">障害レポートが無効になっています。</translation>
 <translation id="5317780077021120954">保存</translation>
 <translation id="5327248766486351172">名前</translation>
@@ -431,6 +429,7 @@
 <translation id="5629630648637658800">ポリシー設定を読み込めませんでした</translation>
 <translation id="5631439013527180824">無効なデバイス管理トークンです</translation>
 <translation id="5650551054760837876">一致する情報はありません。</translation>
+<translation id="5663999524854166235">確認のため、カードの裏面に記載されている 3 桁の CVC を入力してください</translation>
 <translation id="5677928146339483299">ブロック</translation>
 <translation id="5710435578057952990">このウェブサイトの ID は確認されていません。</translation>
 <translation id="5720705177508910913">現在のユーザー</translation>
@@ -503,7 +502,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> 検索</translation>
 <translation id="6634865548447745291"><ph name="BEGIN_LINK" />証明書が取り消されている<ph name="END_LINK" />ため、現在 <ph name="SITE" /> にアクセスできません。通常、ネットワーク エラーや不正な操作は一時的なものです。少し時間をおくと、またページにアクセスできるようになる可能性があります。</translation>
 <translation id="6637478299472506933">ダウンロードの失敗</translation>
-<translation id="6642894344118208103">モデムまたはルーターをリセットする</translation>
 <translation id="6644283850729428850">このポリシーは廃止されました。</translation>
 <translation id="6646897916597483132">カードの表側に記載されている 4 桁の CVC を入力します</translation>
 <translation id="6656103420185847513">フォルダの編集</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb
index 8fb4a2e..1be7f97f 100644
--- a/components/strings/components_strings_kn.xtb
+++ b/components/strings/components_strings_kn.xtb
@@ -20,6 +20,7 @@
 <translation id="112840717907525620">ನೀತಿಯ ಸಂಗ್ರಹ ಸರಿಯಾಗಿದೆ</translation>
 <translation id="113188000913989374"><ph name="SITE" /> ಹೀಗೆ ಹೇಳುತ್ತದೆ:</translation>
 <translation id="1132774398110320017">Chrome ಸ್ವಯಂತುಂಬುವಿಕೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳು...</translation>
+<translation id="113770840981343808">ಪರಿಶೀಲನೆಗಾಗಿ ನಿಮ್ಮ ಕಾರ್ಡ್ ಮುಂಭಾಗದಲ್ಲಿರುವ 4-ಅಂಕಿ CVC ಅನ್ನು ನಮೂದಿಸಿ</translation>
 <translation id="1146673768181266552">ಕ್ರ್ಯಾಷ್ ID <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">ಈ ಸರ್ವರ್ <ph name="DOMAIN" /> ಆಗಿದೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ; ಅದರ ಸುರಕ್ಷತಾ ಪ್ರಮಾಣಪತ್ರವು ನಿಮ್ಮ ಸಾಧನದ ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್‌ ಪ್ರಕಾರ ವಿಶ್ವಾಸಾರ್ಹವಾಗಿಲ್ಲ. ಇದು ತಪ್ಪು ಕಾನ್ಫಿಗರೇಶನ್‌ನಿಂದ ಅಥವಾ ಆಕ್ರಮಣಕಾರರು ನಿಮ್ಮ ಸಂಪರ್ಕದಲ್ಲಿ ಒಳನುಸುಳಿರುವುದರಿಂದ ಆಗಿರಬಹುದು.</translation>
 <translation id="1152921474424827756"><ph name="URL" /> ನ <ph name="BEGIN_LINK" />ಸಂಗ್ರಹಿಸಲಾಗಿರುವ ನಕಲನ್ನು<ph name="END_LINK" /> ಪ್ರವೇಶಿಸಿ</translation>
@@ -116,7 +117,6 @@
 <translation id="2212735316055980242">ನೀತಿ ಕಂಡು ಬಂದಿಲ್ಲ</translation>
 <translation id="2213606439339815911">ನಮೂದುಗಳನ್ನು ಪಡೆಯಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> ಲಭ್ಯವಿಲ್ಲ</translation>
-<translation id="2227695659599072496">ನೆಟ್‌ವರ್ಕ್ ಕೇಬಲ್ ಅಥವಾ ರೂಟರ್ ಅನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="2230458221926704099"><ph name="BEGIN_LINK" />ಡಯಾಗ್ನಸ್ಟಿಕ್ಸ್‌‌ ಅಪ್ಲಿಕೇಶನ್‌<ph name="END_LINK" /> ಬಳಸಿಕೊಂಡು ನಿಮ್ಮ ಸಂಪರ್ಕವನ್ನು ಸರಿಪಡಿಸಿ</translation>
 <translation id="225207911366869382">ಈ ನೀತಿಗಾಗಿ ಈ ಮೌಲ್ಯವನ್ನು ಅಸಮ್ಮತಿಸಲಾಗಿದೆ.</translation>
 <translation id="2262243747453050782">HTTP ದೋಷ</translation>
@@ -129,6 +129,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> ಗೆ ಬಳಕೆದಾರಹೆಸರು ಮತ್ತು ಪಾಸ್‌ವರ್ಡ್ ಅಗತ್ಯವಿದೆ.</translation>
 <translation id="2328300916057834155">ಸೂಚ್ಯಂಕದಲ್ಲಿ <ph name="ENTRY_INDEX" /> ನಿರ್ಲಕ್ಷಿಸಲಾದ ಅಮಾನ್ಯ ಬುಕ್‌ಮಾರ್ಕ್‌</translation>
 <translation id="2354001756790975382">ಇತರ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು</translation>
+<translation id="2357783041215512127"><ph name="CREDIT_CARD" /> ನೊಂದಿಗೆ ಪಾವತಿಸಿ</translation>
 <translation id="2359808026110333948">ಮುಂದುವರಿಸು</translation>
 <translation id="2367567093518048410">ಹಂತ</translation>
 <translation id="237718015863234333">ಯಾವುದೇ UI ಪರ್ಯಾಯಗಳು ಲಭ್ಯವಿಲ್ಲ</translation>
@@ -222,7 +223,6 @@
 <translation id="3254409185687681395">ಈ ಪುಟ ಬುಕ್‌ಮಾರ್ಕ್ ಮಾಡಿ</translation>
 <translation id="3270847123878663523">&amp;ಮರುಕ್ರಮಗೊಳಿಸುವುದನ್ನು ರದ್ದುಗೊಳಿಸು</translation>
 <translation id="3286538390144397061">ಈಗ ಮರುಪ್ರಾರಂಭಿಸಿ</translation>
-<translation id="3288003805934695103">ಪುಟ ಮರುಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation>
 <translation id="3305707030755673451">ನಿಮ್ಮ ಡೇಟಾವನ್ನು <ph name="TIME" /> ರಂದು ನಿಮ್ಮ ಸಿಂಕ್ ಪಾಸ್‌ಫ್ರೇಸ್‌ನೊಂದಿಗೆ ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾಗಿದೆ. ಸಿಂಕ್ ಪ್ರಾರಂಭಿಸಲು ಅದನ್ನು ನಮೂದಿಸಿ.</translation>
 <translation id="333371639341676808">ಈ ಪುಟ ಹೆಚ್ಚುವರಿ ಸಂವಾದಗಳನ್ನು ರಚಿಸುವುದನ್ನು ತಡೆಯಿರಿ.</translation>
 <translation id="3340978935015468852">ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
@@ -293,7 +293,6 @@
 <translation id="3963721102035795474">ರೀಡರ್‌ ಮೋಡ್‌</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation>
 <translation id="4021036232240155012">DNS ಎನ್ನುವುದು ನೆಟ್‌ವರ್ಕ್ ಸೇವೆಯಾಗಿದ್ದು ಇದು ವೆಬ್‌ಸೈಟ್ ಹೆಸರನ್ನು ಅದರ ಇಂಟರ್ನೆಟ್ ವಿಳಾಸವಾಗಿ ಪರಿವರ್ತಿಸುತ್ತದೆ.</translation>
-<translation id="4021376465026729077">ನಿಮ್ಮ ವಿಸ್ತರಣೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="4030383055268325496">&amp;ಸೇರಿಸುವುದನ್ನು ರದ್ದುಗೊಳಿಸಿ</translation>
 <translation id="4032534284272647190"><ph name="URL" /> ಗೆ ಪ್ರವೇಶವನ್ನು ನಿರಾಕರಿಸಲಾಗಿದೆ.</translation>
 <translation id="404928562651467259">ಎಚ್ಚರಿಕೆ</translation>
@@ -391,7 +390,6 @@
 <translation id="5251803541071282808">ಮೇಘ</translation>
 <translation id="5299298092464848405">ನೀತಿಯ ಪಾರ್ಸಿಂಗ್‌ನಲ್ಲಿ ದೋಷ</translation>
 <translation id="5300589172476337783">ಪ್ರದರ್ಶಿಸಿ</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />ನಿಮ್ಮ ಕುಕೀಗಳನ್ನು ತೆರವುಗೊಳಿಸಲಾಗುತ್ತಿದೆ<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">ಕ್ರ‍್ಯಾಶ್‌‌ ವರದಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.</translation>
 <translation id="5317780077021120954">ಉಳಿಸು</translation>
 <translation id="5327248766486351172">ಹೆಸರು</translation>
@@ -425,6 +423,7 @@
 <translation id="5629630648637658800">ನೀತಿಯ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ವಿಫಲವಾಗಿದೆ</translation>
 <translation id="5631439013527180824">ಅಮಾನ್ಯವಾದ ಸಾಧನ ನಿರ್ವಹಣೆ ಟೋಕನ್</translation>
 <translation id="5650551054760837876">ಯಾವುದೇ ಫಲಿತಾಂಶಗಳು ಕಂಡುಬಂದಿಲ್ಲ.</translation>
+<translation id="5663999524854166235">ಪರಿಶೀಲನೆಗಾಗಿ ನಿಮ್ಮ ಕಾರ್ಡ್ ಹಿಂಭಾಗದಲ್ಲಿರುವ 3-ಅಂಕಿಗಳ CVC ಅನ್ನು ನಮೂದಿಸಿ</translation>
 <translation id="5677928146339483299">ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation>
 <translation id="5710435578057952990">ಈ ವೆಬ್‌ಸೈಟ್‌ನ ಗುರುತಿಸುವಿಕೆಯನ್ನು ಇನ್ನೂ ಪರಿಶೀಲಿಸಲಾಗಿಲ್ಲ.</translation>
 <translation id="5720705177508910913">ಪ್ರಸ್ತುತ ಬಳಕೆದಾರ</translation>
@@ -442,7 +441,7 @@
 <translation id="5949910269212525572">ಸರ್ವರ್‌ನ DNS ವಿಳಾಸವನ್ನು ಪರಿಹರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation>
 <translation id="5966707198760109579">ವಾರ</translation>
 <translation id="5967867314010545767">ಇತಿಹಾಸದಿಂದ ತೆಗೆದುಹಾಕಿ</translation>
-<translation id="5975083100439434680">ಜೂಮ್ ಔಟ್</translation>
+<translation id="5975083100439434680">ಝೂಮ್ ಔಟ್</translation>
 <translation id="5989320800837274978">ಹೊಂದಿಸಿದ ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್‌ಗಳು ಆಗಲಿ ಅಥವಾ .pac ಸ್ಕ್ರಿಪ್ಟ್ URL ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿಲ್ಲ.</translation>
 <translation id="5990559369517809815">ಸರ್ವರ್‌ಗಳ ವಿನಂತಿಗಳನ್ನು ವಿಸ್ತರಣೆಯಿಂದ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ.</translation>
 <translation id="6008256403891681546">JCB</translation>
@@ -495,7 +494,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> ಹುಡುಕಾಟ</translation>
 <translation id="6634865548447745291">ನೀವು <ph name="SITE" /> ಗೆ ಭೇಟಿ ನೀಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಏಕೆಂದರೆ <ph name="BEGIN_LINK" />ಈ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಹಿಂಪಡೆದುಕೊಳ್ಳಲಾಗಿದೆ<ph name="END_LINK" />. ನೆಟ್‌ವರ್ಕ್ ದೋಷಗಳು ಮತ್ತು ಆಕ್ರಮಣಗಳು ತಾತ್ಕಾಲಿಕ, ಹೀಗಾಗಿ ಈ ಪುಟವು ಸ್ವಲ್ಪ ಸಮಯದ ನಂತರ ಕಾರ್ಯ ನಿರ್ವಹಿಸಬಹುದು.</translation>
 <translation id="6637478299472506933">ಡೌನ್‌ಲೋಡ್ ವಿಫಲವಾಗಿದೆ</translation>
-<translation id="6642894344118208103">ಮೋಡೆಮ್‌ ಅಥವಾ ರೂಟರ್‌ ಮರುಹೊಂದಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="6644283850729428850">ಈ ನೀತಿಯನ್ನು ವಿನಂತಿಸಲಾಗಿದೆ.</translation>
 <translation id="6646897916597483132">ನಿಮ್ಮ ಕಾರ್ಡ್ ಮುಂಭಾಗದಲ್ಲಿರುವ 4-ಅಂಕಿ CVC ಅನ್ನು ನಮೂದಿಸಿ</translation>
 <translation id="6656103420185847513">ಫೋಲ್ಡರ್ ಸಂಪಾದಿಸಿ</translation>
@@ -700,7 +698,7 @@
 <translation id="8891727572606052622">ಅಮಾನ್ಯವಾದ ಪ್ರಾಕ್ಸಿ ಮೋಡ್.</translation>
 <translation id="889901481107108152">ಕ್ಷಮಿಸಿ, ಈ ಪ್ರಯೋಗವು ನಿಮ್ಮ ಪ್ಲ್ಯಾಟ್‌ಫಾರ್ಮ್‌ನಲ್ಲಿ ಲಭ್ಯವಿಲ್ಲ.</translation>
 <translation id="890308499387283275">ಈ ಫೈಲ್‌ನಲ್ಲಿ Chrome ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ.</translation>
-<translation id="8903921497873541725">ಜೂಮ್ ಇನ್</translation>
+<translation id="8903921497873541725">ಝೂಮ್ ಇನ್</translation>
 <translation id="8931333241327730545">ಈ ಕಾರ್ಡನ್ನು ನಿಮ್ಮ Google ಖಾತೆನಲ್ಲಿ ಉಳಿಸಲು ಬಯಸುವಿರಾ?</translation>
 <translation id="8932102934695377596">ನಿಮ್ಮ ಗಡಿಯಾರ ಹಿಂದೆ ಇದೆ</translation>
 <translation id="8954894007019320973">(ಮುಂದು.)</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb
index 7a8f54a..d9744a3d 100644
--- a/components/strings/components_strings_ko.xtb
+++ b/components/strings/components_strings_ko.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">정책 캐시 확인</translation>
 <translation id="113188000913989374"><ph name="SITE" /> 내용:</translation>
 <translation id="1132774398110320017">Chrome 자동완성 설정...</translation>
+<translation id="113770840981343808">인증을 위해 카드 앞면의 4자리 CVC를 입력하세요.</translation>
 <translation id="1146673768181266552">오류 ID <ph name="CRASH_ID" />(<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">이 서버가 <ph name="DOMAIN" />임을 입증할 수 없으며 컴퓨터의 운영체제에서 신뢰하는 보안 인증서가 아닙니다. 서버를 잘못 설정했거나 불법 사용자가 연결을 가로채고 있기 때문일 수 있습니다.</translation>
 <translation id="1152921474424827756"><ph name="URL" />의 <ph name="BEGIN_LINK" />캐시된 사본<ph name="END_LINK" />에 액세스</translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">정책을 찾을 수 없음</translation>
 <translation id="2213606439339815911">항목을 가져오는 중...</translation>
 <translation id="2214283295778284209"><ph name="SITE" />을(를) 사용할 수 없음</translation>
-<translation id="2227695659599072496">네트워크 케이블 또는 라우터 확인</translation>
 <translation id="2230458221926704099"><ph name="BEGIN_LINK" />진단 앱<ph name="END_LINK" />을 사용하여 연결 문제를 해결하세요.</translation>
 <translation id="225207911366869382">이 값은 이 정책에 사용되지 않습니다.</translation>
 <translation id="2262243747453050782">HTTP 오류</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" />에 사용자 이름과 비밀번호를 입력해야 합니다.</translation>
 <translation id="2328300916057834155"><ph name="ENTRY_INDEX" /> 색인의 잘못된 북마크 무시됨</translation>
 <translation id="2354001756790975382">기타 북마크</translation>
+<translation id="2357783041215512127"><ph name="CREDIT_CARD" />(으)로 결제</translation>
 <translation id="2359808026110333948">계속</translation>
 <translation id="2367567093518048410">수준</translation>
 <translation id="237718015863234333">사용 가능한 대체 UI 없음</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">페이지 북마크</translation>
 <translation id="3270847123878663523">재정렬 실행 취소(&amp;U)</translation>
 <translation id="3286538390144397061">지금 다시 시작</translation>
-<translation id="3288003805934695103">페이지 새로고침</translation>
 <translation id="3305707030755673451"><ph name="TIME" />에 동기화 암호로 데이터가 암호화되었습니다. 동기화를 시작하려면 입력하세요.</translation>
 <translation id="333371639341676808">이 페이지가 추가적인 대화를 생성하지 않도록 차단합니다.</translation>
 <translation id="3340978935015468852">설정</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">리더 모드</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" />이(가) 차단됨</translation>
 <translation id="4021036232240155012">DNS는 웹사이트 이름을 인터넷 주소로 변환하는 네트워크 서비스입니다.</translation>
-<translation id="4021376465026729077">확장 프로그램 사용 중지</translation>
 <translation id="4030383055268325496">추가 실행 취소(&amp;U)</translation>
 <translation id="4032534284272647190"><ph name="URL" />에 대한 엑세스가 거부되었습니다.</translation>
 <translation id="404928562651467259">경고</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">클라우드</translation>
 <translation id="5299298092464848405">정책을 파싱하는 중 오류 발생</translation>
 <translation id="5300589172476337783">표시</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />쿠키 삭제<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">충돌 보고가 사용 중지되었습니다.</translation>
 <translation id="5317780077021120954">저장</translation>
 <translation id="5327248766486351172">이름</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">정책 설정 로드 실패</translation>
 <translation id="5631439013527180824">잘못된 기기 관리 토큰</translation>
 <translation id="5650551054760837876">검색결과를 찾지 못했습니다.</translation>
+<translation id="5663999524854166235">인증을 위해 카드 뒷면의 3자리 CVC를 입력하세요.</translation>
 <translation id="5677928146339483299">차단됨</translation>
 <translation id="5710435578057952990">이 웹사이트의 주소가 확인되지 않았습니다.</translation>
 <translation id="5720705177508910913">현재 사용자</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> 검색</translation>
 <translation id="6634865548447745291"><ph name="BEGIN_LINK" />이 인증서가 취소되었기 때문에<ph name="END_LINK" /> 현재 <ph name="SITE" />에 방문할 수 없습니다. 네트워크 오류와 공격은 대부분 일시적이므로 잠시 후 페이지가 작동될 것입니다.</translation>
 <translation id="6637478299472506933">다운로드 실패</translation>
-<translation id="6642894344118208103">모뎀 또는 라우터 재설정</translation>
 <translation id="6644283850729428850">이 정책은 사용되지 않습니다.</translation>
 <translation id="6646897916597483132">카드 앞면의 4자리 CVC를 입력하세요.</translation>
 <translation id="6656103420185847513">폴더 수정</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb
index aa89abb..3a1e3339 100644
--- a/components/strings/components_strings_lt.xtb
+++ b/components/strings/components_strings_lt.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Gera politikos talpykla</translation>
 <translation id="113188000913989374"><ph name="SITE" /> sakoma:</translation>
 <translation id="1132774398110320017">„Chrome“ automatinio pildymo nustatymai...</translation>
+<translation id="113770840981343808">Įveskite kortelės priekyje nurodytą 4 skaitmenų kortelės saugos kodą (CVC), kad patvirtintumėte</translation>
 <translation id="1146673768181266552">Strigties ID <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Šiam serveriui nepavyko patvirtinti, kad tai yra <ph name="DOMAIN" />; jo saugos sertifikatas nėra patikimas kompiuterio operacinei sistemai. Taip gali nutikti dėl netinkamos konfigūracijos ar dėl ryšį pertraukusio užgrobėjo.</translation>
 <translation id="1152921474424827756">Pasiekite <ph name="BEGIN_LINK" />talpykloje saugomą <ph name="URL" /> kopiją<ph name="END_LINK" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Politika nerasta</translation>
 <translation id="2213606439339815911">Gaunami įrašai...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> neprieinamas</translation>
-<translation id="2227695659599072496">Patikrinti tinklo laidą ir maršruto parinktuvą</translation>
 <translation id="2230458221926704099">Išspręskite ryšio problemas naudodami <ph name="BEGIN_LINK" />diagnostikos programą<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Pagal šią politiką ši vertė nepatvirtinta.</translation>
 <translation id="2262243747453050782">HTTP klaida</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> būtina įvesti naudotojo vardą ir slaptažodį.</translation>
 <translation id="2328300916057834155">Nepaisoma netinkama žymė indekse <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Kitos žymės</translation>
+<translation id="2357783041215512127">Mokėti naudojant „<ph name="CREDIT_CARD" />“</translation>
 <translation id="2359808026110333948">Tęsti</translation>
 <translation id="2367567093518048410">Lygis</translation>
 <translation id="237718015863234333">Nėra jokių galimų NS alternatyvų</translation>
@@ -229,7 +230,6 @@
 <translation id="3254409185687681395">Įtraukti šį puslapį į žymes</translation>
 <translation id="3270847123878663523">&amp;Anuliuoti pertvarkymą</translation>
 <translation id="3286538390144397061">Paleisti iš naujo dabar</translation>
-<translation id="3288003805934695103">Iš naujo įkelti puslapį</translation>
 <translation id="3305707030755673451"><ph name="TIME" /> duomenys buvo užšifruoti naudojant sinchronizavimo slaptafrazę. Įveskite ją, kad pradėtumėte sinchronizuoti.</translation>
 <translation id="333371639341676808">Neleiskite šiam puslapiui kurti papildomų dialogo langų.</translation>
 <translation id="3340978935015468852">nustatymų</translation>
@@ -301,7 +301,6 @@
 <translation id="3963721102035795474">Skaitytojo režimas</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> užblokuota.</translation>
 <translation id="4021036232240155012">DNS – tai tinklo paslauga, verčianti svetainės pavadinimą į interneto adresą.</translation>
-<translation id="4021376465026729077">Išjungti plėtinius</translation>
 <translation id="4030383055268325496">&amp;Anuliuoti pridėjimą</translation>
 <translation id="4032534284272647190">Prieiga prie <ph name="URL" /> atmesta.</translation>
 <translation id="404928562651467259">ĮSPĖJIMAS</translation>
@@ -399,7 +398,6 @@
 <translation id="5251803541071282808">Debesis</translation>
 <translation id="5299298092464848405">Analizuojant politiką įvyko klaida</translation>
 <translation id="5300589172476337783">Rodyti</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Išvalyti slapukus<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Strigčių ataskaitų teikimas neleidžiamas.</translation>
 <translation id="5317780077021120954">Išsaugoti</translation>
 <translation id="5327248766486351172">Pavadinimas</translation>
@@ -433,6 +431,7 @@
 <translation id="5629630648637658800">Įkeliant politikos nustatymus įvyko klaida</translation>
 <translation id="5631439013527180824">Netinkamas įrenginio tvarkymo prieigos raktas</translation>
 <translation id="5650551054760837876">Nerasta paieškos rezultatų.</translation>
+<translation id="5663999524854166235">Įveskite kitoje kortelės pusėje nurodytą 3 skaitmenų kortelės saugos kodą (CVC), kad patvirtintumėte</translation>
 <translation id="5677928146339483299">Užblokuota</translation>
 <translation id="5710435578057952990">Šio tinklalapio tapatybė nenustatyta.</translation>
 <translation id="5720705177508910913">Dabartinis naudotojas</translation>
@@ -505,7 +504,6 @@
 <translation id="6628463337424475685">„<ph name="ENGINE" />“ paieška</translation>
 <translation id="6634865548447745291">Negalite dabar apsilankyti svetainėje <ph name="SITE" />, nes <ph name="BEGIN_LINK" />šis sertifikatas buvo anuliuotas<ph name="END_LINK" />. Paprastai tinklo klaidos ir užpuolimai yra laikini, todėl šis puslapis vėliau tikriausiai veiks.</translation>
 <translation id="6637478299472506933">Atsisiun. įv. klaida</translation>
-<translation id="6642894344118208103">Iš naujo nustatyti modemą arba maršruto parinktuvą</translation>
 <translation id="6644283850729428850">Ši politika nepatvirtinta.</translation>
 <translation id="6646897916597483132">Įveskite 4 skaitmenų kortelės saugos kodą (CVC), nurodytą kortelės priekyje</translation>
 <translation id="6656103420185847513">Redaguoti aplanką</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb
index 38493c0..65e39c7 100644
--- a/components/strings/components_strings_lv.xtb
+++ b/components/strings/components_strings_lv.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Politikas kešatmiņa ir labā stāvoklī.</translation>
 <translation id="113188000913989374">Vietnē <ph name="SITE" /> ir rakstīts:</translation>
 <translation id="1132774398110320017">Chrome automātiskās aizpildes iestatījumi...</translation>
+<translation id="113770840981343808">Verifikācijai ievadiet 4 ciparu CVC kodu, kas norādīts jūsu kartes priekšpusē.</translation>
 <translation id="1146673768181266552">Avārijas ID: <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Šis serveris nevarēja pierādīt, ka šī ir vietne <ph name="DOMAIN" />; tās drošības sertifikāts netiek uzskatīts par uzticamu jūsu datora operētājsistēmā. Iespējams, tas ir nepareizas konfigurācijas dēļ vai arī kāds ir ļaunprātīgi izmantojis jūsu savienojumu.</translation>
 <translation id="1152921474424827756">Piekļūstiet vietnes <ph name="URL" /> <ph name="BEGIN_LINK" />kešatmiņā saglabātajai kopijai<ph name="END_LINK" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Politika netika atrasta.</translation>
 <translation id="2213606439339815911">Notiek ierakstu ienešana...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> nav pieejama</translation>
-<translation id="2227695659599072496">Pārbaudiet tīkla kabeli vai maršrutētāju.</translation>
 <translation id="2230458221926704099">Labojiet savienojumu, izmantojot <ph name="BEGIN_LINK" />diagnostikas lietotni<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Šī vērtība vairs netiek atbalstīta šai politikai.</translation>
 <translation id="2262243747453050782">HTTP kļūda</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535">Vietnē <ph name="DOMAIN" /> ir jāievada lietotājvārds un parole.</translation>
 <translation id="2328300916057834155">Nederīga grāmatzīme ignorēta <ph name="ENTRY_INDEX" />. rādītājā</translation>
 <translation id="2354001756790975382">Citas grāmatzīmes</translation>
+<translation id="2357783041215512127">Maksāt ar: <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Turpināt</translation>
 <translation id="2367567093518048410">Līmenis</translation>
 <translation id="237718015863234333">Nav pieejamas alternatīvas lietotāja saskarnes</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Grāmatot šo lapu</translation>
 <translation id="3270847123878663523">&amp;Pārkārtošanas atsaukšana</translation>
 <translation id="3286538390144397061">Restartēt tūlīt</translation>
-<translation id="3288003805934695103">Atkārtoti ielādējiet lapu.</translation>
 <translation id="3305707030755673451">Jūsu dati tika šifrēti, izmantojot jūsu sinhronizācijas ieejas frāzi šādā datumā: <ph name="TIME" />. Lai sāktu sinhronizāciju, ievadiet ieejas frāzi.</translation>
 <translation id="333371639341676808">Neļaujiet šai lapai veidot papildu dialogus.</translation>
 <translation id="3340978935015468852">Iestatījumi</translation>
@@ -299,7 +299,6 @@
 <translation id="3963721102035795474">Lasītāja režīms</translation>
 <translation id="3973234410852337861">Vietne <ph name="HOST_NAME" /> ir bloķēta</translation>
 <translation id="4021036232240155012">DNS ir tīkla pakalpojums, kurā vietnes nosaukums tiek tulkots uz tās interneta adresi.</translation>
-<translation id="4021376465026729077">Atspējojiet paplašinājumus.</translation>
 <translation id="4030383055268325496">&amp;Atsaukt pievienošanu</translation>
 <translation id="4032534284272647190">Piekļuve vietnei <ph name="URL" /> noraidīta.</translation>
 <translation id="404928562651467259">BRĪDINĀJUMS</translation>
@@ -397,7 +396,6 @@
 <translation id="5251803541071282808">Mākonis</translation>
 <translation id="5299298092464848405">Parsējot politiku, radās kļūda.</translation>
 <translation id="5300589172476337783">Rādīt</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Dzēsiet sīkfailus<ph name="END_LINK" />.</translation>
 <translation id="5308689395849655368">Avāriju pārskatu izveide ir atspējota.</translation>
 <translation id="5317780077021120954">Saglabāt</translation>
 <translation id="5327248766486351172">Nosaukums</translation>
@@ -431,6 +429,7 @@
 <translation id="5629630648637658800">Neizdevās ielādēt politikas iestatījumus.</translation>
 <translation id="5631439013527180824">Ierīces pārvaldības marķieris nav derīgs.</translation>
 <translation id="5650551054760837876">Meklēšanas rezultāti nav atrasti.</translation>
+<translation id="5663999524854166235">Verifikācijai ievadiet 3 ciparu CVC kodu, kas norādīts jūsu kartes aizmugurē.</translation>
 <translation id="5677928146339483299">Bloķēts</translation>
 <translation id="5710435578057952990">Tīmekļa vietnes identitāte nav apstiprināta.</translation>
 <translation id="5720705177508910913">Pašreizējais lietotājs</translation>
@@ -503,7 +502,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> meklēšana</translation>
 <translation id="6634865548447745291">Pašlaik nevarat apmeklēt vietni <ph name="SITE" />, jo <ph name="BEGIN_LINK" />šis sertifikāts ir atsaukts<ph name="END_LINK" />. Tīkla kļūdas un uzbrukumi parasti ir īslaicīgi, tādējādi šī lapa vēlāk, visticamāk, darbosies.</translation>
 <translation id="6637478299472506933">Lejupiel. neizdevās</translation>
-<translation id="6642894344118208103">Atiestatiet modemu vai maršrutētāju.</translation>
 <translation id="6644283850729428850">Šī politika ir izbeigta.</translation>
 <translation id="6646897916597483132">Ievadiet 4 ciparu CVC kodu, kas norādīts jūsu kredītkartes priekšpusē.</translation>
 <translation id="6656103420185847513">Mapes rediģēšana</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb
index 1d306f31..7b57d7f4f3 100644
--- a/components/strings/components_strings_ml.xtb
+++ b/components/strings/components_strings_ml.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">നയ കാഷെ ശരി</translation>
 <translation id="113188000913989374"><ph name="SITE" /> സൈറ്റ് പറയുന്നത്:</translation>
 <translation id="1132774398110320017">Chrome ഓട്ടോഫിൽ ക്രമീകരണങ്ങൾ...</translation>
+<translation id="113770840981343808">പരിശോധിച്ചുറപ്പിക്കാൻ നിങ്ങളുടെ കാർഡിന് മുന്നിലുള്ള 4 അക്ക CVC നൽകുക</translation>
 <translation id="1146673768181266552">ക്രാഷ് ഐഡി <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">ഈ സെർവറിന് അത് <ph name="DOMAIN" /> ആണെന്ന് തെളിയിക്കാനായില്ല; അതിന്റെ സുരക്ഷ സർട്ടിഫിക്കറ്റിനെ നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ ഓപ്പറേറ്റിംഗ് സിസ്‌റ്റത്തിന് പരിചയമില്ല. തെറ്റായ കോൺഫിഗറേഷൻ കാരണമോ ഒരു അക്രമണകാരി നിങ്ങളുടെ കണക്ഷനെ തടസ്സപ്പെടുത്തുന്നത് കൊണ്ടോ ആയിരിക്കാം ഇത് സംഭവിച്ചത്.</translation>
 <translation id="1152921474424827756"><ph name="URL" />-ന്റെ <ph name="BEGIN_LINK" />കാഷെ ചെയ്‌ത പകർപ്പ്<ph name="END_LINK" /> ആക്‌സസ്സുചെയ്യുക</translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">നയം കണ്ടെത്തിയില്ല</translation>
 <translation id="2213606439339815911">എൻട്രികൾ ലഭ്യമാക്കുന്നു...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> ലഭ്യമല്ല</translation>
-<translation id="2227695659599072496">നെറ്റ്‌വർക്ക് കേബിളും റൂട്ടറും പരിശോധിക്കുന്നു</translation>
 <translation id="2230458221926704099"><ph name="BEGIN_LINK" />ഡയഗണോസ്‌റ്റിക്‌സ് ആപ്പ്<ph name="END_LINK" /> ഉപയോഗിച്ച് കണകഷൻ പ്രശ്‌നം പരിഹരിക്കുക</translation>
 <translation id="225207911366869382">ഈ നയത്തിനായി ഈ മൂല്യത്തെ ഒഴിവാക്കി.</translation>
 <translation id="2262243747453050782">HTTP പിശക്</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> ഡൊമെയ്‌ന് ഒരു ഉപയോക്തൃനാമവും പാസ്‌വേഡും വേണം.</translation>
 <translation id="2328300916057834155"><ph name="ENTRY_INDEX" /> സൂചികയിൽ അസാധുവായ ബുക്ക്‌മാർക്ക് അവഗണിച്ചു</translation>
 <translation id="2354001756790975382">മറ്റ് ബുക്‌മാര്‍ക്കുകള്‍</translation>
+<translation id="2357783041215512127"><ph name="CREDIT_CARD" /> ഉപയോഗിച്ച് പണമടയ്‌ക്കുക</translation>
 <translation id="2359808026110333948">തുടരൂ</translation>
 <translation id="2367567093518048410">നില</translation>
 <translation id="237718015863234333">UI ഇതരമാർഗങ്ങളൊന്നും ലഭ്യമല്ല</translation>
@@ -227,7 +228,6 @@
 <translation id="3254409185687681395">ഈ പേജ് ബുക്‌മാര്‍ക്ക് ചെയ്യുക</translation>
 <translation id="3270847123878663523">&amp;പുനഃക്രമീകരിക്കുന്നത് പഴയപടിയാക്കുക</translation>
 <translation id="3286538390144397061">ഇപ്പോള്‍ പുനരാരംഭിക്കുക</translation>
-<translation id="3288003805934695103">പേജ് റീലോഡുചെയ്യുന്നു</translation>
 <translation id="3305707030755673451"><ph name="TIME" />-ന് നിങ്ങളുടെ സമന്വയ പാസ്‌ഫ്രെയ്‌സ് ഉപയോഗിച്ച് ഡാറ്റ എൻക്രിപ്‌റ്റുചെയ്‌തു. സമന്വയം ആരംഭിക്കുന്നതിന് ഇത് നൽകുക.</translation>
 <translation id="333371639341676808">അധികമുള്ള ഡയലോഗുകള്‍ സൃഷ്ടിക്കുന്നതില്‍ നിന്ന് ഈ പേജിനെ തടയൂ.</translation>
 <translation id="3340978935015468852">ക്രമീകരണങ്ങൾ</translation>
@@ -299,7 +299,6 @@
 <translation id="3963721102035795474">റീഡർ മോഡ്</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> ബ്ലോക്കുചെയ്‌തിരിക്കുന്നു</translation>
 <translation id="4021036232240155012">ഒരു വെബ്‌സൈറ്റിന്റെ പേര് അതിന്റെ ഇന്റർനെറ്റ് വിലാസത്തിലേക്ക് വിവർത്തനം ചെയ്യുന്ന നെറ്റ്‌വർക്ക് സേവനമാണ് DNS.</translation>
-<translation id="4021376465026729077">നിങ്ങളുടെ വിപുലീകരണങ്ങൾ പ്രവർത്തനരഹിതമാക്കുന്നു</translation>
 <translation id="4030383055268325496">&amp;ചേർക്കുന്നത് പഴയപടിയാക്കുക</translation>
 <translation id="4032534284272647190"><ph name="URL" /> എന്നതിലേക്ക് ആക്സസ്സ് നിരസിച്ചു.</translation>
 <translation id="404928562651467259">മുന്നറിയിപ്പ്</translation>
@@ -397,7 +396,6 @@
 <translation id="5251803541071282808">ക്ലൗഡ്</translation>
 <translation id="5299298092464848405">നയം പാഴ്‌സുചെയ്യുന്നതിൽ പിശക്</translation>
 <translation id="5300589172476337783">കാണിക്കുക</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />നിങ്ങളുടെ കുക്കികൾ മായ്‌ക്കുന്നു<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">ക്രാഷ് റിപ്പോര്‍ട്ടുചെയ്യല്‍ അപ്രാപ്തമാക്കി.</translation>
 <translation id="5317780077021120954">സംരക്ഷിക്കുക</translation>
 <translation id="5327248766486351172">പേര്</translation>
@@ -431,6 +429,7 @@
 <translation id="5629630648637658800">നയ ക്രമീകരണങ്ങൾ ലോഡുചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു</translation>
 <translation id="5631439013527180824">ഉപകരണ മാനേജുമെന്റ് ടോക്കൺ അസാധുവാണ്</translation>
 <translation id="5650551054760837876">തിരയൽ ഫലങ്ങള്‍ കണ്ടെത്തിയില്ല.</translation>
+<translation id="5663999524854166235">പരിശോധിച്ചുറപ്പിക്കാൻ, നിങ്ങളുടെ കാർഡിന് പുറകിലുള്ള 3 അക്ക CVC നൽകുക</translation>
 <translation id="5677928146339483299">തടഞ്ഞു</translation>
 <translation id="5710435578057952990">ഈ വെബ്സൈറ്റിന്റെ വ്യക്തിത്വം പരിശോധിച്ചിട്ടില്ല.</translation>
 <translation id="5720705177508910913">നിലവിലെ ഉപയോക്താവ്</translation>
@@ -503,7 +502,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> തിരയൽ</translation>
 <translation id="6634865548447745291"><ph name="BEGIN_LINK" />ഈ സർട്ടിഫിക്കറ്റ് റദ്ദാക്കിയതിനാൽ<ph name="END_LINK" /> നിങ്ങൾക്കിപ്പോൾ <ph name="SITE" /> സന്ദർശിക്കാനാകില്ല. നെറ്റ്‌വർക്ക് പിശകുകളും ആക്രമണങ്ങളും സാധാരണയായി താൽക്കാലികമായതിനാൽ ഈ പേജ് മിക്കവാറും പിന്നീട് പ്രവർത്തിക്കാം.</translation>
 <translation id="6637478299472506933">ഡൗൺലോഡ് പരാജയപ്പെട്ടു</translation>
-<translation id="6642894344118208103">മോഡമോ റൂട്ടറോ റീസെറ്റുചെയ്യുന്നു</translation>
 <translation id="6644283850729428850">ഈ നയം ഒഴിവാക്കി.</translation>
 <translation id="6646897916597483132">നിങ്ങളുടെ കാർഡിന്റെ മുന്നിലുള്ള 4 അക്ക CVC നൽകുക</translation>
 <translation id="6656103420185847513">ഫോൾഡർ എഡിറ്റുചെയ്യുക</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb
index 4b06794f..35471a3 100644
--- a/components/strings/components_strings_mr.xtb
+++ b/components/strings/components_strings_mr.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">धोरण कॅशे ठीक</translation>
 <translation id="113188000913989374"><ph name="SITE" /> म्हणते:</translation>
 <translation id="1132774398110320017">Chrome स्वयंभरण सेटिंग्ज...</translation>
+<translation id="113770840981343808">सत्यापनासाठी आपल्या कार्डच्या पुढील भागावर असलेले 4-अंकी CVC प्रविष्ट करा</translation>
 <translation id="1146673768181266552">क्रॅश ID <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">हा सर्व्हर हे <ph name="DOMAIN" /> असल्याचे सिद्ध करू शकला नाही; त्याचे सुरक्षितता प्रमाणपत्र आपल्या संगणकाच्या ऑपरेटिंग प्रणालीद्वारे विश्वसनीय नाही. हे कदाचित एका चुकीच्या कॉन्फिगरेशनमुळे किंवा आक्रमणकर्त्याने आपले कनेक्शन आंतरखंडित केल्यामुळे झाले असू शकते.</translation>
 <translation id="1152921474424827756"><ph name="URL" /> च्या <ph name="BEGIN_LINK" />कॅशे केलेल्या कॉपीवर<ph name="END_LINK" /> प्रवेश करा</translation>
@@ -117,7 +118,6 @@
 <translation id="2212735316055980242">धोरण आढळले नाही</translation>
 <translation id="2213606439339815911">प्रविष्ट्या आणत आहे...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> उपलब्ध नाही</translation>
-<translation id="2227695659599072496">नेटवर्क केबल किंवा राउटर तपासणे</translation>
 <translation id="2230458221926704099"><ph name="BEGIN_LINK" />निदान अॅप<ph name="END_LINK" /> वापरून आपल्या कनेक्शनचे निराकरण करा</translation>
 <translation id="225207911366869382">हे मूल्य या धोरणासाठी नापसंत करण्‍यात आले आहे.</translation>
 <translation id="2262243747453050782">HTTP त्रुटी</translation>
@@ -130,6 +130,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> साठी वापरकर्तानाव आणि संकेतशब्द आवश्यक आहेत.</translation>
 <translation id="2328300916057834155"><ph name="ENTRY_INDEX" /> अनुक्रमणिकेमधील अवैध बुकमार्ककडे दुर्लक्ष केले</translation>
 <translation id="2354001756790975382">इतर बुकमार्क</translation>
+<translation id="2357783041215512127"><ph name="CREDIT_CARD" /> सह देय द्या</translation>
 <translation id="2359808026110333948">सुरू ठेवा</translation>
 <translation id="2367567093518048410">दर्जा</translation>
 <translation id="237718015863234333">कोणतेही UI विकल्प उपलब्ध नाहीत</translation>
@@ -227,7 +228,6 @@
 <translation id="3254409185687681395">या पृष्ठास बुकमार्क करा</translation>
 <translation id="3270847123878663523">&amp;पुनर्क्रमित करा पूर्ववत करा</translation>
 <translation id="3286538390144397061">त्वरित रीस्टार्ट करा</translation>
-<translation id="3288003805934695103">पृष्ठ रीलोड करणे</translation>
 <translation id="3305707030755673451">आपला डेटा आपल्या संकालन सांकेतिक वाक्यांशासह <ph name="TIME" /> वाजता कूटबद्ध केला होता. संकालन सुरु करण्यासाठी तो प्रविष्ट करा.</translation>
 <translation id="333371639341676808">अतिरिक्त संवाद तयार करण्यापासून या पृष्ठाला प्रतिबंधित करा.</translation>
 <translation id="3340978935015468852">सेटिंग्ज</translation>
@@ -299,7 +299,6 @@
 <translation id="3963721102035795474">वाचक मोड</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> अवरोधित केले आहे</translation>
 <translation id="4021036232240155012">DNS ही नेटवर्क सेवा आहे जी वेबसाइटचे नाव तिच्या इंटरनेट पत्त्यामध्‍ये भाषांतरित करते.</translation>
-<translation id="4021376465026729077">विस्तार अक्षम करणे</translation>
 <translation id="4030383055268325496">&amp;जोडा पूर्ववत करा</translation>
 <translation id="4032534284272647190"><ph name="URL" /> वर प्रवेश नाकारला.</translation>
 <translation id="404928562651467259">चेतावणी:</translation>
@@ -397,7 +396,6 @@
 <translation id="5251803541071282808">मेघ</translation>
 <translation id="5299298092464848405">धोरण विश्लेषित करताना त्रुटी</translation>
 <translation id="5300589172476337783">दर्शवा</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />आपल्या कुकीज साफ करणे<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">क्रॅश अहवाल अक्षम केला गेला आहे.</translation>
 <translation id="5317780077021120954">जतन करा</translation>
 <translation id="5327248766486351172">नाव</translation>
@@ -431,6 +429,7 @@
 <translation id="5629630648637658800">धोरण सेटिंग्ज लोड करण्यात अयशस्वी</translation>
 <translation id="5631439013527180824">अवैध डिव्हाइस व्यवस्थापन टोकन</translation>
 <translation id="5650551054760837876">शोध परिणाम आढळले नाहीत.</translation>
+<translation id="5663999524854166235">सत्यापनासाठी आपल्या कार्डच्या पाठीमागे असलेले 3-अंकी CVC प्रविष्ट करा</translation>
 <translation id="5677928146339483299">अवरोधित</translation>
 <translation id="5710435578057952990">या वेबसाइटची ओळख सत्यापित केली गेली नाही.</translation>
 <translation id="5720705177508910913">वर्तमान वापरकर्ता</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> शोध</translation>
 <translation id="6634865548447745291"><ph name="BEGIN_LINK" />हे प्रमाणपत्र रद्द केले गेल्यामुळे<ph name="END_LINK" /> आपण आत्ता <ph name="SITE" /> ला भेट देऊ शकत नाही. नेटवर्क त्रुटी आणि आक्रमणे सामान्यतः तात्पुरती असतात, यामुळे हे पृष्ठ कदाचित नंतर कार्य करेल.</translation>
 <translation id="6637478299472506933">डाउनलोड अयशस्वी</translation>
-<translation id="6642894344118208103">मोडेम किंवा राउटर रीसेट करणे</translation>
 <translation id="6644283850729428850">हे धोरण नापसंत आहे.</translation>
 <translation id="6646897916597483132">आपल्या कार्डच्या पुढील भागावर असलेले 4-अंकी CVC प्रविष्ट करा</translation>
 <translation id="6656103420185847513">फोल्डर संपादित करा</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb
index 080cde7..20db49f1 100644
--- a/components/strings/components_strings_ms.xtb
+++ b/components/strings/components_strings_ms.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Cache dasar OK</translation>
 <translation id="113188000913989374"><ph name="SITE" /> menyatakan:</translation>
 <translation id="1132774398110320017">Tetapan Auto Isi Chrome...</translation>
+<translation id="113770840981343808">Masukkan CVC 4 digit dari bahagian depan kad anda untuk pengesahan</translation>
 <translation id="1146673768181266552">ID Ranap Sistem <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Pelayan ini tidak dapat membuktikan bahawa domainnya ialah <ph name="DOMAIN" />; sijil keselamatannya tidak dipercayai oleh sistem pengendalian komputer anda. Ini mungkin disebabkan oleh kesilapan konfigurasi atau penyerang yang memintasi sambungan anda.</translation>
 <translation id="1152921474424827756">Akses <ph name="BEGIN_LINK" />salinan cache<ph name="END_LINK" /> <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Dasar tidak dijumpai</translation>
 <translation id="2213606439339815911">Mengambil entri…</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> tidak tersedia</translation>
-<translation id="2227695659599072496">Memeriksa kabel rangkaian atau penghala</translation>
 <translation id="2230458221926704099">Betulkan sambungan anda menggunakan <ph name="BEGIN_LINK" />apl diagnostik<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Nilai ini tidak lagi digunakan untuk dasar ini.</translation>
 <translation id="2262243747453050782">Ralat HTTP</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> memerlukan nama pengguna dan kata laluan.</translation>
 <translation id="2328300916057834155">Mengabaikan penanda halaman tidak sah pada indeks <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Penanda halaman lain</translation>
+<translation id="2357783041215512127">Bayar dengan <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Teruskan</translation>
 <translation id="2367567093518048410">Tahap</translation>
 <translation id="237718015863234333">Tiada alternatif UI tersedia</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Tanda halaman ini</translation>
 <translation id="3270847123878663523">&amp;Buat asal Susun semula</translation>
 <translation id="3286538390144397061">Mulakan Semula Sekarang</translation>
-<translation id="3288003805934695103">Memuatkan semula halaman</translation>
 <translation id="3305707030755673451">Data anda disulitkan dengan ungkapan laluan segerak anda pada <ph name="TIME" />. Masukkannya untuk memulakan penyegerakan.</translation>
 <translation id="333371639341676808">Halang halaman ini daripada mencipta dialog tambahan.</translation>
 <translation id="3340978935015468852">tetapan</translation>
@@ -301,7 +301,6 @@
 <translation id="3963721102035795474">Mod Pembaca</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> disekat</translation>
 <translation id="4021036232240155012">DNS ialah perkhidmatan rangkaian yang menterjemahkan nama tapak web kepada alamat Internetnya.</translation>
-<translation id="4021376465026729077">Melumpuhkan sambungan anda</translation>
 <translation id="4030383055268325496">&amp;Buat asal tambahkan</translation>
 <translation id="4032534284272647190">Akses ke <ph name="URL" /> dinafikan.</translation>
 <translation id="404928562651467259">AMARAN</translation>
@@ -399,7 +398,6 @@
 <translation id="5251803541071282808">Awan</translation>
 <translation id="5299298092464848405">Ralat semasa menghuraikan dasar</translation>
 <translation id="5300589172476337783">Paparkan</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Menghapuskan kuki<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Pelaporan nahas dilumpuhkan.</translation>
 <translation id="5317780077021120954">Simpan</translation>
 <translation id="5327248766486351172">Nama</translation>
@@ -433,6 +431,7 @@
 <translation id="5629630648637658800">Gagal memuatkan tetapan dasar</translation>
 <translation id="5631439013527180824">Token pengurusan peranti tidak sah</translation>
 <translation id="5650551054760837876">Tiada hasil carian ditemui.</translation>
+<translation id="5663999524854166235">Masukkan CVC 3 digit dari bahagian belakang kad anda untuk pengesahan</translation>
 <translation id="5677928146339483299">Disekat</translation>
 <translation id="5710435578057952990">Identiti tapak web ini belum disahkan.</translation>
 <translation id="5720705177508910913">Pengguna semasa</translation>
@@ -505,7 +504,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> Carian</translation>
 <translation id="6634865548447745291">Anda tidak boleh melawati <ph name="SITE" /> sekarang kerana <ph name="BEGIN_LINK" />sijil ini telah dibatalkan<ph name="END_LINK" />. Ralat rangkaian dan serangan biasanya bersifat sementara oleh itu, halaman ini mungkin akan berfungsi sebentar lagi.</translation>
 <translation id="6637478299472506933">Muat Turun Gagal</translation>
-<translation id="6642894344118208103">Tetapkan semula modem atau penghala</translation>
 <translation id="6644283850729428850">Dasar ini telah dikecam.</translation>
 <translation id="6646897916597483132">Masukkan CVC 4 digit dari bahagian depan kad anda</translation>
 <translation id="6656103420185847513">Edit Folder</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb
index 1b75d0b0..1619e94 100644
--- a/components/strings/components_strings_nl.xtb
+++ b/components/strings/components_strings_nl.xtb
@@ -18,6 +18,7 @@
 <translation id="112840717907525620">Cachegeheugen van beleid is OK</translation>
 <translation id="113188000913989374"><ph name="SITE" /> meldt het volgende:</translation>
 <translation id="1132774398110320017">Instellingen voor automatisch aanvullen in Chrome...</translation>
+<translation id="113770840981343808">Geef de viercijferige CVC-code op de voorkant van je kaart op ter verificatie</translation>
 <translation id="1146673768181266552">Crash-ID <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">De server kan niet bewijzen dat dit <ph name="DOMAIN" /> is. Het beveiligingscertificaat van de server wordt niet vertrouwd door het besturingssysteem van je computer. Dit kan worden veroorzaakt door een verkeerde configuratie of een aanvaller die je verbinding onderschept.</translation>
 <translation id="1152921474424827756">Een <ph name="BEGIN_LINK" />gecacht exemplaar<ph name="END_LINK" /> van <ph name="URL" /> openen</translation>
@@ -112,7 +113,6 @@
 <translation id="2212735316055980242">Beleid niet gevonden</translation>
 <translation id="2213606439339815911">Items ophalen…</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> is niet beschikbaar</translation>
-<translation id="2227695659599072496">Controleer de netwerkkabel of router</translation>
 <translation id="2230458221926704099">Los problemen met je verbinding op met de <ph name="BEGIN_LINK" />diagnose-app<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Deze waarde is verouderd voor dit beleid.</translation>
 <translation id="2262243747453050782">HTTP-fout</translation>
@@ -125,6 +125,7 @@
 <translation id="2317259163369394535">Voor <ph name="DOMAIN" /> zijn een gebruikersnaam en een wachtwoord vereist.</translation>
 <translation id="2328300916057834155">Ongeldige bladwijzer genegeerd bij index <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Andere bladwijzers</translation>
+<translation id="2357783041215512127">Betalen met <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Doorgaan</translation>
 <translation id="2367567093518048410">Niveau</translation>
 <translation id="237718015863234333">Geen UI-alternatieven beschikbaar</translation>
@@ -215,7 +216,6 @@
 <translation id="3254409185687681395">Bladwijzer instellen voor deze pagina</translation>
 <translation id="3270847123878663523">&amp;Volgorde wijzigen ongedaan maken</translation>
 <translation id="3286538390144397061">Nu herstarten</translation>
-<translation id="3288003805934695103">Laad de pagina opnieuw</translation>
 <translation id="3305707030755673451">Je gegevens zijn op <ph name="TIME" /> versleuteld met je wachtwoordzin voor synchronisatie. Geef deze op om de synchronisatie te starten.</translation>
 <translation id="333371639341676808">Voorkom dat deze pagina extra dialoogvensters weergeeft.</translation>
 <translation id="3340978935015468852">instellingen</translation>
@@ -286,7 +286,6 @@
 <translation id="3963721102035795474">Lezermodus</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> wordt geblokkeerd</translation>
 <translation id="4021036232240155012">DNS is de netwerkservice die de naam van een website omzet naar het bijbehorende internetadres.</translation>
-<translation id="4021376465026729077">Schakel je extensies uit</translation>
 <translation id="4030383055268325496">&amp;Toevoegen ongedaan maken</translation>
 <translation id="4032534284272647190">Toegang tot <ph name="URL" /> geweigerd.</translation>
 <translation id="404928562651467259">WAARSCHUWING</translation>
@@ -384,7 +383,6 @@
 <translation id="5251803541071282808">Cloud</translation>
 <translation id="5299298092464848405">Fout bij het parseren van het beleid</translation>
 <translation id="5300589172476337783">Weergeven</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Wis je cookies<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Crashrapportage is uitgeschakeld.</translation>
 <translation id="5317780077021120954">Opslaan</translation>
 <translation id="5327248766486351172">Naam</translation>
@@ -418,6 +416,7 @@
 <translation id="5629630648637658800">Laden van beleidsinstellingen is mislukt</translation>
 <translation id="5631439013527180824">Ongeldige token voor apparaatbeheer</translation>
 <translation id="5650551054760837876">Geen zoekresultaten gevonden.</translation>
+<translation id="5663999524854166235">Geef de driecijferige CVC-code op de achterkant van je kaart op ter verificatie</translation>
 <translation id="5677928146339483299">Geblokkeerd</translation>
 <translation id="5710435578057952990">De identiteit van deze website is niet geverifieerd.</translation>
 <translation id="5720705177508910913">Huidige gebruiker</translation>
@@ -488,7 +487,6 @@
 <translation id="6628463337424475685">Zoeken via <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">Je kunt <ph name="SITE" /> op dit moment niet bezoeken, omdat <ph name="BEGIN_LINK" />dit certificaat is ingetrokken<ph name="END_LINK" />. Netwerkfouten en aanvallen zijn doorgaans tijdelijk, dus deze pagina werkt later waarschijnlijk correct.</translation>
 <translation id="6637478299472506933">Download is mislukt</translation>
-<translation id="6642894344118208103">Stel de modem of router opnieuw in</translation>
 <translation id="6644283850729428850">Dit beleid is verouderd.</translation>
 <translation id="6646897916597483132">Geef de viercijferige CVC-code op die op de voorkant van je kaart staat</translation>
 <translation id="6656103420185847513">Map bewerken</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index ad218e3e..5e818cf5 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Bufferen for enhetsinnstillinger er OK</translation>
 <translation id="113188000913989374"><ph name="SITE" /> sier:</translation>
 <translation id="1132774398110320017">Innstillinger for autofyll i Chrome</translation>
+<translation id="113770840981343808">Skriv inn den firesifrede verifiseringskoden du finner på forsiden av kortet ditt</translation>
 <translation id="1146673768181266552">Krasj-ID <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Denne tjeneren kunne ikke bevise at den er <ph name="DOMAIN" />. Sikkerhetssertifikatet til tjeneren er ikke klarert av datamaskinens operativsystem. Dette kan være forårsaket av en feilkonfigurering eller en angriper som avskjærer tilkoblingen din.</translation>
 <translation id="1152921474424827756">Åpne en <ph name="BEGIN_LINK" />bufret kopi<ph name="END_LINK" /> av <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Innstillingene ble ikke funnet</translation>
 <translation id="2213606439339815911">Henter oppføringer …</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> er ikke tilgjengelig</translation>
-<translation id="2227695659599072496">Sjekk nettverkskabelen eller ruteren</translation>
 <translation id="2230458221926704099">Løs tilkoblingsproblemene med <ph name="BEGIN_LINK" />diagnostikkappen<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Denne verdien er foreldet for denne innstillingen.</translation>
 <translation id="2262243747453050782">HTTP-feil</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> krever brukernavn og passord.</translation>
 <translation id="2328300916057834155">Ignorerte ugyldig bokmerke ved indeks <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Andre bokmerker</translation>
+<translation id="2357783041215512127">Betal med <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Fortsett</translation>
 <translation id="2367567093518048410">Nivå</translation>
 <translation id="237718015863234333">Det er ingen tilgjengelige alternativer for brukergrensesnitt</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Legg til bokmerke for denne siden</translation>
 <translation id="3270847123878663523">&amp;Angre omorganiseringen</translation>
 <translation id="3286538390144397061">Start på nytt nå</translation>
-<translation id="3288003805934695103">Last inn siden på nytt</translation>
 <translation id="3305707030755673451">Dataene dine er kryptert med passordfrasen din for synkronisering <ph name="TIME" />. Skriv den inn for å starte synkroniseringen.</translation>
 <translation id="333371639341676808">Hindre denne siden i å opprette flere dialogbokser.</translation>
 <translation id="3340978935015468852">innstillinger</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">Lesermodus</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> er blokkert</translation>
 <translation id="4021036232240155012">DNS er nettverkstjenesten som oversetter navnene på nettsteder til Internett-adressene deres.</translation>
-<translation id="4021376465026729077">Slå av utvidelsene dine</translation>
 <translation id="4030383055268325496">&amp;Angre tilleggingen</translation>
 <translation id="4032534284272647190">Tilgang til <ph name="URL" /> ble avvist.</translation>
 <translation id="404928562651467259">ADVARSEL</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Nettsky</translation>
 <translation id="5299298092464848405">Feil under analysen av enhetsinnstillingene</translation>
 <translation id="5300589172476337783">Vis</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Slett informasjonskapslene dine<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Rapportering av programstopp er deaktivert.</translation>
 <translation id="5317780077021120954">Lagre</translation>
 <translation id="5327248766486351172">Navn</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">Kunne ikke laste in angivelsen for enhetsinnstillinger</translation>
 <translation id="5631439013527180824">Ugyldig token for enhetsadministrering</translation>
 <translation id="5650551054760837876">Ingen søkeresultater funnet.</translation>
+<translation id="5663999524854166235">Skriv inn den tresifrede verifiseringskoden du finner på baksiden av kortet ditt</translation>
 <translation id="5677928146339483299">Blokkert</translation>
 <translation id="5710435578057952990">Identiteten til dette nettstedet er ikke verifisert.</translation>
 <translation id="5720705177508910913">Gjeldende bruker</translation>
@@ -473,7 +472,7 @@
 <translation id="6262796033958342538">Mottok flere distinkte Location-overskrifter. Dette er forbudt, for å beskytte
     mot angrep som splitter HTTP-svar.</translation>
 <translation id="6263376278284652872"><ph name="DOMAIN" />-bokmerker</translation>
-<translation id="6264485186158353794">Til trygg havn</translation>
+<translation id="6264485186158353794">Tilbake til trygg grunn</translation>
 <translation id="6282194474023008486">Postnummer</translation>
 <translation id="6305205051461490394"><ph name="URL" /> er ikke tilgjengelig.</translation>
 <translation id="6321917430147971392">Kontrollér DNS-innstillingene dine</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> Søk</translation>
 <translation id="6634865548447745291">Du kan ikke gå til <ph name="SITE" /> akkurat nå fordi <ph name="BEGIN_LINK" />dette sertifikatet er tilbakekalt<ph name="END_LINK" />. Nettverksfeil og -angrep er som regel kortvarige, så denne siden fungerer nok igjen senere.</translation>
 <translation id="6637478299472506933">Nedlastingen mislyktes</translation>
-<translation id="6642894344118208103">Tilbakestill modemet eller ruteren</translation>
 <translation id="6644283850729428850">Denne retningslinjen er foreldet.</translation>
 <translation id="6646897916597483132">Skriv inn den firesifrede CVC-koden du finner på forsiden av kortet ditt.</translation>
 <translation id="6656103420185847513">Mapperedigering</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb
index aa68415..16f75529 100644
--- a/components/strings/components_strings_pl.xtb
+++ b/components/strings/components_strings_pl.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Pamięć podręczna zasad: OK</translation>
 <translation id="113188000913989374">Komunikat ze strony <ph name="SITE" />:</translation>
 <translation id="1132774398110320017">Ustawienia autouzupełniania Chrome...</translation>
+<translation id="113770840981343808">Aby dokonać weryfikacji, wpisz czterocyfrowy kod CVC widoczny na przodzie karty</translation>
 <translation id="1146673768181266552">Identyfikator awarii: <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa nie jest zaufany w systemie operacyjnym tego komputera. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia przez atakującego.</translation>
 <translation id="1152921474424827756">Przejdź do <ph name="BEGIN_LINK" />kopii<ph name="END_LINK" /> <ph name="URL" /> w pamięci podręcznej</translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Nie znaleziono zasady</translation>
 <translation id="2213606439339815911">Pobieram wpisy...</translation>
 <translation id="2214283295778284209">Witryna <ph name="SITE" /> jest niedostępna</translation>
-<translation id="2227695659599072496">Sprawdź kabel sieciowy lub router</translation>
 <translation id="2230458221926704099">Napraw połączenie, używając <ph name="BEGIN_LINK" />aplikacji diagnostycznej<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Ta wartość tej zasady została wycofana.</translation>
 <translation id="2262243747453050782">Błąd HTTP</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> wymaga nazwy użytkownika i hasła.</translation>
 <translation id="2328300916057834155">Zignorowano nieprawidłową zakładkę w indeksie <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Inne zakładki</translation>
+<translation id="2357783041215512127">Zapłać kartą <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Kontynuuj</translation>
 <translation id="2367567093518048410">Poziom</translation>
 <translation id="237718015863234333">Brak dostępnych alternatywnych interfejsów</translation>
@@ -227,7 +228,6 @@
 <translation id="3254409185687681395">Dodaj stronę do zakładek</translation>
 <translation id="3270847123878663523">&amp;Cofnij zmianę kolejności</translation>
 <translation id="3286538390144397061">Uruchom ponownie teraz</translation>
-<translation id="3288003805934695103">Odśwież stronę</translation>
 <translation id="3305707030755673451">Twoje dane zostały zaszyfrowane z użyciem hasła synchronizacji w dniu <ph name="TIME" />. Wpisz je, by rozpocząć synchronizację.</translation>
 <translation id="333371639341676808">Zapobiegaj wyświetlaniu dodatkowych okien dialogowych na tej stronie.</translation>
 <translation id="3340978935015468852">ustawienia</translation>
@@ -299,7 +299,6 @@
 <translation id="3963721102035795474">Tryb czytnika</translation>
 <translation id="3973234410852337861">Strona <ph name="HOST_NAME" /> jest zablokowana</translation>
 <translation id="4021036232240155012">DNS to usługa sieciowa tłumacząca nazwę serwera na jego adres internetowy.</translation>
-<translation id="4021376465026729077">Wyłącz rozszerzenia</translation>
 <translation id="4030383055268325496">&amp;Cofnij dodanie</translation>
 <translation id="4032534284272647190">Odmówiono dostępu do <ph name="URL" />.</translation>
 <translation id="404928562651467259">OSTRZEŻENIE</translation>
@@ -397,7 +396,6 @@
 <translation id="5251803541071282808">Chmura</translation>
 <translation id="5299298092464848405">Podczas przetwarzania zasady wystąpił błąd</translation>
 <translation id="5300589172476337783">Pokaż</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Usuń pliki cookie<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Funkcja zgłaszania awarii jest wyłączona.</translation>
 <translation id="5317780077021120954">Zapisz</translation>
 <translation id="5327248766486351172">Nazwa</translation>
@@ -431,6 +429,7 @@
 <translation id="5629630648637658800">Ładowanie ustawień zasady nie powiodło się</translation>
 <translation id="5631439013527180824">Nieprawidłowy token zarządzania urządzeniem</translation>
 <translation id="5650551054760837876">Nie znaleziono wyników wyszukiwania.</translation>
+<translation id="5663999524854166235">Aby dokonać weryfikacji, wpisz trzycyfrowy kod CVC widoczny na odwrocie karty</translation>
 <translation id="5677928146339483299">Zablokowane</translation>
 <translation id="5710435578057952990">Tożsamość witryny nie została zweryfikowana.</translation>
 <translation id="5720705177508910913">Bieżący użytkownik</translation>
@@ -503,7 +502,6 @@
 <translation id="6628463337424475685">Wyszukiwarka <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">Nie możesz teraz odwiedzić strony <ph name="SITE" />, bo <ph name="BEGIN_LINK" />ten certyfikat został unieważniony<ph name="END_LINK" />. Błędy sieci i ataki są zazwyczaj przejściowe, więc prawdopodobnie strona będzie wkrótce działać.</translation>
 <translation id="6637478299472506933">Błąd pobierania</translation>
-<translation id="6642894344118208103">Zresetuj modem lub router</translation>
 <translation id="6644283850729428850">Zasada jest przestarzała.</translation>
 <translation id="6646897916597483132">Wpisz czterocyfrowy kod CVC widoczny na przodzie karty</translation>
 <translation id="6656103420185847513">Folder edytora</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb
index 0f9744f..95bcfac 100644
--- a/components/strings/components_strings_pt-BR.xtb
+++ b/components/strings/components_strings_pt-BR.xtb
@@ -118,7 +118,6 @@
 <translation id="2212735316055980242">Política não encontrada</translation>
 <translation id="2213606439339815911">Buscando entradas...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> não está disponível</translation>
-<translation id="2227695659599072496">Verificar o cabo de rede ou roteador</translation>
 <translation id="2230458221926704099">Corrija sua conexão usando o <ph name="BEGIN_LINK" />app de diagnóstico<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Este valor está obsoleto para esta política.</translation>
 <translation id="2262243747453050782">Erro HTTP</translation>
@@ -228,7 +227,6 @@
 <translation id="3254409185687681395">Adicionar esta página aos favoritos</translation>
 <translation id="3270847123878663523">&amp;Desfazer reordenar</translation>
 <translation id="3286538390144397061">Reiniciar agora</translation>
-<translation id="3288003805934695103">Atualizar a página</translation>
 <translation id="3305707030755673451">Seus dados foram criptografados com sua senha longa de sincronização no dia <ph name="TIME" />. Informe-a para começar a sincronização.</translation>
 <translation id="333371639341676808">Impedir que esta página crie caixas de diálogo adicionais.</translation>
 <translation id="3340978935015468852">configurações</translation>
@@ -300,7 +298,6 @@
 <translation id="3963721102035795474">Modo leitor</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> está bloqueado</translation>
 <translation id="4021036232240155012">O DNS é o serviço de rede que converte o nome de um website para o próprio endereço de Internet.</translation>
-<translation id="4021376465026729077">Desativar as extensões</translation>
 <translation id="4030383055268325496">&amp;Desfazer adicionar</translation>
 <translation id="4032534284272647190">O acesso a <ph name="URL" /> foi negado.</translation>
 <translation id="404928562651467259">AVISO</translation>
@@ -398,7 +395,6 @@
 <translation id="5251803541071282808">Nuvem</translation>
 <translation id="5299298092464848405">Política de análise de erros</translation>
 <translation id="5300589172476337783">Mostrar</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Limpar os cookies<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">O relatório de erros está desativado.</translation>
 <translation id="5317780077021120954">Salvar</translation>
 <translation id="5327248766486351172">Nome</translation>
@@ -504,7 +500,6 @@
 <translation id="6628463337424475685">Pesquisa do <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">Não é possível acessar <ph name="SITE" /> no momento, porque <ph name="BEGIN_LINK" />este certificado foi revogado<ph name="END_LINK" />. Ataques e erros de rede geralmente são temporários. Portanto, essa página provavelmente funcionará mais tarde.</translation>
 <translation id="6637478299472506933">Falha no download</translation>
-<translation id="6642894344118208103">Redefinir o modem ou roteador</translation>
 <translation id="6644283850729428850">Esta política foi encerrada.</translation>
 <translation id="6646897916597483132">Digite o CVC de quatro dígitos que aparece na parte frontal do seu cartão</translation>
 <translation id="6656103420185847513">Editar pasta</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb
index 7f71fbb..a63f346 100644
--- a/components/strings/components_strings_pt-PT.xtb
+++ b/components/strings/components_strings_pt-PT.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Cache da política OK</translation>
 <translation id="113188000913989374"><ph name="SITE" /> diz:</translation>
 <translation id="1132774398110320017">Definições de Preenchimento automático do Chrome...</translation>
+<translation id="113770840981343808">Introduza o Código de Segurança/CVC de quatro dígitos que se encontra na parte da frente do cartão para validação</translation>
 <translation id="1146673768181266552">ID de falha <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Este servidor não conseguiu provar que é o domínio <ph name="DOMAIN" />; o sistema operativo do seu computador não confia no respetivo certificado de segurança. Isto pode ser o resultado de uma configuração incorreta ou de um invasor a intercetar a sua ligação.</translation>
 <translation id="1152921474424827756">Aceda a uma <ph name="BEGIN_LINK" />cópia em cache<ph name="END_LINK" /> de <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Política não encontrada</translation>
 <translation id="2213606439339815911">A obter entradas...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> não está disponível</translation>
-<translation id="2227695659599072496">Verificar o cabo de rede ou o router</translation>
 <translation id="2230458221926704099">Utilize a <ph name="BEGIN_LINK" />aplicação de diagnóstico<ph name="END_LINK" /> para corrigir a ligação</translation>
 <translation id="225207911366869382">Este valor está desatualizado para esta política.</translation>
 <translation id="2262243747453050782">Erro HTTP</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535">O domínio <ph name="DOMAIN" /> requer um nome de utilizador e uma palavra-passe.</translation>
 <translation id="2328300916057834155">Marcador inválido ignorado no índice <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Outros marcadores</translation>
+<translation id="2357783041215512127">Pagar com <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Continuar</translation>
 <translation id="2367567093518048410">Nível</translation>
 <translation id="237718015863234333">Nenhuma alternativa da interface disponível</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Marcar esta página</translation>
 <translation id="3270847123878663523">&amp;Anular reordenação</translation>
 <translation id="3286538390144397061">Reiniciar agora</translation>
-<translation id="3288003805934695103">Atualizar a página</translation>
 <translation id="3305707030755673451">Os dados foram encriptados com a sua frase de acesso de sincronização em <ph name="TIME" />. Introduza-a para iniciar a sincronização.</translation>
 <translation id="333371639341676808">Evitar que esta página crie caixas de diálogo adicionais.</translation>
 <translation id="3340978935015468852">definições</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">Modo de leitor</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> está bloqueado</translation>
 <translation id="4021036232240155012">O DNS é o serviço de rede que converte o nome de um Website no respetivo endereço de Internet.</translation>
-<translation id="4021376465026729077">Desativar as extensões</translation>
 <translation id="4030383055268325496">&amp;Anular adição</translation>
 <translation id="4032534284272647190">O acesso a <ph name="URL" /> foi negado.</translation>
 <translation id="404928562651467259">AVISO</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Nuvem</translation>
 <translation id="5299298092464848405">Erro ao analisar a política</translation>
 <translation id="5300589172476337783">Mostrar</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Limpar os cookies<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">O relatório de falha está desativado.</translation>
 <translation id="5317780077021120954">Guardar</translation>
 <translation id="5327248766486351172">Nome</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">Falha ao carregar as definições da política</translation>
 <translation id="5631439013527180824">Token de gestão do dispositivo inválido</translation>
 <translation id="5650551054760837876">Nenhum resultado de pesquisa encontrado.</translation>
+<translation id="5663999524854166235">Introduza o Código de Segurança/CVC de três dígitos que se encontra no verso do cartão para validação</translation>
 <translation id="5677928146339483299">Bloqueado</translation>
 <translation id="5710435578057952990">A identidade deste Web site não foi verificada.</translation>
 <translation id="5720705177508910913">Utilizador atual</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> Pesquisar</translation>
 <translation id="6634865548447745291">De momento, não é possível visitar <ph name="SITE" /> porque <ph name="BEGIN_LINK" />este certificado foi revogado<ph name="END_LINK" />. Os erros de rede e os ataques normalmente são temporários, por isso, esta página voltará provavelmente a funcionar.</translation>
 <translation id="6637478299472506933">A Transferência Falhou</translation>
-<translation id="6642894344118208103">Repor o modem ou o router</translation>
 <translation id="6644283850729428850">Esta política está obsoleta.</translation>
 <translation id="6646897916597483132">Introduza o Código de Segurança/CVC de quatro dígitos que se encontra na parte da frente do cartão</translation>
 <translation id="6656103420185847513">Editar Pasta</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb
index 7b50852..13e28e8 100644
--- a/components/strings/components_strings_ro.xtb
+++ b/components/strings/components_strings_ro.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Memoria cache pentru politică este OK</translation>
 <translation id="113188000913989374"><ph name="SITE" /> afișează mesajul:</translation>
 <translation id="1132774398110320017">Setări de completare automată în Chrome...</translation>
+<translation id="113770840981343808">Pentru confirmare, introdu codul CVC alcătuit din 4 cifre înscris pe fața cardului</translation>
 <translation id="1146673768181266552">ID blocare <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Acest server nu a putut dovedi că este <ph name="DOMAIN" />; sistemul de operare al computerului nu consideră că certificatul său de securitate este de încredere. Cauza poate fi o configurare greșită sau interceptarea conexiunii de către un atacator.</translation>
 <translation id="1152921474424827756">Accesați o <ph name="BEGIN_LINK" />copie păstrată în memoria cache<ph name="END_LINK" /> a site-ului <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Politica nu a fost găsită</translation>
 <translation id="2213606439339815911">Se preiau intrările...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> nu este disponibil</translation>
-<translation id="2227695659599072496">să verifici cablul de rețea și routerul;</translation>
 <translation id="2230458221926704099">Remediază conexiunea folosind <ph name="BEGIN_LINK" />aplicația de diagnosticare<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Valoarea este învechită pentru această politică.</translation>
 <translation id="2262243747453050782">Eroare HTTP</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> necesită un nume de utilizator și o parolă.</translation>
 <translation id="2328300916057834155">Marcaj nevalid ignorat la indexul <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Alte marcaje</translation>
+<translation id="2357783041215512127">Plătește cu <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Continuă</translation>
 <translation id="2367567093518048410">Nivel</translation>
 <translation id="237718015863234333">Nu sunt disponibile interfețe de utilizare alternative</translation>
@@ -227,7 +228,6 @@
 <translation id="3254409185687681395">Marcați această pagină</translation>
 <translation id="3270847123878663523">&amp;Anulați reordonarea</translation>
 <translation id="3286538390144397061">Repornește acum</translation>
-<translation id="3288003805934695103">să reîncarci pagina;</translation>
 <translation id="3305707030755673451">Datele au fost criptate cu expresia de acces pentru sincronizare la <ph name="TIME" />. Introdu-o pentru a începe sincronizarea.</translation>
 <translation id="333371639341676808">Împiedică această pagină să creeze alte casete de dialog.</translation>
 <translation id="3340978935015468852">setări</translation>
@@ -299,7 +299,6 @@
 <translation id="3963721102035795474">Modul Cititor</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> este blocat</translation>
 <translation id="4021036232240155012">DNS este serviciul de rețea care translatează numele unui site în adresa sa de internet.</translation>
-<translation id="4021376465026729077">să dezactivezi extensiile;</translation>
 <translation id="4030383055268325496">&amp;Anulați adăugarea</translation>
 <translation id="4032534284272647190">Accesul la <ph name="URL" /> nu este permis.</translation>
 <translation id="404928562651467259">AVERTISMENT</translation>
@@ -397,7 +396,6 @@
 <translation id="5251803541071282808">Cloud</translation>
 <translation id="5299298092464848405">Eroare la analizarea politicii</translation>
 <translation id="5300589172476337783">Afișează</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />să ștergi cookie-urile;<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Raportarea blocărilor este dezactivată.</translation>
 <translation id="5317780077021120954">Salvează</translation>
 <translation id="5327248766486351172">Nume</translation>
@@ -431,6 +429,7 @@
 <translation id="5629630648637658800">Setările pentru politică nu au putut fi încărcate</translation>
 <translation id="5631439013527180824">Indicativ nevalid pentru gestionarea gadgetului</translation>
 <translation id="5650551054760837876">Nu au fost găsite rezultate de căutare.</translation>
+<translation id="5663999524854166235">Pentru confirmare, introdu codul CVC alcătuit din 3 cifre înscris pe spatele cardului</translation>
 <translation id="5677928146339483299">Blocat</translation>
 <translation id="5710435578057952990">Identitatea acestui site nu a fost confirmată.</translation>
 <translation id="5720705177508910913">Utilizator curent</translation>
@@ -503,7 +502,6 @@
 <translation id="6628463337424475685">Căutare <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">Nu puteți accesa acum site-ul <ph name="SITE" />, deoarece <ph name="BEGIN_LINK" />acest certificat a fost revocat<ph name="END_LINK" />. Erorile de rețea și atacurile sunt de obicei temporare și probabil că această pagină va funcționa mai târziu.</translation>
 <translation id="6637478299472506933">Descărc. nu a reușit</translation>
-<translation id="6642894344118208103">să resetezi modemul sau routerul;</translation>
 <translation id="6644283850729428850">Această politică este învechită.</translation>
 <translation id="6646897916597483132">Introdu codul CVC alcătuit din 4 cifre înscris pe fața a cardului</translation>
 <translation id="6656103420185847513">Modificați dosarul</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb
index b3157c4..c11d5333 100644
--- a/components/strings/components_strings_ru.xtb
+++ b/components/strings/components_strings_ru.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">В кеше политики ошибок не найдено</translation>
 <translation id="113188000913989374">Подтвердите действие на <ph name="SITE" />:</translation>
 <translation id="1132774398110320017">Настройки автозаполнения в Chrome...</translation>
+<translation id="113770840981343808">Введите четырехзначный CVC-код, указанный на лицевой стороне карты.</translation>
 <translation id="1146673768181266552">Идентификатор ошибки <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Не удалось подтвердить, что это сервер <ph name="DOMAIN" />. Операционная система компьютера не доверяет его сертификату безопасности. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные.</translation>
 <translation id="1152921474424827756">Открыть <ph name="BEGIN_LINK" />кешированную версию<ph name="END_LINK" /> страницы <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Политика для устройства не найдена</translation>
 <translation id="2213606439339815911">Извлечение записей…</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> недоступен</translation>
-<translation id="2227695659599072496">Проверьте сетевой кабель или маршрутизатор.</translation>
 <translation id="2230458221926704099">Чтобы устранить неполадки, проведите <ph name="BEGIN_LINK" />диагностику<ph name="END_LINK" /> подключения.</translation>
 <translation id="225207911366869382">Это значение для данного правила больше не используется.</translation>
 <translation id="2262243747453050782">Ошибка HTTP</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535">Для доступа к домену <ph name="DOMAIN" /> необходимо указать имя пользователя и пароль.</translation>
 <translation id="2328300916057834155">Пропущена недопустимая закладка, индекс <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Другие закладки</translation>
+<translation id="2357783041215512127">Оплата (<ph name="CREDIT_CARD" />)</translation>
 <translation id="2359808026110333948">Далее</translation>
 <translation id="2367567093518048410">Уровень</translation>
 <translation id="237718015863234333">Ничего не найдено</translation>
@@ -227,7 +228,6 @@
 <translation id="3254409185687681395">Добавить страницу в закладки</translation>
 <translation id="3270847123878663523">&amp;Отменить изменение порядка</translation>
 <translation id="3286538390144397061">Перезапустить сейчас</translation>
-<translation id="3288003805934695103">Обновите страницу.</translation>
 <translation id="3305707030755673451">Данные были зашифрованы с помощью кодовой фразы <ph name="TIME" />. Введите ее, чтобы начать синхронизацию.</translation>
 <translation id="333371639341676808">Предотвратить создание дополнительных диалоговых окон на этой странице.</translation>
 <translation id="3340978935015468852">настройках</translation>
@@ -299,7 +299,6 @@
 <translation id="3963721102035795474">Режим чтения</translation>
 <translation id="3973234410852337861">Сайт <ph name="HOST_NAME" /> заблокирован</translation>
 <translation id="4021036232240155012">DNS – это сетевая служба, преобразующая название сайта в IP-адрес.</translation>
-<translation id="4021376465026729077">Отключите расширения.</translation>
 <translation id="4030383055268325496">&amp;Отменить добавление</translation>
 <translation id="4032534284272647190">Доступ к <ph name="URL" /> запрещен.</translation>
 <translation id="404928562651467259">Внимание!</translation>
@@ -397,7 +396,6 @@
 <translation id="5251803541071282808">Облако</translation>
 <translation id="5299298092464848405">Не удалось выполнить анализ политики</translation>
 <translation id="5300589172476337783">Показать</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Удалите файлы cookie<ph name="END_LINK" />.</translation>
 <translation id="5308689395849655368">Отчеты о сбоях отключены.</translation>
 <translation id="5317780077021120954">Сохранить</translation>
 <translation id="5327248766486351172">Название</translation>
@@ -431,6 +429,7 @@
 <translation id="5629630648637658800">Не удалось применить настройки политики</translation>
 <translation id="5631439013527180824">Токен устройства недействителен</translation>
 <translation id="5650551054760837876">Ничего не найдено.</translation>
+<translation id="5663999524854166235">Введите трехзначный CVC-код, указанный на обратной стороне карты.</translation>
 <translation id="5677928146339483299">Заблокировано</translation>
 <translation id="5710435578057952990">Идентификационные данные этого сайта не проверены.</translation>
 <translation id="5720705177508910913">Текущий пользователь</translation>
@@ -503,7 +502,6 @@
 <translation id="6628463337424475685">Поиск <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">Перейти на сайт <ph name="SITE" /> невозможно, так как <ph name="BEGIN_LINK" />его сертификат отозван<ph name="END_LINK" />. Это могло произойти из-за ошибки сети или атаки на сайт. Скорее всего, он заработает через некоторое время.</translation>
 <translation id="6637478299472506933">Ошибка при скачивании</translation>
-<translation id="6642894344118208103">Сбросьте настройки модема или маршрутизатора.</translation>
 <translation id="6644283850729428850">Правило устарело.</translation>
 <translation id="6646897916597483132">Введите четырехзначный CVC-код, указанный на лицевой стороне карты.</translation>
 <translation id="6656103420185847513">Редактировать папку</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb
index 5755fdd..6525591 100644
--- a/components/strings/components_strings_sk.xtb
+++ b/components/strings/components_strings_sk.xtb
@@ -18,6 +18,7 @@
 <translation id="112840717907525620">Vyrovnávacia pamäť pravidla je v poriadku</translation>
 <translation id="113188000913989374">Web <ph name="SITE" /> hovorí:</translation>
 <translation id="1132774398110320017">Nastavenia Automatického dopĺňania prehliadača Chrome...</translation>
+<translation id="113770840981343808">Na účely overenia zadajte štvormiestny kód CVC z prednej strany svojej karty</translation>
 <translation id="1146673768181266552">ID zlyhania <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Server nedokáže overiť, či ide o doménu <ph name="DOMAIN" />, operačný systém vášho počítača nedôveruje jej bezpečnostnému certifikátu. Môže to byť spôsobené nesprávnou konfiguráciou alebo tým, že vaše pripojenie zachytil útočník.</translation>
 <translation id="1152921474424827756">Prístup ku <ph name="BEGIN_LINK" />kópii vo vyrovnávacej pamäti<ph name="END_LINK" /> stránky <ph name="URL" /></translation>
@@ -112,7 +113,6 @@
 <translation id="2212735316055980242">Pravidlo sa nenašlo</translation>
 <translation id="2213606439339815911">Načítavanie záznamov...</translation>
 <translation id="2214283295778284209">Stránka <ph name="SITE" /> je nedostupná.</translation>
-<translation id="2227695659599072496">Skontrolovať sieťový kábel alebo smerovač</translation>
 <translation id="2230458221926704099">Opravte svoje pripojenie pomocou <ph name="BEGIN_LINK" />diagnostickej aplikácie<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Táto hodnota už pre toto pravidlo nie je podporovaná.</translation>
 <translation id="2262243747453050782">Chyba protokolu HTTP</translation>
@@ -125,6 +125,7 @@
 <translation id="2317259163369394535">Doména <ph name="DOMAIN" /> vyžaduje používateľské meno a heslo.</translation>
 <translation id="2328300916057834155">Neplatná záložka v indexe <ph name="ENTRY_INDEX" /> bola ignorovaná</translation>
 <translation id="2354001756790975382">Iné záložky</translation>
+<translation id="2357783041215512127">Platba kartou <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Pokračovať</translation>
 <translation id="2367567093518048410">Úroveň</translation>
 <translation id="237718015863234333">Nie sú k dispozícii žiadne alternatívy používateľského rozhrania</translation>
@@ -215,7 +216,6 @@
 <translation id="3254409185687681395">Vytvoriť záložku pre túto stránku</translation>
 <translation id="3270847123878663523">&amp;Vrátiť späť zmenu poradia</translation>
 <translation id="3286538390144397061">Reštartovať</translation>
-<translation id="3288003805934695103">Opätovne načítať stránku</translation>
 <translation id="3305707030755673451">Vaše údaje boli <ph name="TIME" /> zašifrované pomocou vlastnej prístupovej frázy synchronizácie. Keď ju zadáte, synchronizácia sa spustí.</translation>
 <translation id="333371639341676808">Zakázať tejto stránke otvárať ďalšie dialógové okná.</translation>
 <translation id="3340978935015468852">nastavenia</translation>
@@ -286,7 +286,6 @@
 <translation id="3963721102035795474">Režim čítačky</translation>
 <translation id="3973234410852337861">Web <ph name="HOST_NAME" /> je zablokovaný</translation>
 <translation id="4021036232240155012">DNS je sieťová služba, ktorá preloží názov webu do jeho internetovej adresy.</translation>
-<translation id="4021376465026729077">Zakázať rozšírenia</translation>
 <translation id="4030383055268325496">&amp;Vrátiť späť pridanie</translation>
 <translation id="4032534284272647190">Prístup na stránku <ph name="URL" /> bol odmietnutý.</translation>
 <translation id="404928562651467259">UPOZORNENIE</translation>
@@ -384,13 +383,12 @@
 <translation id="5251803541071282808">Cloud</translation>
 <translation id="5299298092464848405">Pri analýze pravidla sa vyskytla chyba</translation>
 <translation id="5300589172476337783">Zobraziť</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Vymazať súbory cookie<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Hlásenie zlyhaní je zakázané.</translation>
 <translation id="5317780077021120954">Uložiť</translation>
 <translation id="5327248766486351172">Názov</translation>
 <translation id="536296301121032821">Nastavenia pravidla sa nepodarilo uložiť</translation>
 <translation id="540969355065856584">Server nedokáže overiť, či ide o doménu <ph name="DOMAIN" /> – jej bezpečnostný certifikát je momentálne neplatný. Môže to byť spôsobené nesprávnou konfiguráciou alebo tým, že vaše pripojenie napadol útočník.</translation>
-<translation id="5421136146218899937">Odstrániť údaje prehliadania...</translation>
+<translation id="5421136146218899937">Odstrániť dáta prehliadania…</translation>
 <translation id="5430298929874300616">Odstrániť záložku</translation>
 <translation id="5431657950005405462">Súbor sa nenašiel</translation>
 <translation id="5435775191620395718">Zobrazuje sa história z tohto zariadenia. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation>
@@ -418,6 +416,7 @@
 <translation id="5629630648637658800">Nastavenia pravidla sa nepodarilo načítať</translation>
 <translation id="5631439013527180824">Neplatný token správy zariadenia</translation>
 <translation id="5650551054760837876">Nenašli sa žiadne výsledky vyhľadávania.</translation>
+<translation id="5663999524854166235">Na účely overenia zadajte trojmiestny kód CVC zo zadnej strany svojej karty</translation>
 <translation id="5677928146339483299">Zablokované</translation>
 <translation id="5710435578057952990">Identita tejto webovej stránky nebola overená.</translation>
 <translation id="5720705177508910913">Aktuálny používateľ</translation>
@@ -488,7 +487,6 @@
 <translation id="6628463337424475685">Vyhľadávanie <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">Stránky <ph name="SITE" /> momentálne nemôžete navštíviť, pretože <ph name="BEGIN_LINK" />tento certifikát bol odvolaný<ph name="END_LINK" />. Chyby siete a útoky sú zvyčajne dočasné, takže by táto stránka mala neskôr pravdepodobne fungovať.</translation>
 <translation id="6637478299472506933">Stiahnutie zlyhalo</translation>
-<translation id="6642894344118208103">Resetovať modem alebo smerovač</translation>
 <translation id="6644283850729428850">Toto pravidlo bolo označené ako zastarané.</translation>
 <translation id="6646897916597483132">Zadajte štvormiestny kód CVC z prednej strany svojej karty</translation>
 <translation id="6656103420185847513">Upraviť priečinok</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb
index 8bfe35d..c32ef7f 100644
--- a/components/strings/components_strings_sl.xtb
+++ b/components/strings/components_strings_sl.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Predpomnilnik pravilnika ustrezen</translation>
 <translation id="113188000913989374"><ph name="SITE" /> sporoča:</translation>
 <translation id="1132774398110320017">Nastavitve samodejnega izpolnjevanja v Chromu …</translation>
+<translation id="113770840981343808">Zaradi preverjanja vnesite štirimestno kodo CVC na sprednji strani kartice</translation>
 <translation id="1146673768181266552">ID zrušitve <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Strežniku ni uspelo dokazati, da je <ph name="DOMAIN" />; operacijski sistem vašega računalnika ne zaupa njegovemu varnostnemu potrdilu. Razlog za to je lahko napačna konfiguracija ali napadalčevo prestrezanje povezave.</translation>
 <translation id="1152921474424827756">Odprite <ph name="BEGIN_LINK" />predpomnjeno kopijo<ph name="END_LINK" /> strani na naslovu <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Pravilnika ni mogoče najti</translation>
 <translation id="2213606439339815911">Prenos vnosov ...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> ni na voljo</translation>
-<translation id="2227695659599072496">preveriti omrežni kabel in usmerjevalnik</translation>
 <translation id="2230458221926704099">Odpravite težave s povezavo z <ph name="BEGIN_LINK" />aplikacijo za diagnostiko<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Vrednost za ta pravilnik je zastarela.</translation>
 <translation id="2262243747453050782">Napaka HTTP</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535">Domena <ph name="DOMAIN" /> zahteva uporabniško ime in geslo.</translation>
 <translation id="2328300916057834155">Neveljaveni zaznamek na indeksu <ph name="ENTRY_INDEX" /> je bil prezrt</translation>
 <translation id="2354001756790975382">Drugi zaznamki</translation>
+<translation id="2357783041215512127">Plačilo s kartico <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Nadaljuj</translation>
 <translation id="2367567093518048410">Raven</translation>
 <translation id="237718015863234333">Ni nadomestnih uporabniških vmesnikov</translation>
@@ -229,7 +230,6 @@
 <translation id="3254409185687681395">Zaznamujte to stran</translation>
 <translation id="3270847123878663523">&amp;Razveljavi razvrstitev</translation>
 <translation id="3286538390144397061">Znova zaženi</translation>
-<translation id="3288003805934695103">znova naložiti stran</translation>
 <translation id="3305707030755673451">Podatki so bili šifrirani z vašim geslom za sinhronizacijo <ph name="TIME" />. Vnesite ga, če želite začeti sinhronizacijo.</translation>
 <translation id="333371639341676808">Tej strani preprečite, da bi ustvarila dodatna pogovorna okna.</translation>
 <translation id="3340978935015468852">nastavitve</translation>
@@ -301,7 +301,6 @@
 <translation id="3963721102035795474">Način bralnika</translation>
 <translation id="3973234410852337861">Spletno mesto <ph name="HOST_NAME" /> je blokirano</translation>
 <translation id="4021036232240155012">DNS je omrežna storitev, ki ime spletnega mesta prevede v njegov internetni naslov.</translation>
-<translation id="4021376465026729077">onemogočiti razširitve</translation>
 <translation id="4030383055268325496">&amp;Razveljavi dodajanje</translation>
 <translation id="4032534284272647190">Dostop do spletnega mesta <ph name="URL" /> zavrnjen.</translation>
 <translation id="404928562651467259">OPOZORILO</translation>
@@ -399,7 +398,6 @@
 <translation id="5251803541071282808">Oblak</translation>
 <translation id="5299298092464848405">Napaka pri razčlenjevanju pravilnika</translation>
 <translation id="5300589172476337783">Pokaži</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />izbrisati piškotke<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Poročanje o zrušitvah je onemogočeno.</translation>
 <translation id="5317780077021120954">Shrani</translation>
 <translation id="5327248766486351172">Ime</translation>
@@ -433,6 +431,7 @@
 <translation id="5629630648637658800">Nastavitev pravilnika ni bilo mogoče naložiti</translation>
 <translation id="5631439013527180824">Neveljaven žeton za upravljanje naprave</translation>
 <translation id="5650551054760837876">Najden ni bil noben rezultat iskanja.</translation>
+<translation id="5663999524854166235">Zaradi preverjanja vnesite trimestno kodo CVC na hrbtni strani kartice</translation>
 <translation id="5677928146339483299">Blokirano</translation>
 <translation id="5710435578057952990">Identiteta tega spletnega mesta ni bila potrjena.</translation>
 <translation id="5720705177508910913">Trenutni uporabnik</translation>
@@ -505,7 +504,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> Iskanje</translation>
 <translation id="6634865548447745291">Spletnega mesta <ph name="SITE" /> trenutno ni mogoče obiskati, saj <ph name="BEGIN_LINK" />je to potrdilo preklicano<ph name="END_LINK" />. Napake omrežja in napadi na omrežje so običajno začasni, zato bo ta stran verjetno delovala pozneje.</translation>
 <translation id="6637478299472506933">Prenos ni uspel</translation>
-<translation id="6642894344118208103">ponastaviti modem ali usmerjevalnik</translation>
 <translation id="6644283850729428850">Ta pravilnik je zastarel.</translation>
 <translation id="6646897916597483132">Vnesite štirimestno kodo CVC na sprednji strani kartice</translation>
 <translation id="6656103420185847513">Urejanje mape</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb
index 2cc783e..1154abc 100644
--- a/components/strings/components_strings_sr.xtb
+++ b/components/strings/components_strings_sr.xtb
@@ -20,6 +20,7 @@
 <translation id="112840717907525620">Кеш смерница је у реду</translation>
 <translation id="113188000913989374"><ph name="SITE" /> каже:</translation>
 <translation id="1132774398110320017">Подешавања Chrome аутоматског попуњавања...</translation>
+<translation id="113770840981343808">Унесите четвороцифрени CVC који се налази на предњој страни картице ради верификације</translation>
 <translation id="1146673768181266552">ИД отказивања <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Овај сервер не може да докаже да је <ph name="DOMAIN" />; оперативни систем рачунара нема поверења у његов безбедносни сертификат. Узрок томе је можда погрешна конфигурација или нападач који је прекинуо везу.</translation>
 <translation id="1152921474424827756">Приступите <ph name="BEGIN_LINK" />кешираној копији<ph name="END_LINK" /> странице <ph name="URL" /></translation>
@@ -117,7 +118,6 @@
 <translation id="2212735316055980242">Смернице нису пронађене</translation>
 <translation id="2213606439339815911">Преузимање уноса...</translation>
 <translation id="2214283295778284209">Сајт <ph name="SITE" /> није доступан</translation>
-<translation id="2227695659599072496">да проверите мрежни кабл или рутер</translation>
 <translation id="2230458221926704099">Поправите везу помоћу <ph name="BEGIN_LINK" />апликације за дијагностику<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Ова вредност је застарела за ове смернице.</translation>
 <translation id="2262243747453050782">HTTP грешка</translation>
@@ -130,6 +130,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> захтева корисничко име и лозинку.</translation>
 <translation id="2328300916057834155">Неважећи обележивач је игнорисан у индексу <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Остали обележивачи</translation>
+<translation id="2357783041215512127">Платите помоћу <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Настави</translation>
 <translation id="2367567093518048410">Ниво</translation>
 <translation id="237718015863234333">Нема доступних алтернатива корисничког интерфејса</translation>
@@ -227,7 +228,6 @@
 <translation id="3254409185687681395">Обележите ову страницу</translation>
 <translation id="3270847123878663523">&amp;Опозови промену редоследа</translation>
 <translation id="3286538390144397061">Поново покрени одмах</translation>
-<translation id="3288003805934695103">да поново учитате страницу</translation>
 <translation id="3305707030755673451">Подаци су шифровани помоћу приступне фразе за синхронизацију <ph name="TIME" />. Унесите је да бисте започели синхронизацију.</translation>
 <translation id="333371639341676808">Спречите ову страницу да прави додатне дијалоге.</translation>
 <translation id="3340978935015468852">подешавања</translation>
@@ -299,7 +299,6 @@
 <translation id="3963721102035795474">Режим читаоца</translation>
 <translation id="3973234410852337861">Хост <ph name="HOST_NAME" /> је блокиран</translation>
 <translation id="4021036232240155012">DNS је мрежна услуга која преводи назив веб-сајта у његову интернет адресу.</translation>
-<translation id="4021376465026729077">да онемогућите додатке</translation>
 <translation id="4030383055268325496">&amp;Опозови додавање</translation>
 <translation id="4032534284272647190">Приступ адреси <ph name="URL" /> је одбијен.</translation>
 <translation id="404928562651467259">УПОЗОРЕЊЕ</translation>
@@ -397,7 +396,6 @@
 <translation id="5251803541071282808">Клауд</translation>
 <translation id="5299298092464848405">Грешка при рашчлањивању смерница</translation>
 <translation id="5300589172476337783">Прикажи</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />да обришете колачиће<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Извештавање о отказивању је онемогућено.</translation>
 <translation id="5317780077021120954">Сачувај</translation>
 <translation id="5327248766486351172">Назив</translation>
@@ -431,6 +429,7 @@
 <translation id="5629630648637658800">Учитавање подешавања смерница није успело</translation>
 <translation id="5631439013527180824">Неважећи токен за управљање уређајима</translation>
 <translation id="5650551054760837876">Није пронађен ниједан резултат.</translation>
+<translation id="5663999524854166235">Унесите троцифрени CVC који се налази на полеђини картице ради верификације</translation>
 <translation id="5677928146339483299">Блокирано</translation>
 <translation id="5710435578057952990">Идентитет овог веб сајта није верификован.</translation>
 <translation id="5720705177508910913">Тренутни корисник</translation>
@@ -501,7 +500,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> претрага</translation>
 <translation id="6634865548447745291">Тренутно не можете да посетите <ph name="SITE" /> зато што је <ph name="BEGIN_LINK" />овај сертификат опозван<ph name="END_LINK" />. Грешке и напади на мрежи су обично привремени, па ће ова страница вероватно функционисати касније.</translation>
 <translation id="6637478299472506933">Преузимање није успело</translation>
-<translation id="6642894344118208103">да ресетујете модем или рутер</translation>
 <translation id="6644283850729428850">Ове смернице су застареле.</translation>
 <translation id="6646897916597483132">Унесите четвороцифрени CVC који се налази на предњој страни картице</translation>
 <translation id="6656103420185847513">Измена директоријума</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb
index 67209d4..53177555 100644
--- a/components/strings/components_strings_sv.xtb
+++ b/components/strings/components_strings_sv.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Cacheminnet för policyn är OK</translation>
 <translation id="113188000913989374"><ph name="SITE" /> säger:</translation>
 <translation id="1132774398110320017">Inställningar för Autofyll i Chrome …</translation>
+<translation id="113770840981343808">Verifiera genom att ange den fyrsiffriga CVC-koden som står på kortets framsida</translation>
 <translation id="1146673768181266552">Krasch-id <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Servern kunde inte bevisa att den är <ph name="DOMAIN" /> eftersom datorns operativsystem inte litar på dess säkerhetscertifikat. Detta kan orsakas av en felaktig konfigurering eller att någon spärrar anslutningen.</translation>
 <translation id="1152921474424827756">Öppna en <ph name="BEGIN_LINK" />cachad kopia<ph name="END_LINK" /> av <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Policyn hittades inte</translation>
 <translation id="2213606439339815911">Hämtar poster …</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> är inte tillgängligt</translation>
-<translation id="2227695659599072496">kontrollera nätverkskabeln eller routern</translation>
 <translation id="2230458221926704099">Åtgärda anslutningsproblemet med hjälp av <ph name="BEGIN_LINK" />diagnostiseringsappen<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Värdet är inte längre giltigt för policyn.</translation>
 <translation id="2262243747453050782">HTTP-fel</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> kräver användarnamn och lösenord.</translation>
 <translation id="2328300916057834155">Ignorerade ogiltigt bokmärke vid index <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Övriga bokmärken</translation>
+<translation id="2357783041215512127">Betala med <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Fortsätt</translation>
 <translation id="2367567093518048410">Nivå</translation>
 <translation id="237718015863234333">Det finns inga användargränssnittsalternativ</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Bokmärk sidan</translation>
 <translation id="3270847123878663523">&amp;Ångra Ändra ordning</translation>
 <translation id="3286538390144397061">Starta om nu</translation>
-<translation id="3288003805934695103">läsa in sidan igen</translation>
 <translation id="3305707030755673451">Din data krypterades med din lösenfras för synkronisering den <ph name="TIME" />. Ange den om du vill starta synkroniseringen.</translation>
 <translation id="333371639341676808">Förhindra att den här sidan öppnar ytterligare dialogrutor.</translation>
 <translation id="3340978935015468852">inställningar</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">Läsarläge</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> har blockerats</translation>
 <translation id="4021036232240155012">DNS är en webbtjänst som översätter namnet på en webbplats till motsvarande internetadress.</translation>
-<translation id="4021376465026729077">inaktivera tilläggen</translation>
 <translation id="4030383055268325496">&amp;Ångra Lägg till</translation>
 <translation id="4032534284272647190">Åtkomst nekad till <ph name="URL" />.</translation>
 <translation id="404928562651467259">VARNING</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Moln</translation>
 <translation id="5299298092464848405">Det uppstod ett fel när policyn analyserades</translation>
 <translation id="5300589172476337783">Visa</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />rensa cookies<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Krashrapportering har  inaktiverats.</translation>
 <translation id="5317780077021120954">Spara</translation>
 <translation id="5327248766486351172">Namn</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">Det gick inte att läsa in policyinställningarna</translation>
 <translation id="5631439013527180824">Ogiltig enhetshanteringstoken</translation>
 <translation id="5650551054760837876">Inga sökresultat hittades.</translation>
+<translation id="5663999524854166235">Verifiera genom att ange den tresiffriga CVC-koden som står på kortets baksida</translation>
 <translation id="5677928146339483299">Blockerad</translation>
 <translation id="5710435578057952990">Webbplatsens identitet har inte verifierats.</translation>
 <translation id="5720705177508910913">Aktuell användare</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> Sök</translation>
 <translation id="6634865548447745291">Det går inte att besöka <ph name="SITE" /> just nu på grund av att <ph name="BEGIN_LINK" />det här certifikatet har återkallats<ph name="END_LINK" />. Nätverksfel och attacker är vanligtvis tillfälliga så sidan fungerar troligen senare.</translation>
 <translation id="6637478299472506933">Nedladdningen misslyckades</translation>
-<translation id="6642894344118208103">återställa modemet eller routern</translation>
 <translation id="6644283850729428850">Policyn är föråldrad.</translation>
 <translation id="6646897916597483132">Ange den fyrsiffriga CVC-koden från kortets framsida</translation>
 <translation id="6656103420185847513">Redigera mapp</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb
index ea2d0c0..71304493 100644
--- a/components/strings/components_strings_sw.xtb
+++ b/components/strings/components_strings_sw.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Akiba ya sera ni SAWA</translation>
 <translation id="113188000913989374"><ph name="SITE" /> unasema:</translation>
 <translation id="1132774398110320017">Mipangilio ya Kujaza otomatiki ya Chrome...</translation>
+<translation id="113770840981343808">Weka CVC ya tarakimu 4 iliyo mbele ya kadi yako ili uthibitishe</translation>
 <translation id="1146673768181266552">Kitambulisho cha kuacha kufanya kazi <ph name="CRASH_ID" /> ( <ph name="CRASH_LOCAL_ID" /> )</translation>
 <translation id="1150979032973867961">Seva hii haikuweza kuthibitisha kuwa ni <ph name="DOMAIN" />; cheti chake cha usalama hakiaminiwi na mfumo wa uendeshaji wa kompyuta yako. Hii inaweza kusababishwa na usanidi usiofaa au mvamizi kuingilia muunganisho wako.</translation>
 <translation id="1152921474424827756">Fikia <ph name="BEGIN_LINK" />nakala iliyowekwa kwenye akiba<ph name="END_LINK" /> ya <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Sera haikupatikana</translation>
 <translation id="2213606439339815911">Inachukua viingizo...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> haipatikani</translation>
-<translation id="2227695659599072496">Kuangalia kebo au kisambaza data cha mtandao</translation>
 <translation id="2230458221926704099">Weka muunganisho wako kwa kutumia <ph name="BEGIN_LINK" />programu ya kuchunguza<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Thamani hii inapingwa kwa sera hii.</translation>
 <translation id="2262243747453050782">Hitilfau ya HTTP</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> inahitaji jina la mtumiaji na nenosiri.</translation>
 <translation id="2328300916057834155">Imepuuzia alamisho batili katika farahasa <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Alamisho zingine</translation>
+<translation id="2357783041215512127">Lipa kwa kutumia <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Endelea</translation>
 <translation id="2367567093518048410">Kiwango</translation>
 <translation id="237718015863234333">Hakuna UI mbadala zinazopatikana</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Alamisha ukurasa huu</translation>
 <translation id="3270847123878663523">Tendua Kupanga upya</translation>
 <translation id="3286538390144397061">Zima na uwashe sasa</translation>
-<translation id="3288003805934695103">Kupakia upya ukurasa</translation>
 <translation id="3305707030755673451">Data yako ilisimbwa kwa njia fiche kwa kauli yako ya siri ya kusawazisha mnamo <ph name="TIME" />. Iweke ili uanze kusawazisha.</translation>
 <translation id="333371639341676808">Zuia ukurasa huu usiulize maswali zaidi.</translation>
 <translation id="3340978935015468852">mipangilio</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">Hali ya Usomaji</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> imezuiwa.</translation>
 <translation id="4021036232240155012">DNS ni huduma za mtandao ambazo hubadilisha jina la tovuti kuwa anwani yake ya Intaneti.</translation>
-<translation id="4021376465026729077">Kuzima viendelezi vyako</translation>
 <translation id="4030383055268325496">Tendua kuongeza</translation>
 <translation id="4032534284272647190">Ufikiaji katika <ph name="URL" /> umekataliwa.</translation>
 <translation id="404928562651467259">ONYO</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Wingu</translation>
 <translation id="5299298092464848405">Hitilafu wakati wa kuchanganua sera</translation>
 <translation id="5300589172476337783">Onyesha</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Kufuta vidakuzi vyako<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Kuripoti uharibifu kumelemazwa.</translation>
 <translation id="5317780077021120954">Hifadhi</translation>
 <translation id="5327248766486351172">Jina</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">Imeshindwa kupakia mipangilio ya sera</translation>
 <translation id="5631439013527180824">Ishara ya usimamizi wa kifaa batili</translation>
 <translation id="5650551054760837876">Matokeo ya utafutaji hayakupatikana.</translation>
+<translation id="5663999524854166235">Weka CVC ya tarakimu 3 iliyo nyuma ya kadi yako ili uthibitishe</translation>
 <translation id="5677928146339483299">Vilivyozuiwa</translation>
 <translation id="5710435578057952990">Utambulisho wa tovuti hii haujathibitishwa.</translation>
 <translation id="5720705177508910913">Mtumiaji wa sasa</translation>
@@ -503,7 +502,6 @@
 <translation id="6628463337424475685">Utafutaji wa <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">Huwezi kutembelea <ph name="SITE" /> sasa hivi kwa sababu <ph name="BEGIN_LINK" />cheti hiki kimebatilishwa<ph name="END_LINK" />. Hitilafu na uvamizi wa mtandao kwa kawaida huwa wa muda, kwa hivyo ukurasa huu huenda utafanya kazi baadaye.</translation>
 <translation id="6637478299472506933">Upakuaji Umeshindwa</translation>
-<translation id="6642894344118208103">Kuweka upya modemu au kisambaza data</translation>
 <translation id="6644283850729428850">Sera hii imepingwa.</translation>
 <translation id="6646897916597483132">Weka CVC yenye tarakimu 4 kutoka mbele ya kadi yako</translation>
 <translation id="6656103420185847513">Badilisha Folda</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb
index cca2da20..a85316c 100644
--- a/components/strings/components_strings_ta.xtb
+++ b/components/strings/components_strings_ta.xtb
@@ -20,6 +20,7 @@
 <translation id="112840717907525620">கொள்கை தற்காலிக சேமிப்பு சரியாக உள்ளது</translation>
 <translation id="113188000913989374"><ph name="SITE" /> தெரிவிப்பது:</translation>
 <translation id="1132774398110320017">Chrome தன்னிரப்பி அமைப்புகள்...</translation>
+<translation id="113770840981343808">சரிபார்ப்பிற்காக, உங்கள் கார்டின் முன்புறமுள்ள 4 இலக்க CVCஐ உள்ளிடவும்</translation>
 <translation id="1146673768181266552">சிதைவு ஐடி <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">இது <ph name="DOMAIN" /> தான் என்பதை இந்தச் சேவையகம் உறுதிப்படுத்தவில்லை; இதன் பாதுகாப்புச் சான்றிதழை உங்கள் கணினியின் இயக்க முறைமை நம்பவில்லை. இது தவறான உள்ளமைவால் ஏற்பட்டிருக்கலாம் அல்லது தீங்கிழைப்பவர் உங்கள் இணைப்பில் குறுக்கிட்டிருக்கலாம்.</translation>
 <translation id="1152921474424827756"><ph name="URL" /> இன் <ph name="BEGIN_LINK" />உருவாக்கத்திற்கான தற்காலிகச் சேமிப்பு நகலை<ph name="END_LINK" /> அணுகவும்</translation>
@@ -116,7 +117,6 @@
 <translation id="2212735316055980242">கொள்கை காணப்படவில்லை</translation>
 <translation id="2213606439339815911">உள்ளீடுகளைப் பெறுகிறது...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> கிடைக்கவில்லை</translation>
-<translation id="2227695659599072496">நெட்வொர்க் கேபிள் அல்லது ரூட்டரைச் சரிபார்த்தல்</translation>
 <translation id="2230458221926704099"><ph name="BEGIN_LINK" />கண்டறியும் பயன்பாட்டைப்<ph name="END_LINK" /> பயன்படுத்தி இணைப்பைச் சரிசெய்யவும்</translation>
 <translation id="225207911366869382">இந்த கொள்கைக்கான மதிப்பு தடுக்கப்பட்டது.</translation>
 <translation id="2262243747453050782">HTTP பிழை</translation>
@@ -129,6 +129,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" />க்குப் பயனர்பெயரும் கடவுச்சொல்லும் தேவை.</translation>
 <translation id="2328300916057834155"><ph name="ENTRY_INDEX" /> அட்டவணையில் தவறான புக்மார்க் புறக்கணிக்கப்பட்டது</translation>
 <translation id="2354001756790975382">பிற புக்மார்க்ஸ்</translation>
+<translation id="2357783041215512127"><ph name="CREDIT_CARD" /> மூலம் பணம் செலுத்து</translation>
 <translation id="2359808026110333948">தொடர்க</translation>
 <translation id="2367567093518048410">நிலை</translation>
 <translation id="237718015863234333">UI மாற்றுகள் இல்லை</translation>
@@ -222,7 +223,6 @@
 <translation id="3254409185687681395">இந்தப் பக்கத்தை புக்மார்க் செய்க</translation>
 <translation id="3270847123878663523">&amp;மறுவரிசைப்படுத்தலைச் செயல்தவிர்</translation>
 <translation id="3286538390144397061">இப்போது மறுதொடக்கம் செய்க</translation>
-<translation id="3288003805934695103">பக்கத்தை மீண்டும் ஏற்றுதல்</translation>
 <translation id="3305707030755673451"><ph name="TIME" /> அன்று உங்கள் தரவு உங்கள் ஒத்திசைவு கடவுச்சொற்றொடரைக் கொண்டு முறைமையாக்கப்பட்டது. ஒத்திசைவைத் தொடங்க, அதை உள்ளிடவும்.</translation>
 <translation id="333371639341676808">இந்த பக்கம் கூடுதல் உரையாடல்களை உருவாக்குவதைத் தடு.</translation>
 <translation id="3340978935015468852">அமைப்புகள்</translation>
@@ -294,7 +294,6 @@
 <translation id="3963721102035795474">படித்தல் பயன்முறை</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> தடுக்கப்பட்டுள்ளது</translation>
 <translation id="4021036232240155012">DNS என்பது இணையதளத்தின் பெயரை அதன் இணைய முகவரியாக மாற்றும் நெட்வொர்க் சேவையாகும்.</translation>
-<translation id="4021376465026729077">நீட்டிப்புகளை முடக்குதல்</translation>
 <translation id="4030383055268325496">&amp;சேர்த்தலைச் செயல்தவிர்</translation>
 <translation id="4032534284272647190"><ph name="URL" /> க்கான அணுகல் மறுக்கப்பட்டது.</translation>
 <translation id="404928562651467259">எச்சரிக்கை</translation>
@@ -392,7 +391,6 @@
 <translation id="5251803541071282808">மேகக்கணி</translation>
 <translation id="5299298092464848405">கொள்கையை அலசுவதில் பிழை</translation>
 <translation id="5300589172476337783">காண்பி</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />குக்கீகளை அழித்தல்<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">செயலிழப்பு புகாரளித்தல் முடக்கப்பட்டுள்ளது.</translation>
 <translation id="5317780077021120954">சேமி</translation>
 <translation id="5327248766486351172">பெயர்</translation>
@@ -426,6 +424,7 @@
 <translation id="5629630648637658800">கொள்கை அமைப்புகளை ஏற்றுவதில் தோல்வி</translation>
 <translation id="5631439013527180824">தவறான சாதன நிர்வாக டோக்கன்</translation>
 <translation id="5650551054760837876">தேடல் முடிவுகள் எதுவும் காணப்படவில்லை.</translation>
+<translation id="5663999524854166235">சரிபார்ப்பிற்காக, கார்டின் பின்புறமுள்ள 3 இலக்க CVCஐ உள்ளிடவும்</translation>
 <translation id="5677928146339483299">தடுக்கப்பட்டது</translation>
 <translation id="5710435578057952990">இந்த தளத்தின் அடையாளம் சரிபார்க்கப்படவில்லை.</translation>
 <translation id="5720705177508910913">நடப்புப் பயனர்</translation>
@@ -496,7 +495,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> தேடல்</translation>
 <translation id="6634865548447745291">இப்போது <ph name="SITE" /> ஐப் பார்வையிட முடியாது, ஏனெனில் <ph name="BEGIN_LINK" />இந்தச் சான்றிதழ் திரும்பப் பெறப்பட்டுள்ளது<ph name="END_LINK" />. நெட்வொர்க் பிழைகள் மற்றும் தாக்குதல்கள் தற்காலிகமானவையாகும், எனவே இந்தப் பக்கம் சிறிது நேரம் கழித்து செயல்படும்.</translation>
 <translation id="6637478299472506933">பதிவிறக்கம் தோல்வியானது</translation>
-<translation id="6642894344118208103">மோடம் அல்லது ரூட்டரை மீட்டமைத்தல்</translation>
 <translation id="6644283850729428850">இந்தக் கொள்கை தவிர்க்கப்பட்டது.</translation>
 <translation id="6646897916597483132">கார்டின் முன்புறமுள்ள, 4 இலக்க CVCஐ உள்ளிடவும்</translation>
 <translation id="6656103420185847513">கோப்புறையைத் திருத்து</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb
index 7a227813..66badd4 100644
--- a/components/strings/components_strings_te.xtb
+++ b/components/strings/components_strings_te.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">విధాన కాష్ సరిపోయింది</translation>
 <translation id="113188000913989374"><ph name="SITE" /> ఇలా చెబుతోంది:</translation>
 <translation id="1132774398110320017">Chrome స్వయంపూర్తి సెట్టింగ్‌లు...</translation>
+<translation id="113770840981343808">ధృవీకరణ కోసం మీ కార్డ్ ముందువైపు ఉన్న 4 అంకెల CVCని నమోదు చేయండి</translation>
 <translation id="1146673768181266552">క్రాష్ ID <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">ఈ సర్వర్ <ph name="DOMAIN" /> అని నిరూపించుకోలేకపోయింది; దీని భద్రతా ప్రమాణపత్రాన్ని మీ కంప్యూటర్ ఆపరేటింగ్ సిస్టమ్ విశ్వసించలేదు. ఇది తప్పుగా కాన్ఫిగర్ చేయడం వలన లేదా దాడిచేసే వ్యక్తి మీ కనెక్షన్‌కి అంతరాయం కలిగించడం వలన జరిగి ఉండవచ్చు.</translation>
 <translation id="1152921474424827756"><ph name="URL" /> యొక్క <ph name="BEGIN_LINK" />కాష్ చేయబడిన కాపీ<ph name="END_LINK" />ని ప్రాప్యత చేయండి</translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">విధానం కనుగొనబడలేదు</translation>
 <translation id="2213606439339815911">నమోదులను పొందుతోంది...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> అందుబాటులో లేదు</translation>
-<translation id="2227695659599072496">నెట్‌వర్క్ కేబుల్ లేదా రూటర్‌ను తనిఖీ చేయడం</translation>
 <translation id="2230458221926704099"><ph name="BEGIN_LINK" />విశ్లేషణల అనువర్తనాన్ని<ph name="END_LINK" /> ఉపయోగించి మీ కనెక్షన్‌ను సరి చేయండి</translation>
 <translation id="225207911366869382">ఈ విధానం కోసం ఈ విలువ తగ్గించబడింది.</translation>
 <translation id="2262243747453050782">HTTP లోపం</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" />కి వినియోగదారు పేరు మరియు పాస్‌వర్డ్ అవసరం.</translation>
 <translation id="2328300916057834155"><ph name="ENTRY_INDEX" />వ సూచికలో చెల్లని బుక్‌మార్క్ విస్మరించబడింది</translation>
 <translation id="2354001756790975382">ఇతర బుక్‌మార్క్‌లు</translation>
+<translation id="2357783041215512127"><ph name="CREDIT_CARD" />తో చెల్లించండి</translation>
 <translation id="2359808026110333948">కొనసాగు</translation>
 <translation id="2367567093518048410">స్థాయి</translation>
 <translation id="237718015863234333">UI ప్రత్యామ్నాయాలు అందుబాటులో లేవు</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">ఈ పేజీని బుక్‌మార్క్ చెయ్యి</translation>
 <translation id="3270847123878663523">&amp;మళ్లీ క్రమం చేయడాన్ని రద్దు చేయి</translation>
 <translation id="3286538390144397061">ఇప్పుడు పునఃప్రారంభించండి</translation>
-<translation id="3288003805934695103">పేజీని మళ్లీ లోడ్ చేయడం</translation>
 <translation id="3305707030755673451"><ph name="TIME" />న మీ సమకాలీకరణ రహస్య పదబంధంతో మీ డేటా గుప్తీకరించబడింది. సమకాలీకరణను ప్రారంభించడానికి దీన్ని నమోదు చేయండి.</translation>
 <translation id="333371639341676808">అదనపు డైలాగ్‌లను సృష్టించకుండా ఈ పేజీని అడ్డుకో</translation>
 <translation id="3340978935015468852">సెట్టింగ్‌లు</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">పాఠకుని మోడ్</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> బ్లాక్ చేయబడింది</translation>
 <translation id="4021036232240155012">DNS అనేది వెబ్‌సైట్ పేరును దాని ఇంటర్నెట్ చిరునామాకి అనువదించే నెట్‌వర్క్ సేవ.</translation>
-<translation id="4021376465026729077">మీ పొడిగింపులను నిలిపివేయడం</translation>
 <translation id="4030383055268325496">&amp;జోడించడాన్ని రద్దు చేయి</translation>
 <translation id="4032534284272647190"><ph name="URL" />కు ప్రాప్యత తిరస్కరించబడింది.</translation>
 <translation id="404928562651467259">హెచ్చరిక</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">క్లౌడ్</translation>
 <translation id="5299298092464848405">విధానాన్ని అన్వయించడంలో లోపం</translation>
 <translation id="5300589172476337783">చూపించు</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />మీ కుక్కీలను తీసివేయడం<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">క్రాష్ నివేదిక నిలిపివెయ్యబడింది.</translation>
 <translation id="5317780077021120954">సేవ్ చేయి</translation>
 <translation id="5327248766486351172">పేరు</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">విధాన సెట్టింగ్‌లను లోడ్ చేయడంలో విఫలమైంది</translation>
 <translation id="5631439013527180824">చెల్లని పరికర నిర్వహణ టోకెన్</translation>
 <translation id="5650551054760837876">శోధన ఫలితాలు ఏవీ దొరకలేదు.</translation>
+<translation id="5663999524854166235">ధృవీకరణ కోసం మీ కార్డ్ వెనుకవైపు ఉన్న 3 అంకెల CVCని నమోదు చేయండి</translation>
 <translation id="5677928146339483299">బ్లాక్ చెయ్యబడింది</translation>
 <translation id="5710435578057952990">ఈ వెబ్‍‌సైట్ యొక్క గుర్తింపు నిర్థారించబడలేదు.</translation>
 <translation id="5720705177508910913">ప్రస్తుత వినియోగదారు</translation>
@@ -503,7 +502,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> శోధన</translation>
 <translation id="6634865548447745291"><ph name="BEGIN_LINK" />ఈ ప్రమాణపత్రం ఉపసంహరించబడింది<ph name="END_LINK" /> కావున మీరు ఇప్పుడు <ph name="SITE" />ని సందర్శించలేరు. నెట్‌వర్క్ లోపాలు మరియు దాడులు సాధారణంగా తాత్కాలికంగానే ఉంటాయి, కావున ఈ పేజీ కాసేపటి తర్వాత పని చేసే అవకాశం ఉంది.</translation>
 <translation id="6637478299472506933">డౌన్‌లోడ్ చేయడం విఫలమైంది</translation>
-<translation id="6642894344118208103">మోడెమ్ లేదా రూటర్‌ను రీసెట్ చేయడం</translation>
 <translation id="6644283850729428850">ఈ విధానం విలువ తగ్గించబడింది.</translation>
 <translation id="6646897916597483132">మీ కార్డ్ ముందువైపు ఉండే 4 అంకెల CVCని నమోదు చేయండి</translation>
 <translation id="6656103420185847513">ఫోల్డర్‌ను సవరించండి</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb
index dc7082fa..58f0e39a 100644
--- a/components/strings/components_strings_th.xtb
+++ b/components/strings/components_strings_th.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">แคชนโยบายใช้ได้</translation>
 <translation id="113188000913989374"><ph name="SITE" /> บอกว่า:</translation>
 <translation id="1132774398110320017">การตั้งค่าป้อนข้อความอัตโนมัติของ Chrome...</translation>
+<translation id="113770840981343808">ป้อน CVC 4 หลักจากด้านหน้าบัตรเพื่อยืนยัน</translation>
 <translation id="1146673768181266552">รหัสข้อขัดข้อง <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">เซิร์ฟเวอร์นี้ไม่สามารถพิสูจน์ได้ว่าเป็น <ph name="DOMAIN" /> เพราะระบบปฏิบัติการของคอมพิวเตอร์ของคุณไม่เชื่อถือใบรับรองความปลอดภัย โดยอาจเกิดจากการกำหนดค่าผิดหรือผู้บุกรุกที่ขัดขวางการเชื่อมต่อของคุณ</translation>
 <translation id="1152921474424827756">เข้าถึง<ph name="BEGIN_LINK" />สำเนาแคช<ph name="END_LINK" />ของ <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">ไม่พบนโยบาย</translation>
 <translation id="2213606439339815911">กำลังดึงรายการ...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> ไม่พร้อมใช้งาน</translation>
-<translation id="2227695659599072496">ตรวจสอบสายของเครือข่ายหรือเราเตอร์</translation>
 <translation id="2230458221926704099">แก้ไขการเชื่อมต่อของคุณด้วย<ph name="BEGIN_LINK" />แอปการวินิจฉัย<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">เลิกใช้งานค่านี้กับนโยบายนี้</translation>
 <translation id="2262243747453050782">ข้อผิดพลาดของ HTTP</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> ต้องใช้ชื่อผู้ใช้และรหัสผ่าน</translation>
 <translation id="2328300916057834155">บุ๊กมาร์กที่ไม่ถูกต้องถูกเพิกเฉยที่ดัชนี <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">บุ๊กมาร์กอื่นๆ</translation>
+<translation id="2357783041215512127">ชำระด้วย <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">ดำเนินการต่อ</translation>
 <translation id="2367567093518048410">ระดับ</translation>
 <translation id="237718015863234333">ไม่มีทางเลือก UI ที่พร้อมใช้งาน</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">บุ๊กมาร์กหน้านี้</translation>
 <translation id="3270847123878663523">&amp;เลิกทำการจัดลำดับใหม่</translation>
 <translation id="3286538390144397061">รีสตาร์ทเดี๋ยวนี้</translation>
-<translation id="3288003805934695103">โหลดหน้าใหม่</translation>
 <translation id="3305707030755673451">ข้อมูลของคุณได้รับการเข้ารหัสด้วยรหัสผ่านการซิงค์เมื่อวันที่ <ph name="TIME" /> โปรดป้อนรหัสผ่านเพื่อเริ่มซิงค์</translation>
 <translation id="333371639341676808">ป้องกันหน้านี้จากการสร้างการโต้ตอบเพิ่มเติม</translation>
 <translation id="3340978935015468852">การตั้งค่า</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">โหมดนักอ่าน</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> ถูกบล็อก</translation>
 <translation id="4021036232240155012">DNS คือบริการเครือข่ายที่แปลชื่อของเว็บไซต์เป็นที่อยู่อินเทอร์เน็ต</translation>
-<translation id="4021376465026729077">ปิดส่วนขยาย</translation>
 <translation id="4030383055268325496">&amp;เลิกทำการเพิ่ม</translation>
 <translation id="4032534284272647190">การเข้าถึง <ph name="URL" /> ถูกปฏิเสธ</translation>
 <translation id="404928562651467259">คำเตือน</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">ระบบคลาวด์</translation>
 <translation id="5299298092464848405">ข้อผิดพลาดในการแยกวิเคราะห์นโยบาย</translation>
 <translation id="5300589172476337783">แสดง</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />ล้างคุกกี้<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">การรายงานข้อขัดข้องถูกปิดใช้งาน</translation>
 <translation id="5317780077021120954">บันทึก</translation>
 <translation id="5327248766486351172">ชื่อ</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">ไม่สามารถโหลดการตั้งค่านโยบาย</translation>
 <translation id="5631439013527180824">โทเค็นการจัดการอุปกรณ์ไม่ถูกต้อง</translation>
 <translation id="5650551054760837876">ไม่พบผลลัพธ์การค้นหา</translation>
+<translation id="5663999524854166235">ป้อน CVC 3 หลักจากด้านหลังบัตรเพื่อยืนยัน</translation>
 <translation id="5677928146339483299">ถูกบล็อก</translation>
 <translation id="5710435578057952990">ข้อมูลประจำตัวของเว็บไซต์นี้ยังไม่ได้รับการยืนยัน</translation>
 <translation id="5720705177508910913">ผู้ใช้ปัจจุบัน</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> ค้นหา</translation>
 <translation id="6634865548447745291">คุณไม่สามารถไปที่ <ph name="SITE" /> ได้ในขณะนี้ เนื่องจาก<ph name="BEGIN_LINK" />ใบรับรองนี้ถูกเพิกถอนแล้ว<ph name="END_LINK" /> โดยปกติข้อผิดพลาดของเครือข่ายและการบุกรุกจะเกิดขึ้นเพียงชั่วคราว หน้านี้จึงน่าจะใช้งานได้ในภายหลัง</translation>
 <translation id="6637478299472506933">การดาวน์โหลดล้มเหลว</translation>
-<translation id="6642894344118208103">รีเซ็ตโมเด็มหรือเราเตอร์</translation>
 <translation id="6644283850729428850">นโยบายนี้ถูกยกเลิกแล้ว</translation>
 <translation id="6646897916597483132">ป้อน CVC 4 หลักจากด้านหน้าบัตร</translation>
 <translation id="6656103420185847513">แก้ไขโฟลเดอร์</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb
index fbb320b..659f77c0 100644
--- a/components/strings/components_strings_tr.xtb
+++ b/components/strings/components_strings_tr.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Politika önbelleği uygun</translation>
 <translation id="113188000913989374"><ph name="SITE" /> web sitesinin mesajı:</translation>
 <translation id="1132774398110320017">Chrome Otomatik Doldurma ayarları...</translation>
+<translation id="113770840981343808">Doğrulama için kartınızın önündeki 4 basamaklı CVC'yi girin</translation>
 <translation id="1146673768181266552">Kilitlenme Kimliği <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Bu sunucu <ph name="DOMAIN" /> olduğunu kanıtlayamadı. Bilgisayarınızın işletim sistemi, sunucunun güvenlik sertifikasına güvenmiyor. Bu durum, bir yanlış yapılandırmadan veya bağlantıya müdahale eden bir saldırgandan kaynaklanıyor olabilir.</translation>
 <translation id="1152921474424827756"><ph name="URL" /> sitesinin <ph name="BEGIN_LINK" />önbelleğe alınmış bir kopyasına<ph name="END_LINK" /> erişin</translation>
@@ -117,7 +118,6 @@
 <translation id="2212735316055980242">Politika bulunamadı</translation>
 <translation id="2213606439339815911">Girişler getiriliyor...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> kullanılamıyor</translation>
-<translation id="2227695659599072496">Ağ kablosunu veya yönlendiriciyi kontrol etme</translation>
 <translation id="2230458221926704099"><ph name="BEGIN_LINK" />Tanılama uygulamasını<ph name="END_LINK" /> kullanarak bağlantınızı düzeltin</translation>
 <translation id="225207911366869382">Bu değer bu politika için kullanımdan kaldırıldı.</translation>
 <translation id="2262243747453050782">HTTP hatası</translation>
@@ -130,6 +130,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> için kullanıcı adı ve şifre gerekiyor.</translation>
 <translation id="2328300916057834155"><ph name="ENTRY_INDEX" /> dizininde yok sayılan geçersiz yer işareti</translation>
 <translation id="2354001756790975382">Diğer yer işaretleri</translation>
+<translation id="2357783041215512127"><ph name="CREDIT_CARD" /> ile ödeme</translation>
 <translation id="2359808026110333948">Devam Et</translation>
 <translation id="2367567093518048410">Düzey</translation>
 <translation id="237718015863234333">Mevcut kullanıcı arayüzü alternatifi yok</translation>
@@ -227,7 +228,6 @@
 <translation id="3254409185687681395">Bu sayfaya yer işareti koy</translation>
 <translation id="3270847123878663523">Sıralama Değişikliğini &amp;Geri Al</translation>
 <translation id="3286538390144397061">Şimdi yeniden başlat</translation>
-<translation id="3288003805934695103">Sayfayı yeniden yükleme</translation>
 <translation id="3305707030755673451">Verileriniz <ph name="TIME" /> tarihinde senkronizasyon parolanızla şifrelendi. Senkronizasyonu başlatmak için senkronizasyon parolanızı girin.</translation>
 <translation id="333371639341676808">Bu sayfanın ek iletişim kutusu oluşturmasına izin verme.</translation>
 <translation id="3340978935015468852">ayarlar</translation>
@@ -299,7 +299,6 @@
 <translation id="3963721102035795474">Okuyucu Modu</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> engellendi</translation>
 <translation id="4021036232240155012">DNS, bir web sitesinin adını o siteye özgü İnternet adresine dönüştüren ağ hizmetidir.</translation>
-<translation id="4021376465026729077">Uzantılarınızı devre dışı bırakma</translation>
 <translation id="4030383055268325496">Eklemeyi &amp;geri al</translation>
 <translation id="4032534284272647190"><ph name="URL" /> adresine erişim reddedildi.</translation>
 <translation id="404928562651467259">UYARI</translation>
@@ -397,7 +396,6 @@
 <translation id="5251803541071282808">Bulut</translation>
 <translation id="5299298092464848405">Politika ayrıştırma hatası</translation>
 <translation id="5300589172476337783">Göster</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Çerezlerinizi temizleme<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Kilitlenme bildirme devre dışı.</translation>
 <translation id="5317780077021120954">Kaydet</translation>
 <translation id="5327248766486351172">Ad</translation>
@@ -431,6 +429,7 @@
 <translation id="5629630648637658800">Politika ayarları yüklenemedi</translation>
 <translation id="5631439013527180824">Geçersiz cihaz yönetimi jetonu</translation>
 <translation id="5650551054760837876">Arama sonucu bulunamadı.</translation>
+<translation id="5663999524854166235">Doğrulama için kartınızın arkasındaki 3 basamaklı CVC'yi girin</translation>
 <translation id="5677928146339483299">Engellenenler</translation>
 <translation id="5710435578057952990">Bu web sitesinin kimliği doğrulanmadı.</translation>
 <translation id="5720705177508910913">Geçerli kullanıcı</translation>
@@ -503,7 +502,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> Arama</translation>
 <translation id="6634865548447745291"><ph name="BEGIN_LINK" />Bu sertifika iptal edildiği<ph name="END_LINK" /> için <ph name="SITE" /> sitesini şu anda ziyaret edemezsiniz. Ağ hataları ve saldırılar genellikle geçici olduğundan, bu sayfa muhtemelen daha sonra çalışacaktır.</translation>
 <translation id="6637478299472506933">İndirme İşlemi Başarısız Oldu</translation>
-<translation id="6642894344118208103">Modem veya yönlendiriciyi sıfırlama</translation>
 <translation id="6644283850729428850">Bu politika uygun bulunmadı.</translation>
 <translation id="6646897916597483132">Kartınızın önündeki 4 basamaklı CVC'yi girin</translation>
 <translation id="6656103420185847513">Klasörü Düzenleyin</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb
index 48d7152..4d154b5 100644
--- a/components/strings/components_strings_uk.xtb
+++ b/components/strings/components_strings_uk.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Кеш-пам’ять правила не пошкоджено</translation>
 <translation id="113188000913989374">Повідомлення із сайту <ph name="SITE" />:</translation>
 <translation id="1132774398110320017">Налаштування автозаповнення Chrome…</translation>
+<translation id="113770840981343808">Для підтвердження ведіть код CVC з 4 цифр, указаний на лицевій стороні вашої картки</translation>
 <translation id="1146673768181266552">Ідентифікатор аварійного завершення роботи <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Цей сервер не зміг довести, що він – домен <ph name="DOMAIN" />. Операційна система вашого комп’ютера не вважає його сертифікат безпеки надійним. Імовірні причини: неправильна конфігурація або хтось намагається перехопити ваше з’єднання.</translation>
 <translation id="1152921474424827756">Відкрийте <ph name="BEGIN_LINK" />кешовану копію<ph name="END_LINK" /> <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Правило не знайдено</translation>
 <translation id="2213606439339815911">Отримання записів…</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> недоступний</translation>
-<translation id="2227695659599072496">перевірити мережевий кабель або маршрутизатор</translation>
 <translation id="2230458221926704099">Відновіть з’єднання за допомогою <ph name="BEGIN_LINK" />додатка для діагностики<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Дію цього значення припинено для цього правила</translation>
 <translation id="2262243747453050782">Помилка HTTP</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535">Для сайту <ph name="DOMAIN" /> потрібно ввести ім’я користувача та пароль.</translation>
 <translation id="2328300916057834155">Недійсна закладка в індексі <ph name="ENTRY_INDEX" /> ігнорується</translation>
 <translation id="2354001756790975382">Інші закладки</translation>
+<translation id="2357783041215512127">Оплатити за допомогою кредитної картки <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Продовжити</translation>
 <translation id="2367567093518048410">Рівень</translation>
 <translation id="237718015863234333">Немає варіантів інтерфейсу користувача</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Додати цю сторінку до закладок</translation>
 <translation id="3270847123878663523">&amp;Відмінити перевпорядкування</translation>
 <translation id="3286538390144397061">Перезапустити зараз</translation>
-<translation id="3288003805934695103">перезавантажити сторінку</translation>
 <translation id="3305707030755673451">Ваші дані було зашифровано <ph name="TIME" /> за допомогою парольної фрази для синхронізації. Введіть її, щоб почати синхронізацію.</translation>
 <translation id="333371639341676808">Заборонити створення додаткових діалогових вікон цією сторінкою.</translation>
 <translation id="3340978935015468852">налаштування</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">Режим перегляду</translation>
 <translation id="3973234410852337861">Хост <ph name="HOST_NAME" /> заблокований</translation>
 <translation id="4021036232240155012">DNS – це мережева служба, яка перетворює назву веб-сайту на його інтернет-адресу.</translation>
-<translation id="4021376465026729077">вимкнути розширення</translation>
 <translation id="4030383055268325496">&amp;Відмінити додавання</translation>
 <translation id="4032534284272647190">У доступі до <ph name="URL" /> відмовлено.</translation>
 <translation id="404928562651467259">ЗАСТЕРЕЖЕННЯ</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Хмара</translation>
 <translation id="5299298092464848405">Помилка аналізу правила</translation>
 <translation id="5300589172476337783">Показати</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />очистити файли cookie<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Повідомлення про аварійне завершення роботи вимкнено.</translation>
 <translation id="5317780077021120954">Зберегти</translation>
 <translation id="5327248766486351172">Назва</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">Помилка завантаження налаштувань правила</translation>
 <translation id="5631439013527180824">Недійсний маркер керування пристрою</translation>
 <translation id="5650551054760837876">Результаті пошуку відсутні.</translation>
+<translation id="5663999524854166235">Для підтвердження введіть код CVC з 3 цифр, указаний на звороті вашої картки</translation>
 <translation id="5677928146339483299">Заблоковано</translation>
 <translation id="5710435578057952990">Ідентифікаційну інформацію цього веб-сайта не було перевірено.</translation>
 <translation id="5720705177508910913">Поточний користувач</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685">Пошук <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">Зараз не можна перейти на сторінку <ph name="SITE" />, оскільки <ph name="BEGIN_LINK" />цей сертифікат відкликано<ph name="END_LINK" />. Помилки мережі й атаки зазвичай є тимчасовими, тому ця сторінка може працювати пізніше.</translation>
 <translation id="6637478299472506933">Помилка завантаження</translation>
-<translation id="6642894344118208103">скинути налаштування модема чи маршрутизатора</translation>
 <translation id="6644283850729428850">Це правило більше не використовується.</translation>
 <translation id="6646897916597483132">Введіть код CVC з 4 цифр, розташований на звороті вашої картки</translation>
 <translation id="6656103420185847513">Редагувати папку</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb
index bd9ecac..56af7c9 100644
--- a/components/strings/components_strings_vi.xtb
+++ b/components/strings/components_strings_vi.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">Bộ nhớ cache chính sách OK</translation>
 <translation id="113188000913989374"><ph name="SITE" /> cho biết:</translation>
 <translation id="1132774398110320017">Cài đặt tự động điền trên Chrome...</translation>
+<translation id="113770840981343808">Nhập CVC gồm 4 chữ số ở mặt trước thẻ của bạn để xác minh</translation>
 <translation id="1146673768181266552">ID sự cố <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">Máy chủ này không chứng minh được rằng đó là <ph name="DOMAIN" />; chứng chỉ bảo mật của máy chủ này không được hệ điều hành máy tính của bạn tin cậy. Điều này có thể do định cấu hình sai hoặc có kẻ tấn công chặn kết nối của bạn.</translation>
 <translation id="1152921474424827756">Truy cập <ph name="BEGIN_LINK" />bản sao được lưu trong bộ nhớ cache<ph name="END_LINK" /> của <ph name="URL" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">Không tìm thấy chính sách</translation>
 <translation id="2213606439339815911">Đang tìm nạp các mục nhập...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> không có sẵn</translation>
-<translation id="2227695659599072496">Kiểm tra cáp mạng hoặc bộ định tuyến</translation>
 <translation id="2230458221926704099">Sửa kết nối bằng <ph name="BEGIN_LINK" />ứng dụng chẩn đoán<ph name="END_LINK" /></translation>
 <translation id="225207911366869382">Giá trị này không được dùng cho chính sách này nữa.</translation>
 <translation id="2262243747453050782">Lỗi HTTP</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> yêu cầu tên người dùng và mật khẩu.</translation>
 <translation id="2328300916057834155">Đã bỏ qua dấu trang không hợp lệ tại chỉ mục <ph name="ENTRY_INDEX" /></translation>
 <translation id="2354001756790975382">Dấu trang khác</translation>
+<translation id="2357783041215512127">Thanh toán bằng <ph name="CREDIT_CARD" /></translation>
 <translation id="2359808026110333948">Tiếp tục</translation>
 <translation id="2367567093518048410">Mức độ</translation>
 <translation id="237718015863234333">Không có giao diện người dùng thay thế nào</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">Đánh dấu trang này</translation>
 <translation id="3270847123878663523">&amp;Hoàn tác sắp xếp lại</translation>
 <translation id="3286538390144397061">Khởi động lại Ngay bây giờ</translation>
-<translation id="3288003805934695103">Đang tải lại trang</translation>
 <translation id="3305707030755673451">Dữ liệu của bạn đã được mã hóa bằng cụm mật khẩu đồng bộ hóa của bạn vào <ph name="TIME" />. Nhập cụm mật khẩu đó để bắt đầu đồng bộ hóa.</translation>
 <translation id="333371639341676808">Ngăn không cho trang này tạo hộp thoại bổ sung.</translation>
 <translation id="3340978935015468852">cài đặt</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">Chế độ đọc</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> bị chặn</translation>
 <translation id="4021036232240155012">DNS là dịch vụ mạng dịch tên trang web sang địa chỉ Internet.</translation>
-<translation id="4021376465026729077">Tắt tiện ích</translation>
 <translation id="4030383055268325496">&amp;Hoàn tác thêm</translation>
 <translation id="4032534284272647190">Truy cập tới <ph name="URL" /> bị từ chối.</translation>
 <translation id="404928562651467259">CẢNH BÁO</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">Đám mây</translation>
 <translation id="5299298092464848405">Lỗi phân tích cú pháp chính sách</translation>
 <translation id="5300589172476337783">Hiển thị</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />Xóa các cookie của bạn<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">Báo cáo sự cố bị tắt.</translation>
 <translation id="5317780077021120954">Lưu</translation>
 <translation id="5327248766486351172">Tên</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">Không thể tải cài đặt chính sách</translation>
 <translation id="5631439013527180824">Mã thông báo quản lý thiết bị không hợp lệ</translation>
 <translation id="5650551054760837876">Không tìm thấy kết quả tìm kiếm.</translation>
+<translation id="5663999524854166235">Nhập CVC gồm 3 chữ số ở mặt sau thẻ của bạn để xác minh</translation>
 <translation id="5677928146339483299">Bị chặn</translation>
 <translation id="5710435578057952990">Nhận dạng trang web này chưa được xác minh.</translation>
 <translation id="5720705177508910913">Người dùng hiện tại</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685">Tìm kiếm trên <ph name="ENGINE" /></translation>
 <translation id="6634865548447745291">Bạn không thể truy cập <ph name="SITE" /> ngay bây giờ do <ph name="BEGIN_LINK" />chứng chỉ này đã bị thu hồi<ph name="END_LINK" />. Lỗi mạng và các cuộc tấn công mạng thường chỉ là tạm thời, do đó trang này có thể sẽ hoạt động lại sau.</translation>
 <translation id="6637478299472506933">Tải xuống không thành công</translation>
-<translation id="6642894344118208103">Đặt lại modem hoặc bộ định tuyến</translation>
 <translation id="6644283850729428850">Chính sách này không được chấp thuận.</translation>
 <translation id="6646897916597483132">Nhập CVC gồm 4 chữ số ở mặt trước thẻ của bạn</translation>
 <translation id="6656103420185847513">Chỉnh sửa thư mục</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb
index 55c9db1..c8db61a 100644
--- a/components/strings/components_strings_zh-CN.xtb
+++ b/components/strings/components_strings_zh-CN.xtb
@@ -19,6 +19,7 @@
 <translation id="112840717907525620">策略缓存良好</translation>
 <translation id="113188000913989374"><ph name="SITE" /> 显示:</translation>
 <translation id="1132774398110320017">Chrome自动填充设置…</translation>
+<translation id="113770840981343808">请输入信用卡正面显示的 4 位数银行卡验证码 (CVC) 以进行验证</translation>
 <translation id="1146673768181266552">崩溃ID <ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">此服务器无法证明它是<ph name="DOMAIN" />;您计算机的操作系统不信任其安全证书。出现此问题的原因可能是配置有误或您的连接被拦截了。</translation>
 <translation id="1152921474424827756">访问<ph name="URL" />的<ph name="BEGIN_LINK" />缓存副本<ph name="END_LINK" /></translation>
@@ -114,7 +115,6 @@
 <translation id="2212735316055980242">找不到策略</translation>
 <translation id="2213606439339815911">正在获取条目…</translation>
 <translation id="2214283295778284209">无法访问 <ph name="SITE" /></translation>
-<translation id="2227695659599072496">检查网线或路由器</translation>
 <translation id="2230458221926704099">请使用<ph name="BEGIN_LINK" />诊断应用<ph name="END_LINK" />修复网络连接</translation>
 <translation id="225207911366869382">适用于该政策的此值已弃用。</translation>
 <translation id="2262243747453050782">HTTP 错误</translation>
@@ -127,6 +127,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> 要求提供用户名和密码。</translation>
 <translation id="2328300916057834155">已忽略索引<ph name="ENTRY_INDEX" />中的无效书签</translation>
 <translation id="2354001756790975382">其他书签</translation>
+<translation id="2357783041215512127">使用 <ph name="CREDIT_CARD" /> 付款</translation>
 <translation id="2359808026110333948">继续</translation>
 <translation id="2367567093518048410">级别</translation>
 <translation id="237718015863234333">没有可用的界面备选项</translation>
@@ -218,7 +219,6 @@
 <translation id="3254409185687681395">为此页添加书签</translation>
 <translation id="3270847123878663523">撤消顺序调整(&amp;U)</translation>
 <translation id="3286538390144397061">立即重新启动</translation>
-<translation id="3288003805934695103">重新加载网页</translation>
 <translation id="3305707030755673451">您的数据已于 <ph name="TIME" />使用您的同步密码加密。输入该密码即可开始同步。</translation>
 <translation id="333371639341676808">禁止此页再显示对话框。</translation>
 <translation id="3340978935015468852">设置</translation>
@@ -289,7 +289,6 @@
 <translation id="3963721102035795474">阅读器模式</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> 已被屏蔽</translation>
 <translation id="4021036232240155012">DNS 是一项网络服务,可将网站的名称转译为其对应的互联网地址。</translation>
-<translation id="4021376465026729077">停用扩展程序</translation>
 <translation id="4030383055268325496">撤消添加(&amp;U)</translation>
 <translation id="4032534284272647190"><ph name="URL" /> 拒绝访问。</translation>
 <translation id="404928562651467259">警告</translation>
@@ -387,7 +386,6 @@
 <translation id="5251803541071282808">云端</translation>
 <translation id="5299298092464848405">解析策略时出错</translation>
 <translation id="5300589172476337783">显示</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />清除 Cookie<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">已停用崩溃报告。</translation>
 <translation id="5317780077021120954">保存</translation>
 <translation id="5327248766486351172">名称</translation>
@@ -421,6 +419,7 @@
 <translation id="5629630648637658800">无法加载策略设置</translation>
 <translation id="5631439013527180824">设备管理令牌无效</translation>
 <translation id="5650551054760837876">未找到搜索结果。</translation>
+<translation id="5663999524854166235">请输入信用卡背面显示的 3 位数银行卡验证码 (CVC) 以进行验证</translation>
 <translation id="5677928146339483299">已屏蔽</translation>
 <translation id="5710435578057952990">此网站尚未经过身份验证。</translation>
 <translation id="5720705177508910913">当前用户</translation>
@@ -491,7 +490,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> 搜索</translation>
 <translation id="6634865548447745291">您目前无法访问<ph name="SITE" />,因为<ph name="BEGIN_LINK" />此证书已被撤消<ph name="END_LINK" />。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常。</translation>
 <translation id="6637478299472506933">下载失败</translation>
-<translation id="6642894344118208103">重置调制解调器或路由器</translation>
 <translation id="6644283850729428850">此政策已弃用。</translation>
 <translation id="6646897916597483132">输入信用卡正面显示的 4 位数银行卡验证码 (CVC)</translation>
 <translation id="6656103420185847513">修改文件夹</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb
index 0d46208b..a5c78d99 100644
--- a/components/strings/components_strings_zh-TW.xtb
+++ b/components/strings/components_strings_zh-TW.xtb
@@ -21,6 +21,7 @@
 <translation id="112840717907525620">政策快取正確</translation>
 <translation id="113188000913989374"><ph name="SITE" /> 顯示:</translation>
 <translation id="1132774398110320017">Chrome 自動填入設定...</translation>
+<translation id="113770840981343808">請輸入信用卡正面的四位數信用卡安全碼,以便驗證</translation>
 <translation id="1146673768181266552">當機 ID:<ph name="CRASH_ID" /> (<ph name="CRASH_LOCAL_ID" />)</translation>
 <translation id="1150979032973867961">伺服器無法證明其屬於 <ph name="DOMAIN" /> 網域;其安全性憑證未取得您電腦作業系統的信任。這可能是因為設定錯誤,或有攻擊者攔截您的連線所致。</translation>
 <translation id="1152921474424827756">存取 <ph name="URL" /> 的<ph name="BEGIN_LINK" />頁庫存檔副本<ph name="END_LINK" /></translation>
@@ -118,7 +119,6 @@
 <translation id="2212735316055980242">找不到政策</translation>
 <translation id="2213606439339815911">正在擷取項目...</translation>
 <translation id="2214283295778284209"><ph name="SITE" /> 無法使用</translation>
-<translation id="2227695659599072496">檢查網路線或路由器</translation>
 <translation id="2230458221926704099">請使用<ph name="BEGIN_LINK" />診斷應用程式<ph name="END_LINK" />修正連線問題</translation>
 <translation id="225207911366869382">這個政策值已遭汰換。</translation>
 <translation id="2262243747453050782">HTTP 錯誤</translation>
@@ -131,6 +131,7 @@
 <translation id="2317259163369394535"><ph name="DOMAIN" /> 要求提供使用者名稱和密碼。</translation>
 <translation id="2328300916057834155">已忽略索引「<ph name="ENTRY_INDEX" />」的無效書籤</translation>
 <translation id="2354001756790975382">其他書籤</translation>
+<translation id="2357783041215512127">使用 <ph name="CREDIT_CARD" /> 付款</translation>
 <translation id="2359808026110333948">繼續</translation>
 <translation id="2367567093518048410">等級</translation>
 <translation id="237718015863234333">沒有可用的替代使用者介面</translation>
@@ -228,7 +229,6 @@
 <translation id="3254409185687681395">把此頁加入書籤</translation>
 <translation id="3270847123878663523">復原重新排序(&amp;U)</translation>
 <translation id="3286538390144397061">立即重新啟動</translation>
-<translation id="3288003805934695103">重新載入網頁</translation>
 <translation id="3305707030755673451">您已在 <ph name="TIME" />使用同步通關密語對資料進行加密,請輸入通關密語開始進行同步。</translation>
 <translation id="333371639341676808">防止此網頁產生其他對話方塊。</translation>
 <translation id="3340978935015468852">設定</translation>
@@ -300,7 +300,6 @@
 <translation id="3963721102035795474">閱讀器模式</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> 遭到封鎖</translation>
 <translation id="4021036232240155012">DNS 這項網路服務會將網站的名稱轉譯成網際網路位址。</translation>
-<translation id="4021376465026729077">停用擴充功能</translation>
 <translation id="4030383055268325496">復原新增(&amp;U)</translation>
 <translation id="4032534284272647190">瀏覽 <ph name="URL" /> 遭到拒絕。</translation>
 <translation id="404928562651467259">警告</translation>
@@ -398,7 +397,6 @@
 <translation id="5251803541071282808">雲端</translation>
 <translation id="5299298092464848405">解析政策時發生錯誤</translation>
 <translation id="5300589172476337783">顯示</translation>
-<translation id="5307361445257083764"><ph name="BEGIN_LINK" />清除 Cookie<ph name="END_LINK" /></translation>
 <translation id="5308689395849655368">當機報告功能已停用。</translation>
 <translation id="5317780077021120954">儲存</translation>
 <translation id="5327248766486351172">名稱</translation>
@@ -432,6 +430,7 @@
 <translation id="5629630648637658800">無法載入政策設定</translation>
 <translation id="5631439013527180824">裝置管理符記無效</translation>
 <translation id="5650551054760837876">找不到搜尋結果。</translation>
+<translation id="5663999524854166235">請輸入信用卡背面的三位數信用卡安全碼,以便驗證</translation>
 <translation id="5677928146339483299">已封鎖</translation>
 <translation id="5710435578057952990">此網頁的身分未經驗證。</translation>
 <translation id="5720705177508910913">目前使用者</translation>
@@ -504,7 +503,6 @@
 <translation id="6628463337424475685"><ph name="ENGINE" /> 搜尋</translation>
 <translation id="6634865548447745291">您目前無法造訪 <ph name="SITE" />,因為<ph name="BEGIN_LINK" />這個網站的憑證已遭撤銷<ph name="END_LINK" />。網路錯誤和攻擊行為通常是暫時性的,所以這個網頁可能稍後就能正常使用。</translation>
 <translation id="6637478299472506933">下載失敗</translation>
-<translation id="6642894344118208103">重設數據機或路由器</translation>
 <translation id="6644283850729428850">這項政策已遭取代。</translation>
 <translation id="6646897916597483132">請輸入信用卡正面的四位數信用卡安全碼</translation>
 <translation id="6656103420185847513">編輯資料夾</translation>
diff --git a/components/test_runner/BUILD.gn b/components/test_runner/BUILD.gn
index 7cd8530..03b6c10 100644
--- a/components/test_runner/BUILD.gn
+++ b/components/test_runner/BUILD.gn
@@ -75,6 +75,8 @@
     "test_runner.cc",
     "test_runner.h",
     "test_runner_export.h",
+    "test_runner_for_specific_view.cc",
+    "test_runner_for_specific_view.h",
     "text_input_controller.cc",
     "text_input_controller.h",
     "tracked_dictionary.cc",
@@ -95,6 +97,8 @@
     "web_test_runner.h",
     "web_view_test_client.cc",
     "web_view_test_client.h",
+    "web_widget_test_client.cc",
+    "web_widget_test_client.h",
   ]
 
   # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
diff --git a/components/test_runner/mock_content_settings_client.cc b/components/test_runner/mock_content_settings_client.cc
index 4aa8c00..0ac3f2a 100644
--- a/components/test_runner/mock_content_settings_client.cc
+++ b/components/test_runner/mock_content_settings_client.cc
@@ -39,20 +39,24 @@
   return allowed;
 }
 
+bool MockContentSettingsClient::allowScript(bool enabled_per_settings) {
+  return enabled_per_settings && flags_->scripts_allowed();
+}
+
 bool MockContentSettingsClient::allowScriptFromSource(
     bool enabled_per_settings,
-    const blink::WebURL& scriptURL) {
+    const blink::WebURL& script_url) {
   bool allowed = enabled_per_settings && flags_->scripts_allowed();
   if (flags_->dump_web_content_settings_client_callbacks() && delegate_) {
     delegate_->PrintMessage(
         std::string("MockContentSettingsClient: allowScriptFromSource(") +
-        NormalizeLayoutTestURL(scriptURL.string().utf8()) + "): " +
+        NormalizeLayoutTestURL(script_url.string().utf8()) + "): " +
         (allowed ? "true" : "false") + "\n");
   }
   return allowed;
 }
 
-bool MockContentSettingsClient::allowStorage(bool) {
+bool MockContentSettingsClient::allowStorage(bool enabled_per_settings) {
   return flags_->storage_allowed();
 }
 
@@ -62,19 +66,19 @@
 
 bool MockContentSettingsClient::allowDisplayingInsecureContent(
     bool enabled_per_settings,
-    const blink::WebURL&) {
+    const blink::WebURL& url) {
   return enabled_per_settings || flags_->displaying_insecure_content_allowed();
 }
 
 bool MockContentSettingsClient::allowRunningInsecureContent(
     bool enabled_per_settings,
-    const blink::WebSecurityOrigin&,
-    const blink::WebURL&) {
+    const blink::WebSecurityOrigin& context,
+    const blink::WebURL& url) {
   return enabled_per_settings || flags_->running_insecure_content_allowed();
 }
 
-bool MockContentSettingsClient::allowAutoplay(bool defaultValue) {
-  return defaultValue || flags_->autoplay_allowed();
+bool MockContentSettingsClient::allowAutoplay(bool default_value) {
+  return default_value || flags_->autoplay_allowed();
 }
 
 void MockContentSettingsClient::SetDelegate(WebTestDelegate* delegate) {
diff --git a/components/test_runner/mock_content_settings_client.h b/components/test_runner/mock_content_settings_client.h
index 523888c..c99e8d4 100644
--- a/components/test_runner/mock_content_settings_client.h
+++ b/components/test_runner/mock_content_settings_client.h
@@ -22,21 +22,22 @@
   ~MockContentSettingsClient() override;
 
   // blink::WebContentSettingsClient:
-  bool allowImage(bool enabledPerSettings,
-                  const blink::WebURL& imageURL) override;
-  bool allowMedia(const blink::WebURL& mediaURL) override;
-  bool allowScriptFromSource(bool enabledPerSettings,
-                             const blink::WebURL& scriptURL) override;
+  bool allowImage(bool enabled_per_settings,
+                  const blink::WebURL& image_url) override;
+  bool allowMedia(const blink::WebURL& media_url) override;
+  bool allowScript(bool enabled_per_settings) override;
+  bool allowScriptFromSource(bool enabled_per_settings,
+                             const blink::WebURL& script_url) override;
   bool allowStorage(bool local) override;
-  bool allowPlugins(bool enabledPerSettings) override;
-  bool allowDisplayingInsecureContent(bool enabledPerSettings,
-                                      const blink::WebURL&) override;
-  bool allowRunningInsecureContent(bool enabledPerSettings,
-                                   const blink::WebSecurityOrigin&,
-                                   const blink::WebURL&) override;
-  bool allowAutoplay(bool defaultValue) override;
+  bool allowPlugins(bool enabled_per_settings) override;
+  bool allowDisplayingInsecureContent(bool enabled_per_settings,
+                                      const blink::WebURL& url) override;
+  bool allowRunningInsecureContent(bool enabled_per_settings,
+                                   const blink::WebSecurityOrigin& context,
+                                   const blink::WebURL& url) override;
+  bool allowAutoplay(bool default_value) override;
 
-  void SetDelegate(WebTestDelegate*);
+  void SetDelegate(WebTestDelegate* delegate);
 
  private:
   WebTestDelegate* delegate_;
diff --git a/components/test_runner/test_common.cc b/components/test_runner/test_common.cc
index ecd58ea..c387440 100644
--- a/components/test_runner/test_common.cc
+++ b/components/test_runner/test_common.cc
@@ -99,6 +99,13 @@
   }
 }
 
+blink::WebString V8StringToWebString(v8::Local<v8::String> v8_str) {
+  int length = v8_str->Utf8Length() + 1;
+  std::unique_ptr<char[]> chars(new char[length]);
+  v8_str->WriteUtf8(chars.get(), length);
+  return blink::WebString::fromUTF8(chars.get());
+}
+
 void EnsureBlinkInitialized() {
   g_mock_blink_platform.Get();
 }
diff --git a/components/test_runner/test_common.h b/components/test_runner/test_common.h
index 57e9747f..c8477ba 100644
--- a/components/test_runner/test_common.h
+++ b/components/test_runner/test_common.h
@@ -9,7 +9,9 @@
 
 #include "base/strings/string_util.h"
 #include "components/test_runner/test_runner_export.h"
+#include "third_party/WebKit/public/platform/WebString.h"
 #include "third_party/WebKit/public/web/WebNavigationPolicy.h"
+#include "v8/include/v8.h"
 
 class GURL;
 
@@ -29,6 +31,8 @@
 const char* WebNavigationPolicyToString(
     const blink::WebNavigationPolicy& policy);
 
+blink::WebString V8StringToWebString(v8::Local<v8::String> v8_str);
+
 // Tests which depend on Blink must call this function on the main thread
 // before creating/calling any Blink objects/APIs.
 TEST_RUNNER_EXPORT void EnsureBlinkInitialized();
diff --git a/components/test_runner/test_plugin.cc b/components/test_runner/test_plugin.cc
index 61e12204..5e41a5db 100644
--- a/components/test_runner/test_plugin.cc
+++ b/components/test_runner/test_plugin.cc
@@ -180,6 +180,7 @@
   container_ = container;
 
   blink::Platform::ContextAttributes attrs;
+  attrs.webGLVersion = 1;  // We are creating a context through the WebGL APIs.
   DCHECK(!container->element().isNull());
   DCHECK(!container->element().document().isNull());
   blink::WebURL url = container->element().document().url();
diff --git a/components/test_runner/test_runner.cc b/components/test_runner/test_runner.cc
index 429bf34..72cbe6df 100644
--- a/components/test_runner/test_runner.cc
+++ b/components/test_runner/test_runner.cc
@@ -24,8 +24,10 @@
 #include "components/test_runner/mock_web_user_media_client.h"
 #include "components/test_runner/pixel_dump.h"
 #include "components/test_runner/spell_check_client.h"
+#include "components/test_runner/test_common.h"
 #include "components/test_runner/test_interfaces.h"
 #include "components/test_runner/test_preferences.h"
+#include "components/test_runner/test_runner_for_specific_view.h"
 #include "components/test_runner/web_task.h"
 #include "components/test_runner/web_test_delegate.h"
 #include "components/test_runner/web_test_proxy.h"
@@ -76,13 +78,6 @@
 
 namespace {
 
-WebString V8StringToWebString(v8::Local<v8::String> v8_str) {
-  int length = v8_str->Utf8Length() + 1;
-  std::unique_ptr<char[]> chars(new char[length]);
-  v8_str->WriteUtf8(chars.get(), length);
-  return WebString::fromUTF8(chars.get());
-}
-
 double GetDefaultDeviceScaleFactor() {
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
   if (command_line->HasSwitch(switches::kForceDeviceScaleFactor)) {
@@ -1626,7 +1621,7 @@
   layout_test_runtime_flags_.Reset();
   mock_screen_orientation_client_->ResetData();
   drag_image_.reset();
-  views_with_scheduled_animations_.clear();
+  widgets_with_scheduled_animations_.clear();
 
   WebSecurityPolicy::resetOriginAccessWhitelists();
 #if defined(__linux__) || defined(ANDROID)
@@ -1682,76 +1677,6 @@
   test_is_running_ = running;
 }
 
-void TestRunnerForSpecificView::PostTask(const base::Closure& callback) {
-  delegate()->PostTask(new WebCallbackTask(callback));
-}
-
-void TestRunnerForSpecificView::PostDelayedTask(long long delay,
-                                                const base::Closure& callback) {
-  delegate()->PostDelayedTask(new WebCallbackTask(callback), delay);
-}
-
-void TestRunnerForSpecificView::PostV8Callback(
-    const v8::Local<v8::Function>& callback) {
-  PostTask(base::Bind(&TestRunnerForSpecificView::InvokeV8Callback,
-                      weak_factory_.GetWeakPtr(),
-                      v8::UniquePersistent<v8::Function>(
-                          blink::mainThreadIsolate(), callback)));
-}
-
-void TestRunnerForSpecificView::PostV8CallbackWithArgs(
-    v8::UniquePersistent<v8::Function> callback,
-    int argc,
-    v8::Local<v8::Value> argv[]) {
-  std::vector<v8::UniquePersistent<v8::Value>> args;
-  for (int i = 0; i < argc; i++) {
-    args.push_back(
-        v8::UniquePersistent<v8::Value>(blink::mainThreadIsolate(), argv[i]));
-  }
-
-  PostTask(base::Bind(&TestRunnerForSpecificView::InvokeV8CallbackWithArgs,
-                      weak_factory_.GetWeakPtr(), std::move(callback),
-                      std::move(args)));
-}
-
-void TestRunnerForSpecificView::InvokeV8Callback(
-    const v8::UniquePersistent<v8::Function>& callback) {
-  std::vector<v8::UniquePersistent<v8::Value>> empty_args;
-  InvokeV8CallbackWithArgs(callback, std::move(empty_args));
-}
-
-void TestRunnerForSpecificView::InvokeV8CallbackWithArgs(
-    const v8::UniquePersistent<v8::Function>& callback,
-    const std::vector<v8::UniquePersistent<v8::Value>>& args) {
-  v8::Isolate* isolate = blink::mainThreadIsolate();
-  v8::HandleScope handle_scope(isolate);
-
-  WebFrame* frame = web_view()->mainFrame();
-  v8::Local<v8::Context> context = frame->mainWorldScriptContext();
-  if (context.IsEmpty())
-    return;
-  v8::Context::Scope context_scope(context);
-
-  std::vector<v8::Local<v8::Value>> local_args;
-  for (const auto& arg : args) {
-    local_args.push_back(v8::Local<v8::Value>::New(isolate, arg));
-  }
-
-  frame->callFunctionEvenIfScriptDisabled(
-      v8::Local<v8::Function>::New(isolate, callback), context->Global(),
-      local_args.size(), local_args.data());
-}
-
-base::Closure TestRunnerForSpecificView::CreateClosureThatPostsV8Callback(
-    const v8::Local<v8::Function>& callback) {
-  return base::Bind(&TestRunnerForSpecificView::PostTask,
-                    weak_factory_.GetWeakPtr(),
-                    base::Bind(&TestRunnerForSpecificView::InvokeV8Callback,
-                               weak_factory_.GetWeakPtr(),
-                               v8::UniquePersistent<v8::Function>(
-                                   blink::mainThreadIsolate(), callback)));
-}
-
 bool TestRunner::shouldDumpEditingCallbacks() const {
   return layout_test_runtime_flags_.dump_editting_callbacks();
 }
@@ -2008,36 +1933,6 @@
   return layout_test_runtime_flags_.dump_resource_priorities();
 }
 
-bool TestRunnerForSpecificView::RequestPointerLock() {
-  switch (pointer_lock_planned_result_) {
-    case PointerLockWillSucceed:
-      PostDelayedTask(
-          0,
-          base::Bind(&TestRunnerForSpecificView::DidAcquirePointerLockInternal,
-                     weak_factory_.GetWeakPtr()));
-      return true;
-    case PointerLockWillRespondAsync:
-      DCHECK(!pointer_locked_);
-      return true;
-    case PointerLockWillFailSync:
-      DCHECK(!pointer_locked_);
-      return false;
-    default:
-      NOTREACHED();
-      return false;
-  }
-}
-
-void TestRunnerForSpecificView::RequestPointerUnlock() {
-  PostDelayedTask(
-      0, base::Bind(&TestRunnerForSpecificView::DidLosePointerLockInternal,
-                    weak_factory_.GetWeakPtr()));
-}
-
-bool TestRunnerForSpecificView::isPointerLocked() {
-  return pointer_locked_;
-}
-
 void TestRunner::setToolTipText(const WebString& text) {
   tooltip_text_ = text.utf8();
 }
@@ -2208,90 +2103,6 @@
   test_interfaces_->ResetTestHelperControllers();
 }
 
-void TestRunnerForSpecificView::SetTabKeyCyclesThroughElements(
-    bool tab_key_cycles_through_elements) {
-  web_view()->setTabKeyCyclesThroughElements(tab_key_cycles_through_elements);
-}
-
-void TestRunnerForSpecificView::ExecCommand(gin::Arguments* args) {
-  std::string command;
-  args->GetNext(&command);
-
-  std::string value;
-  if (args->Length() >= 3) {
-    // Ignore the second parameter (which is userInterface)
-    // since this command emulates a manual action.
-    args->Skip();
-    args->GetNext(&value);
-  }
-
-  // Note: webkit's version does not return the boolean, so neither do we.
-  web_view()->focusedFrame()->executeCommand(WebString::fromUTF8(command),
-                                             WebString::fromUTF8(value));
-}
-
-bool TestRunnerForSpecificView::IsCommandEnabled(const std::string& command) {
-  return web_view()->focusedFrame()->isCommandEnabled(
-      WebString::fromUTF8(command));
-}
-
-bool TestRunnerForSpecificView::CallShouldCloseOnWebView() {
-  return web_view()->mainFrame()->dispatchBeforeUnloadEvent();
-}
-
-void TestRunnerForSpecificView::SetDomainRelaxationForbiddenForURLScheme(
-    bool forbidden,
-    const std::string& scheme) {
-  web_view()->setDomainRelaxationForbidden(forbidden,
-                                           WebString::fromUTF8(scheme));
-}
-
-v8::Local<v8::Value>
-TestRunnerForSpecificView::EvaluateScriptInIsolatedWorldAndReturnValue(
-    int world_id,
-    const std::string& script) {
-  WebVector<v8::Local<v8::Value>> values;
-  WebScriptSource source(WebString::fromUTF8(script));
-  // This relies on the iframe focusing itself when it loads. This is a bit
-  // sketchy, but it seems to be what other tests do.
-  web_view()->focusedFrame()->executeScriptInIsolatedWorld(world_id, &source, 1,
-                                                           1, &values);
-  // Since only one script was added, only one result is expected
-  if (values.size() == 1 && !values[0].IsEmpty())
-    return values[0];
-  return v8::Local<v8::Value>();
-}
-
-void TestRunnerForSpecificView::EvaluateScriptInIsolatedWorld(
-    int world_id,
-    const std::string& script) {
-  WebScriptSource source(WebString::fromUTF8(script));
-  web_view()->focusedFrame()->executeScriptInIsolatedWorld(world_id, &source, 1,
-                                                           1);
-}
-
-void TestRunnerForSpecificView::SetIsolatedWorldSecurityOrigin(
-    int world_id,
-    v8::Local<v8::Value> origin) {
-  if (!(origin->IsString() || !origin->IsNull()))
-    return;
-
-  WebSecurityOrigin web_origin;
-  if (origin->IsString()) {
-    web_origin = WebSecurityOrigin::createFromString(
-        V8StringToWebString(origin.As<v8::String>()));
-  }
-  web_view()->focusedFrame()->setIsolatedWorldSecurityOrigin(world_id,
-                                                             web_origin);
-}
-
-void TestRunnerForSpecificView::SetIsolatedWorldContentSecurityPolicy(
-    int world_id,
-    const std::string& policy) {
-  web_view()->focusedFrame()->setIsolatedWorldContentSecurityPolicy(
-      world_id, WebString::fromUTF8(policy));
-}
-
 void TestRunner::AddOriginAccessWhitelistEntry(
     const std::string& source_origin,
     const std::string& destination_protocol,
@@ -2324,57 +2135,6 @@
       allow_destination_subdomains);
 }
 
-bool TestRunnerForSpecificView::HasCustomPageSizeStyle(int page_index) {
-  WebFrame* frame = web_view()->mainFrame();
-  if (!frame)
-    return false;
-  return frame->hasCustomPageSizeStyle(page_index);
-}
-
-void TestRunnerForSpecificView::ForceRedSelectionColors() {
-  web_view()->setSelectionColors(
-      0xffee0000, 0xff00ee00, 0xff000000, 0xffc0c0c0);
-}
-
-void TestRunner::InsertStyleSheet(const std::string& source_code) {
-  WebLocalFrame::frameForCurrentContext()->document().insertStyleSheet(
-      WebString::fromUTF8(source_code));
-}
-
-bool TestRunnerForSpecificView::FindString(
-    const std::string& search_text,
-    const std::vector<std::string>& options_array) {
-  WebFindOptions find_options;
-  bool wrap_around = false;
-  find_options.matchCase = true;
-  find_options.findNext = true;
-
-  for (const std::string& option : options_array) {
-    if (option == "CaseInsensitive")
-      find_options.matchCase = false;
-    else if (option == "Backwards")
-      find_options.forward = false;
-    else if (option == "StartInSelection")
-      find_options.findNext = false;
-    else if (option == "AtWordStarts")
-      find_options.wordStart = true;
-    else if (option == "TreatMedialCapitalAsWordStart")
-      find_options.medialCapitalAsWordStart = true;
-    else if (option == "WrapAround")
-      wrap_around = true;
-  }
-
-  WebLocalFrame* frame = web_view()->mainFrame()->toWebLocalFrame();
-  const bool find_result = frame->find(0, WebString::fromUTF8(search_text),
-                                       find_options, wrap_around, 0);
-  frame->stopFinding(false);
-  return find_result;
-}
-
-std::string TestRunnerForSpecificView::SelectionAsMarkup() {
-  return web_view()->mainFrame()->selectionAsMarkup().utf8();
-}
-
 void TestRunner::SetTextSubpixelPositioning(bool value) {
 #if defined(__linux__) || defined(ANDROID)
   // Since FontConfig doesn't provide a variable to control subpixel
@@ -2383,32 +2143,6 @@
 #endif
 }
 
-void TestRunnerForSpecificView::SetPageVisibility(
-    const std::string& new_visibility) {
-  if (new_visibility == "visible")
-    web_view()->setVisibilityState(WebPageVisibilityStateVisible, false);
-  else if (new_visibility == "hidden")
-    web_view()->setVisibilityState(WebPageVisibilityStateHidden, false);
-  else if (new_visibility == "prerender")
-    web_view()->setVisibilityState(WebPageVisibilityStatePrerender, false);
-}
-
-void TestRunnerForSpecificView::SetTextDirection(
-    const std::string& direction_name) {
-  // Map a direction name to a WebTextDirection value.
-  WebTextDirection direction;
-  if (direction_name == "auto")
-    direction = WebTextDirectionDefault;
-  else if (direction_name == "rtl")
-    direction = WebTextDirectionRightToLeft;
-  else if (direction_name == "ltr")
-    direction = WebTextDirectionLeftToRight;
-  else
-    return;
-
-  web_view()->setTextDirection(direction);
-}
-
 void TestRunner::UseUnfortunateSynchronousResizeMode() {
   delegate_->UseUnfortunateSynchronousResizeMode(true);
 }
@@ -2565,26 +2299,6 @@
   DCHECK_LE(0, chooser_count_);
 }
 
-void TestRunnerForSpecificView::DidAcquirePointerLock() {
-  DidAcquirePointerLockInternal();
-}
-
-void TestRunnerForSpecificView::DidNotAcquirePointerLock() {
-  DidNotAcquirePointerLockInternal();
-}
-
-void TestRunnerForSpecificView::DidLosePointerLock() {
-  DidLosePointerLockInternal();
-}
-
-void TestRunnerForSpecificView::SetPointerLockWillFailSynchronously() {
-  pointer_lock_planned_result_ = PointerLockWillFailSync;
-}
-
-void TestRunnerForSpecificView::SetPointerLockWillRespondAsynchronously() {
-  pointer_lock_planned_result_ = PointerLockWillRespondAsync;
-}
-
 void TestRunner::SetPopupBlockingEnabled(bool block_popups) {
   delegate_->Preferences()->java_script_can_open_windows_automatically =
       !block_popups;
@@ -2683,16 +2397,16 @@
 }
 
 bool TestRunner::GetAnimationScheduled() const {
-  bool is_animation_scheduled = !views_with_scheduled_animations_.empty();
+  bool is_animation_scheduled = !widgets_with_scheduled_animations_.empty();
   return is_animation_scheduled;
 }
 
-void TestRunner::OnAnimationScheduled(blink::WebView* view) {
-  views_with_scheduled_animations_.insert(view);
+void TestRunner::OnAnimationScheduled(blink::WebWidget* widget) {
+  widgets_with_scheduled_animations_.insert(widget);
 }
 
-void TestRunner::OnAnimationBegun(blink::WebView* view) {
-  views_with_scheduled_animations_.erase(view);
+void TestRunner::OnAnimationBegun(blink::WebWidget* widget) {
+  widgets_with_scheduled_animations_.erase(widget);
 }
 
 void TestRunner::DumpEditingCallbacks() {
@@ -2899,22 +2613,6 @@
   OnLayoutTestRuntimeFlagsChanged();
 }
 
-void TestRunnerForSpecificView::DumpPageImportanceSignals() {
-  blink::WebPageImportanceSignals* signals =
-      web_view()->pageImportanceSignals();
-  if (!signals)
-    return;
-
-  std::string message = base::StringPrintf(
-      "WebPageImportanceSignals:\n"
-      "  hadFormInteraction: %s\n"
-      "  issuedNonGetFetchFromScript: %s\n",
-      signals->hadFormInteraction() ? "true" : "false",
-      signals->issuedNonGetFetchFromScript() ? "true" : "false");
-  if (delegate())
-    delegate()->PrintMessage(message);
-}
-
 void TestRunner::CloseWebInspector() {
   delegate_->CloseDevTools();
 }
@@ -2945,11 +2643,6 @@
   delegate_->SetAcceptAllCookies(accept);
 }
 
-void TestRunnerForSpecificView::SetWindowIsKey(bool value) {
-  web_test_proxy_base_->test_interfaces()->GetTestRunner()->SetFocus(web_view(),
-                                                                     value);
-}
-
 void TestRunner::SetFocus(blink::WebView* web_view, bool focus) {
   if (focus) {
     if (previously_focused_view_ != web_view) {
@@ -2969,52 +2662,6 @@
   return delegate_->PathToLocalResource(path);
 }
 
-void TestRunnerForSpecificView::SetBackingScaleFactor(
-    double value,
-    v8::Local<v8::Function> callback) {
-  delegate()->SetDeviceScaleFactor(value);
-  PostV8Callback(callback);
-}
-
-void TestRunnerForSpecificView::EnableUseZoomForDSF(
-    v8::Local<v8::Function> callback) {
-  delegate()->EnableUseZoomForDSF();
-  PostV8Callback(callback);
-}
-
-void TestRunnerForSpecificView::SetColorProfile(
-    const std::string& name,
-    v8::Local<v8::Function> callback) {
-  delegate()->SetDeviceColorProfile(name);
-  PostV8Callback(callback);
-}
-
-void TestRunnerForSpecificView::SetBluetoothFakeAdapter(
-    const std::string& adapter_name,
-    v8::Local<v8::Function> callback) {
-  delegate()->SetBluetoothFakeAdapter(
-      adapter_name, CreateClosureThatPostsV8Callback(callback));
-}
-
-void TestRunnerForSpecificView::SetBluetoothManualChooser(bool enable) {
-  delegate()->SetBluetoothManualChooser(enable);
-}
-
-void TestRunnerForSpecificView::GetBluetoothManualChooserEvents(
-    v8::Local<v8::Function> callback) {
-  return delegate()->GetBluetoothManualChooserEvents(base::Bind(
-      &TestRunnerForSpecificView::GetBluetoothManualChooserEventsCallback,
-      weak_factory_.GetWeakPtr(),
-      base::Passed(v8::UniquePersistent<v8::Function>(
-          blink::mainThreadIsolate(), callback))));
-}
-
-void TestRunnerForSpecificView::SendBluetoothManualChooserEvent(
-    const std::string& event,
-    const std::string& argument) {
-  delegate()->SendBluetoothManualChooserEvent(event, argument);
-}
-
 void TestRunner::SetGeofencingMockProvider(bool service_available) {
   delegate_->SetGeofencingMockProvider(service_available);
 }
@@ -3034,19 +2681,6 @@
   delegate_->SetPermission(name, value, origin, embedding_origin);
 }
 
-void TestRunnerForSpecificView::DispatchBeforeInstallPromptEvent(
-    int request_id,
-    const std::vector<std::string>& event_platforms,
-    v8::Local<v8::Function> callback) {
-  delegate()->DispatchBeforeInstallPromptEvent(
-      request_id, event_platforms,
-      base::Bind(
-          &TestRunnerForSpecificView::DispatchBeforeInstallPromptCallback,
-          weak_factory_.GetWeakPtr(),
-          base::Passed(v8::UniquePersistent<v8::Function>(
-              blink::mainThreadIsolate(), callback))));
-}
-
 void TestRunner::ResolveBeforeInstallPromptPromise(
     int request_id,
     const std::string& platform) {
@@ -3055,10 +2689,6 @@
   test_interfaces_->GetAppBannerClient()->ResolvePromise(request_id, platform);
 }
 
-void TestRunnerForSpecificView::RunIdleTasks(v8::Local<v8::Function> callback) {
-  delegate()->RunIdleTasks(CreateClosureThatPostsV8Callback(callback));
-}
-
 void TestRunner::SetPOSIXLocale(const std::string& locale) {
   delegate_->SetLocale(locale);
 }
@@ -3102,47 +2732,6 @@
   credential_manager_client_->SetError(error);
 }
 
-void TestRunnerForSpecificView::AddWebPageOverlay() {
-  web_view()->setPageOverlayColor(SK_ColorCYAN);
-}
-
-void TestRunnerForSpecificView::RemoveWebPageOverlay() {
-  web_view()->setPageOverlayColor(SK_ColorTRANSPARENT);
-}
-
-void TestRunnerForSpecificView::LayoutAndPaintAsync() {
-  test_runner::LayoutAndPaintAsyncThen(web_view(), base::Closure());
-}
-
-void TestRunnerForSpecificView::LayoutAndPaintAsyncThen(
-    v8::Local<v8::Function> callback) {
-  test_runner::LayoutAndPaintAsyncThen(
-      web_view(), CreateClosureThatPostsV8Callback(callback));
-}
-
-void TestRunnerForSpecificView::GetManifestThen(
-    v8::Local<v8::Function> callback) {
-  v8::UniquePersistent<v8::Function> persistent_callback(
-      blink::mainThreadIsolate(), callback);
-
-  delegate()->FetchManifest(
-      web_view(), web_view()->mainFrame()->document().manifestURL(),
-      base::Bind(&TestRunnerForSpecificView::GetManifestCallback,
-                 weak_factory_.GetWeakPtr(),
-                 base::Passed(std::move(persistent_callback))));
-}
-
-void TestRunnerForSpecificView::CapturePixelsAsyncThen(
-    v8::Local<v8::Function> callback) {
-  v8::UniquePersistent<v8::Function> persistent_callback(
-      blink::mainThreadIsolate(), callback);
-
-  web_test_proxy_base_->test_interfaces()->GetTestRunner()->DumpPixelsAsync(
-      web_view(), base::Bind(&TestRunnerForSpecificView::CapturePixelsCallback,
-                             weak_factory_.GetWeakPtr(),
-                             base::Passed(std::move(persistent_callback))));
-}
-
 void TestRunner::OnLayoutTestRuntimeFlagsChanged() {
   if (layout_test_runtime_flags_.tracked_dictionary().changed_values().empty())
     return;
@@ -3154,118 +2743,6 @@
   layout_test_runtime_flags_.tracked_dictionary().ResetChangeTracking();
 }
 
-void TestRunnerForSpecificView::ForceNextWebGLContextCreationToFail() {
-  web_view()->forceNextWebGLContextCreationToFail();
-}
-
-void TestRunnerForSpecificView::ForceNextDrawingBufferCreationToFail() {
-  web_view()->forceNextDrawingBufferCreationToFail();
-}
-
-void TestRunnerForSpecificView::CopyImageAtAndCapturePixelsAsyncThen(
-    int x,
-    int y,
-    v8::Local<v8::Function> callback) {
-  v8::UniquePersistent<v8::Function> persistent_callback(
-      blink::mainThreadIsolate(), callback);
-
-  CopyImageAtAndCapturePixels(
-      web_view(), x, y,
-      base::Bind(&TestRunnerForSpecificView::CapturePixelsCallback,
-                 weak_factory_.GetWeakPtr(),
-                 base::Passed(std::move(persistent_callback))));
-}
-
-void TestRunnerForSpecificView::GetManifestCallback(
-    v8::UniquePersistent<v8::Function> callback,
-    const blink::WebURLResponse& response,
-    const std::string& data) {
-  PostV8CallbackWithArgs(std::move(callback), 0, nullptr);
-}
-
-void TestRunnerForSpecificView::CapturePixelsCallback(
-    v8::UniquePersistent<v8::Function> callback,
-    const SkBitmap& snapshot) {
-  v8::Isolate* isolate = blink::mainThreadIsolate();
-  v8::HandleScope handle_scope(isolate);
-
-  v8::Local<v8::Context> context =
-      web_view()->mainFrame()->mainWorldScriptContext();
-  if (context.IsEmpty())
-    return;
-
-  v8::Context::Scope context_scope(context);
-  v8::Local<v8::Value> argv[3];
-  SkAutoLockPixels snapshot_lock(snapshot);
-
-  // Size can be 0 for cases where copyImageAt was called on position
-  // that doesn't have an image.
-  int width = snapshot.info().width();
-  argv[0] = v8::Number::New(isolate, width);
-
-  int height = snapshot.info().height();
-  argv[1] = v8::Number::New(isolate, height);
-
-  // Skia's internal byte order is platform-dependent. Always convert to RGBA
-  // in order to provide a consistent ordering to the layout tests.
-  const SkImageInfo bufferInfo =
-      snapshot.info().makeColorType(kRGBA_8888_SkColorType);
-  const size_t bufferRowBytes = bufferInfo.minRowBytes();
-  blink::WebArrayBuffer buffer =
-      blink::WebArrayBuffer::create(bufferInfo.getSafeSize(bufferRowBytes), 1);
-  if (!snapshot.readPixels(bufferInfo,
-                           buffer.data(),
-                           bufferRowBytes,
-                           0, 0)) {
-    // We only expect readPixels to fail for null bitmaps.
-    DCHECK(snapshot.isNull());
-  }
-
-  argv[2] = blink::WebArrayBufferConverter::toV8Value(
-      &buffer, context->Global(), isolate);
-
-  PostV8CallbackWithArgs(std::move(callback), arraysize(argv), argv);
-}
-
-void TestRunnerForSpecificView::DispatchBeforeInstallPromptCallback(
-    v8::UniquePersistent<v8::Function> callback,
-    bool canceled) {
-  v8::Isolate* isolate = blink::mainThreadIsolate();
-  v8::HandleScope handle_scope(isolate);
-
-  v8::Local<v8::Context> context =
-      web_view()->mainFrame()->mainWorldScriptContext();
-  if (context.IsEmpty())
-    return;
-
-  v8::Context::Scope context_scope(context);
-  v8::Local<v8::Value> arg;
-  arg = v8::Boolean::New(isolate, canceled);
-
-  PostV8CallbackWithArgs(std::move(callback), 1, &arg);
-}
-
-void TestRunnerForSpecificView::GetBluetoothManualChooserEventsCallback(
-    v8::UniquePersistent<v8::Function> callback,
-    const std::vector<std::string>& events) {
-  // Build the V8 context.
-  v8::Isolate* isolate = blink::mainThreadIsolate();
-  v8::HandleScope handle_scope(isolate);
-  v8::Local<v8::Context> context =
-      web_view()->mainFrame()->mainWorldScriptContext();
-  if (context.IsEmpty())
-    return;
-  v8::Context::Scope context_scope(context);
-
-  // Convert the argument.
-  v8::Local<v8::Value> arg;
-  if (!gin::TryConvertToV8(isolate, events, &arg))
-    return;
-
-  // Call the callback.
-  PostV8CallbackWithArgs(std::move(callback), 1, &arg);
-}
-
 void TestRunner::LocationChangeDone() {
   web_history_item_count_ = delegate_->NavigationEntryCount();
 
@@ -3307,80 +2784,4 @@
   OnLayoutTestRuntimeFlagsChanged();
 }
 
-void TestRunnerForSpecificView::DidAcquirePointerLockInternal() {
-  pointer_locked_ = true;
-  web_view()->didAcquirePointerLock();
-
-  // Reset planned result to default.
-  pointer_lock_planned_result_ = PointerLockWillSucceed;
-}
-
-void TestRunnerForSpecificView::DidNotAcquirePointerLockInternal() {
-  DCHECK(!pointer_locked_);
-  pointer_locked_ = false;
-  web_view()->didNotAcquirePointerLock();
-
-  // Reset planned result to default.
-  pointer_lock_planned_result_ = PointerLockWillSucceed;
-}
-
-void TestRunnerForSpecificView::DidLosePointerLockInternal() {
-  bool was_locked = pointer_locked_;
-  pointer_locked_ = false;
-  if (was_locked)
-    web_view()->didLosePointerLock();
-}
-
-TestRunnerForSpecificView::TestRunnerForSpecificView(
-    WebTestProxyBase* web_test_proxy_base)
-    : web_test_proxy_base_(web_test_proxy_base), weak_factory_(this) {
-  Reset();
-}
-
-TestRunnerForSpecificView::~TestRunnerForSpecificView() {}
-
-void TestRunnerForSpecificView::Install(blink::WebLocalFrame* frame) {
-  web_test_proxy_base_->test_interfaces()->GetTestRunner()->Install(
-      frame, weak_factory_.GetWeakPtr());
-}
-
-void TestRunnerForSpecificView::Reset() {
-  pointer_locked_ = false;
-  pointer_lock_planned_result_ = PointerLockWillSucceed;
-
-  if (web_view() && web_view()->mainFrame()) {
-    RemoveWebPageOverlay();
-    SetTabKeyCyclesThroughElements(true);
-
-#if !defined(OS_MACOSX) && !defined(OS_WIN)
-    // (Constants copied because we can't depend on the header that defined
-    // them from this file.)
-    web_view()->setSelectionColors(
-        0xff1e90ff, 0xff000000, 0xffc8c8c8, 0xff323232);
-#endif
-    web_view()->setVisibilityState(WebPageVisibilityStateVisible, true);
-    if (web_view()->mainFrame()->isWebLocalFrame()) {
-      web_view()->mainFrame()->enableViewSourceMode(false);
-      web_view()->setTextZoomFactor(1);
-      web_view()->setZoomLevel(0);
-    }
-  }
-}
-
-void TestRunnerForSpecificView::SetViewSourceForFrame(const std::string& name,
-                                                      bool enabled) {
-  WebFrame* target_frame =
-      web_view()->findFrameByName(WebString::fromUTF8(name));
-  if (target_frame)
-    target_frame->enableViewSourceMode(enabled);
-}
-
-blink::WebView* TestRunnerForSpecificView::web_view() {
-  return web_test_proxy_base_->web_view();
-}
-
-WebTestDelegate* TestRunnerForSpecificView::delegate() {
-  return web_test_proxy_base_->delegate();
-}
-
 }  // namespace test_runner
diff --git a/components/test_runner/test_runner.gyp b/components/test_runner/test_runner.gyp
index 7cb4421..b7ddd27 100644
--- a/components/test_runner/test_runner.gyp
+++ b/components/test_runner/test_runner.gyp
@@ -102,6 +102,8 @@
         'test_runner.cc',
         'test_runner.h',
         'test_runner_export.h',
+        'test_runner_for_specific_view.cc',
+        'test_runner_for_specific_view.h',
         'text_input_controller.cc',
         'text_input_controller.h',
         'tracked_dictionary.cc',
@@ -122,6 +124,8 @@
         'web_test_runner.h',
         'web_view_test_client.cc',
         'web_view_test_client.h',
+        'web_widget_test_client.cc',
+        'web_widget_test_client.h',
       ],
       'msvs_settings': {
         'VCLinkerTool': {
diff --git a/components/test_runner/test_runner.h b/components/test_runner/test_runner.h
index 941906d5..a22a5dbc 100644
--- a/components/test_runner/test_runner.h
+++ b/components/test_runner/test_runner.h
@@ -28,10 +28,9 @@
 class WebContentSettingsClient;
 class WebFrame;
 class WebLocalFrame;
-class WebMediaStream;
 class WebString;
 class WebView;
-class WebURLResponse;
+class WebWidget;
 }
 
 namespace gin {
@@ -41,7 +40,6 @@
 
 namespace test_runner {
 
-class InvokeCallbackTask;
 class MockContentSettingsClient;
 class MockCredentialManagerClient;
 class MockScreenOrientationClient;
@@ -51,7 +49,6 @@
 class TestInterfaces;
 class TestRunnerForSpecificView;
 class WebTestDelegate;
-class WebTestProxyBase;
 
 // TestRunner class currently has dual purpose:
 // 1. It implements |testRunner| javascript bindings for "global" / "ambient".
@@ -102,8 +99,8 @@
   void SetFocus(blink::WebView* web_view, bool focus) override;
 
   // Methods used by WebViewTestClient and WebFrameTestClient.
-  void OnAnimationScheduled(blink::WebView* view);
-  void OnAnimationBegun(blink::WebView* view);
+  void OnAnimationScheduled(blink::WebWidget* widget);
+  void OnAnimationBegun(blink::WebWidget* widget);
   std::string GetAcceptLanguages() const;
   bool shouldStayOnPageAfterHandlingBeforeUnload() const;
   MockScreenOrientationClient* getMockScreenOrientationClient();
@@ -645,208 +642,13 @@
   // is ok, because this is taken care of in WebTestDelegate::SetFocus).
   blink::WebView* previously_focused_view_;
 
-  std::set<blink::WebView*> views_with_scheduled_animations_;
+  std::set<blink::WebWidget*> widgets_with_scheduled_animations_;
 
   base::WeakPtrFactory<TestRunner> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(TestRunner);
 };
 
-// TestRunnerForSpecificView implements part of |testRunner| javascript bindings
-// that work with a view where the javascript call originated from.  Examples:
-// - testRunner.capturePixelsAsyncThen
-// - testRunner.setPageVisibility
-// Note that "global" bindings are handled by TestRunner class.
-// TODO(lukasza): Move this class to a separate compilation unit.
-class TestRunnerForSpecificView {
- public:
-  explicit TestRunnerForSpecificView(WebTestProxyBase* web_test_proxy_base);
-  ~TestRunnerForSpecificView();
-
-  // Installs view-specific bindings (handled by |this|) and *also* global
-  // TestRunner bindings (both kinds of bindings are exposed via a single
-  // |testRunner| object in javascript).
-  void Install(blink::WebLocalFrame* frame);
-
-  void Reset();
-
-  // Pointer lock methods used by WebViewTestClient.
-  bool RequestPointerLock();
-  void RequestPointerUnlock();
-  bool isPointerLocked();
-
- private:
-  friend class TestRunnerBindings;
-
-  // Helpers for working with base and V8 callbacks.
-  void PostTask(const base::Closure& callback);
-  void PostDelayedTask(long long delay, const base::Closure& callback);
-  void PostV8Callback(const v8::Local<v8::Function>& callback);
-  void PostV8CallbackWithArgs(v8::UniquePersistent<v8::Function> callback,
-                              int argc,
-                              v8::Local<v8::Value> argv[]);
-  void InvokeV8Callback(const v8::UniquePersistent<v8::Function>& callback);
-  void InvokeV8CallbackWithArgs(
-      const v8::UniquePersistent<v8::Function>& callback,
-      const std::vector<v8::UniquePersistent<v8::Value>>& args);
-  base::Closure CreateClosureThatPostsV8Callback(
-      const v8::Local<v8::Function>& callback);
-
-  void LayoutAndPaintAsync();
-  void LayoutAndPaintAsyncThen(v8::Local<v8::Function> callback);
-
-  // Similar to LayoutAndPaintAsyncThen(), but pass parameters of the captured
-  // snapshot (width, height, snapshot) to the callback. The snapshot is in
-  // uint8_t RGBA format.
-  void CapturePixelsAsyncThen(v8::Local<v8::Function> callback);
-  void CapturePixelsCallback(v8::UniquePersistent<v8::Function> callback,
-                             const SkBitmap& snapshot);
-
-  // Similar to CapturePixelsAsyncThen(). Copies to the clipboard the image
-  // located at a particular point in the WebView (if there is such an image),
-  // reads back its pixels, and provides the snapshot to the callback. If there
-  // is no image at that point, calls the callback with (0, 0, empty_snapshot).
-  void CopyImageAtAndCapturePixelsAsyncThen(
-      int x,
-      int y,
-      const v8::Local<v8::Function> callback);
-
-  void GetManifestThen(v8::Local<v8::Function> callback);
-  void GetManifestCallback(v8::UniquePersistent<v8::Function> callback,
-                           const blink::WebURLResponse& response,
-                           const std::string& data);
-
-  // Calls |callback| with a DOMString[] representing the events recorded since
-  // the last call to this function.
-  void GetBluetoothManualChooserEvents(v8::Local<v8::Function> callback);
-  void GetBluetoothManualChooserEventsCallback(
-      v8::UniquePersistent<v8::Function> callback,
-      const std::vector<std::string>& events);
-
-  // Change the bluetooth test data while running a layout test.
-  void SetBluetoothFakeAdapter(const std::string& adapter_name,
-                               v8::Local<v8::Function> callback);
-
-  // If |enable| is true, makes the Bluetooth chooser record its input and wait
-  // for instructions from the test program on how to proceed. Otherwise falls
-  // back to the browser's default chooser.
-  void SetBluetoothManualChooser(bool enable);
-
-  // Calls the BluetoothChooser::EventHandler with the arguments here. Valid
-  // event strings are:
-  //  * "cancel" - simulates the user canceling the chooser.
-  //  * "select" - simulates the user selecting a device whose device ID is in
-  //               |argument|.
-  void SendBluetoothManualChooserEvent(const std::string& event,
-                                       const std::string& argument);
-
-  // Used to set the device scale factor.
-  void SetBackingScaleFactor(double value, v8::Local<v8::Function> callback);
-
-  // Enable zoom-for-dsf option.
-  // TODO(oshima): Remove this once all platforms migrated.
-  void EnableUseZoomForDSF(v8::Local<v8::Function> callback);
-
-  // Change the device color profile while running a layout test.
-  void SetColorProfile(const std::string& name,
-                       v8::Local<v8::Function> callback);
-
-  // Causes the beforeinstallprompt event to be sent to the renderer.
-  void DispatchBeforeInstallPromptEvent(
-      int request_id,
-      const std::vector<std::string>& event_platforms,
-      v8::Local<v8::Function> callback);
-  void DispatchBeforeInstallPromptCallback(
-      v8::UniquePersistent<v8::Function> callback,
-      bool canceled);
-
-  // Immediately run all pending idle tasks, including all pending
-  // requestIdleCallback calls.  Invoke the callback when all
-  // idle tasks are complete.
-  void RunIdleTasks(v8::Local<v8::Function> callback);
-
-  // Method that controls whether pressing Tab key cycles through page elements
-  // or inserts a '\t' char in text area
-  void SetTabKeyCyclesThroughElements(bool tab_key_cycles_through_elements);
-
-  // Executes an internal command (superset of document.execCommand() commands).
-  void ExecCommand(gin::Arguments* args);
-
-  // Checks if an internal command is currently available.
-  bool IsCommandEnabled(const std::string& command);
-
-  // Returns true if the current page box has custom page size style for
-  // printing.
-  bool HasCustomPageSizeStyle(int page_index);
-
-  // Forces the selection colors for testing under Linux.
-  void ForceRedSelectionColors();
-
-  // Switch the visibility of the page.
-  void SetPageVisibility(const std::string& new_visibility);
-
-  // Changes the direction of the focused element.
-  void SetTextDirection(const std::string& direction_name);
-
-  // Dump current PageImportanceSignals for the page.
-  void DumpPageImportanceSignals();
-
-  // WebPageOverlay related functions. Permits the adding and removing of only
-  // one opaque overlay.
-  void AddWebPageOverlay();
-  void RemoveWebPageOverlay();
-
-  // Sets a flag causing the next call to WebGLRenderingContext::create to fail.
-  void ForceNextWebGLContextCreationToFail();
-
-  // Sets a flag causing the next call to DrawingBuffer::create to fail.
-  void ForceNextDrawingBufferCreationToFail();
-
-  // Gives focus to the view associated with TestRunnerForSpecificView.
-  void SetWindowIsKey(bool value);
-
-  // Pointer lock handling.
-  void DidAcquirePointerLock();
-  void DidNotAcquirePointerLock();
-  void DidLosePointerLock();
-  void SetPointerLockWillFailSynchronously();
-  void SetPointerLockWillRespondAsynchronously();
-  void DidAcquirePointerLockInternal();
-  void DidNotAcquirePointerLockInternal();
-  void DidLosePointerLockInternal();
-  bool pointer_locked_;
-  enum {
-    PointerLockWillSucceed,
-    PointerLockWillRespondAsync,
-    PointerLockWillFailSync,
-  } pointer_lock_planned_result_;
-
-  bool CallShouldCloseOnWebView();
-  void SetDomainRelaxationForbiddenForURLScheme(bool forbidden,
-                                                const std::string& scheme);
-  v8::Local<v8::Value> EvaluateScriptInIsolatedWorldAndReturnValue(
-      int world_id,
-      const std::string& script);
-  void EvaluateScriptInIsolatedWorld(int world_id, const std::string& script);
-  void SetIsolatedWorldSecurityOrigin(int world_id,
-                                      v8::Local<v8::Value> origin);
-  void SetIsolatedWorldContentSecurityPolicy(int world_id,
-                                             const std::string& policy);
-  bool FindString(const std::string& search_text,
-                  const std::vector<std::string>& options_array);
-  std::string SelectionAsMarkup();
-  void SetViewSourceForFrame(const std::string& name, bool enabled);
-
-  // Helpers for accessing pointers exposed by |web_test_proxy_base_|.
-  blink::WebView* web_view();
-  WebTestDelegate* delegate();
-  WebTestProxyBase* web_test_proxy_base_;
-
-  base::WeakPtrFactory<TestRunnerForSpecificView> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestRunnerForSpecificView);
-};
-
 }  // namespace test_runner
 
 #endif  // COMPONENTS_TEST_RUNNER_TEST_RUNNER_H_
diff --git a/components/test_runner/test_runner_for_specific_view.cc b/components/test_runner/test_runner_for_specific_view.cc
new file mode 100644
index 0000000..4476f3d
--- /dev/null
+++ b/components/test_runner/test_runner_for_specific_view.cc
@@ -0,0 +1,673 @@
+// Copyright 2016 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 "components/test_runner/test_runner_for_specific_view.h"
+
+#include <stddef.h>
+#include <limits>
+#include <utility>
+
+#include "base/command_line.h"
+#include "base/logging.h"
+#include "base/macros.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/stringprintf.h"
+#include "build/build_config.h"
+#include "components/test_runner/app_banner_client.h"
+#include "components/test_runner/layout_and_paint_async_then.h"
+#include "components/test_runner/layout_dump.h"
+#include "components/test_runner/mock_content_settings_client.h"
+#include "components/test_runner/mock_credential_manager_client.h"
+#include "components/test_runner/mock_screen_orientation_client.h"
+#include "components/test_runner/mock_web_speech_recognizer.h"
+#include "components/test_runner/mock_web_user_media_client.h"
+#include "components/test_runner/pixel_dump.h"
+#include "components/test_runner/spell_check_client.h"
+#include "components/test_runner/test_common.h"
+#include "components/test_runner/test_interfaces.h"
+#include "components/test_runner/test_preferences.h"
+#include "components/test_runner/test_runner.h"
+#include "components/test_runner/web_task.h"
+#include "components/test_runner/web_test_delegate.h"
+#include "components/test_runner/web_test_proxy.h"
+#include "gin/arguments.h"
+#include "gin/array_buffer.h"
+#include "gin/handle.h"
+#include "gin/object_template_builder.h"
+#include "gin/wrappable.h"
+#include "third_party/WebKit/public/platform/WebCanvas.h"
+#include "third_party/WebKit/public/platform/WebData.h"
+#include "third_party/WebKit/public/platform/WebPasswordCredential.h"
+#include "third_party/WebKit/public/platform/WebPoint.h"
+#include "third_party/WebKit/public/platform/WebURLResponse.h"
+#include "third_party/WebKit/public/platform/modules/device_orientation/WebDeviceMotionData.h"
+#include "third_party/WebKit/public/platform/modules/device_orientation/WebDeviceOrientationData.h"
+#include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerRegistration.h"
+#include "third_party/WebKit/public/web/WebArrayBuffer.h"
+#include "third_party/WebKit/public/web/WebArrayBufferConverter.h"
+#include "third_party/WebKit/public/web/WebDataSource.h"
+#include "third_party/WebKit/public/web/WebDocument.h"
+#include "third_party/WebKit/public/web/WebFindOptions.h"
+#include "third_party/WebKit/public/web/WebFrame.h"
+#include "third_party/WebKit/public/web/WebInputElement.h"
+#include "third_party/WebKit/public/web/WebKit.h"
+#include "third_party/WebKit/public/web/WebLocalFrame.h"
+#include "third_party/WebKit/public/web/WebPageImportanceSignals.h"
+#include "third_party/WebKit/public/web/WebScriptSource.h"
+#include "third_party/WebKit/public/web/WebSecurityPolicy.h"
+#include "third_party/WebKit/public/web/WebSerializedScriptValue.h"
+#include "third_party/WebKit/public/web/WebSettings.h"
+#include "third_party/WebKit/public/web/WebSurroundingText.h"
+#include "third_party/WebKit/public/web/WebView.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkCanvas.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/rect_f.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/skia_util.h"
+#include "ui/gfx/switches.h"
+
+#if defined(__linux__) || defined(ANDROID)
+#include "third_party/WebKit/public/web/linux/WebFontRendering.h"
+#endif
+
+using namespace blink;
+
+namespace test_runner {
+
+TestRunnerForSpecificView::TestRunnerForSpecificView(
+    WebTestProxyBase* web_test_proxy_base)
+    : web_test_proxy_base_(web_test_proxy_base), weak_factory_(this) {
+  Reset();
+}
+
+TestRunnerForSpecificView::~TestRunnerForSpecificView() {}
+
+void TestRunnerForSpecificView::Install(blink::WebLocalFrame* frame) {
+  web_test_proxy_base_->test_interfaces()->GetTestRunner()->Install(
+      frame, weak_factory_.GetWeakPtr());
+}
+
+void TestRunnerForSpecificView::Reset() {
+  pointer_locked_ = false;
+  pointer_lock_planned_result_ = PointerLockWillSucceed;
+
+  if (web_view() && web_view()->mainFrame()) {
+    RemoveWebPageOverlay();
+    SetTabKeyCyclesThroughElements(true);
+
+#if !defined(OS_MACOSX) && !defined(OS_WIN)
+    // (Constants copied because we can't depend on the header that defined
+    // them from this file.)
+    web_view()->setSelectionColors(
+        0xff1e90ff, 0xff000000, 0xffc8c8c8, 0xff323232);
+#endif
+    web_view()->setVisibilityState(WebPageVisibilityStateVisible, true);
+    if (web_view()->mainFrame()->isWebLocalFrame()) {
+      web_view()->mainFrame()->enableViewSourceMode(false);
+      web_view()->setTextZoomFactor(1);
+      web_view()->setZoomLevel(0);
+    }
+  }
+}
+
+bool TestRunnerForSpecificView::RequestPointerLock() {
+  switch (pointer_lock_planned_result_) {
+    case PointerLockWillSucceed:
+      PostDelayedTask(
+          0,
+          base::Bind(&TestRunnerForSpecificView::DidAcquirePointerLockInternal,
+                     weak_factory_.GetWeakPtr()));
+      return true;
+    case PointerLockWillRespondAsync:
+      DCHECK(!pointer_locked_);
+      return true;
+    case PointerLockWillFailSync:
+      DCHECK(!pointer_locked_);
+      return false;
+    default:
+      NOTREACHED();
+      return false;
+  }
+}
+
+void TestRunnerForSpecificView::RequestPointerUnlock() {
+  PostDelayedTask(
+      0, base::Bind(&TestRunnerForSpecificView::DidLosePointerLockInternal,
+                    weak_factory_.GetWeakPtr()));
+}
+
+bool TestRunnerForSpecificView::isPointerLocked() {
+  return pointer_locked_;
+}
+
+void TestRunnerForSpecificView::PostTask(const base::Closure& callback) {
+  delegate()->PostTask(new WebCallbackTask(callback));
+}
+
+void TestRunnerForSpecificView::PostDelayedTask(long long delay,
+                                                const base::Closure& callback) {
+  delegate()->PostDelayedTask(new WebCallbackTask(callback), delay);
+}
+
+void TestRunnerForSpecificView::PostV8Callback(
+    const v8::Local<v8::Function>& callback) {
+  PostTask(base::Bind(&TestRunnerForSpecificView::InvokeV8Callback,
+                      weak_factory_.GetWeakPtr(),
+                      v8::UniquePersistent<v8::Function>(
+                          blink::mainThreadIsolate(), callback)));
+}
+
+void TestRunnerForSpecificView::PostV8CallbackWithArgs(
+    v8::UniquePersistent<v8::Function> callback,
+    int argc,
+    v8::Local<v8::Value> argv[]) {
+  std::vector<v8::UniquePersistent<v8::Value>> args;
+  for (int i = 0; i < argc; i++) {
+    args.push_back(
+        v8::UniquePersistent<v8::Value>(blink::mainThreadIsolate(), argv[i]));
+  }
+
+  PostTask(base::Bind(&TestRunnerForSpecificView::InvokeV8CallbackWithArgs,
+                      weak_factory_.GetWeakPtr(), std::move(callback),
+                      std::move(args)));
+}
+
+void TestRunnerForSpecificView::InvokeV8Callback(
+    const v8::UniquePersistent<v8::Function>& callback) {
+  std::vector<v8::UniquePersistent<v8::Value>> empty_args;
+  InvokeV8CallbackWithArgs(callback, std::move(empty_args));
+}
+
+void TestRunnerForSpecificView::InvokeV8CallbackWithArgs(
+    const v8::UniquePersistent<v8::Function>& callback,
+    const std::vector<v8::UniquePersistent<v8::Value>>& args) {
+  v8::Isolate* isolate = blink::mainThreadIsolate();
+  v8::HandleScope handle_scope(isolate);
+
+  WebFrame* frame = web_view()->mainFrame();
+  v8::Local<v8::Context> context = frame->mainWorldScriptContext();
+  if (context.IsEmpty())
+    return;
+  v8::Context::Scope context_scope(context);
+
+  std::vector<v8::Local<v8::Value>> local_args;
+  for (const auto& arg : args) {
+    local_args.push_back(v8::Local<v8::Value>::New(isolate, arg));
+  }
+
+  frame->callFunctionEvenIfScriptDisabled(
+      v8::Local<v8::Function>::New(isolate, callback), context->Global(),
+      local_args.size(), local_args.data());
+}
+
+base::Closure TestRunnerForSpecificView::CreateClosureThatPostsV8Callback(
+    const v8::Local<v8::Function>& callback) {
+  return base::Bind(&TestRunnerForSpecificView::PostTask,
+                    weak_factory_.GetWeakPtr(),
+                    base::Bind(&TestRunnerForSpecificView::InvokeV8Callback,
+                               weak_factory_.GetWeakPtr(),
+                               v8::UniquePersistent<v8::Function>(
+                                   blink::mainThreadIsolate(), callback)));
+}
+
+void TestRunnerForSpecificView::LayoutAndPaintAsync() {
+  test_runner::LayoutAndPaintAsyncThen(web_view(), base::Closure());
+}
+
+void TestRunnerForSpecificView::LayoutAndPaintAsyncThen(
+    v8::Local<v8::Function> callback) {
+  test_runner::LayoutAndPaintAsyncThen(
+      web_view(), CreateClosureThatPostsV8Callback(callback));
+}
+
+void TestRunnerForSpecificView::CapturePixelsAsyncThen(
+    v8::Local<v8::Function> callback) {
+  v8::UniquePersistent<v8::Function> persistent_callback(
+      blink::mainThreadIsolate(), callback);
+
+  web_test_proxy_base_->test_interfaces()->GetTestRunner()->DumpPixelsAsync(
+      web_view(), base::Bind(&TestRunnerForSpecificView::CapturePixelsCallback,
+                             weak_factory_.GetWeakPtr(),
+                             base::Passed(std::move(persistent_callback))));
+}
+
+void TestRunnerForSpecificView::CapturePixelsCallback(
+    v8::UniquePersistent<v8::Function> callback,
+    const SkBitmap& snapshot) {
+  v8::Isolate* isolate = blink::mainThreadIsolate();
+  v8::HandleScope handle_scope(isolate);
+
+  v8::Local<v8::Context> context =
+      web_view()->mainFrame()->mainWorldScriptContext();
+  if (context.IsEmpty())
+    return;
+
+  v8::Context::Scope context_scope(context);
+  v8::Local<v8::Value> argv[3];
+  SkAutoLockPixels snapshot_lock(snapshot);
+
+  // Size can be 0 for cases where copyImageAt was called on position
+  // that doesn't have an image.
+  int width = snapshot.info().width();
+  argv[0] = v8::Number::New(isolate, width);
+
+  int height = snapshot.info().height();
+  argv[1] = v8::Number::New(isolate, height);
+
+  // Skia's internal byte order is platform-dependent. Always convert to RGBA
+  // in order to provide a consistent ordering to the layout tests.
+  const SkImageInfo bufferInfo =
+      snapshot.info().makeColorType(kRGBA_8888_SkColorType);
+  const size_t bufferRowBytes = bufferInfo.minRowBytes();
+  blink::WebArrayBuffer buffer =
+      blink::WebArrayBuffer::create(bufferInfo.getSafeSize(bufferRowBytes), 1);
+  if (!snapshot.readPixels(bufferInfo,
+                           buffer.data(),
+                           bufferRowBytes,
+                           0, 0)) {
+    // We only expect readPixels to fail for null bitmaps.
+    DCHECK(snapshot.isNull());
+  }
+
+  argv[2] = blink::WebArrayBufferConverter::toV8Value(
+      &buffer, context->Global(), isolate);
+
+  PostV8CallbackWithArgs(std::move(callback), arraysize(argv), argv);
+}
+
+void TestRunnerForSpecificView::CopyImageAtAndCapturePixelsAsyncThen(
+    int x,
+    int y,
+    v8::Local<v8::Function> callback) {
+  v8::UniquePersistent<v8::Function> persistent_callback(
+      blink::mainThreadIsolate(), callback);
+
+  CopyImageAtAndCapturePixels(
+      web_view(), x, y,
+      base::Bind(&TestRunnerForSpecificView::CapturePixelsCallback,
+                 weak_factory_.GetWeakPtr(),
+                 base::Passed(std::move(persistent_callback))));
+}
+
+void TestRunnerForSpecificView::GetManifestThen(
+    v8::Local<v8::Function> callback) {
+  v8::UniquePersistent<v8::Function> persistent_callback(
+      blink::mainThreadIsolate(), callback);
+
+  delegate()->FetchManifest(
+      web_view(), web_view()->mainFrame()->document().manifestURL(),
+      base::Bind(&TestRunnerForSpecificView::GetManifestCallback,
+                 weak_factory_.GetWeakPtr(),
+                 base::Passed(std::move(persistent_callback))));
+}
+
+void TestRunnerForSpecificView::GetManifestCallback(
+    v8::UniquePersistent<v8::Function> callback,
+    const blink::WebURLResponse& response,
+    const std::string& data) {
+  PostV8CallbackWithArgs(std::move(callback), 0, nullptr);
+}
+
+void TestRunnerForSpecificView::GetBluetoothManualChooserEvents(
+    v8::Local<v8::Function> callback) {
+  return delegate()->GetBluetoothManualChooserEvents(base::Bind(
+      &TestRunnerForSpecificView::GetBluetoothManualChooserEventsCallback,
+      weak_factory_.GetWeakPtr(),
+      base::Passed(v8::UniquePersistent<v8::Function>(
+          blink::mainThreadIsolate(), callback))));
+}
+
+void TestRunnerForSpecificView::GetBluetoothManualChooserEventsCallback(
+    v8::UniquePersistent<v8::Function> callback,
+    const std::vector<std::string>& events) {
+  // Build the V8 context.
+  v8::Isolate* isolate = blink::mainThreadIsolate();
+  v8::HandleScope handle_scope(isolate);
+  v8::Local<v8::Context> context =
+      web_view()->mainFrame()->mainWorldScriptContext();
+  if (context.IsEmpty())
+    return;
+  v8::Context::Scope context_scope(context);
+
+  // Convert the argument.
+  v8::Local<v8::Value> arg;
+  if (!gin::TryConvertToV8(isolate, events, &arg))
+    return;
+
+  // Call the callback.
+  PostV8CallbackWithArgs(std::move(callback), 1, &arg);
+}
+
+void TestRunnerForSpecificView::SetBluetoothFakeAdapter(
+    const std::string& adapter_name,
+    v8::Local<v8::Function> callback) {
+  delegate()->SetBluetoothFakeAdapter(
+      adapter_name, CreateClosureThatPostsV8Callback(callback));
+}
+
+void TestRunnerForSpecificView::SetBluetoothManualChooser(bool enable) {
+  delegate()->SetBluetoothManualChooser(enable);
+}
+
+void TestRunnerForSpecificView::SendBluetoothManualChooserEvent(
+    const std::string& event,
+    const std::string& argument) {
+  delegate()->SendBluetoothManualChooserEvent(event, argument);
+}
+
+void TestRunnerForSpecificView::SetBackingScaleFactor(
+    double value,
+    v8::Local<v8::Function> callback) {
+  delegate()->SetDeviceScaleFactor(value);
+  PostV8Callback(callback);
+}
+
+void TestRunnerForSpecificView::EnableUseZoomForDSF(
+    v8::Local<v8::Function> callback) {
+  delegate()->EnableUseZoomForDSF();
+  PostV8Callback(callback);
+}
+
+void TestRunnerForSpecificView::SetColorProfile(
+    const std::string& name,
+    v8::Local<v8::Function> callback) {
+  delegate()->SetDeviceColorProfile(name);
+  PostV8Callback(callback);
+}
+
+void TestRunnerForSpecificView::DispatchBeforeInstallPromptEvent(
+    int request_id,
+    const std::vector<std::string>& event_platforms,
+    v8::Local<v8::Function> callback) {
+  delegate()->DispatchBeforeInstallPromptEvent(
+      request_id, event_platforms,
+      base::Bind(
+          &TestRunnerForSpecificView::DispatchBeforeInstallPromptCallback,
+          weak_factory_.GetWeakPtr(),
+          base::Passed(v8::UniquePersistent<v8::Function>(
+              blink::mainThreadIsolate(), callback))));
+}
+
+void TestRunnerForSpecificView::DispatchBeforeInstallPromptCallback(
+    v8::UniquePersistent<v8::Function> callback,
+    bool canceled) {
+  v8::Isolate* isolate = blink::mainThreadIsolate();
+  v8::HandleScope handle_scope(isolate);
+
+  v8::Local<v8::Context> context =
+      web_view()->mainFrame()->mainWorldScriptContext();
+  if (context.IsEmpty())
+    return;
+
+  v8::Context::Scope context_scope(context);
+  v8::Local<v8::Value> arg;
+  arg = v8::Boolean::New(isolate, canceled);
+
+  PostV8CallbackWithArgs(std::move(callback), 1, &arg);
+}
+
+void TestRunnerForSpecificView::RunIdleTasks(v8::Local<v8::Function> callback) {
+  delegate()->RunIdleTasks(CreateClosureThatPostsV8Callback(callback));
+}
+
+void TestRunnerForSpecificView::SetTabKeyCyclesThroughElements(
+    bool tab_key_cycles_through_elements) {
+  web_view()->setTabKeyCyclesThroughElements(tab_key_cycles_through_elements);
+}
+
+void TestRunnerForSpecificView::ExecCommand(gin::Arguments* args) {
+  std::string command;
+  args->GetNext(&command);
+
+  std::string value;
+  if (args->Length() >= 3) {
+    // Ignore the second parameter (which is userInterface)
+    // since this command emulates a manual action.
+    args->Skip();
+    args->GetNext(&value);
+  }
+
+  // Note: webkit's version does not return the boolean, so neither do we.
+  web_view()->focusedFrame()->executeCommand(WebString::fromUTF8(command),
+                                             WebString::fromUTF8(value));
+}
+
+bool TestRunnerForSpecificView::IsCommandEnabled(const std::string& command) {
+  return web_view()->focusedFrame()->isCommandEnabled(
+      WebString::fromUTF8(command));
+}
+
+bool TestRunnerForSpecificView::HasCustomPageSizeStyle(int page_index) {
+  WebFrame* frame = web_view()->mainFrame();
+  if (!frame)
+    return false;
+  return frame->hasCustomPageSizeStyle(page_index);
+}
+
+void TestRunnerForSpecificView::ForceRedSelectionColors() {
+  web_view()->setSelectionColors(
+      0xffee0000, 0xff00ee00, 0xff000000, 0xffc0c0c0);
+}
+
+void TestRunnerForSpecificView::SetPageVisibility(
+    const std::string& new_visibility) {
+  if (new_visibility == "visible")
+    web_view()->setVisibilityState(WebPageVisibilityStateVisible, false);
+  else if (new_visibility == "hidden")
+    web_view()->setVisibilityState(WebPageVisibilityStateHidden, false);
+  else if (new_visibility == "prerender")
+    web_view()->setVisibilityState(WebPageVisibilityStatePrerender, false);
+}
+
+void TestRunnerForSpecificView::SetTextDirection(
+    const std::string& direction_name) {
+  // Map a direction name to a WebTextDirection value.
+  WebTextDirection direction;
+  if (direction_name == "auto")
+    direction = WebTextDirectionDefault;
+  else if (direction_name == "rtl")
+    direction = WebTextDirectionRightToLeft;
+  else if (direction_name == "ltr")
+    direction = WebTextDirectionLeftToRight;
+  else
+    return;
+
+  web_view()->setTextDirection(direction);
+}
+
+void TestRunnerForSpecificView::DumpPageImportanceSignals() {
+  blink::WebPageImportanceSignals* signals =
+      web_view()->pageImportanceSignals();
+  if (!signals)
+    return;
+
+  std::string message = base::StringPrintf(
+      "WebPageImportanceSignals:\n"
+      "  hadFormInteraction: %s\n"
+      "  issuedNonGetFetchFromScript: %s\n",
+      signals->hadFormInteraction() ? "true" : "false",
+      signals->issuedNonGetFetchFromScript() ? "true" : "false");
+  if (delegate())
+    delegate()->PrintMessage(message);
+}
+
+void TestRunnerForSpecificView::AddWebPageOverlay() {
+  web_view()->setPageOverlayColor(SK_ColorCYAN);
+}
+
+void TestRunnerForSpecificView::RemoveWebPageOverlay() {
+  web_view()->setPageOverlayColor(SK_ColorTRANSPARENT);
+}
+
+void TestRunnerForSpecificView::ForceNextWebGLContextCreationToFail() {
+  web_view()->forceNextWebGLContextCreationToFail();
+}
+
+void TestRunnerForSpecificView::ForceNextDrawingBufferCreationToFail() {
+  web_view()->forceNextDrawingBufferCreationToFail();
+}
+
+void TestRunnerForSpecificView::SetWindowIsKey(bool value) {
+  web_test_proxy_base_->test_interfaces()->GetTestRunner()->SetFocus(web_view(),
+                                                                     value);
+}
+
+void TestRunnerForSpecificView::DidAcquirePointerLock() {
+  DidAcquirePointerLockInternal();
+}
+
+void TestRunnerForSpecificView::DidNotAcquirePointerLock() {
+  DidNotAcquirePointerLockInternal();
+}
+
+void TestRunnerForSpecificView::DidLosePointerLock() {
+  DidLosePointerLockInternal();
+}
+
+void TestRunnerForSpecificView::SetPointerLockWillFailSynchronously() {
+  pointer_lock_planned_result_ = PointerLockWillFailSync;
+}
+
+void TestRunnerForSpecificView::SetPointerLockWillRespondAsynchronously() {
+  pointer_lock_planned_result_ = PointerLockWillRespondAsync;
+}
+
+void TestRunnerForSpecificView::DidAcquirePointerLockInternal() {
+  pointer_locked_ = true;
+  web_view()->didAcquirePointerLock();
+
+  // Reset planned result to default.
+  pointer_lock_planned_result_ = PointerLockWillSucceed;
+}
+
+void TestRunnerForSpecificView::DidNotAcquirePointerLockInternal() {
+  DCHECK(!pointer_locked_);
+  pointer_locked_ = false;
+  web_view()->didNotAcquirePointerLock();
+
+  // Reset planned result to default.
+  pointer_lock_planned_result_ = PointerLockWillSucceed;
+}
+
+void TestRunnerForSpecificView::DidLosePointerLockInternal() {
+  bool was_locked = pointer_locked_;
+  pointer_locked_ = false;
+  if (was_locked)
+    web_view()->didLosePointerLock();
+}
+
+bool TestRunnerForSpecificView::CallShouldCloseOnWebView() {
+  return web_view()->mainFrame()->dispatchBeforeUnloadEvent();
+}
+
+void TestRunnerForSpecificView::SetDomainRelaxationForbiddenForURLScheme(
+    bool forbidden,
+    const std::string& scheme) {
+  web_view()->setDomainRelaxationForbidden(forbidden,
+                                           WebString::fromUTF8(scheme));
+}
+
+v8::Local<v8::Value>
+TestRunnerForSpecificView::EvaluateScriptInIsolatedWorldAndReturnValue(
+    int world_id,
+    const std::string& script) {
+  WebVector<v8::Local<v8::Value>> values;
+  WebScriptSource source(WebString::fromUTF8(script));
+  // This relies on the iframe focusing itself when it loads. This is a bit
+  // sketchy, but it seems to be what other tests do.
+  web_view()->focusedFrame()->executeScriptInIsolatedWorld(world_id, &source, 1,
+                                                           1, &values);
+  // Since only one script was added, only one result is expected
+  if (values.size() == 1 && !values[0].IsEmpty())
+    return values[0];
+  return v8::Local<v8::Value>();
+}
+
+void TestRunnerForSpecificView::EvaluateScriptInIsolatedWorld(
+    int world_id,
+    const std::string& script) {
+  WebScriptSource source(WebString::fromUTF8(script));
+  web_view()->focusedFrame()->executeScriptInIsolatedWorld(world_id, &source, 1,
+                                                           1);
+}
+
+void TestRunnerForSpecificView::SetIsolatedWorldSecurityOrigin(
+    int world_id,
+    v8::Local<v8::Value> origin) {
+  if (!(origin->IsString() || !origin->IsNull()))
+    return;
+
+  WebSecurityOrigin web_origin;
+  if (origin->IsString()) {
+    web_origin = WebSecurityOrigin::createFromString(
+        V8StringToWebString(origin.As<v8::String>()));
+  }
+  web_view()->focusedFrame()->setIsolatedWorldSecurityOrigin(world_id,
+                                                             web_origin);
+}
+
+void TestRunnerForSpecificView::SetIsolatedWorldContentSecurityPolicy(
+    int world_id,
+    const std::string& policy) {
+  web_view()->focusedFrame()->setIsolatedWorldContentSecurityPolicy(
+      world_id, WebString::fromUTF8(policy));
+}
+
+void TestRunner::InsertStyleSheet(const std::string& source_code) {
+  WebLocalFrame::frameForCurrentContext()->document().insertStyleSheet(
+      WebString::fromUTF8(source_code));
+}
+
+bool TestRunnerForSpecificView::FindString(
+    const std::string& search_text,
+    const std::vector<std::string>& options_array) {
+  WebFindOptions find_options;
+  bool wrap_around = false;
+  find_options.matchCase = true;
+  find_options.findNext = true;
+
+  for (const std::string& option : options_array) {
+    if (option == "CaseInsensitive")
+      find_options.matchCase = false;
+    else if (option == "Backwards")
+      find_options.forward = false;
+    else if (option == "StartInSelection")
+      find_options.findNext = false;
+    else if (option == "AtWordStarts")
+      find_options.wordStart = true;
+    else if (option == "TreatMedialCapitalAsWordStart")
+      find_options.medialCapitalAsWordStart = true;
+    else if (option == "WrapAround")
+      wrap_around = true;
+  }
+
+  WebLocalFrame* frame = web_view()->mainFrame()->toWebLocalFrame();
+  const bool find_result = frame->find(0, WebString::fromUTF8(search_text),
+                                       find_options, wrap_around, 0);
+  frame->stopFinding(false);
+  return find_result;
+}
+
+std::string TestRunnerForSpecificView::SelectionAsMarkup() {
+  return web_view()->mainFrame()->selectionAsMarkup().utf8();
+}
+
+void TestRunnerForSpecificView::SetViewSourceForFrame(const std::string& name,
+                                                      bool enabled) {
+  WebFrame* target_frame =
+      web_view()->findFrameByName(WebString::fromUTF8(name));
+  if (target_frame)
+    target_frame->enableViewSourceMode(enabled);
+}
+
+blink::WebView* TestRunnerForSpecificView::web_view() {
+  return web_test_proxy_base_->web_view();
+}
+
+WebTestDelegate* TestRunnerForSpecificView::delegate() {
+  return web_test_proxy_base_->delegate();
+}
+
+}  // namespace test_runner
diff --git a/components/test_runner/test_runner_for_specific_view.h b/components/test_runner/test_runner_for_specific_view.h
new file mode 100644
index 0000000..06c245c
--- /dev/null
+++ b/components/test_runner/test_runner_for_specific_view.h
@@ -0,0 +1,232 @@
+// Copyright 2016 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 COMPONENTS_TEST_RUNNER_TEST_RUNNER_FOR_SPECIFIC_VIEW_H_
+#define COMPONENTS_TEST_RUNNER_TEST_RUNNER_FOR_SPECIFIC_VIEW_H_
+
+#include <stdint.h>
+
+#include <string>
+#include <vector>
+
+#include "base/callback_forward.h"
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "v8/include/v8.h"
+
+class SkBitmap;
+
+namespace blink {
+class WebLocalFrame;
+class WebURLResponse;
+class WebView;
+}
+
+namespace gin {
+class ArrayBufferView;
+class Arguments;
+}
+
+namespace test_runner {
+
+class WebTestDelegate;
+class WebTestProxyBase;
+
+// TestRunnerForSpecificView implements part of |testRunner| javascript bindings
+// that work with a view where the javascript call originated from.  Examples:
+// - testRunner.capturePixelsAsyncThen
+// - testRunner.setPageVisibility
+// Note that "global" bindings are handled by TestRunner class.
+class TestRunnerForSpecificView {
+ public:
+  explicit TestRunnerForSpecificView(WebTestProxyBase* web_test_proxy_base);
+  ~TestRunnerForSpecificView();
+
+  // Installs view-specific bindings (handled by |this|) and *also* global
+  // TestRunner bindings (both kinds of bindings are exposed via a single
+  // |testRunner| object in javascript).
+  void Install(blink::WebLocalFrame* frame);
+
+  void Reset();
+
+  // Pointer lock methods used by WebViewTestClient.
+  bool RequestPointerLock();
+  void RequestPointerUnlock();
+  bool isPointerLocked();
+
+ private:
+  friend class TestRunnerBindings;
+
+  // Helpers for working with base and V8 callbacks.
+  void PostTask(const base::Closure& callback);
+  void PostDelayedTask(long long delay, const base::Closure& callback);
+  void PostV8Callback(const v8::Local<v8::Function>& callback);
+  void PostV8CallbackWithArgs(v8::UniquePersistent<v8::Function> callback,
+                              int argc,
+                              v8::Local<v8::Value> argv[]);
+  void InvokeV8Callback(const v8::UniquePersistent<v8::Function>& callback);
+  void InvokeV8CallbackWithArgs(
+      const v8::UniquePersistent<v8::Function>& callback,
+      const std::vector<v8::UniquePersistent<v8::Value>>& args);
+  base::Closure CreateClosureThatPostsV8Callback(
+      const v8::Local<v8::Function>& callback);
+
+  void LayoutAndPaintAsync();
+  void LayoutAndPaintAsyncThen(v8::Local<v8::Function> callback);
+
+  // Similar to LayoutAndPaintAsyncThen(), but pass parameters of the captured
+  // snapshot (width, height, snapshot) to the callback. The snapshot is in
+  // uint8_t RGBA format.
+  void CapturePixelsAsyncThen(v8::Local<v8::Function> callback);
+  void CapturePixelsCallback(v8::UniquePersistent<v8::Function> callback,
+                             const SkBitmap& snapshot);
+
+  // Similar to CapturePixelsAsyncThen(). Copies to the clipboard the image
+  // located at a particular point in the WebView (if there is such an image),
+  // reads back its pixels, and provides the snapshot to the callback. If there
+  // is no image at that point, calls the callback with (0, 0, empty_snapshot).
+  void CopyImageAtAndCapturePixelsAsyncThen(
+      int x,
+      int y,
+      const v8::Local<v8::Function> callback);
+
+  void GetManifestThen(v8::Local<v8::Function> callback);
+  void GetManifestCallback(v8::UniquePersistent<v8::Function> callback,
+                           const blink::WebURLResponse& response,
+                           const std::string& data);
+
+  // Calls |callback| with a DOMString[] representing the events recorded since
+  // the last call to this function.
+  void GetBluetoothManualChooserEvents(v8::Local<v8::Function> callback);
+  void GetBluetoothManualChooserEventsCallback(
+      v8::UniquePersistent<v8::Function> callback,
+      const std::vector<std::string>& events);
+
+  // Change the bluetooth test data while running a layout test.
+  void SetBluetoothFakeAdapter(const std::string& adapter_name,
+                               v8::Local<v8::Function> callback);
+
+  // If |enable| is true, makes the Bluetooth chooser record its input and wait
+  // for instructions from the test program on how to proceed. Otherwise falls
+  // back to the browser's default chooser.
+  void SetBluetoothManualChooser(bool enable);
+
+  // Calls the BluetoothChooser::EventHandler with the arguments here. Valid
+  // event strings are:
+  //  * "cancel" - simulates the user canceling the chooser.
+  //  * "select" - simulates the user selecting a device whose device ID is in
+  //               |argument|.
+  void SendBluetoothManualChooserEvent(const std::string& event,
+                                       const std::string& argument);
+
+  // Used to set the device scale factor.
+  void SetBackingScaleFactor(double value, v8::Local<v8::Function> callback);
+
+  // Enable zoom-for-dsf option.
+  // TODO(oshima): Remove this once all platforms migrated.
+  void EnableUseZoomForDSF(v8::Local<v8::Function> callback);
+
+  // Change the device color profile while running a layout test.
+  void SetColorProfile(const std::string& name,
+                       v8::Local<v8::Function> callback);
+
+  // Causes the beforeinstallprompt event to be sent to the renderer.
+  void DispatchBeforeInstallPromptEvent(
+      int request_id,
+      const std::vector<std::string>& event_platforms,
+      v8::Local<v8::Function> callback);
+  void DispatchBeforeInstallPromptCallback(
+      v8::UniquePersistent<v8::Function> callback,
+      bool canceled);
+
+  // Immediately run all pending idle tasks, including all pending
+  // requestIdleCallback calls.  Invoke the callback when all
+  // idle tasks are complete.
+  void RunIdleTasks(v8::Local<v8::Function> callback);
+
+  // Method that controls whether pressing Tab key cycles through page elements
+  // or inserts a '\t' char in text area
+  void SetTabKeyCyclesThroughElements(bool tab_key_cycles_through_elements);
+
+  // Executes an internal command (superset of document.execCommand() commands).
+  void ExecCommand(gin::Arguments* args);
+
+  // Checks if an internal command is currently available.
+  bool IsCommandEnabled(const std::string& command);
+
+  // Returns true if the current page box has custom page size style for
+  // printing.
+  bool HasCustomPageSizeStyle(int page_index);
+
+  // Forces the selection colors for testing under Linux.
+  void ForceRedSelectionColors();
+
+  // Switch the visibility of the page.
+  void SetPageVisibility(const std::string& new_visibility);
+
+  // Changes the direction of the focused element.
+  void SetTextDirection(const std::string& direction_name);
+
+  // Dump current PageImportanceSignals for the page.
+  void DumpPageImportanceSignals();
+
+  // WebPageOverlay related functions. Permits the adding and removing of only
+  // one opaque overlay.
+  void AddWebPageOverlay();
+  void RemoveWebPageOverlay();
+
+  // Sets a flag causing the next call to WebGLRenderingContext::create to fail.
+  void ForceNextWebGLContextCreationToFail();
+
+  // Sets a flag causing the next call to DrawingBuffer::create to fail.
+  void ForceNextDrawingBufferCreationToFail();
+
+  // Gives focus to the view associated with TestRunnerForSpecificView.
+  void SetWindowIsKey(bool value);
+
+  // Pointer lock handling.
+  void DidAcquirePointerLock();
+  void DidNotAcquirePointerLock();
+  void DidLosePointerLock();
+  void SetPointerLockWillFailSynchronously();
+  void SetPointerLockWillRespondAsynchronously();
+  void DidAcquirePointerLockInternal();
+  void DidNotAcquirePointerLockInternal();
+  void DidLosePointerLockInternal();
+  bool pointer_locked_;
+  enum {
+    PointerLockWillSucceed,
+    PointerLockWillRespondAsync,
+    PointerLockWillFailSync,
+  } pointer_lock_planned_result_;
+
+  bool CallShouldCloseOnWebView();
+  void SetDomainRelaxationForbiddenForURLScheme(bool forbidden,
+                                                const std::string& scheme);
+  v8::Local<v8::Value> EvaluateScriptInIsolatedWorldAndReturnValue(
+      int world_id,
+      const std::string& script);
+  void EvaluateScriptInIsolatedWorld(int world_id, const std::string& script);
+  void SetIsolatedWorldSecurityOrigin(int world_id,
+                                      v8::Local<v8::Value> origin);
+  void SetIsolatedWorldContentSecurityPolicy(int world_id,
+                                             const std::string& policy);
+  bool FindString(const std::string& search_text,
+                  const std::vector<std::string>& options_array);
+  std::string SelectionAsMarkup();
+  void SetViewSourceForFrame(const std::string& name, bool enabled);
+
+  // Helpers for accessing pointers exposed by |web_test_proxy_base_|.
+  blink::WebView* web_view();
+  WebTestDelegate* delegate();
+  WebTestProxyBase* web_test_proxy_base_;
+
+  base::WeakPtrFactory<TestRunnerForSpecificView> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestRunnerForSpecificView);
+};
+
+}  // namespace test_runner
+
+#endif  // COMPONENTS_TEST_RUNNER_TEST_RUNNER_FOR_SPECIFIC_VIEW_H_
diff --git a/components/test_runner/web_test_interfaces.cc b/components/test_runner/web_test_interfaces.cc
index 56108882..8de8682 100644
--- a/components/test_runner/web_test_interfaces.cc
+++ b/components/test_runner/web_test_interfaces.cc
@@ -17,6 +17,7 @@
 #include "components/test_runner/web_frame_test_client.h"
 #include "components/test_runner/web_test_proxy.h"
 #include "components/test_runner/web_view_test_client.h"
+#include "components/test_runner/web_widget_test_client.h"
 
 using namespace blink;
 
@@ -101,6 +102,13 @@
       new WebViewTestClient(interfaces_->GetTestRunner(), web_test_proxy_base));
 }
 
+std::unique_ptr<WebWidgetTestClient>
+WebTestInterfaces::CreateWebWidgetTestClient(
+    WebTestProxyBase* web_test_proxy_base) {
+  return base::WrapUnique(new WebWidgetTestClient(interfaces_->GetTestRunner(),
+                                                  web_test_proxy_base));
+}
+
 std::vector<blink::WebView*> WebTestInterfaces::GetWindowList() {
   std::vector<blink::WebView*> result;
   for (WebTestProxyBase* proxy : interfaces_->GetWindowList())
diff --git a/components/test_runner/web_test_interfaces.h b/components/test_runner/web_test_interfaces.h
index 1c9d55e..362fe32b 100644
--- a/components/test_runner/web_test_interfaces.h
+++ b/components/test_runner/web_test_interfaces.h
@@ -36,6 +36,7 @@
 class WebTestProxyBase;
 class WebTestRunner;
 class WebViewTestClient;
+class WebWidgetTestClient;
 
 class TEST_RUNNER_EXPORT WebTestInterfaces {
  public:
@@ -80,6 +81,13 @@
   std::unique_ptr<WebViewTestClient> CreateWebViewTestClient(
       WebTestProxyBase* web_test_proxy_base);
 
+  // Creates a WebWidgetClient implementation providing test behavior (i.e.
+  // providing a mocked screen orientation).  The caller should guarantee that
+  // the returned pointer won't be used beyond the lifetime of WebTestInterfaces
+  // and/or the lifetime of |web_test_proxy_base|.
+  std::unique_ptr<WebWidgetTestClient> CreateWebWidgetTestClient(
+      WebTestProxyBase* web_test_proxy_base);
+
   // Gets a list of currently opened windows created by the current test.
   std::vector<blink::WebView*> GetWindowList();
 
diff --git a/components/test_runner/web_test_proxy.cc b/components/test_runner/web_test_proxy.cc
index 406c243..8e4ad20 100644
--- a/components/test_runner/web_test_proxy.cc
+++ b/components/test_runner/web_test_proxy.cc
@@ -12,6 +12,7 @@
 #include "components/test_runner/mock_screen_orientation_client.h"
 #include "components/test_runner/test_interfaces.h"
 #include "components/test_runner/test_runner.h"
+#include "components/test_runner/test_runner_for_specific_view.h"
 #include "components/test_runner/text_input_controller.h"
 #include "components/test_runner/web_test_delegate.h"
 #include "components/test_runner/web_test_interfaces.h"
@@ -55,15 +56,4 @@
   view_test_runner_->Install(frame);
 }
 
-void WebTestProxyBase::GetScreenOrientationForTesting(
-    blink::WebScreenInfo& screen_info) {
-  MockScreenOrientationClient* mock_client =
-      test_interfaces_->GetTestRunner()->getMockScreenOrientationClient();
-  if (mock_client->IsDisabled())
-    return;
-  // Override screen orientation information with mock data.
-  screen_info.orientationType = mock_client->CurrentOrientationType();
-  screen_info.orientationAngle = mock_client->CurrentOrientationAngle();
-}
-
 }  // namespace test_runner
diff --git a/components/test_runner/web_test_proxy.h b/components/test_runner/web_test_proxy.h
index 7f34ba4..b23e6931 100644
--- a/components/test_runner/web_test_proxy.h
+++ b/components/test_runner/web_test_proxy.h
@@ -14,6 +14,7 @@
 #include "build/build_config.h"
 #include "components/test_runner/test_runner_export.h"
 #include "components/test_runner/web_view_test_client.h"
+#include "components/test_runner/web_widget_test_client.h"
 #include "third_party/WebKit/public/platform/WebDragOperation.h"
 #include "third_party/WebKit/public/platform/WebRect.h"
 #include "third_party/WebKit/public/platform/WebScreenInfo.h"
@@ -77,6 +78,13 @@
     view_test_client_ = std::move(view_test_client);
   }
 
+  void set_widget_test_client(
+      std::unique_ptr<WebWidgetTestClient> widget_test_client) {
+    DCHECK(widget_test_client);
+    DCHECK(!widget_test_client_);
+    widget_test_client_ = std::move(widget_test_client);
+  }
+
   WebTestDelegate* delegate() { return delegate_; }
   void set_delegate(WebTestDelegate* delegate) {
     DCHECK(delegate);
@@ -108,6 +116,9 @@
   ~WebTestProxyBase();
 
   blink::WebViewClient* view_test_client() { return view_test_client_.get(); }
+  blink::WebWidgetClient* widget_test_client() {
+    return widget_test_client_.get();
+  }
 
  private:
   TestInterfaces* test_interfaces_;
@@ -115,6 +126,7 @@
   blink::WebView* web_view_;
   blink::WebWidget* web_widget_;
   std::unique_ptr<WebViewTestClient> view_test_client_;
+  std::unique_ptr<WebWidgetTestClient> widget_test_client_;
   std::unique_ptr<AccessibilityController> accessibility_controller_;
   std::unique_ptr<EventSender> event_sender_;
   std::unique_ptr<TextInputController> text_input_controller_;
@@ -153,12 +165,37 @@
   // WebWidgetClient implementation.
   blink::WebScreenInfo screenInfo() override {
     blink::WebScreenInfo info = Base::screenInfo();
-    WebTestProxyBase::GetScreenOrientationForTesting(info);
+    blink::WebScreenInfo test_info = widget_test_client()->screenInfo();
+    if (test_info.orientationType != blink::WebScreenOrientationUndefined) {
+      info.orientationType = test_info.orientationType;
+      info.orientationAngle = test_info.orientationAngle;
+    }
     return info;
   }
+  void scheduleAnimation() override {
+    widget_test_client()->scheduleAnimation();
+  }
+  bool requestPointerLock() override {
+    return widget_test_client()->requestPointerLock();
+  }
+  void requestPointerUnlock() override {
+    widget_test_client()->requestPointerUnlock();
+  }
+  bool isPointerLocked() override {
+    return widget_test_client()->isPointerLocked();
+  }
+  void didFocus() override {
+    widget_test_client()->didFocus();
+    Base::didFocus();
+  }
+  void setToolTipText(const blink::WebString& text,
+                      blink::WebTextDirection hint) override {
+    widget_test_client()->setToolTipText(text, hint);
+    Base::setToolTipText(text, hint);
+  }
+  void resetInputMethod() override { widget_test_client()->resetInputMethod(); }
 
   // WebViewClient implementation.
-  void scheduleAnimation() override { view_test_client()->scheduleAnimation(); }
   void startDragging(blink::WebLocalFrame* frame,
                      const blink::WebDragData& data,
                      blink::WebDragOperationsMask mask,
@@ -194,25 +231,6 @@
   blink::WebSpeechRecognizer* speechRecognizer() override {
     return view_test_client()->speechRecognizer();
   }
-  bool requestPointerLock() override {
-    return view_test_client()->requestPointerLock();
-  }
-  void requestPointerUnlock() override {
-    view_test_client()->requestPointerUnlock();
-  }
-  bool isPointerLocked() override {
-    return view_test_client()->isPointerLocked();
-  }
-  void didFocus() override {
-    view_test_client()->didFocus();
-    Base::didFocus();
-  }
-  void setToolTipText(const blink::WebString& text,
-                      blink::WebTextDirection hint) override {
-    view_test_client()->setToolTipText(text, hint);
-    Base::setToolTipText(text, hint);
-  }
-  void resetInputMethod() override { view_test_client()->resetInputMethod(); }
   bool runFileChooser(const blink::WebFileChooserParams& params,
                       blink::WebFileChooserCompletion* completion) override {
     return view_test_client()->runFileChooser(params, completion);
diff --git a/components/test_runner/web_view_test_client.cc b/components/test_runner/web_view_test_client.cc
index 529e08d..b52af0b 100644
--- a/components/test_runner/web_view_test_client.cc
+++ b/components/test_runner/web_view_test_client.cc
@@ -14,6 +14,7 @@
 #include "components/test_runner/mock_web_speech_recognizer.h"
 #include "components/test_runner/test_common.h"
 #include "components/test_runner/test_runner.h"
+#include "components/test_runner/test_runner_for_specific_view.h"
 #include "components/test_runner/web_task.h"
 #include "components/test_runner/web_test_delegate.h"
 #include "components/test_runner/web_test_proxy.h"
@@ -30,46 +31,13 @@
 WebViewTestClient::WebViewTestClient(TestRunner* test_runner,
                                      WebTestProxyBase* web_test_proxy_base)
     : test_runner_(test_runner),
-      web_test_proxy_base_(web_test_proxy_base),
-      animation_scheduled_(false),
-      weak_factory_(this) {
+      web_test_proxy_base_(web_test_proxy_base) {
   DCHECK(test_runner);
   DCHECK(web_test_proxy_base);
 }
 
 WebViewTestClient::~WebViewTestClient() {}
 
-void WebViewTestClient::scheduleAnimation() {
-  if (!test_runner_->TestIsRunning())
-    return;
-
-  if (!animation_scheduled_) {
-    animation_scheduled_ = true;
-    test_runner_->OnAnimationScheduled(web_test_proxy_base_->web_view());
-
-    delegate()->PostDelayedTask(
-        new WebCallbackTask(base::Bind(&WebViewTestClient::AnimateNow,
-                                       weak_factory_.GetWeakPtr())),
-        1);
-  }
-}
-
-void WebViewTestClient::AnimateNow() {
-  if (animation_scheduled_) {
-    blink::WebWidget* web_widget = web_test_proxy_base_->web_widget();
-    animation_scheduled_ = false;
-    test_runner_->OnAnimationBegun(web_test_proxy_base_->web_view());
-
-    base::TimeDelta animate_time = base::TimeTicks::Now() - base::TimeTicks();
-    web_widget->beginFrame(animate_time.InSecondsF());
-    web_widget->updateAllLifecyclePhases();
-    if (blink::WebPagePopup* popup = web_widget->pagePopup()) {
-      popup->beginFrame(animate_time.InSecondsF());
-      popup->updateAllLifecyclePhases();
-    }
-  }
-}
-
 void WebViewTestClient::startDragging(blink::WebLocalFrame* frame,
                                       const blink::WebDragData& data,
                                       blink::WebDragOperationsMask mask,
@@ -178,34 +146,6 @@
   return test_runner_->getMockWebSpeechRecognizer();
 }
 
-bool WebViewTestClient::requestPointerLock() {
-  return web_test_proxy_base_->view_test_runner()->RequestPointerLock();
-}
-
-void WebViewTestClient::requestPointerUnlock() {
-  web_test_proxy_base_->view_test_runner()->RequestPointerUnlock();
-}
-
-bool WebViewTestClient::isPointerLocked() {
-  return web_test_proxy_base_->view_test_runner()->isPointerLocked();
-}
-
-void WebViewTestClient::didFocus() {
-  test_runner_->SetFocus(web_test_proxy_base_->web_view(), true);
-}
-
-void WebViewTestClient::setToolTipText(const blink::WebString& text,
-                                       blink::WebTextDirection direction) {
-  test_runner_->setToolTipText(text);
-}
-
-void WebViewTestClient::resetInputMethod() {
-  // If a composition text exists, then we need to let the browser process
-  // to cancel the input method's ongoing composition session.
-  if (web_test_proxy_base_)
-    web_test_proxy_base_->web_widget()->confirmComposition();
-}
-
 blink::WebString WebViewTestClient::acceptLanguages() {
   return blink::WebString::fromUTF8(test_runner_->GetAcceptLanguages());
 }
diff --git a/components/test_runner/web_view_test_client.h b/components/test_runner/web_view_test_client.h
index dabc322..1a772a6 100644
--- a/components/test_runner/web_view_test_client.h
+++ b/components/test_runner/web_view_test_client.h
@@ -6,7 +6,6 @@
 #define COMPONENTS_TEST_RUNNER_WEB_VIEW_TEST_CLIENT_H_
 
 #include "base/macros.h"
-#include "base/memory/weak_ptr.h"
 #include "third_party/WebKit/public/web/WebViewClient.h"
 
 namespace blink {
@@ -41,7 +40,6 @@
                              blink::WebTextDirection sub_message_hint) override;
   bool runFileChooser(const blink::WebFileChooserParams& params,
                       blink::WebFileChooserCompletion* completion) override;
-  void scheduleAnimation() override;
   void startDragging(blink::WebLocalFrame* frame,
                      const blink::WebDragData& data,
                      blink::WebDragOperationsMask mask,
@@ -57,27 +55,15 @@
   void setStatusText(const blink::WebString& text) override;
   void printPage(blink::WebLocalFrame* frame) override;
   blink::WebSpeechRecognizer* speechRecognizer() override;
-  bool requestPointerLock() override;
-  void requestPointerUnlock() override;
-  bool isPointerLocked() override;
-  void didFocus() override;
-  void setToolTipText(const blink::WebString& text,
-                      blink::WebTextDirection direction) override;
-  void resetInputMethod() override;
   blink::WebString acceptLanguages() override;
 
  private:
-  void AnimateNow();
   WebTestDelegate* delegate();
 
   // Borrowed pointers to other parts of Layout Tests state.
   TestRunner* test_runner_;
   WebTestProxyBase* web_test_proxy_base_;
 
-  bool animation_scheduled_;
-
-  base::WeakPtrFactory<WebViewTestClient> weak_factory_;
-
   DISALLOW_COPY_AND_ASSIGN(WebViewTestClient);
 };
 
diff --git a/components/test_runner/web_widget_test_client.cc b/components/test_runner/web_widget_test_client.cc
new file mode 100644
index 0000000..76291d1
--- /dev/null
+++ b/components/test_runner/web_widget_test_client.cc
@@ -0,0 +1,112 @@
+// Copyright 2016 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 "components/test_runner/web_widget_test_client.h"
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/logging.h"
+#include "base/time/time.h"
+#include "components/test_runner/mock_screen_orientation_client.h"
+#include "components/test_runner/test_interfaces.h"
+#include "components/test_runner/test_runner.h"
+#include "components/test_runner/test_runner_for_specific_view.h"
+#include "components/test_runner/web_task.h"
+#include "components/test_runner/web_test_delegate.h"
+#include "components/test_runner/web_test_proxy.h"
+#include "third_party/WebKit/public/platform/WebScreenInfo.h"
+#include "third_party/WebKit/public/web/WebPagePopup.h"
+#include "third_party/WebKit/public/web/WebWidget.h"
+
+namespace test_runner {
+
+WebWidgetTestClient::WebWidgetTestClient(TestRunner* test_runner,
+                                         WebTestProxyBase* web_test_proxy_base)
+    : test_runner_(test_runner),
+      web_test_proxy_base_(web_test_proxy_base),
+      animation_scheduled_(false),
+      weak_factory_(this) {
+  DCHECK(test_runner);
+  DCHECK(web_test_proxy_base);
+}
+
+WebWidgetTestClient::~WebWidgetTestClient() {}
+
+void WebWidgetTestClient::scheduleAnimation() {
+  if (!test_runner_->TestIsRunning())
+    return;
+
+  if (!animation_scheduled_) {
+    animation_scheduled_ = true;
+    test_runner_->OnAnimationScheduled(web_test_proxy_base_->web_widget());
+
+    web_test_proxy_base_->delegate()->PostDelayedTask(
+        new WebCallbackTask(base::Bind(&WebWidgetTestClient::AnimateNow,
+                                       weak_factory_.GetWeakPtr())),
+        1);
+  }
+}
+
+void WebWidgetTestClient::AnimateNow() {
+  if (animation_scheduled_) {
+    blink::WebWidget* web_widget = web_test_proxy_base_->web_widget();
+    animation_scheduled_ = false;
+    test_runner_->OnAnimationBegun(web_widget);
+
+    base::TimeDelta animate_time = base::TimeTicks::Now() - base::TimeTicks();
+    web_widget->beginFrame(animate_time.InSecondsF());
+    web_widget->updateAllLifecyclePhases();
+    if (blink::WebPagePopup* popup = web_widget->pagePopup()) {
+      popup->beginFrame(animate_time.InSecondsF());
+      popup->updateAllLifecyclePhases();
+    }
+  }
+}
+
+blink::WebScreenInfo WebWidgetTestClient::screenInfo() {
+  blink::WebScreenInfo screen_info;
+  MockScreenOrientationClient* mock_client =
+      web_test_proxy_base_->test_interfaces()
+          ->GetTestRunner()
+          ->getMockScreenOrientationClient();
+  if (mock_client->IsDisabled()) {
+    // Indicate to WebTestProxy that there is no test/mock info.
+    screen_info.orientationType = blink::WebScreenOrientationUndefined;
+  } else {
+    // Override screen orientation information with mock data.
+    screen_info.orientationType = mock_client->CurrentOrientationType();
+    screen_info.orientationAngle = mock_client->CurrentOrientationAngle();
+  }
+  return screen_info;
+}
+
+bool WebWidgetTestClient::requestPointerLock() {
+  return web_test_proxy_base_->view_test_runner()->RequestPointerLock();
+}
+
+void WebWidgetTestClient::requestPointerUnlock() {
+  web_test_proxy_base_->view_test_runner()->RequestPointerUnlock();
+}
+
+bool WebWidgetTestClient::isPointerLocked() {
+  return web_test_proxy_base_->view_test_runner()->isPointerLocked();
+}
+
+void WebWidgetTestClient::didFocus() {
+  test_runner_->SetFocus(web_test_proxy_base_->web_view(), true);
+}
+
+void WebWidgetTestClient::setToolTipText(const blink::WebString& text,
+                                         blink::WebTextDirection direction) {
+  test_runner_->setToolTipText(text);
+}
+
+void WebWidgetTestClient::resetInputMethod() {
+  // If a composition text exists, then we need to let the browser process
+  // to cancel the input method's ongoing composition session.
+  if (web_test_proxy_base_)
+    web_test_proxy_base_->web_widget()->confirmComposition();
+}
+
+}  // namespace test_runner
diff --git a/components/test_runner/web_widget_test_client.h b/components/test_runner/web_widget_test_client.h
new file mode 100644
index 0000000..8c73439b
--- /dev/null
+++ b/components/test_runner/web_widget_test_client.h
@@ -0,0 +1,62 @@
+// Copyright 2016 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 COMPONENTS_TEST_RUNNER_WEB_WIDGET_TEST_CLIENT_H_
+#define COMPONENTS_TEST_RUNNER_WEB_WIDGET_TEST_CLIENT_H_
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "third_party/WebKit/public/web/WebWidgetClient.h"
+
+namespace blink {
+class WebWidget;
+}  // namespace blink
+
+namespace test_runner {
+
+class TestRunner;
+class WebTestDelegate;
+class WebTestProxyBase;
+
+// WebWidgetTestClient implements WebWidgetClient interface, providing behavior
+// expected by tests.  WebWidgetTestClient ends up used by WebTestProxy which
+// coordinates forwarding WebWidgetClient calls either to WebWidgetTestClient or
+// to the product code (i.e. currently to RenderViewImpl).
+class WebWidgetTestClient : public blink::WebWidgetClient {
+ public:
+  // Caller has to ensure that all arguments (i.e. |test_runner| and |delegate|)
+  // live longer than |this|.
+  WebWidgetTestClient(TestRunner* test_runner,
+                      WebTestProxyBase* web_test_proxy_base);
+
+  virtual ~WebWidgetTestClient();
+
+  // WebWidgetClient overrides needed by WebTestProxy.
+  blink::WebScreenInfo screenInfo() override;
+  void scheduleAnimation() override;
+  bool requestPointerLock() override;
+  void requestPointerUnlock() override;
+  bool isPointerLocked() override;
+  void didFocus() override;
+  void setToolTipText(const blink::WebString& text,
+                      blink::WebTextDirection direction) override;
+  void resetInputMethod() override;
+
+ private:
+  void AnimateNow();
+
+  // Borrowed pointers to other parts of Layout Tests state.
+  TestRunner* test_runner_;
+  WebTestProxyBase* web_test_proxy_base_;
+
+  bool animation_scheduled_;
+
+  base::WeakPtrFactory<WebWidgetTestClient> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(WebWidgetTestClient);
+};
+
+}  // namespace test_runner
+
+#endif  // COMPONENTS_TEST_RUNNER_WEB_WIDGET_TEST_CLIENT_H_
diff --git a/components/translate/core/language_detection/language_detection_util.cc b/components/translate/core/language_detection/language_detection_util.cc
index 7d34c913..56289a46 100644
--- a/components/translate/core/language_detection/language_detection_util.cc
+++ b/components/translate/core/language_detection/language_detection_util.cc
@@ -98,28 +98,29 @@
   CLD2::CLDHints cldhints = {code.c_str(), tld_hint, encoding_hint,
                              language_hint};
 
-  cld_language = CLD2::ExtDetectLanguageSummaryCheckUTF8(
+  CLD2::ExtDetectLanguageSummaryCheckUTF8(
       raw_utf8_bytes, num_utf8_bytes, is_plain_text, &cldhints, flags,
       language3, percent3, normalized_score3,
       nullptr /* No ResultChunkVector used */, &text_bytes, &is_reliable,
       &num_bytes_evaluated);
 
   if (num_bytes_evaluated < num_utf8_bytes &&
-      cld_language == CLD2::UNKNOWN_LANGUAGE) {
+      language3[0] == CLD2::UNKNOWN_LANGUAGE) {
     // Invalid UTF8 encountered, see bug http://crbug.com/444258.
     // Retry using only the valid characters. This time the check for valid
     // UTF8 can be skipped since the precise number of valid bytes is known.
-    cld_language = CLD2::ExtDetectLanguageSummary(
+    CLD2::ExtDetectLanguageSummary(
         raw_utf8_bytes, num_utf8_bytes, is_plain_text, &cldhints, flags,
         language3, percent3, normalized_score3,
         nullptr /* No ResultChunkVector used */, &text_bytes, &is_reliable);
   }
+  // Choose top language.
+  cld_language = language3[0];
+
   is_valid_language = cld_language != CLD2::NUM_LANGUAGES &&
                       cld_language != CLD2::UNKNOWN_LANGUAGE &&
                       cld_language != CLD2::TG_UNKNOWN_LANGUAGE;
 
-  // Choose top language.
-  cld_language = language3[0];
   UMA_HISTOGRAM_ENUMERATION("Translate.CLD2.LanguageDetected",
                             cld_language, CLD2::NUM_LANGUAGES);
   if (is_valid_language)
diff --git a/components/url_formatter/url_fixer.cc b/components/url_formatter/url_fixer.cc
index e227d78..53abe4e 100644
--- a/components/url_formatter/url_fixer.cc
+++ b/components/url_formatter/url_fixer.cc
@@ -422,12 +422,18 @@
   std::string scheme;
   if (!GetValidScheme(*text, &parts->scheme, &scheme)) {
     // Try again if there is a ';' in the text. If changing it to a ':' results
-    // in a scheme being found, continue processing with the modified text.
+    // in a standard scheme, "about", "chrome" or "file" scheme being found,
+    // continue processing with the modified text.
     bool found_scheme = false;
     size_t semicolon = text->find(';');
     if (semicolon != 0 && semicolon != std::string::npos) {
       (*text)[semicolon] = ':';
-      if (GetValidScheme(*text, &parts->scheme, &scheme))
+      if (GetValidScheme(*text, &parts->scheme, &scheme) &&
+          (url::IsStandard(
+               scheme.c_str(),
+               url::Component(0, static_cast<int>(scheme.length()))) ||
+           scheme == url::kAboutScheme || scheme == kChromeUIScheme ||
+           scheme == url::kFileScheme))
         found_scheme = true;
       else
         (*text)[semicolon] = ';';
diff --git a/components/url_formatter/url_fixer_unittest.cc b/components/url_formatter/url_fixer_unittest.cc
index 01b1c3c..a425489 100644
--- a/components/url_formatter/url_fixer_unittest.cc
+++ b/components/url_formatter/url_fixer_unittest.cc
@@ -302,8 +302,8 @@
   // Semicolon as scheme separator for standard schemes.
   {"http;//www.google.com/", "http://www.google.com/"},
   {"about;chrome", "chrome://chrome/"},
-  // Semicolon left as-is for non-standard schemes.
-  {"whatsup;//fool", "whatsup://fool"},
+  // Semicolon in non-standard schemes is not replaced by colon.
+  {"whatsup;//fool", "http://whatsup%3B//fool"},
   // Semicolon left as-is in URL itself.
   {"http://host/port?query;moar", "http://host/port?query;moar"},
   // Fewer slashes than expected.
diff --git a/components/web_restrictions/browser/junit/src/org/chromium/components/webrestrictions/WebRestrictionsClientTest.java b/components/web_restrictions/browser/junit/src/org/chromium/components/webrestrictions/WebRestrictionsClientTest.java
index 662fbf40..0fd8756 100644
--- a/components/web_restrictions/browser/junit/src/org/chromium/components/webrestrictions/WebRestrictionsClientTest.java
+++ b/components/web_restrictions/browser/junit/src/org/chromium/components/webrestrictions/WebRestrictionsClientTest.java
@@ -41,7 +41,7 @@
 
     @Before
     public void setUp() {
-        ContextUtils.initApplicationContextForJUnitTests(Robolectric.application);
+        ContextUtils.initApplicationContextForTests(Robolectric.application);
         mTestClient = Mockito.spy(new WebRestrictionsClient());
         Mockito.doNothing().when(mTestClient).nativeNotifyWebRestrictionsChanged(anyLong());
         mProvider = Mockito.mock(ContentProvider.class);
diff --git a/content/app/content_main_runner.cc b/content/app/content_main_runner.cc
index abe4f130..e0812ef 100644
--- a/content/app/content_main_runner.cc
+++ b/content/app/content_main_runner.cc
@@ -15,15 +15,18 @@
 #include "base/allocator/allocator_check.h"
 #include "base/allocator/allocator_extension.h"
 #include "base/at_exit.h"
+#include "base/base_switches.h"
 #include "base/command_line.h"
 #include "base/debug/debugger.h"
 #include "base/debug/stack_trace.h"
+#include "base/feature_list.h"
 #include "base/files/file_path.h"
 #include "base/i18n/icu_util.h"
 #include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/memory/scoped_vector.h"
+#include "base/metrics/field_trial.h"
 #include "base/metrics/histogram_base.h"
 #include "base/metrics/statistics_recorder.h"
 #include "base/path_service.h"
@@ -125,6 +128,42 @@
 
 namespace content {
 
+namespace {
+
+// This sets up two singletons responsible for managing field trials. The
+// |field_trial_list| singleton lives on the stack and must outlive the Run()
+// method of the process.
+void InitializeFieldTrialAndFeatureList(
+    std::unique_ptr<base::FieldTrialList>* field_trial_list) {
+  const base::CommandLine& command_line =
+      *base::CommandLine::ForCurrentProcess();
+  std::string process_type =
+      command_line.GetSwitchValueASCII(switches::kProcessType);
+
+  // Initialize statistical testing infrastructure.  We set the entropy
+  // provider to nullptr to disallow non-browser processes from creating
+  // their own one-time randomized trials; they should be created in the
+  // browser process.
+  field_trial_list->reset(new base::FieldTrialList(nullptr));
+
+  // Ensure any field trials in browser are reflected into the child
+  // process.
+  if (command_line.HasSwitch(switches::kForceFieldTrials)) {
+    bool result = base::FieldTrialList::CreateTrialsFromString(
+        command_line.GetSwitchValueASCII(switches::kForceFieldTrials),
+        std::set<std::string>());
+    DCHECK(result);
+  }
+
+  std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
+  feature_list->InitializeFromCommandLine(
+      command_line.GetSwitchValueASCII(switches::kEnableFeatures),
+      command_line.GetSwitchValueASCII(switches::kDisableFeatures));
+  base::FeatureList::SetInstance(std::move(feature_list));
+}
+
+}  // namespace
+
 #if !defined(CHROME_MULTIPLE_DLL_CHILD)
 base::LazyInstance<ContentBrowserClient>
     g_empty_content_browser_client = LAZY_INSTANCE_INITIALIZER;
@@ -301,6 +340,9 @@
   MainFunctionParams main_params(command_line);
   main_params.zygote_child = true;
 
+  std::unique_ptr<base::FieldTrialList> field_trial_list;
+  InitializeFieldTrialAndFeatureList(&field_trial_list);
+
   for (size_t i = 0; i < arraysize(kMainFunctions); ++i) {
     if (process_type == kMainFunctions[i].name)
       return kMainFunctions[i].function(main_params);
@@ -729,6 +771,12 @@
     std::string process_type =
         command_line.GetSwitchValueASCII(switches::kProcessType);
 
+    // Run this logic on all child processes. Zygotes will run this at a later
+    // point in time when the command line has been updated.
+    std::unique_ptr<base::FieldTrialList> field_trial_list;
+    if (!process_type.empty() && process_type != switches::kZygoteProcess)
+      InitializeFieldTrialAndFeatureList(&field_trial_list);
+
     base::HistogramBase::EnableActivityReportHistogram(process_type);
 
     MainFunctionParams main_params(command_line);
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index b798d044..b2709f8 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -86,6 +86,11 @@
     "//sql",
     "//storage/browser",
     "//storage/common",
+
+    # TODO(brettw) bug 582206: Blink should not be used in the browser
+    # process. This is required by devtools' input_handler.cc which calls
+    # WebKeyboardEvent::setKeyIdentifierFromWindowsKeyCode
+    "//third_party/WebKit/public:blink",
     "//third_party/WebKit/public:blink_headers",
     "//third_party/WebKit/public:image_resources",
     "//third_party/WebKit/public:resources",
@@ -467,8 +472,6 @@
 
     if (!use_ozone) {
       sources -= [
-        "compositor/browser_compositor_overlay_candidate_validator_ozone.cc",
-        "compositor/browser_compositor_overlay_candidate_validator_ozone.h",
         "compositor/software_output_device_ozone.cc",
         "compositor/software_output_device_ozone.h",
       ]
diff --git a/content/browser/DEPS b/content/browser/DEPS
index 3b979f40..16537a9 100644
--- a/content/browser/DEPS
+++ b/content/browser/DEPS
@@ -66,6 +66,7 @@
   "+third_party/WebKit/public/platform/WebScreenInfo.h",
   "+third_party/WebKit/public/platform/WebString.h",
   "+third_party/WebKit/public/platform/modules/geolocation/geolocation.mojom.h",
+  "+third_party/WebKit/public/platform/modules/imagecapture/image_capture.mojom.h",
   "+third_party/WebKit/public/platform/modules/indexeddb/WebIDBDatabaseException.h",
   "+third_party/WebKit/public/platform/modules/indexeddb/WebIDBTypes.h",
   "+third_party/WebKit/public/platform/modules/notifications/WebNotificationConstants.h",
diff --git a/content/browser/bad_message.h b/content/browser/bad_message.h
index cc9b1115..e96735a1 100644
--- a/content/browser/bad_message.h
+++ b/content/browser/bad_message.h
@@ -143,6 +143,7 @@
   IDBDH_INVALID_ORIGIN = 119,
   RFH_FAIL_PROVISIONAL_LOAD_NO_HANDLE = 120,
   RFH_FAIL_PROVISIONAL_LOAD_NO_ERROR = 121,
+  NI_IN_PAGE_NAVIGATION = 122,
 
   // Please add new elements here. The naming convention is abbreviated class
   // name (e.g. RenderFrameHost becomes RFH) plus a unique description of the
diff --git a/content/browser/bluetooth/bluetooth_dispatcher_host.cc b/content/browser/bluetooth/bluetooth_dispatcher_host.cc
index 209a351..07269b3 100644
--- a/content/browser/bluetooth/bluetooth_dispatcher_host.cc
+++ b/content/browser/bluetooth/bluetooth_dispatcher_host.cc
@@ -924,11 +924,6 @@
           device->GetInquiryTxPower()),  // tx_power
       content::BluetoothDevice::ValidatePower(
           device->GetInquiryRSSI()),  // rssi
-      device->GetBluetoothClass(),    // device_class
-      device->GetVendorIDSource(),    // vendor_id_source
-      device->GetVendorID(),          // vendor_id
-      device->GetProductID(),         // product_id
-      device->GetDeviceID(),          // product_version
       content::BluetoothDevice::UUIDsFromBluetoothUUIDs(
           filtered_uuids));  // uuids
   RecordRequestDeviceOutcome(UMARequestDeviceOutcome::SUCCESS);
diff --git a/content/browser/bluetooth/tools/BUILD.gn b/content/browser/bluetooth/tools/BUILD.gn
index 91c264a..4971caa 100644
--- a/content/browser/bluetooth/tools/BUILD.gn
+++ b/content/browser/bluetooth/tools/BUILD.gn
@@ -9,6 +9,7 @@
 
   deps = [
     "//base",
+    "//build/win:default_exe_manifest",
     "//device/bluetooth",
   ]
 }
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl.cc b/content/browser/bluetooth/web_bluetooth_service_impl.cc
index 081b1be..773420c 100644
--- a/content/browser/bluetooth/web_bluetooth_service_impl.cc
+++ b/content/browser/bluetooth/web_bluetooth_service_impl.cc
@@ -308,10 +308,8 @@
 
     blink::mojom::WebBluetoothRemoteGATTCharacteristicPtr characteristic_ptr =
         blink::mojom::WebBluetoothRemoteGATTCharacteristic::New();
-    characteristic_ptr->instance_id =
-        mojo::String::From(characteristic_instance_id);
-    characteristic_ptr->uuid =
-        mojo::String::From(characteristic->GetUUID().canonical_value());
+    characteristic_ptr->instance_id = characteristic_instance_id;
+    characteristic_ptr->uuid = characteristic->GetUUID().canonical_value();
     characteristic_ptr->properties =
         static_cast<uint32_t>(characteristic->GetProperties());
     response_characteristics.push_back(std::move(characteristic_ptr));
diff --git a/content/browser/browser_child_process_host_impl.cc b/content/browser/browser_child_process_host_impl.cc
index 4a2dd39a..061240a6 100644
--- a/content/browser/browser_child_process_host_impl.cc
+++ b/content/browser/browser_child_process_host_impl.cc
@@ -8,10 +8,12 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/debug/dump_without_crashing.h"
+#include "base/feature_list.h"
 #include "base/files/file_path.h"
 #include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/metrics/field_trial.h"
 #include "base/metrics/histogram.h"
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
@@ -176,6 +178,28 @@
   }
 }
 
+// static
+void BrowserChildProcessHostImpl::CopyFeatureAndFieldTrialFlags(
+    base::CommandLine* cmd_line) {
+  std::string enabled_features;
+  std::string disabled_features;
+  base::FeatureList::GetInstance()->GetFeatureOverrides(&enabled_features,
+                                                        &disabled_features);
+  if (!enabled_features.empty())
+    cmd_line->AppendSwitchASCII(switches::kEnableFeatures, enabled_features);
+  if (!disabled_features.empty())
+    cmd_line->AppendSwitchASCII(switches::kDisableFeatures, disabled_features);
+
+  // If we run base::FieldTrials, we want to pass to their state to the
+  // child process so that it can act in accordance with each state.
+  std::string field_trial_states;
+  base::FieldTrialList::AllStatesToString(&field_trial_states);
+  if (!field_trial_states.empty()) {
+    cmd_line->AppendSwitchASCII(switches::kForceFieldTrials,
+                                field_trial_states);
+  }
+}
+
 void BrowserChildProcessHostImpl::Launch(
     SandboxedProcessLauncherDelegate* delegate,
     base::CommandLine* cmd_line,
@@ -395,8 +419,8 @@
   return child_process_host_->Send(message);
 }
 
-void BrowserChildProcessHostImpl::OnProcessLaunchFailed() {
-  delegate_->OnProcessLaunchFailed();
+void BrowserChildProcessHostImpl::OnProcessLaunchFailed(int error_code) {
+  delegate_->OnProcessLaunchFailed(error_code);
   notify_child_disconnected_ = false;
   delete delegate_;  // Will delete us
 }
diff --git a/content/browser/browser_child_process_host_impl.h b/content/browser/browser_child_process_host_impl.h
index 3a798c2..e2581cc 100644
--- a/content/browser/browser_child_process_host_impl.h
+++ b/content/browser/browser_child_process_host_impl.h
@@ -54,6 +54,11 @@
   // instance.
   static void TerminateAll();
 
+  // Copies kEnableFeatures and kDisableFeatures to the command line. Generates
+  // them from the FeatureList override state, to take into account overrides
+  // from FieldTrials.
+  static void CopyFeatureAndFieldTrialFlags(base::CommandLine* cmd_line);
+
   // BrowserChildProcessHost implementation:
   bool Send(IPC::Message* message) override;
   void Launch(SandboxedProcessLauncherDelegate* delegate,
@@ -105,7 +110,7 @@
 
   // ChildProcessLauncher::Client implementation.
   void OnProcessLaunched() override;
-  void OnProcessLaunchFailed() override;
+  void OnProcessLaunchFailed(int error_code) override;
 
   // Returns true if the process has successfully launched. Must only be called
   // on the IO thread.
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index 794d54a..ee37ebd 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -401,6 +401,10 @@
 // The currently-running BrowserMainLoop.  There can be one or zero.
 BrowserMainLoop* g_current_browser_main_loop = NULL;
 
+#if defined(OS_ANDROID)
+bool g_browser_main_loop_shutting_down = false;
+#endif
+
 // For measuring memory usage after each task. Behind a command line flag.
 class BrowserMainLoop::MemoryObserver : public base::MessageLoop::TaskObserver {
  public:
@@ -988,6 +992,10 @@
       base::Bind(base::IgnoreResult(&base::ThreadRestrictions::SetIOAllowed),
                  true));
 
+#if defined(OS_ANDROID)
+  g_browser_main_loop_shutting_down = true;
+#endif
+
   if (RenderProcessHost::run_renderer_in_process())
     RenderProcessHostImpl::ShutDownInProcessRenderer();
 
diff --git a/content/browser/child_process_launcher.cc b/content/browser/child_process_launcher.cc
index e67e107e..6b88b04 100644
--- a/content/browser/child_process_launcher.cc
+++ b/content/browser/child_process_launcher.cc
@@ -33,6 +33,7 @@
 #include "base/win/win_util.h"
 #include "content/common/sandbox_win.h"
 #include "content/public/common/sandbox_init.h"
+#include "sandbox/win/src/sandbox_types.h"
 #elif defined(OS_MACOSX)
 #include "content/browser/bootstrap_sandbox_manager_mac.h"
 #include "content/browser/mach_broker_mac.h"
@@ -65,7 +66,8 @@
                             base::ScopedFD,
                             base::ScopedFD,
 #endif
-                            base::Process)> NotifyCallback;
+                            base::Process,
+                            int)> NotifyCallback;
 
 void RecordHistogramsOnLauncherThread(base::TimeDelta launch_time) {
   DCHECK_CURRENTLY_ON(BrowserThread::PROCESS_LAUNCHER);
@@ -89,15 +91,18 @@
                                   base::ScopedFD ipcfd,
                                   base::ScopedFD mojo_fd,
                                   base::ProcessHandle handle) {
+  int launch_result = (handle == base::kNullProcessHandle)
+                          ? LAUNCH_RESULT_FAILURE
+                          : LAUNCH_RESULT_SUCCESS;
   // This can be called on the launcher thread or UI thread.
   base::TimeDelta launch_time = base::TimeTicks::Now() - begin_launch_time;
   BrowserThread::PostTask(
       BrowserThread::PROCESS_LAUNCHER, FROM_HERE,
       base::Bind(&RecordHistogramsOnLauncherThread, launch_time));
 
-  base::Closure callback_on_client_thread(
-      base::Bind(callback, nullptr, base::Passed(&ipcfd),
-                 base::Passed(&mojo_fd), base::Passed(base::Process(handle))));
+  base::Closure callback_on_client_thread(base::Bind(
+      callback, nullptr, base::Passed(&ipcfd), base::Passed(&mojo_fd),
+      base::Passed(base::Process(handle)), launch_result));
   if (BrowserThread::CurrentlyOn(client_thread_id)) {
     callback_on_client_thread.Run();
   } else {
@@ -120,6 +125,7 @@
   std::unique_ptr<SandboxedProcessLauncherDelegate> delegate_deleter(delegate);
 #if !defined(OS_ANDROID)
   ZygoteHandle zygote = nullptr;
+  int launch_result = LAUNCH_RESULT_FAILURE;
 #endif
 #if defined(OS_WIN)
   bool launch_elevated = delegate->ShouldLaunchElevated();
@@ -148,7 +154,8 @@
     cmd_line->AppendSwitchASCII(
         mojo::edk::PlatformChannelPair::kMojoPlatformChannelHandleSwitch,
         base::UintToString(base::win::HandleToUint32(handles[0])));
-    process = StartSandboxedProcess(delegate, cmd_line, handles);
+    launch_result =
+        StartSandboxedProcess(delegate, cmd_line, handles, &process);
   }
 #elif defined(OS_POSIX)
   std::string process_type =
@@ -335,11 +342,13 @@
 #endif  // else defined(OS_POSIX)
 #if !defined(OS_ANDROID)
   if (process.IsValid()) {
+    launch_result = LAUNCH_RESULT_SUCCESS;
     RecordHistogramsOnLauncherThread(base::TimeTicks::Now() -
                                      begin_launch_time);
   }
   BrowserThread::PostTask(client_thread_id, FROM_HERE,
-                          base::Bind(callback, zygote, base::Passed(&process)));
+                          base::Bind(callback, zygote, base::Passed(&process),
+                                     launch_result));
 #endif  // !defined(OS_ANDROID)
 }
 
@@ -500,7 +509,8 @@
     base::ScopedFD ipcfd,
     base::ScopedFD mojo_fd,
 #endif
-    base::Process process) {
+    base::Process process,
+    int error_code) {
   if (!process.IsValid())
     LOG(ERROR) << "Failed to launch child process";
 
@@ -509,7 +519,8 @@
 #if defined(OS_ANDROID)
                      std::move(ipcfd),
 #endif
-                     std::move(process));
+                     std::move(process),
+                     error_code);
   } else {
     if (process.IsValid() && terminate_on_shutdown) {
       // On Posix, EnsureProcessTerminated can lead to 2 seconds of sleep!  So
@@ -525,7 +536,8 @@
 #if defined(OS_ANDROID)
                                   base::ScopedFD ipcfd,
 #endif
-                                  base::Process process) {
+                                  base::Process process,
+                                  int error_code) {
   DCHECK(CalledOnValidThread());
   starting_ = false;
   process_ = std::move(process);
@@ -543,7 +555,7 @@
     client_->OnProcessLaunched();
   } else {
     termination_status_ = base::TERMINATION_STATUS_LAUNCH_FAILED;
-    client_->OnProcessLaunchFailed();
+    client_->OnProcessLaunchFailed(error_code);
   }
 }
 
diff --git a/content/browser/child_process_launcher.h b/content/browser/child_process_launcher.h
index 7102477..d5efc1e4 100644
--- a/content/browser/child_process_launcher.h
+++ b/content/browser/child_process_launcher.h
@@ -18,12 +18,35 @@
 #include "content/public/common/sandboxed_process_launcher_delegate.h"
 #include "mojo/edk/embedder/platform_channel_pair.h"
 
+#if defined(OS_WIN)
+#include "sandbox/win/src/sandbox_types.h"
+#endif
+
 namespace base {
 class CommandLine;
 }
 
 namespace content {
 
+// Note: These codes are listed in a histogram and any new codes should be added
+// at the end.
+enum LaunchResultCode {
+  // Launch start code, to not overlap with sandbox::ResultCode.
+  LAUNCH_RESULT_START = 1001,
+  // Launch success.
+  LAUNCH_RESULT_SUCCESS,
+  // Generic launch failure.
+  LAUNCH_RESULT_FAILURE,
+  // Placeholder for last item of the enum.
+  LAUNCH_RESULT_CODE_LAST_CODE
+};
+
+#if defined(OS_WIN)
+static_assert(static_cast<int>(LAUNCH_RESULT_START) >
+                  static_cast<int>(sandbox::SBOX_ERROR_LAST),
+              "LaunchResultCode must not overlap with sandbox::ResultCode");
+#endif
+
 // Launches a process asynchronously and notifies the client of the process
 // handle when it's available.  It's used to avoid blocking the calling thread
 // on the OS since often it can take > 100 ms to create the process.
@@ -35,7 +58,7 @@
     // constructed on.
     virtual void OnProcessLaunched() = 0;
 
-    virtual void OnProcessLaunchFailed() {};
+    virtual void OnProcessLaunchFailed(int error_code) {};
 
    protected:
     virtual ~Client() {}
@@ -101,14 +124,16 @@
                         base::ScopedFD ipcfd,
                         base::ScopedFD mojo_fd,
 #endif
-                        base::Process process);
+                        base::Process process,
+                        int error_code);
 
   // Notifies the client about the result of the operation.
   void Notify(ZygoteHandle zygote,
 #if defined(OS_ANDROID)
               base::ScopedFD ipcfd,
 #endif
-              base::Process process);
+              base::Process process,
+              int error_code);
 
 #if defined(MOJO_SHELL_CLIENT)
   // When this process is run from an external Mojo shell, this function will
diff --git a/content/browser/child_process_launcher_browsertest.cc b/content/browser/child_process_launcher_browsertest.cc
index 9ef655c6..f48279b7 100644
--- a/content/browser/child_process_launcher_browsertest.cc
+++ b/content/browser/child_process_launcher_browsertest.cc
@@ -23,11 +23,14 @@
 
   void OnProcessLaunched() override {
     if (simulate_failure_)
-      client_->OnProcessLaunchFailed();
+      client_->OnProcessLaunchFailed(content::LAUNCH_RESULT_FAILURE);
     else
       client_->OnProcessLaunched();
   };
-  void OnProcessLaunchFailed() override { client_->OnProcessLaunchFailed(); };
+
+  void OnProcessLaunchFailed(int error_code) override {
+    client_->OnProcessLaunchFailed(error_code);
+  };
 
   content::ChildProcessLauncher::Client* client_;
   bool simulate_failure_;
diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc
index 34bad5ad..ed946fd3 100644
--- a/content/browser/child_process_security_policy_impl.cc
+++ b/content/browser/child_process_security_policy_impl.cc
@@ -10,6 +10,7 @@
 #include "base/files/file_path.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram.h"
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
@@ -237,6 +238,9 @@
     return origin_lock_ == site_gurl;
   }
 
+  // TODO(nick): Remove this once we understand http://crbug.com/600441
+  GURL GetOriginLock() { return origin_lock_; }
+
   void LockToOrigin(const GURL& gurl) {
     origin_lock_ = gurl;
   }
@@ -822,6 +826,18 @@
   return state->second->CanAccessDataForOrigin(gurl);
 }
 
+// TODO(nick): Remove this once we understand http://crbug.com/600441
+std::unique_ptr<base::debug::ScopedCrashKey>
+ChildProcessSecurityPolicyImpl::GetOriginLockCrashKey(int child_id) {
+  base::AutoLock lock(lock_);
+  SecurityStateMap::iterator state = security_state_.find(child_id);
+  return base::WrapUnique(new base::debug::ScopedCrashKey(
+      "security_policy_origin_lock",
+      state == security_state_.end()
+          ? "not-found"
+          : state->second->GetOriginLock().possibly_invalid_spec()));
+}
+
 void ChildProcessSecurityPolicyImpl::LockToOrigin(int child_id,
                                                   const GURL& gurl) {
   // "gurl" can be currently empty in some cases, such as file://blah.
diff --git a/content/browser/child_process_security_policy_impl.h b/content/browser/child_process_security_policy_impl.h
index 46d2d7a..025eb50 100644
--- a/content/browser/child_process_security_policy_impl.h
+++ b/content/browser/child_process_security_policy_impl.h
@@ -5,12 +5,13 @@
 #ifndef CONTENT_BROWSER_CHILD_PROCESS_SECURITY_POLICY_IMPL_H_
 #define CONTENT_BROWSER_CHILD_PROCESS_SECURITY_POLICY_IMPL_H_
 
-
 #include <map>
+#include <memory>
 #include <set>
 #include <string>
 
 #include "base/compiler_specific.h"
+#include "base/debug/crash_logging.h"
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/memory/singleton.h"
@@ -78,6 +79,10 @@
   void GrantSendMidiSysExMessage(int child_id) override;
   bool CanAccessDataForOrigin(int child_id, const GURL& url) override;
 
+  // TODO(nick): Remove this once we understand http://crbug.com/600441
+  std::unique_ptr<base::debug::ScopedCrashKey> GetOriginLockCrashKey(
+      int child_id);
+
   // Pseudo schemes are treated differently than other schemes because they
   // cannot be requested like normal URLs.  There is no mechanism for revoking
   // pseudo schemes.
diff --git a/content/browser/compositor/browser_compositor_output_surface.cc b/content/browser/compositor/browser_compositor_output_surface.cc
index 58c89d17..019249c 100644
--- a/content/browser/compositor/browser_compositor_output_surface.cc
+++ b/content/browser/compositor/browser_compositor_output_surface.cc
@@ -12,7 +12,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "cc/base/switches.h"
 #include "cc/output/output_surface_client.h"
-#include "content/browser/compositor/browser_compositor_overlay_candidate_validator.h"
+#include "components/display_compositor/compositor_overlay_candidate_validator.h"
 #include "content/browser/compositor/reflector_impl.h"
 #include "content/common/gpu/client/context_provider_command_buffer.h"
 
@@ -23,7 +23,7 @@
     const scoped_refptr<cc::ContextProvider>& worker_context_provider,
     const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
     base::SingleThreadTaskRunner* task_runner,
-    std::unique_ptr<BrowserCompositorOverlayCandidateValidator>
+    std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator>
         overlay_candidate_validator)
     : OutputSurface(context_provider, worker_context_provider),
       vsync_manager_(vsync_manager),
diff --git a/content/browser/compositor/browser_compositor_output_surface.h b/content/browser/compositor/browser_compositor_output_surface.h
index d64ca0d4..6f52832a 100644
--- a/content/browser/compositor/browser_compositor_output_surface.h
+++ b/content/browser/compositor/browser_compositor_output_surface.h
@@ -17,12 +17,15 @@
 class SoftwareOutputDevice;
 }
 
+namespace display_compositor {
+class CompositorOverlayCandidateValidator;
+}
+
 namespace gfx {
 enum class SwapResult;
 }
 
 namespace content {
-class BrowserCompositorOverlayCandidateValidator;
 class ContextProviderCommandBuffer;
 class ReflectorImpl;
 class WebGraphicsContext3DCommandBufferImpl;
@@ -70,7 +73,7 @@
       const scoped_refptr<cc::ContextProvider>& worker_context,
       const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
       base::SingleThreadTaskRunner* task_runner,
-      std::unique_ptr<BrowserCompositorOverlayCandidateValidator>
+      std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator>
           overlay_candidate_validator);
 
   // Constructor used by the software implementation.
@@ -98,7 +101,7 @@
   void UpdateVSyncParametersInternal(base::TimeTicks timebase,
                                      base::TimeDelta interval);
 
-  std::unique_ptr<BrowserCompositorOverlayCandidateValidator>
+  std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator>
       overlay_candidate_validator_;
 
   DISALLOW_COPY_AND_ASSIGN(BrowserCompositorOutputSurface);
diff --git a/content/browser/compositor/browser_compositor_overlay_candidate_validator.h b/content/browser/compositor/browser_compositor_overlay_candidate_validator.h
deleted file mode 100644
index 933e7bf..0000000
--- a/content/browser/compositor/browser_compositor_overlay_candidate_validator.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2015 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_COMPOSITOR_BROWSER_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_H_
-#define CONTENT_BROWSER_COMPOSITOR_BROWSER_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_H_
-
-#include "cc/output/overlay_candidate_validator.h"
-
-#include "base/macros.h"
-#include "content/common/content_export.h"
-
-namespace content {
-
-class CONTENT_EXPORT BrowserCompositorOverlayCandidateValidator
-    : public cc::OverlayCandidateValidator {
- public:
-  BrowserCompositorOverlayCandidateValidator() {}
-  ~BrowserCompositorOverlayCandidateValidator() override {}
-
-  virtual void SetSoftwareMirrorMode(bool enabled) = 0;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(BrowserCompositorOverlayCandidateValidator);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_COMPOSITOR_BROWSER_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_H_
diff --git a/content/browser/compositor/browser_compositor_overlay_candidate_validator_android.h b/content/browser/compositor/browser_compositor_overlay_candidate_validator_android.h
deleted file mode 100644
index 6cbb1a9..0000000
--- a/content/browser/compositor/browser_compositor_overlay_candidate_validator_android.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2015 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_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_ANDROID_H_
-#define CONTENT_BROWSER_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_ANDROID_H_
-
-#include "base/macros.h"
-#include "content/browser/compositor/browser_compositor_overlay_candidate_validator.h"
-#include "content/common/content_export.h"
-
-namespace content {
-
-// An overlay validator for supporting fullscreen video underlays on Android.
-// Things are a bit different on Android compared with other platforms. By the
-// time a video frame is marked as overlayable it means the video decoder was
-// outputting to a Surface that we can't read back from. As a result, the
-// overlay must always succeed, or the video won't be visible. This is one of of
-// the reasons that only fullscreen is supported: we have to be sure that
-// nothing will cause the overlay to be rejected, because there's no fallback to
-// gl compositing.
-class CONTENT_EXPORT BrowserCompositorOverlayCandidateValidatorAndroid
-    : public BrowserCompositorOverlayCandidateValidator {
- public:
-  BrowserCompositorOverlayCandidateValidatorAndroid();
-  ~BrowserCompositorOverlayCandidateValidatorAndroid() override;
-
-  void GetStrategies(cc::OverlayProcessor::StrategyList* strategies) override;
-  void CheckOverlaySupport(cc::OverlayCandidateList* surfaces) override;
-  bool AllowCALayerOverlays() override;
-
-  void SetSoftwareMirrorMode(bool enabled) override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(BrowserCompositorOverlayCandidateValidatorAndroid);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_ANDROID_H_
diff --git a/content/browser/compositor/browser_compositor_overlay_candidate_validator_mac.h b/content/browser/compositor/browser_compositor_overlay_candidate_validator_mac.h
deleted file mode 100644
index 3cb8c58..0000000
--- a/content/browser/compositor/browser_compositor_overlay_candidate_validator_mac.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2015 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_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_MAC_H_
-#define CONTENT_BROWSER_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_MAC_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "content/browser/compositor/browser_compositor_overlay_candidate_validator.h"
-#include "ui/gfx/native_widget_types.h"
-
-namespace content {
-
-class CONTENT_EXPORT BrowserCompositorOverlayCandidateValidatorMac
-    : public BrowserCompositorOverlayCandidateValidator {
- public:
-  explicit BrowserCompositorOverlayCandidateValidatorMac(
-      bool ca_layer_disabled);
-  ~BrowserCompositorOverlayCandidateValidatorMac() override;
-
-  // cc::OverlayCandidateValidator implementation.
-  void GetStrategies(cc::OverlayProcessor::StrategyList* strategies) override;
-  bool AllowCALayerOverlays() override;
-  void CheckOverlaySupport(cc::OverlayCandidateList* surfaces) override;
-
-  // BrowserCompositorOverlayCandidateValidator implementation.
-  void SetSoftwareMirrorMode(bool enabled) override;
-
- private:
-  gfx::AcceleratedWidget widget_;
-  bool software_mirror_active_;
-  const bool ca_layer_disabled_;
-
-  DISALLOW_COPY_AND_ASSIGN(BrowserCompositorOverlayCandidateValidatorMac);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_MAC_H_
diff --git a/content/browser/compositor/browser_compositor_overlay_candidate_validator_mac.mm b/content/browser/compositor/browser_compositor_overlay_candidate_validator_mac.mm
deleted file mode 100644
index c6822d9b..0000000
--- a/content/browser/compositor/browser_compositor_overlay_candidate_validator_mac.mm
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2015 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/compositor/browser_compositor_overlay_candidate_validator_mac.h"
-
-#include <stddef.h>
-
-namespace content {
-
-BrowserCompositorOverlayCandidateValidatorMac::
-    BrowserCompositorOverlayCandidateValidatorMac(bool ca_layer_disabled)
-    : software_mirror_active_(false), ca_layer_disabled_(ca_layer_disabled) {}
-
-BrowserCompositorOverlayCandidateValidatorMac::
-    ~BrowserCompositorOverlayCandidateValidatorMac() {
-}
-
-void BrowserCompositorOverlayCandidateValidatorMac::GetStrategies(
-    cc::OverlayProcessor::StrategyList* strategies) {
-}
-
-bool BrowserCompositorOverlayCandidateValidatorMac::AllowCALayerOverlays() {
-  return !ca_layer_disabled_ && !software_mirror_active_;
-}
-
-void BrowserCompositorOverlayCandidateValidatorMac::CheckOverlaySupport(
-    cc::OverlayCandidateList* surfaces) {
-}
-
-void BrowserCompositorOverlayCandidateValidatorMac::SetSoftwareMirrorMode(
-    bool enabled) {
-  software_mirror_active_ = enabled;
-}
-
-}  // namespace content
diff --git a/content/browser/compositor/browser_compositor_overlay_candidate_validator_ozone.h b/content/browser/compositor/browser_compositor_overlay_candidate_validator_ozone.h
deleted file mode 100644
index 4fe26c77..0000000
--- a/content/browser/compositor/browser_compositor_overlay_candidate_validator_ozone.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2014 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_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_OZONE_H_
-#define CONTENT_BROWSER_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_OZONE_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "content/browser/compositor/browser_compositor_overlay_candidate_validator.h"
-#include "ui/gfx/native_widget_types.h"
-
-namespace ui {
-class OverlayCandidatesOzone;
-}
-
-namespace content {
-
-class CONTENT_EXPORT BrowserCompositorOverlayCandidateValidatorOzone
-    : public BrowserCompositorOverlayCandidateValidator {
- public:
-  explicit BrowserCompositorOverlayCandidateValidatorOzone(
-      std::unique_ptr<ui::OverlayCandidatesOzone> overlay_candidates);
-  ~BrowserCompositorOverlayCandidateValidatorOzone() override;
-
-  // cc::OverlayCandidateValidator implementation.
-  void GetStrategies(cc::OverlayProcessor::StrategyList* strategies) override;
-  bool AllowCALayerOverlays() override;
-  void CheckOverlaySupport(cc::OverlayCandidateList* surfaces) override;
-
-  // BrowserCompositorOverlayCandidateValidator implementation.
-  void SetSoftwareMirrorMode(bool enabled) override;
-
- private:
-  std::unique_ptr<ui::OverlayCandidatesOzone> overlay_candidates_;
-  bool software_mirror_active_;
-
-  DISALLOW_COPY_AND_ASSIGN(BrowserCompositorOverlayCandidateValidatorOzone);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_OZONE_H_
diff --git a/content/browser/compositor/gpu_browser_compositor_output_surface.cc b/content/browser/compositor/gpu_browser_compositor_output_surface.cc
index d6b38ff..7226a7c 100644
--- a/content/browser/compositor/gpu_browser_compositor_output_surface.cc
+++ b/content/browser/compositor/gpu_browser_compositor_output_surface.cc
@@ -9,12 +9,13 @@
 #include "build/build_config.h"
 #include "cc/output/compositor_frame.h"
 #include "cc/output/output_surface_client.h"
-#include "content/browser/compositor/browser_compositor_overlay_candidate_validator.h"
+#include "components/display_compositor/compositor_overlay_candidate_validator.h"
 #include "content/browser/compositor/reflector_impl.h"
 #include "content/browser/compositor/reflector_texture.h"
 #include "content/browser/renderer_host/render_widget_host_impl.h"
 #include "content/common/gpu/client/context_provider_command_buffer.h"
 #include "gpu/command_buffer/client/context_support.h"
+#include "gpu/ipc/client/command_buffer_proxy_impl.h"
 
 namespace content {
 
@@ -23,7 +24,7 @@
     const scoped_refptr<ContextProviderCommandBuffer>& worker_context,
     const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
     base::SingleThreadTaskRunner* task_runner,
-    std::unique_ptr<BrowserCompositorOverlayCandidateValidator>
+    std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator>
         overlay_candidate_validator)
     : BrowserCompositorOutputSurface(context,
                                      worker_context,
diff --git a/content/browser/compositor/gpu_browser_compositor_output_surface.h b/content/browser/compositor/gpu_browser_compositor_output_surface.h
index f8c2a7d..1df4090 100644
--- a/content/browser/compositor/gpu_browser_compositor_output_surface.h
+++ b/content/browser/compositor/gpu_browser_compositor_output_surface.h
@@ -13,6 +13,10 @@
 #include "content/browser/compositor/browser_compositor_output_surface.h"
 #include "ui/gfx/swap_result.h"
 
+namespace display_compositor {
+class CompositorOverlayCandidateValidator;
+}
+
 namespace gpu {
 class CommandBufferProxyImpl;
 }
@@ -22,7 +26,6 @@
 }
 
 namespace content {
-class BrowserCompositorOverlayCandidateValidator;
 class ReflectorTexture;
 
 // Adapts a WebGraphicsContext3DCommandBufferImpl into a
@@ -36,7 +39,7 @@
       const scoped_refptr<ContextProviderCommandBuffer>& worker_context,
       const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
       base::SingleThreadTaskRunner* task_runner,
-      std::unique_ptr<BrowserCompositorOverlayCandidateValidator>
+      std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator>
           overlay_candidate_validator);
 
   ~GpuBrowserCompositorOutputSurface() override;
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc
index e0e0531..8351b177 100644
--- a/content/browser/compositor/gpu_process_transport_factory.cc
+++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -11,6 +11,7 @@
 #include "base/command_line.h"
 #include "base/location.h"
 #include "base/metrics/histogram.h"
+#include "base/profiler/scoped_tracker.h"
 #include "base/single_thread_task_runner.h"
 #include "base/thread_task_runner_handle.h"
 #include "base/threading/simple_thread.h"
@@ -25,9 +26,9 @@
 #include "cc/surfaces/onscreen_display_client.h"
 #include "cc/surfaces/surface_display_output_surface.h"
 #include "cc/surfaces/surface_manager.h"
+#include "components/display_compositor/compositor_overlay_candidate_validator.h"
 #include "components/display_compositor/gl_helper.h"
 #include "content/browser/compositor/browser_compositor_output_surface.h"
-#include "content/browser/compositor/browser_compositor_overlay_candidate_validator.h"
 #include "content/browser/compositor/gpu_browser_compositor_output_surface.h"
 #include "content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h"
 #include "content/browser/compositor/offscreen_browser_compositor_output_surface.h"
@@ -39,7 +40,6 @@
 #include "content/browser/gpu/gpu_data_manager_impl.h"
 #include "content/browser/renderer_host/render_widget_host_impl.h"
 #include "content/common/gpu/client/context_provider_command_buffer.h"
-#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
 #include "content/common/gpu_process_launch_causes.h"
 #include "content/common/host_shared_bitmap_manager.h"
 #include "content/public/common/content_switches.h"
@@ -63,7 +63,7 @@
 #include "content/browser/compositor/software_output_device_win.h"
 #include "ui/gfx/win/rendering_window_manager.h"
 #elif defined(USE_OZONE)
-#include "content/browser/compositor/browser_compositor_overlay_candidate_validator_ozone.h"
+#include "components/display_compositor/compositor_overlay_candidate_validator_ozone.h"
 #include "content/browser/compositor/software_output_device_ozone.h"
 #include "ui/ozone/public/overlay_candidates_ozone.h"
 #include "ui/ozone/public/overlay_manager_ozone.h"
@@ -72,13 +72,13 @@
 #elif defined(USE_X11)
 #include "content/browser/compositor/software_output_device_x11.h"
 #elif defined(OS_MACOSX)
-#include "content/browser/compositor/browser_compositor_overlay_candidate_validator_mac.h"
+#include "components/display_compositor/compositor_overlay_candidate_validator_mac.h"
 #include "content/browser/compositor/software_output_device_mac.h"
 #include "gpu/config/gpu_driver_bug_workaround_type.h"
 #include "ui/base/cocoa/remote_layer_api.h"
 #include "ui/base/ui_base_switches.h"
 #elif defined(OS_ANDROID)
-#include "content/browser/compositor/browser_compositor_overlay_candidate_validator_android.h"
+#include "components/display_compositor/compositor_overlay_candidate_validator_android.h"
 #endif
 #if !defined(GPU_SURFACE_HANDLE_IS_ACCELERATED_WINDOW)
 #include "content/browser/gpu/gpu_surface_tracker.h"
@@ -95,9 +95,11 @@
 
 const int kNumRetriesBeforeSoftwareFallback = 4;
 
-std::unique_ptr<content::WebGraphicsContext3DCommandBufferImpl>
-CreateContextCommon(scoped_refptr<gpu::GpuChannelHost> gpu_channel_host,
-                    gpu::SurfaceHandle surface_handle) {
+scoped_refptr<content::ContextProviderCommandBuffer> CreateContextCommon(
+    scoped_refptr<gpu::GpuChannelHost> gpu_channel_host,
+    gpu::SurfaceHandle surface_handle,
+    content::ContextProviderCommandBuffer* shared_context_provider,
+    content::command_buffer_metrics::ContextType type) {
   DCHECK(
       content::GpuDataManagerImpl::GetInstance()->CanUseGpuBrowserCompositor());
   DCHECK(gpu_channel_host);
@@ -126,9 +128,10 @@
   bool automatic_flushes = false;
 
   GURL url("chrome://gpu/GpuProcessTransportFactory::CreateContextCommon");
-  return base::WrapUnique(new content::WebGraphicsContext3DCommandBufferImpl(
-      surface_handle, url, gpu_channel_host.get(), attributes,
-      gfx::PreferIntegratedGpu, automatic_flushes));
+  return make_scoped_refptr(new content::ContextProviderCommandBuffer(
+      std::move(gpu_channel_host), surface_handle, url,
+      gfx::PreferIntegratedGpu, automatic_flushes, gpu::SharedMemoryLimits(),
+      attributes, shared_context_provider, type));
 }
 
 #if defined(OS_MACOSX)
@@ -205,9 +208,10 @@
 #endif
 }
 
-std::unique_ptr<BrowserCompositorOverlayCandidateValidator>
+std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator>
 CreateOverlayCandidateValidator(gfx::AcceleratedWidget widget) {
-  std::unique_ptr<BrowserCompositorOverlayCandidateValidator> validator;
+  std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator>
+      validator;
 #if defined(USE_OZONE)
   std::unique_ptr<ui::OverlayCandidatesOzone> overlay_candidates =
       ui::OzonePlatform::GetInstance()
@@ -217,8 +221,9 @@
   if (overlay_candidates &&
       (command_line->HasSwitch(switches::kEnableHardwareOverlays) ||
        command_line->HasSwitch(switches::kOzoneTestSingleOverlaySupport))) {
-    validator.reset(new BrowserCompositorOverlayCandidateValidatorOzone(
-        std::move(overlay_candidates)));
+    validator.reset(
+        new display_compositor::CompositorOverlayCandidateValidatorOzone(
+            std::move(overlay_candidates)));
   }
 #elif defined(OS_MACOSX)
   // Overlays are only supported through the remote layer API.
@@ -230,10 +235,12 @@
         GpuDataManagerImpl::GetInstance()->IsDriverBugWorkaroundActive(
             gpu::DISABLE_OVERLAY_CA_LAYERS);
     validator.reset(
-        new BrowserCompositorOverlayCandidateValidatorMac(ca_layers_disabled));
+        new display_compositor::CompositorOverlayCandidateValidatorMac(
+            ca_layers_disabled));
   }
 #elif defined(OS_ANDROID)
-  validator.reset(new BrowserCompositorOverlayCandidateValidatorAndroid());
+  validator.reset(
+      new display_compositor::CompositorOverlayCandidateValidatorAndroid());
 #endif
 
   return validator;
@@ -358,9 +365,16 @@
       shared_worker_context_provider_ = nullptr;
     } else {
       if (!shared_worker_context_provider_) {
-        shared_worker_context_provider_ = new ContextProviderCommandBuffer(
-            CreateContextCommon(gpu_channel_host, gpu::kNullSurfaceHandle),
-            gpu::SharedMemoryLimits(), nullptr, BROWSER_WORKER_CONTEXT);
+        shared_worker_context_provider_ = CreateContextCommon(
+            gpu_channel_host, gpu::kNullSurfaceHandle, nullptr,
+            command_buffer_metrics::BROWSER_WORKER_CONTEXT);
+        // TODO(vadimt): Remove ScopedTracker below once crbug.com/125248 is
+        // fixed. Tracking time in BindToCurrentThread.
+        tracked_objects::ScopedTracker tracking_profile(
+            FROM_HERE_WITH_EXPLICIT_FUNCTION(
+                "125248"
+                " GpuProcessTransportFactory::EstablishedGpuChannel"
+                "::Worker"));
         if (shared_worker_context_provider_->BindToCurrentThread())
           shared_worker_context_provider_->SetupLock();
         else
@@ -371,11 +385,17 @@
       // display compositor. It shares resources with the worker context, so if
       // we failed to make a worker context, just start over and try again.
       if (shared_worker_context_provider_) {
-        context_provider = new ContextProviderCommandBuffer(
-            CreateContextCommon(std::move(gpu_channel_host),
-                                data->surface_handle),
-            gpu::SharedMemoryLimits(), shared_worker_context_provider_.get(),
-            DISPLAY_COMPOSITOR_ONSCREEN_CONTEXT);
+        context_provider = CreateContextCommon(
+            std::move(gpu_channel_host), data->surface_handle,
+            shared_worker_context_provider_.get(),
+            command_buffer_metrics::DISPLAY_COMPOSITOR_ONSCREEN_CONTEXT);
+        // TODO(vadimt): Remove ScopedTracker below once crbug.com/125248 is
+        // fixed. Tracking time in BindToCurrentThread.
+        tracked_objects::ScopedTracker tracking_profile(
+            FROM_HERE_WITH_EXPLICIT_FUNCTION(
+                "125248"
+                " GpuProcessTransportFactory::EstablishedGpuChannel"
+                "::Compositor"));
         if (!context_provider->BindToCurrentThread())
           context_provider = nullptr;
       }
@@ -427,7 +447,8 @@
         surface = base::WrapUnique(new OffscreenBrowserCompositorOutputSurface(
             context_provider, shared_worker_context_provider_,
             compositor->vsync_manager(), compositor->task_runner().get(),
-            std::unique_ptr<BrowserCompositorOverlayCandidateValidator>()));
+            std::unique_ptr<
+                display_compositor::CompositorOverlayCandidateValidator>()));
       } else if (capabilities.surfaceless) {
         GLenum target = GL_TEXTURE_2D;
         GLenum format = GL_RGB;
@@ -443,7 +464,8 @@
                 CreateOverlayCandidateValidator(compositor->widget()), target,
                 format, BrowserGpuMemoryBufferManager::current()));
       } else {
-        std::unique_ptr<BrowserCompositorOverlayCandidateValidator> validator;
+        std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator>
+            validator;
 #if !defined(OS_MACOSX)
         // Overlays are only supported on surfaceless output surfaces on Mac.
         validator = CreateOverlayCandidateValidator(compositor->widget());
@@ -683,12 +705,18 @@
 
   // We need a separate context from the compositor's so that skia and gl_helper
   // don't step on each other.
-  shared_main_thread_contexts_ = new ContextProviderCommandBuffer(
-      CreateContextCommon(std::move(gpu_channel_host), gpu::kNullSurfaceHandle),
-      gpu::SharedMemoryLimits(), nullptr, BROWSER_OFFSCREEN_MAINTHREAD_CONTEXT);
+  shared_main_thread_contexts_ = CreateContextCommon(
+      std::move(gpu_channel_host), gpu::kNullSurfaceHandle, nullptr,
+      command_buffer_metrics::BROWSER_OFFSCREEN_MAINTHREAD_CONTEXT);
   shared_main_thread_contexts_->SetLostContextCallback(base::Bind(
       &GpuProcessTransportFactory::OnLostMainThreadSharedContextInsideCallback,
       callback_factory_.GetWeakPtr()));
+  // TODO(vadimt): Remove ScopedTracker below once crbug.com/125248 is
+  // fixed. Tracking time in BindToCurrentThread.
+  tracked_objects::ScopedTracker tracking_profile(
+      FROM_HERE_WITH_EXPLICIT_FUNCTION(
+          "125248"
+          " GpuProcessTransportFactory::SharedMainThreadContextProvider"));
   if (!shared_main_thread_contexts_->BindToCurrentThread())
     shared_main_thread_contexts_ = nullptr;
   return shared_main_thread_contexts_;
diff --git a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc
index 5ec3381..08ce90e 100644
--- a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc
+++ b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc
@@ -9,8 +9,8 @@
 #include "cc/output/compositor_frame.h"
 #include "cc/output/output_surface_client.h"
 #include "components/display_compositor/buffer_queue.h"
+#include "components/display_compositor/compositor_overlay_candidate_validator.h"
 #include "components/display_compositor/gl_helper.h"
-#include "content/browser/compositor/browser_compositor_overlay_candidate_validator.h"
 #include "content/browser/compositor/reflector_impl.h"
 #include "content/common/gpu/client/context_provider_command_buffer.h"
 #include "gpu/GLES2/gl2extchromium.h"
@@ -25,7 +25,7 @@
         gpu::SurfaceHandle surface_handle,
         const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
         base::SingleThreadTaskRunner* task_runner,
-        std::unique_ptr<BrowserCompositorOverlayCandidateValidator>
+        std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator>
             overlay_candidate_validator,
         unsigned int target,
         unsigned int internalformat,
diff --git a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h
index 84f9abbc..ef0946f 100644
--- a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h
+++ b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h
@@ -30,7 +30,7 @@
       gpu::SurfaceHandle surface_handle,
       const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
       base::SingleThreadTaskRunner* task_runner,
-      std::unique_ptr<BrowserCompositorOverlayCandidateValidator>
+      std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator>
           overlay_candidate_validator,
       unsigned int target,
       unsigned int internalformat,
diff --git a/content/browser/compositor/offscreen_browser_compositor_output_surface.cc b/content/browser/compositor/offscreen_browser_compositor_output_surface.cc
index acff916..b6bce71 100644
--- a/content/browser/compositor/offscreen_browser_compositor_output_surface.cc
+++ b/content/browser/compositor/offscreen_browser_compositor_output_surface.cc
@@ -13,7 +13,7 @@
 #include "cc/output/gl_frame_data.h"
 #include "cc/output/output_surface_client.h"
 #include "cc/resources/resource_provider.h"
-#include "content/browser/compositor/browser_compositor_overlay_candidate_validator.h"
+#include "components/display_compositor/compositor_overlay_candidate_validator.h"
 #include "content/browser/compositor/reflector_impl.h"
 #include "content/browser/compositor/reflector_texture.h"
 #include "content/common/gpu/client/context_provider_command_buffer.h"
@@ -36,7 +36,7 @@
         const scoped_refptr<ContextProviderCommandBuffer>& worker_context,
         const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
         base::SingleThreadTaskRunner* task_runner,
-        std::unique_ptr<BrowserCompositorOverlayCandidateValidator>
+        std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator>
             overlay_candidate_validator)
     : BrowserCompositorOutputSurface(context,
                                      worker_context,
diff --git a/content/browser/compositor/offscreen_browser_compositor_output_surface.h b/content/browser/compositor/offscreen_browser_compositor_output_surface.h
index 5f88209..08971c2 100644
--- a/content/browser/compositor/offscreen_browser_compositor_output_surface.h
+++ b/content/browser/compositor/offscreen_browser_compositor_output_surface.h
@@ -31,7 +31,7 @@
       const scoped_refptr<ContextProviderCommandBuffer>& worker_context,
       const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
       base::SingleThreadTaskRunner* task_runner,
-      std::unique_ptr<BrowserCompositorOverlayCandidateValidator>
+      std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator>
           overlay_candidate_validator);
 
   ~OffscreenBrowserCompositorOutputSurface() override;
diff --git a/content/browser/compositor/reflector_impl_unittest.cc b/content/browser/compositor/reflector_impl_unittest.cc
index d5a512c61..03b5006 100644
--- a/content/browser/compositor/reflector_impl_unittest.cc
+++ b/content/browser/compositor/reflector_impl_unittest.cc
@@ -8,8 +8,8 @@
 #include "cc/test/fake_output_surface_client.h"
 #include "cc/test/test_context_provider.h"
 #include "cc/test/test_web_graphics_context_3d.h"
+#include "components/display_compositor/compositor_overlay_candidate_validator.h"
 #include "content/browser/compositor/browser_compositor_output_surface.h"
-#include "content/browser/compositor/browser_compositor_overlay_candidate_validator.h"
 #include "content/browser/compositor/reflector_impl.h"
 #include "content/browser/compositor/reflector_texture.h"
 #include "content/browser/compositor/test/no_transport_image_transport_factory.h"
@@ -19,7 +19,7 @@
 #include "ui/compositor/test/context_factories_for_test.h"
 
 #if defined(USE_OZONE)
-#include "content/browser/compositor/browser_compositor_overlay_candidate_validator_ozone.h"
+#include "components/display_compositor/compositor_overlay_candidate_validator_ozone.h"
 #include "ui/ozone/public/overlay_candidates_ozone.h"
 #endif  // defined(USE_OZONE)
 
@@ -57,11 +57,12 @@
 };
 #endif  // defined(USE_OZONE)
 
-std::unique_ptr<BrowserCompositorOverlayCandidateValidator>
+std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator>
 CreateTestValidatorOzone() {
 #if defined(USE_OZONE)
-  return std::unique_ptr<BrowserCompositorOverlayCandidateValidator>(
-      new BrowserCompositorOverlayCandidateValidatorOzone(
+  return std::unique_ptr<
+      display_compositor::CompositorOverlayCandidateValidator>(
+      new display_compositor::CompositorOverlayCandidateValidatorOzone(
           std::unique_ptr<ui::OverlayCandidatesOzone>(
               new TestOverlayCandidatesOzone())));
 #else
diff --git a/content/browser/dom_storage/dom_storage_browsertest.cc b/content/browser/dom_storage/dom_storage_browsertest.cc
index 9fc8c417..ad93aeae 100644
--- a/content/browser/dom_storage/dom_storage_browsertest.cc
+++ b/content/browser/dom_storage/dom_storage_browsertest.cc
@@ -2,9 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/command_line.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/common/content_switches.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/content_browser_test.h"
 #include "content/public/test/content_browser_test_utils.h"
@@ -36,6 +38,14 @@
   }
 };
 
+class MojoDOMStorageBrowserTest : public DOMStorageBrowserTest {
+ public:
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    ContentBrowserTest::SetUpCommandLine(command_line);
+    command_line->AppendSwitch(switches::kMojoLocalStorage);
+  }
+};
+
 static const bool kIncognito = true;
 static const bool kNotIncognito = false;
 
@@ -47,4 +57,14 @@
   SimpleTest(GetTestUrl("dom_storage", "sanity_check.html"), kIncognito);
 }
 
+// TODO(michaeln): Enable the mojo tests after crbug/608121 is fixed.
+IN_PROC_BROWSER_TEST_F(MojoDOMStorageBrowserTest, DISABLED_SanityCheck) {
+  SimpleTest(GetTestUrl("dom_storage", "sanity_check.html"), kNotIncognito);
+}
+
+IN_PROC_BROWSER_TEST_F(MojoDOMStorageBrowserTest,
+                       DISABLED_SanityCheckIncognito) {
+  SimpleTest(GetTestUrl("dom_storage", "sanity_check.html"), kIncognito);
+}
+
 }  // namespace content
diff --git a/content/browser/dom_storage/dom_storage_context_wrapper.cc b/content/browser/dom_storage/dom_storage_context_wrapper.cc
index 4f7ea18..96e2cee81 100644
--- a/content/browser/dom_storage/dom_storage_context_wrapper.cc
+++ b/content/browser/dom_storage/dom_storage_context_wrapper.cc
@@ -98,6 +98,15 @@
     level_db_wrappers_.erase(origin);
   }
 
+  void OnUserServiceConnectionComplete() {
+    CHECK_EQ(shell::mojom::ConnectResult::SUCCEEDED,
+             user_service_connection_->GetResult());
+  }
+
+  void OnUserServiceConnectionError() {
+    CHECK(false);
+  }
+
   // Part of our asynchronous directory opening called from OpenLocalStorage().
   void OnDirectoryOpened(filesystem::FileError err);
   void OnDatabaseOpened(leveldb::DatabaseError status);
@@ -143,6 +152,12 @@
     user_service_connection_ =
         connector_->Connect(user_service::kUserServiceName);
     connection_state_ = CONNECTION_IN_PROGRESS;
+    user_service_connection_->AddConnectionCompletedClosure(
+        base::Bind(&MojoState::OnUserServiceConnectionComplete,
+                   weak_ptr_factory_.GetWeakPtr()));
+    user_service_connection_->SetConnectionLostClosure(
+        base::Bind(&MojoState::OnUserServiceConnectionError,
+                   weak_ptr_factory_.GetWeakPtr()));
 
     if (!subdirectory_.empty()) {
       // We were given a subdirectory to write to. Get it and use a disk backed
diff --git a/content/browser/frame_host/navigator_impl.cc b/content/browser/frame_host/navigator_impl.cc
index a5ff8a1..193bffc3 100644
--- a/content/browser/frame_host/navigator_impl.cc
+++ b/content/browser/frame_host/navigator_impl.cc
@@ -470,7 +470,7 @@
               ->render_manager()
               ->current_frame_host()) {
     bad_message::ReceivedBadMessage(render_frame_host->GetProcess(),
-                                    bad_message::NC_IN_PAGE_NAVIGATION);
+                                    bad_message::NI_IN_PAGE_NAVIGATION);
     is_navigation_within_page = false;
   }
 
diff --git a/content/browser/frame_host/render_frame_host_delegate.h b/content/browser/frame_host/render_frame_host_delegate.h
index 28b9570..9054ea9 100644
--- a/content/browser/frame_host/render_frame_host_delegate.h
+++ b/content/browser/frame_host/render_frame_host_delegate.h
@@ -64,9 +64,6 @@
   // Informs the delegate whenever a RenderFrameHost is deleted.
   virtual void RenderFrameDeleted(RenderFrameHost* render_frame_host) {}
 
-  // The RenderFrameHost has been swapped out.
-  virtual void SwappedOut(RenderFrameHost* render_frame_host) {}
-
   // A context menu should be shown, to be built using the context information
   // provided in the supplied params.
   virtual void ShowContextMenu(RenderFrameHost* render_frame_host,
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 24fb489..9e15211 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1230,9 +1230,6 @@
   is_waiting_for_swapout_ack_ = true;
   if (frame_tree_node_->IsMainFrame())
     render_view_host_->set_is_active(false);
-
-  if (!GetParent())
-    delegate_->SwappedOut(this);
 }
 
 void RenderFrameHostImpl::OnBeforeUnloadACK(
diff --git a/content/browser/frame_host/render_frame_message_filter.cc b/content/browser/frame_host/render_frame_message_filter.cc
index 98bd0fd..cb526235 100644
--- a/content/browser/frame_host/render_frame_message_filter.cc
+++ b/content/browser/frame_host/render_frame_message_filter.cc
@@ -5,6 +5,8 @@
 #include "content/browser/frame_host/render_frame_message_filter.h"
 
 #include "base/command_line.h"
+#include "base/debug/crash_logging.h"
+#include "base/debug/dump_without_crashing.h"
 #include "base/macros.h"
 #include "base/metrics/field_trial.h"
 #include "base/strings/string_util.h"
@@ -249,6 +251,16 @@
   ChildProcessSecurityPolicyImpl* policy =
       ChildProcessSecurityPolicyImpl::GetInstance();
   if (!policy->CanAccessDataForOrigin(render_process_id_, url)) {
+    {
+      // TODO(nick): Remove this once we understand http://crbug.com/600441
+      auto origin_lock = policy->GetOriginLockCrashKey(render_process_id_);
+      base::debug::ScopedCrashKey("cookie_url", url.possibly_invalid_spec());
+      base::debug::ScopedCrashKey(
+          "cookie_first_party",
+          first_party_for_cookies.possibly_invalid_spec());
+      base::debug::DumpWithoutCrashing();
+    }
+
     bad_message::ReceivedBadMessage(this,
                                     bad_message::RFMF_SET_COOKIE_BAD_ORIGIN);
     return;
@@ -282,6 +294,16 @@
   ChildProcessSecurityPolicyImpl* policy =
       ChildProcessSecurityPolicyImpl::GetInstance();
   if (!policy->CanAccessDataForOrigin(render_process_id_, url)) {
+    {
+      // TODO(nick): Remove this once we understand http://crbug.com/600441
+      auto origin_lock = policy->GetOriginLockCrashKey(render_process_id_);
+      base::debug::ScopedCrashKey("cookie_url", url.possibly_invalid_spec());
+      base::debug::ScopedCrashKey(
+          "cookie_first_party",
+          first_party_for_cookies.possibly_invalid_spec());
+      base::debug::DumpWithoutCrashing();
+    }
+
     bad_message::ReceivedBadMessage(this,
                                     bad_message::RFMF_GET_COOKIES_BAD_ORIGIN);
     delete reply_msg;
diff --git a/content/browser/gamepad/gamepad_standard_mappings_linux.cc b/content/browser/gamepad/gamepad_standard_mappings_linux.cc
index 3cd7747..ecff74b3 100644
--- a/content/browser/gamepad/gamepad_standard_mappings_linux.cc
+++ b/content/browser/gamepad/gamepad_standard_mappings_linux.cc
@@ -228,6 +228,69 @@
   mapped->axesLength = AXIS_INDEX_COUNT;
 }
 
+void MapperOUYA(const blink::WebGamepad& input, blink::WebGamepad* mapped) {
+  *mapped = input;
+  mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0];
+  mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[3];
+  mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[1];
+  mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[2];
+  mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = input.buttons[4];
+  mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[5];
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[2]);
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[5]);
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = NullButton();
+  mapped->buttons[BUTTON_INDEX_START] = NullButton();
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[6];
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_DPAD_UP] = input.buttons[8];
+  mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = input.buttons[9];
+  mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = input.buttons[10];
+  mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] = input.buttons[11];
+  mapped->buttons[BUTTON_INDEX_META] = input.buttons[15];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_X] = input.axes[3];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[4];
+
+  mapped->buttonsLength = BUTTON_INDEX_COUNT;
+  mapped->axesLength = AXIS_INDEX_COUNT;
+}
+
+void MapperRazerServal(const blink::WebGamepad& input,
+                       blink::WebGamepad* mapped) {
+  *mapped = input;
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[5]);
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[4]);
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = input.buttons[6];
+  mapped->buttons[BUTTON_INDEX_START] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[9];
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[10];
+  mapped->buttons[BUTTON_INDEX_DPAD_UP] = AxisNegativeAsButton(input.axes[7]);
+  mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = AxisPositiveAsButton(input.axes[7]);
+  mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = AxisNegativeAsButton(input.axes[6]);
+  mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] =
+      AxisPositiveAsButton(input.axes[6]);
+
+  mapped->buttonsLength = BUTTON_INDEX_COUNT - 1; /* no meta */
+  mapped->axesLength = AXIS_INDEX_COUNT;
+}
+
+void MapperMogaPro(const blink::WebGamepad& input, blink::WebGamepad* mapped) {
+  *mapped = input;
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[5]);
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[4]);
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = NullButton();
+  mapped->buttons[BUTTON_INDEX_START] = input.buttons[6];
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[8];
+  mapped->buttons[BUTTON_INDEX_DPAD_UP] = AxisNegativeAsButton(input.axes[7]);
+  mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = AxisPositiveAsButton(input.axes[7]);
+  mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = AxisNegativeAsButton(input.axes[6]);
+  mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] =
+      AxisPositiveAsButton(input.axes[6]);
+
+  mapped->buttonsLength = BUTTON_INDEX_COUNT - 1; /* no meta */
+  mapped->axesLength = AXIS_INDEX_COUNT;
+}
+
 struct MappingData {
   const char* const vendor_id;
   const char* const product_id;
@@ -247,10 +310,14 @@
       {"0925", "0005", MapperLakeviewResearch},    // SmartJoy PLUS Adapter
       {"0925", "8866", MapperLakeviewResearch},    // WiseGroup MP-8866
       {"0955", "7210", MapperNvShield},        // Nvidia Shield gamepad
+      {"0b05", "4500", MapperADT1},            // Nexus Player Controller
       {"0e8f", "0003", MapperXGEAR},           // XFXforce XGEAR PS2 Controller
+      {"1532", "0900", MapperRazerServal},     // Razer Serval Controller
       {"18d1", "2c40", MapperADT1},            // ADT-1 Controller
+      {"20d6", "6271", MapperMogaPro},         // Moga Pro Controller (HID mode)
       {"2378", "1008", MapperOnLiveWireless},  // OnLive Controller (Bluetooth)
       {"2378", "100a", MapperOnLiveWireless},  // OnLive Controller (Wired)
+      {"2836", "0001", MapperOUYA},            // OUYA Controller
 };
 
 }  // namespace
diff --git a/content/browser/gamepad/gamepad_standard_mappings_mac.mm b/content/browser/gamepad/gamepad_standard_mappings_mac.mm
index 2d3be550..f10e3191 100644
--- a/content/browser/gamepad/gamepad_standard_mappings_mac.mm
+++ b/content/browser/gamepad/gamepad_standard_mappings_mac.mm
@@ -259,6 +259,97 @@
   mapped->axesLength = AXIS_INDEX_COUNT;
 }
 
+void MapperNvShield(const blink::WebGamepad& input, blink::WebGamepad* mapped) {
+  *mapped = input;
+  mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0];
+  mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1];
+  mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[3];
+  mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[4];
+  mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = input.buttons[6];
+  mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[3]);
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[4]);
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = NullButton();
+  mapped->buttons[BUTTON_INDEX_START] = input.buttons[11];
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[13];
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[14];
+  mapped->buttons[BUTTON_INDEX_META] = input.buttons[8];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[5];
+  DpadFromAxis(mapped, input.axes[9]);
+
+  mapped->buttonsLength = BUTTON_INDEX_COUNT;
+  mapped->axesLength = AXIS_INDEX_COUNT;
+}
+
+void MapperOUYA(const blink::WebGamepad& input, blink::WebGamepad* mapped) {
+  *mapped = input;
+  mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0];
+  mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[3];
+  mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[1];
+  mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[2];
+  mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = input.buttons[4];
+  mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[5];
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[2]);
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[5]);
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = NullButton();
+  mapped->buttons[BUTTON_INDEX_START] = NullButton();
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[6];
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_DPAD_UP] = input.buttons[8];
+  mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = input.buttons[9];
+  mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = input.buttons[10];
+  mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] = input.buttons[11];
+  mapped->buttons[BUTTON_INDEX_META] = input.buttons[15];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_X] = input.axes[3];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[4];
+
+  mapped->buttonsLength = BUTTON_INDEX_COUNT;
+  mapped->axesLength = AXIS_INDEX_COUNT;
+}
+
+void MapperRazerServal(const blink::WebGamepad& input,
+                       blink::WebGamepad* mapped) {
+  *mapped = input;
+  mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0];
+  mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1];
+  mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[3];
+  mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[4];
+  mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = input.buttons[6];
+  mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[3]);
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[4]);
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = input.buttons[10];
+  mapped->buttons[BUTTON_INDEX_START] = input.buttons[11];
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[13];
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[14];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[5];
+  DpadFromAxis(mapped, input.axes[9]);
+
+  mapped->buttonsLength = BUTTON_INDEX_COUNT - 1; /* no meta */
+  mapped->axesLength = AXIS_INDEX_COUNT;
+}
+
+void MapperMogaPro(const blink::WebGamepad& input, blink::WebGamepad* mapped) {
+  *mapped = input;
+  mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0];
+  mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1];
+  mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[3];
+  mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[4];
+  mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = input.buttons[6];
+  mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[3]);
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[4]);
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = NullButton();
+  mapped->buttons[BUTTON_INDEX_START] = input.buttons[11];
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[13];
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[14];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[5];
+  DpadFromAxis(mapped, input.axes[9]);
+
+  mapped->buttonsLength = BUTTON_INDEX_COUNT - 1; /* no meta */
+  mapped->axesLength = AXIS_INDEX_COUNT;
+}
+
 struct MappingData {
   const char* const vendor_id;
   const char* const product_id;
@@ -276,12 +367,17 @@
     {"054c", "05c4", MapperDualshock4},          // Playstation Dualshock 4
     {"0583", "2060", MapperIBuffalo},            // iBuffalo Classic
     {"0925", "0005", MapperSmartJoyPLUS},        // SmartJoy PLUS Adapter
+    {"0955", "7210", MapperNvShield},          // Nvidia Shield gamepad
+    {"0b05", "4500", MapperADT1},              // Nexus Player Controller
     {"0e8f", "0003", MapperXGEAR},             // XFXforce XGEAR PS2 Controller
+    {"1532", "0900", MapperRazerServal},       // Razer Serval Controller
     {"18d1", "2c40", MapperADT1},              // ADT-1 Controller
+    {"20d6", "6271", MapperMogaPro},           // Moga Pro Controller (HID mode)
     {"2222", "0060", MapperDirectInputStyle},  // Macally iShockX, analog mode
     {"2222", "4010", MapperMacallyIShock},     // Macally iShock
     {"2378", "1008", MapperOnLiveWireless},    // OnLive Controller (Bluetooth)
     {"2378", "100a", MapperOnLiveWireless},    // OnLive Controller (Wired)
+    {"2836", "0001", MapperOUYA},              // OUYA Controller
 };
 
 }  // namespace
diff --git a/content/browser/gamepad/gamepad_standard_mappings_win.cc b/content/browser/gamepad/gamepad_standard_mappings_win.cc
index 3772377..efdcc13 100644
--- a/content/browser/gamepad/gamepad_standard_mappings_win.cc
+++ b/content/browser/gamepad/gamepad_standard_mappings_win.cc
@@ -164,6 +164,75 @@
   mapped->axesLength = AXIS_INDEX_COUNT;
 }
 
+void MapperOUYA(const blink::WebGamepad& input, blink::WebGamepad* mapped) {
+  *mapped = input;
+  mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0];
+  mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[3];
+  mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[1];
+  mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[2];
+  mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = input.buttons[4];
+  mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[5];
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[2]);
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[5]);
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = NullButton();
+  mapped->buttons[BUTTON_INDEX_START] = NullButton();
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[6];
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_DPAD_UP] = input.buttons[8];
+  mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = input.buttons[9];
+  mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = input.buttons[10];
+  mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] = input.buttons[11];
+  mapped->buttons[BUTTON_INDEX_META] = input.buttons[15];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_X] = input.axes[3];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[4];
+
+  mapped->buttonsLength = BUTTON_INDEX_COUNT;
+  mapped->axesLength = AXIS_INDEX_COUNT;
+}
+
+void MapperRazerServal(const blink::WebGamepad& input,
+                       blink::WebGamepad* mapped) {
+  *mapped = input;
+  mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0];
+  mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1];
+  mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[3];
+  mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[4];
+  mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = input.buttons[6];
+  mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[4]);
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[3]);
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = input.buttons[10];
+  mapped->buttons[BUTTON_INDEX_START] = input.buttons[11];
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[13];
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[14];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[5];
+  DpadFromAxis(mapped, input.axes[9]);
+
+  mapped->buttonsLength = BUTTON_INDEX_COUNT - 1; /* no meta */
+  mapped->axesLength = AXIS_INDEX_COUNT;
+}
+
+void MapperMogaPro(const blink::WebGamepad& input, blink::WebGamepad* mapped) {
+  *mapped = input;
+  mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0];
+  mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1];
+  mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[3];
+  mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[4];
+  mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = input.buttons[6];
+  mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[4]);
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[3]);
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = NullButton();
+  mapped->buttons[BUTTON_INDEX_START] = input.buttons[11];
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[13];
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[14];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[5];
+  DpadFromAxis(mapped, input.axes[9]);
+
+  mapped->buttonsLength = BUTTON_INDEX_COUNT - 1; /* no meta */
+  mapped->axesLength = AXIS_INDEX_COUNT;
+}
+
 struct MappingData {
   const char* const vendor_id;
   const char* const product_id;
@@ -175,9 +244,13 @@
     {"054c", "05c4", MapperDualshock4},          // Playstation Dualshock 4
     {"0583", "2060", MapperIBuffalo},            // iBuffalo Classic
     {"0955", "7210", MapperNvShield},        // Nvidia Shield gamepad
+    {"0b05", "4500", MapperADT1},            // Nexus Player Controller
+    {"1532", "0900", MapperRazerServal},     // Razer Serval Controller
     {"18d1", "2c40", MapperADT1},            // ADT-1 Controller
+    {"20d6", "6271", MapperMogaPro},         // Moga Pro Controller (HID mode)
     {"2378", "1008", MapperOnLiveWireless},  // OnLive Controller (Bluetooth)
     {"2378", "100a", MapperOnLiveWireless},  // OnLive Controller (Wired)
+    {"2836", "0001", MapperOUYA},            // OUYA Controller
 };
 
 }  // namespace
diff --git a/content/browser/gpu/browser_gpu_channel_host_factory.cc b/content/browser/gpu/browser_gpu_channel_host_factory.cc
index bc0a4c77..7c75e1d2 100644
--- a/content/browser/gpu/browser_gpu_channel_host_factory.cc
+++ b/content/browser/gpu/browser_gpu_channel_host_factory.cc
@@ -280,14 +280,15 @@
 // (Opening the initial channel to a child process involves handling a reply
 // task on the UI thread first, so we cannot block here.)
 #if !defined(OS_ANDROID)
-gpu::GpuChannelHost* BrowserGpuChannelHostFactory::EstablishGpuChannelSync(
+scoped_refptr<gpu::GpuChannelHost>
+BrowserGpuChannelHostFactory::EstablishGpuChannelSync(
     CauseForGpuLaunch cause_for_gpu_launch) {
   EstablishGpuChannel(cause_for_gpu_launch, base::Closure());
 
   if (pending_request_.get())
     pending_request_->Wait();
 
-  return gpu_channel_.get();
+  return gpu_channel_;
 }
 #endif
 
diff --git a/content/browser/gpu/browser_gpu_channel_host_factory.h b/content/browser/gpu/browser_gpu_channel_host_factory.h
index 1dae42d..d0692ae 100644
--- a/content/browser/gpu/browser_gpu_channel_host_factory.h
+++ b/content/browser/gpu/browser_gpu_channel_host_factory.h
@@ -38,7 +38,7 @@
 
   int GpuProcessHostId() { return gpu_host_id_; }
 #if !defined(OS_ANDROID)
-  gpu::GpuChannelHost* EstablishGpuChannelSync(
+  scoped_refptr<gpu::GpuChannelHost> EstablishGpuChannelSync(
       CauseForGpuLaunch cause_for_gpu_launch);
 #endif
   void EstablishGpuChannel(CauseForGpuLaunch cause_for_gpu_launch,
diff --git a/content/browser/gpu/gpu_ipc_browsertests.cc b/content/browser/gpu/gpu_ipc_browsertests.cc
index 03a7a1f..4cd482f 100644
--- a/content/browser/gpu/gpu_ipc_browsertests.cc
+++ b/content/browser/gpu/gpu_ipc_browsertests.cc
@@ -9,7 +9,6 @@
 #include "content/browser/gpu/browser_gpu_channel_host_factory.h"
 #include "content/browser/gpu/gpu_process_host_ui_shim.h"
 #include "content/common/gpu/client/context_provider_command_buffer.h"
-#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
 #include "content/common/gpu_process_launch_causes.h"
 #include "content/public/browser/gpu_data_manager.h"
 #include "content/public/common/content_switches.h"
@@ -22,14 +21,12 @@
 
 namespace {
 
-using content::WebGraphicsContext3DCommandBufferImpl;
-
 const content::CauseForGpuLaunch kInitCause =
     content::
         CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE;
 
-std::unique_ptr<WebGraphicsContext3DCommandBufferImpl> CreateContext(
-    gpu::GpuChannelHost* gpu_channel_host) {
+scoped_refptr<content::ContextProviderCommandBuffer> CreateContext(
+    scoped_refptr<gpu::GpuChannelHost> gpu_channel_host) {
   // This is for an offscreen context, so the default framebuffer doesn't need
   // any alpha, depth, stencil, antialiasing.
   gpu::gles2::ContextCreationAttribHelper attributes;
@@ -40,9 +37,11 @@
   attributes.sample_buffers = 0;
   attributes.bind_generates_resource = false;
   bool automatic_flushes = false;
-  return base::WrapUnique(new WebGraphicsContext3DCommandBufferImpl(
-      gpu::kNullSurfaceHandle, GURL(), gpu_channel_host, attributes,
-      gfx::PreferIntegratedGpu, automatic_flushes));
+  return make_scoped_refptr(new content::ContextProviderCommandBuffer(
+      std::move(gpu_channel_host), gpu::kNullSurfaceHandle, GURL(),
+      gfx::PreferIntegratedGpu, automatic_flushes, gpu::SharedMemoryLimits(),
+      attributes, nullptr,
+      content::command_buffer_metrics::OFFSCREEN_CONTEXT_FOR_TESTING));
 }
 
 class ContextTestBase : public content::ContentBrowserTest {
@@ -66,9 +65,7 @@
         factory->GetGpuChannel());
     CHECK(gpu_channel_host);
 
-    provider_ = new content::ContextProviderCommandBuffer(
-        CreateContext(gpu_channel_host.get()), gpu::SharedMemoryLimits(),
-        nullptr, content::OFFSCREEN_CONTEXT_FOR_TESTING);
+    provider_ = CreateContext(std::move(gpu_channel_host));
     bool bound = provider_->BindToCurrentThread();
     CHECK(bound);
     gl_ = provider_->ContextGL();
@@ -225,9 +222,7 @@
   // Step 2: verify that holding onto the provider's GrContext will
   // retain the host after provider is destroyed.
   scoped_refptr<ContextProviderCommandBuffer> provider =
-      new ContextProviderCommandBuffer(CreateContext(GetGpuChannel()),
-                                       gpu::SharedMemoryLimits(), nullptr,
-                                       OFFSCREEN_CONTEXT_FOR_TESTING);
+      CreateContext(GetGpuChannel());
   EXPECT_TRUE(provider->BindToCurrentThread());
 
   sk_sp<GrContext> gr_context = sk_ref_sp(provider->GrContext());
@@ -274,9 +269,7 @@
   scoped_refptr<gpu::GpuChannelHost> host = GetGpuChannel();
 
   scoped_refptr<ContextProviderCommandBuffer> provider =
-      new ContextProviderCommandBuffer(CreateContext(GetGpuChannel()),
-                                       gpu::SharedMemoryLimits(), nullptr,
-                                       OFFSCREEN_CONTEXT_FOR_TESTING);
+      CreateContext(GetGpuChannel());
   base::RunLoop run_loop;
   int counter = 0;
   provider->SetLostContextCallback(
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc
index fe63c21f..d542df9 100644
--- a/content/browser/gpu/gpu_process_host.cc
+++ b/content/browser/gpu/gpu_process_host.cc
@@ -927,7 +927,8 @@
                       base::TimeTicks::Now() - init_start_time_);
 }
 
-void GpuProcessHost::OnProcessLaunchFailed() {
+void GpuProcessHost::OnProcessLaunchFailed(int error_code) {
+  // TODO(wfh): do something more useful with this error code.
   RecordProcessCrash();
 }
 
@@ -994,6 +995,7 @@
 
   base::CommandLine* cmd_line = new base::CommandLine(exe_path);
 #endif
+  BrowserChildProcessHostImpl::CopyFeatureAndFieldTrialFlags(cmd_line);
   cmd_line->AppendSwitchASCII(switches::kProcessType, switches::kGpuProcess);
   cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id);
   cmd_line->AppendSwitchASCII(switches::kMojoApplicationChannelToken,
diff --git a/content/browser/gpu/gpu_process_host.h b/content/browser/gpu/gpu_process_host.h
index bdfa94eb..1bb6dcb 100644
--- a/content/browser/gpu/gpu_process_host.h
+++ b/content/browser/gpu/gpu_process_host.h
@@ -185,7 +185,7 @@
   bool OnMessageReceived(const IPC::Message& message) override;
   void OnChannelConnected(int32_t peer_pid) override;
   void OnProcessLaunched() override;
-  void OnProcessLaunchFailed() override;
+  void OnProcessLaunchFailed(int error_code) override;
   void OnProcessCrashed(int exit_code) override;
 
   // Message handlers.
diff --git a/content/browser/gpu/test_support_gpu.gypi b/content/browser/gpu/test_support_gpu.gypi
index 73f87eec..ac54822 100644
--- a/content/browser/gpu/test_support_gpu.gypi
+++ b/content/browser/gpu/test_support_gpu.gypi
@@ -41,7 +41,7 @@
     }],
     ['chromeos==1 or (OS=="linux" and use_aura==1)', {
       'dependencies': [
-        '<(src_dir)/build/linux/system.gyp:ssl',
+        '<(src_dir)/build/linux/system.gyp:nss',
       ],
     }],
     ['toolkit_views==1', {
diff --git a/content/browser/leveldb_wrapper_impl.cc b/content/browser/leveldb_wrapper_impl.cc
index 020c40c..3d15512 100644
--- a/content/browser/leveldb_wrapper_impl.cc
+++ b/content/browser/leveldb_wrapper_impl.cc
@@ -88,10 +88,9 @@
                              const mojo::String& source,
                              const PutCallback& callback) {
   if (!map_) {
-    on_load_complete_tasks_.push_back(
+    LoadMap(
         base::Bind(&LevelDBWrapperImpl::Put, base::Unretained(this),
                    base::Passed(&key), base::Passed(&value), source, callback));
-    LoadMap();
     return;
   }
 
@@ -146,10 +145,9 @@
                                 const mojo::String& source,
                                 const DeleteCallback& callback) {
   if (!map_) {
-    on_load_complete_tasks_.push_back(
+    LoadMap(
         base::Bind(&LevelDBWrapperImpl::Delete, base::Unretained(this),
                    base::Passed(&key), source, callback));
-    LoadMap();
     return;
   }
 
@@ -178,10 +176,9 @@
 void LevelDBWrapperImpl::DeleteAll(const mojo::String& source,
                                    const DeleteAllCallback& callback) {
   if (!map_) {
-    on_load_complete_tasks_.push_back(
+    LoadMap(
         base::Bind(&LevelDBWrapperImpl::DeleteAll, base::Unretained(this),
                     source, callback));
-    LoadMap();
     return;
   }
 
@@ -202,10 +199,9 @@
 void LevelDBWrapperImpl::Get(mojo::Array<uint8_t> key,
                              const GetCallback& callback) {
   if (!map_) {
-    on_load_complete_tasks_.push_back(
+    LoadMap(
         base::Bind(&LevelDBWrapperImpl::Get, base::Unretained(this),
                    base::Passed(&key), callback));
-    LoadMap();
     return;
   }
 
@@ -220,10 +216,9 @@
 void LevelDBWrapperImpl::GetAll(const mojo::String& source,
                                 const GetAllCallback& callback) {
   if (!map_) {
-    on_load_complete_tasks_.push_back(
+    LoadMap(
         base::Bind(&LevelDBWrapperImpl::GetAll, base::Unretained(this),
                    source, callback));
-    LoadMap();
     return;
   }
 
@@ -247,9 +242,13 @@
   no_bindings_callback_.Run();
 }
 
-void LevelDBWrapperImpl::LoadMap() {
-  // TODO(michaeln): Import from sqlite localstorage db.
+void LevelDBWrapperImpl::LoadMap(const base::Closure& completion_callback) {
   DCHECK(!map_);
+  on_load_complete_tasks_.push_back(completion_callback);
+  if (on_load_complete_tasks_.size() > 1)
+    return;
+
+  // TODO(michaeln): Import from sqlite localstorage db.
   database_->GetPrefixed(mojo::Array<uint8_t>::From(prefix_),
                          base::Bind(&LevelDBWrapperImpl::OnLoadComplete,
                                     weak_ptr_factory_.GetWeakPtr()));
diff --git a/content/browser/leveldb_wrapper_impl.h b/content/browser/leveldb_wrapper_impl.h
index e138a48..bb2eb08 100644
--- a/content/browser/leveldb_wrapper_impl.h
+++ b/content/browser/leveldb_wrapper_impl.h
@@ -100,7 +100,7 @@
               const GetAllCallback& callback) override;
 
   void OnConnectionError();
-  void LoadMap();
+  void LoadMap(const base::Closure& completion_callback);
   void OnLoadComplete(leveldb::DatabaseError status,
                       mojo::Array<leveldb::KeyValuePtr> data);
   void CreateCommitBatchIfNeeded();
diff --git a/content/browser/loader/DEPS b/content/browser/loader/DEPS
index 444f8fa8..2fbfc729 100644
--- a/content/browser/loader/DEPS
+++ b/content/browser/loader/DEPS
@@ -84,6 +84,88 @@
     # TODO: these all have to be removed.
     "+content/public/browser/power_save_blocker.h",
   ],
+  "resource_dispatcher_host_impl\.(cc|h)": [
+    "-content",
+    "+content/browser/loader/async_resource_handler.h",
+    "+content/browser/loader/async_revalidation_manager.h",
+    "+content/browser/loader/global_routing_id.h",
+    "+content/browser/loader/power_save_block_resource_throttle.h",
+    "+content/browser/loader/resource_dispatcher_host_impl.h",
+    "+content/browser/loader/resource_loader.h",
+    "+content/browser/loader/resource_loader_delegate.h",
+    "+content/browser/loader/resource_message_filter.h",
+    "+content/browser/loader/resource_request_info_impl.h",
+    "+content/browser/loader/resource_scheduler.h",
+    "+content/browser/loader/stream_resource_handler.h",
+    "+content/browser/loader/sync_resource_handler.h",
+    "+content/browser/loader/throttling_resource_handler.h",
+    "+content/public/browser/global_request_id.h",
+    "+content/public/browser/resource_dispatcher_host.h",
+    "+content/public/browser/resource_dispatcher_host_delegate.h",
+    "+content/public/browser/resource_throttle.h",
+
+    # TODO: These all have to be removed.
+    "+content/browser/appcache/appcache_interceptor.h",
+    "+content/browser/appcache/chrome_appcache_service.h",
+    "+content/browser/bad_message.h",
+    "+content/browser/cert_store_impl.h",
+    "+content/browser/child_process_security_policy_impl.h",
+    "+content/browser/download/download_resource_handler.h",
+    "+content/browser/download/save_file_manager.h",
+    "+content/browser/download/save_file_resource_handler.h",
+    "+content/browser/download/save_types.h",
+    "+content/browser/fileapi/chrome_blob_storage_context.h",
+    "+content/browser/frame_host/frame_tree.h",
+    "+content/browser/frame_host/navigation_request_info.h",
+    "+content/browser/frame_host/navigator.h",
+    "+content/browser/loader/cross_site_resource_handler.h",
+    "+content/browser/loader/detachable_resource_handler.h",
+    "+content/browser/loader/mime_type_resource_handler.h",
+    "+content/browser/loader/navigation_resource_handler.h",
+    "+content/browser/loader/navigation_resource_throttle.h",
+    "+content/browser/loader/navigation_url_loader_impl_core.h",
+    "+content/browser/loader/redirect_to_file_resource_handler.h",
+    "+content/browser/loader/upload_data_stream_builder.h",
+    "+content/browser/renderer_host/render_view_host_delegate.h",
+    "+content/browser/renderer_host/render_view_host_impl.h",
+    "+content/browser/resource_context_impl.h",
+    "+content/browser/service_worker/foreign_fetch_request_handler.h",
+    "+content/browser/service_worker/link_header_support.h",
+    "+content/browser/service_worker/service_worker_request_handler.h",
+    "+content/browser/streams/stream.h",
+    "+content/browser/streams/stream_context.h",
+    "+content/browser/streams/stream_registry.h",
+    "+content/browser/web_contents/web_contents_impl.h",
+    "+content/common/appcache_interfaces.h",
+    "+content/common/content_export.h",
+    "+content/common/navigation_params.h",
+    "+content/common/net/url_request_service_worker_data.h",
+    "+content/common/resource_request_body.h",
+    "+content/common/site_isolation_policy.h",
+    "+content/common/ssl_status_serialization.h",
+    "+content/public/browser/browser_thread.h",
+    "+content/public/browser/child_process_data.h",
+    "+content/public/browser/content_browser_client.h",
+    "+content/public/browser/download_item.h",
+    "+content/public/browser/download_manager.h",
+    "+content/public/browser/download_url_parameters.h",
+    "+content/public/browser/notification_types.h",
+    "+content/public/browser/plugin_service.h",
+    "+content/public/browser/resource_request_details.h",
+    "+content/public/browser/stream_handle.h",
+    "+content/public/browser/stream_info.h",
+    "+content/public/browser/user_metrics.h",
+    "+content/public/browser/web_contents_observer.h",
+    "+content/public/common/browser_side_navigation_policy.h",
+    "+content/public/common/content_features.h",
+    "+content/public/common/content_switches.h",
+    "+content/public/common/process_type.h",
+    "+content/public/common/resource_type.h",
+
+    # TODO: To be replaced by mojo.
+    "+content/common/resource_messages.h",
+    "+content/common/view_messages.h",
+  ],
   "resource_handler\.(cc|h)": [
     "-content",
     "+content/browser/loader/resource_handler.h",
diff --git a/content/browser/loader/resource_loader.cc b/content/browser/loader/resource_loader.cc
index 3be9bf4..63f548896 100644
--- a/content/browser/loader/resource_loader.cc
+++ b/content/browser/loader/resource_loader.cc
@@ -99,7 +99,7 @@
   response->head.connection_info = response_info.connection_info;
   response->head.was_fetched_via_proxy = request->was_fetched_via_proxy();
   response->head.proxy_server = response_info.proxy_server;
-  response->head.socket_address = request->GetSocketAddress();
+  response->head.socket_address = response_info.socket_address;
   const content::ResourceRequestInfo* request_info =
       content::ResourceRequestInfo::ForRequest(request);
   if (request_info)
diff --git a/content/browser/media/capture/image_capture_impl.cc b/content/browser/media/capture/image_capture_impl.cc
new file mode 100644
index 0000000..bfc8b0d0
--- /dev/null
+++ b/content/browser/media/capture/image_capture_impl.cc
@@ -0,0 +1,34 @@
+// Copyright 2016 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/media/capture/image_capture_impl.h"
+
+#include "base/bind_helpers.h"
+#include "content/public/browser/browser_thread.h"
+
+namespace content {
+
+// static
+void ImageCaptureImpl::Create(
+    mojo::InterfaceRequest<blink::mojom::ImageCapture> request) {
+  // |binding_| will take ownership of ImageCaptureImpl.
+  new ImageCaptureImpl(std::move(request));
+}
+
+ImageCaptureImpl::~ImageCaptureImpl() {}
+
+void ImageCaptureImpl::TakePhoto(const mojo::String& /* source_id */,
+                                 const TakePhotoCallback& callback) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  // TODO(mcasas): Implement this feature., https://crbug.com/518807.
+  mojo::Array<uint8_t> data(1);
+  callback.Run("text/plain", std::move(data));
+}
+
+ImageCaptureImpl::ImageCaptureImpl(
+    mojo::InterfaceRequest<blink::mojom::ImageCapture> request)
+    : binding_(this, std::move(request)) {}
+
+}  // namespace content
diff --git a/content/browser/media/capture/image_capture_impl.h b/content/browser/media/capture/image_capture_impl.h
new file mode 100644
index 0000000..eef6732
--- /dev/null
+++ b/content/browser/media/capture/image_capture_impl.h
@@ -0,0 +1,35 @@
+// Copyright 2016 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_MEDIA_CAPTURE_IMAGE_CAPTURE_IMPL_H_
+#define CONTENT_BROWSER_MEDIA_CAPTURE_IMAGE_CAPTURE_IMPL_H_
+
+#include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/bindings/string.h"
+#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "third_party/WebKit/public/platform/modules/imagecapture/image_capture.mojom.h"
+
+namespace content {
+
+class ImageCaptureImpl : public blink::mojom::ImageCapture {
+ public:
+  static void Create(
+      mojo::InterfaceRequest<blink::mojom::ImageCapture> request);
+  ~ImageCaptureImpl() override;
+
+  void TakePhoto(const mojo::String& source_id,
+                 const TakePhotoCallback& callback) override;
+
+ private:
+  explicit ImageCaptureImpl(
+      mojo::InterfaceRequest<blink::mojom::ImageCapture> request);
+
+  mojo::StrongBinding<blink::mojom::ImageCapture> binding_;
+
+  DISALLOW_COPY_AND_ASSIGN(ImageCaptureImpl);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_MEDIA_CAPTURE_IMAGE_CAPTURE_IMPL_H_
diff --git a/content/browser/mojo/OWNERS b/content/browser/mojo/OWNERS
new file mode 100644
index 0000000..25fd31a
--- /dev/null
+++ b/content/browser/mojo/OWNERS
@@ -0,0 +1 @@
+rockot@chromium.org
diff --git a/content/browser/mojo/mojo_shell_context.cc b/content/browser/mojo/mojo_shell_context.cc
index 9133df4..b2297da6 100644
--- a/content/browser/mojo/mojo_shell_context.cc
+++ b/content/browser/mojo/mojo_shell_context.cc
@@ -248,10 +248,10 @@
 
   catalog_.reset(new catalog::Catalog(file_task_runner.get(), nullptr,
                                       manifest_provider_.get()));
-  shell_.reset(new shell::Shell(std::move(native_runner_factory),
-                                catalog_->TakeShellClient()));
 
   if (!IsRunningInMojoShell()) {
+    shell_.reset(new shell::Shell(std::move(native_runner_factory),
+                                  catalog_->TakeShellClient()));
     MojoShellConnection::Create(
         shell_->InitInstanceForEmbedder(kBrowserMojoApplicationName),
         false /* is_external */);
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc
index c193c042..b4c286e 100644
--- a/content/browser/renderer_host/compositor_impl_android.cc
+++ b/content/browser/renderer_host/compositor_impl_android.cc
@@ -43,16 +43,15 @@
 #include "cc/surfaces/surface_manager.h"
 #include "cc/trees/layer_tree_host.h"
 #include "cc/trees/layer_tree_settings.h"
+#include "components/display_compositor/compositor_overlay_candidate_validator_android.h"
 #include "components/display_compositor/gl_helper.h"
 #include "content/browser/android/child_process_launcher_android.h"
-#include "content/browser/compositor/browser_compositor_overlay_candidate_validator_android.h"
 #include "content/browser/gpu/browser_gpu_channel_host_factory.h"
 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h"
 #include "content/browser/gpu/compositor_util.h"
 #include "content/browser/gpu/gpu_surface_tracker.h"
 #include "content/browser/renderer_host/render_widget_host_impl.h"
 #include "content/common/gpu/client/context_provider_command_buffer.h"
-#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
 #include "content/common/gpu_process_launch_causes.h"
 #include "content/common/host_shared_bitmap_manager.h"
 #include "content/public/browser/android/compositor.h"
@@ -145,7 +144,8 @@
             base::Bind(&OutputSurfaceWithoutParent::OnSwapBuffersCompleted,
                        base::Unretained(this))),
         overlay_candidate_validator_(
-            new BrowserCompositorOverlayCandidateValidatorAndroid()),
+            new display_compositor::
+                CompositorOverlayCandidateValidatorAndroid()),
         begin_frame_source_(std::move(begin_frame_source)) {
     capabilities_.adjust_deadline_for_parent = false;
     capabilities_.max_frames_pending = kMaxDisplaySwapBuffers;
@@ -571,10 +571,10 @@
 
   scoped_refptr<ContextProviderCommandBuffer> context_provider(
       new ContextProviderCommandBuffer(
-          base::WrapUnique(new WebGraphicsContext3DCommandBufferImpl(
-              surface_handle_, url, gpu_channel_host.get(), attributes,
-              gfx::PreferIntegratedGpu, automatic_flushes)),
-          limits, nullptr, DISPLAY_COMPOSITOR_ONSCREEN_CONTEXT));
+          std::move(gpu_channel_host), surface_handle_, url,
+          gfx::PreferIntegratedGpu, automatic_flushes, limits, attributes,
+          nullptr,
+          command_buffer_metrics::DISPLAY_COMPOSITOR_ONSCREEN_CONTEXT));
   DCHECK(context_provider.get());
 
   std::unique_ptr<cc::OutputSurface> real_output_surface(
diff --git a/content/browser/renderer_host/compositor_impl_android.h b/content/browser/renderer_host/compositor_impl_android.h
index e9b5a477..62ab1d8 100644
--- a/content/browser/renderer_host/compositor_impl_android.h
+++ b/content/browser/renderer_host/compositor_impl_android.h
@@ -13,6 +13,7 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "base/observer_list.h"
 #include "base/timer/timer.h"
 #include "cc/trees/layer_tree_host_client.h"
 #include "cc/trees/layer_tree_host_single_thread_client.h"
diff --git a/content/browser/renderer_host/input/gesture_event_queue.cc b/content/browser/renderer_host/input/gesture_event_queue.cc
index 15cda74..aa88569 100644
--- a/content/browser/renderer_host/input/gesture_event_queue.cc
+++ b/content/browser/renderer_host/input/gesture_event_queue.cc
@@ -186,6 +186,9 @@
     case WebInputEvent::GestureScrollUpdate:
       QueueScrollOrPinchAndForwardIfNecessary(gesture_event);
       return;
+    case WebInputEvent::GestureScrollBegin:
+      if (OnScrollBegin(gesture_event))
+        return;
     default:
       break;
   }
@@ -195,6 +198,25 @@
     client_->SendGestureEventImmediately(gesture_event);
 }
 
+bool GestureEventQueue::OnScrollBegin(
+    const GestureEventWithLatencyInfo& gesture_event) {
+  // If a synthetic scroll begin is encountered, it can cancel out a previous
+  // synthetic scroll end. This allows a later gesture scroll update to coalesce
+  // with the previous one. crbug.com/607340.
+  bool synthetic = gesture_event.event.data.scrollBegin.synthetic;
+  bool have_unsent_events =
+      EventsInFlightCount() < coalesced_gesture_events_.size();
+  if (synthetic && have_unsent_events) {
+    GestureEventWithLatencyInfo* last_event = &coalesced_gesture_events_.back();
+    if (last_event->event.type == WebInputEvent::GestureScrollEnd &&
+        last_event->event.data.scrollEnd.synthetic) {
+      coalesced_gesture_events_.pop_back();
+      return true;
+    }
+  }
+  return false;
+}
+
 void GestureEventQueue::ProcessGestureAck(InputEventAckState ack_result,
                                           WebInputEvent::Type type,
                                           const ui::LatencyInfo& latency) {
diff --git a/content/browser/renderer_host/input/gesture_event_queue.h b/content/browser/renderer_host/input/gesture_event_queue.h
index 41faa36..aa8d7a1 100644
--- a/content/browser/renderer_host/input/gesture_event_queue.h
+++ b/content/browser/renderer_host/input/gesture_event_queue.h
@@ -117,6 +117,8 @@
   friend class GestureEventQueueTest;
   friend class MockRenderWidgetHost;
 
+  bool OnScrollBegin(const GestureEventWithLatencyInfo& gesture_event);
+
   // TODO(mohsen): There are a bunch of ShouldForward.../ShouldDiscard...
   // methods that are getting confusing. This should be somehow fixed. Maybe
   // while refactoring GEQ: http://crbug.com/148443.
diff --git a/content/browser/renderer_host/input/gesture_event_queue_unittest.cc b/content/browser/renderer_host/input/gesture_event_queue_unittest.cc
index 80b0c9b..8071c1e 100644
--- a/content/browser/renderer_host/input/gesture_event_queue_unittest.cc
+++ b/content/browser/renderer_host/input/gesture_event_queue_unittest.cc
@@ -1156,4 +1156,29 @@
   }
 }
 
+TEST_F(GestureEventQueueTest, CoalescesSyntheticScrollBeginEndEvents) {
+  // Test coalescing of only GestureScrollBegin/End events.
+  SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
+                       blink::WebGestureDeviceTouchpad);
+  EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
+  EXPECT_EQ(1U, GestureEventQueueSize());
+
+  WebGestureEvent synthetic_end = SyntheticWebGestureEventBuilder::Build(
+      WebInputEvent::GestureScrollEnd, blink::WebGestureDeviceTouchpad);
+  synthetic_end.data.scrollEnd.synthetic = true;
+
+  SimulateGestureEvent(synthetic_end);
+  EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
+  EXPECT_EQ(2U, GestureEventQueueSize());
+
+  // Synthetic begin will remove the unsent synthetic end.
+  WebGestureEvent synthetic_begin = SyntheticWebGestureEventBuilder::Build(
+      WebInputEvent::GestureScrollBegin, blink::WebGestureDeviceTouchpad);
+  synthetic_begin.data.scrollBegin.synthetic = true;
+
+  SimulateGestureEvent(synthetic_begin);
+  EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
+  EXPECT_EQ(1U, GestureEventQueueSize());
+}
+
 }  // namespace content
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
index 1a1323b..dbc73cf 100644
--- a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
+++ b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
@@ -4,10 +4,16 @@
 
 #include "content/browser/renderer_host/media/media_stream_dispatcher_host.h"
 
+#include <algorithm>
+
+#include "base/command_line.h"
+#include "base/memory/ptr_util.h"
 #include "content/browser/browser_main_loop.h"
+#include "content/browser/renderer_host/media/media_stream_ui_proxy.h"
 #include "content/common/media/media_stream_messages.h"
 #include "content/common/media/media_stream_options.h"
 #include "content/public/browser/render_process_host.h"
+#include "content/public/common/content_switches.h"
 #include "url/gurl.h"
 
 namespace content {
@@ -15,12 +21,14 @@
 MediaStreamDispatcherHost::MediaStreamDispatcherHost(
     int render_process_id,
     const ResourceContext::SaltCallback& salt_callback,
-    MediaStreamManager* media_stream_manager)
+    MediaStreamManager* media_stream_manager,
+    bool use_fake_ui)
     : BrowserMessageFilter(MediaStreamMsgStart),
       render_process_id_(render_process_id),
       salt_callback_(salt_callback),
-      media_stream_manager_(media_stream_manager) {
-}
+      media_stream_manager_(media_stream_manager),
+      use_fake_ui_(use_fake_ui),
+      weak_factory_(this) {}
 
 void MediaStreamDispatcherHost::StreamGenerated(
     int render_frame_id,
@@ -45,7 +53,6 @@
            << ", {page_request_id = " << page_request_id <<  "}"
            << ", { result= " << result << "})";
 
-
   Send(new MediaStreamMsg_StreamGenerationFailed(render_frame_id,
                                                  page_request_id,
                                                  result));
@@ -93,8 +100,16 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DVLOG(1) << "MediaStreamDispatcherHost::DevicesChanged("
            << "{type = " << type << "})";
-  // TODO(guidou): check permissions and forward notifications to renderer.
-  //               crbug.com/388648
+  for (const auto& subscriber : device_change_subscribers_) {
+    std::unique_ptr<MediaStreamUIProxy> ui_proxy = CreateMediaStreamUIProxy();
+    ui_proxy->CheckAccess(
+        subscriber.security_origin, type, render_process_id_,
+        subscriber.render_frame_id,
+        base::Bind(&MediaStreamDispatcherHost::HandleCheckAccessResponse,
+                   weak_factory_.GetWeakPtr(),
+                   base::Passed(std::move(ui_proxy)),
+                   subscriber.render_frame_id));
+  }
 }
 
 bool MediaStreamDispatcherHost::OnMessageReceived(const IPC::Message& message) {
@@ -113,6 +128,10 @@
                         OnOpenDevice)
     IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CloseDevice,
                         OnCloseDevice)
+    IPC_MESSAGE_HANDLER(MediaStreamHostMsg_SubscribeToDeviceChangeNotifications,
+                        OnSubscribeToDeviceChangeNotifications)
+    IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelDeviceChangeNotifications,
+                        OnCancelDeviceChangeNotifications)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
   return handled;
@@ -123,6 +142,8 @@
 
   // Since the IPC sender is gone, close all requesting/requested streams.
   media_stream_manager_->CancelAllRequests(render_process_id_);
+  if (!device_change_subscribers_.empty())
+    media_stream_manager_->CancelDeviceChangeNotifications(this);
 }
 
 MediaStreamDispatcherHost::~MediaStreamDispatcherHost() {
@@ -222,4 +243,61 @@
   media_stream_manager_->CancelRequest(label);
 }
 
+void MediaStreamDispatcherHost::OnSubscribeToDeviceChangeNotifications(
+    int render_frame_id,
+    const url::Origin& security_origin) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  DVLOG(1)
+      << "MediaStreamDispatcherHost::OnSubscribeToDeviceChangeNotifications("
+      << render_frame_id << ", " << security_origin << ")";
+  DCHECK(
+      std::find_if(
+          device_change_subscribers_.begin(), device_change_subscribers_.end(),
+          [render_frame_id](const DeviceChangeSubscriberInfo& subscriber_info) {
+            return subscriber_info.render_frame_id == render_frame_id;
+          }) == device_change_subscribers_.end());
+
+  if (device_change_subscribers_.empty())
+    media_stream_manager_->SubscribeToDeviceChangeNotifications(this);
+
+  device_change_subscribers_.push_back({render_frame_id, security_origin});
+}
+
+void MediaStreamDispatcherHost::OnCancelDeviceChangeNotifications(
+    int render_frame_id) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  DVLOG(1) << "MediaStreamDispatcherHost::CancelDeviceChangeNotifications("
+           << render_frame_id << ")";
+  auto it = std::find_if(
+      device_change_subscribers_.begin(), device_change_subscribers_.end(),
+      [render_frame_id](const DeviceChangeSubscriberInfo& subscriber_info) {
+        return subscriber_info.render_frame_id == render_frame_id;
+      });
+  CHECK(it != device_change_subscribers_.end());
+  device_change_subscribers_.erase(it);
+  if (device_change_subscribers_.empty())
+    media_stream_manager_->CancelDeviceChangeNotifications(this);
+}
+
+std::unique_ptr<MediaStreamUIProxy>
+MediaStreamDispatcherHost::CreateMediaStreamUIProxy() {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  if (use_fake_ui_ ||
+      base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kUseFakeUIForMediaStream)) {
+    return base::WrapUnique(new FakeMediaStreamUIProxy());
+  }
+
+  return MediaStreamUIProxy::Create();
+}
+
+void MediaStreamDispatcherHost::HandleCheckAccessResponse(
+    std::unique_ptr<MediaStreamUIProxy> ui_proxy,
+    int render_frame_id,
+    bool have_access) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  if (have_access)
+    Send(new MediaStreamMsg_DevicesChanged(render_frame_id));
+}
+
 }  // namespace content
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host.h b/content/browser/renderer_host/media/media_stream_dispatcher_host.h
index 65343a3..6a2488d2 100644
--- a/content/browser/renderer_host/media/media_stream_dispatcher_host.h
+++ b/content/browser/renderer_host/media/media_stream_dispatcher_host.h
@@ -8,22 +8,22 @@
 #include <map>
 #include <string>
 #include <utility>
+#include <vector>
 
 #include "base/macros.h"
+#include "base/memory/weak_ptr.h"
 #include "content/browser/renderer_host/media/media_stream_manager.h"
 #include "content/browser/renderer_host/media/media_stream_requester.h"
 #include "content/common/content_export.h"
 #include "content/common/media/media_stream_options.h"
 #include "content/public/browser/browser_message_filter.h"
 #include "content/public/browser/resource_context.h"
-
-namespace url {
-class Origin;
-}
+#include "url/origin.h"
 
 namespace content {
 
 class MediaStreamManager;
+class MediaStreamUIProxy;
 class ResourceContext;
 
 // MediaStreamDispatcherHost is a delegate for Media Stream API messages used by
@@ -32,10 +32,10 @@
 class CONTENT_EXPORT MediaStreamDispatcherHost : public BrowserMessageFilter,
                                                  public MediaStreamRequester {
  public:
-  MediaStreamDispatcherHost(
-      int render_process_id,
-      const ResourceContext::SaltCallback& salt_callback,
-      MediaStreamManager* media_stream_manager);
+  MediaStreamDispatcherHost(int render_process_id,
+                            const ResourceContext::SaltCallback& salt_callback,
+                            MediaStreamManager* media_stream_manager,
+                            bool use_fake_ui = false);
 
   // MediaStreamRequester implementation.
   void StreamGenerated(int render_frame_id,
@@ -97,14 +97,34 @@
   void OnCloseDevice(int render_frame_id,
                      const std::string& label);
 
+  void OnSubscribeToDeviceChangeNotifications(
+      int render_frame_id,
+      const url::Origin& security_origin);
+
+  void OnCancelDeviceChangeNotifications(int render_frame_id);
+
   void StoreRequest(int render_frame_id,
                     int page_request_id,
                     const std::string& label);
 
+  std::unique_ptr<MediaStreamUIProxy> CreateMediaStreamUIProxy();
+  void HandleCheckAccessResponse(std::unique_ptr<MediaStreamUIProxy> ui_proxy,
+                                 int render_frame_id,
+                                 bool have_access);
+
   int render_process_id_;
   ResourceContext::SaltCallback salt_callback_;
   MediaStreamManager* media_stream_manager_;
 
+  struct DeviceChangeSubscriberInfo {
+    int render_frame_id;
+    url::Origin security_origin;
+  };
+  std::vector<DeviceChangeSubscriberInfo> device_change_subscribers_;
+  bool use_fake_ui_;
+
+  base::WeakPtrFactory<MediaStreamDispatcherHost> weak_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(MediaStreamDispatcherHost);
 };
 
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
index 8e435a7..6ef2152 100644
--- a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
+++ b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
@@ -15,6 +15,7 @@
 #include "base/location.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
+#include "base/system_monitor/system_monitor.h"
 #include "base/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "content/browser/browser_thread_impl.h"
@@ -65,7 +66,7 @@
       const ResourceContext::SaltCallback salt_callback,
       const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
       MediaStreamManager* manager)
-      : MediaStreamDispatcherHost(kProcessId, salt_callback, manager),
+      : MediaStreamDispatcherHost(kProcessId, salt_callback, manager, true),
         task_runner_(task_runner),
         current_ipc_(NULL) {}
 
@@ -116,6 +117,20 @@
         render_frame_id, page_request_id, type, security_origin);
   }
 
+  void OnCancelEnumerateDevices(int render_frame_id, int page_request_id) {
+    MediaStreamDispatcherHost::OnCancelEnumerateDevices(render_frame_id,
+                                                        page_request_id);
+  }
+
+  void OnSubscribeToDeviceChangeNotifications(
+      int render_frame_id,
+      const url::Origin& security_origin,
+      const base::Closure& quit_closure) {
+    quit_closures_.push(quit_closure);
+    MediaStreamDispatcherHost::OnSubscribeToDeviceChangeNotifications(
+        render_frame_id, security_origin);
+  }
+
   std::string label_;
   StreamDeviceInfoArray audio_devices_;
   StreamDeviceInfoArray video_devices_;
@@ -132,8 +147,8 @@
     CHECK(message);
     current_ipc_ = message;
 
-    // In this method we dispatch the messages to the according handlers as if
-    // we are the renderer.
+    // In this method we dispatch the messages to the corresponding handlers as
+    // if we are the renderer.
     bool handled = true;
     IPC_BEGIN_MESSAGE_MAP(MockMediaStreamDispatcherHost, *message)
       IPC_MESSAGE_HANDLER(MediaStreamMsg_StreamGenerated,
@@ -143,6 +158,7 @@
       IPC_MESSAGE_HANDLER(MediaStreamMsg_DeviceStopped, OnDeviceStoppedInternal)
       IPC_MESSAGE_HANDLER(MediaStreamMsg_DeviceOpened, OnDeviceOpenedInternal)
       IPC_MESSAGE_HANDLER(MediaStreamMsg_DevicesEnumerated, OnDevicesEnumerated)
+      IPC_MESSAGE_HANDLER(MediaStreamMsg_DevicesChanged, OnDevicesChanged)
       IPC_MESSAGE_UNHANDLED(handled = false)
     IPC_END_MESSAGE_MAP()
     EXPECT_TRUE(handled);
@@ -211,6 +227,12 @@
     enumerated_devices_ = devices;
   }
 
+  void OnDevicesChanged() {
+    base::Closure quit_closure = quit_closures_.front();
+    quit_closures_.pop();
+    task_runner_->PostTask(FROM_HERE, base::ResetAndReturn(&quit_closure));
+  }
+
   const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
   IPC::Message* current_ipc_;
   std::queue<base::Closure> quit_closures_;
@@ -351,6 +373,20 @@
     ASSERT_FALSE(host_->enumerated_devices_.empty());
     EXPECT_FALSE(DoesContainRawIds(host_->enumerated_devices_));
     EXPECT_TRUE(DoesEveryDeviceMapToRawId(host_->enumerated_devices_, origin_));
+    // Enumeration requests must be cancelled manually.
+    host_->OnCancelEnumerateDevices(render_frame_id, page_request_id);
+  }
+
+  void SubscribeToDeviceChangeNotificationsAndWaitForNotification(
+      int render_frame_id) {
+    base::RunLoop run_loop;
+    host_->OnSubscribeToDeviceChangeNotifications(render_frame_id, origin_,
+                                                  run_loop.QuitClosure());
+    // Simulate a change in the set of devices.
+    video_capture_device_factory_->set_number_of_devices(5);
+    media_stream_manager_->OnDevicesChanged(
+        base::SystemMonitor::DEVTYPE_VIDEO_CAPTURE);
+    run_loop.Run();
   }
 
   bool DoesContainRawIds(const StreamDeviceInfoArray& devices) {
@@ -916,4 +952,12 @@
   EXPECT_TRUE(DoesNotContainLabels(host_->enumerated_devices_));
 }
 
+TEST_F(MediaStreamDispatcherHostTest, DeviceChangeNotification) {
+  SetupFakeUI(false);
+  // warm up the cache
+  EnumerateDevicesAndWaitForResult(kRenderId, kPageRequestId,
+                                   MEDIA_DEVICE_VIDEO_CAPTURE);
+  SubscribeToDeviceChangeNotificationsAndWaitForNotification(kRenderId);
+}
+
 };  // namespace content
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc
index 1882b0fa..e8c23ab 100644
--- a/content/browser/renderer_host/media/media_stream_manager.cc
+++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -2095,7 +2095,7 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   auto it = std::find(device_change_subscribers_.begin(),
                       device_change_subscribers_.end(), subscriber);
-  DCHECK(it != device_change_subscribers_.end());
+  CHECK(it != device_change_subscribers_.end());
   device_change_subscribers_.erase(it);
 }
 
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 7592d3f8..549f7d82 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -26,7 +26,6 @@
 #include "base/macros.h"
 #include "base/memory/shared_memory.h"
 #include "base/memory/shared_memory_handle.h"
-#include "base/metrics/field_trial.h"
 #include "base/metrics/histogram.h"
 #include "base/metrics/persistent_histogram_allocator.h"
 #include "base/metrics/persistent_memory_allocator.h"
@@ -80,6 +79,7 @@
 #include "content/browser/loader/resource_message_filter.h"
 #include "content/browser/loader/resource_scheduler_filter.h"
 #include "content/browser/media/capture/audio_mirroring_manager.h"
+#include "content/browser/media/capture/image_capture_impl.h"
 #include "content/browser/media/media_internals.h"
 #include "content/browser/media/midi_host.h"
 #include "content/browser/memory/memory_message_filter.h"
@@ -446,24 +446,6 @@
   return str;
 }
 
-// Copies kEnableFeatures and kDisableFeatures to the renderer command line.
-// Generates them from the FeatureList override state, to take into account
-// overrides from FieldTrials.
-void CopyEnableDisableFeatureFlagsToRenderer(base::CommandLine* renderer_cmd) {
-  std::string enabled_features;
-  std::string disabled_features;
-  base::FeatureList::GetInstance()->GetFeatureOverrides(&enabled_features,
-                                                        &disabled_features);
-  if (!enabled_features.empty()) {
-    renderer_cmd->AppendSwitchASCII(switches::kEnableFeatures,
-                                    enabled_features);
-  }
-  if (!disabled_features.empty()) {
-    renderer_cmd->AppendSwitchASCII(switches::kDisableFeatures,
-                                    disabled_features);
-  }
-}
-
 }  // namespace
 
 RendererMainThreadFactoryFunction g_renderer_main_thread_factory = NULL;
@@ -800,22 +782,20 @@
     const std::string& channel_id) {
   scoped_refptr<base::SingleThreadTaskRunner> runner =
       BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO);
-  if (ShouldUseMojoChannel()) {
-    VLOG(1) << "Mojo Channel is enabled on host";
-    mojo_channel_token_ = mojo::edk::GenerateRandomToken();
-    mojo::ScopedMessagePipeHandle handle =
-        mojo::edk::CreateParentMessagePipe(mojo_channel_token_);
+  mojo_channel_token_ = mojo::edk::GenerateRandomToken();
+  mojo::ScopedMessagePipeHandle handle =
+      mojo::edk::CreateParentMessagePipe(mojo_channel_token_);
 
-    // Do NOT expand ifdef or run time condition checks here! Synchronous
-    // IPCs from browser process are banned. It is only narrowly allowed
-    // for Android WebView to maintain backward compatibility.
-    // See crbug.com/526842 for details.
+  // Do NOT expand ifdef or run time condition checks here! Synchronous
+  // IPCs from browser process are banned. It is only narrowly allowed
+  // for Android WebView to maintain backward compatibility.
+  // See crbug.com/526842 for details.
 #if defined(OS_ANDROID)
-    if (GetContentClient()->UsingSynchronousCompositing()) {
-      return IPC::SyncChannel::Create(
-          IPC::ChannelMojo::CreateServerFactory(std::move(handle)), this,
-          runner.get(), true, &never_signaled_);
-    }
+  if (GetContentClient()->UsingSynchronousCompositing()) {
+    return IPC::SyncChannel::Create(
+        IPC::ChannelMojo::CreateServerFactory(std::move(handle)), this,
+        runner.get(), true, &never_signaled_);
+  }
 #endif  // OS_ANDROID
 
   std::unique_ptr<IPC::ChannelProxy> channel(
@@ -827,25 +807,6 @@
 #endif
   channel->Init(IPC::ChannelMojo::CreateServerFactory(std::move(handle)), true);
   return channel;
-  }
-
-    // Do NOT expand ifdef or run time condition checks here! See comment above.
-#if defined(OS_ANDROID)
-  if (GetContentClient()->UsingSynchronousCompositing()) {
-    return IPC::SyncChannel::Create(channel_id, IPC::Channel::MODE_SERVER, this,
-                                    runner.get(), true, &never_signaled_);
-  }
-#endif  // OS_ANDROID
-
-  std::unique_ptr<IPC::ChannelProxy> channel(
-      new IPC::ChannelProxy(this, runner.get()));
-#if USE_ATTACHMENT_BROKER
-  IPC::AttachmentBroker::GetGlobal()->RegisterCommunicationChannel(
-      channel.get(), content::BrowserThread::GetMessageLoopProxyForThread(
-      content::BrowserThread::IO));
-#endif
-  channel->Init(channel_id, IPC::Channel::MODE_SERVER, true);
-  return channel;
 }
 
 void RenderProcessHostImpl::CreateMessageFilters() {
@@ -1072,6 +1033,10 @@
       base::Bind(&PermissionServiceContext::CreateService,
                  base::Unretained(permission_service_context_.get())));
 
+  // TODO(mcasas): finalize arguments.
+  mojo_application_host_->service_registry()->AddService(
+      base::Bind(&ImageCaptureImpl::Create));
+
   mojo_application_host_->service_registry()->AddService(base::Bind(
       &BackgroundSyncContextImpl::CreateService,
       base::Unretained(storage_partition_impl_->GetBackgroundSyncContext())));
@@ -1321,16 +1286,6 @@
       GetContentClient()->browser()->GetApplicationLocale();
   command_line->AppendSwitchASCII(switches::kLang, locale);
 
-  // If we run base::FieldTrials, we want to pass to their state to the
-  // renderer so that it can act in accordance with each state, or record
-  // histograms relating to the base::FieldTrial states.
-  std::string field_trial_states;
-  base::FieldTrialList::AllStatesToString(&field_trial_states);
-  if (!field_trial_states.empty()) {
-    command_line->AppendSwitchASCII(switches::kForceFieldTrials,
-                                    field_trial_states);
-  }
-
   GetContentClient()->browser()->AppendExtraCommandLineSwitches(command_line,
                                                                 GetID());
 
@@ -1425,7 +1380,6 @@
     switches::kEnableLinkDisambiguationPopup,
     switches::kEnableLowResTiling,
     switches::kEnableMediaSuspend,
-    switches::kEnableMojoChannel,
     switches::kEnableInbandTextTracks,
     switches::kEnableLCDText,
     switches::kEnableLogging,
@@ -1558,7 +1512,7 @@
   renderer_cmd->CopySwitchesFrom(browser_cmd, kSwitchNames,
                                  arraysize(kSwitchNames));
 
-  CopyEnableDisableFeatureFlagsToRenderer(renderer_cmd);
+  BrowserChildProcessHostImpl::CopyFeatureAndFieldTrialFlags(renderer_cmd);
 
   if (browser_cmd.HasSwitch(switches::kTraceStartup) &&
       BrowserMainLoop::GetInstance()->is_tracing_startup_for_duration()) {
@@ -2612,15 +2566,15 @@
 #endif
 }
 
-void RenderProcessHostImpl::OnProcessLaunchFailed() {
+void RenderProcessHostImpl::OnProcessLaunchFailed(int error_code) {
   // If this object will be destructed soon, then observers have already been
   // sent a RenderProcessHostDestroyed notification, and we must observe our
   // contract that says that will be the last call.
   if (deleting_soon_)
     return;
 
-  // TODO(wfh): Fill in the real error code here see crbug.com/526198.
-  RendererClosedDetails details{base::TERMINATION_STATUS_LAUNCH_FAILED, -1};
+  RendererClosedDetails details{base::TERMINATION_STATUS_LAUNCH_FAILED,
+                                error_code};
   ProcessDied(true, &details);
 }
 
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index f5646797..d34b495 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -179,7 +179,7 @@
 
   // ChildProcessLauncher::Client implementation.
   void OnProcessLaunched() override;
-  void OnProcessLaunchFailed() override;
+  void OnProcessLaunchFailed(int error_code) override;
 
   scoped_refptr<AudioRendererHost> audio_renderer_host() const;
 
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index 9d7b00a..109b6bf 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -451,12 +451,12 @@
   prefs.user_gesture_required_for_media_playback = !command_line.HasSwitch(
       switches::kDisableGestureRequirementForMediaPlayback) &&
           (autoplay_group_name.empty() || autoplay_group_name != "Enabled");
+#endif
 
   // Handle autoplay gesture override experiment.
   // Note that anything but a well-formed string turns the experiment off.
   prefs.autoplay_experiment_mode = base::FieldTrialList::FindFullName(
       "MediaElementGestureOverrideExperiment");
-#endif
 
   prefs.touch_enabled = ui::AreTouchEventsEnabled();
   prefs.device_supports_touch = prefs.touch_enabled &&
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index 0868cb8..88a90d8 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -57,7 +57,6 @@
 #include "content/browser/renderer_host/render_process_host_impl.h"
 #include "content/browser/renderer_host/render_view_host_impl.h"
 #include "content/browser/renderer_host/render_widget_host_impl.h"
-#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
 #include "content/common/gpu_host_messages.h"
 #include "content/common/gpu_process_launch_causes.h"
 #include "content/common/input/did_overscroll_params.h"
@@ -186,14 +185,10 @@
   bool automatic_flushes = false;
   GURL url("chrome://gpu/RenderWidgetHostViewAndroid");
 
-  std::unique_ptr<WebGraphicsContext3DCommandBufferImpl> context(
-      new WebGraphicsContext3DCommandBufferImpl(
-          gpu::kNullSurfaceHandle,  // offscreen
-          url, gpu_channel_host.get(), attributes, gfx::PreferIntegratedGpu,
-          automatic_flushes));
-  provider_ =
-      new ContextProviderCommandBuffer(std::move(context), limits, nullptr,
-                                       BROWSER_OFFSCREEN_MAINTHREAD_CONTEXT);
+  provider_ = new ContextProviderCommandBuffer(
+      std::move(gpu_channel_host), gpu::kNullSurfaceHandle, url,
+      gfx::PreferIntegratedGpu, automatic_flushes, limits, attributes, nullptr,
+      command_buffer_metrics::BROWSER_OFFSCREEN_MAINTHREAD_CONTEXT);
   if (!provider_->BindToCurrentThread())
     return;
   provider_->ContextGL()->TraceBeginCHROMIUM(
diff --git a/content/browser/utility_process_host_impl.cc b/content/browser/utility_process_host_impl.cc
index c025a4a..4a05b3f21 100644
--- a/content/browser/utility_process_host_impl.cc
+++ b/content/browser/utility_process_host_impl.cc
@@ -255,7 +255,7 @@
 
   std::string channel_id = process_->GetHost()->CreateChannel();
   if (channel_id.empty()) {
-    NotifyAndDelete();
+    NotifyAndDelete(LAUNCH_RESULT_FAILURE);
     return false;
   }
 
@@ -374,14 +374,15 @@
   return true;
 }
 
-void UtilityProcessHostImpl::OnProcessLaunchFailed() {
+void UtilityProcessHostImpl::OnProcessLaunchFailed(int error_code) {
   if (!client_.get())
     return;
 
   client_task_runner_->PostTask(
       FROM_HERE,
       base::Bind(&UtilityProcessHostClient::OnProcessLaunchFailed,
-                 client_.get()));
+                 client_.get(),
+                 error_code));
 }
 
 void UtilityProcessHostImpl::OnProcessCrashed(int exit_code) {
@@ -394,20 +395,22 @@
             exit_code));
 }
 
-void UtilityProcessHostImpl::NotifyAndDelete() {
+void UtilityProcessHostImpl::NotifyAndDelete(int error_code) {
   BrowserThread::PostTask(
       BrowserThread::IO, FROM_HERE,
       base::Bind(&UtilityProcessHostImpl::NotifyLaunchFailedAndDelete,
-                 weak_ptr_factory_.GetWeakPtr()));
+                 weak_ptr_factory_.GetWeakPtr(),
+                 error_code));
 }
 
 // static
 void UtilityProcessHostImpl::NotifyLaunchFailedAndDelete(
-    base::WeakPtr<UtilityProcessHostImpl> host) {
+    base::WeakPtr<UtilityProcessHostImpl> host,
+    int error_code) {
   if (!host)
     return;
 
-  host->OnProcessLaunchFailed();
+  host->OnProcessLaunchFailed(error_code);
   delete host.get();
 }
 
diff --git a/content/browser/utility_process_host_impl.h b/content/browser/utility_process_host_impl.h
index e92d3f2..a24104d 100644
--- a/content/browser/utility_process_host_impl.h
+++ b/content/browser/utility_process_host_impl.h
@@ -75,15 +75,16 @@
 
   // BrowserChildProcessHost:
   bool OnMessageReceived(const IPC::Message& message) override;
-  void OnProcessLaunchFailed() override;
+  void OnProcessLaunchFailed(int error_code) override;
   void OnProcessCrashed(int exit_code) override;
 
   // Cleans up |this| as a result of a failed Start().
-  void NotifyAndDelete();
+  void NotifyAndDelete(int error_code);
 
   // Notifies the client that the launch failed and deletes |host|.
   static void NotifyLaunchFailedAndDelete(
-      base::WeakPtr<UtilityProcessHostImpl> host);
+      base::WeakPtr<UtilityProcessHostImpl> host,
+      int error_code);
 
   // A pointer to our client interface, who will be informed of progress.
   scoped_refptr<UtilityProcessHostClient> client_;
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 45028e9c..bb4128c8 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -4242,11 +4242,6 @@
     delegate_->CloseContents(this);
 }
 
-void WebContentsImpl::SwappedOut(RenderFrameHost* rfh) {
-  if (delegate_ && rfh->GetRenderViewHost() == GetRenderViewHost())
-    delegate_->SwappedOut(this);
-}
-
 void WebContentsImpl::RequestMove(const gfx::Rect& new_bounds) {
   if (delegate_ && delegate_->IsPopupOrPanel(this))
     delegate_->MoveContents(this, new_bounds);
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index f15c174..80ab581 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -422,7 +422,6 @@
   const GURL& GetMainFrameLastCommittedURL() const override;
   void RenderFrameCreated(RenderFrameHost* render_frame_host) override;
   void RenderFrameDeleted(RenderFrameHost* render_frame_host) override;
-  void SwappedOut(RenderFrameHost* render_frame_host) override;
   void ShowContextMenu(RenderFrameHost* render_frame_host,
                        const ContextMenuParams& params) override;
   void RunJavaScriptMessage(RenderFrameHost* render_frame_host,
diff --git a/content/child/BUILD.gn b/content/child/BUILD.gn
index 5c78877..e47d003 100644
--- a/content/child/BUILD.gn
+++ b/content/child/BUILD.gn
@@ -45,7 +45,11 @@
     "//content/app/resources",
     "//content/app/strings",
     "//content/common",
+    "//content/public/common:common_sources",
     "//crypto:platform",
+    "//gpu/command_buffer/client",
+    "//ipc/mojo",
+    "//media",
     "//mojo/common",
     "//net",
     "//services/shell/public/interfaces",
@@ -60,6 +64,7 @@
     "//ui/events/gestures/blink",
     "//ui/gfx",
     "//ui/gfx/geometry",
+    "//ui/gl",
     "//ui/native_theme",
     "//url",
   ]
@@ -76,9 +81,15 @@
   }
 
   if (enable_plugins) {
-    deps += [ "//ppapi/proxy" ]
+    deps += [
+      "//ppapi/proxy",
+      "//ppapi/shared_impl",
+    ]
   } else {
-    sources -= [ "browser_font_resource_trusted.cc" ]
+    sources -= [
+      "browser_font_resource_trusted.cc",
+      "browser_font_resource_trusted.h",
+    ]
   }
 
   configs += [
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index 8329118d..b152303 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -39,6 +39,7 @@
     "//base/third_party/dynamic_annotations",
     "//build/util:webkit_version",
     "//cc",
+    "//cc/blink",
     "//cc/surfaces",
     "//components/mus/public/interfaces",
     "//components/tracing",
@@ -71,7 +72,7 @@
     "//services/shell/runner/common",
     "//skia",
     "//storage/common",
-    "//third_party/WebKit/public:blink_minimal",
+    "//third_party/WebKit/public:blink",
     "//third_party/boringssl",
     "//third_party/icu",
     "//third_party/libjingle",
diff --git a/content/common/DEPS b/content/common/DEPS
index 8bc0e489..1eaa4ad 100644
--- a/content/common/DEPS
+++ b/content/common/DEPS
@@ -24,7 +24,6 @@
   "+third_party/WebKit/public/platform/WebScreenInfo.h",
   "+third_party/WebKit/public/platform/WebScrollbarButtonsPlacement.h",
   "+third_party/WebKit/public/platform/WebStorageArea.h",
-  "+third_party/WebKit/public/platform/WebString.h",
   "+third_party/WebKit/public/platform/linux/WebFallbackFont.h",
   "+third_party/WebKit/public/platform/linux/WebFontRenderStyle.h",
   "+third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothError.h",
diff --git a/content/common/bluetooth/bluetooth_device.cc b/content/common/bluetooth/bluetooth_device.cc
index e89e019..c2b3bcb 100644
--- a/content/common/bluetooth/bluetooth_device.cc
+++ b/content/common/bluetooth/bluetooth_device.cc
@@ -13,12 +13,6 @@
       name(base::string16()),
       tx_power(device::BluetoothDevice::kUnknownPower),
       rssi(device::BluetoothDevice::kUnknownPower),
-      device_class(0),
-      vendor_id_source(
-          device::BluetoothDevice::VendorIDSource::VENDOR_ID_UNKNOWN),
-      vendor_id(0),
-      product_id(0),
-      product_version(0),
       uuids() {}
 
 BluetoothDevice::BluetoothDevice(
@@ -26,21 +20,11 @@
     const base::string16& name,
     int8_t tx_power,
     int8_t rssi,
-    uint32_t device_class,
-    device::BluetoothDevice::VendorIDSource vendor_id_source,
-    uint16_t vendor_id,
-    uint16_t product_id,
-    uint16_t product_version,
     const std::vector<std::string>& uuids)
     : id(id),
       name(name),
       tx_power(tx_power),
       rssi(rssi),
-      device_class(device_class),
-      vendor_id_source(vendor_id_source),
-      vendor_id(vendor_id),
-      product_id(product_id),
-      product_version(product_version),
       uuids(uuids) {}
 
 BluetoothDevice::~BluetoothDevice() {
diff --git a/content/common/bluetooth/bluetooth_device.h b/content/common/bluetooth/bluetooth_device.h
index 7350efc3..535f13c 100644
--- a/content/common/bluetooth/bluetooth_device.h
+++ b/content/common/bluetooth/bluetooth_device.h
@@ -23,11 +23,6 @@
                   const base::string16& name,
                   int8_t tx_power,
                   int8_t rssi,
-                  uint32_t device_class,
-                  device::BluetoothDevice::VendorIDSource vendor_id_source,
-                  uint16_t vendor_id,
-                  uint16_t product_id,
-                  uint16_t product_version,
                   const std::vector<std::string>& uuids);
   ~BluetoothDevice();
 
@@ -45,11 +40,6 @@
   base::string16 name;
   int8_t tx_power;
   int8_t rssi;
-  uint32_t device_class;
-  device::BluetoothDevice::VendorIDSource vendor_id_source;
-  uint16_t vendor_id;
-  uint16_t product_id;
-  uint16_t product_version;
   std::vector<std::string> uuids;  // 128bit UUIDs with dashes. 36 chars.
 };
 
diff --git a/content/common/bluetooth/bluetooth_messages.h b/content/common/bluetooth/bluetooth_messages.h
index 7613523..7d9112b 100644
--- a/content/common/bluetooth/bluetooth_messages.h
+++ b/content/common/bluetooth/bluetooth_messages.h
@@ -88,20 +88,11 @@
 
 #define IPC_MESSAGE_START BluetoothMsgStart
 
-IPC_ENUM_TRAITS_MAX_VALUE(
-    device::BluetoothDevice::VendorIDSource,
-    device::BluetoothDevice::VendorIDSource::VENDOR_ID_MAX_VALUE)
-
 IPC_STRUCT_TRAITS_BEGIN(content::BluetoothDevice)
   IPC_STRUCT_TRAITS_MEMBER(id)
   IPC_STRUCT_TRAITS_MEMBER(name)
   IPC_STRUCT_TRAITS_MEMBER(tx_power)
   IPC_STRUCT_TRAITS_MEMBER(rssi)
-  IPC_STRUCT_TRAITS_MEMBER(device_class)
-  IPC_STRUCT_TRAITS_MEMBER(vendor_id_source)
-  IPC_STRUCT_TRAITS_MEMBER(vendor_id)
-  IPC_STRUCT_TRAITS_MEMBER(product_id)
-  IPC_STRUCT_TRAITS_MEMBER(product_version)
   IPC_STRUCT_TRAITS_MEMBER(uuids)
 IPC_STRUCT_TRAITS_END()
 
diff --git a/content/common/gpu/client/DEPS b/content/common/gpu/client/DEPS
deleted file mode 100644
index 409909c..0000000
--- a/content/common/gpu/client/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-  "+cc/blink",
-]
diff --git a/content/common/gpu/client/command_buffer_metrics.cc b/content/common/gpu/client/command_buffer_metrics.cc
index 2ff84f8b..985cd80 100644
--- a/content/common/gpu/client/command_buffer_metrics.cc
+++ b/content/common/gpu/client/command_buffer_metrics.cc
@@ -7,6 +7,7 @@
 #include "base/metrics/histogram.h"
 
 namespace content {
+namespace command_buffer_metrics {
 
 namespace {
 
@@ -72,7 +73,7 @@
   return CONTEXT_LOST_UNKNOWN;
 }
 
-void RecordContextLost(CommandBufferContextType type,
+void RecordContextLost(ContextType type,
                        CommandBufferContextLostReason reason) {
   switch (type) {
     case DISPLAY_COMPOSITOR_ONSCREEN_CONTEXT:
@@ -120,7 +121,7 @@
 
 }  // anonymous namespace
 
-std::string CommandBufferContextTypeToString(CommandBufferContextType type) {
+std::string ContextTypeToString(ContextType type) {
   switch (type) {
     case OFFSCREEN_CONTEXT_FOR_TESTING:
       return "Context-For-Testing";
@@ -148,11 +149,11 @@
   }
 }
 
-void UmaRecordContextInitFailed(CommandBufferContextType type) {
+void UmaRecordContextInitFailed(ContextType type) {
   RecordContextLost(type, CONTEXT_INIT_FAILED);
 }
 
-void UmaRecordContextLost(CommandBufferContextType type,
+void UmaRecordContextLost(ContextType type,
                           gpu::error::Error error,
                           gpu::error::ContextLostReason reason) {
   CommandBufferContextLostReason converted_reason =
@@ -160,4 +161,5 @@
   RecordContextLost(type, converted_reason);
 }
 
+}  // namespace command_buffer_metrics
 }  // namespace content
diff --git a/content/common/gpu/client/command_buffer_metrics.h b/content/common/gpu/client/command_buffer_metrics.h
index 0cd62bb..f354f5c 100644
--- a/content/common/gpu/client/command_buffer_metrics.h
+++ b/content/common/gpu/client/command_buffer_metrics.h
@@ -10,8 +10,9 @@
 #include "gpu/command_buffer/common/constants.h"
 
 namespace content {
+namespace command_buffer_metrics {
 
-enum CommandBufferContextType {
+enum ContextType {
   DISPLAY_COMPOSITOR_ONSCREEN_CONTEXT,
   BROWSER_OFFSCREEN_MAINTHREAD_CONTEXT,
   BROWSER_WORKER_CONTEXT,
@@ -25,14 +26,15 @@
   OFFSCREEN_CONTEXT_FOR_TESTING = CONTEXT_TYPE_UNKNOWN,
 };
 
-std::string CommandBufferContextTypeToString(CommandBufferContextType type);
+std::string ContextTypeToString(ContextType type);
 
-void UmaRecordContextInitFailed(CommandBufferContextType type);
+void UmaRecordContextInitFailed(ContextType type);
 
-void UmaRecordContextLost(CommandBufferContextType type,
+void UmaRecordContextLost(ContextType type,
                           gpu::error::Error error,
                           gpu::error::ContextLostReason reason);
 
+}  // namespace command_buffer_metrics
 }  // namespace content
 
 #endif  // CONTENT_COMMON_GPU_CLIENT_COMMAND_BUFFER_METRICS_H_
diff --git a/content/common/gpu/client/context_provider_command_buffer.cc b/content/common/gpu/client/context_provider_command_buffer.cc
index 9636ffe..7c5e7fb 100644
--- a/content/common/gpu/client/context_provider_command_buffer.cc
+++ b/content/common/gpu/client/context_provider_command_buffer.cc
@@ -15,50 +15,66 @@
 #include "base/command_line.h"
 #include "base/strings/stringprintf.h"
 #include "cc/output/managed_memory_policy.h"
+#include "content/common/gpu/client/command_buffer_metrics.h"
+#include "gpu/command_buffer/client/gles2_cmd_helper.h"
 #include "gpu/command_buffer/client/gles2_implementation.h"
 #include "gpu/command_buffer/client/gles2_trace_implementation.h"
 #include "gpu/command_buffer/client/gpu_switches.h"
+#include "gpu/command_buffer/client/transfer_buffer.h"
+#include "gpu/command_buffer/common/constants.h"
+#include "gpu/ipc/client/command_buffer_proxy_impl.h"
+#include "gpu/ipc/client/gpu_channel_host.h"
 #include "gpu/skia_bindings/grcontext_for_gles2_interface.h"
 #include "third_party/skia/include/gpu/GrContext.h"
 
+namespace {
+
+// Similar to base::AutoReset but it sets the variable to the new value
+// when it is destroyed. Use Reset() to cancel setting the variable.
+class AutoSet {
+ public:
+  AutoSet(bool* b, bool set) : b_(b), set_(set) {}
+  ~AutoSet() {
+    if (b_)
+      *b_ = set_;
+  }
+  // Stops us from setting b_ on destruction.
+  void Reset() { b_ = nullptr; }
+
+ private:
+  bool* b_;
+  const bool set_;
+};
+}
+
 namespace content {
 
 ContextProviderCommandBuffer::SharedProviders::SharedProviders() = default;
 ContextProviderCommandBuffer::SharedProviders::~SharedProviders() = default;
 
-class ContextProviderCommandBuffer::LostContextCallbackProxy
-    : public WebGraphicsContext3DCommandBufferImpl::
-          WebGraphicsContextLostCallback {
- public:
-  explicit LostContextCallbackProxy(ContextProviderCommandBuffer* provider)
-      : provider_(provider) {
-    provider_->context3d_->SetContextLostCallback(this);
-  }
-
-  ~LostContextCallbackProxy() override {
-    provider_->context3d_->SetContextLostCallback(nullptr);
-  }
-
-  void onContextLost() override { provider_->OnLostContext(); }
-
- private:
-  ContextProviderCommandBuffer* provider_;
-};
-
 ContextProviderCommandBuffer::ContextProviderCommandBuffer(
-    std::unique_ptr<WebGraphicsContext3DCommandBufferImpl> context3d,
+    scoped_refptr<gpu::GpuChannelHost> channel,
+    gpu::SurfaceHandle surface_handle,
+    const GURL& active_url,
+    gfx::GpuPreference gpu_preference,
+    bool automatic_flushes,
     const gpu::SharedMemoryLimits& memory_limits,
+    const gpu::gles2::ContextCreationAttribHelper& attributes,
     ContextProviderCommandBuffer* shared_context_provider,
-    CommandBufferContextType type)
-    : shared_providers_(shared_context_provider
+    command_buffer_metrics::ContextType type)
+    : surface_handle_(surface_handle),
+      active_url_(active_url),
+      gpu_preference_(gpu_preference),
+      automatic_flushes_(automatic_flushes),
+      memory_limits_(memory_limits),
+      attributes_(attributes),
+      context_type_(type),
+      shared_providers_(shared_context_provider
                             ? shared_context_provider->shared_providers_
                             : new SharedProviders),
-      context3d_(std::move(context3d)),
-      memory_limits_(memory_limits),
-      context_type_(type),
-      debug_name_(CommandBufferContextTypeToString(type)) {
+      channel_(std::move(channel)) {
   DCHECK(main_thread_checker_.CalledOnValidThread());
-  DCHECK(context3d_);
+  DCHECK(channel_);
   context_thread_checker_.DetachFromThread();
 }
 
@@ -74,30 +90,31 @@
       shared_providers_->list.erase(it);
   }
 
-  // Destroy references to the context3d_ before leaking it.
-  // TODO(danakj): Delete this.
-  if (context3d_->GetCommandBufferProxy())
-    context3d_->GetCommandBufferProxy()->SetLock(nullptr);
-
-  if (lost_context_callback_proxy_) {
+  if (bind_succeeded_) {
+    // Clear the lock to avoid DCHECKs that the lock is being held during
+    // shutdown.
+    command_buffer_->SetLock(nullptr);
     // Disconnect lost callbacks during destruction.
-    lost_context_callback_proxy_.reset();
+    gles2_impl_->SetLostContextCallback(base::Closure());
   }
 }
 
 gpu::CommandBufferProxyImpl*
 ContextProviderCommandBuffer::GetCommandBufferProxy() {
-  return context3d_->GetCommandBufferProxy();
+  return command_buffer_.get();
 }
 
 bool ContextProviderCommandBuffer::BindToCurrentThread() {
   // This is called on the thread the context will be used.
   DCHECK(context_thread_checker_.CalledOnValidThread());
 
-  if (lost_context_callback_proxy_)
+  if (bind_failed_)
+    return false;
+  if (bind_succeeded_)
     return true;
 
-  context3d_->SetContextType(context_type_);
+  // Early outs should report failure.
+  AutoSet set_bind_failed(&bind_failed_, true);
 
   // It's possible to be running BindToCurrentThread on two contexts
   // on different threads at the same time, but which will be in the same share
@@ -113,15 +130,64 @@
 
     if (!shared_providers_->list.empty()) {
       shared_context_provider = shared_providers_->list.front();
-      shared_command_buffer =
-          shared_context_provider->context3d_->GetCommandBufferProxy();
-      share_group = shared_context_provider->context3d_->GetImplementation()
-                        ->share_group();
+      shared_command_buffer = shared_context_provider->command_buffer_.get();
+      share_group = shared_context_provider->gles2_impl_->share_group();
+      DCHECK_EQ(!!shared_command_buffer, !!share_group);
     }
 
-    if (!context3d_->InitializeOnCurrentThread(
-            memory_limits_, shared_command_buffer, std::move(share_group)))
+    DCHECK(attributes_.buffer_preserved);
+    std::vector<int32_t> serialized_attributes;
+    attributes_.Serialize(&serialized_attributes);
+
+    // This command buffer is a client-side proxy to the command buffer in the
+    // GPU process.
+    command_buffer_ = channel_->CreateCommandBuffer(
+        surface_handle_, gfx::Size(), shared_command_buffer,
+        gpu::GpuChannelHost::kDefaultStreamId,
+        gpu::GpuChannelHost::kDefaultStreamPriority, serialized_attributes,
+        active_url_, gpu_preference_);
+    // The command buffer takes ownership of the |channel_|, so no need to keep
+    // a reference around here.
+    channel_ = nullptr;
+    if (!command_buffer_) {
+      DLOG(ERROR) << "GpuChannelHost failed to create command buffer.";
+      command_buffer_metrics::UmaRecordContextInitFailed(context_type_);
       return false;
+    }
+
+    // The GLES2 helper writes the command buffer protocol.
+    gles2_helper_.reset(new gpu::gles2::GLES2CmdHelper(command_buffer_.get()));
+    gles2_helper_->SetAutomaticFlushes(automatic_flushes_);
+    if (!gles2_helper_->Initialize(memory_limits_.command_buffer_size)) {
+      DLOG(ERROR) << "Failed to initialize GLES2CmdHelper.";
+      return false;
+    }
+
+    // The transfer buffer is used to copy resources between the client
+    // process and the GPU process.
+    transfer_buffer_.reset(new gpu::TransferBuffer(gles2_helper_.get()));
+
+    // The GLES2Implementation exposes the OpenGLES2 API, as well as the
+    // gpu::ContextSupport interface.
+    constexpr bool support_client_side_arrays = false;
+    gles2_impl_.reset(new gpu::gles2::GLES2Implementation(
+        gles2_helper_.get(), share_group, transfer_buffer_.get(),
+        attributes_.bind_generates_resource,
+        attributes_.lose_context_when_out_of_memory, support_client_side_arrays,
+        command_buffer_.get()));
+    if (!gles2_impl_->Initialize(memory_limits_.start_transfer_buffer_size,
+                                 memory_limits_.min_transfer_buffer_size,
+                                 memory_limits_.max_transfer_buffer_size,
+                                 memory_limits_.mapped_memory_reclaim_limit)) {
+      DLOG(ERROR) << "Failed to initialize GLES2Implementation.";
+      return false;
+    }
+
+    if (command_buffer_->GetLastError() != gpu::error::kNoError) {
+      DLOG(ERROR) << "Context dead on arrival. Last error: "
+                  << command_buffer_->GetLastError();
+      return false;
+    }
 
     // If any context in the share group has been lost, then abort and don't
     // continue since we need to go back to the caller of the constructor to
@@ -141,20 +207,28 @@
 
     shared_providers_->list.push_back(this);
   }
+  set_bind_failed.Reset();
+  bind_succeeded_ = true;
 
-  lost_context_callback_proxy_.reset(new LostContextCallbackProxy(this));
+  gles2_impl_->SetLostContextCallback(
+      base::Bind(&ContextProviderCommandBuffer::OnLostContext,
+                 // |this| owns the GLES2Implementation which holds the
+                 // callback.
+                 base::Unretained(this)));
 
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kEnableGpuClientTracing)) {
     // This wraps the real GLES2Implementation and we should always use this
     // instead when it's present.
-    trace_impl_.reset(new gpu::gles2::GLES2TraceImplementation(
-        context3d_->GetImplementation()));
+    trace_impl_.reset(
+        new gpu::gles2::GLES2TraceImplementation(gles2_impl_.get()));
   }
 
   // Do this last once the context is set up.
+  std::string type_name =
+      command_buffer_metrics::ContextTypeToString(context_type_);
   std::string unique_context_name =
-      base::StringPrintf("%s-%p", debug_name_.c_str(), context3d_.get());
+      base::StringPrintf("%s-%p", type_name.c_str(), gles2_impl_.get());
   ContextGL()->TraceBeginCHROMIUM("gpu_toplevel", unique_context_name.c_str());
   return true;
 }
@@ -164,21 +238,20 @@
 }
 
 gpu::gles2::GLES2Interface* ContextProviderCommandBuffer::ContextGL() {
-  DCHECK(context3d_);
-  DCHECK(lost_context_callback_proxy_);  // Is bound to thread.
+  DCHECK(bind_succeeded_);
   DCHECK(context_thread_checker_.CalledOnValidThread());
 
   if (trace_impl_)
     return trace_impl_.get();
-  return context3d_->GetImplementation();
+  return gles2_impl_.get();
 }
 
 gpu::ContextSupport* ContextProviderCommandBuffer::ContextSupport() {
-  return context3d_->GetContextSupport();
+  return gles2_impl_.get();
 }
 
 class GrContext* ContextProviderCommandBuffer::GrContext() {
-  DCHECK(lost_context_callback_proxy_);  // Is bound to thread.
+  DCHECK(bind_succeeded_);
   DCHECK(context_thread_checker_.CalledOnValidThread());
 
   if (gr_context_)
@@ -196,15 +269,16 @@
 
 void ContextProviderCommandBuffer::InvalidateGrContext(uint32_t state) {
   if (gr_context_) {
-    DCHECK(lost_context_callback_proxy_);  // Is bound to thread.
+    DCHECK(bind_succeeded_);
     DCHECK(context_thread_checker_.CalledOnValidThread());
     gr_context_->ResetContext(state);
   }
 }
 
 void ContextProviderCommandBuffer::SetupLock() {
-  DCHECK(context3d_);
-  context3d_->GetCommandBufferProxy()->SetLock(&context_lock_);
+  DCHECK(bind_succeeded_);
+  DCHECK(context_thread_checker_.CalledOnValidThread());
+  command_buffer_->SetLock(&context_lock_);
 }
 
 base::Lock* ContextProviderCommandBuffer::GetLock() {
@@ -212,10 +286,10 @@
 }
 
 gpu::Capabilities ContextProviderCommandBuffer::ContextCapabilities() {
-  DCHECK(lost_context_callback_proxy_);  // Is bound to thread.
+  DCHECK(bind_succeeded_);
   DCHECK(context_thread_checker_.CalledOnValidThread());
   // Skips past the trace_impl_ as it doesn't have capabilities.
-  return context3d_->GetImplementation()->capabilities();
+  return gles2_impl_->capabilities();
 }
 
 void ContextProviderCommandBuffer::DeleteCachedResources() {
@@ -232,6 +306,10 @@
     lost_context_callback_.Run();
   if (gr_context_)
     gr_context_->OnLostContext();
+
+  gpu::CommandBuffer::State state = GetCommandBufferProxy()->GetLastState();
+  command_buffer_metrics::UmaRecordContextLost(context_type_, state.error,
+                                               state.context_lost_reason);
 }
 
 void ContextProviderCommandBuffer::SetLostContextCallback(
diff --git a/content/common/gpu/client/context_provider_command_buffer.h b/content/common/gpu/client/context_provider_command_buffer.h
index 0ed79f7..17204d09 100644
--- a/content/common/gpu/client/context_provider_command_buffer.h
+++ b/content/common/gpu/client/context_provider_command_buffer.h
@@ -16,12 +16,19 @@
 #include "cc/output/context_provider.h"
 #include "content/common/content_export.h"
 #include "content/common/gpu/client/command_buffer_metrics.h"
-#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
 #include "gpu/command_buffer/client/shared_memory_limits.h"
+#include "gpu/command_buffer/common/gles2_cmd_utils.h"
+#include "gpu/ipc/common/surface_handle.h"
+#include "ui/gl/gpu_preference.h"
+#include "url/gurl.h"
 
 namespace gpu {
 class CommandBufferProxyImpl;
+class GpuChannelHost;
+class TransferBuffer;
 namespace gles2 {
+class GLES2CmdHelper;
+class GLES2Implementation;
 class GLES2TraceImplementation;
 }
 }
@@ -31,17 +38,23 @@
 }
 
 namespace content {
+class WebGraphicsContext3DCommandBufferImpl;
 
-// Implementation of cc::ContextProvider that provides a
-// WebGraphicsContext3DCommandBufferImpl context and a GrContext.
+// Implementation of cc::ContextProvider that provides a GL implementation over
+// command buffer to the GPU process.
 class CONTENT_EXPORT ContextProviderCommandBuffer
     : NON_EXPORTED_BASE(public cc::ContextProvider) {
  public:
   ContextProviderCommandBuffer(
-      std::unique_ptr<WebGraphicsContext3DCommandBufferImpl> context3d,
+      scoped_refptr<gpu::GpuChannelHost> channel,
+      gpu::SurfaceHandle surface_handle,
+      const GURL& active_url,
+      gfx::GpuPreference gpu_preference,
+      bool automatic_flushes,
       const gpu::SharedMemoryLimits& memory_limits,
+      const gpu::gles2::ContextCreationAttribHelper& attributes,
       ContextProviderCommandBuffer* shared_context_provider,
-      CommandBufferContextType type);
+      command_buffer_metrics::ContextType type);
 
   gpu::CommandBufferProxyImpl* GetCommandBufferProxy();
 
@@ -52,13 +65,17 @@
   gpu::ContextSupport* ContextSupport() override;
   class GrContext* GrContext() override;
   void InvalidateGrContext(uint32_t state) override;
-  void SetupLock() override;
   base::Lock* GetLock() override;
   gpu::Capabilities ContextCapabilities() override;
   void DeleteCachedResources() override;
   void SetLostContextCallback(
       const LostContextCallback& lost_context_callback) override;
 
+  // Sets up a lock so this context can be used from multiple threads. After
+  // calling this, all functions without explicit thread usage constraints can
+  // be used on any thread while the lock returned by GetLock() is acquired.
+  void SetupLock();
+
  protected:
   ~ContextProviderCommandBuffer() override;
 
@@ -79,22 +96,29 @@
   base::ThreadChecker main_thread_checker_;
   base::ThreadChecker context_thread_checker_;
 
-  scoped_refptr<SharedProviders> shared_providers_;
+  bool bind_succeeded_ = false;
+  bool bind_failed_ = false;
 
-  std::unique_ptr<WebGraphicsContext3DCommandBufferImpl> context3d_;
+  gpu::SurfaceHandle surface_handle_;
+  GURL active_url_;
+  gfx::GpuPreference gpu_preference_;
+  bool automatic_flushes_;
+  gpu::SharedMemoryLimits memory_limits_;
+  gpu::gles2::ContextCreationAttribHelper attributes_;
+  command_buffer_metrics::ContextType context_type_;
+
+  scoped_refptr<SharedProviders> shared_providers_;
+  scoped_refptr<gpu::GpuChannelHost> channel_;
+
+  base::Lock context_lock_;  // Referenced by command_buffer_.
+  std::unique_ptr<gpu::CommandBufferProxyImpl> command_buffer_;
+  std::unique_ptr<gpu::gles2::GLES2CmdHelper> gles2_helper_;
+  std::unique_ptr<gpu::TransferBuffer> transfer_buffer_;
+  std::unique_ptr<gpu::gles2::GLES2Implementation> gles2_impl_;
   std::unique_ptr<gpu::gles2::GLES2TraceImplementation> trace_impl_;
   std::unique_ptr<skia_bindings::GrContextForGLES2Interface> gr_context_;
 
-  gpu::SharedMemoryLimits memory_limits_;
-  CommandBufferContextType context_type_;
-  std::string debug_name_;
-
   LostContextCallback lost_context_callback_;
-
-  base::Lock context_lock_;
-
-  class LostContextCallbackProxy;
-  std::unique_ptr<LostContextCallbackProxy> lost_context_callback_proxy_;
 };
 
 }  // namespace content
diff --git a/content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.cc b/content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.cc
deleted file mode 100644
index 8364236..0000000
--- a/content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.cc
+++ /dev/null
@@ -1,235 +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 "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
-
-#include "third_party/khronos/GLES2/gl2.h"
-#ifndef GL_GLEXT_PROTOTYPES
-#define GL_GLEXT_PROTOTYPES 1
-#endif
-#include "third_party/khronos/GLES2/gl2ext.h"
-
-#include <algorithm>
-#include <map>
-#include <memory>
-
-#include "base/atomicops.h"
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "base/metrics/field_trial.h"
-#include "base/metrics/histogram.h"
-#include "base/profiler/scoped_tracker.h"
-#include "base/trace_event/trace_event.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "gpu/command_buffer/client/gles2_cmd_helper.h"
-#include "gpu/command_buffer/client/gles2_implementation.h"
-#include "gpu/command_buffer/client/gpu_switches.h"
-#include "gpu/command_buffer/client/shared_memory_limits.h"
-#include "gpu/command_buffer/client/transfer_buffer.h"
-#include "gpu/command_buffer/common/constants.h"
-#include "gpu/command_buffer/common/gpu_memory_allocation.h"
-#include "gpu/command_buffer/common/mailbox.h"
-#include "gpu/ipc/client/gpu_channel_host.h"
-#include "gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h"
-#include "third_party/skia/include/core/SkTypes.h"
-
-namespace content {
-
-WebGraphicsContext3DCommandBufferImpl::WebGraphicsContext3DCommandBufferImpl(
-    gpu::SurfaceHandle surface_handle,
-    const GURL& active_url,
-    gpu::GpuChannelHost* host,
-    const gpu::gles2::ContextCreationAttribHelper& attributes,
-    gfx::GpuPreference gpu_preference,
-    bool automatic_flushes)
-    : automatic_flushes_(automatic_flushes),
-      attributes_(attributes),
-      host_(host),
-      surface_handle_(surface_handle),
-      active_url_(active_url),
-      gpu_preference_(gpu_preference),
-      weak_ptr_factory_(this) {
-  DCHECK(host);
-  switch (attributes.context_type) {
-    case gpu::gles2::CONTEXT_TYPE_OPENGLES2:
-    case gpu::gles2::CONTEXT_TYPE_OPENGLES3:
-      context_type_ = CONTEXT_TYPE_UNKNOWN;
-    case gpu::gles2::CONTEXT_TYPE_WEBGL1:
-    case gpu::gles2::CONTEXT_TYPE_WEBGL2:
-      context_type_ = OFFSCREEN_CONTEXT_FOR_WEBGL;
-  }
-}
-
-WebGraphicsContext3DCommandBufferImpl::
-    ~WebGraphicsContext3DCommandBufferImpl() {
-  if (real_gl_)
-    real_gl_->SetLostContextCallback(base::Closure());
-
-  Destroy();
-}
-
-bool WebGraphicsContext3DCommandBufferImpl::MaybeInitializeGL(
-    const gpu::SharedMemoryLimits& memory_limits,
-    gpu::CommandBufferProxyImpl* shared_command_buffer,
-    scoped_refptr<gpu::gles2::ShareGroup> share_group) {
-  if (initialized_)
-    return true;
-
-  if (initialize_failed_)
-    return false;
-
-  TRACE_EVENT0("gpu", "WebGfxCtx3DCmdBfrImpl::MaybeInitializeGL");
-
-  // TODO(vadimt): Remove ScopedTracker below once crbug.com/125248 is fixed.
-  tracked_objects::ScopedTracker tracking_profile(
-      FROM_HERE_WITH_EXPLICIT_FUNCTION(
-          "125248 WebGraphicsContext3DCommandBufferImpl::MaybeInitializeGL"));
-
-  if (!CreateContext(memory_limits, shared_command_buffer,
-                     std::move(share_group))) {
-    Destroy();
-
-    initialize_failed_ = true;
-    return false;
-  }
-
-  real_gl_->SetLostContextCallback(
-      base::Bind(&WebGraphicsContext3DCommandBufferImpl::OnContextLost,
-                 // The callback is unset in the destructor.
-                 base::Unretained(this)));
-
-  real_gl_->TraceBeginCHROMIUM("WebGraphicsContext3D",
-                               "CommandBufferContext");
-
-  initialized_ = true;
-  return true;
-}
-
-bool WebGraphicsContext3DCommandBufferImpl::InitializeCommandBuffer(
-    gpu::CommandBufferProxyImpl* shared_command_buffer) {
-  if (!host_.get())
-    return false;
-
-  DCHECK(attributes_.buffer_preserved);
-  std::vector<int32_t> serialized_attributes;
-  attributes_.Serialize(&serialized_attributes);
-
-  // Create a proxy to a command buffer in the GPU process.
-  command_buffer_ = host_->CreateCommandBuffer(
-      surface_handle_, gfx::Size(), shared_command_buffer,
-      gpu::GpuChannelHost::kDefaultStreamId,
-      gpu::GpuChannelHost::kDefaultStreamPriority, serialized_attributes,
-      active_url_, gpu_preference_);
-
-  if (!command_buffer_) {
-    DLOG(ERROR) << "GpuChannelHost failed to create command buffer.";
-    UmaRecordContextInitFailed(context_type_);
-    return false;
-  }
-
-  DVLOG_IF(1, gpu::error::IsError(command_buffer_->GetLastError()))
-      << "Context dead on arrival. Last error: "
-      << command_buffer_->GetLastError();
-  // Initialize the command buffer.
-  bool result = command_buffer_->Initialize();
-  LOG_IF(ERROR, !result) << "CommandBufferProxy::Initialize failed.";
-  if (!result)
-    UmaRecordContextInitFailed(context_type_);
-  return result;
-}
-
-bool WebGraphicsContext3DCommandBufferImpl::CreateContext(
-    const gpu::SharedMemoryLimits& memory_limits,
-    gpu::CommandBufferProxyImpl* shared_command_buffer,
-    scoped_refptr<gpu::gles2::ShareGroup> share_group) {
-  TRACE_EVENT0("gpu", "WebGfxCtx3DCmdBfrImpl::CreateContext");
-  DCHECK_EQ(!!shared_command_buffer, !!share_group);
-
-  if (!InitializeCommandBuffer(shared_command_buffer)) {
-    LOG(ERROR) << "Failed to initialize command buffer.";
-    return false;
-  }
-
-  // Create the GLES2 helper, which writes the command buffer protocol.
-  gles2_helper_.reset(new gpu::gles2::GLES2CmdHelper(command_buffer_.get()));
-  if (!gles2_helper_->Initialize(memory_limits.command_buffer_size)) {
-    LOG(ERROR) << "Failed to initialize GLES2CmdHelper.";
-    return false;
-  }
-
-  if (!automatic_flushes_)
-    gles2_helper_->SetAutomaticFlushes(false);
-  // Create a transfer buffer used to copy resources between the renderer
-  // process and the GPU process.
-  transfer_buffer_ .reset(new gpu::TransferBuffer(gles2_helper_.get()));
-
-  DCHECK(host_.get());
-
-  const bool bind_generates_resource = attributes_.bind_generates_resource;
-  const bool lose_context_when_out_of_memory =
-      attributes_.lose_context_when_out_of_memory;
-  const bool support_client_side_arrays = false;
-
-  // Create the object exposing the OpenGL API.
-  real_gl_.reset(new gpu::gles2::GLES2Implementation(
-      gles2_helper_.get(), std::move(share_group), transfer_buffer_.get(),
-      bind_generates_resource, lose_context_when_out_of_memory,
-      support_client_side_arrays, command_buffer_.get()));
-  if (!real_gl_->Initialize(memory_limits.start_transfer_buffer_size,
-                            memory_limits.min_transfer_buffer_size,
-                            memory_limits.max_transfer_buffer_size,
-                            memory_limits.mapped_memory_reclaim_limit)) {
-    LOG(ERROR) << "Failed to initialize GLES2Implementation.";
-    return false;
-  }
-
-  return true;
-}
-
-bool WebGraphicsContext3DCommandBufferImpl::InitializeOnCurrentThread(
-    const gpu::SharedMemoryLimits& memory_limits,
-    gpu::CommandBufferProxyImpl* shared_command_buffer,
-    scoped_refptr<gpu::gles2::ShareGroup> share_group) {
-  if (!MaybeInitializeGL(memory_limits, shared_command_buffer,
-                         std::move(share_group))) {
-    DLOG(ERROR) << "Failed to initialize context.";
-    return false;
-  }
-  if (gpu::error::IsError(command_buffer_->GetLastError())) {
-    LOG(ERROR) << "Context dead on arrival. Last error: "
-               << command_buffer_->GetLastError();
-    return false;
-  }
-
-  return true;
-}
-
-void WebGraphicsContext3DCommandBufferImpl::Destroy() {
-  trace_gl_.reset();
-  real_gl_.reset();
-  transfer_buffer_.reset();
-  gles2_helper_.reset();
-  real_gl_.reset();
-  command_buffer_.reset();
-
-  host_ = nullptr;
-}
-
-gpu::ContextSupport*
-WebGraphicsContext3DCommandBufferImpl::GetContextSupport() {
-  return real_gl_.get();
-}
-
-void WebGraphicsContext3DCommandBufferImpl::OnContextLost() {
-  if (context_lost_callback_)
-    context_lost_callback_->onContextLost();
-
-  gpu::CommandBuffer::State state = command_buffer_->GetLastState();
-  UmaRecordContextLost(context_type_, state.error, state.context_lost_reason);
-}
-
-}  // namespace content
diff --git a/content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h b/content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h
deleted file mode 100644
index fcfc7d94..0000000
--- a/content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h
+++ /dev/null
@@ -1,153 +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 CONTENT_COMMON_GPU_CLIENT_WEBGRAPHICSCONTEXT3D_COMMAND_BUFFER_IMPL_H_
-#define CONTENT_COMMON_GPU_CLIENT_WEBGRAPHICSCONTEXT3D_COMMAND_BUFFER_IMPL_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/synchronization/lock.h"
-#include "content/common/content_export.h"
-#include "content/common/gpu/client/command_buffer_metrics.h"
-#include "gpu/command_buffer/common/gles2_cmd_utils.h"
-#include "gpu/ipc/client/command_buffer_proxy_impl.h"
-#include "gpu/ipc/common/surface_handle.h"
-#include "third_party/WebKit/public/platform/WebString.h"
-#include "ui/gl/gpu_preference.h"
-#include "url/gurl.h"
-
-namespace gpu {
-
-class ContextSupport;
-class GpuChannelHost;
-struct SharedMemoryLimits;
-class TransferBuffer;
-
-namespace gles2 {
-class GLES2CmdHelper;
-class GLES2Implementation;
-class GLES2Interface;
-class ShareGroup;
-}
-}
-
-namespace content {
-
-class WebGraphicsContext3DCommandBufferImpl {
- public:
-  enum MappedMemoryReclaimLimit {
-    kNoLimit = 0,
-  };
-
-  class WebGraphicsContextLostCallback {
-   public:
-    virtual void onContextLost() = 0;
-
-   protected:
-    virtual ~WebGraphicsContextLostCallback() {}
-  };
-
-  // If surface_handle is not kNullSurfaceHandle, this creates a
-  // CommandBufferProxy that renders directly to a view. The view and
-  // the associated window must not be destroyed until the returned
-  // CommandBufferProxy has been destroyed, otherwise the GPU process might
-  // attempt to render to an invalid window handle.
-  CONTENT_EXPORT WebGraphicsContext3DCommandBufferImpl(
-      gpu::SurfaceHandle surface_handle,
-      const GURL& active_url,
-      gpu::GpuChannelHost* host,
-      const gpu::gles2::ContextCreationAttribHelper& attributes,
-      gfx::GpuPreference gpu_preference,
-      bool automatic_flushes);
-
-  CONTENT_EXPORT ~WebGraphicsContext3DCommandBufferImpl();
-
-  gpu::CommandBufferProxyImpl* GetCommandBufferProxy() {
-    return command_buffer_.get();
-  }
-
-  CONTENT_EXPORT gpu::ContextSupport* GetContextSupport();
-
-  gpu::gles2::GLES2Implementation* GetImplementation() {
-    return real_gl_.get();
-  }
-
-  void SetContextLostCallback(WebGraphicsContextLostCallback* callback) {
-    context_lost_callback_ = callback;
-  }
-
-  CONTENT_EXPORT bool InitializeOnCurrentThread(
-      const gpu::SharedMemoryLimits& memory_limits,
-      gpu::CommandBufferProxyImpl* shared_command_buffer,
-      scoped_refptr<gpu::gles2::ShareGroup> share_group);
-
-  void SetContextType(CommandBufferContextType type) {
-    context_type_ = type;
-  }
- private:
-  // These are the same error codes as used by EGL.
-  enum Error {
-    SUCCESS               = 0x3000,
-    BAD_ATTRIBUTE         = 0x3004,
-    CONTEXT_LOST          = 0x300E
-  };
-
-  // Initialize the underlying GL context. May be called multiple times; second
-  // and subsequent calls are ignored. Must be called from the thread that is
-  // going to use this object to issue GL commands (which might not be the main
-  // thread).
-  bool MaybeInitializeGL(const gpu::SharedMemoryLimits& memory_limits,
-                         gpu::CommandBufferProxyImpl* shared_command_buffer,
-                         scoped_refptr<gpu::gles2::ShareGroup> share_group);
-
-  bool InitializeCommandBuffer(
-      gpu::CommandBufferProxyImpl* shared_command_buffer);
-
-  void Destroy();
-
-  bool CreateContext(const gpu::SharedMemoryLimits& memory_limits,
-                     gpu::CommandBufferProxyImpl* shared_command_buffer,
-                     scoped_refptr<gpu::gles2::ShareGroup> share_group);
-
-  void OnContextLost();
-
-  bool initialized_ = false;
-  bool initialize_failed_ = false;
-  WebGraphicsContextLostCallback* context_lost_callback_ = nullptr;
-
-  bool automatic_flushes_;
-  gpu::gles2::ContextCreationAttribHelper attributes_;
-
-  // State needed by MaybeInitializeGL.
-  scoped_refptr<gpu::GpuChannelHost> host_;
-  gpu::SurfaceHandle surface_handle_;
-  GURL active_url_;
-  CommandBufferContextType context_type_;
-
-  gfx::GpuPreference gpu_preference_;
-
-  std::unique_ptr<gpu::CommandBufferProxyImpl> command_buffer_;
-  std::unique_ptr<gpu::gles2::GLES2CmdHelper> gles2_helper_;
-  std::unique_ptr<gpu::TransferBuffer> transfer_buffer_;
-  std::unique_ptr<gpu::gles2::GLES2Implementation> real_gl_;
-  std::unique_ptr<gpu::gles2::GLES2Interface> trace_gl_;
-
-  // Member variables should appear before the WeakPtrFactory, to ensure
-  // that any WeakPtrs to Controller are invalidated before its members
-  // variable's destructors are executed, rendering them invalid.
-  base::WeakPtrFactory<WebGraphicsContext3DCommandBufferImpl> weak_ptr_factory_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_COMMON_GPU_CLIENT_WEBGRAPHICSCONTEXT3D_COMMAND_BUFFER_IMPL_H_
diff --git a/content/common/media/media_stream_messages.h b/content/common/media/media_stream_messages.h
index 9a745a1..d4847c2 100644
--- a/content/common/media/media_stream_messages.h
+++ b/content/common/media/media_stream_messages.h
@@ -95,6 +95,9 @@
 IPC_MESSAGE_ROUTED1(MediaStreamMsg_DeviceOpenFailed,
                     int /* request id */)
 
+// The browser has detected a change in the set of media devices.
+IPC_MESSAGE_ROUTED0(MediaStreamMsg_DevicesChanged)
+
 // Messages sent from the renderer to the browser.
 
 // Request a new media stream.
@@ -140,3 +143,12 @@
 IPC_MESSAGE_CONTROL2(MediaStreamHostMsg_CloseDevice,
                      int /* render frame id */,
                      std::string /*label*/)
+
+// Subscribe to notifications about changes in the set of media devices.
+IPC_MESSAGE_CONTROL2(MediaStreamHostMsg_SubscribeToDeviceChangeNotifications,
+                     int /* render frame id */,
+                     url::Origin /* security origin */)
+
+// Cancel notifications about changes in the set of media devices.
+IPC_MESSAGE_CONTROL1(MediaStreamHostMsg_CancelDeviceChangeNotifications,
+                     int /* render frame id */)
diff --git a/content/common/sandbox_win.cc b/content/common/sandbox_win.cc
index b293ea4..b8d95af3 100644
--- a/content/common/sandbox_win.cc
+++ b/content/common/sandbox_win.cc
@@ -45,7 +45,6 @@
 #endif  // !defined(NACL_WIN64)
 
 static sandbox::BrokerServices* g_broker_services = NULL;
-static sandbox::TargetServices* g_target_services = NULL;
 
 namespace content {
 namespace {
@@ -281,7 +280,7 @@
 }
 
 // Adds the generic policy rules to a sandbox TargetPolicy.
-bool AddGenericPolicy(sandbox::TargetPolicy* policy) {
+sandbox::ResultCode AddGenericPolicy(sandbox::TargetPolicy* policy) {
   sandbox::ResultCode result;
 
   // Add the policy for the client side of a pipe. It is just a file
@@ -291,7 +290,7 @@
                            sandbox::TargetPolicy::FILES_ALLOW_ANY,
                            L"\\??\\pipe\\chrome.*");
   if (result != sandbox::SBOX_ALL_OK)
-    return false;
+    return result;
 
   // Add the policy for the server side of nacl pipe. It is just a file
   // in the \pipe\ namespace. We restrict it to pipes that start with
@@ -301,7 +300,7 @@
                            sandbox::TargetPolicy::NAMEDPIPES_ALLOW_ANY,
                            L"\\\\.\\pipe\\chrome.nacl.*");
   if (result != sandbox::SBOX_ALL_OK)
-    return false;
+    return result;
 
   // Allow the server side of sync sockets, which are pipes that have
   // the "chrome.sync" namespace and a randomly generated suffix.
@@ -309,20 +308,20 @@
                            sandbox::TargetPolicy::NAMEDPIPES_ALLOW_ANY,
                            L"\\\\.\\pipe\\chrome.sync.*");
   if (result != sandbox::SBOX_ALL_OK)
-    return false;
+    return result;
 
   // Add the policy for debug message only in debug
 #ifndef NDEBUG
   base::FilePath app_dir;
   if (!PathService::Get(base::DIR_MODULE, &app_dir))
-    return false;
+    return sandbox::SBOX_ERROR_GENERIC;
 
   wchar_t long_path_buf[MAX_PATH];
   DWORD long_path_return_value = GetLongPathName(app_dir.value().c_str(),
                                                  long_path_buf,
                                                  MAX_PATH);
   if (long_path_return_value == 0 || long_path_return_value >= MAX_PATH)
-    return false;
+    return sandbox::SBOX_ERROR_NO_SPACE;
 
   base::FilePath debug_message(long_path_buf);
   debug_message = debug_message.AppendASCII("debug_message.exe");
@@ -330,20 +329,20 @@
                            sandbox::TargetPolicy::PROCESS_MIN_EXEC,
                            debug_message.value().c_str());
   if (result != sandbox::SBOX_ALL_OK)
-    return false;
+    return result;
 #endif  // NDEBUG
 
   // Add the policy for read-only PDB file access for stack traces.
 #if !defined(OFFICIAL_BUILD)
   base::FilePath exe;
   if (!PathService::Get(base::FILE_EXE, &exe))
-    return false;
+    return sandbox::SBOX_ERROR_GENERIC;
   base::FilePath pdb_path = exe.DirName().Append(L"*.pdb");
   result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES,
                            sandbox::TargetPolicy::FILES_ALLOW_READONLY,
                            pdb_path.value().c_str());
   if (result != sandbox::SBOX_ALL_OK)
-    return false;
+    return result;
 #endif
 
 #if defined(SANITIZER_COVERAGE)
@@ -364,22 +363,23 @@
                              sandbox::TargetPolicy::FILES_ALLOW_ANY,
                              sancov_path.value().c_str());
     if (result != sandbox::SBOX_ALL_OK)
-      return false;
+      return result;
   }
 #endif
 
   AddGenericDllEvictionPolicy(policy);
-  return true;
+  return sandbox::SBOX_ALL_OK;
 }
 
-bool AddPolicyForSandboxedProcess(sandbox::TargetPolicy* policy) {
+sandbox::ResultCode AddPolicyForSandboxedProcess(
+    sandbox::TargetPolicy* policy) {
   sandbox::ResultCode result = sandbox::SBOX_ALL_OK;
 
   // Win8+ adds a device DeviceApi that we don't need.
   if (base::win::GetVersion() > base::win::VERSION_WIN7)
     result = policy->AddKernelObjectToClose(L"File", L"\\Device\\DeviceApi");
   if (result != sandbox::SBOX_ALL_OK)
-    return false;
+    return result;
 
   // Close the proxy settings on XP.
   if (base::win::GetVersion() <= base::win::VERSION_SERVER_2003)
@@ -387,7 +387,7 @@
                  L"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\" \
                      L"CurrentVersion\\Internet Settings");
   if (result != sandbox::SBOX_ALL_OK)
-    return false;
+    return result;
 
   sandbox::TokenLevel initial_token = sandbox::USER_UNPROTECTED;
   if (base::win::GetVersion() > base::win::VERSION_XP) {
@@ -396,17 +396,25 @@
     initial_token = sandbox::USER_RESTRICTED_SAME_ACCESS;
   }
 
-  policy->SetTokenLevel(initial_token, sandbox::USER_LOCKDOWN);
+  result = policy->SetTokenLevel(initial_token, sandbox::USER_LOCKDOWN);
+  if (result != sandbox::SBOX_ALL_OK)
+    return result;
   // Prevents the renderers from manipulating low-integrity processes.
-  policy->SetDelayedIntegrityLevel(sandbox::INTEGRITY_LEVEL_UNTRUSTED);
-  policy->SetIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW);
+  result = policy->SetDelayedIntegrityLevel(sandbox::INTEGRITY_LEVEL_UNTRUSTED);
+  if (result != sandbox::SBOX_ALL_OK)
+    return result;
+  result = policy->SetIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW);
+  if (result != sandbox::SBOX_ALL_OK)
+    return result;
   policy->SetLockdownDefaultDacl();
 
-  if (sandbox::SBOX_ALL_OK !=  policy->SetAlternateDesktop(true)) {
+  result = policy->SetAlternateDesktop(true);
+  if (result != sandbox::SBOX_ALL_OK) {
     DLOG(WARNING) << "Failed to apply desktop security to the renderer";
+    return result;
   }
 
-  return true;
+  return result;
 }
 
 // Updates the command line arguments with debug-related flags. If debug flags
@@ -548,44 +556,49 @@
 
 }  // namespace
 
-void SetJobLevel(const base::CommandLine& cmd_line,
-                 sandbox::JobLevel job_level,
-                 uint32_t ui_exceptions,
-                 sandbox::TargetPolicy* policy) {
-  if (ShouldSetJobLevel(cmd_line)) {
+sandbox::ResultCode SetJobLevel(const base::CommandLine& cmd_line,
+                                sandbox::JobLevel job_level,
+                                uint32_t ui_exceptions,
+                                sandbox::TargetPolicy* policy) {
+  if (!ShouldSetJobLevel(cmd_line))
+    return policy->SetJobLevel(sandbox::JOB_NONE, 0);
+
 #ifdef _WIN64
-    policy->SetJobMemoryLimit(4ULL * 1024 * 1024 * 1024);
+  sandbox::ResultCode ret =
+      policy->SetJobMemoryLimit(4ULL * 1024 * 1024 * 1024);
+  if (ret != sandbox::SBOX_ALL_OK)
+    return ret;
 #endif
-    policy->SetJobLevel(job_level, ui_exceptions);
-  } else {
-    policy->SetJobLevel(sandbox::JOB_NONE, 0);
-  }
+  return policy->SetJobLevel(job_level, ui_exceptions);
 }
 
 // TODO(jschuh): Need get these restrictions applied to NaCl and Pepper.
 // Just have to figure out what needs to be warmed up first.
-void AddBaseHandleClosePolicy(sandbox::TargetPolicy* policy) {
+sandbox::ResultCode AddBaseHandleClosePolicy(sandbox::TargetPolicy* policy) {
   // TODO(cpu): Add back the BaseNamedObjects policy.
   base::string16 object_path = PrependWindowsSessionPath(
       L"\\BaseNamedObjects\\windows_shell_global_counters");
-  policy->AddKernelObjectToClose(L"Section", object_path.data());
+  return policy->AddKernelObjectToClose(L"Section", object_path.data());
 }
 
-void AddAppContainerPolicy(sandbox::TargetPolicy* policy, const wchar_t* sid) {
+sandbox::ResultCode AddAppContainerPolicy(sandbox::TargetPolicy* policy,
+                                          const wchar_t* sid) {
   if (IsAppContainerEnabled())
-    policy->SetLowBox(sid);
+    return policy->SetLowBox(sid);
+  return sandbox::SBOX_ALL_OK;
 }
 
-bool AddWin32kLockdownPolicy(sandbox::TargetPolicy* policy, bool enable_opm) {
+sandbox::ResultCode AddWin32kLockdownPolicy(sandbox::TargetPolicy* policy,
+                                            bool enable_opm) {
 #if !defined(NACL_WIN64)
   if (!IsWin32kRendererLockdownEnabled())
-    return true;
+    return sandbox::SBOX_ALL_OK;
 
   // Enable win32k lockdown if not already.
   sandbox::MitigationFlags flags = policy->GetProcessMitigations();
   if ((flags & sandbox::MITIGATION_WIN32K_DISABLE) ==
       sandbox::MITIGATION_WIN32K_DISABLE)
-    return true;
+    return sandbox::SBOX_ALL_OK;
 
   sandbox::ResultCode result =
       policy->AddRule(sandbox::TargetPolicy::SUBSYS_WIN32K_LOCKDOWN,
@@ -593,15 +606,15 @@
                                  : sandbox::TargetPolicy::FAKE_USER_GDI_INIT,
                       nullptr);
   if (result != sandbox::SBOX_ALL_OK)
-    return false;
+    return result;
   if (enable_opm)
     policy->SetEnableOPMRedirection();
+
   flags |= sandbox::MITIGATION_WIN32K_DISABLE;
-  result = policy->SetProcessMitigations(flags);
-  if (result != sandbox::SBOX_ALL_OK)
-    return false;
+  return policy->SetProcessMitigations(flags);
+#else
+  return sandbox::SBOX_ALL_OK;
 #endif
-  return true;
 }
 
 bool InitBrokerServices(sandbox::BrokerServices* broker_services) {
@@ -645,16 +658,15 @@
 
 bool InitTargetServices(sandbox::TargetServices* target_services) {
   DCHECK(target_services);
-  DCHECK(!g_target_services);
   sandbox::ResultCode result = target_services->Init();
-  g_target_services = target_services;
   return sandbox::SBOX_ALL_OK == result;
 }
 
-base::Process StartSandboxedProcess(
+sandbox::ResultCode StartSandboxedProcess(
     SandboxedProcessLauncherDelegate* delegate,
     base::CommandLine* cmd_line,
-    const base::HandlesToInheritVector& handles_to_inherit) {
+    const base::HandlesToInheritVector& handles_to_inherit,
+    base::Process* process) {
   DCHECK(delegate);
   const base::CommandLine& browser_command_line =
       *base::CommandLine::ForCurrentProcess();
@@ -680,11 +692,10 @@
       options.inherit_handles = true;
       options.handles_to_inherit = &handles;
     }
-    base::Process process = base::LaunchProcess(*cmd_line, options);
+    base::Process unsandboxed_process = base::LaunchProcess(*cmd_line, options);
 
-    // TODO(rvargas) crbug.com/417532: Don't share a raw handle.
-    g_broker_services->AddTargetPeer(process.Handle());
-    return process;
+    *process = std::move(unsandboxed_process);
+    return sandbox::SBOX_ALL_OK;
   }
 
   sandbox::TargetPolicy* policy = g_broker_services->CreatePolicy();
@@ -704,14 +715,19 @@
       sandbox::MITIGATION_IMAGE_LOAD_NO_REMOTE |
       sandbox::MITIGATION_IMAGE_LOAD_NO_LOW_LABEL;
 
-  if (policy->SetProcessMitigations(mitigations) != sandbox::SBOX_ALL_OK)
-    return base::Process();
+  sandbox::ResultCode result = sandbox::SBOX_ERROR_GENERIC;
+
+  result = policy->SetProcessMitigations(mitigations);
+
+  if (result != sandbox::SBOX_ALL_OK)
+    return result;
 
 #if !defined(NACL_WIN64)
   if (type_str == switches::kRendererProcess &&
       IsWin32kRendererLockdownEnabled()) {
-    if (!AddWin32kLockdownPolicy(policy, false))
-      return base::Process();
+    result = AddWin32kLockdownPolicy(policy, false);
+    if (result != sandbox::SBOX_ALL_OK)
+      return result;
   }
 #endif
 
@@ -719,14 +735,18 @@
   mitigations = sandbox::MITIGATION_STRICT_HANDLE_CHECKS |
                 sandbox::MITIGATION_DLL_SEARCH_ORDER;
 
-  if (policy->SetDelayedProcessMitigations(mitigations) != sandbox::SBOX_ALL_OK)
-    return base::Process();
+  result = policy->SetDelayedProcessMitigations(mitigations);
+  if (result != sandbox::SBOX_ALL_OK)
+    return result;
 
-  SetJobLevel(*cmd_line, sandbox::JOB_LOCKDOWN, 0, policy);
+  result = SetJobLevel(*cmd_line, sandbox::JOB_LOCKDOWN, 0, policy);
+  if (result != sandbox::SBOX_ALL_OK)
+    return result;
 
   if (!delegate->DisableDefaultPolicy()) {
-    if (!AddPolicyForSandboxedProcess(policy))
-      return base::Process();
+    result = AddPolicyForSandboxedProcess(policy);
+    if (result != sandbox::SBOX_ALL_OK)
+      return result;
   }
 
 #if !defined(NACL_WIN64)
@@ -744,9 +764,11 @@
     cmd_line->AppendSwitchASCII("ignored", " --type=renderer ");
   }
 
-  if (!AddGenericPolicy(policy)) {
+  result = AddGenericPolicy(policy);
+
+  if (result != sandbox::SBOX_ALL_OK) {
     NOTREACHED();
-    return base::Process();
+    return result;
   }
 
   // Allow the renderer and gpu processes to access the log file.
@@ -754,26 +776,28 @@
       type_str == switches::kGpuProcess) {
     if (logging::IsLoggingToFileEnabled()) {
       DCHECK(base::FilePath(logging::GetLogFileFullPath()).IsAbsolute());
-      policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES,
-                      sandbox::TargetPolicy::FILES_ALLOW_ANY,
-                      logging::GetLogFileFullPath().c_str());
+      result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES,
+                               sandbox::TargetPolicy::FILES_ALLOW_ANY,
+                               logging::GetLogFileFullPath().c_str());
+      if (result != sandbox::SBOX_ALL_OK)
+        return result;
     }
   }
 
 #if !defined(OFFICIAL_BUILD)
   // If stdout/stderr point to a Windows console, these calls will
-  // have no effect.
+  // have no effect. These calls can fail with SBOX_ERROR_BAD_PARAMS.
   policy->SetStdoutHandle(GetStdHandle(STD_OUTPUT_HANDLE));
   policy->SetStderrHandle(GetStdHandle(STD_ERROR_HANDLE));
 #endif
 
   if (!delegate->PreSpawnTarget(policy))
-    return base::Process();
+    return sandbox::SBOX_ERROR_DELEGATE_PRE_SPAWN;
 
   TRACE_EVENT_BEGIN0("startup", "StartProcessWithAccess::LAUNCHPROCESS");
 
   PROCESS_INFORMATION temp_process_info = {};
-  sandbox::ResultCode result = g_broker_services->SpawnTarget(
+  result = g_broker_services->SpawnTarget(
       cmd_line->GetProgram().value().c_str(),
       cmd_line->GetCommandLineString().c_str(), policy, &temp_process_info);
   DWORD last_error = ::GetLastError();
@@ -796,17 +820,14 @@
     } else
       DLOG(ERROR) << "Failed to launch process. Error: " << result;
 
-    return base::Process();
+    return result;
   }
 
   delegate->PostSpawnTarget(target.process_handle());
 
   CHECK(ResumeThread(target.thread_handle()) != static_cast<DWORD>(-1));
-  return base::Process(target.TakeProcessHandle());
-}
-
-bool BrokerAddTargetPeer(HANDLE peer_process) {
-  return g_broker_services->AddTargetPeer(peer_process) == sandbox::SBOX_ALL_OK;
+  *process = base::Process(target.TakeProcessHandle());
+  return sandbox::SBOX_ALL_OK;
 }
 
 }  // namespace content
diff --git a/content/common/sandbox_win.h b/content/common/sandbox_win.h
index 0532048..7bda68ea 100644
--- a/content/common/sandbox_win.h
+++ b/content/common/sandbox_win.h
@@ -8,6 +8,7 @@
 #include <stdint.h>
 
 #include "content/common/content_export.h"
+#include "sandbox/win/src/sandbox_types.h"
 #include "sandbox/win/src/security_level.h"
 
 namespace base {
@@ -24,19 +25,21 @@
 
 // Wrapper around sandbox::TargetPolicy::SetJobLevel that checks if the sandbox
 // should be let to run without a job object assigned.
-void SetJobLevel(const base::CommandLine& cmd_line,
-                 sandbox::JobLevel job_level,
-                 uint32_t ui_exceptions,
-                 sandbox::TargetPolicy* policy);
+sandbox::ResultCode SetJobLevel(const base::CommandLine& cmd_line,
+                                sandbox::JobLevel job_level,
+                                uint32_t ui_exceptions,
+                                sandbox::TargetPolicy* policy);
 
 // Closes handles that are opened at process creation and initialization.
-void AddBaseHandleClosePolicy(sandbox::TargetPolicy* policy);
+sandbox::ResultCode AddBaseHandleClosePolicy(sandbox::TargetPolicy* policy);
 
 // Add AppContainer policy for |sid| on supported OS.
-void AddAppContainerPolicy(sandbox::TargetPolicy* policy, const wchar_t* sid);
+sandbox::ResultCode AddAppContainerPolicy(sandbox::TargetPolicy* policy,
+                                          const wchar_t* sid);
 
 // Add the win32k lockdown policy on supported OS.
-bool AddWin32kLockdownPolicy(sandbox::TargetPolicy* policy, bool enable_opm);
+sandbox::ResultCode AddWin32kLockdownPolicy(sandbox::TargetPolicy* policy,
+                                            bool enable_opm);
 
 bool InitBrokerServices(sandbox::BrokerServices* broker_services);
 
diff --git a/content/common/url_schemes.cc b/content/common/url_schemes.cc
index c985e85..96f487b 100644
--- a/content/common/url_schemes.cc
+++ b/content/common/url_schemes.cc
@@ -34,7 +34,6 @@
   url::AddStandardScheme(kChromeDevToolsScheme, url::SCHEME_WITHOUT_PORT);
   url::AddStandardScheme(kChromeUIScheme, url::SCHEME_WITHOUT_PORT);
   url::AddStandardScheme(kGuestScheme, url::SCHEME_WITHOUT_PORT);
-  url::AddStandardScheme(kMetadataScheme, url::SCHEME_WITHOUT_AUTHORITY);
 
   for (const url::SchemeWithType& scheme : additional_standard_schemes)
     url::AddStandardScheme(scheme.scheme, scheme.type);
diff --git a/content/content_browser.gypi b/content/content_browser.gypi
index 9d475eb..97939bd 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -1068,6 +1068,8 @@
       'browser/media/capture/cursor_renderer_mac.mm',
       'browser/media/capture/desktop_capture_device_uma_types.cc',
       'browser/media/capture/desktop_capture_device_uma_types.h',
+      'browser/media/capture/image_capture_impl.cc',
+      'browser/media/capture/image_capture_impl.h',
       'browser/media/capture/web_contents_audio_input_stream.cc',
       'browser/media/capture/web_contents_audio_input_stream.h',
       'browser/media/capture/web_contents_audio_muter.cc',
@@ -1710,8 +1712,6 @@
       'browser/android/tracing_controller_android.h',
       'browser/android/web_contents_observer_proxy.cc',
       'browser/android/web_contents_observer_proxy.h',
-      'browser/compositor/browser_compositor_overlay_candidate_validator_android.cc',
-      'browser/compositor/browser_compositor_overlay_candidate_validator_android.h',
       'browser/power_save_blocker_android.cc',
       'browser/renderer_host/compositor_impl_android.cc',
       'browser/renderer_host/compositor_impl_android.h',
@@ -1766,11 +1766,6 @@
     'compositor_browser_sources': [
       'browser/compositor/browser_compositor_output_surface.cc',
       'browser/compositor/browser_compositor_output_surface.h',
-      'browser/compositor/browser_compositor_overlay_candidate_validator.h',
-      'browser/compositor/browser_compositor_overlay_candidate_validator_mac.h',
-      'browser/compositor/browser_compositor_overlay_candidate_validator_mac.mm',
-      'browser/compositor/browser_compositor_overlay_candidate_validator_ozone.cc',
-      'browser/compositor/browser_compositor_overlay_candidate_validator_ozone.h',
       'browser/compositor/gpu_browser_compositor_output_surface.cc',
       'browser/compositor/gpu_browser_compositor_output_surface.h',
       'browser/compositor/gpu_process_transport_factory.cc',
diff --git a/content/content_common.gypi b/content/content_common.gypi
index 8609ee01..97427982 100644
--- a/content/content_common.gypi
+++ b/content/content_common.gypi
@@ -17,6 +17,7 @@
     '../ipc/ipc.gyp:ipc',
     '../ipc/mojo/ipc_mojo.gyp:ipc_mojo',
     '../media/media.gyp:media',
+    '../media/media.gyp:media_gpu',
     '../media/media.gyp:shared_memory_support',
     '../media/gpu/ipc/media_ipc.gyp:media_gpu_ipc_client',
     '../media/gpu/ipc/media_ipc.gyp:media_gpu_ipc_common',
@@ -184,6 +185,7 @@
       'public/common/sandbox_type.h',
       'public/common/sandboxed_process_launcher_delegate.cc',
       'public/common/sandboxed_process_launcher_delegate.h',
+      'public/common/screen_orientation_values.h',
       'public/common/security_style.h',
       'public/common/send_zygote_child_ping_linux.h',
       'public/common/service_registry.h',
@@ -345,8 +347,6 @@
       'common/gpu/client/command_buffer_metrics.h',
       'common/gpu/client/context_provider_command_buffer.cc',
       'common/gpu/client/context_provider_command_buffer.h',
-      'common/gpu/client/webgraphicscontext3d_command_buffer_impl.cc',
-      'common/gpu/client/webgraphicscontext3d_command_buffer_impl.h',
       'common/gpu_host_messages.h',
       'common/gpu_process_launch_causes.h',
       'common/host_discardable_shared_memory_manager.cc',
diff --git a/content/ppapi_plugin/ppapi_plugin_main.cc b/content/ppapi_plugin/ppapi_plugin_main.cc
index 2eec3e2..3c68733 100644
--- a/content/ppapi_plugin/ppapi_plugin_main.cc
+++ b/content/ppapi_plugin/ppapi_plugin_main.cc
@@ -6,7 +6,6 @@
 #include "base/command_line.h"
 #include "base/debug/crash_logging.h"
 #include "base/debug/debugger.h"
-#include "base/feature_list.h"
 #include "base/files/file_path.h"
 #include "base/i18n/rtl.h"
 #include "base/message_loop/message_loop.h"
@@ -123,12 +122,6 @@
   LinuxSandbox::InitializeSandbox();
 #endif
 
-  std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
-  feature_list->InitializeFromCommandLine(
-      command_line.GetSwitchValueASCII(switches::kEnableFeatures),
-      command_line.GetSwitchValueASCII(switches::kDisableFeatures));
-  base::FeatureList::SetInstance(std::move(feature_list));
-
   ChildProcess ppapi_process;
   ppapi_process.set_main_thread(
       new PpapiThread(parameters.command_line, false));  // Not a broker.
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
index 071478c..e9ea345 100644
--- a/content/public/android/BUILD.gn
+++ b/content/public/android/BUILD.gn
@@ -259,7 +259,7 @@
     "values-uk/android_content_strings.xml",
     "values-vi/android_content_strings.xml",
     "values-zh-rCN/android_content_strings.xml",
-    "values-zh-rTW/android_content_strings.xml",
+    "values-zh/android_content_strings.xml",
   ]
 }
 
diff --git a/content/public/android/java/src/org/chromium/content/app/ChildProcessService.java b/content/public/android/java/src/org/chromium/content/app/ChildProcessService.java
index 54dc6e62f..77f70e9f 100644
--- a/content/public/android/java/src/org/chromium/content/app/ChildProcessService.java
+++ b/content/public/android/java/src/org/chromium/content/app/ChildProcessService.java
@@ -116,6 +116,8 @@
         sContext.set(this);
         super.onCreate();
 
+        ContextUtils.initApplicationContext(getApplicationContext());
+
         mMainThread = new Thread(new Runnable() {
             @Override
             @SuppressFBWarnings("DM_EXIT")
@@ -187,7 +189,6 @@
                             mMainThread.wait();
                         }
                     }
-                    ContextUtils.initApplicationContext(sContext.get().getApplicationContext());
                     for (FileDescriptorInfo fdInfo : mFdInfos) {
                         nativeRegisterGlobalFileDescriptor(
                                 fdInfo.mId, fdInfo.mFd.detachFd(), fdInfo.mOffset, fdInfo.mSize);
diff --git a/content/public/android/java/src/org/chromium/content/browser/BrowserStartupController.java b/content/public/android/java/src/org/chromium/content/browser/BrowserStartupController.java
index 6c97f4c..d53701d 100644
--- a/content/public/android/java/src/org/chromium/content/browser/BrowserStartupController.java
+++ b/content/public/android/java/src/org/chromium/content/browser/BrowserStartupController.java
@@ -7,7 +7,6 @@
 import android.content.Context;
 import android.os.Handler;
 
-import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
 import org.chromium.base.ResourceExtractor;
 import org.chromium.base.ThreadUtils;
@@ -292,7 +291,6 @@
                     // TODO(yfriedman): Remove dependency on a command line flag for this.
                     DeviceUtils.addDeviceSpecificUserAgentSwitch(mContext);
 
-                    ContextUtils.initApplicationContext(mContext);
                     nativeSetCommandLineFlags(
                             singleProcess, nativeIsPluginEnabled() ? getPlugins() : null);
                     mPostResourceExtractionTasksCompleted = true;
@@ -319,8 +317,6 @@
         ResourceExtractor resourceExtractor = ResourceExtractor.get(mContext);
         resourceExtractor.startExtractingResources();
         resourceExtractor.waitForCompletion();
-
-        ContextUtils.initApplicationContext(mContext.getApplicationContext());
         nativeSetCommandLineFlags(false, null);
     }
 
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java
index 9b2a0b3..2157ce43 100644
--- a/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java
+++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java
@@ -270,7 +270,7 @@
                     selectionStart = arguments.getInt(
                             AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT);
                     selectionEnd = arguments.getInt(
-                            AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT);
+                            AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT);
                 }
                 nativeSetSelection(mNativeObj, virtualViewId, selectionStart, selectionEnd);
                 return true;
diff --git a/content/public/android/java/strings/android_content_strings.grd b/content/public/android/java/strings/android_content_strings.grd
index 5a1f7d4..e2815cc 100644
--- a/content/public/android/java/strings/android_content_strings.grd
+++ b/content/public/android/java/strings/android_content_strings.grd
@@ -44,7 +44,7 @@
     <output filename="values-uk/android_content_strings.xml" lang="uk" type="android" />
     <output filename="values-vi/android_content_strings.xml" lang="vi" type="android" />
     <output filename="values-zh-rCN/android_content_strings.xml" lang="zh-CN" type="android" />
-    <output filename="values-zh-rTW/android_content_strings.xml" lang="zh-TW" type="android" />
+    <output filename="values-zh/android_content_strings.xml" lang="zh-TW" type="android" />
   </outputs>
   <translations>
     <file lang="am" path="translations/android_content_strings_am.xtb" />
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java
index 9f439139..77016cd 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java
@@ -247,6 +247,6 @@
     protected void setUp() throws Exception {
         super.setUp();
         LibraryLoader.get(LibraryProcessType.PROCESS_CHILD)
-                .ensureInitialized(getInstrumentation().getContext());
+                .ensureInitialized(getInstrumentation().getTargetContext());
     }
 }
diff --git a/content/public/browser/android/content_view_core.h b/content/public/browser/android/content_view_core.h
index 800a188..3815704 100644
--- a/content/public/browser/android/content_view_core.h
+++ b/content/public/browser/android/content_view_core.h
@@ -12,7 +12,6 @@
 #include "base/strings/string16.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/readback_types.h"
-#include "third_party/skia/include/core/SkImageInfo.h"
 #include "ui/android/view_android.h"
 #include "ui/gfx/geometry/rect.h"
 
diff --git a/content/public/browser/browser_child_process_host_delegate.h b/content/public/browser/browser_child_process_host_delegate.h
index ac59a2e5..892ca25 100644
--- a/content/public/browser/browser_child_process_host_delegate.h
+++ b/content/public/browser/browser_child_process_host_delegate.h
@@ -27,8 +27,8 @@
   virtual void OnProcessLaunched() {}
 
   // Called if the process failed to launch.  In this case the process never
-  // started so there is no available exit code.
-  virtual void OnProcessLaunchFailed() {}
+  // started so the code here is a platform specific error code.
+  virtual void OnProcessLaunchFailed(int error_code) {}
 
   // Called if the process crashed. |exit_code| is the status returned when the
   // process crashed (for posix, as returned from waitpid(), for Windows, as
diff --git a/content/public/browser/render_process_host_observer.h b/content/public/browser/render_process_host_observer.h
index 2a03913..100bee6 100644
--- a/content/public/browser/render_process_host_observer.h
+++ b/content/public/browser/render_process_host_observer.h
@@ -42,6 +42,10 @@
   // active renderer process for the top-level frame; for code that needs to be
   // a WebContentsObserver anyway, consider whether that API might be a better
   // choice.
+  //
+  // If |status| is TERMINATION_STATUS_LAUNCH_FAILED then |exit_code| will
+  // contain a platform specific launch failure error code. Otherwise, it will
+  // contain the exit code for the process.
   virtual void RenderProcessExited(RenderProcessHost* host,
                                    base::TerminationStatus status,
                                    int exit_code) {}
diff --git a/content/public/browser/utility_process_host_client.h b/content/public/browser/utility_process_host_client.h
index bd7e89d..cf54647 100644
--- a/content/public/browser/utility_process_host_client.h
+++ b/content/public/browser/utility_process_host_client.h
@@ -23,8 +23,9 @@
   // Called when the process has crashed.
   virtual void OnProcessCrashed(int exit_code) {}
 
-  // Called when the process fails to launch, i.e. it has no exit code.
-  virtual void OnProcessLaunchFailed() {}
+  // Called when the process fails to launch. |error_code| is one of
+  // LaunchResultCode or sandbox::ResultCode containing the error.
+  virtual void OnProcessLaunchFailed(int error_code) {}
 
   // Allow the client to filter IPC messages.
   virtual bool OnMessageReceived(const IPC::Message& message) = 0;
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h
index 95d1a52..74b56e1 100644
--- a/content/public/browser/web_contents_delegate.h
+++ b/content/public/browser/web_contents_delegate.h
@@ -141,10 +141,6 @@
   // it needs to do.
   virtual void CloseContents(WebContents* source) {}
 
-  // Informs the delegate that the underlying RenderViewHost has been swapped
-  // out so it can perform any cleanup necessary.
-  virtual void SwappedOut(WebContents* source) {}
-
   // Request the delegate to move this WebContents to the specified position
   // in screen coordinates.
   virtual void MoveContents(WebContents* source, const gfx::Rect& pos) {}
diff --git a/content/public/child/BUILD.gn b/content/public/child/BUILD.gn
index a9240179..a6e1415 100644
--- a/content/public/child/BUILD.gn
+++ b/content/public/child/BUILD.gn
@@ -38,4 +38,10 @@
     "//content/public/common:common_sources",
     "//gin",
   ]
+
+  allow_circular_includes_from = [
+    # This target is a pair with content/child. They always go together and
+    # include headers from each other.
+    "//content/child",
+  ]
 }
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h
index 1b808ed1..51dc52e 100644
--- a/content/public/common/content_switches.h
+++ b/content/public/common/content_switches.h
@@ -183,7 +183,7 @@
 extern const char kMaxUntiledLayerHeight[];
 extern const char kMaxUntiledLayerWidth[];
 extern const char kMemoryMetrics[];
-extern const char kMojoLocalStorage[];
+CONTENT_EXPORT extern const char kMojoLocalStorage[];
 CONTENT_EXPORT extern const char kMuteAudio[];
 CONTENT_EXPORT extern const char kNoReferrers[];
 CONTENT_EXPORT extern const char kNoSandbox[];
diff --git a/content/public/common/mojo_channel_switches.cc b/content/public/common/mojo_channel_switches.cc
index 293f46f..d1ed7b89 100644
--- a/content/public/common/mojo_channel_switches.cc
+++ b/content/public/common/mojo_channel_switches.cc
@@ -4,17 +4,10 @@
 
 #include "content/public/common/mojo_channel_switches.h"
 
-#include "base/command_line.h"
-#include "base/metrics/field_trial.h"
-#include "base/strings/string_util.h"
 #include "ipc/mojo/ipc_channel_mojo.h"
-#include "mojo/common/common_type_converters.h"
 
 namespace switches {
 
-// Enable ChannelMojo on any supported platform.
-const char kEnableMojoChannel[] = "enable-mojo-channel";
-
 // The token to use to construct the message pipe on which to layer ChannelMojo.
 const char kMojoChannelToken[] = "mojo-channel-token";
 
@@ -22,25 +15,3 @@
 const char kMojoApplicationChannelToken[] = "mojo-application-channel-token";
 
 }  // namespace switches
-
-namespace {
-
-const char kMojoChannelExperimentName[] = "MojoChannel";
-
-}  // namespace
-
-namespace content {
-
-bool ShouldUseMojoChannel() {
-  const std::string group =
-      base::FieldTrialList::FindFullName(kMojoChannelExperimentName);
-
-  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-      switches::kEnableMojoChannel))
-    return true;
-
-  return base::StartsWith(
-      group, "Enabled", base::CompareCase::INSENSITIVE_ASCII);
-}
-
-}  // namespace content
diff --git a/content/public/common/mojo_channel_switches.h b/content/public/common/mojo_channel_switches.h
index 3e59ad08a..be46a597 100644
--- a/content/public/common/mojo_channel_switches.h
+++ b/content/public/common/mojo_channel_switches.h
@@ -9,16 +9,9 @@
 
 namespace switches {
 
-extern const char kEnableMojoChannel[];
 CONTENT_EXPORT extern const char kMojoChannelToken[];
 CONTENT_EXPORT extern const char kMojoApplicationChannelToken[];
 
 }  // namespace switches
 
-namespace content {
-
-bool CONTENT_EXPORT ShouldUseMojoChannel();
-
-}  // namespace content
-
 #endif  // CONTENT_PUBLIC_COMMON_MOJO_CHANNEL_SWITCHES_H_
diff --git a/content/public/common/sandbox_init.h b/content/public/common/sandbox_init.h
index 4c44ed5..1b5a5d3af 100644
--- a/content/public/common/sandbox_init.h
+++ b/content/public/common/sandbox_init.h
@@ -25,6 +25,7 @@
 class Policy;
 }
 struct SandboxInterfaceInfo;
+enum ResultCode : int;
 }
 
 namespace content {
@@ -42,23 +43,15 @@
 CONTENT_EXPORT bool InitializeSandbox(
     sandbox::SandboxInterfaceInfo* sandbox_info);
 
-// Inform the current process's sandbox broker (e.g. the broker for
-// 32-bit processes) about a process created under a different sandbox
-// broker (e.g. the broker for 64-bit processes).  This allows
-// BrokerDuplicateHandle() to send handles to a process managed by
-// another broker.  For example, it allows the 32-bit renderer to send
-// handles to 64-bit NaCl processes.  This returns true on success,
-// false otherwise.
-CONTENT_EXPORT bool BrokerAddTargetPeer(HANDLE peer_process);
-
 // Launch a sandboxed process. |delegate| may be NULL. If |delegate| is non-NULL
 // then it just has to outlive this method call. |handles_to_inherit| is a list
 // of handles for the child process to inherit. The caller retains ownership of
 // the handles.
-CONTENT_EXPORT base::Process StartSandboxedProcess(
+CONTENT_EXPORT sandbox::ResultCode StartSandboxedProcess(
     SandboxedProcessLauncherDelegate* delegate,
     base::CommandLine* cmd_line,
-    const base::HandlesToInheritVector& handles_to_inherit);
+    const base::HandlesToInheritVector& handles_to_inherit,
+    base::Process* process);
 
 #elif defined(OS_MACOSX)
 
diff --git a/content/public/common/url_constants.cc b/content/public/common/url_constants.cc
index f3f298c..9878d99 100644
--- a/content/public/common/url_constants.cc
+++ b/content/public/common/url_constants.cc
@@ -12,8 +12,6 @@
 const char kChromeDevToolsScheme[] = "chrome-devtools";
 const char kChromeUIScheme[] = "chrome";
 const char kGuestScheme[] = "chrome-guest";
-const char kMetadataScheme[] = "metadata";
-const char kSwappedOutScheme[] = "swappedout";
 const char kViewSourceScheme[] = "view-source";
 #if defined(OS_CHROMEOS)
 const char kExternalFileScheme[] = "externalfile";
diff --git a/content/public/common/url_constants.h b/content/public/common/url_constants.h
index cb49d5a..c47b24ac 100644
--- a/content/public/common/url_constants.h
+++ b/content/public/common/url_constants.h
@@ -19,8 +19,6 @@
 CONTENT_EXPORT extern const char kChromeDevToolsScheme[];
 CONTENT_EXPORT extern const char kChromeUIScheme[];  // Used for WebUIs.
 CONTENT_EXPORT extern const char kGuestScheme[];
-CONTENT_EXPORT extern const char kMetadataScheme[];
-CONTENT_EXPORT extern const char kSwappedOutScheme[];
 CONTENT_EXPORT extern const char kViewSourceScheme[];
 #if defined(OS_CHROMEOS)
 CONTENT_EXPORT extern const char kExternalFileScheme[];
diff --git a/content/public/common/web_preferences.h b/content/public/common/web_preferences.h
index 2a75e30..54b8ed4 100644
--- a/content/public/common/web_preferences.h
+++ b/content/public/common/web_preferences.h
@@ -224,9 +224,12 @@
   // Used by Android_WebView only to support legacy apps that inject script into
   // a top-level initial empty document and expect it to persist on navigation.
   bool resue_global_for_unowned_main_frame;
-  std::string autoplay_experiment_mode;
 #endif
 
+  // String that describes how media element autoplay behavior should be
+  // affected by experiment.
+  std::string autoplay_experiment_mode;
+
   // Default (used if the page or UA doesn't override these) values for page
   // scale limits. These are set directly on the WebView so there's no analogue
   // in WebSettings.
diff --git a/content/renderer/bluetooth/bluetooth_dispatcher.cc b/content/renderer/bluetooth/bluetooth_dispatcher.cc
index bb7a174..418acd3 100644
--- a/content/renderer/bluetooth/bluetooth_dispatcher.cc
+++ b/content/renderer/bluetooth/bluetooth_dispatcher.cc
@@ -45,20 +45,6 @@
   return WorkerThread::GetCurrentId();
 }
 
-WebBluetoothDevice::VendorIDSource GetWebVendorIdSource(
-    device::BluetoothDevice::VendorIDSource vendor_id_source) {
-  switch (vendor_id_source) {
-    case device::BluetoothDevice::VENDOR_ID_UNKNOWN:
-      return WebBluetoothDevice::VendorIDSource::Unknown;
-    case device::BluetoothDevice::VENDOR_ID_BLUETOOTH:
-      return WebBluetoothDevice::VendorIDSource::Bluetooth;
-    case device::BluetoothDevice::VENDOR_ID_USB:
-      return WebBluetoothDevice::VendorIDSource::USB;
-  }
-  NOTREACHED();
-  return WebBluetoothDevice::VendorIDSource::Unknown;
-}
-
 }  // namespace
 
 BluetoothDispatcher::BluetoothDispatcher(ThreadSafeSender* sender)
@@ -165,9 +151,7 @@
   pending_requests_.Lookup(request_id)
       ->onSuccess(base::WrapUnique(new WebBluetoothDevice(
           WebString::fromUTF8(device.id), WebString(device.name),
-          device.tx_power, device.rssi, device.device_class,
-          GetWebVendorIdSource(device.vendor_id_source), device.vendor_id,
-          device.product_id, device.product_version, uuids)));
+          device.tx_power, device.rssi, uuids)));
   pending_requests_.Remove(request_id);
 }
 
diff --git a/content/renderer/gpu/compositor_output_surface.cc b/content/renderer/gpu/compositor_output_surface.cc
index 6b6aca4d..ae3f514 100644
--- a/content/renderer/gpu/compositor_output_surface.cc
+++ b/content/renderer/gpu/compositor_output_surface.cc
@@ -16,7 +16,6 @@
 #include "cc/output/managed_memory_policy.h"
 #include "cc/output/output_surface_client.h"
 #include "content/common/gpu/client/context_provider_command_buffer.h"
-#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
 #include "content/common/view_messages.h"
 #include "content/public/common/content_switches.h"
 #include "content/renderer/gpu/frame_swap_message_queue.h"
diff --git a/content/renderer/gpu/stream_texture_host_android.cc b/content/renderer/gpu/stream_texture_host_android.cc
index 3e62f98..208385d 100644
--- a/content/renderer/gpu/stream_texture_host_android.cc
+++ b/content/renderer/gpu/stream_texture_host_android.cc
@@ -11,12 +11,12 @@
 
 namespace content {
 
-StreamTextureHost::StreamTextureHost(gpu::GpuChannelHost* channel)
+StreamTextureHost::StreamTextureHost(scoped_refptr<gpu::GpuChannelHost> channel)
     : stream_id_(0),
       listener_(NULL),
-      channel_(channel),
+      channel_(std::move(channel)),
       weak_ptr_factory_(this) {
-  DCHECK(channel);
+  DCHECK(channel_);
 }
 
 StreamTextureHost::~StreamTextureHost() {
diff --git a/content/renderer/gpu/stream_texture_host_android.h b/content/renderer/gpu/stream_texture_host_android.h
index d03151b..06fcf0f3 100644
--- a/content/renderer/gpu/stream_texture_host_android.h
+++ b/content/renderer/gpu/stream_texture_host_android.h
@@ -29,7 +29,7 @@
 // StreamTextureProxy.
 class StreamTextureHost : public IPC::Listener {
  public:
-  explicit StreamTextureHost(gpu::GpuChannelHost* channel);
+  explicit StreamTextureHost(scoped_refptr<gpu::GpuChannelHost> channel);
   ~StreamTextureHost() override;
 
   // Listener class that is listening to the stream texture updates. It is
diff --git a/content/renderer/in_process_renderer_thread.cc b/content/renderer/in_process_renderer_thread.cc
index a2c8c5d..219df3e 100644
--- a/content/renderer/in_process_renderer_thread.cc
+++ b/content/renderer/in_process_renderer_thread.cc
@@ -15,12 +15,23 @@
 
 namespace content {
 
+#if defined(OS_ANDROID)
+extern bool g_browser_main_loop_shutting_down;
+#endif
+
 InProcessRendererThread::InProcessRendererThread(
     const InProcessChildThreadParams& params)
     : Thread("Chrome_InProcRendererThread"), params_(params) {
 }
 
 InProcessRendererThread::~InProcessRendererThread() {
+#if defined(OS_ANDROID)
+  // Don't allow the render thread to be shut down in single process mode on
+  // Android unless the browser is shutting down.
+  // Temporary CHECK() to debug http://crbug.com/514141
+  CHECK(g_browser_main_loop_shutting_down);
+#endif
+
   Stop();
 }
 
@@ -31,12 +42,22 @@
   // will not change the thread name kept in Java VM.
 #if defined(OS_ANDROID)
   base::android::AttachCurrentThreadWithName(thread_name());
+  // Make sure we aren't somehow reinitialising the inprocess renderer thread on
+  // Android. Temporary CHECK() to debug http://crbug.com/514141
+  CHECK(!render_process_);
 #endif
   render_process_.reset(new RenderProcessImpl());
   RenderThreadImpl::Create(params_);
 }
 
 void InProcessRendererThread::CleanUp() {
+#if defined(OS_ANDROID)
+  // Don't allow the render thread to be shut down in single process mode on
+  // Android unless the browser is shutting down.
+  // Temporary CHECK() to debug http://crbug.com/514141
+  CHECK(g_browser_main_loop_shutting_down);
+#endif
+
   render_process_.reset();
 
   // It's a little lame to manually set this flag.  But the single process
diff --git a/content/renderer/media/android/stream_texture_factory.cc b/content/renderer/media/android/stream_texture_factory.cc
index 5cc7c65..2408fa1 100644
--- a/content/renderer/media/android/stream_texture_factory.cc
+++ b/content/renderer/media/android/stream_texture_factory.cc
@@ -8,6 +8,7 @@
 #include "cc/output/context_provider.h"
 #include "content/common/gpu/client/context_provider_command_buffer.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
+#include "gpu/ipc/client/command_buffer_proxy_impl.h"
 #include "gpu/ipc/client/gpu_channel_host.h"
 #include "gpu/ipc/common/gpu_messages.h"
 #include "ui/gfx/geometry/size.h"
@@ -72,30 +73,27 @@
 
 // static
 scoped_refptr<StreamTextureFactory> StreamTextureFactory::Create(
-    const scoped_refptr<ContextProviderCommandBuffer>& context_provider,
-    gpu::GpuChannelHost* channel) {
-  return new StreamTextureFactory(context_provider, channel);
+    scoped_refptr<ContextProviderCommandBuffer> context_provider) {
+  return new StreamTextureFactory(std::move(context_provider));
 }
 
 StreamTextureFactory::StreamTextureFactory(
-    const scoped_refptr<ContextProviderCommandBuffer>& context_provider,
-    gpu::GpuChannelHost* channel)
-    : context_provider_(context_provider), channel_(channel) {
-  DCHECK(channel);
+    scoped_refptr<ContextProviderCommandBuffer> context_provider)
+    : context_provider_(std::move(context_provider)),
+      channel_(context_provider_->GetCommandBufferProxy()->channel()) {
+  DCHECK(channel_);
 }
 
 StreamTextureFactory::~StreamTextureFactory() {}
 
 StreamTextureProxy* StreamTextureFactory::CreateProxy() {
-  DCHECK(channel_.get());
-  StreamTextureHost* host = new StreamTextureHost(channel_.get());
+  StreamTextureHost* host = new StreamTextureHost(channel_);
   return new StreamTextureProxy(host);
 }
 
 void StreamTextureFactory::EstablishPeer(int32_t stream_id,
                                              int player_id,
                                              int frame_id) {
-  DCHECK(channel_.get());
   channel_->Send(
       new GpuStreamTextureMsg_EstablishPeer(stream_id, frame_id, player_id));
 }
diff --git a/content/renderer/media/android/stream_texture_factory.h b/content/renderer/media/android/stream_texture_factory.h
index 4d6bf44a..0b9d063 100644
--- a/content/renderer/media/android/stream_texture_factory.h
+++ b/content/renderer/media/android/stream_texture_factory.h
@@ -72,8 +72,7 @@
 class StreamTextureFactory : public base::RefCounted<StreamTextureFactory> {
  public:
   static scoped_refptr<StreamTextureFactory> Create(
-      const scoped_refptr<ContextProviderCommandBuffer>& context_provider,
-      gpu::GpuChannelHost* channel);
+      scoped_refptr<ContextProviderCommandBuffer> context_provider);
 
   // Create the StreamTextureProxy object.
   StreamTextureProxy* CreateProxy();
@@ -99,8 +98,7 @@
  private:
   friend class base::RefCounted<StreamTextureFactory>;
   StreamTextureFactory(
-      const scoped_refptr<ContextProviderCommandBuffer>& context_provider,
-      gpu::GpuChannelHost* channel);
+      scoped_refptr<ContextProviderCommandBuffer> context_provider);
   ~StreamTextureFactory();
 
   scoped_refptr<ContextProviderCommandBuffer> context_provider_;
diff --git a/content/renderer/media/media_stream_dispatcher.cc b/content/renderer/media/media_stream_dispatcher.cc
index 786196f..e19b1e03 100644
--- a/content/renderer/media/media_stream_dispatcher.cc
+++ b/content/renderer/media/media_stream_dispatcher.cc
@@ -68,7 +68,9 @@
       next_ipc_id_(0) {
 }
 
-MediaStreamDispatcher::~MediaStreamDispatcher() {}
+MediaStreamDispatcher::~MediaStreamDispatcher() {
+  DCHECK(device_change_subscribers_.empty());
+}
 
 void MediaStreamDispatcher::GenerateStream(
     int request_id,
@@ -209,6 +211,43 @@
   Send(new MediaStreamHostMsg_CloseDevice(routing_id(), label));
 }
 
+void MediaStreamDispatcher::SubscribeToDeviceChangeNotifications(
+    const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
+    const url::Origin& security_origin) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK(std::find_if(
+             device_change_subscribers_.begin(),
+             device_change_subscribers_.end(),
+             [&event_handler](
+                 const base::WeakPtr<MediaStreamDispatcherEventHandler>& item) {
+               return event_handler.get() == item.get();
+             }) == device_change_subscribers_.end());
+  DVLOG(1) << "MediaStreamDispatcher::SubscribeToDeviceChangeNotifications";
+
+  if (device_change_subscribers_.empty()) {
+    Send(new MediaStreamHostMsg_SubscribeToDeviceChangeNotifications(
+        routing_id(), security_origin));
+  }
+  device_change_subscribers_.push_back(event_handler);
+}
+
+void MediaStreamDispatcher::CancelDeviceChangeNotifications(
+    const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  DVLOG(1) << "MediaStreamDispatcher::SubscribeToDeviceChangeNotifications";
+  auto it = std::find_if(
+      device_change_subscribers_.begin(), device_change_subscribers_.end(),
+      [&event_handler](
+          const base::WeakPtr<MediaStreamDispatcherEventHandler>& item) {
+        return event_handler.get() == item.get();
+      });
+  CHECK(it != device_change_subscribers_.end());
+  device_change_subscribers_.erase(it);
+
+  if (device_change_subscribers_.empty())
+    Send(new MediaStreamHostMsg_CancelDeviceChangeNotifications(routing_id()));
+}
+
 void MediaStreamDispatcher::OnDestruct() {
   // Do not self-destruct. UserMediaClientImpl owns |this|.
 }
@@ -237,6 +276,7 @@
                         OnDeviceOpened)
     IPC_MESSAGE_HANDLER(MediaStreamMsg_DeviceOpenFailed,
                         OnDeviceOpenFailed)
+    IPC_MESSAGE_HANDLER(MediaStreamMsg_DevicesChanged, OnDevicesChanged)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
   return handled;
@@ -378,6 +418,14 @@
   }
 }
 
+void MediaStreamDispatcher::OnDevicesChanged() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  for (auto event_handler : device_change_subscribers_) {
+    DCHECK(event_handler);
+    event_handler->OnDevicesChanged();
+  }
+}
+
 int MediaStreamDispatcher::audio_session_id(const std::string& label,
                                             int index) {
   DCHECK(thread_checker_.CalledOnValidThread());
diff --git a/content/renderer/media/media_stream_dispatcher.h b/content/renderer/media/media_stream_dispatcher.h
index a41850d..e75a029 100644
--- a/content/renderer/media/media_stream_dispatcher.h
+++ b/content/renderer/media/media_stream_dispatcher.h
@@ -9,6 +9,7 @@
 #include <map>
 #include <memory>
 #include <string>
+#include <vector>
 
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
@@ -82,6 +83,17 @@
   // Close a started device. |label| is provided in OnDeviceOpened.
   void CloseDevice(const std::string& label);
 
+  // Register and unregister event handlers for device-change notifications.
+  // It is an error to try to subscribe a handler that is already subscribed or
+  // to cancel the subscription of a handler that is not subscribed. Also,
+  // each subscribed handler must make sure to invoke
+  // CancelDeviceChangeNotifications() before the handler is destroyed.
+  void SubscribeToDeviceChangeNotifications(
+      const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler,
+      const url::Origin& security_origin);
+  void CancelDeviceChangeNotifications(
+      const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler);
+
   // Check if the label is a valid stream.
   virtual bool IsStream(const std::string& label);
   // Get the video session_id given a label. The label identifies a stream.
@@ -128,6 +140,7 @@
       const std::string& label,
       const StreamDeviceInfo& device_info);
   void OnDeviceOpenFailed(int request_id);
+  void OnDevicesChanged();
 
   // Used for DCHECKs so methods calls won't execute in the wrong thread.
   base::ThreadChecker thread_checker_;
@@ -141,6 +154,9 @@
   typedef std::list<Request> RequestList;
   RequestList requests_;
 
+  std::vector<base::WeakPtr<MediaStreamDispatcherEventHandler>>
+      device_change_subscribers_;
+
   DISALLOW_COPY_AND_ASSIGN(MediaStreamDispatcher);
 };
 
diff --git a/content/renderer/media/media_stream_dispatcher_eventhandler.h b/content/renderer/media/media_stream_dispatcher_eventhandler.h
index f5595ac..6ecda16 100644
--- a/content/renderer/media/media_stream_dispatcher_eventhandler.h
+++ b/content/renderer/media/media_stream_dispatcher_eventhandler.h
@@ -46,6 +46,8 @@
   // Failed to open the device.
   virtual void OnDeviceOpenFailed(int request_id) = 0;
 
+  virtual void OnDevicesChanged() = 0;
+
  protected:
   virtual ~MediaStreamDispatcherEventHandler() {}
 };
diff --git a/content/renderer/media/media_stream_dispatcher_unittest.cc b/content/renderer/media/media_stream_dispatcher_unittest.cc
index 21b5816..56d476e 100644
--- a/content/renderer/media/media_stream_dispatcher_unittest.cc
+++ b/content/renderer/media/media_stream_dispatcher_unittest.cc
@@ -39,7 +39,7 @@
       public base::SupportsWeakPtr<MockMediaStreamDispatcherEventHandler> {
  public:
   MockMediaStreamDispatcherEventHandler()
-      : request_id_(-1) {}
+      : request_id_(-1), did_receive_devices_changed_(false) {}
 
   void OnStreamGenerated(
       int request_id,
@@ -89,6 +89,8 @@
 
   void OnDeviceOpenFailed(int request_id) override { request_id_ = request_id; }
 
+  void OnDevicesChanged() override { did_receive_devices_changed_ = true; }
+
   void ResetStoredParameters() {
     request_id_ = -1;
     label_ = "";
@@ -102,6 +104,7 @@
   std::string device_stopped_label_;
   StreamDeviceInfo audio_device_;
   StreamDeviceInfo video_device_;
+  bool did_receive_devices_changed_;
 };
 
 class MediaStreamDispatcherUnderTest : public MediaStreamDispatcher {
@@ -117,7 +120,7 @@
   MediaStreamDispatcherTest()
       : dispatcher_(new MediaStreamDispatcherUnderTest()),
         handler_(new MockMediaStreamDispatcherEventHandler),
-        security_origin_(url::Origin(GURL("http://test.com"))) {}
+        security_origin_(GURL("http://test.com")) {}
 
   // Generates a request for a MediaStream and returns the request id that is
   // used in IPC. Use this returned id in CompleteGenerateStream to identify
@@ -410,4 +413,23 @@
             StreamDeviceInfo::kNoId);
 }
 
+// Test that the MediaStreamDispatcherEventHandler is notified when the message
+// MediaStreamMsg_DevicesChanged is received.
+TEST_F(MediaStreamDispatcherTest, DevicesChanged) {
+  std::unique_ptr<MockMediaStreamDispatcherEventHandler> handler1(
+      new MockMediaStreamDispatcherEventHandler);
+  std::unique_ptr<MockMediaStreamDispatcherEventHandler> handler2(
+      new MockMediaStreamDispatcherEventHandler);
+  dispatcher_->SubscribeToDeviceChangeNotifications(handler1->AsWeakPtr(),
+                                                    security_origin_);
+  dispatcher_->SubscribeToDeviceChangeNotifications(handler2->AsWeakPtr(),
+                                                    security_origin_);
+  dispatcher_->OnMessageReceived(MediaStreamMsg_DevicesChanged(kRouteId));
+  dispatcher_->CancelDeviceChangeNotifications(handler1->AsWeakPtr());
+  dispatcher_->CancelDeviceChangeNotifications(handler2->AsWeakPtr());
+
+  EXPECT_TRUE(handler1->did_receive_devices_changed_);
+  EXPECT_TRUE(handler2->did_receive_devices_changed_);
+}
+
 }  // namespace content
diff --git a/content/renderer/media/peer_connection_identity_store.cc b/content/renderer/media/peer_connection_identity_store.cc
index 89b0579..89d91de 100644
--- a/content/renderer/media/peer_connection_identity_store.cc
+++ b/content/renderer/media/peer_connection_identity_store.cc
@@ -94,7 +94,7 @@
 void ObserverOnSuccess(
     const rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>& observer,
     std::unique_ptr<rtc::SSLIdentity> identity) {
-  observer->OnSuccess(rtc::scoped_ptr<rtc::SSLIdentity>(identity.release()));
+  observer->OnSuccess(std::move(identity));
 }
 
 }  // namespace
@@ -164,9 +164,6 @@
     // DtlsIdentityStoreInterface implementations have to be async.
     if (identity) {
       // Async call to |observer|->OnSuccess.
-      // Helper function necessary because OnSuccess takes an rtc::scoped_ptr
-      // argument which has to be Pass()-ed. base::Passed gets around this for
-      // scoped_ptr (without rtc namespace), but not for rtc::scoped_ptr.
       signaling_thread_->PostTask(FROM_HERE,
           base::Bind(&ObserverOnSuccess, observer, base::Passed(&identity)));
     } else {
diff --git a/content/renderer/media/renderer_gpu_video_accelerator_factories.cc b/content/renderer/media/renderer_gpu_video_accelerator_factories.cc
index 0020455..e4d1975 100644
--- a/content/renderer/media/renderer_gpu_video_accelerator_factories.cc
+++ b/content/renderer/media/renderer_gpu_video_accelerator_factories.cc
@@ -14,7 +14,6 @@
 #include "content/child/child_gpu_memory_buffer_manager.h"
 #include "content/child/child_thread_impl.h"
 #include "content/common/gpu/client/context_provider_command_buffer.h"
-#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
 #include "content/renderer/render_thread_impl.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
@@ -46,7 +45,7 @@
 // static
 std::unique_ptr<RendererGpuVideoAcceleratorFactories>
 RendererGpuVideoAcceleratorFactories::Create(
-    gpu::GpuChannelHost* gpu_channel_host,
+    scoped_refptr<gpu::GpuChannelHost> gpu_channel_host,
     const scoped_refptr<base::SingleThreadTaskRunner>& main_thread_task_runner,
     const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
     const scoped_refptr<ContextProviderCommandBuffer>& context_provider,
@@ -56,13 +55,13 @@
   RecordContextProviderPhaseUmaEnum(
       ContextProviderPhase::CONTEXT_PROVIDER_ACQUIRED);
   return base::WrapUnique(new RendererGpuVideoAcceleratorFactories(
-      gpu_channel_host, main_thread_task_runner, task_runner, context_provider,
-      enable_gpu_memory_buffer_video_frames, image_texture_targets,
-      enable_video_accelerator));
+      std::move(gpu_channel_host), main_thread_task_runner, task_runner,
+      context_provider, enable_gpu_memory_buffer_video_frames,
+      image_texture_targets, enable_video_accelerator));
 }
 
 RendererGpuVideoAcceleratorFactories::RendererGpuVideoAcceleratorFactories(
-    gpu::GpuChannelHost* gpu_channel_host,
+    scoped_refptr<gpu::GpuChannelHost> gpu_channel_host,
     const scoped_refptr<base::SingleThreadTaskRunner>& main_thread_task_runner,
     const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
     const scoped_refptr<ContextProviderCommandBuffer>& context_provider,
@@ -71,7 +70,7 @@
     bool enable_video_accelerator)
     : main_thread_task_runner_(main_thread_task_runner),
       task_runner_(task_runner),
-      gpu_channel_host_(gpu_channel_host),
+      gpu_channel_host_(std::move(gpu_channel_host)),
       context_provider_refptr_(context_provider),
       context_provider_(context_provider.get()),
       enable_gpu_memory_buffer_video_frames_(
@@ -115,13 +114,9 @@
   if (CheckContextLost())
     return nullptr;
 
-  gpu::GpuChannelHost* channel =
-      context_provider_->GetCommandBufferProxy()->channel();
-  DCHECK(channel);
-
   return std::unique_ptr<media::VideoDecodeAccelerator>(
       new media::GpuVideoDecodeAcceleratorHost(
-          channel, context_provider_->GetCommandBufferProxy()));
+          context_provider_->GetCommandBufferProxy()));
 }
 
 std::unique_ptr<media::VideoEncodeAccelerator>
@@ -131,13 +126,9 @@
   if (CheckContextLost())
     return nullptr;
 
-  gpu::GpuChannelHost* channel =
-      context_provider_->GetCommandBufferProxy()->channel();
-  DCHECK(channel);
-
   return std::unique_ptr<media::VideoEncodeAccelerator>(
       new media::GpuVideoEncodeAcceleratorHost(
-          channel, context_provider_->GetCommandBufferProxy()));
+          context_provider_->GetCommandBufferProxy()));
 }
 
 bool RendererGpuVideoAcceleratorFactories::CreateTextures(
diff --git a/content/renderer/media/renderer_gpu_video_accelerator_factories.h b/content/renderer/media/renderer_gpu_video_accelerator_factories.h
index a2dcb1a5..bb352de 100644
--- a/content/renderer/media/renderer_gpu_video_accelerator_factories.h
+++ b/content/renderer/media/renderer_gpu_video_accelerator_factories.h
@@ -47,7 +47,7 @@
   // Takes a ref on |gpu_channel_host| and tests |context| for loss before each
   // use.  Safe to call from any thread.
   static std::unique_ptr<RendererGpuVideoAcceleratorFactories> Create(
-      gpu::GpuChannelHost* gpu_channel_host,
+      scoped_refptr<gpu::GpuChannelHost> gpu_channel_host,
       const scoped_refptr<base::SingleThreadTaskRunner>&
           main_thread_task_runner,
       const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
@@ -98,7 +98,7 @@
 
  private:
   RendererGpuVideoAcceleratorFactories(
-      gpu::GpuChannelHost* gpu_channel_host,
+      scoped_refptr<gpu::GpuChannelHost> gpu_channel_host,
       const scoped_refptr<base::SingleThreadTaskRunner>&
           main_thread_task_runner,
       const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
diff --git a/content/renderer/media/rtc_certificate_generator.cc b/content/renderer/media/rtc_certificate_generator.cc
index 2928fa6b..5344fed 100644
--- a/content/renderer/media/rtc_certificate_generator.cc
+++ b/content/renderer/media/rtc_certificate_generator.cc
@@ -76,7 +76,7 @@
       GURL first_party_for_cookies,
       rtc::Optional<uint64_t> expires_ms) {
     DCHECK(signaling_thread_->BelongsToCurrentThread());
-    rtc::scoped_ptr<PeerConnectionIdentityStore> store(
+    std::unique_ptr<PeerConnectionIdentityStore> store(
         new PeerConnectionIdentityStore(main_thread_, signaling_thread_, url,
                                         first_party_for_cookies));
     // Request identity with |this| as the observer. OnSuccess/OnFailure will be
@@ -103,10 +103,10 @@
         rtc::kPemTypeRsaPrivateKey,
         reinterpret_cast<const unsigned char*>(der_private_key.data()),
         der_private_key.length());
-    OnSuccess(rtc::scoped_ptr<rtc::SSLIdentity>(
+    OnSuccess(std::unique_ptr<rtc::SSLIdentity>(
         rtc::SSLIdentity::FromPEMStrings(pem_key, pem_cert)));
   }
-  void OnSuccess(rtc::scoped_ptr<rtc::SSLIdentity> identity) override {
+  void OnSuccess(std::unique_ptr<rtc::SSLIdentity> identity) override {
     DCHECK(signaling_thread_->BelongsToCurrentThread());
     DCHECK(observer_);
     rtc::scoped_refptr<rtc::RTCCertificate> certificate =
diff --git a/content/renderer/media/rtc_video_encoder.cc b/content/renderer/media/rtc_video_encoder.cc
index 2a2891c..a1aa357 100644
--- a/content/renderer/media/rtc_video_encoder.cc
+++ b/content/renderer/media/rtc_video_encoder.cc
@@ -577,12 +577,12 @@
     // Do a strided copy of the input frame to match the input requirements for
     // the encoder.
     // TODO(sheu): support zero-copy from WebRTC.  http://crbug.com/269312
-    if (libyuv::I420Copy(next_frame->buffer(webrtc::kYPlane),
-                         next_frame->stride(webrtc::kYPlane),
-                         next_frame->buffer(webrtc::kUPlane),
-                         next_frame->stride(webrtc::kUPlane),
-                         next_frame->buffer(webrtc::kVPlane),
-                         next_frame->stride(webrtc::kVPlane),
+    if (libyuv::I420Copy(next_frame->video_frame_buffer()->DataY(),
+                         next_frame->video_frame_buffer()->StrideY(),
+                         next_frame->video_frame_buffer()->DataU(),
+                         next_frame->video_frame_buffer()->StrideU(),
+                         next_frame->video_frame_buffer()->DataV(),
+                         next_frame->video_frame_buffer()->StrideV(),
                          frame->data(media::VideoFrame::kYPlane),
                          frame->stride(media::VideoFrame::kYPlane),
                          frame->data(media::VideoFrame::kUPlane),
diff --git a/content/renderer/media/user_media_client_impl.cc b/content/renderer/media/user_media_client_impl.cc
index c8f32b1..37cd741 100644
--- a/content/renderer/media/user_media_client_impl.cc
+++ b/content/renderer/media/user_media_client_impl.cc
@@ -774,6 +774,11 @@
   NOTIMPLEMENTED();
 }
 
+void UserMediaClientImpl::OnDevicesChanged() {
+  DVLOG(1) << "UserMediaClientImpl::OnDevicesChanged()";
+  NOTIMPLEMENTED();
+}
+
 void UserMediaClientImpl::GetUserMediaRequestSucceeded(
     const blink::WebMediaStream& stream,
     blink::WebUserMediaRequest request_info) {
diff --git a/content/renderer/media/user_media_client_impl.h b/content/renderer/media/user_media_client_impl.h
index 2a11c2d2..fd2acad 100644
--- a/content/renderer/media/user_media_client_impl.h
+++ b/content/renderer/media/user_media_client_impl.h
@@ -83,6 +83,7 @@
                       const std::string& label,
                       const StreamDeviceInfo& device_info) override;
   void OnDeviceOpenFailed(int request_id) override;
+  void OnDevicesChanged() override;
 
   // RenderFrameObserver override
   void FrameWillClose() override;
diff --git a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
index 03bc115..68f5b0a 100644
--- a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
+++ b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
@@ -384,7 +384,7 @@
   if (!GetPcFactory().get())
     return NULL;
 
-  rtc::scoped_ptr<PeerConnectionIdentityStore> identity_store(
+  std::unique_ptr<PeerConnectionIdentityStore> identity_store(
       new PeerConnectionIdentityStore(
           base::ThreadTaskRunnerHandle::Get(), GetWebRtcSignalingThread(),
           GURL(web_frame->document().url()),
@@ -493,7 +493,7 @@
   } else {
     network_manager.reset(new EmptyNetworkManager(network_manager_));
   }
-  rtc::scoped_ptr<P2PPortAllocator> port_allocator(new P2PPortAllocator(
+  std::unique_ptr<P2PPortAllocator> port_allocator(new P2PPortAllocator(
       p2p_socket_dispatcher_, std::move(network_manager), socket_factory_.get(),
       port_config, requesting_origin, chrome_worker_thread_.task_runner()));
 
@@ -506,7 +506,7 @@
 // static
 rtc::scoped_refptr<rtc::RTCCertificate>
 PeerConnectionDependencyFactory::GenerateDefaultCertificate() {
-  rtc::scoped_ptr<rtc::SSLIdentity> identity(rtc::SSLIdentity::Generate(
+  std::unique_ptr<rtc::SSLIdentity> identity(rtc::SSLIdentity::Generate(
       webrtc::kIdentityName, rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)));
   return rtc::RTCCertificate::Create(std::move(identity));
 }
diff --git a/content/renderer/pepper/pepper_media_device_manager.cc b/content/renderer/pepper/pepper_media_device_manager.cc
index 0b04f28..4eabb8c 100644
--- a/content/renderer/pepper/pepper_media_device_manager.cc
+++ b/content/renderer/pepper/pepper_media_device_manager.cc
@@ -197,6 +197,8 @@
   NotifyDeviceOpened(request_id, false, std::string());
 }
 
+void PepperMediaDeviceManager::OnDevicesChanged() {}
+
 // static
 MediaStreamType PepperMediaDeviceManager::FromPepperDeviceType(
     PP_DeviceType_Dev type) {
diff --git a/content/renderer/pepper/pepper_media_device_manager.h b/content/renderer/pepper/pepper_media_device_manager.h
index c2ee4b9..90d6dc09 100644
--- a/content/renderer/pepper/pepper_media_device_manager.h
+++ b/content/renderer/pepper/pepper_media_device_manager.h
@@ -72,6 +72,7 @@
                       const std::string& label,
                       const StreamDeviceInfo& device_info) override;
   void OnDeviceOpenFailed(int request_id) override;
+  void OnDevicesChanged() override;
 
   // Stream type conversion.
   static MediaStreamType FromPepperDeviceType(PP_DeviceType_Dev type);
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc
index 16097c1e..17925e9 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.cc
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -781,55 +781,22 @@
   }
 }
 
-void PepperPluginInstanceImpl::CommitTextureMailbox(
-    const cc::TextureMailbox& texture_mailbox) {
-  if (committed_texture_.IsValid() && !committed_texture_in_use_) {
-    bound_graphics_3d_->ReturnFrontBuffer(
-        committed_texture_.mailbox(), committed_texture_consumed_sync_token_,
-        false);
-  }
-
-  committed_texture_ = texture_mailbox;
-  committed_texture_in_use_ = false;
-
+void PepperPluginInstanceImpl::CommitBackingTexture() {
   if (!texture_layer_) {
     UpdateLayer(true);
     return;
   }
 
-  PassCommittedTextureToTextureLayer();
+  gpu::Mailbox mailbox;
+  gpu::SyncToken sync_token;
+  bound_graphics_3d_->GetBackingMailbox(&mailbox, &sync_token);
+  DCHECK(!mailbox.IsZero());
+  DCHECK(sync_token.HasData());
+  texture_layer_->SetTextureMailboxWithoutReleaseCallback(
+      cc::TextureMailbox(mailbox, sync_token, GL_TEXTURE_2D));
   texture_layer_->SetNeedsDisplay();
 }
 
-void PepperPluginInstanceImpl::PassCommittedTextureToTextureLayer() {
-  DCHECK(bound_graphics_3d_);
-
-  if (!committed_texture_.IsValid())
-    return;
-
-  std::unique_ptr<cc::SingleReleaseCallback> callback(
-      cc::SingleReleaseCallback::Create(base::Bind(
-          &PepperPluginInstanceImpl::FinishedConsumingCommittedTexture,
-          weak_factory_.GetWeakPtr(), committed_texture_)));
-
-  committed_texture_in_use_ = true;
-  texture_layer_->SetTextureMailbox(committed_texture_, std::move(callback));
-}
-
-void PepperPluginInstanceImpl::FinishedConsumingCommittedTexture(
-    const cc::TextureMailbox& texture_mailbox,
-    const gpu::SyncToken& sync_token,
-    bool is_lost) {
-  if (committed_texture_.mailbox() == texture_mailbox.mailbox() && !is_lost) {
-    committed_texture_in_use_ = false;
-    committed_texture_consumed_sync_token_ = sync_token;
-    return;
-  }
-
-  bound_graphics_3d_->ReturnFrontBuffer(texture_mailbox.mailbox(), sync_token,
-                                        is_lost);
-}
-
 void PepperPluginInstanceImpl::InstanceCrashed() {
   // Force free all resources and vars.
   HostGlobals::Get()->InstanceCrashed(pp_instance());
@@ -2050,7 +2017,12 @@
   if (!container_)
     return;
 
-  bool want_3d_layer = !!bound_graphics_3d_.get();
+  gpu::Mailbox mailbox;
+  gpu::SyncToken sync_token;
+  if (bound_graphics_3d_.get()) {
+    bound_graphics_3d_->GetBackingMailbox(&mailbox, &sync_token);
+  }
+  bool want_3d_layer = !mailbox.IsZero() && sync_token.HasData();
   bool want_2d_layer = !!bound_graphics_2d_platform_;
   bool want_texture_layer = want_3d_layer || want_2d_layer;
   bool want_compositor_layer = !!bound_compositor_;
@@ -2089,8 +2061,8 @@
       DCHECK(bound_graphics_3d_.get());
       texture_layer_ = cc::TextureLayer::CreateForMailbox(NULL);
       opaque = bound_graphics_3d_->IsOpaque();
-
-      PassCommittedTextureToTextureLayer();
+      texture_layer_->SetTextureMailboxWithoutReleaseCallback(
+          cc::TextureMailbox(mailbox, sync_token, GL_TEXTURE_2D));
     } else {
       DCHECK(bound_graphics_2d_platform_);
       texture_layer_ = cc::TextureLayer::CreateForMailbox(this);
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.h b/content/renderer/pepper/pepper_plugin_instance_impl.h
index 315381f..da46179 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.h
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.h
@@ -24,7 +24,6 @@
 #include "cc/layers/content_layer_client.h"
 #include "cc/layers/layer.h"
 #include "cc/layers/texture_layer_client.h"
-#include "cc/resources/texture_mailbox.h"
 #include "content/common/content_export.h"
 #include "content/public/renderer/pepper_plugin_instance.h"
 #include "content/public/renderer/plugin_instance_throttler.h"
@@ -198,17 +197,9 @@
   // slow path can also be triggered if there is an overlapping frame.
   void ScrollRect(int dx, int dy, const gfx::Rect& rect);
 
-  // Commit the texture mailbox to the screen.
-  void CommitTextureMailbox(const cc::TextureMailbox& texture_mailbox);
-
-  // Passes the committed texture to |texture_layer_| and marks it as in use.
-  void PassCommittedTextureToTextureLayer();
-
-  // Callback when the compositor is finished consuming the committed texture.
-  void FinishedConsumingCommittedTexture(
-      const cc::TextureMailbox& texture_mailbox,
-      const gpu::SyncToken& sync_token,
-      bool is_lost);
+  // Commit the backing texture to the screen once the side effects some
+  // rendering up to an offscreen SwapBuffers are visible.
+  void CommitBackingTexture();
 
   // Called when the out-of-process plugin implementing this instance crashed.
   void InstanceCrashed();
@@ -942,16 +933,6 @@
   // The text that is currently selected in the plugin.
   base::string16 selected_text_;
 
-  // The most recently committed texture. This is kept around in case the layer
-  // needs to be regenerated.
-  cc::TextureMailbox committed_texture_;
-
-  // Whether the most recently committed texture is still in use by the
-  // compositor.
-  bool committed_texture_in_use_ = false;
-
-  gpu::SyncToken committed_texture_consumed_sync_token_;
-
   bool initialized_;
 
   // We use a weak ptr factory for scheduling DidChangeView events so that we
diff --git a/content/renderer/pepper/pepper_video_decoder_host.cc b/content/renderer/pepper/pepper_video_decoder_host.cc
index d9b15e6..00fbe5d 100644
--- a/content/renderer/pepper/pepper_video_decoder_host.cc
+++ b/content/renderer/pepper/pepper_video_decoder_host.cc
@@ -147,10 +147,8 @@
   if (acceleration != PP_HARDWAREACCELERATION_NONE) {
     // This is not synchronous, but subsequent IPC messages will be buffered, so
     // it is okay to immediately send IPC messages.
-    gpu::GpuChannelHost* channel = command_buffer->channel();
-    if (channel) {
-      decoder_.reset(
-          new media::GpuVideoDecodeAcceleratorHost(channel, command_buffer));
+    if (command_buffer->channel()) {
+      decoder_.reset(new media::GpuVideoDecodeAcceleratorHost(command_buffer));
       if (decoder_->Initialize(profile_, this)) {
         initialized_ = true;
         return PP_OK;
diff --git a/content/renderer/pepper/pepper_video_encoder_host.cc b/content/renderer/pepper/pepper_video_encoder_host.cc
index e8e54bc2..c33407f 100644
--- a/content/renderer/pepper/pepper_video_encoder_host.cc
+++ b/content/renderer/pepper/pepper_video_encoder_host.cc
@@ -466,7 +466,9 @@
 
   if (EnsureGpuChannel()) {
     profiles = media::GpuVideoAcceleratorUtil::ConvertGpuToMediaEncodeProfiles(
-        channel_->gpu_info().video_encode_accelerator_supported_profiles);
+        command_buffer_->channel()
+            ->gpu_info()
+            .video_encode_accelerator_supported_profiles);
     for (media::VideoEncodeAccelerator::SupportedProfile profile : profiles) {
       if (profile.profile == media::VP9PROFILE_PROFILE1 ||
           profile.profile == media::VP9PROFILE_PROFILE2 ||
@@ -517,13 +519,14 @@
 
   // There is no guarantee that we have a 3D context to work with. So
   // we create a dummy command buffer to communicate with the gpu process.
-  channel_ = RenderThreadImpl::current()->EstablishGpuChannelSync(
-      CAUSE_FOR_GPU_LAUNCH_PEPPERVIDEOENCODERACCELERATOR_INITIALIZE);
-  if (!channel_)
+  scoped_refptr<gpu::GpuChannelHost> channel =
+      RenderThreadImpl::current()->EstablishGpuChannelSync(
+          CAUSE_FOR_GPU_LAUNCH_PEPPERVIDEOENCODERACCELERATOR_INITIALIZE);
+  if (!channel)
     return false;
 
   std::vector<int32_t> attribs(1, PP_GRAPHICS3DATTRIB_NONE);
-  command_buffer_ = channel_->CreateCommandBuffer(
+  command_buffer_ = channel->CreateCommandBuffer(
       gpu::kNullSurfaceHandle, gfx::Size(), nullptr,
       gpu::GpuChannelHost::kDefaultStreamId,
       gpu::GpuChannelHost::kDefaultStreamPriority, attribs, GURL::EmptyGURL(),
@@ -535,11 +538,6 @@
 
   command_buffer_->SetGpuControlClient(this);
 
-  if (!command_buffer_->Initialize()) {
-    Close();
-    return false;
-  }
-
   return true;
 }
 
@@ -553,8 +551,8 @@
   if (!EnsureGpuChannel())
     return false;
 
-  encoder_.reset(new media::GpuVideoEncodeAcceleratorHost(
-      channel_.get(), command_buffer_.get()));
+  encoder_.reset(
+      new media::GpuVideoEncodeAcceleratorHost(command_buffer_.get()));
   return encoder_->Initialize(input_format, input_visible_size, output_profile,
                               initial_bitrate, this);
 }
diff --git a/content/renderer/pepper/pepper_video_encoder_host.h b/content/renderer/pepper/pepper_video_encoder_host.h
index fef17f3..53b9506 100644
--- a/content/renderer/pepper/pepper_video_encoder_host.h
+++ b/content/renderer/pepper/pepper_video_encoder_host.h
@@ -137,7 +137,6 @@
   // Buffer manager for shared memory that holds video frames.
   ppapi::MediaStreamBufferManager buffer_manager_;
 
-  scoped_refptr<gpu::GpuChannelHost> channel_;
   std::unique_ptr<gpu::CommandBufferProxyImpl> command_buffer_;
 
   std::unique_ptr<media::VideoEncodeAccelerator> encoder_;
diff --git a/content/renderer/pepper/ppb_graphics_3d_impl.cc b/content/renderer/pepper/ppb_graphics_3d_impl.cc
index 0681198..f1a00da 100644
--- a/content/renderer/pepper/ppb_graphics_3d_impl.cc
+++ b/content/renderer/pepper/ppb_graphics_3d_impl.cc
@@ -28,7 +28,6 @@
 #include "third_party/WebKit/public/web/WebElement.h"
 #include "third_party/WebKit/public/web/WebLocalFrame.h"
 #include "third_party/WebKit/public/web/WebPluginContainer.h"
-#include "third_party/khronos/GLES2/gl2.h"
 
 using ppapi::thunk::EnterResourceNoLock;
 using ppapi::thunk::PPB_Graphics3D_API;
@@ -115,23 +114,6 @@
   command_buffer_->EnsureWorkVisible();
 }
 
-void PPB_Graphics3D_Impl::TakeFrontBuffer() {
-  if (!taken_front_buffer_.IsZero()) {
-    DLOG(ERROR)
-        << "TakeFrontBuffer should only be called once before DoSwapBuffers";
-    return;
-  }
-  taken_front_buffer_ = GenerateMailbox();
-  command_buffer_->TakeFrontBuffer(taken_front_buffer_);
-}
-
-void PPB_Graphics3D_Impl::ReturnFrontBuffer(const gpu::Mailbox& mailbox,
-                                            const gpu::SyncToken& sync_token,
-                                            bool is_lost) {
-  command_buffer_->ReturnFrontBuffer(mailbox, sync_token, is_lost);
-  mailboxes_to_reuse_.push_back(mailbox);
-}
-
 bool PPB_Graphics3D_Impl::BindToInstance(bool bind) {
   bound_to_instance_ = bind;
   return true;
@@ -161,10 +143,8 @@
 
 int32_t PPB_Graphics3D_Impl::DoSwapBuffers(const gpu::SyncToken& sync_token) {
   DCHECK(command_buffer_);
-  if (taken_front_buffer_.IsZero()) {
-    DLOG(ERROR) << "TakeFrontBuffer should be called before DoSwapBuffers";
-    return PP_ERROR_FAILED;
-  }
+  if (sync_token.HasData())
+    sync_token_ = sync_token;
 
   if (bound_to_instance_) {
     // If we are bound to the instance, we need to ask the compositor
@@ -174,18 +154,14 @@
     //
     // Don't need to check for NULL from GetPluginInstance since when we're
     // bound, we know our instance is valid.
-    cc::TextureMailbox texture_mailbox(taken_front_buffer_, sync_token,
-                                       GL_TEXTURE_2D);
-    taken_front_buffer_.SetZero();
-    HostGlobals::Get()
-        ->GetInstance(pp_instance())
-        ->CommitTextureMailbox(texture_mailbox);
+    HostGlobals::Get()->GetInstance(pp_instance())->CommitBackingTexture();
     commit_pending_ = true;
   } else {
     // Wait for the command to complete on the GPU to allow for throttling.
     command_buffer_->SignalSyncToken(
-        sync_token, base::Bind(&PPB_Graphics3D_Impl::OnSwapBuffers,
-                               weak_ptr_factory_.GetWeakPtr()));
+        sync_token_,
+        base::Bind(&PPB_Graphics3D_Impl::OnSwapBuffers,
+                   weak_ptr_factory_.GetWeakPtr()));
   }
 
   return PP_OK_COMPLETIONPENDING;
@@ -220,9 +196,10 @@
   if (!render_thread)
     return false;
 
-  channel_ = render_thread->EstablishGpuChannelSync(
-      CAUSE_FOR_GPU_LAUNCH_PEPPERPLATFORMCONTEXT3DIMPL_INITIALIZE);
-  if (!channel_.get())
+  scoped_refptr<gpu::GpuChannelHost> channel =
+      render_thread->EstablishGpuChannelSync(
+          CAUSE_FOR_GPU_LAUNCH_PEPPERPLATFORMCONTEXT3DIMPL_INITIALIZE);
+  if (!channel)
     return false;
 
   gfx::Size surface_size;
@@ -266,7 +243,7 @@
     share_buffer = share_graphics->GetCommandBufferProxy();
   }
 
-  command_buffer_ = channel_->CreateCommandBuffer(
+  command_buffer_ = channel->CreateCommandBuffer(
       gpu::kNullSurfaceHandle, surface_size, share_buffer,
       gpu::GpuChannelHost::kDefaultStreamId,
       gpu::GpuChannelHost::kDefaultStreamPriority, attribs, GURL::EmptyGURL(),
@@ -276,9 +253,6 @@
 
   command_buffer_->SetGpuControlClient(this);
 
-  if (!command_buffer_->Initialize())
-    return false;
-
   if (shared_state_handle)
     *shared_state_handle = command_buffer_->GetSharedStateHandle();
   if (capabilities)
@@ -286,6 +260,10 @@
   if (command_buffer_id)
     *command_buffer_id = command_buffer_->GetCommandBufferID();
 
+  mailbox_ = gpu::Mailbox::Generate();
+  if (!command_buffer_->ProduceFrontBuffer(mailbox_))
+    return false;
+
   return true;
 }
 
@@ -363,14 +341,4 @@
     ppp_graphics_3d->Graphics3DContextLost(this_pp_instance);
 }
 
-gpu::Mailbox PPB_Graphics3D_Impl::GenerateMailbox() {
-  if (!mailboxes_to_reuse_.empty()) {
-    gpu::Mailbox mailbox = mailboxes_to_reuse_.back();
-    mailboxes_to_reuse_.pop_back();
-    return mailbox;
-  }
-
-  return gpu::Mailbox::Generate();
-}
-
 }  // namespace content
diff --git a/content/renderer/pepper/ppb_graphics_3d_impl.h b/content/renderer/pepper/ppb_graphics_3d_impl.h
index 158f319..8216f63 100644
--- a/content/renderer/pepper/ppb_graphics_3d_impl.h
+++ b/content/renderer/pepper/ppb_graphics_3d_impl.h
@@ -22,7 +22,6 @@
 namespace gpu {
 struct Capabilities;
 class CommandBufferProxyImpl;
-class GpuChannelHost;
 }
 
 namespace content {
@@ -48,10 +47,6 @@
   gpu::CommandBuffer::State WaitForGetOffsetInRange(int32_t start,
                                                     int32_t end) override;
   void EnsureWorkVisible() override;
-  void TakeFrontBuffer() override;
-  void ReturnFrontBuffer(const gpu::Mailbox& mailbox,
-                         const gpu::SyncToken& sync_token,
-                         bool is_lost);
 
   // Binds/unbinds the graphics of this context with the associated instance.
   // Returns true if binding/unbinding is successful.
@@ -64,9 +59,12 @@
   // These messages are used to send Flush callbacks to the plugin.
   void ViewInitiatedPaint();
 
-  gpu::CommandBufferProxyImpl* GetCommandBufferProxy();
+  void GetBackingMailbox(gpu::Mailbox* mailbox, gpu::SyncToken* sync_token) {
+    *mailbox = mailbox_;
+    *sync_token = sync_token_;
+  }
 
-  gpu::GpuChannelHost* channel() { return channel_.get(); }
+  gpu::CommandBufferProxyImpl* GetCommandBufferProxy();
 
  protected:
   ~PPB_Graphics3D_Impl() override;
@@ -94,16 +92,6 @@
   // Notifications sent to plugin.
   void SendContextLost();
 
-  // Reuses a mailbox if one is available, otherwise makes a new one.
-  gpu::Mailbox GenerateMailbox();
-
-  // A front buffer that was recently taken from the command buffer. This should
-  // be immediately consumed by DoSwapBuffers().
-  gpu::Mailbox taken_front_buffer_;
-
-  // Mailboxes that are no longer in use.
-  std::vector<gpu::Mailbox> mailboxes_to_reuse_;
-
   // True if context is bound to instance.
   bool bound_to_instance_;
   // True when waiting for compositor to commit our backing texture.
@@ -113,8 +101,9 @@
   bool lost_context_ = false;
 #endif
 
+  gpu::Mailbox mailbox_;
+  gpu::SyncToken sync_token_;
   bool has_alpha_;
-  scoped_refptr<gpu::GpuChannelHost> channel_;
   std::unique_ptr<gpu::CommandBufferProxyImpl> command_buffer_;
 
   base::WeakPtrFactory<PPB_Graphics3D_Impl> weak_ptr_factory_;
diff --git a/content/renderer/pepper/ppb_video_decoder_impl.cc b/content/renderer/pepper/ppb_video_decoder_impl.cc
index 50c104b..0f31ea09 100644
--- a/content/renderer/pepper/ppb_video_decoder_impl.cc
+++ b/content/renderer/pepper/ppb_video_decoder_impl.cc
@@ -129,10 +129,8 @@
 
   // This is not synchronous, but subsequent IPC messages will be buffered, so
   // it is okay to immediately send IPC messages.
-  gpu::GpuChannelHost* channel = command_buffer->channel();
-  if (channel) {
-    decoder_.reset(
-        new media::GpuVideoDecodeAcceleratorHost(channel, command_buffer));
+  if (command_buffer->channel()) {
+    decoder_.reset(new media::GpuVideoDecodeAcceleratorHost(command_buffer));
     return decoder_->Initialize(PPToMediaProfile(profile), this);
   }
   return false;
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index bb7fee6..8cf5595 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -82,7 +82,6 @@
 #include "content/public/common/content_constants.h"
 #include "content/public/common/content_paths.h"
 #include "content/public/common/content_switches.h"
-#include "content/public/common/mojo_channel_switches.h"
 #include "content/public/common/renderer_preferences.h"
 #include "content/public/common/url_constants.h"
 #include "content/public/renderer/content_renderer_client.h"
@@ -128,6 +127,7 @@
 #include "gin/public/debug.h"
 #include "gpu/GLES2/gl2extchromium.h"
 #include "gpu/command_buffer/client/shared_memory_limits.h"
+#include "gpu/ipc/client/command_buffer_proxy_impl.h"
 #include "gpu/ipc/client/gpu_channel_host.h"
 #include "ipc/ipc_channel_handle.h"
 #include "ipc/ipc_platform_file.h"
@@ -161,7 +161,6 @@
 #include "third_party/skia/include/core/SkGraphics.h"
 #include "ui/base/layout.h"
 #include "ui/base/ui_base_switches.h"
-#include "v8/include/v8.h"
 
 #if defined(OS_ANDROID)
 #include <cpu-features.h>
@@ -242,6 +241,17 @@
 base::LazyInstance<base::ThreadLocalPointer<RenderThreadImpl> >
     lazy_tls = LAZY_INSTANCE_INITIALIZER;
 
+// v8::MemoryPressureLevel should correspond to base::MemoryPressureListener.
+static_assert(static_cast<v8::MemoryPressureLevel>(
+    base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) ==
+        v8::MemoryPressureLevel::kNone, "none level not align");
+static_assert(static_cast<v8::MemoryPressureLevel>(
+    base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE) ==
+        v8::MemoryPressureLevel::kModerate, "moderate level not align");
+static_assert(static_cast<v8::MemoryPressureLevel>(
+    base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) ==
+        v8::MemoryPressureLevel::kCritical, "critical level not align");
+
 class WebThreadForCompositor : public WebThreadImplForWorkerScheduler {
  public:
   explicit WebThreadForCompositor(base::Thread::Options options)
@@ -303,13 +313,6 @@
   v8::Date::DateTimeConfigurationChangeNotification(isolate);
 }
 
-void LowMemoryNotificationOnThisThread() {
-  v8::Isolate* isolate = v8::Isolate::GetCurrent();
-  if (!isolate)
-    return;
-  isolate->LowMemoryNotification();
-}
-
 class RenderFrameSetupImpl : public mojom::RenderFrameSetup {
  public:
   explicit RenderFrameSetupImpl(
@@ -401,8 +404,9 @@
   }
 }
 
-std::unique_ptr<WebGraphicsContext3DCommandBufferImpl> CreateOffscreenContext(
-    scoped_refptr<gpu::GpuChannelHost> gpu_channel_host) {
+scoped_refptr<ContextProviderCommandBuffer> CreateOffscreenContext(
+    scoped_refptr<gpu::GpuChannelHost> gpu_channel_host,
+    command_buffer_metrics::ContextType type) {
   DCHECK(gpu_channel_host);
   // This is used to create a few different offscreen contexts:
   // - The shared main thread context (offscreen) used by blink for canvas.
@@ -418,11 +422,11 @@
   attributes.bind_generates_resource = false;
   attributes.lose_context_when_out_of_memory = true;
   constexpr bool automatic_flushes = false;
-  return base::WrapUnique(new WebGraphicsContext3DCommandBufferImpl(
-      gpu::kNullSurfaceHandle,
-      GURL("chrome://gpu/RenderThreadImpl::CreateOffscreenContext3d"),
-      gpu_channel_host.get(), attributes, gfx::PreferIntegratedGpu,
-      automatic_flushes));
+  return make_scoped_refptr(new ContextProviderCommandBuffer(
+      std::move(gpu_channel_host), gpu::kNullSurfaceHandle,
+      GURL("chrome://gpu/RenderThreadImpl::CreateOffscreenContext"),
+      gfx::PreferIntegratedGpu, automatic_flushes, gpu::SharedMemoryLimits(),
+      attributes, nullptr, type));
 }
 
 }  // namespace
@@ -573,9 +577,7 @@
     std::unique_ptr<scheduler::RendererScheduler> scheduler,
     scoped_refptr<base::SingleThreadTaskRunner>& resource_task_queue)
     : ChildThreadImpl(Options::Builder()
-                          .InBrowserProcess(params)
-                          .UseMojoChannel(ShouldUseMojoChannel())
-                          .Build()),
+          .InBrowserProcess(params).UseMojoChannel(true).Build()),
       renderer_scheduler_(std::move(scheduler)),
       raster_worker_pool_(new RasterWorkerPool()) {
   Init(resource_task_queue);
@@ -586,8 +588,7 @@
 RenderThreadImpl::RenderThreadImpl(
     std::unique_ptr<base::MessageLoop> main_message_loop,
     std::unique_ptr<scheduler::RendererScheduler> scheduler)
-    : ChildThreadImpl(
-          Options::Builder().UseMojoChannel(ShouldUseMojoChannel()).Build()),
+    : ChildThreadImpl(Options::Builder().UseMojoChannel(true).Build()),
       renderer_scheduler_(std::move(scheduler)),
       main_message_loop_(std::move(main_message_loop)),
       raster_worker_pool_(new RasterWorkerPool()) {
@@ -777,7 +778,9 @@
 #endif
 
   memory_pressure_listener_.reset(new base::MemoryPressureListener(
-      base::Bind(&RenderThreadImpl::OnMemoryPressure, base::Unretained(this))));
+      base::Bind(&RenderThreadImpl::OnMemoryPressure, base::Unretained(this)),
+      base::Bind(&RenderThreadImpl::OnSyncMemoryPressure,
+                 base::Unretained(this))));
 
   int num_raster_threads = 0;
   std::string string_value =
@@ -1255,11 +1258,6 @@
 }
 
 void RenderThreadImpl::RegisterSchemes() {
-  // swappedout:
-  WebString swappedout_scheme(base::ASCIIToUTF16(kSwappedOutScheme));
-  WebSecurityPolicy::registerURLSchemeAsDisplayIsolated(swappedout_scheme);
-  WebSecurityPolicy::registerURLSchemeAsEmptyDocument(swappedout_scheme);
-
   // chrome:
   WebString chrome_scheme(base::ASCIIToUTF16(kChromeUIScheme));
   WebSecurityPolicy::registerURLSchemeAsDisplayIsolated(chrome_scheme);
@@ -1428,7 +1426,7 @@
                        &image_texture_targets);
 
     gpu_factories_.push_back(RendererGpuVideoAcceleratorFactories::Create(
-        gpu_channel_host.get(), base::ThreadTaskRunnerHandle::Get(),
+        std::move(gpu_channel_host), base::ThreadTaskRunnerHandle::Get(),
         media_task_runner, shared_context_provider,
         enable_gpu_memory_buffer_video_frames, image_texture_targets,
         enable_video_accelerator));
@@ -1452,9 +1450,9 @@
     return nullptr;
   }
 
-  shared_main_thread_contexts_ = new ContextProviderCommandBuffer(
-      CreateOffscreenContext(std::move(gpu_channel_host)),
-      gpu::SharedMemoryLimits(), nullptr, RENDERER_MAINTHREAD_CONTEXT);
+  shared_main_thread_contexts_ = CreateOffscreenContext(
+      std::move(gpu_channel_host),
+      command_buffer_metrics::RENDERER_MAINTHREAD_CONTEXT);
   if (!shared_main_thread_contexts_->BindToCurrentThread())
     shared_main_thread_contexts_ = nullptr;
   return shared_main_thread_contexts_;
@@ -1467,19 +1465,16 @@
   if (!stream_texture_factory_.get() ||
       stream_texture_factory_->ContextGL()->GetGraphicsResetStatusKHR() !=
           GL_NO_ERROR) {
-    if (!SharedMainThreadContextProvider().get()) {
+    scoped_refptr<ContextProviderCommandBuffer> shared_context_provider =
+        SharedMainThreadContextProvider();
+    if (!shared_context_provider) {
       stream_texture_factory_ = NULL;
       return NULL;
     }
-    scoped_refptr<gpu::GpuChannelHost> gpu_channel_host(EstablishGpuChannelSync(
-        CAUSE_FOR_GPU_LAUNCH_VIDEODECODEACCELERATOR_INITIALIZE));
-    if (!gpu_channel_host.get()) {
-      LOG(ERROR) << "Failed to establish GPU channel for media player";
-      stream_texture_factory_ = NULL;
-    } else {
-      stream_texture_factory_ = StreamTextureFactory::Create(
-          shared_main_thread_contexts_, gpu_channel_host.get());
-    }
+    DCHECK(shared_context_provider->GetCommandBufferProxy());
+    DCHECK(shared_context_provider->GetCommandBufferProxy()->channel());
+    stream_texture_factory_ =
+        StreamTextureFactory::Create(std::move(shared_context_provider));
   }
   return stream_texture_factory_;
 }
@@ -1634,6 +1629,16 @@
   notify_webkit_of_modal_loop_ = false;
 }
 
+void RenderThreadImpl::OnChannelError() {
+  // In single-process mode, the renderer can't be restarted after shutdown.
+  // So, if we get a channel error, crash the whole process right now to get a
+  // more informative stack, since we will otherwise just crash later when we
+  // try to restart it.
+  CHECK(!base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kSingleProcess));
+  ChildThreadImpl::OnChannelError();
+}
+
 bool RenderThreadImpl::OnControlMessageReceived(const IPC::Message& msg) {
   base::ObserverListBase<RenderThreadObserver>::Iterator it(&observers_);
   RenderThreadObserver* observer;
@@ -1720,15 +1725,15 @@
   RenderViewImpl::Create(compositor_deps, params, false);
 }
 
-gpu::GpuChannelHost* RenderThreadImpl::EstablishGpuChannelSync(
+scoped_refptr<gpu::GpuChannelHost> RenderThreadImpl::EstablishGpuChannelSync(
     CauseForGpuLaunch cause_for_gpu_launch) {
   TRACE_EVENT0("gpu", "RenderThreadImpl::EstablishGpuChannelSync");
 
-  if (gpu_channel_.get()) {
+  if (gpu_channel_) {
     // Do nothing if we already have a GPU channel or are already
     // establishing one.
     if (!gpu_channel_->IsLost())
-      return gpu_channel_.get();
+      return gpu_channel_;
 
     // Recreate the channel if it has been lost.
     gpu_channel_->DestroyChannel();
@@ -1758,7 +1763,7 @@
   gpu_channel_ = gpu::GpuChannelHost::Create(
       this, client_id, gpu_info, channel_handle,
       ChildProcess::current()->GetShutDownEvent(), gpu_memory_buffer_manager());
-  return gpu_channel_.get();
+  return gpu_channel_;
 }
 
 blink::WebMediaStreamCenter* RenderThreadImpl::CreateMediaStreamCenter(
@@ -1785,7 +1790,7 @@
 #endif
 
 gpu::GpuChannelHost* RenderThreadImpl::GetGpuChannel() {
-  if (!gpu_channel_.get())
+  if (!gpu_channel_)
     return NULL;
 
   if (gpu_channel_->IsLost())
@@ -1875,6 +1880,7 @@
 
 void RenderThreadImpl::OnMemoryPressure(
     base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
+  TRACE_EVENT0("memory","RenderThreadImpl::OnMemoryPressure");
   ReleaseFreeMemory();
 
   // Do not call into blink if it is not initialized.
@@ -1882,19 +1888,6 @@
     blink::WebMemoryPressureListener::onMemoryPressure(
         static_cast<blink::WebMemoryPressureLevel>(memory_pressure_level));
 
-    if (blink::mainThreadIsolate()) {
-      // Trigger full v8 garbage collection on memory pressure notifications.
-      // This will potentially hang the renderer for a long time, however, when
-      // we receive a memory pressure notification, we might be about to be
-      // killed. Because of the janky hang don't do this to foreground
-      // renderers.
-      if (RendererIsHidden()) {
-        blink::mainThreadIsolate()->LowMemoryNotification();
-        RenderThread::Get()->PostTaskToAllWebWorkers(
-            base::Bind(&LowMemoryNotificationOnThisThread));
-      }
-    }
-
     if (memory_pressure_level ==
         base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) {
       // Purge Skia font cache, by setting it to 0 and then again to the
@@ -1954,9 +1947,9 @@
     return shared_worker_context_provider_;
   }
 
-  shared_worker_context_provider_ = new ContextProviderCommandBuffer(
-      CreateOffscreenContext(std::move(gpu_channel_host)),
-      gpu::SharedMemoryLimits(), nullptr, RENDER_WORKER_CONTEXT);
+  shared_worker_context_provider_ =
+      CreateOffscreenContext(std::move(gpu_channel_host),
+                             command_buffer_metrics::RENDER_WORKER_CONTEXT);
   if (!shared_worker_context_provider_->BindToCurrentThread())
     shared_worker_context_provider_ = nullptr;
   if (shared_worker_context_provider_)
@@ -2054,4 +2047,24 @@
   DCHECK_EQ(1u, erased);
 }
 
+void RenderThreadImpl::OnSyncMemoryPressure(
+    base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
+  if (!blink::mainThreadIsolate())
+    return;
+
+  v8::MemoryPressureLevel v8_memory_pressure_level =
+      static_cast<v8::MemoryPressureLevel>(memory_pressure_level);
+
+  // In order to reduce performance impact, translate critical level to
+  // moderate level for foregroud renderer.
+  if (!RendererIsHidden() &&
+      v8_memory_pressure_level == v8::MemoryPressureLevel::kCritical)
+    v8_memory_pressure_level = v8::MemoryPressureLevel::kModerate;
+
+  blink::mainThreadIsolate()->MemoryPressureNotification(
+      v8_memory_pressure_level);
+  blink::MemoryPressureNotificationToWorkerThreadIsolates(
+      v8_memory_pressure_level);
+}
+
 }  // namespace content
diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h
index cbb564da..39a91b6 100644
--- a/content/renderer/render_thread_impl.h
+++ b/content/renderer/render_thread_impl.h
@@ -222,7 +222,7 @@
   // established or if it has been lost (for example if the GPU plugin crashed).
   // If there is a pending asynchronous request, it will be completed by the
   // time this routine returns.
-  gpu::GpuChannelHost* EstablishGpuChannelSync(CauseForGpuLaunch);
+  scoped_refptr<gpu::GpuChannelHost> EstablishGpuChannelSync(CauseForGpuLaunch);
 
   // This method modifies how the next message is sent.  Normally, when sending
   // a synchronous message that runs a nested message loop, we need to suspend
@@ -458,6 +458,9 @@
                    std::unique_ptr<scheduler::RendererScheduler> scheduler);
 
  private:
+  // IPC::Listener
+  void OnChannelError() override;
+
   // ChildThread
   bool OnControlMessageReceived(const IPC::Message& msg) override;
   void OnProcessBackgrounded(bool backgrounded) override;
@@ -513,6 +516,9 @@
 
   void ReleaseFreeMemory();
 
+  void OnSyncMemoryPressure(
+      base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level);
+
   // These objects live solely on the render thread.
   std::unique_ptr<AppCacheDispatcher> appcache_dispatcher_;
   std::unique_ptr<DomStorageDispatcher> dom_storage_dispatcher_;
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index b79693b..d4fe223 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -47,7 +47,6 @@
 #include "content/common/drag_messages.h"
 #include "content/common/frame_messages.h"
 #include "content/common/frame_replication_state.h"
-#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
 #include "content/common/input/input_event_utils.h"
 #include "content/common/input_messages.h"
 #include "content/common/page_messages.h"
@@ -1093,9 +1092,10 @@
       prefs.resue_global_for_unowned_main_frame);
   settings->setPreferHiddenVolumeControls(true);
   settings->setShrinksViewportContentToFit(true);
+#endif
+
   settings->setAutoplayExperimentMode(
       blink::WebString::fromUTF8(prefs.autoplay_experiment_mode));
-#endif
 
   settings->setViewportEnabled(prefs.viewport_enabled);
   settings->setViewportMetaEnabled(prefs.viewport_meta_enabled);
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index 26ff553..10bfdea 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -30,7 +30,6 @@
 #include "content/common/drag_event_source_info.h"
 #include "content/common/edit_command.h"
 #include "content/common/frame_message_enums.h"
-#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
 #include "content/common/navigation_gesture.h"
 #include "content/common/page_message_enums.h"
 #include "content/common/view_message_enums.h"
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 72573db..b19ec84 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -33,7 +33,6 @@
 #include "components/scheduler/renderer/renderer_scheduler.h"
 #include "content/common/content_switches_internal.h"
 #include "content/common/gpu/client/context_provider_command_buffer.h"
-#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
 #include "content/common/gpu_process_launch_causes.h"
 #include "content/common/input/synthetic_gesture_packet.h"
 #include "content/common/input/web_input_event_traits.h"
@@ -203,29 +202,6 @@
   return widget;
 }
 
-std::unique_ptr<content::WebGraphicsContext3DCommandBufferImpl>
-CreateOffscreenContext(scoped_refptr<gpu::GpuChannelHost> gpu_channel_host,
-                       const GURL& url) {
-  DCHECK(gpu_channel_host);
-
-  // This is for an offscreen context for the compositor. So the default
-  // framebuffer doesn't need alpha, depth, stencil, antialiasing.
-  gpu::gles2::ContextCreationAttribHelper attributes;
-  attributes.alpha_size = -1;
-  attributes.depth_size = 0;
-  attributes.stencil_size = 0;
-  attributes.samples = 0;
-  attributes.sample_buffers = 0;
-  attributes.bind_generates_resource = false;
-  attributes.lose_context_when_out_of_memory = true;
-
-  bool automatic_flushes = false;
-
-  return base::WrapUnique(new content::WebGraphicsContext3DCommandBufferImpl(
-      gpu::kNullSurfaceHandle, url, gpu_channel_host.get(), attributes,
-      gfx::PreferIntegratedGpu, automatic_flushes));
-}
-
 }  // namespace
 
 namespace content {
@@ -785,11 +761,25 @@
       return nullptr;
     }
 
+    // This is for an offscreen context for the compositor. So the default
+    // framebuffer doesn't need alpha, depth, stencil, antialiasing.
+    gpu::gles2::ContextCreationAttribHelper attributes;
+    attributes.alpha_size = -1;
+    attributes.depth_size = 0;
+    attributes.stencil_size = 0;
+    attributes.samples = 0;
+    attributes.sample_buffers = 0;
+    attributes.bind_generates_resource = false;
+    attributes.lose_context_when_out_of_memory = true;
+
+    bool automatic_flushes = false;
+
     // The compositor context shares resources with the worker context.
     context_provider = new ContextProviderCommandBuffer(
-        CreateOffscreenContext(std::move(gpu_channel_host),
-                               GetURLForGraphicsContext3D()),
-        limits, worker_context_provider.get(), RENDER_COMPOSITOR_CONTEXT);
+        std::move(gpu_channel_host), gpu::kNullSurfaceHandle,
+        GetURLForGraphicsContext3D(), gfx::PreferIntegratedGpu,
+        automatic_flushes, limits, attributes, worker_context_provider.get(),
+        command_buffer_metrics::RENDER_COMPOSITOR_CONTEXT);
 
 #if defined(OS_ANDROID)
     if (RenderThreadImpl::current() &&
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index e7eea25d..45d6ace 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -21,7 +21,6 @@
 #include "build/build_config.h"
 #include "content/common/content_export.h"
 #include "content/common/cursors/webcursor.h"
-#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
 #include "content/common/input/synthetic_gesture_params.h"
 #include "content/renderer/devtools/render_widget_screen_metrics_emulator_delegate.h"
 #include "content/renderer/gpu/render_widget_compositor_delegate.h"
@@ -50,6 +49,8 @@
 #include "ui/gfx/range/range.h"
 #include "ui/surface/transport_dib.h"
 
+class GURL;
+
 namespace IPC {
 class SyncMessage;
 class SyncMessageFilter;
diff --git a/content/renderer/render_widget_fullscreen_pepper.h b/content/renderer/render_widget_fullscreen_pepper.h
index b1ef6b4..02ece41 100644
--- a/content/renderer/render_widget_fullscreen_pepper.h
+++ b/content/renderer/render_widget_fullscreen_pepper.h
@@ -14,6 +14,7 @@
 #include "content/renderer/pepper/fullscreen_container.h"
 #include "content/renderer/render_widget_fullscreen.h"
 #include "third_party/WebKit/public/web/WebWidget.h"
+#include "url/gurl.h"
 
 namespace blink {
 class WebLayer;
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index e8c18cd..6a94e88d 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -42,7 +42,6 @@
 #include "content/common/file_utilities_messages.h"
 #include "content/common/frame_messages.h"
 #include "content/common/gpu/client/context_provider_command_buffer.h"
-#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
 #include "content/common/gpu_process_launch_causes.h"
 #include "content/common/mime_registry_messages.h"
 #include "content/common/render_process_messages.h"
@@ -643,7 +642,7 @@
 
 bool RendererBlinkPlatformImpl::canAccelerate2dCanvas() {
   RenderThreadImpl* thread = RenderThreadImpl::current();
-  gpu::GpuChannelHost* host =
+  scoped_refptr<gpu::GpuChannelHost> host =
       thread->EstablishGpuChannelSync(CAUSE_FOR_GPU_LAUNCH_CANVAS_2D);
   if (!host)
     return false;
@@ -980,10 +979,9 @@
 
 static void Collect3DContextInformationOnFailure(
     blink::Platform::GraphicsInfo* gl_info,
-    gpu::GpuChannelHost* host) {
+    const gpu::GPUInfo& gpu_info) {
   DCHECK(gl_info);
   std::string error_message("OffscreenContext Creation failed, ");
-  const gpu::GPUInfo& gpu_info = host->gpu_info();
   gl_info->vendorId = gpu_info.gpu.vendor_id;
   gl_info->deviceId = gpu_info.gpu.device_id;
   switch (gpu_info.context_info_state) {
@@ -1062,28 +1060,28 @@
 
   attributes.fail_if_major_perf_caveat =
       web_attributes.failIfMajorPerformanceCaveat;
+  DCHECK_GT(web_attributes.webGLVersion, 0u);
   DCHECK_LE(web_attributes.webGLVersion, 2u);
-  if (web_attributes.webGLVersion == 1)
-    attributes.context_type = gpu::gles2::CONTEXT_TYPE_WEBGL1;
-  else if (web_attributes.webGLVersion == 2)
+  if (web_attributes.webGLVersion == 2)
     attributes.context_type = gpu::gles2::CONTEXT_TYPE_WEBGL2;
+  else
+    attributes.context_type = gpu::gles2::CONTEXT_TYPE_WEBGL1;
 
   bool automatic_flushes = true;
   // Prefer discrete GPU for WebGL.
   gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu;
+  const auto& gpu_info = gpu_channel_host->gpu_info();
 
   scoped_refptr<ContextProviderCommandBuffer> provider(
       new ContextProviderCommandBuffer(
-          base::WrapUnique(new WebGraphicsContext3DCommandBufferImpl(
-              gpu::kNullSurfaceHandle, GURL(top_document_web_url),
-              gpu_channel_host.get(), attributes, gpu_preference,
-              automatic_flushes)),
-          gpu::SharedMemoryLimits(), share_context,
-          RENDERER_MAINTHREAD_CONTEXT));
+          std::move(gpu_channel_host), gpu::kNullSurfaceHandle,
+          GURL(top_document_web_url), gpu_preference, automatic_flushes,
+          gpu::SharedMemoryLimits(), attributes, share_context,
+          command_buffer_metrics::OFFSCREEN_CONTEXT_FOR_WEBGL));
   if (!provider->BindToCurrentThread()) {
     // Collect Graphicsinfo if there is a context failure or it is failed
     // purposefully in case of layout tests.
-    Collect3DContextInformationOnFailure(gl_info, gpu_channel_host.get());
+    Collect3DContextInformationOnFailure(gl_info, gpu_info);
     return nullptr;
   }
   return new WebGraphicsContext3DProviderImpl(std::move(provider));
diff --git a/content/renderer/renderer_main.cc b/content/renderer/renderer_main.cc
index e989b27..bfa3073 100644
--- a/content/renderer/renderer_main.cc
+++ b/content/renderer/renderer_main.cc
@@ -9,10 +9,8 @@
 #include "base/command_line.h"
 #include "base/debug/debugger.h"
 #include "base/debug/leak_annotations.h"
-#include "base/feature_list.h"
 #include "base/i18n/rtl.h"
 #include "base/message_loop/message_loop.h"
-#include "base/metrics/field_trial.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/statistics_recorder.h"
 #include "base/pending_task.h"
@@ -155,24 +153,6 @@
   base::android::RecordChromiumAndroidLinkerRendererHistogram();
 #endif
 
-  // Initialize statistical testing infrastructure.  We set the entropy provider
-  // to NULL to disallow the renderer process from creating its own one-time
-  // randomized trials; they should be created in the browser process.
-  base::FieldTrialList field_trial_list(NULL);
-  // Ensure any field trials in browser are reflected into renderer.
-  if (parsed_command_line.HasSwitch(switches::kForceFieldTrials)) {
-    bool result = base::FieldTrialList::CreateTrialsFromString(
-        parsed_command_line.GetSwitchValueASCII(switches::kForceFieldTrials),
-        std::set<std::string>());
-    DCHECK(result);
-  }
-
-  std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
-  feature_list->InitializeFromCommandLine(
-      parsed_command_line.GetSwitchValueASCII(switches::kEnableFeatures),
-      parsed_command_line.GetSwitchValueASCII(switches::kDisableFeatures));
-  base::FeatureList::SetInstance(std::move(feature_list));
-
   std::unique_ptr<scheduler::RendererScheduler> renderer_scheduler(
       scheduler::RendererScheduler::Create());
 
diff --git a/content/shell/BUILD.gn b/content/shell/BUILD.gn
index 855fa20c..9b7f85a2 100644
--- a/content/shell/BUILD.gn
+++ b/content/shell/BUILD.gn
@@ -16,6 +16,7 @@
 } else if (is_mac) {
   import("//build/config/mac/rules.gni")
   import("//build_overrides/v8.gni")
+  import("//build/mac/tweak_info_plist.gni")
 }
 
 declare_args() {
@@ -269,7 +270,6 @@
   }
 
   if (is_win) {
-    #'LinkIncremental': '<(msvs_large_module_debug_link_mode)',  TODO(GYP)
     sources += [
       "common/v8_breakpad_support_win.cc",
       "common/v8_breakpad_support_win.h",
@@ -431,6 +431,15 @@
     ]
   }
 } else if (is_mac) {
+  tweak_info_plist("content_shell_plist") {
+    testonly = true
+    info_plist = "app/app-Info.plist"
+    args = [
+      "--scm=1",
+      "--version",
+      content_shell_version,
+    ]
+  }
   mac_app_bundle("content_shell") {
     testonly = true
     output_name = content_shell_product_name
@@ -446,7 +455,7 @@
       # the bundle structure.
       "//components/test_runner:resources",
     ]
-    info_plist = "app/app-Info.plist"
+    info_plist_target = ":content_shell_plist"
   }
 } else {
   # TODO(brettw) when GYP is no longer necessary, delete
@@ -455,13 +464,14 @@
     testonly = true
 
     # TODO(GYP) mac resource bundle stuff for this target.
-    # TODO(GYP) Windows content shell settings:
-    #  - RC file.
-    #  - 'LinkIncremental': '<(msvs_large_module_debug_link_mode)',
     sources = [
       "app/shell_main.cc",
     ]
 
+    if (is_win) {
+      sources += [ "app/shell.rc" ]
+    }
+
     defines = []
 
     deps = [
@@ -473,6 +483,11 @@
 
     if (is_win) {
       deps += [ "//sandbox" ]
+
+      # This is a large module that can't do incremental linking in some cases.
+      configs -= [ "//build/config/win:default_incremental_linking" ]
+      configs +=
+          [ "//build/config/win:default_large_module_incremental_linking" ]
       if (win_console_app) {
         defines += [ "WIN_CONSOLE_APP" ]
       } else {
@@ -567,6 +582,20 @@
   content_shell_framework_name = "$content_shell_product_name Framework"
   content_shell_helper_name = "$content_shell_product_name Helper"
 
+  tweak_info_plist("content_shell_framework_plist") {
+    testonly = true
+    info_plist = "app/framework-Info.plist"
+    args = [
+      "--breakpad=1",
+      "--keystone=0",
+      "--scm=1",
+      "--version",
+      content_shell_version,
+      "--branding",
+      content_shell_product_name,
+    ]
+  }
+
   mac_framework_bundle("content_shell_framework") {
     testonly = true
 
@@ -597,7 +626,19 @@
       "@executable_path/../Frameworks/$output_name.framework/$output_name",
     ]
 
-    info_plist = "app/framework-Info.plist"
+    info_plist_target = ":content_shell_framework_plist"
+  }
+
+  tweak_info_plist("content_shell_helper_plist") {
+    testonly = true
+    info_plist = "app/helper-Info.plist"
+    args = [
+      "--breakpad=0",
+      "--keystone=0",
+      "--scm=0",
+      "--version",
+      content_shell_version,
+    ]
   }
 
   mac_app_bundle("content_shell_helper_app") {
@@ -609,7 +650,7 @@
     deps = [
       ":content_shell_framework+link",
     ]
-    info_plist = "app/helper-Info.plist"
+    info_plist_target = ":content_shell_helper_plist"
   }
 
   # The install_name_tool can only operate in-place, rather than producing a
diff --git a/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.cc b/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.cc
index e0319a5..3bbf1692 100644
--- a/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.cc
+++ b/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.cc
@@ -607,12 +607,6 @@
       .WillByDefault(
           Invoke(device.get(), &MockBluetoothDevice::GetMockService));
 
-  ON_CALL(*device, GetVendorIDSource())
-      .WillByDefault(Return(BluetoothDevice::VENDOR_ID_BLUETOOTH));
-  ON_CALL(*device, GetVendorID()).WillByDefault(Return(0xFFFF));
-  ON_CALL(*device, GetProductID()).WillByDefault(Return(1));
-  ON_CALL(*device, GetDeviceID()).WillByDefault(Return(2));
-
   return device;
 }
 
diff --git a/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.h b/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.h
index 6885c6b3..b5454ce 100644
--- a/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.h
+++ b/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.h
@@ -355,17 +355,6 @@
   //      Returns: address
   //  - GetName:
   //      Returns: device_name.
-  //  - GetBluetoothClass:
-  //      Returns: 0x1F00. “Unspecified Device Class” see
-  //      bluetooth.org/en-us/specification/assigned-numbers/baseband
-  //  - GetVendorIDSource:
-  //      Returns: BluetoothDevice::VENDOR_ID_BLUETOOTH.
-  //  - GetVendorID:
-  //      Returns: 0xFFFF.
-  //  - GetProductID:
-  //      Returns: 1.
-  //  - GetDeviceID:
-  //      Returns: 2.
   //  - IsPaired:
   //      Returns true.
   static std::unique_ptr<testing::NiceMock<device::MockBluetoothDevice>>
diff --git a/content/shell/renderer/layout_test/layout_test_content_renderer_client.cc b/content/shell/renderer/layout_test/layout_test_content_renderer_client.cc
index 317fe781..3503725 100644
--- a/content/shell/renderer/layout_test/layout_test_content_renderer_client.cc
+++ b/content/shell/renderer/layout_test/layout_test_content_renderer_client.cc
@@ -71,6 +71,9 @@
   proxy->set_view_test_client(LayoutTestRenderThreadObserver::GetInstance()
                                   ->test_interfaces()
                                   ->CreateWebViewTestClient(proxy));
+  proxy->set_widget_test_client(LayoutTestRenderThreadObserver::GetInstance()
+                                    ->test_interfaces()
+                                    ->CreateWebWidgetTestClient(proxy));
   proxy->SetInterfaces(interfaces);
 }
 
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index d589deac..7f985dd 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -498,6 +498,9 @@
       "//ppapi/shared_impl:test_support",
     ]
     data_deps += [ "//ppapi:ppapi_tests" ]
+    if (is_mac) {
+      data += [ "$root_out_dir/ppapi_tests.plugin/" ]
+    }
   }
 
   if (is_win) {
diff --git a/content/test/data/dom_storage/sanity_check.js b/content/test/data/dom_storage/sanity_check.js
index cbfb4a9..c41e493 100644
--- a/content/test/data/dom_storage/sanity_check.js
+++ b/content/test/data/dom_storage/sanity_check.js
@@ -19,6 +19,10 @@
 }
 
 function sanityCheck(storage) {
+  storage["preload"] = "done";
+  checkEqual("done", storage["preload"],
+             "storage['preload'] != 'done' after addition");
+
   storage.clear();
 
   checkEqual(0, storage.length,
diff --git a/content/test/gpu/generate_buildbot_json.py b/content/test/gpu/generate_buildbot_json.py
index 2d3a585..ee47afc6 100755
--- a/content/test/gpu/generate_buildbot_json.py
+++ b/content/test/gpu/generate_buildbot_json.py
@@ -417,6 +417,20 @@
       'swarming': False,
       'os_type': 'linux',
     },
+    'Android Debug (Nexus 5X)': {
+      'swarming_dimensions': {
+        # There are no PCI IDs on Android.
+        # This is a hack to get the script working.
+        'gpu': '0000:0000',
+        'os': 'Android'
+      },
+      'build_config': 'android-content-shell',
+      # This bot is a one-off and doesn't have similar slaves in the
+      # swarming pool.
+      'swarming': False,
+      'os_type': 'android',
+    },
+
     'Android Debug (Nexus 9)': {
       'swarming_dimensions': {
         # There are no PCI IDs on Android.
diff --git a/content/test/gpu/gpu_tests/context_lost_expectations.py b/content/test/gpu/gpu_tests/context_lost_expectations.py
index cf80d118..52505c9 100644
--- a/content/test/gpu/gpu_tests/context_lost_expectations.py
+++ b/content/test/gpu/gpu_tests/context_lost_expectations.py
@@ -30,3 +30,10 @@
               ['mountainlion', 'debug'], bug=497411)
     self.Skip('ContextLost.WebGLContextLostFromSelectElement',
               ['lion', 'debug'], bug=498149)
+
+    # Flaky on linux_chromium_rel_ng and mac_chromium_rel_ng bots.
+    self.Flaky('GpuCrash.GPUProcessCrashesExactlyOnce',
+               ['linux'], bug=608923)
+    self.Flaky('GpuCrash.GPUProcessCrashesExactlyOnce',
+               ['mac'], bug=608923)
+
diff --git a/content/test/render_thread_impl_browser_test_ipc_helper.cc b/content/test/render_thread_impl_browser_test_ipc_helper.cc
index 11f0851..52cb151 100644
--- a/content/test/render_thread_impl_browser_test_ipc_helper.cc
+++ b/content/test/render_thread_impl_browser_test_ipc_helper.cc
@@ -4,7 +4,6 @@
 
 #include "content/test/render_thread_impl_browser_test_ipc_helper.h"
 
-#include "content/public/common/mojo_channel_switches.h"
 #include "mojo/edk/embedder/embedder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -23,14 +22,7 @@
   dummy_listener_.reset(new DummyListener());
 
   SetupIpcThread();
-
-  if (ShouldUseMojoChannel()) {
-    SetupMojo();
-  } else {
-    channel_ = IPC::ChannelProxy::Create(channel_id_, IPC::Channel::MODE_SERVER,
-                                         dummy_listener_.get(),
-                                         ipc_thread_->task_runner());
-  }
+  SetupMojo();
 }
 
 RenderThreadImplBrowserIPCTestHelper::~RenderThreadImplBrowserIPCTestHelper() {
diff --git a/content/utility/utility_main.cc b/content/utility/utility_main.cc
index 81b1c40be..f74958c 100644
--- a/content/utility/utility_main.cc
+++ b/content/utility/utility_main.cc
@@ -4,7 +4,6 @@
 
 #include "base/command_line.h"
 #include "base/debug/leak_annotations.h"
-#include "base/feature_list.h"
 #include "base/message_loop/message_loop.h"
 #include "base/threading/platform_thread.h"
 #include "base/timer/hi_res_timer_manager.h"
@@ -37,12 +36,6 @@
     LinuxSandbox::InitializeSandbox();
 #endif
 
-  std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
-  feature_list->InitializeFromCommandLine(
-      parameters.command_line.GetSwitchValueASCII(switches::kEnableFeatures),
-      parameters.command_line.GetSwitchValueASCII(switches::kDisableFeatures));
-  base::FeatureList::SetInstance(std::move(feature_list));
-
   ChildProcess utility_process;
   utility_process.set_main_thread(new UtilityThreadImpl());
 
diff --git a/crypto/BUILD.gn b/crypto/BUILD.gn
index 5c5ac48..479fe42 100644
--- a/crypto/BUILD.gn
+++ b/crypto/BUILD.gn
@@ -33,7 +33,6 @@
     "hkdf.h",
     "hmac.cc",
     "hmac.h",
-    "hmac_openssl.cc",
     "mac_security_services_lock.cc",
     "mac_security_services_lock.h",
 
@@ -72,10 +71,8 @@
     "signature_creator.h",
     "signature_verifier.cc",
     "signature_verifier.h",
+    "symmetric_key.cc",
     "symmetric_key.h",
-    "symmetric_key_openssl.cc",
-    "third_party/nss/chromium-sha256.h",
-    "third_party/nss/sha512.cc",
   ]
 
   # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
@@ -141,16 +138,12 @@
       "crypto_export.h",
       "hmac.cc",
       "hmac.h",
-      "hmac_win.cc",
-      "scoped_capi_types.h",
-      "scoped_nss_types.h",
+      "openssl_util.cc",
+      "openssl_util.h",
       "secure_util.cc",
       "secure_util.h",
+      "symmetric_key.cc",
       "symmetric_key.h",
-      "symmetric_key_win.cc",
-      "third_party/nss/chromium-blapi.h",
-      "third_party/nss/chromium-sha256.h",
-      "third_party/nss/sha512.cc",
     ]
 
     deps = [
diff --git a/crypto/crypto.gyp b/crypto/crypto.gyp
index fd411bb..8ed2ab2 100644
--- a/crypto/crypto.gyp
+++ b/crypto/crypto.gyp
@@ -22,19 +22,13 @@
       'defines': [
         'CRYPTO_IMPLEMENTATION',
       ],
-      'sources!': [
-        'third_party/nss/chromium-nss.h',
-        'third_party/nss/chromium-prtypes.h',
-        'third_party/nss/chromium-sha256.h',
-        'third_party/nss/sha512.cc',
-      ],
       'conditions': [
         [ 'os_posix == 1 and OS != "mac" and OS != "ios" and OS != "android"', {
           'dependencies': [
-            '../build/linux/system.gyp:ssl',
+            '../build/linux/system.gyp:nss',
           ],
           'export_dependent_settings': [
-            '../build/linux/system.gyp:ssl',
+            '../build/linux/system.gyp:nss',
           ],
           'conditions': [
             [ 'chromeos==1', {
@@ -42,11 +36,6 @@
               },
             ],
           ],
-        }, {  # os_posix != 1 or OS == "mac" or OS == "ios" or OS == "android"
-            'sources!': [
-              'hmac_win.cc',
-              'symmetric_key_win.cc',
-            ],
         }],
         [ 'OS != "mac" and OS != "ios"', {
           'sources!': [
@@ -140,7 +129,7 @@
       'conditions': [
         [ 'use_nss_certs == 1', {
           'dependencies': [
-            '../build/linux/system.gyp:ssl',
+            '../build/linux/system.gyp:nss',
           ],
         }],
         [ 'use_nss_certs == 0', {
@@ -167,6 +156,7 @@
           'dependencies': [
             '../base/base.gyp:base_win64',
             '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations_win64',
+            '../third_party/boringssl/boringssl.gyp:boringssl_nacl_win64',
           ],
           'sources': [
             '<@(nacl_win64_sources)',
diff --git a/crypto/crypto.gypi b/crypto/crypto.gypi
index 0709ac1..dadc0ea 100644
--- a/crypto/crypto.gypi
+++ b/crypto/crypto.gypi
@@ -8,17 +8,15 @@
     # This is required so that we can build them for nacl win64.
     'variables': {
       'hmac_win64_related_sources': [
+        'crypto_export.h',
         'hmac.cc',
         'hmac.h',
-        'hmac_win.cc',
+        'openssl_util.cc',
+        'openssl_util.h',
         'secure_util.cc',
         'secure_util.h',
+        'symmetric_key.cc',
         'symmetric_key.h',
-        'symmetric_key_win.cc',
-        'third_party/nss/chromium-prtypes.h',
-        'third_party/nss/chromium-sha256.h',
-        'third_party/nss/sha512.cc',
-        'wincrypt_shim.h',
       ],
     },
     'crypto_sources': [
@@ -33,7 +31,6 @@
       'auto_cbb.h',
       'capi_util.cc',
       'capi_util.h',
-      'crypto_export.h',
       'cssm_init.cc',
       'cssm_init.h',
       'curve25519.cc',
@@ -48,7 +45,6 @@
       'encryptor.h',
       'hkdf.cc',
       'hkdf.h',
-      'hmac_openssl.cc',
       'mac_security_services_lock.cc',
       'mac_security_services_lock.h',
       'mock_apple_keychain.cc',
@@ -65,8 +61,6 @@
       'nss_util_internal.h',
       'openssl_bio_string.cc',
       'openssl_bio_string.h',
-      'openssl_util.cc',
-      'openssl_util.h',
       'p224.cc',
       'p224.h',
       'random.h',
@@ -83,7 +77,7 @@
       'signature_creator.h',
       'signature_verifier.cc',
       'signature_verifier.h',
-      'symmetric_key_openssl.cc',
+      'wincrypt_shim.h',
     ],
     'nacl_win64_sources': [
       '<@(hmac_win64_related_sources)',
diff --git a/crypto/crypto_nacl.gyp b/crypto/crypto_nacl.gyp
index 255c42c..c7c01a8 100644
--- a/crypto/crypto_nacl.gyp
+++ b/crypto/crypto_nacl.gyp
@@ -38,8 +38,6 @@
         ['exclude', '^cssm_'],
         ['exclude', '^nss_'],
         ['exclude', '^mac_'],
-        ['exclude', '^third_party/nss/'],
-        ['include', '^third_party/nss/sha512.cc'],
       ],
     },
   ],
diff --git a/crypto/hmac.cc b/crypto/hmac.cc
index 333e357..c3c43da 100644
--- a/crypto/hmac.cc
+++ b/crypto/hmac.cc
@@ -4,24 +4,28 @@
 
 #include "crypto/hmac.h"
 
+#include <openssl/hmac.h>
 #include <stddef.h>
 
 #include <algorithm>
-#include <memory>
 
 #include "base/logging.h"
+#include "base/stl_util.h"
+#include "crypto/openssl_util.h"
 #include "crypto/secure_util.h"
 #include "crypto/symmetric_key.h"
 
 namespace crypto {
 
-bool HMAC::Init(SymmetricKey* key) {
-  std::string raw_key;
-  bool result = key->GetRawKey(&raw_key) && Init(raw_key);
-  // Zero out key copy.  This might get optimized away, but one can hope.
-  // Using std::string to store key info at all is a larger problem.
-  std::fill(raw_key.begin(), raw_key.end(), 0);
-  return result;
+HMAC::HMAC(HashAlgorithm hash_alg) : hash_alg_(hash_alg), initialized_(false) {
+  // Only SHA-1 and SHA-256 hash algorithms are supported now.
+  DCHECK(hash_alg_ == SHA1 || hash_alg_ == SHA256);
+}
+
+HMAC::~HMAC() {
+  // Zero out key copy.
+  key_.assign(key_.size(), 0);
+  STLClearObject(&key_);
 }
 
 size_t HMAC::DigestLength() const {
@@ -36,6 +40,35 @@
   }
 }
 
+bool HMAC::Init(const unsigned char* key, size_t key_length) {
+  // Init must not be called more than once on the same HMAC object.
+  DCHECK(!initialized_);
+  initialized_ = true;
+  key_.assign(key, key + key_length);
+  return true;
+}
+
+bool HMAC::Init(SymmetricKey* key) {
+  std::string raw_key;
+  bool result = key->GetRawKey(&raw_key) && Init(raw_key);
+  // Zero out key copy.  This might get optimized away, but one can hope.
+  // Using std::string to store key info at all is a larger problem.
+  std::fill(raw_key.begin(), raw_key.end(), 0);
+  return result;
+}
+
+bool HMAC::Sign(const base::StringPiece& data,
+                unsigned char* digest,
+                size_t digest_length) const {
+  DCHECK(initialized_);
+
+  ScopedOpenSSLSafeSizeBuffer<EVP_MAX_MD_SIZE> result(digest, digest_length);
+  return !!::HMAC(hash_alg_ == SHA1 ? EVP_sha1() : EVP_sha256(),
+                  key_.data(), key_.size(),
+                  reinterpret_cast<const unsigned char*>(data.data()),
+                  data.size(), result.safe_buffer(), NULL);
+}
+
 bool HMAC::Verify(const base::StringPiece& data,
                   const base::StringPiece& digest) const {
   if (digest.size() != DigestLength())
diff --git a/crypto/hmac.h b/crypto/hmac.h
index ec32ed7c..2421333 100644
--- a/crypto/hmac.h
+++ b/crypto/hmac.h
@@ -11,6 +11,7 @@
 #include <stddef.h>
 
 #include <memory>
+#include <vector>
 
 #include "base/compiler_specific.h"
 #include "base/macros.h"
@@ -20,7 +21,6 @@
 namespace crypto {
 
 // Simplify the interface and reduce includes by abstracting out the internals.
-struct HMACPlatformData;
 class SymmetricKey;
 
 class CRYPTO_EXPORT HMAC {
@@ -86,7 +86,8 @@
 
  private:
   HashAlgorithm hash_alg_;
-  std::unique_ptr<HMACPlatformData> plat_;
+  bool initialized_;
+  std::vector<unsigned char> key_;
 
   DISALLOW_COPY_AND_ASSIGN(HMAC);
 };
diff --git a/crypto/hmac_openssl.cc b/crypto/hmac_openssl.cc
deleted file mode 100644
index d88c091..0000000
--- a/crypto/hmac_openssl.cc
+++ /dev/null
@@ -1,57 +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.
-
-#include "crypto/hmac.h"
-
-#include <openssl/hmac.h>
-#include <stddef.h>
-
-#include <algorithm>
-#include <memory>
-#include <vector>
-
-#include "base/logging.h"
-#include "base/stl_util.h"
-#include "crypto/openssl_util.h"
-
-namespace crypto {
-
-struct HMACPlatformData {
-  std::vector<unsigned char> key;
-};
-
-HMAC::HMAC(HashAlgorithm hash_alg) : hash_alg_(hash_alg) {
-  // Only SHA-1 and SHA-256 hash algorithms are supported now.
-  DCHECK(hash_alg_ == SHA1 || hash_alg_ == SHA256);
-}
-
-bool HMAC::Init(const unsigned char* key, size_t key_length) {
-  // Init must not be called more than once on the same HMAC object.
-  DCHECK(!plat_);
-  plat_.reset(new HMACPlatformData());
-  plat_->key.assign(key, key + key_length);
-  return true;
-}
-
-HMAC::~HMAC() {
-  if (plat_) {
-    // Zero out key copy.
-    plat_->key.assign(plat_->key.size(), 0);
-    STLClearObject(&plat_->key);
-  }
-}
-
-bool HMAC::Sign(const base::StringPiece& data,
-                unsigned char* digest,
-                size_t digest_length) const {
-  DCHECK(plat_);  // Init must be called before Sign.
-
-  ScopedOpenSSLSafeSizeBuffer<EVP_MAX_MD_SIZE> result(digest, digest_length);
-  return !!::HMAC(hash_alg_ == SHA1 ? EVP_sha1() : EVP_sha256(),
-                  plat_->key.data(), plat_->key.size(),
-                  reinterpret_cast<const unsigned char*>(data.data()),
-                  data.size(), result.safe_buffer(), NULL);
-}
-
-}  // namespace crypto
diff --git a/crypto/hmac_win.cc b/crypto/hmac_win.cc
deleted file mode 100644
index ab290815..0000000
--- a/crypto/hmac_win.cc
+++ /dev/null
@@ -1,210 +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 "crypto/hmac.h"
-
-#include <windows.h>
-#include <stddef.h>
-
-#include <algorithm>
-#include <vector>
-
-#include "base/logging.h"
-#include "crypto/scoped_capi_types.h"
-#include "crypto/third_party/nss/chromium-blapi.h"
-#include "crypto/third_party/nss/chromium-sha256.h"
-#include "crypto/wincrypt_shim.h"
-
-namespace crypto {
-
-namespace {
-
-// Implementation of HMAC-SHA-256:
-//
-// SHA-256 is supported in Windows XP SP3 or later.  We still need to support
-// Windows XP SP2, so unfortunately we have to implement HMAC-SHA-256 here.
-
-enum {
-  SHA256_BLOCK_SIZE = 64  // Block size (in bytes) of the input to SHA-256.
-};
-
-// NSS doesn't accept size_t for text size, divide the data into smaller
-// chunks as needed.
-void Wrapped_SHA256_Update(SHA256Context* ctx, const unsigned char* text,
-                           size_t text_len) {
-  const unsigned int kChunkSize = 1 << 30;
-  while (text_len > kChunkSize) {
-    SHA256_Update(ctx, text, kChunkSize);
-    text += kChunkSize;
-    text_len -= kChunkSize;
-  }
-  SHA256_Update(ctx, text, (unsigned int)text_len);
-}
-
-// See FIPS 198: The Keyed-Hash Message Authentication Code (HMAC).
-void ComputeHMACSHA256(const unsigned char* key, size_t key_len,
-                       const unsigned char* text, size_t text_len,
-                       unsigned char* output, size_t output_len) {
-  SHA256Context ctx;
-
-  // Pre-process the key, if necessary.
-  unsigned char key0[SHA256_BLOCK_SIZE];
-  if (key_len > SHA256_BLOCK_SIZE) {
-    SHA256_Begin(&ctx);
-    Wrapped_SHA256_Update(&ctx, key, key_len);
-    SHA256_End(&ctx, key0, NULL, SHA256_LENGTH);
-    memset(key0 + SHA256_LENGTH, 0, SHA256_BLOCK_SIZE - SHA256_LENGTH);
-  } else {
-    memcpy(key0, key, key_len);
-    if (key_len < SHA256_BLOCK_SIZE)
-      memset(key0 + key_len, 0, SHA256_BLOCK_SIZE - key_len);
-  }
-
-  unsigned char padded_key[SHA256_BLOCK_SIZE];
-  unsigned char inner_hash[SHA256_LENGTH];
-
-  // XOR key0 with ipad.
-  for (int i = 0; i < SHA256_BLOCK_SIZE; ++i)
-    padded_key[i] = key0[i] ^ 0x36;
-
-  // Compute the inner hash.
-  SHA256_Begin(&ctx);
-  SHA256_Update(&ctx, padded_key, SHA256_BLOCK_SIZE);
-  Wrapped_SHA256_Update(&ctx, text, text_len);
-  SHA256_End(&ctx, inner_hash, NULL, SHA256_LENGTH);
-
-  // XOR key0 with opad.
-  for (int i = 0; i < SHA256_BLOCK_SIZE; ++i)
-    padded_key[i] = key0[i] ^ 0x5c;
-
-  // Compute the outer hash.
-  SHA256_Begin(&ctx);
-  SHA256_Update(&ctx, padded_key, SHA256_BLOCK_SIZE);
-  SHA256_Update(&ctx, inner_hash, SHA256_LENGTH);
-  SHA256_End(&ctx, output, NULL, (unsigned int) output_len);
-}
-
-}  // namespace
-
-struct HMACPlatformData {
-  ~HMACPlatformData() {
-    if (!raw_key_.empty()) {
-      SecureZeroMemory(&raw_key_[0], raw_key_.size());
-    }
-
-    // Destroy the key before releasing the provider.
-    key_.reset();
-  }
-
-  ScopedHCRYPTPROV provider_;
-  ScopedHCRYPTKEY key_;
-
-  // For HMAC-SHA-256 only.
-  std::vector<unsigned char> raw_key_;
-};
-
-HMAC::HMAC(HashAlgorithm hash_alg)
-    : hash_alg_(hash_alg), plat_(new HMACPlatformData()) {
-  // Only SHA-1 and SHA-256 hash algorithms are supported now.
-  DCHECK(hash_alg_ == SHA1 || hash_alg_ == SHA256);
-}
-
-bool HMAC::Init(const unsigned char* key, size_t key_length) {
-  if (plat_->provider_ || plat_->key_ || !plat_->raw_key_.empty()) {
-    // Init must not be called more than once on the same HMAC object.
-    NOTREACHED();
-    return false;
-  }
-
-  if (hash_alg_ == SHA256) {
-    plat_->raw_key_.assign(key, key + key_length);
-    return true;
-  }
-
-  if (!CryptAcquireContext(plat_->provider_.receive(), NULL, NULL,
-                           PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
-    NOTREACHED();
-    return false;
-  }
-
-  // This code doesn't work on Win2k because PLAINTEXTKEYBLOB and
-  // CRYPT_IPSEC_HMAC_KEY are not supported on Windows 2000.  PLAINTEXTKEYBLOB
-  // allows the import of an unencrypted key.  For Win2k support, a cubmbersome
-  // exponent-of-one key procedure must be used:
-  //     http://support.microsoft.com/kb/228786/en-us
-  // CRYPT_IPSEC_HMAC_KEY allows keys longer than 16 bytes.
-
-  struct KeyBlob {
-    BLOBHEADER header;
-    DWORD key_size;
-    BYTE key_data[1];
-  };
-  size_t key_blob_size = std::max(offsetof(KeyBlob, key_data) + key_length,
-                                  sizeof(KeyBlob));
-  std::vector<BYTE> key_blob_storage = std::vector<BYTE>(key_blob_size);
-  KeyBlob* key_blob = reinterpret_cast<KeyBlob*>(&key_blob_storage[0]);
-  key_blob->header.bType = PLAINTEXTKEYBLOB;
-  key_blob->header.bVersion = CUR_BLOB_VERSION;
-  key_blob->header.reserved = 0;
-  key_blob->header.aiKeyAlg = CALG_RC2;
-  key_blob->key_size = static_cast<DWORD>(key_length);
-  memcpy(key_blob->key_data, key, key_length);
-
-  if (!CryptImportKey(plat_->provider_, &key_blob_storage[0],
-                      (DWORD)key_blob_storage.size(), 0,
-                      CRYPT_IPSEC_HMAC_KEY, plat_->key_.receive())) {
-    NOTREACHED();
-    return false;
-  }
-
-  // Destroy the copy of the key.
-  SecureZeroMemory(key_blob->key_data, key_length);
-
-  return true;
-}
-
-HMAC::~HMAC() {
-}
-
-bool HMAC::Sign(const base::StringPiece& data,
-                unsigned char* digest,
-                size_t digest_length) const {
-  if (hash_alg_ == SHA256) {
-    if (plat_->raw_key_.empty())
-      return false;
-    ComputeHMACSHA256(&plat_->raw_key_[0], plat_->raw_key_.size(),
-                      reinterpret_cast<const unsigned char*>(data.data()),
-                      data.size(), digest, digest_length);
-    return true;
-  }
-
-  if (!plat_->provider_ || !plat_->key_)
-    return false;
-
-  if (hash_alg_ != SHA1) {
-    NOTREACHED();
-    return false;
-  }
-
-  ScopedHCRYPTHASH hash;
-  if (!CryptCreateHash(plat_->provider_, CALG_HMAC, plat_->key_, 0,
-                       hash.receive()))
-    return false;
-
-  HMAC_INFO hmac_info;
-  memset(&hmac_info, 0, sizeof(hmac_info));
-  hmac_info.HashAlgid = CALG_SHA1;
-  if (!CryptSetHashParam(hash, HP_HMAC_INFO,
-                         reinterpret_cast<BYTE*>(&hmac_info), 0))
-    return false;
-
-  if (!CryptHashData(hash, reinterpret_cast<const BYTE*>(data.data()),
-                     static_cast<DWORD>(data.size()), 0))
-    return false;
-
-  DWORD sha1_size = static_cast<DWORD>(digest_length);
-  return !!CryptGetHashParam(hash, HP_HASHVAL, digest, &sha1_size, 0);
-}
-
-}  // namespace crypto
diff --git a/crypto/symmetric_key_openssl.cc b/crypto/symmetric_key.cc
similarity index 97%
rename from crypto/symmetric_key_openssl.cc
rename to crypto/symmetric_key.cc
index 5aef1d4..4da8bd8 100644
--- a/crypto/symmetric_key_openssl.cc
+++ b/crypto/symmetric_key.cc
@@ -76,8 +76,9 @@
       base::WriteInto(&key->key_, key_size_in_bytes + 1));
   int rv = PKCS5_PBKDF2_HMAC_SHA1(
       password.data(), password.length(),
-      reinterpret_cast<const uint8_t*>(salt.data()), salt.length(), iterations,
-      static_cast<int>(key_size_in_bytes), key_data);
+      reinterpret_cast<const uint8_t*>(salt.data()), salt.length(),
+      static_cast<unsigned>(iterations),
+      key_size_in_bytes, key_data);
   return rv == 1 ? key.release() : NULL;
 }
 
diff --git a/crypto/symmetric_key.h b/crypto/symmetric_key.h
index b24e2df..2b2e2ce 100644
--- a/crypto/symmetric_key.h
+++ b/crypto/symmetric_key.h
@@ -13,12 +13,6 @@
 #include "build/build_config.h"
 #include "crypto/crypto_export.h"
 
-#if defined(NACL_WIN64)
-// See comments for crypto_nacl_win64 in crypto.gyp.
-// Must test for NACL_WIN64 before OS_WIN since former is a subset of latter.
-#include "crypto/scoped_capi_types.h"
-#endif
-
 namespace crypto {
 
 // Wraps a platform-specific symmetric key and allows it to be held in a
@@ -57,11 +51,7 @@
   // size for use with |algorithm|. The caller owns the returned SymmetricKey.
   static SymmetricKey* Import(Algorithm algorithm, const std::string& raw_key);
 
-#if defined(NACL_WIN64)
-  HCRYPTKEY key() const { return key_.get(); }
-#else
   const std::string& key() { return key_; }
-#endif
 
   // Extracts the raw key from the platform specific data.
   // Warning: |raw_key| holds the raw key as bytes and thus must be handled
@@ -69,24 +59,8 @@
   bool GetRawKey(std::string* raw_key);
 
  private:
-#if defined(NACL_WIN64)
-  SymmetricKey(HCRYPTPROV provider, HCRYPTKEY key,
-               const void* key_data, size_t key_size_in_bytes);
-
-  ScopedHCRYPTPROV provider_;
-  ScopedHCRYPTKEY key_;
-
-  // Contains the raw key, if it is known during initialization and when it
-  // is likely that the associated |provider_| will be unable to export the
-  // |key_|. This is the case of HMAC keys when the key size exceeds 16 bytes
-  // when using the default RSA provider.
-  // TODO(rsleevi): See if KP_EFFECTIVE_KEYLEN is the reason why CryptExportKey
-  // fails with NTE_BAD_KEY/NTE_BAD_LEN
-  std::string raw_key_;
-#else
   SymmetricKey() {}
   std::string key_;
-#endif
 
   DISALLOW_COPY_AND_ASSIGN(SymmetricKey);
 };
diff --git a/crypto/symmetric_key_win.cc b/crypto/symmetric_key_win.cc
deleted file mode 100644
index 1acfcd0..0000000
--- a/crypto/symmetric_key_win.cc
+++ /dev/null
@@ -1,539 +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 "crypto/symmetric_key.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <vector>
-
-// TODO(wtc): replace scoped_array by std::vector.
-#include "base/sys_byteorder.h"
-
-namespace crypto {
-
-namespace {
-
-// The following is a non-public Microsoft header documented in MSDN under
-// CryptImportKey / CryptExportKey. Following the header is the byte array of
-// the actual plaintext key.
-struct PlaintextBlobHeader {
-  BLOBHEADER hdr;
-  DWORD cbKeySize;
-};
-
-// CryptoAPI makes use of three distinct ALG_IDs for AES, rather than just
-// CALG_AES (which exists, but depending on the functions you are calling, may
-// result in function failure, whereas the subtype would succeed).
-ALG_ID GetAESAlgIDForKeySize(size_t key_size_in_bits) {
-  // Only AES-128/-192/-256 is supported in CryptoAPI.
-  switch (key_size_in_bits) {
-    case 128:
-      return CALG_AES_128;
-    case 192:
-      return CALG_AES_192;
-    case 256:
-      return CALG_AES_256;
-    default:
-      NOTREACHED();
-      return 0;
-  }
-}
-
-// Imports a raw/plaintext key of |key_size| stored in |*key_data| into a new
-// key created for the specified |provider|. |alg| contains the algorithm of
-// the key being imported.
-// If |key_data| is intended to be used as an HMAC key, then |alg| should be
-// CALG_HMAC.
-// If successful, returns true and stores the imported key in |*key|.
-// TODO(wtc): use this function in hmac_win.cc.
-bool ImportRawKey(HCRYPTPROV provider,
-                  ALG_ID alg,
-                  const void* key_data, size_t key_size,
-                  ScopedHCRYPTKEY* key) {
-  DCHECK_GT(key_size, 0u);
-
-  DWORD actual_size =
-      static_cast<DWORD>(sizeof(PlaintextBlobHeader) + key_size);
-  std::vector<BYTE> tmp_data(actual_size);
-  BYTE* actual_key = &tmp_data[0];
-  memcpy(actual_key + sizeof(PlaintextBlobHeader), key_data, key_size);
-  PlaintextBlobHeader* key_header =
-      reinterpret_cast<PlaintextBlobHeader*>(actual_key);
-  memset(key_header, 0, sizeof(PlaintextBlobHeader));
-
-  key_header->hdr.bType = PLAINTEXTKEYBLOB;
-  key_header->hdr.bVersion = CUR_BLOB_VERSION;
-  key_header->hdr.aiKeyAlg = alg;
-
-  key_header->cbKeySize = static_cast<DWORD>(key_size);
-
-  HCRYPTKEY unsafe_key = NULL;
-  DWORD flags = CRYPT_EXPORTABLE;
-  if (alg == CALG_HMAC) {
-    // Though it may appear odd that IPSEC and RC2 are being used, this is
-    // done in accordance with Microsoft's FIPS 140-2 Security Policy for the
-    // RSA Enhanced Provider, as the approved means of using arbitrary HMAC
-    // key material.
-    key_header->hdr.aiKeyAlg = CALG_RC2;
-    flags |= CRYPT_IPSEC_HMAC_KEY;
-  }
-
-  BOOL ok =
-      CryptImportKey(provider, actual_key, actual_size, 0, flags, &unsafe_key);
-
-  // Clean up the temporary copy of key, regardless of whether it was imported
-  // successfully or not.
-  SecureZeroMemory(actual_key, actual_size);
-
-  if (!ok)
-    return false;
-
-  key->reset(unsafe_key);
-  return true;
-}
-
-// Attempts to generate a random AES key of |key_size_in_bits|. Returns true
-// if generation is successful, storing the generated key in |*key| and the
-// key provider (CSP) in |*provider|.
-bool GenerateAESKey(size_t key_size_in_bits,
-                    ScopedHCRYPTPROV* provider,
-                    ScopedHCRYPTKEY* key) {
-  DCHECK(provider);
-  DCHECK(key);
-
-  ALG_ID alg = GetAESAlgIDForKeySize(key_size_in_bits);
-  if (alg == 0)
-    return false;
-
-  ScopedHCRYPTPROV safe_provider;
-  // Note: The only time NULL is safe to be passed as pszContainer is when
-  // dwFlags contains CRYPT_VERIFYCONTEXT, as all keys generated and/or used
-  // will be treated as ephemeral keys and not persisted.
-  BOOL ok = CryptAcquireContext(safe_provider.receive(), NULL, NULL,
-                                PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
-  if (!ok)
-    return false;
-
-  ScopedHCRYPTKEY safe_key;
-  // In the FIPS 140-2 Security Policy for CAPI on XP/Vista+, Microsoft notes
-  // that CryptGenKey makes use of the same functionality exposed via
-  // CryptGenRandom. The reason this is being used, as opposed to
-  // CryptGenRandom and CryptImportKey is for compliance with the security
-  // policy
-  ok = CryptGenKey(safe_provider.get(), alg, CRYPT_EXPORTABLE,
-                   safe_key.receive());
-  if (!ok)
-    return false;
-
-  key->swap(safe_key);
-  provider->swap(safe_provider);
-
-  return true;
-}
-
-// Returns true if the HMAC key size meets the requirement of FIPS 198
-// Section 3.  |alg| is the hash function used in the HMAC.
-bool CheckHMACKeySize(size_t key_size_in_bits, ALG_ID alg) {
-  DWORD hash_size = 0;
-  switch (alg) {
-    case CALG_SHA1:
-      hash_size = 20;
-      break;
-    case CALG_SHA_256:
-      hash_size = 32;
-      break;
-    case CALG_SHA_384:
-      hash_size = 48;
-      break;
-    case CALG_SHA_512:
-      hash_size = 64;
-      break;
-  }
-  if (hash_size == 0)
-    return false;
-
-  // An HMAC key must be >= L/2, where L is the output size of the hash
-  // function being used.
-  return (key_size_in_bits >= (hash_size / 2 * 8) &&
-         (key_size_in_bits % 8) == 0);
-}
-
-// Attempts to generate a random, |key_size_in_bits|-long HMAC key, for use
-// with the hash function |alg|.
-// |key_size_in_bits| must be >= 1/2 the hash size of |alg| for security.
-// Returns true if generation is successful, storing the generated key in
-// |*key| and the key provider (CSP) in |*provider|.
-bool GenerateHMACKey(size_t key_size_in_bits,
-                     ALG_ID alg,
-                     ScopedHCRYPTPROV* provider,
-                     ScopedHCRYPTKEY* key,
-                     std::unique_ptr<BYTE[]>* raw_key) {
-  DCHECK(provider);
-  DCHECK(key);
-  DCHECK(raw_key);
-
-  if (!CheckHMACKeySize(key_size_in_bits, alg))
-    return false;
-
-  ScopedHCRYPTPROV safe_provider;
-  // See comment in GenerateAESKey as to why NULL is acceptable for the
-  // container name.
-  BOOL ok = CryptAcquireContext(safe_provider.receive(), NULL, NULL,
-                                PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
-  if (!ok)
-    return false;
-
-  DWORD key_size_in_bytes = static_cast<DWORD>(key_size_in_bits / 8);
-  std::unique_ptr<BYTE[]> random(new BYTE[key_size_in_bytes]);
-  ok = CryptGenRandom(safe_provider, key_size_in_bytes, random.get());
-  if (!ok)
-    return false;
-
-  ScopedHCRYPTKEY safe_key;
-  bool rv = ImportRawKey(safe_provider, CALG_HMAC, random.get(),
-                         key_size_in_bytes, &safe_key);
-  if (rv) {
-    key->swap(safe_key);
-    provider->swap(safe_provider);
-    raw_key->swap(random);
-  }
-
-  SecureZeroMemory(random.get(), key_size_in_bytes);
-  return rv;
-}
-
-// Attempts to create an HMAC hash instance using the specified |provider|
-// and |key|. The inner hash function will be |hash_alg|. If successful,
-// returns true and stores the hash in |*hash|.
-// TODO(wtc): use this function in hmac_win.cc.
-bool CreateHMACHash(HCRYPTPROV provider,
-                    HCRYPTKEY key,
-                    ALG_ID hash_alg,
-                    ScopedHCRYPTHASH* hash) {
-  ScopedHCRYPTHASH safe_hash;
-  BOOL ok = CryptCreateHash(provider, CALG_HMAC, key, 0, safe_hash.receive());
-  if (!ok)
-    return false;
-
-  HMAC_INFO hmac_info;
-  memset(&hmac_info, 0, sizeof(hmac_info));
-  hmac_info.HashAlgid = hash_alg;
-
-  ok = CryptSetHashParam(safe_hash, HP_HMAC_INFO,
-                         reinterpret_cast<const BYTE*>(&hmac_info), 0);
-  if (!ok)
-    return false;
-
-  hash->swap(safe_hash);
-  return true;
-}
-
-// Computes a block of the derived key using the PBKDF2 function F for the
-// specified |block_index| using the PRF |hash|, writing the output to
-// |output_buf|.
-// |output_buf| must have enough space to accomodate the output of the PRF
-// specified by |hash|.
-// Returns true if the block was successfully computed.
-bool ComputePBKDF2Block(HCRYPTHASH hash,
-                        DWORD hash_size,
-                        const std::string& salt,
-                        size_t iterations,
-                        uint32_t block_index,
-                        BYTE* output_buf) {
-  // From RFC 2898:
-  // 3. <snip> The function F is defined as the exclusive-or sum of the first
-  //    c iterates of the underlying pseudorandom function PRF applied to the
-  //    password P and the concatenation of the salt S and the block index i:
-  //      F (P, S, c, i) = U_1 \xor U_2 \xor ... \xor U_c
-  //    where
-  //      U_1 = PRF(P, S || INT (i))
-  //      U_2 = PRF(P, U_1)
-  //      ...
-  //      U_c = PRF(P, U_{c-1})
-  ScopedHCRYPTHASH safe_hash;
-  BOOL ok = CryptDuplicateHash(hash, NULL, 0, safe_hash.receive());
-  if (!ok)
-    return false;
-
-  // Iteration U_1: Compute PRF for S.
-  ok = CryptHashData(safe_hash, reinterpret_cast<const BYTE*>(salt.data()),
-                     static_cast<DWORD>(salt.size()), 0);
-  if (!ok)
-    return false;
-
-  // Iteration U_1: and append (big-endian) INT (i).
-  uint32_t big_endian_block_index = base::HostToNet32(block_index);
-  ok = CryptHashData(safe_hash,
-                     reinterpret_cast<BYTE*>(&big_endian_block_index),
-                     sizeof(big_endian_block_index), 0);
-
-  std::vector<BYTE> hash_value(hash_size);
-
-  DWORD size = hash_size;
-  ok = CryptGetHashParam(safe_hash, HP_HASHVAL, &hash_value[0], &size, 0);
-  if (!ok  || size != hash_size)
-    return false;
-
-  memcpy(output_buf, &hash_value[0], hash_size);
-
-  // Iteration 2 - c: Compute U_{iteration} by applying the PRF to
-  // U_{iteration - 1}, then xor the resultant hash with |output|, which
-  // contains U_1 ^ U_2 ^ ... ^ U_{iteration - 1}.
-  for (size_t iteration = 2; iteration <= iterations; ++iteration) {
-    safe_hash.reset();
-    ok = CryptDuplicateHash(hash, NULL, 0, safe_hash.receive());
-    if (!ok)
-      return false;
-
-    ok = CryptHashData(safe_hash, &hash_value[0], hash_size, 0);
-    if (!ok)
-      return false;
-
-    size = hash_size;
-    ok = CryptGetHashParam(safe_hash, HP_HASHVAL, &hash_value[0], &size, 0);
-    if (!ok || size != hash_size)
-      return false;
-
-    for (DWORD i = 0; i < hash_size; ++i)
-      output_buf[i] ^= hash_value[i];
-  }
-
-  return true;
-}
-
-}  // namespace
-
-SymmetricKey::~SymmetricKey() {
-  // TODO(wtc): create a "secure" string type that zeroes itself in the
-  // destructor.
-  if (!raw_key_.empty())
-    SecureZeroMemory(const_cast<char *>(raw_key_.data()), raw_key_.size());
-}
-
-// static
-SymmetricKey* SymmetricKey::GenerateRandomKey(Algorithm algorithm,
-                                              size_t key_size_in_bits) {
-  DCHECK_GE(key_size_in_bits, 8u);
-
-  ScopedHCRYPTPROV provider;
-  ScopedHCRYPTKEY key;
-
-  bool ok = false;
-  std::unique_ptr<BYTE[]> raw_key;
-
-  switch (algorithm) {
-    case AES:
-      ok = GenerateAESKey(key_size_in_bits, &provider, &key);
-      break;
-    case HMAC_SHA1:
-      ok = GenerateHMACKey(key_size_in_bits, CALG_SHA1, &provider,
-                           &key, &raw_key);
-      break;
-  }
-
-  if (!ok) {
-    NOTREACHED();
-    return NULL;
-  }
-
-  size_t key_size_in_bytes = key_size_in_bits / 8;
-  if (raw_key == NULL)
-    key_size_in_bytes = 0;
-
-  SymmetricKey* result = new SymmetricKey(provider.release(),
-                                          key.release(),
-                                          raw_key.get(),
-                                          key_size_in_bytes);
-  if (raw_key != NULL)
-    SecureZeroMemory(raw_key.get(), key_size_in_bytes);
-
-  return result;
-}
-
-// static
-SymmetricKey* SymmetricKey::DeriveKeyFromPassword(Algorithm algorithm,
-                                                  const std::string& password,
-                                                  const std::string& salt,
-                                                  size_t iterations,
-                                                  size_t key_size_in_bits) {
-  // CryptoAPI lacks routines to perform PBKDF2 derivation as specified
-  // in RFC 2898, so it must be manually implemented. Only HMAC-SHA1 is
-  // supported as the PRF.
-
-  // While not used until the end, sanity-check the input before proceeding
-  // with the expensive computation.
-  DWORD provider_type = 0;
-  ALG_ID alg = 0;
-  switch (algorithm) {
-    case AES:
-      provider_type = PROV_RSA_AES;
-      alg = GetAESAlgIDForKeySize(key_size_in_bits);
-      break;
-    case HMAC_SHA1:
-      provider_type = PROV_RSA_FULL;
-      alg = CALG_HMAC;
-      break;
-    default:
-      NOTREACHED();
-      break;
-  }
-  if (provider_type == 0 || alg == 0)
-    return NULL;
-
-  ScopedHCRYPTPROV provider;
-  BOOL ok = CryptAcquireContext(provider.receive(), NULL, NULL, provider_type,
-                                CRYPT_VERIFYCONTEXT);
-  if (!ok)
-    return NULL;
-
-  // Convert the user password into a key suitable to be fed into the PRF
-  // function.
-  ScopedHCRYPTKEY password_as_key;
-  BYTE* password_as_bytes =
-      const_cast<BYTE*>(reinterpret_cast<const BYTE*>(password.data()));
-  if (!ImportRawKey(provider, CALG_HMAC, password_as_bytes,
-                    password.size(), &password_as_key))
-    return NULL;
-
-  // Configure the PRF function. Only HMAC variants are supported, with the
-  // only hash function supported being SHA1.
-  // TODO(rsleevi): Support SHA-256 on XP SP3+.
-  ScopedHCRYPTHASH prf;
-  if (!CreateHMACHash(provider, password_as_key, CALG_SHA1, &prf))
-    return NULL;
-
-  DWORD hLen = 0;
-  DWORD param_size = sizeof(hLen);
-  ok = CryptGetHashParam(prf, HP_HASHSIZE,
-                         reinterpret_cast<BYTE*>(&hLen), &param_size, 0);
-  if (!ok || hLen == 0)
-    return NULL;
-
-  // 1. If dkLen > (2^32 - 1) * hLen, output "derived key too long" and stop.
-  size_t dkLen = key_size_in_bits / 8;
-  DCHECK_GT(dkLen, 0u);
-
-  if ((dkLen / hLen) > 0xFFFFFFFF) {
-    DLOG(ERROR) << "Derived key too long.";
-    return NULL;
-  }
-
-  // 2. Let l be the number of hLen-octet blocks in the derived key,
-  //    rounding up, and let r be the number of octets in the last
-  //    block:
-  size_t L = (dkLen + hLen - 1) / hLen;
-  DCHECK_GT(L, 0u);
-
-  size_t total_generated_size = L * hLen;
-  std::vector<BYTE> generated_key(total_generated_size);
-  BYTE* block_offset = &generated_key[0];
-
-  // 3. For each block of the derived key apply the function F defined below
-  //    to the password P, the salt S, the iteration count c, and the block
-  //    index to compute the block:
-  //    T_1 = F (P, S, c, 1)
-  //    T_2 = F (P, S, c, 2)
-  //    ...
-  //    T_l = F (P, S, c, l)
-  // <snip>
-  // 4. Concatenate the blocks and extract the first dkLen octets to produce
-  //    a derived key DK:
-  //    DK = T_1 || T_2 || ... || T_l<0..r-1>
-  for (uint32_t block_index = 1; block_index <= L; ++block_index) {
-    if (!ComputePBKDF2Block(prf, hLen, salt, iterations, block_index,
-                            block_offset))
-        return NULL;
-    block_offset += hLen;
-  }
-
-  // Convert the derived key bytes into a key handle for the desired algorithm.
-  ScopedHCRYPTKEY key;
-  if (!ImportRawKey(provider, alg, &generated_key[0], dkLen, &key))
-    return NULL;
-
-  SymmetricKey* result = new SymmetricKey(provider.release(), key.release(),
-                                          &generated_key[0], dkLen);
-
-  SecureZeroMemory(&generated_key[0], total_generated_size);
-
-  return result;
-}
-
-// static
-SymmetricKey* SymmetricKey::Import(Algorithm algorithm,
-                                   const std::string& raw_key) {
-  DWORD provider_type = 0;
-  ALG_ID alg = 0;
-  switch (algorithm) {
-    case AES:
-      provider_type = PROV_RSA_AES;
-      alg = GetAESAlgIDForKeySize(raw_key.size() * 8);
-      break;
-    case HMAC_SHA1:
-      provider_type = PROV_RSA_FULL;
-      alg = CALG_HMAC;
-      break;
-    default:
-      NOTREACHED();
-      break;
-  }
-  if (provider_type == 0 || alg == 0)
-    return NULL;
-
-  ScopedHCRYPTPROV provider;
-  BOOL ok = CryptAcquireContext(provider.receive(), NULL, NULL, provider_type,
-                                CRYPT_VERIFYCONTEXT);
-  if (!ok)
-    return NULL;
-
-  ScopedHCRYPTKEY key;
-  if (!ImportRawKey(provider, alg, raw_key.data(), raw_key.size(), &key))
-    return NULL;
-
-  return new SymmetricKey(provider.release(), key.release(),
-                          raw_key.data(), raw_key.size());
-}
-
-bool SymmetricKey::GetRawKey(std::string* raw_key) {
-  // Short circuit for when the key was supplied to the constructor.
-  if (!raw_key_.empty()) {
-    *raw_key = raw_key_;
-    return true;
-  }
-
-  DWORD size = 0;
-  BOOL ok = CryptExportKey(key_, 0, PLAINTEXTKEYBLOB, 0, NULL, &size);
-  if (!ok)
-    return false;
-
-  std::vector<BYTE> result(size);
-
-  ok = CryptExportKey(key_, 0, PLAINTEXTKEYBLOB, 0, &result[0], &size);
-  if (!ok)
-    return false;
-
-  PlaintextBlobHeader* header =
-      reinterpret_cast<PlaintextBlobHeader*>(&result[0]);
-  raw_key->assign(reinterpret_cast<char*>(&result[sizeof(*header)]),
-                  header->cbKeySize);
-
-  SecureZeroMemory(&result[0], size);
-
-  return true;
-}
-
-SymmetricKey::SymmetricKey(HCRYPTPROV provider,
-                           HCRYPTKEY key,
-                           const void* key_data, size_t key_size_in_bytes)
-    : provider_(provider), key_(key) {
-  if (key_data) {
-    raw_key_.assign(reinterpret_cast<const char*>(key_data),
-                    key_size_in_bytes);
-  }
-}
-
-}  // namespace crypto
diff --git a/crypto/third_party/nss/LICENSE b/crypto/third_party/nss/LICENSE
deleted file mode 100644
index 03671648..0000000
--- a/crypto/third_party/nss/LICENSE
+++ /dev/null
@@ -1,35 +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 ***** */
diff --git a/crypto/third_party/nss/README.chromium b/crypto/third_party/nss/README.chromium
deleted file mode 100644
index 1a63665..0000000
--- a/crypto/third_party/nss/README.chromium
+++ /dev/null
@@ -1,18 +0,0 @@
-Name: Network Security Services (NSS)
-URL: http://www.mozilla.org/projects/security/pki/nss/
-License: MPL 1.1/GPL 2.0/LGPL 2.1
-
-We extracted the SHA-256 source files, eliminated unneeded dependencies,
-deleted or commented out unused code, and tweaked them for Chrome's source
-tree.  sha512.c is renamed sha512.cc so that it can include Chrome's C++
-header "base/basictypes.h".  We define NOUNROLL256 to reduce the object code
-size.
-
-In blapi.h and sha512.cc, replaced uint32 by unsigned int so that they can
-be compiled with -DNO_NSPR_10_SUPPORT.  NO_NSPR_10_SUPPORT turns off the
-definition of the NSPR 1.0 types int8 - int64 and uint8 - uint64 to avoid
-conflict with the same-named types defined in "base/basictypes.h".
-
-rsawrapr.c is copied from nss/lib/softoken/rsawrapr.c, with
-HASH_GetRawHashObject changed to HASH_GetHashObject. It contains the
-emsa_pss_verify function for verifying RSA-PSS signatures.
diff --git a/crypto/third_party/nss/chromium-blapi.h b/crypto/third_party/nss/chromium-blapi.h
deleted file mode 100644
index 2ca772e..0000000
--- a/crypto/third_party/nss/chromium-blapi.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * crypto.h - public data structures and prototypes for the crypto library
- *
- * ***** 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):
- *   Dr Vipul Gupta <vipul.gupta@sun.com>, Sun Microsystems Laboratories
- *
- * 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 ***** */
-/* $Id: blapi.h,v 1.27 2007/11/09 18:49:32 wtc%google.com Exp $ */
-
-#ifndef CRYPTO_THIRD_PARTY_NSS_CHROMIUM_BLAPI_H_
-#define CRYPTO_THIRD_PARTY_NSS_CHROMIUM_BLAPI_H_
-
-#include "crypto/third_party/nss/chromium-blapit.h"
-
-/******************************************/
-
-extern SHA256Context *SHA256_NewContext(void);
-extern void SHA256_DestroyContext(SHA256Context *cx, PRBool freeit);
-extern void SHA256_Begin(SHA256Context *cx);
-extern void SHA256_Update(SHA256Context *cx, const unsigned char *input,
-			unsigned int inputLen);
-extern void SHA256_End(SHA256Context *cx, unsigned char *digest,
-		     unsigned int *digestLen, unsigned int maxDigestLen);
-extern SECStatus SHA256_HashBuf(unsigned char *dest, const unsigned char *src,
-			      unsigned int src_length);
-extern SECStatus SHA256_Hash(unsigned char *dest, const char *src);
-extern void SHA256_TraceState(SHA256Context *cx);
-extern unsigned int SHA256_FlattenSize(SHA256Context *cx);
-extern SECStatus SHA256_Flatten(SHA256Context *cx,unsigned char *space);
-extern SHA256Context * SHA256_Resurrect(unsigned char *space, void *arg);
-extern void SHA256_Clone(SHA256Context *dest, SHA256Context *src);
-
-/******************************************/
-
-extern SHA512Context *SHA512_NewContext(void);
-extern void SHA512_DestroyContext(SHA512Context *cx, PRBool freeit);
-extern void SHA512_Begin(SHA512Context *cx);
-extern void SHA512_Update(SHA512Context *cx, const unsigned char *input,
-			unsigned int inputLen);
-extern void SHA512_End(SHA512Context *cx, unsigned char *digest,
-		     unsigned int *digestLen, unsigned int maxDigestLen);
-extern SECStatus SHA512_HashBuf(unsigned char *dest, const unsigned char *src,
-			      unsigned int src_length);
-extern SECStatus SHA512_Hash(unsigned char *dest, const char *src);
-extern void SHA512_TraceState(SHA512Context *cx);
-extern unsigned int SHA512_FlattenSize(SHA512Context *cx);
-extern SECStatus SHA512_Flatten(SHA512Context *cx,unsigned char *space);
-extern SHA512Context * SHA512_Resurrect(unsigned char *space, void *arg);
-extern void SHA512_Clone(SHA512Context *dest, SHA512Context *src);
-
-/******************************************/
-
-extern SHA384Context *SHA384_NewContext(void);
-extern void SHA384_DestroyContext(SHA384Context *cx, PRBool freeit);
-extern void SHA384_Begin(SHA384Context *cx);
-extern void SHA384_Update(SHA384Context *cx, const unsigned char *input,
-			unsigned int inputLen);
-extern void SHA384_End(SHA384Context *cx, unsigned char *digest,
-		     unsigned int *digestLen, unsigned int maxDigestLen);
-extern SECStatus SHA384_HashBuf(unsigned char *dest, const unsigned char *src,
-			      unsigned int src_length);
-extern SECStatus SHA384_Hash(unsigned char *dest, const char *src);
-extern void SHA384_TraceState(SHA384Context *cx);
-extern unsigned int SHA384_FlattenSize(SHA384Context *cx);
-extern SECStatus SHA384_Flatten(SHA384Context *cx,unsigned char *space);
-extern SHA384Context * SHA384_Resurrect(unsigned char *space, void *arg);
-extern void SHA384_Clone(SHA384Context *dest, SHA384Context *src);
-
-#endif /* CRYPTO_THIRD_PARTY_NSS_CHROMIUM_BLAPI_H_ */
diff --git a/crypto/third_party/nss/chromium-blapit.h b/crypto/third_party/nss/chromium-blapit.h
deleted file mode 100644
index 938547a2..0000000
--- a/crypto/third_party/nss/chromium-blapit.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * blapit.h - public data structures for the crypto library
- *
- * ***** 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):
- *   Dr Vipul Gupta <vipul.gupta@sun.com> and
- *   Douglas Stebila <douglas@stebila.ca>, Sun Microsystems Laboratories
- *
- * 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 ***** */
-/* $Id: blapit.h,v 1.20 2007/02/28 19:47:37 rrelyea%redhat.com Exp $ */
-
-#ifndef CRYPTO_THIRD_PARTY_NSS_CHROMIUM_BLAPIT_H_
-#define CRYPTO_THIRD_PARTY_NSS_CHROMIUM_BLAPIT_H_
-
-#include "crypto/third_party/nss/chromium-prtypes.h"
-
-/*
-** A status code. Status's are used by procedures that return status
-** values. Again the motivation is so that a compiler can generate
-** warnings when return values are wrong. Correct testing of status codes:
-**
-**      SECStatus rv;
-**      rv = some_function (some_argument);
-**      if (rv != SECSuccess)
-**              do_an_error_thing();
-**
-*/
-typedef enum _SECStatus {
-    SECWouldBlock = -2,
-    SECFailure = -1,
-    SECSuccess = 0
-} SECStatus;
-
-#define SHA256_LENGTH 		32 	/* bytes */
-#define SHA384_LENGTH 		48 	/* bytes */
-#define SHA512_LENGTH 		64 	/* bytes */
-#define HASH_LENGTH_MAX         SHA512_LENGTH
-
-/*
- * Input block size for each hash algorithm.
- */
-
-#define SHA256_BLOCK_LENGTH      64     /* bytes */
-#define SHA384_BLOCK_LENGTH     128     /* bytes */
-#define SHA512_BLOCK_LENGTH     128     /* bytes */
-#define HASH_BLOCK_LENGTH_MAX   SHA512_BLOCK_LENGTH
-
-/***************************************************************************
-** Opaque objects
-*/
-
-struct SHA256ContextStr     ;
-struct SHA512ContextStr     ;
-
-typedef struct SHA256ContextStr     SHA256Context;
-typedef struct SHA512ContextStr     SHA512Context;
-/* SHA384Context is really a SHA512ContextStr.  This is not a mistake. */
-typedef struct SHA512ContextStr     SHA384Context;
-
-#endif /* CRYPTO_THIRD_PARTY_NSS_CHROMIUM_BLAPIT_H_ */
diff --git a/crypto/third_party/nss/chromium-nss.h b/crypto/third_party/nss/chromium-nss.h
deleted file mode 100644
index 437e6bd..0000000
--- a/crypto/third_party/nss/chromium-nss.h
+++ /dev/null
@@ -1,79 +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 ***** */
-
-#ifndef CRYPTO_THIRD_PARTY_NSS_CHROMIUM_NSS_H_
-#define CRYPTO_THIRD_PARTY_NSS_CHROMIUM_NSS_H_
-
-// This file contains some functions we borrowed from NSS.
-
-#include <prtypes.h>
-#include <hasht.h>
-#include <keyhi.h>
-#include <secmod.h>
-
-#include "crypto/crypto_export.h"
-
-extern "C" SECStatus emsa_pss_verify(const unsigned char *mHash,
-                                     const unsigned char *em,
-                                     unsigned int emLen,
-                                     HASH_HashType hashAlg,
-                                     HASH_HashType maskHashAlg,
-                                     unsigned int sLen);
-
-// Like PK11_ImportEncryptedPrivateKeyInfo, but hardcoded for EC, and returns
-// the SECKEYPrivateKey.
-// See https://bugzilla.mozilla.org/show_bug.cgi?id=211546
-// When we use NSS 3.13.2 or later,
-// PK11_ImportEncryptedPrivateKeyInfoAndReturnKey can be used instead.
-SECStatus ImportEncryptedECPrivateKeyInfoAndReturnKey(
-    PK11SlotInfo* slot,
-    SECKEYEncryptedPrivateKeyInfo* epki,
-    SECItem* password,
-    SECItem* nickname,
-    SECItem* public_value,
-    PRBool permanent,
-    PRBool sensitive,
-    SECKEYPrivateKey** private_key,
-    void* wincx);
-
-// Like SEC_DerSignData.
-CRYPTO_EXPORT SECStatus DerSignData(PLArenaPool *arena,
-                                    SECItem *result,
-                                    SECItem *input,
-                                    SECKEYPrivateKey *key,
-                                    SECOidTag algo_id);
-
-#endif  // CRYPTO_THIRD_PARTY_NSS_CHROMIUM_NSS_H_
diff --git a/crypto/third_party/nss/chromium-prtypes.h b/crypto/third_party/nss/chromium-prtypes.h
deleted file mode 100644
index d5ea8a9..0000000
--- a/crypto/third_party/nss/chromium-prtypes.h
+++ /dev/null
@@ -1,77 +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) 2002
- * 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 ***** */
-
-/* Emulates the real prtypes.h. Defines the types and macros that sha512.cc
- * needs. */
-
-#ifndef CRYPTO_THIRD_PARTY_NSS_CHROMIUM_PRTYPES_H_
-#define CRYPTO_THIRD_PARTY_NSS_CHROMIUM_PRTYPES_H_
-
-#include <limits.h>
-#include <stdint.h>
-
-#include "build/build_config.h"
-
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
-#define IS_LITTLE_ENDIAN 1
-#else
-#define IS_BIG_ENDIAN 1
-#endif
-
-/*
- * The C language requires that 'long' be at least 32 bits. 2147483647 is the
- * largest signed 32-bit integer.
- */
-#if LONG_MAX > 2147483647L
-#define PR_BYTES_PER_LONG 8
-#else
-#define PR_BYTES_PER_LONG 4
-#endif
-
-#define HAVE_LONG_LONG
-
-#if defined(__linux__)
-#define LINUX
-#endif
-
-typedef uint8_t PRUint8;
-typedef uint32_t PRUint32;
-
-typedef int PRBool;
-
-#define PR_MIN(x,y) ((x)<(y)?(x):(y))
-
-#endif  /* CRYPTO_THIRD_PARTY_NSS_CHROMIUM_PRTYPES_H_ */
diff --git a/crypto/third_party/nss/chromium-sha256.h b/crypto/third_party/nss/chromium-sha256.h
deleted file mode 100644
index 52815ca7..0000000
--- a/crypto/third_party/nss/chromium-sha256.h
+++ /dev/null
@@ -1,51 +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) 2002
- * 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 ***** */
-
-#ifndef CRYPTO_THIRD_PARTY_NSS_CHROMIUM_SHA_256_H_
-#define CRYPTO_THIRD_PARTY_NSS_CHROMIUM_SHA_256_H_
-
-#include "crypto/third_party/nss/chromium-prtypes.h"
-
-struct SHA256ContextStr {
-    union {
-	PRUint32 w[64];	    /* message schedule, input buffer, plus 48 words */
-	PRUint8  b[256];
-    } u;
-    PRUint32 h[8];		/* 8 state variables */
-    PRUint32 sizeHi,sizeLo;	/* 64-bit count of hashed bytes. */
-};
-
-#endif /* CRYPTO_THIRD_PARTY_NSS_CHROMIUM_SHA_256_H_ */
diff --git a/crypto/third_party/nss/sha512.cc b/crypto/third_party/nss/sha512.cc
deleted file mode 100644
index 78950cb5..0000000
--- a/crypto/third_party/nss/sha512.cc
+++ /dev/null
@@ -1,1390 +0,0 @@
-/*
- * sha512.c - implementation of SHA256, SHA384 and SHA512
- *
- * ***** 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) 2002
- * 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 ***** */
-/* $Id: sha512.c,v 1.9 2006/10/13 16:54:04 wtchang%redhat.com Exp $ */
-
-// Prevent manual unrolling in the sha256 code, which reduces the binary code
-// size from ~10k to ~1k.  The performance should be reasonable for our use.
-#define NOUNROLL256 1
-
-#include "crypto/third_party/nss/chromium-prtypes.h"  /* for PRUintXX */
-#if defined(_X86_) || defined(SHA_NO_LONG_LONG)
-#define NOUNROLL512 1
-#undef HAVE_LONG_LONG
-#endif
-#include "crypto/third_party/nss/chromium-blapi.h"
-#include "crypto/third_party/nss/chromium-sha256.h"    /* for struct SHA256ContextStr */
-
-#include <stdlib.h>
-#include <string.h>
-#define PORT_New(type) static_cast<type*>(malloc(sizeof(type)))
-#define PORT_ZFree(ptr, len) do { memset(ptr, 0, len); free(ptr); } while (0)
-#define PORT_Strlen(s) static_cast<unsigned int>(strlen(s))
-#define PORT_Memcpy memcpy
-
-/* ============= Common constants and defines ======================= */
-
-#define W ctx->u.w
-#define B ctx->u.b
-#define H ctx->h
-
-#define SHR(x,n) (x >> n)
-#define SHL(x,n) (x << n)
-#define Ch(x,y,z)  ((x & y) ^ (~x & z))
-#define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z))
-
-/* Padding used with all flavors of SHA */
-static const PRUint8 pad[240] = {
-0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-   /* compiler will fill the rest in with zeros */
-};
-
-/* ============= SHA256 implemenmtation ================================== */
-
-/* SHA-256 constants, K256. */
-static const PRUint32 K256[64] = {
-    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
-    0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
-    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
-    0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
-    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
-    0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
-    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
-    0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
-    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
-    0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
-    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
-    0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
-    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
-    0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
-    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
-    0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
-};
-
-/* SHA-256 initial hash values */
-static const PRUint32 H256[8] = {
-    0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
-    0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
-};
-
-#if defined(_MSC_VER) && defined(_X86_)
-#ifndef FORCEINLINE
-#if (_MSC_VER >= 1200)
-#define FORCEINLINE __forceinline
-#else
-#define FORCEINLINE __inline
-#endif
-#endif
-#define FASTCALL __fastcall
-
-static FORCEINLINE PRUint32 FASTCALL
-swap4b(PRUint32 dwd)
-{
-    __asm {
-    	mov   eax,dwd
-	bswap eax
-    }
-}
-
-#define SHA_HTONL(x) swap4b(x)
-#define BYTESWAP4(x)  x = SHA_HTONL(x)
-
-#elif defined(LINUX) && defined(_X86_)
-#undef  __OPTIMIZE__
-#define __OPTIMIZE__ 1
-#undef  __pentium__
-#define __pentium__ 1
-#include <byteswap.h>
-#define SHA_HTONL(x) bswap_32(x)
-#define BYTESWAP4(x)  x = SHA_HTONL(x)
-
-#else /* neither windows nor Linux PC */
-#define SWAP4MASK  0x00FF00FF
-#define SHA_HTONL(x) (t1 = (x), t1 = (t1 << 16) | (t1 >> 16), \
-                      ((t1 & SWAP4MASK) << 8) | ((t1 >> 8) & SWAP4MASK))
-#define BYTESWAP4(x)  x = SHA_HTONL(x)
-#endif
-
-#if defined(_MSC_VER) && defined(_X86_)
-#pragma intrinsic (_lrotr, _lrotl)
-#define ROTR32(x,n) _lrotr(x,n)
-#define ROTL32(x,n) _lrotl(x,n)
-#else
-#define ROTR32(x,n) ((x >> n) | (x << ((8 * sizeof x) - n)))
-#define ROTL32(x,n) ((x << n) | (x >> ((8 * sizeof x) - n)))
-#endif
-
-/* Capitol Sigma and lower case sigma functions */
-#define S0(x) (ROTR32(x, 2) ^ ROTR32(x,13) ^ ROTR32(x,22))
-#define S1(x) (ROTR32(x, 6) ^ ROTR32(x,11) ^ ROTR32(x,25))
-#define s0(x) (t1 = x, ROTR32(t1, 7) ^ ROTR32(t1,18) ^ SHR(t1, 3))
-#define s1(x) (t2 = x, ROTR32(t2,17) ^ ROTR32(t2,19) ^ SHR(t2,10))
-
-SHA256Context *
-SHA256_NewContext(void)
-{
-    SHA256Context *ctx = PORT_New(SHA256Context);
-    return ctx;
-}
-
-void
-SHA256_DestroyContext(SHA256Context *ctx, PRBool freeit)
-{
-    if (freeit) {
-        PORT_ZFree(ctx, sizeof *ctx);
-    }
-}
-
-void
-SHA256_Begin(SHA256Context *ctx)
-{
-    memset(ctx, 0, sizeof *ctx);
-    memcpy(H, H256, sizeof H256);
-}
-
-static void
-SHA256_Compress(SHA256Context *ctx)
-{
-  {
-    register PRUint32 t1, t2;
-
-#if defined(IS_LITTLE_ENDIAN)
-    BYTESWAP4(W[0]);
-    BYTESWAP4(W[1]);
-    BYTESWAP4(W[2]);
-    BYTESWAP4(W[3]);
-    BYTESWAP4(W[4]);
-    BYTESWAP4(W[5]);
-    BYTESWAP4(W[6]);
-    BYTESWAP4(W[7]);
-    BYTESWAP4(W[8]);
-    BYTESWAP4(W[9]);
-    BYTESWAP4(W[10]);
-    BYTESWAP4(W[11]);
-    BYTESWAP4(W[12]);
-    BYTESWAP4(W[13]);
-    BYTESWAP4(W[14]);
-    BYTESWAP4(W[15]);
-#endif
-
-#define INITW(t) W[t] = (s1(W[t-2]) + W[t-7] + s0(W[t-15]) + W[t-16])
-
-    /* prepare the "message schedule"   */
-#ifdef NOUNROLL256
-    {
-	int t;
-	for (t = 16; t < 64; ++t) {
-	    INITW(t);
-	}
-    }
-#else
-    INITW(16);
-    INITW(17);
-    INITW(18);
-    INITW(19);
-
-    INITW(20);
-    INITW(21);
-    INITW(22);
-    INITW(23);
-    INITW(24);
-    INITW(25);
-    INITW(26);
-    INITW(27);
-    INITW(28);
-    INITW(29);
-
-    INITW(30);
-    INITW(31);
-    INITW(32);
-    INITW(33);
-    INITW(34);
-    INITW(35);
-    INITW(36);
-    INITW(37);
-    INITW(38);
-    INITW(39);
-
-    INITW(40);
-    INITW(41);
-    INITW(42);
-    INITW(43);
-    INITW(44);
-    INITW(45);
-    INITW(46);
-    INITW(47);
-    INITW(48);
-    INITW(49);
-
-    INITW(50);
-    INITW(51);
-    INITW(52);
-    INITW(53);
-    INITW(54);
-    INITW(55);
-    INITW(56);
-    INITW(57);
-    INITW(58);
-    INITW(59);
-
-    INITW(60);
-    INITW(61);
-    INITW(62);
-    INITW(63);
-
-#endif
-#undef INITW
-  }
-  {
-    PRUint32 a, b, c, d, e, f, g, h;
-
-    a = H[0];
-    b = H[1];
-    c = H[2];
-    d = H[3];
-    e = H[4];
-    f = H[5];
-    g = H[6];
-    h = H[7];
-
-#define ROUND(n,a,b,c,d,e,f,g,h) \
-    h += S1(e) + Ch(e,f,g) + K256[n] + W[n]; \
-    d += h; \
-    h += S0(a) + Maj(a,b,c);
-
-#ifdef NOUNROLL256
-    {
-	int t;
-	for (t = 0; t < 64; t+= 8) {
-	    ROUND(t+0,a,b,c,d,e,f,g,h)
-	    ROUND(t+1,h,a,b,c,d,e,f,g)
-	    ROUND(t+2,g,h,a,b,c,d,e,f)
-	    ROUND(t+3,f,g,h,a,b,c,d,e)
-	    ROUND(t+4,e,f,g,h,a,b,c,d)
-	    ROUND(t+5,d,e,f,g,h,a,b,c)
-	    ROUND(t+6,c,d,e,f,g,h,a,b)
-	    ROUND(t+7,b,c,d,e,f,g,h,a)
-	}
-    }
-#else
-    ROUND( 0,a,b,c,d,e,f,g,h)
-    ROUND( 1,h,a,b,c,d,e,f,g)
-    ROUND( 2,g,h,a,b,c,d,e,f)
-    ROUND( 3,f,g,h,a,b,c,d,e)
-    ROUND( 4,e,f,g,h,a,b,c,d)
-    ROUND( 5,d,e,f,g,h,a,b,c)
-    ROUND( 6,c,d,e,f,g,h,a,b)
-    ROUND( 7,b,c,d,e,f,g,h,a)
-
-    ROUND( 8,a,b,c,d,e,f,g,h)
-    ROUND( 9,h,a,b,c,d,e,f,g)
-    ROUND(10,g,h,a,b,c,d,e,f)
-    ROUND(11,f,g,h,a,b,c,d,e)
-    ROUND(12,e,f,g,h,a,b,c,d)
-    ROUND(13,d,e,f,g,h,a,b,c)
-    ROUND(14,c,d,e,f,g,h,a,b)
-    ROUND(15,b,c,d,e,f,g,h,a)
-
-    ROUND(16,a,b,c,d,e,f,g,h)
-    ROUND(17,h,a,b,c,d,e,f,g)
-    ROUND(18,g,h,a,b,c,d,e,f)
-    ROUND(19,f,g,h,a,b,c,d,e)
-    ROUND(20,e,f,g,h,a,b,c,d)
-    ROUND(21,d,e,f,g,h,a,b,c)
-    ROUND(22,c,d,e,f,g,h,a,b)
-    ROUND(23,b,c,d,e,f,g,h,a)
-
-    ROUND(24,a,b,c,d,e,f,g,h)
-    ROUND(25,h,a,b,c,d,e,f,g)
-    ROUND(26,g,h,a,b,c,d,e,f)
-    ROUND(27,f,g,h,a,b,c,d,e)
-    ROUND(28,e,f,g,h,a,b,c,d)
-    ROUND(29,d,e,f,g,h,a,b,c)
-    ROUND(30,c,d,e,f,g,h,a,b)
-    ROUND(31,b,c,d,e,f,g,h,a)
-
-    ROUND(32,a,b,c,d,e,f,g,h)
-    ROUND(33,h,a,b,c,d,e,f,g)
-    ROUND(34,g,h,a,b,c,d,e,f)
-    ROUND(35,f,g,h,a,b,c,d,e)
-    ROUND(36,e,f,g,h,a,b,c,d)
-    ROUND(37,d,e,f,g,h,a,b,c)
-    ROUND(38,c,d,e,f,g,h,a,b)
-    ROUND(39,b,c,d,e,f,g,h,a)
-
-    ROUND(40,a,b,c,d,e,f,g,h)
-    ROUND(41,h,a,b,c,d,e,f,g)
-    ROUND(42,g,h,a,b,c,d,e,f)
-    ROUND(43,f,g,h,a,b,c,d,e)
-    ROUND(44,e,f,g,h,a,b,c,d)
-    ROUND(45,d,e,f,g,h,a,b,c)
-    ROUND(46,c,d,e,f,g,h,a,b)
-    ROUND(47,b,c,d,e,f,g,h,a)
-
-    ROUND(48,a,b,c,d,e,f,g,h)
-    ROUND(49,h,a,b,c,d,e,f,g)
-    ROUND(50,g,h,a,b,c,d,e,f)
-    ROUND(51,f,g,h,a,b,c,d,e)
-    ROUND(52,e,f,g,h,a,b,c,d)
-    ROUND(53,d,e,f,g,h,a,b,c)
-    ROUND(54,c,d,e,f,g,h,a,b)
-    ROUND(55,b,c,d,e,f,g,h,a)
-
-    ROUND(56,a,b,c,d,e,f,g,h)
-    ROUND(57,h,a,b,c,d,e,f,g)
-    ROUND(58,g,h,a,b,c,d,e,f)
-    ROUND(59,f,g,h,a,b,c,d,e)
-    ROUND(60,e,f,g,h,a,b,c,d)
-    ROUND(61,d,e,f,g,h,a,b,c)
-    ROUND(62,c,d,e,f,g,h,a,b)
-    ROUND(63,b,c,d,e,f,g,h,a)
-#endif
-
-    H[0] += a;
-    H[1] += b;
-    H[2] += c;
-    H[3] += d;
-    H[4] += e;
-    H[5] += f;
-    H[6] += g;
-    H[7] += h;
-  }
-#undef ROUND
-}
-
-#undef s0
-#undef s1
-#undef S0
-#undef S1
-
-void
-SHA256_Update(SHA256Context *ctx, const unsigned char *input,
-		    unsigned int inputLen)
-{
-    unsigned int inBuf = ctx->sizeLo & 0x3f;
-    if (!inputLen)
-    	return;
-
-    /* Add inputLen into the count of bytes processed, before processing */
-    if ((ctx->sizeLo += inputLen) < inputLen)
-    	ctx->sizeHi++;
-
-    /* if data already in buffer, attemp to fill rest of buffer */
-    if (inBuf) {
-    	unsigned int todo = SHA256_BLOCK_LENGTH - inBuf;
-	if (inputLen < todo)
-	    todo = inputLen;
-	memcpy(B + inBuf, input, todo);
-	input    += todo;
-	inputLen -= todo;
-	if (inBuf + todo == SHA256_BLOCK_LENGTH)
-	    SHA256_Compress(ctx);
-    }
-
-    /* if enough data to fill one or more whole buffers, process them. */
-    while (inputLen >= SHA256_BLOCK_LENGTH) {
-    	memcpy(B, input, SHA256_BLOCK_LENGTH);
-	input    += SHA256_BLOCK_LENGTH;
-	inputLen -= SHA256_BLOCK_LENGTH;
-	SHA256_Compress(ctx);
-    }
-    /* if data left over, fill it into buffer */
-    if (inputLen)
-    	memcpy(B, input, inputLen);
-}
-
-void
-SHA256_End(SHA256Context *ctx, unsigned char *digest,
-           unsigned int *digestLen, unsigned int maxDigestLen)
-{
-    unsigned int inBuf = ctx->sizeLo & 0x3f;
-    unsigned int padLen = (inBuf < 56) ? (56 - inBuf) : (56 + 64 - inBuf);
-    PRUint32 hi, lo;
-#ifdef SWAP4MASK
-    PRUint32 t1;
-#endif
-
-    hi = (ctx->sizeHi << 3) | (ctx->sizeLo >> 29);
-    lo = (ctx->sizeLo << 3);
-
-    SHA256_Update(ctx, pad, padLen);
-
-#if defined(IS_LITTLE_ENDIAN)
-    W[14] = SHA_HTONL(hi);
-    W[15] = SHA_HTONL(lo);
-#else
-    W[14] = hi;
-    W[15] = lo;
-#endif
-    SHA256_Compress(ctx);
-
-    /* now output the answer */
-#if defined(IS_LITTLE_ENDIAN)
-    BYTESWAP4(H[0]);
-    BYTESWAP4(H[1]);
-    BYTESWAP4(H[2]);
-    BYTESWAP4(H[3]);
-    BYTESWAP4(H[4]);
-    BYTESWAP4(H[5]);
-    BYTESWAP4(H[6]);
-    BYTESWAP4(H[7]);
-#endif
-    padLen = PR_MIN(SHA256_LENGTH, maxDigestLen);
-    memcpy(digest, H, padLen);
-    if (digestLen)
-	*digestLen = padLen;
-}
-
-void SHA256_Clone(SHA256Context* dest, SHA256Context* src)
-{
-  memcpy(dest, src, sizeof *dest);
-}
-
-/* Comment out unused code, mostly the SHA384 and SHA512 implementations. */
-#if 0
-SECStatus
-SHA256_HashBuf(unsigned char *dest, const unsigned char *src,
-               unsigned int src_length)
-{
-    SHA256Context ctx;
-    unsigned int outLen;
-
-    SHA256_Begin(&ctx);
-    SHA256_Update(&ctx, src, src_length);
-    SHA256_End(&ctx, dest, &outLen, SHA256_LENGTH);
-
-    return SECSuccess;
-}
-
-
-SECStatus
-SHA256_Hash(unsigned char *dest, const char *src)
-{
-    return SHA256_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src));
-}
-
-
-void SHA256_TraceState(SHA256Context *ctx) { }
-
-unsigned int
-SHA256_FlattenSize(SHA256Context *ctx)
-{
-    return sizeof *ctx;
-}
-
-SECStatus
-SHA256_Flatten(SHA256Context *ctx,unsigned char *space)
-{
-    PORT_Memcpy(space, ctx, sizeof *ctx);
-    return SECSuccess;
-}
-
-SHA256Context *
-SHA256_Resurrect(unsigned char *space, void *arg)
-{
-    SHA256Context *ctx = SHA256_NewContext();
-    if (ctx)
-	PORT_Memcpy(ctx, space, sizeof *ctx);
-    return ctx;
-}
-
-/* ======= SHA512 and SHA384 common constants and defines ================= */
-
-/* common #defines for SHA512 and SHA384 */
-#if defined(HAVE_LONG_LONG)
-#define ROTR64(x,n) ((x >> n) | (x << (64 - n)))
-#define ROTL64(x,n) ((x << n) | (x >> (64 - n)))
-
-#define S0(x) (ROTR64(x,28) ^ ROTR64(x,34) ^ ROTR64(x,39))
-#define S1(x) (ROTR64(x,14) ^ ROTR64(x,18) ^ ROTR64(x,41))
-#define s0(x) (t1 = x, ROTR64(t1, 1) ^ ROTR64(t1, 8) ^ SHR(t1,7))
-#define s1(x) (t2 = x, ROTR64(t2,19) ^ ROTR64(t2,61) ^ SHR(t2,6))
-
-#if PR_BYTES_PER_LONG == 8
-#define ULLC(hi,lo) 0x ## hi ## lo ## UL
-#elif defined(_MSC_VER)
-#define ULLC(hi,lo) 0x ## hi ## lo ## ui64
-#else
-#define ULLC(hi,lo) 0x ## hi ## lo ## ULL
-#endif
-
-#define SHA_MASK16 ULLC(0000FFFF,0000FFFF)
-#define SHA_MASK8  ULLC(00FF00FF,00FF00FF)
-#define SHA_HTONLL(x) (t1 = x, \
-  t1 = ((t1 & SHA_MASK8 ) <<  8) | ((t1 >>  8) & SHA_MASK8 ), \
-  t1 = ((t1 & SHA_MASK16) << 16) | ((t1 >> 16) & SHA_MASK16), \
-  (t1 >> 32) | (t1 << 32))
-#define BYTESWAP8(x)  x = SHA_HTONLL(x)
-
-#else /* no long long */
-
-#if defined(IS_LITTLE_ENDIAN)
-#define ULLC(hi,lo) { 0x ## lo ## U, 0x ## hi ## U }
-#else
-#define ULLC(hi,lo) { 0x ## hi ## U, 0x ## lo ## U }
-#endif
-
-#define SHA_HTONLL(x) ( BYTESWAP4(x.lo), BYTESWAP4(x.hi), \
-   x.hi ^= x.lo ^= x.hi ^= x.lo, x)
-#define BYTESWAP8(x)  do { PRUint32 tmp; BYTESWAP4(x.lo); BYTESWAP4(x.hi); \
-   tmp = x.lo; x.lo = x.hi; x.hi = tmp; } while (0)
-#endif
-
-/* SHA-384 and SHA-512 constants, K512. */
-static const PRUint64 K512[80] = {
-#if PR_BYTES_PER_LONG == 8
-     0x428a2f98d728ae22UL ,  0x7137449123ef65cdUL ,
-     0xb5c0fbcfec4d3b2fUL ,  0xe9b5dba58189dbbcUL ,
-     0x3956c25bf348b538UL ,  0x59f111f1b605d019UL ,
-     0x923f82a4af194f9bUL ,  0xab1c5ed5da6d8118UL ,
-     0xd807aa98a3030242UL ,  0x12835b0145706fbeUL ,
-     0x243185be4ee4b28cUL ,  0x550c7dc3d5ffb4e2UL ,
-     0x72be5d74f27b896fUL ,  0x80deb1fe3b1696b1UL ,
-     0x9bdc06a725c71235UL ,  0xc19bf174cf692694UL ,
-     0xe49b69c19ef14ad2UL ,  0xefbe4786384f25e3UL ,
-     0x0fc19dc68b8cd5b5UL ,  0x240ca1cc77ac9c65UL ,
-     0x2de92c6f592b0275UL ,  0x4a7484aa6ea6e483UL ,
-     0x5cb0a9dcbd41fbd4UL ,  0x76f988da831153b5UL ,
-     0x983e5152ee66dfabUL ,  0xa831c66d2db43210UL ,
-     0xb00327c898fb213fUL ,  0xbf597fc7beef0ee4UL ,
-     0xc6e00bf33da88fc2UL ,  0xd5a79147930aa725UL ,
-     0x06ca6351e003826fUL ,  0x142929670a0e6e70UL ,
-     0x27b70a8546d22ffcUL ,  0x2e1b21385c26c926UL ,
-     0x4d2c6dfc5ac42aedUL ,  0x53380d139d95b3dfUL ,
-     0x650a73548baf63deUL ,  0x766a0abb3c77b2a8UL ,
-     0x81c2c92e47edaee6UL ,  0x92722c851482353bUL ,
-     0xa2bfe8a14cf10364UL ,  0xa81a664bbc423001UL ,
-     0xc24b8b70d0f89791UL ,  0xc76c51a30654be30UL ,
-     0xd192e819d6ef5218UL ,  0xd69906245565a910UL ,
-     0xf40e35855771202aUL ,  0x106aa07032bbd1b8UL ,
-     0x19a4c116b8d2d0c8UL ,  0x1e376c085141ab53UL ,
-     0x2748774cdf8eeb99UL ,  0x34b0bcb5e19b48a8UL ,
-     0x391c0cb3c5c95a63UL ,  0x4ed8aa4ae3418acbUL ,
-     0x5b9cca4f7763e373UL ,  0x682e6ff3d6b2b8a3UL ,
-     0x748f82ee5defb2fcUL ,  0x78a5636f43172f60UL ,
-     0x84c87814a1f0ab72UL ,  0x8cc702081a6439ecUL ,
-     0x90befffa23631e28UL ,  0xa4506cebde82bde9UL ,
-     0xbef9a3f7b2c67915UL ,  0xc67178f2e372532bUL ,
-     0xca273eceea26619cUL ,  0xd186b8c721c0c207UL ,
-     0xeada7dd6cde0eb1eUL ,  0xf57d4f7fee6ed178UL ,
-     0x06f067aa72176fbaUL ,  0x0a637dc5a2c898a6UL ,
-     0x113f9804bef90daeUL ,  0x1b710b35131c471bUL ,
-     0x28db77f523047d84UL ,  0x32caab7b40c72493UL ,
-     0x3c9ebe0a15c9bebcUL ,  0x431d67c49c100d4cUL ,
-     0x4cc5d4becb3e42b6UL ,  0x597f299cfc657e2aUL ,
-     0x5fcb6fab3ad6faecUL ,  0x6c44198c4a475817UL
-#else
-    ULLC(428a2f98,d728ae22), ULLC(71374491,23ef65cd),
-    ULLC(b5c0fbcf,ec4d3b2f), ULLC(e9b5dba5,8189dbbc),
-    ULLC(3956c25b,f348b538), ULLC(59f111f1,b605d019),
-    ULLC(923f82a4,af194f9b), ULLC(ab1c5ed5,da6d8118),
-    ULLC(d807aa98,a3030242), ULLC(12835b01,45706fbe),
-    ULLC(243185be,4ee4b28c), ULLC(550c7dc3,d5ffb4e2),
-    ULLC(72be5d74,f27b896f), ULLC(80deb1fe,3b1696b1),
-    ULLC(9bdc06a7,25c71235), ULLC(c19bf174,cf692694),
-    ULLC(e49b69c1,9ef14ad2), ULLC(efbe4786,384f25e3),
-    ULLC(0fc19dc6,8b8cd5b5), ULLC(240ca1cc,77ac9c65),
-    ULLC(2de92c6f,592b0275), ULLC(4a7484aa,6ea6e483),
-    ULLC(5cb0a9dc,bd41fbd4), ULLC(76f988da,831153b5),
-    ULLC(983e5152,ee66dfab), ULLC(a831c66d,2db43210),
-    ULLC(b00327c8,98fb213f), ULLC(bf597fc7,beef0ee4),
-    ULLC(c6e00bf3,3da88fc2), ULLC(d5a79147,930aa725),
-    ULLC(06ca6351,e003826f), ULLC(14292967,0a0e6e70),
-    ULLC(27b70a85,46d22ffc), ULLC(2e1b2138,5c26c926),
-    ULLC(4d2c6dfc,5ac42aed), ULLC(53380d13,9d95b3df),
-    ULLC(650a7354,8baf63de), ULLC(766a0abb,3c77b2a8),
-    ULLC(81c2c92e,47edaee6), ULLC(92722c85,1482353b),
-    ULLC(a2bfe8a1,4cf10364), ULLC(a81a664b,bc423001),
-    ULLC(c24b8b70,d0f89791), ULLC(c76c51a3,0654be30),
-    ULLC(d192e819,d6ef5218), ULLC(d6990624,5565a910),
-    ULLC(f40e3585,5771202a), ULLC(106aa070,32bbd1b8),
-    ULLC(19a4c116,b8d2d0c8), ULLC(1e376c08,5141ab53),
-    ULLC(2748774c,df8eeb99), ULLC(34b0bcb5,e19b48a8),
-    ULLC(391c0cb3,c5c95a63), ULLC(4ed8aa4a,e3418acb),
-    ULLC(5b9cca4f,7763e373), ULLC(682e6ff3,d6b2b8a3),
-    ULLC(748f82ee,5defb2fc), ULLC(78a5636f,43172f60),
-    ULLC(84c87814,a1f0ab72), ULLC(8cc70208,1a6439ec),
-    ULLC(90befffa,23631e28), ULLC(a4506ceb,de82bde9),
-    ULLC(bef9a3f7,b2c67915), ULLC(c67178f2,e372532b),
-    ULLC(ca273ece,ea26619c), ULLC(d186b8c7,21c0c207),
-    ULLC(eada7dd6,cde0eb1e), ULLC(f57d4f7f,ee6ed178),
-    ULLC(06f067aa,72176fba), ULLC(0a637dc5,a2c898a6),
-    ULLC(113f9804,bef90dae), ULLC(1b710b35,131c471b),
-    ULLC(28db77f5,23047d84), ULLC(32caab7b,40c72493),
-    ULLC(3c9ebe0a,15c9bebc), ULLC(431d67c4,9c100d4c),
-    ULLC(4cc5d4be,cb3e42b6), ULLC(597f299c,fc657e2a),
-    ULLC(5fcb6fab,3ad6faec), ULLC(6c44198c,4a475817)
-#endif
-};
-
-struct SHA512ContextStr {
-    union {
-	PRUint64 w[80];	    /* message schedule, input buffer, plus 64 words */
-	PRUint32 l[160];
-	PRUint8  b[640];
-    } u;
-    PRUint64 h[8];	    /* 8 state variables */
-    PRUint64 sizeLo;	    /* 64-bit count of hashed bytes. */
-};
-
-/* =========== SHA512 implementation ===================================== */
-
-/* SHA-512 initial hash values */
-static const PRUint64 H512[8] = {
-#if PR_BYTES_PER_LONG == 8
-     0x6a09e667f3bcc908UL ,  0xbb67ae8584caa73bUL ,
-     0x3c6ef372fe94f82bUL ,  0xa54ff53a5f1d36f1UL ,
-     0x510e527fade682d1UL ,  0x9b05688c2b3e6c1fUL ,
-     0x1f83d9abfb41bd6bUL ,  0x5be0cd19137e2179UL
-#else
-    ULLC(6a09e667,f3bcc908), ULLC(bb67ae85,84caa73b),
-    ULLC(3c6ef372,fe94f82b), ULLC(a54ff53a,5f1d36f1),
-    ULLC(510e527f,ade682d1), ULLC(9b05688c,2b3e6c1f),
-    ULLC(1f83d9ab,fb41bd6b), ULLC(5be0cd19,137e2179)
-#endif
-};
-
-
-SHA512Context *
-SHA512_NewContext(void)
-{
-    SHA512Context *ctx = PORT_New(SHA512Context);
-    return ctx;
-}
-
-void
-SHA512_DestroyContext(SHA512Context *ctx, PRBool freeit)
-{
-    if (freeit) {
-        PORT_ZFree(ctx, sizeof *ctx);
-    }
-}
-
-void
-SHA512_Begin(SHA512Context *ctx)
-{
-    memset(ctx, 0, sizeof *ctx);
-    memcpy(H, H512, sizeof H512);
-}
-
-#if defined(SHA512_TRACE)
-#if defined(HAVE_LONG_LONG)
-#define DUMP(n,a,d,e,h) printf(" t = %2d, %s = %016lx, %s = %016lx\n", \
-			       n, #e, d, #a, h);
-#else
-#define DUMP(n,a,d,e,h) printf(" t = %2d, %s = %08x%08x, %s = %08x%08x\n", \
-			       n, #e, d.hi, d.lo, #a, h.hi, h.lo);
-#endif
-#else
-#define DUMP(n,a,d,e,h)
-#endif
-
-#if defined(HAVE_LONG_LONG)
-
-#define ADDTO(x,y) y += x
-
-#define INITW(t) W[t] = (s1(W[t-2]) + W[t-7] + s0(W[t-15]) + W[t-16])
-
-#define ROUND(n,a,b,c,d,e,f,g,h) \
-    h += S1(e) + Ch(e,f,g) + K512[n] + W[n]; \
-    d += h; \
-    h += S0(a) + Maj(a,b,c); \
-    DUMP(n,a,d,e,h)
-
-#else /* use only 32-bit variables, and don't unroll loops */
-
-#undef  NOUNROLL512
-#define NOUNROLL512 1
-
-#define ADDTO(x,y) y.lo += x.lo; y.hi += x.hi + (x.lo > y.lo)
-
-#define ROTR64a(x,n,lo,hi) (x.lo >> n | x.hi << (32-n))
-#define ROTR64A(x,n,lo,hi) (x.lo << (64-n) | x.hi >> (n-32))
-#define  SHR64a(x,n,lo,hi) (x.lo >> n | x.hi << (32-n))
-
-/* Capitol Sigma and lower case sigma functions */
-#define s0lo(x) (ROTR64a(x,1,lo,hi) ^ ROTR64a(x,8,lo,hi) ^ SHR64a(x,7,lo,hi))
-#define s0hi(x) (ROTR64a(x,1,hi,lo) ^ ROTR64a(x,8,hi,lo) ^ (x.hi >> 7))
-
-#define s1lo(x) (ROTR64a(x,19,lo,hi) ^ ROTR64A(x,61,lo,hi) ^ SHR64a(x,6,lo,hi))
-#define s1hi(x) (ROTR64a(x,19,hi,lo) ^ ROTR64A(x,61,hi,lo) ^ (x.hi >> 6))
-
-#define S0lo(x)(ROTR64a(x,28,lo,hi) ^ ROTR64A(x,34,lo,hi) ^ ROTR64A(x,39,lo,hi))
-#define S0hi(x)(ROTR64a(x,28,hi,lo) ^ ROTR64A(x,34,hi,lo) ^ ROTR64A(x,39,hi,lo))
-
-#define S1lo(x)(ROTR64a(x,14,lo,hi) ^ ROTR64a(x,18,lo,hi) ^ ROTR64A(x,41,lo,hi))
-#define S1hi(x)(ROTR64a(x,14,hi,lo) ^ ROTR64a(x,18,hi,lo) ^ ROTR64A(x,41,hi,lo))
-
-/* 32-bit versions of Ch and Maj */
-#define Chxx(x,y,z,lo) ((x.lo & y.lo) ^ (~x.lo & z.lo))
-#define Majx(x,y,z,lo) ((x.lo & y.lo) ^ (x.lo & z.lo) ^ (y.lo & z.lo))
-
-#define INITW(t) \
-    do { \
-	PRUint32 lo, tm; \
-	PRUint32 cy = 0; \
-	lo = s1lo(W[t-2]); \
-	lo += (tm = W[t-7].lo);     if (lo < tm) cy++; \
-	lo += (tm = s0lo(W[t-15])); if (lo < tm) cy++; \
-	lo += (tm = W[t-16].lo);    if (lo < tm) cy++; \
-	W[t].lo = lo; \
-	W[t].hi = cy + s1hi(W[t-2]) + W[t-7].hi + s0hi(W[t-15]) + W[t-16].hi; \
-    } while (0)
-
-#define ROUND(n,a,b,c,d,e,f,g,h) \
-    { \
-	PRUint32 lo, tm, cy; \
-	lo  = S1lo(e); \
-	lo += (tm = Chxx(e,f,g,lo));    cy = (lo < tm); \
-	lo += (tm = K512[n].lo);	if (lo < tm) cy++; \
-	lo += (tm =    W[n].lo);	if (lo < tm) cy++; \
-	h.lo += lo;			if (h.lo < lo) cy++; \
-	h.hi += cy + S1hi(e) + Chxx(e,f,g,hi) + K512[n].hi + W[n].hi; \
-	d.lo += h.lo; \
-	d.hi += h.hi + (d.lo < h.lo); \
-	lo  = S0lo(a);  \
-	lo += (tm = Majx(a,b,c,lo));	cy = (lo < tm); \
-	h.lo += lo;			if (h.lo < lo) cy++; \
-	h.hi += cy + S0hi(a) + Majx(a,b,c,hi); \
-	DUMP(n,a,d,e,h) \
-    }
-#endif
-
-static void
-SHA512_Compress(SHA512Context *ctx)
-{
-#if defined(IS_LITTLE_ENDIAN)
-  {
-#if defined(HAVE_LONG_LONG)
-    PRUint64 t1;
-#else
-    PRUint32 t1;
-#endif
-    BYTESWAP8(W[0]);
-    BYTESWAP8(W[1]);
-    BYTESWAP8(W[2]);
-    BYTESWAP8(W[3]);
-    BYTESWAP8(W[4]);
-    BYTESWAP8(W[5]);
-    BYTESWAP8(W[6]);
-    BYTESWAP8(W[7]);
-    BYTESWAP8(W[8]);
-    BYTESWAP8(W[9]);
-    BYTESWAP8(W[10]);
-    BYTESWAP8(W[11]);
-    BYTESWAP8(W[12]);
-    BYTESWAP8(W[13]);
-    BYTESWAP8(W[14]);
-    BYTESWAP8(W[15]);
-  }
-#endif
-
-  {
-    PRUint64 t1, t2;
-#ifdef NOUNROLL512
-    {
-	/* prepare the "message schedule"   */
-	int t;
-	for (t = 16; t < 80; ++t) {
-	    INITW(t);
-	}
-    }
-#else
-    INITW(16);
-    INITW(17);
-    INITW(18);
-    INITW(19);
-
-    INITW(20);
-    INITW(21);
-    INITW(22);
-    INITW(23);
-    INITW(24);
-    INITW(25);
-    INITW(26);
-    INITW(27);
-    INITW(28);
-    INITW(29);
-
-    INITW(30);
-    INITW(31);
-    INITW(32);
-    INITW(33);
-    INITW(34);
-    INITW(35);
-    INITW(36);
-    INITW(37);
-    INITW(38);
-    INITW(39);
-
-    INITW(40);
-    INITW(41);
-    INITW(42);
-    INITW(43);
-    INITW(44);
-    INITW(45);
-    INITW(46);
-    INITW(47);
-    INITW(48);
-    INITW(49);
-
-    INITW(50);
-    INITW(51);
-    INITW(52);
-    INITW(53);
-    INITW(54);
-    INITW(55);
-    INITW(56);
-    INITW(57);
-    INITW(58);
-    INITW(59);
-
-    INITW(60);
-    INITW(61);
-    INITW(62);
-    INITW(63);
-    INITW(64);
-    INITW(65);
-    INITW(66);
-    INITW(67);
-    INITW(68);
-    INITW(69);
-
-    INITW(70);
-    INITW(71);
-    INITW(72);
-    INITW(73);
-    INITW(74);
-    INITW(75);
-    INITW(76);
-    INITW(77);
-    INITW(78);
-    INITW(79);
-#endif
-  }
-#ifdef SHA512_TRACE
-  {
-    int i;
-    for (i = 0; i < 80; ++i) {
-#ifdef HAVE_LONG_LONG
-	printf("W[%2d] = %016lx\n", i, W[i]);
-#else
-	printf("W[%2d] = %08x%08x\n", i, W[i].hi, W[i].lo);
-#endif
-    }
-  }
-#endif
-  {
-    PRUint64 a, b, c, d, e, f, g, h;
-
-    a = H[0];
-    b = H[1];
-    c = H[2];
-    d = H[3];
-    e = H[4];
-    f = H[5];
-    g = H[6];
-    h = H[7];
-
-#ifdef NOUNROLL512
-    {
-	int t;
-	for (t = 0; t < 80; t+= 8) {
-	    ROUND(t+0,a,b,c,d,e,f,g,h)
-	    ROUND(t+1,h,a,b,c,d,e,f,g)
-	    ROUND(t+2,g,h,a,b,c,d,e,f)
-	    ROUND(t+3,f,g,h,a,b,c,d,e)
-	    ROUND(t+4,e,f,g,h,a,b,c,d)
-	    ROUND(t+5,d,e,f,g,h,a,b,c)
-	    ROUND(t+6,c,d,e,f,g,h,a,b)
-	    ROUND(t+7,b,c,d,e,f,g,h,a)
-	}
-    }
-#else
-    ROUND( 0,a,b,c,d,e,f,g,h)
-    ROUND( 1,h,a,b,c,d,e,f,g)
-    ROUND( 2,g,h,a,b,c,d,e,f)
-    ROUND( 3,f,g,h,a,b,c,d,e)
-    ROUND( 4,e,f,g,h,a,b,c,d)
-    ROUND( 5,d,e,f,g,h,a,b,c)
-    ROUND( 6,c,d,e,f,g,h,a,b)
-    ROUND( 7,b,c,d,e,f,g,h,a)
-
-    ROUND( 8,a,b,c,d,e,f,g,h)
-    ROUND( 9,h,a,b,c,d,e,f,g)
-    ROUND(10,g,h,a,b,c,d,e,f)
-    ROUND(11,f,g,h,a,b,c,d,e)
-    ROUND(12,e,f,g,h,a,b,c,d)
-    ROUND(13,d,e,f,g,h,a,b,c)
-    ROUND(14,c,d,e,f,g,h,a,b)
-    ROUND(15,b,c,d,e,f,g,h,a)
-
-    ROUND(16,a,b,c,d,e,f,g,h)
-    ROUND(17,h,a,b,c,d,e,f,g)
-    ROUND(18,g,h,a,b,c,d,e,f)
-    ROUND(19,f,g,h,a,b,c,d,e)
-    ROUND(20,e,f,g,h,a,b,c,d)
-    ROUND(21,d,e,f,g,h,a,b,c)
-    ROUND(22,c,d,e,f,g,h,a,b)
-    ROUND(23,b,c,d,e,f,g,h,a)
-
-    ROUND(24,a,b,c,d,e,f,g,h)
-    ROUND(25,h,a,b,c,d,e,f,g)
-    ROUND(26,g,h,a,b,c,d,e,f)
-    ROUND(27,f,g,h,a,b,c,d,e)
-    ROUND(28,e,f,g,h,a,b,c,d)
-    ROUND(29,d,e,f,g,h,a,b,c)
-    ROUND(30,c,d,e,f,g,h,a,b)
-    ROUND(31,b,c,d,e,f,g,h,a)
-
-    ROUND(32,a,b,c,d,e,f,g,h)
-    ROUND(33,h,a,b,c,d,e,f,g)
-    ROUND(34,g,h,a,b,c,d,e,f)
-    ROUND(35,f,g,h,a,b,c,d,e)
-    ROUND(36,e,f,g,h,a,b,c,d)
-    ROUND(37,d,e,f,g,h,a,b,c)
-    ROUND(38,c,d,e,f,g,h,a,b)
-    ROUND(39,b,c,d,e,f,g,h,a)
-
-    ROUND(40,a,b,c,d,e,f,g,h)
-    ROUND(41,h,a,b,c,d,e,f,g)
-    ROUND(42,g,h,a,b,c,d,e,f)
-    ROUND(43,f,g,h,a,b,c,d,e)
-    ROUND(44,e,f,g,h,a,b,c,d)
-    ROUND(45,d,e,f,g,h,a,b,c)
-    ROUND(46,c,d,e,f,g,h,a,b)
-    ROUND(47,b,c,d,e,f,g,h,a)
-
-    ROUND(48,a,b,c,d,e,f,g,h)
-    ROUND(49,h,a,b,c,d,e,f,g)
-    ROUND(50,g,h,a,b,c,d,e,f)
-    ROUND(51,f,g,h,a,b,c,d,e)
-    ROUND(52,e,f,g,h,a,b,c,d)
-    ROUND(53,d,e,f,g,h,a,b,c)
-    ROUND(54,c,d,e,f,g,h,a,b)
-    ROUND(55,b,c,d,e,f,g,h,a)
-
-    ROUND(56,a,b,c,d,e,f,g,h)
-    ROUND(57,h,a,b,c,d,e,f,g)
-    ROUND(58,g,h,a,b,c,d,e,f)
-    ROUND(59,f,g,h,a,b,c,d,e)
-    ROUND(60,e,f,g,h,a,b,c,d)
-    ROUND(61,d,e,f,g,h,a,b,c)
-    ROUND(62,c,d,e,f,g,h,a,b)
-    ROUND(63,b,c,d,e,f,g,h,a)
-
-    ROUND(64,a,b,c,d,e,f,g,h)
-    ROUND(65,h,a,b,c,d,e,f,g)
-    ROUND(66,g,h,a,b,c,d,e,f)
-    ROUND(67,f,g,h,a,b,c,d,e)
-    ROUND(68,e,f,g,h,a,b,c,d)
-    ROUND(69,d,e,f,g,h,a,b,c)
-    ROUND(70,c,d,e,f,g,h,a,b)
-    ROUND(71,b,c,d,e,f,g,h,a)
-
-    ROUND(72,a,b,c,d,e,f,g,h)
-    ROUND(73,h,a,b,c,d,e,f,g)
-    ROUND(74,g,h,a,b,c,d,e,f)
-    ROUND(75,f,g,h,a,b,c,d,e)
-    ROUND(76,e,f,g,h,a,b,c,d)
-    ROUND(77,d,e,f,g,h,a,b,c)
-    ROUND(78,c,d,e,f,g,h,a,b)
-    ROUND(79,b,c,d,e,f,g,h,a)
-#endif
-
-    ADDTO(a,H[0]);
-    ADDTO(b,H[1]);
-    ADDTO(c,H[2]);
-    ADDTO(d,H[3]);
-    ADDTO(e,H[4]);
-    ADDTO(f,H[5]);
-    ADDTO(g,H[6]);
-    ADDTO(h,H[7]);
-  }
-}
-
-void
-SHA512_Update(SHA512Context *ctx, const unsigned char *input,
-              unsigned int inputLen)
-{
-    unsigned int inBuf;
-    if (!inputLen)
-    	return;
-
-#if defined(HAVE_LONG_LONG)
-    inBuf = (unsigned int)ctx->sizeLo & 0x7f;
-    /* Add inputLen into the count of bytes processed, before processing */
-    ctx->sizeLo += inputLen;
-#else
-    inBuf = (unsigned int)ctx->sizeLo.lo & 0x7f;
-    ctx->sizeLo.lo += inputLen;
-    if (ctx->sizeLo.lo < inputLen) ctx->sizeLo.hi++;
-#endif
-
-    /* if data already in buffer, attemp to fill rest of buffer */
-    if (inBuf) {
-    	unsigned int todo = SHA512_BLOCK_LENGTH - inBuf;
-	if (inputLen < todo)
-	    todo = inputLen;
-	memcpy(B + inBuf, input, todo);
-	input    += todo;
-	inputLen -= todo;
-	if (inBuf + todo == SHA512_BLOCK_LENGTH)
-	    SHA512_Compress(ctx);
-    }
-
-    /* if enough data to fill one or more whole buffers, process them. */
-    while (inputLen >= SHA512_BLOCK_LENGTH) {
-    	memcpy(B, input, SHA512_BLOCK_LENGTH);
-	input    += SHA512_BLOCK_LENGTH;
-	inputLen -= SHA512_BLOCK_LENGTH;
-	SHA512_Compress(ctx);
-    }
-    /* if data left over, fill it into buffer */
-    if (inputLen)
-    	memcpy(B, input, inputLen);
-}
-
-void
-SHA512_End(SHA512Context *ctx, unsigned char *digest,
-           unsigned int *digestLen, unsigned int maxDigestLen)
-{
-#if defined(HAVE_LONG_LONG)
-    unsigned int inBuf  = (unsigned int)ctx->sizeLo & 0x7f;
-    unsigned int padLen = (inBuf < 112) ? (112 - inBuf) : (112 + 128 - inBuf);
-    PRUint64 lo, t1;
-    lo = (ctx->sizeLo << 3);
-#else
-    unsigned int inBuf  = (unsigned int)ctx->sizeLo.lo & 0x7f;
-    unsigned int padLen = (inBuf < 112) ? (112 - inBuf) : (112 + 128 - inBuf);
-    PRUint64 lo = ctx->sizeLo;
-    PRUint32 t1;
-    lo.lo <<= 3;
-#endif
-
-    SHA512_Update(ctx, pad, padLen);
-
-#if defined(HAVE_LONG_LONG)
-    W[14] = 0;
-#else
-    W[14].lo = 0;
-    W[14].hi = 0;
-#endif
-
-    W[15] = lo;
-#if defined(IS_LITTLE_ENDIAN)
-    BYTESWAP8(W[15]);
-#endif
-    SHA512_Compress(ctx);
-
-    /* now output the answer */
-#if defined(IS_LITTLE_ENDIAN)
-    BYTESWAP8(H[0]);
-    BYTESWAP8(H[1]);
-    BYTESWAP8(H[2]);
-    BYTESWAP8(H[3]);
-    BYTESWAP8(H[4]);
-    BYTESWAP8(H[5]);
-    BYTESWAP8(H[6]);
-    BYTESWAP8(H[7]);
-#endif
-    padLen = PR_MIN(SHA512_LENGTH, maxDigestLen);
-    memcpy(digest, H, padLen);
-    if (digestLen)
-	*digestLen = padLen;
-}
-
-SECStatus
-SHA512_HashBuf(unsigned char *dest, const unsigned char *src,
-               unsigned int src_length)
-{
-    SHA512Context ctx;
-    unsigned int outLen;
-
-    SHA512_Begin(&ctx);
-    SHA512_Update(&ctx, src, src_length);
-    SHA512_End(&ctx, dest, &outLen, SHA512_LENGTH);
-
-    return SECSuccess;
-}
-
-
-SECStatus
-SHA512_Hash(unsigned char *dest, const char *src)
-{
-    return SHA512_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src));
-}
-
-
-void SHA512_TraceState(SHA512Context *ctx) { }
-
-unsigned int
-SHA512_FlattenSize(SHA512Context *ctx)
-{
-    return sizeof *ctx;
-}
-
-SECStatus
-SHA512_Flatten(SHA512Context *ctx,unsigned char *space)
-{
-    PORT_Memcpy(space, ctx, sizeof *ctx);
-    return SECSuccess;
-}
-
-SHA512Context *
-SHA512_Resurrect(unsigned char *space, void *arg)
-{
-    SHA512Context *ctx = SHA512_NewContext();
-    if (ctx)
-	PORT_Memcpy(ctx, space, sizeof *ctx);
-    return ctx;
-}
-
-void SHA512_Clone(SHA512Context *dest, SHA512Context *src)
-{
-    memcpy(dest, src, sizeof *dest);
-}
-
-/* ======================================================================= */
-/* SHA384 uses a SHA512Context as the real context.
-** The only differences between SHA384 an SHA512 are:
-** a) the intialization values for the context, and
-** b) the number of bytes of data produced as output.
-*/
-
-/* SHA-384 initial hash values */
-static const PRUint64 H384[8] = {
-#if PR_BYTES_PER_LONG == 8
-     0xcbbb9d5dc1059ed8UL ,  0x629a292a367cd507UL ,
-     0x9159015a3070dd17UL ,  0x152fecd8f70e5939UL ,
-     0x67332667ffc00b31UL ,  0x8eb44a8768581511UL ,
-     0xdb0c2e0d64f98fa7UL ,  0x47b5481dbefa4fa4UL
-#else
-    ULLC(cbbb9d5d,c1059ed8), ULLC(629a292a,367cd507),
-    ULLC(9159015a,3070dd17), ULLC(152fecd8,f70e5939),
-    ULLC(67332667,ffc00b31), ULLC(8eb44a87,68581511),
-    ULLC(db0c2e0d,64f98fa7), ULLC(47b5481d,befa4fa4)
-#endif
-};
-
-SHA384Context *
-SHA384_NewContext(void)
-{
-    return SHA512_NewContext();
-}
-
-void
-SHA384_DestroyContext(SHA384Context *ctx, PRBool freeit)
-{
-    SHA512_DestroyContext(ctx, freeit);
-}
-
-void
-SHA384_Begin(SHA384Context *ctx)
-{
-    memset(ctx, 0, sizeof *ctx);
-    memcpy(H, H384, sizeof H384);
-}
-
-void
-SHA384_Update(SHA384Context *ctx, const unsigned char *input,
-		    unsigned int inputLen)
-{
-    SHA512_Update(ctx, input, inputLen);
-}
-
-void
-SHA384_End(SHA384Context *ctx, unsigned char *digest,
-		 unsigned int *digestLen, unsigned int maxDigestLen)
-{
-#define SHA_MIN(a,b) (a < b ? a : b)
-    unsigned int maxLen = SHA_MIN(maxDigestLen, SHA384_LENGTH);
-    SHA512_End(ctx, digest, digestLen, maxLen);
-}
-
-SECStatus
-SHA384_HashBuf(unsigned char *dest, const unsigned char *src,
-			  unsigned int src_length)
-{
-    SHA512Context ctx;
-    unsigned int outLen;
-
-    SHA384_Begin(&ctx);
-    SHA512_Update(&ctx, src, src_length);
-    SHA512_End(&ctx, dest, &outLen, SHA384_LENGTH);
-
-    return SECSuccess;
-}
-
-SECStatus
-SHA384_Hash(unsigned char *dest, const char *src)
-{
-    return SHA384_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src));
-}
-
-void SHA384_TraceState(SHA384Context *ctx) { }
-
-unsigned int
-SHA384_FlattenSize(SHA384Context *ctx)
-{
-    return sizeof(SHA384Context);
-}
-
-SECStatus
-SHA384_Flatten(SHA384Context *ctx,unsigned char *space)
-{
-    return SHA512_Flatten(ctx, space);
-}
-
-SHA384Context *
-SHA384_Resurrect(unsigned char *space, void *arg)
-{
-    return SHA512_Resurrect(space, arg);
-}
-
-void SHA384_Clone(SHA384Context *dest, SHA384Context *src)
-{
-    memcpy(dest, src, sizeof *dest);
-}
-#endif  /* Comment out unused code. */
-
-/* ======================================================================= */
-#ifdef SELFTEST
-#include <stdio.h>
-
-static const char abc[] = { "abc" };
-static const char abcdbc[] = {
-    "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
-};
-static const char abcdef[] = {
-    "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
-    "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"
-};
-
-void
-dumpHash32(const unsigned char *buf, unsigned int bufLen)
-{
-    unsigned int i;
-    for (i = 0; i < bufLen; i += 4) {
-	printf(" %02x%02x%02x%02x", buf[i], buf[i+1], buf[i+2], buf[i+3]);
-    }
-    printf("\n");
-}
-
-void test256(void)
-{
-    unsigned char outBuf[SHA256_LENGTH];
-
-    printf("SHA256, input = %s\n", abc);
-    SHA256_Hash(outBuf, abc);
-    dumpHash32(outBuf, sizeof outBuf);
-
-    printf("SHA256, input = %s\n", abcdbc);
-    SHA256_Hash(outBuf, abcdbc);
-    dumpHash32(outBuf, sizeof outBuf);
-}
-
-void
-dumpHash64(const unsigned char *buf, unsigned int bufLen)
-{
-    unsigned int i;
-    for (i = 0; i < bufLen; i += 8) {
-    	if (i % 32 == 0)
-	    printf("\n");
-	printf(" %02x%02x%02x%02x%02x%02x%02x%02x",
-	       buf[i  ], buf[i+1], buf[i+2], buf[i+3],
-	       buf[i+4], buf[i+5], buf[i+6], buf[i+7]);
-    }
-    printf("\n");
-}
-
-void test512(void)
-{
-    unsigned char outBuf[SHA512_LENGTH];
-
-    printf("SHA512, input = %s\n", abc);
-    SHA512_Hash(outBuf, abc);
-    dumpHash64(outBuf, sizeof outBuf);
-
-    printf("SHA512, input = %s\n", abcdef);
-    SHA512_Hash(outBuf, abcdef);
-    dumpHash64(outBuf, sizeof outBuf);
-}
-
-void time512(void)
-{
-    unsigned char outBuf[SHA512_LENGTH];
-
-    SHA512_Hash(outBuf, abc);
-    SHA512_Hash(outBuf, abcdef);
-}
-
-void test384(void)
-{
-    unsigned char outBuf[SHA384_LENGTH];
-
-    printf("SHA384, input = %s\n", abc);
-    SHA384_Hash(outBuf, abc);
-    dumpHash64(outBuf, sizeof outBuf);
-
-    printf("SHA384, input = %s\n", abcdef);
-    SHA384_Hash(outBuf, abcdef);
-    dumpHash64(outBuf, sizeof outBuf);
-}
-
-int main (int argc, char *argv[], char *envp[])
-{
-    int i = 1;
-    if (argc > 1) {
-    	i = atoi(argv[1]);
-    }
-    if (i < 2) {
-	test256();
-	test512();
-	test384();
-    } else {
-    	while (i-- > 0) {
-	    time512();
-	}
-	printf("done\n");
-    }
-    return 0;
-}
-
-#endif
diff --git a/device/BUILD.gn b/device/BUILD.gn
index 1f688037..7427527 100644
--- a/device/BUILD.gn
+++ b/device/BUILD.gn
@@ -27,6 +27,8 @@
     "bluetooth/bluetooth_device_unittest.cc",
     "bluetooth/bluetooth_device_win_unittest.cc",
     "bluetooth/bluetooth_discovery_filter_unittest.cc",
+    "bluetooth/bluetooth_local_gatt_characteristic_unittest.cc",
+    "bluetooth/bluetooth_local_gatt_descriptor_unittest.cc",
     "bluetooth/bluetooth_low_energy_win_unittest.cc",
     "bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc",
     "bluetooth/bluetooth_remote_gatt_descriptor_unittest.cc",
@@ -34,6 +36,8 @@
     "bluetooth/bluetooth_service_record_win_unittest.cc",
     "bluetooth/bluetooth_task_manager_win_unittest.cc",
     "bluetooth/bluetooth_uuid_unittest.cc",
+    "bluetooth/test/bluetooth_gatt_server_test.cc",
+    "bluetooth/test/bluetooth_gatt_server_test.h",
     "bluetooth/test/bluetooth_test.cc",
     "bluetooth/test/bluetooth_test.h",
     "bluetooth/test/bluetooth_test_android.cc",
@@ -48,6 +52,8 @@
     "bluetooth/test/mock_bluetooth_central_manager_mac.mm",
     "bluetooth/test/test_bluetooth_adapter_observer.cc",
     "bluetooth/test/test_bluetooth_adapter_observer.h",
+    "bluetooth/test/test_bluetooth_local_gatt_service_delegate.cc",
+    "bluetooth/test/test_bluetooth_local_gatt_service_delegate.h",
     "nfc/nfc_chromeos_unittest.cc",
     "nfc/nfc_ndef_record_unittest.cc",
     "test/run_all_unittests.cc",
diff --git a/device/bluetooth/bluetooth_adapter.h b/device/bluetooth/bluetooth_adapter.h
index c8b33fe..a6df9c8 100644
--- a/device/bluetooth/bluetooth_adapter.h
+++ b/device/bluetooth/bluetooth_adapter.h
@@ -23,6 +23,7 @@
 #include "device/bluetooth/bluetooth_audio_sink.h"
 #include "device/bluetooth/bluetooth_device.h"
 #include "device/bluetooth/bluetooth_export.h"
+#include "device/bluetooth/bluetooth_local_gatt_service.h"
 
 namespace device {
 
@@ -206,27 +207,27 @@
 
   // The ErrorCallback is used for methods that can fail in which case it is
   // called, in the success case the callback is simply not called.
-  typedef base::Closure ErrorCallback;
+  using ErrorCallback = base::Closure;
 
   // The InitCallback is used to trigger a callback after asynchronous
   // initialization, if initialization is asynchronous on the platform.
-  typedef base::Callback<void()> InitCallback;
+  using InitCallback = base::Callback<void()>;
 
-  typedef base::Callback<void(std::unique_ptr<BluetoothDiscoverySession>)>
-      DiscoverySessionCallback;
-  typedef std::vector<BluetoothDevice*> DeviceList;
-  typedef std::vector<const BluetoothDevice*> ConstDeviceList;
-  typedef std::vector<BluetoothUUID> UUIDList;
-  typedef base::Callback<void(scoped_refptr<BluetoothSocket>)>
-      CreateServiceCallback;
-  typedef base::Callback<void(const std::string& message)>
-      CreateServiceErrorCallback;
-  typedef base::Callback<void(scoped_refptr<BluetoothAudioSink>)>
-      AcquiredCallback;
-  typedef base::Callback<void(scoped_refptr<BluetoothAdvertisement>)>
-      CreateAdvertisementCallback;
-  typedef base::Callback<void(BluetoothAdvertisement::ErrorCode)>
-      CreateAdvertisementErrorCallback;
+  using DiscoverySessionCallback =
+      base::Callback<void(std::unique_ptr<BluetoothDiscoverySession>)>;
+  using DeviceList = std::vector<BluetoothDevice*>;
+  using ConstDeviceList = std::vector<const BluetoothDevice*>;
+  using UUIDList = std::vector<BluetoothUUID>;
+  using CreateServiceCallback =
+      base::Callback<void(scoped_refptr<BluetoothSocket>)>;
+  using CreateServiceErrorCallback =
+      base::Callback<void(const std::string& message)>;
+  using AcquiredCallback =
+      base::Callback<void(scoped_refptr<BluetoothAudioSink>)>;
+  using CreateAdvertisementCallback =
+      base::Callback<void(scoped_refptr<BluetoothAdvertisement>)>;
+  using CreateAdvertisementErrorCallback =
+      base::Callback<void(BluetoothAdvertisement::ErrorCode)>;
 
   // Returns a weak pointer to a new adapter.  For platforms with asynchronous
   // initialization, the returned adapter will run the |init_callback| once
@@ -412,7 +413,9 @@
       const BluetoothAudioSink::ErrorCallback& error_callback) = 0;
 
   // Creates and registers an advertisement for broadcast over the LE channel.
-  // The created advertisement will be returned via the success callback.
+  // The created advertisement will be returned via the success callback. An
+  // advertisement can unregister itself at any time by calling its unregister
+  // function.
   virtual void RegisterAdvertisement(
       std::unique_ptr<BluetoothAdvertisement::Data> advertisement_data,
       const CreateAdvertisementCallback& callback,
diff --git a/device/bluetooth/bluetooth_adapter_unittest.cc b/device/bluetooth/bluetooth_adapter_unittest.cc
index 27a18fb9..0c12221a 100644
--- a/device/bluetooth/bluetooth_adapter_unittest.cc
+++ b/device/bluetooth/bluetooth_adapter_unittest.cc
@@ -16,6 +16,10 @@
 #include "build/build_config.h"
 #include "device/bluetooth/bluetooth_device.h"
 #include "device/bluetooth/bluetooth_discovery_session.h"
+#include "device/bluetooth/bluetooth_gatt_service.h"
+#include "device/bluetooth/bluetooth_local_gatt_characteristic.h"
+#include "device/bluetooth/bluetooth_local_gatt_descriptor.h"
+#include "device/bluetooth/bluetooth_local_gatt_service.h"
 #include "device/bluetooth/test/bluetooth_test.h"
 #include "device/bluetooth/test/test_bluetooth_adapter_observer.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -549,6 +553,7 @@
 }
 #endif  // defined(OS_ANDROID) || defined(OS_MACOSX)
 
+#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN)
 // Discovers a device.
 TEST_F(BluetoothTest, DiscoverLowEnergyDevice) {
   if (!PlatformSupportsLowEnergy()) {
@@ -565,7 +570,9 @@
   BluetoothDevice* device = adapter_->GetDevice(observer.last_device_address());
   EXPECT_TRUE(device);
 }
+#endif  // defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN)
 
+#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN)
 // Discovers the same device multiple times.
 TEST_F(BluetoothTest, DiscoverLowEnergyDeviceTwice) {
   if (!PlatformSupportsLowEnergy()) {
@@ -589,6 +596,7 @@
   EXPECT_EQ(0, observer.device_added_count());
   EXPECT_EQ(1u, adapter_->GetDevices().size());
 }
+#endif  // defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN)
 
 #if defined(OS_ANDROID) || defined(OS_MACOSX)
 // Discovers a device, and then again with new Service UUIDs.
@@ -641,6 +649,7 @@
 }
 #endif  // defined(OS_ANDROID) || defined(OS_MACOSX)
 
+#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN)
 // Discovers multiple devices when addresses vary.
 TEST_F(BluetoothTest, DiscoverMultipleLowEnergyDevices) {
   if (!PlatformSupportsLowEnergy()) {
@@ -657,6 +666,7 @@
   EXPECT_EQ(2, observer.device_added_count());
   EXPECT_EQ(2u, adapter_->GetDevices().size());
 }
+#endif  // defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN)
 
 #if defined(OS_ANDROID)
 TEST_F(BluetoothTest, TogglePowerFakeAdapter) {
@@ -716,4 +726,42 @@
 }
 #endif  // defined(OS_ANDROID)
 
+#if defined(OS_CHROMEOS) || defined(OS_LINUX)
+TEST_F(BluetoothTest, RegisterLocalGattServices) {
+  InitWithFakeAdapter();
+  base::WeakPtr<BluetoothLocalGattService> service =
+      BluetoothLocalGattService::Create(
+          adapter_.get(), BluetoothUUID(kTestUUIDGenericAttribute), true,
+          nullptr, nullptr);
+  base::WeakPtr<BluetoothLocalGattCharacteristic> characteristic1 =
+      BluetoothLocalGattCharacteristic::Create(
+          BluetoothUUID(kTestUUIDGenericAttribute),
+          device::BluetoothLocalGattCharacteristic::Properties(),
+          device::BluetoothLocalGattCharacteristic::Permissions(),
+          service.get());
+
+  base::WeakPtr<BluetoothLocalGattCharacteristic> characteristic2 =
+      BluetoothLocalGattCharacteristic::Create(
+          BluetoothUUID(kTestUUIDGenericAttribute),
+          device::BluetoothLocalGattCharacteristic::Properties(),
+          device::BluetoothLocalGattCharacteristic::Permissions(),
+          service.get());
+
+  base::WeakPtr<BluetoothLocalGattDescriptor> descriptor =
+      BluetoothLocalGattDescriptor::Create(
+          BluetoothUUID(kTestUUIDGenericAttribute),
+          device::BluetoothLocalGattCharacteristic::Permissions(),
+          characteristic1.get());
+
+  service->Register(GetCallback(Call::EXPECTED),
+                    GetGattErrorCallback(Call::NOT_EXPECTED));
+  service->Register(GetCallback(Call::NOT_EXPECTED),
+                    GetGattErrorCallback(Call::EXPECTED));
+  service->Unregister(GetCallback(Call::EXPECTED),
+                      GetGattErrorCallback(Call::NOT_EXPECTED));
+  service->Unregister(GetCallback(Call::NOT_EXPECTED),
+                      GetGattErrorCallback(Call::EXPECTED));
+}
+#endif  // defined(OS_CHROMEOS) || defined(OS_LINUX)
+
 }  // namespace device
diff --git a/device/bluetooth/bluetooth_local_gatt_characteristic_unittest.cc b/device/bluetooth/bluetooth_local_gatt_characteristic_unittest.cc
new file mode 100644
index 0000000..5e5f02c9
--- /dev/null
+++ b/device/bluetooth/bluetooth_local_gatt_characteristic_unittest.cc
@@ -0,0 +1,79 @@
+// Copyright 2016 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/weak_ptr.h"
+#include "device/bluetooth/bluetooth_local_gatt_characteristic.h"
+#include "device/bluetooth/test/bluetooth_gatt_server_test.h"
+#include "device/bluetooth/test/bluetooth_test.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace device {
+
+class BluetoothLocalGattCharacteristicTest : public BluetoothGattServerTest {
+ public:
+  void SetUp() override {
+    BluetoothGattServerTest::SetUp();
+
+    StartGattSetup();
+    characteristic_ = BluetoothLocalGattCharacteristic::Create(
+        BluetoothUUID(kTestUUIDGenericAttribute),
+        device::BluetoothLocalGattCharacteristic::Properties(),
+        device::BluetoothLocalGattCharacteristic::Permissions(),
+        service_.get());
+    EXPECT_LT(0u, characteristic_->GetIdentifier().size());
+    CompleteGattSetup();
+  }
+
+ protected:
+  base::WeakPtr<BluetoothLocalGattCharacteristic> characteristic_;
+};
+
+#if defined(OS_CHROMEOS) || defined(OS_LINUX)
+TEST_F(BluetoothLocalGattCharacteristicTest, ReadLocalCharacteristicValue) {
+  delegate_->value_to_write_ = 0x1337;
+  SimulateLocalGattCharacteristicValueReadRequest(
+      service_.get(), characteristic_.get(),
+      GetReadValueCallback(Call::EXPECTED), GetCallback(Call::NOT_EXPECTED));
+
+  EXPECT_EQ(delegate_->value_to_write_, GetInteger(last_read_value_));
+}
+#endif  // defined(OS_CHROMEOS) || defined(OS_LINUX)
+
+#if defined(OS_CHROMEOS) || defined(OS_LINUX)
+TEST_F(BluetoothLocalGattCharacteristicTest, WriteLocalCharacteristicValue) {
+  const uint64_t kValueToWrite = 0x7331ul;
+  SimulateLocalGattCharacteristicValueWriteRequest(
+      service_.get(), characteristic_.get(), GetValue(kValueToWrite),
+      GetCallback(Call::EXPECTED), GetCallback(Call::NOT_EXPECTED));
+
+  EXPECT_EQ(kValueToWrite, delegate_->last_written_value_);
+}
+#endif  // defined(OS_CHROMEOS) || defined(OS_LINUX)
+
+#if defined(OS_CHROMEOS) || defined(OS_LINUX)
+TEST_F(BluetoothLocalGattCharacteristicTest, ReadLocalCharacteristicValueFail) {
+  delegate_->value_to_write_ = 0x1337;
+  delegate_->should_fail_ = true;
+  SimulateLocalGattCharacteristicValueReadRequest(
+      service_.get(), characteristic_.get(),
+      GetReadValueCallback(Call::NOT_EXPECTED), GetCallback(Call::EXPECTED));
+
+  EXPECT_NE(delegate_->value_to_write_, GetInteger(last_read_value_));
+}
+#endif  // defined(OS_CHROMEOS) || defined(OS_LINUX)
+
+#if defined(OS_CHROMEOS) || defined(OS_LINUX)
+TEST_F(BluetoothLocalGattCharacteristicTest,
+       WriteLocalCharacteristicValueFail) {
+  const uint64_t kValueToWrite = 0x7331ul;
+  delegate_->should_fail_ = true;
+  SimulateLocalGattCharacteristicValueWriteRequest(
+      service_.get(), characteristic_.get(), GetValue(kValueToWrite),
+      GetCallback(Call::NOT_EXPECTED), GetCallback(Call::EXPECTED));
+
+  EXPECT_NE(kValueToWrite, delegate_->last_written_value_);
+}
+#endif  // defined(OS_CHROMEOS) || defined(OS_LINUX)
+
+}  // namespace device
diff --git a/device/bluetooth/bluetooth_local_gatt_descriptor_unittest.cc b/device/bluetooth/bluetooth_local_gatt_descriptor_unittest.cc
new file mode 100644
index 0000000..2a318b2
--- /dev/null
+++ b/device/bluetooth/bluetooth_local_gatt_descriptor_unittest.cc
@@ -0,0 +1,84 @@
+// Copyright 2016 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/weak_ptr.h"
+#include "device/bluetooth/bluetooth_gatt_characteristic.h"
+#include "device/bluetooth/bluetooth_local_gatt_descriptor.h"
+#include "device/bluetooth/test/bluetooth_gatt_server_test.h"
+#include "device/bluetooth/test/bluetooth_test.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace device {
+
+class BluetoothLocalGattDescriptorTest : public BluetoothGattServerTest {
+ public:
+  void SetUp() override {
+    BluetoothGattServerTest::SetUp();
+
+    StartGattSetup();
+    characteristic_ = BluetoothLocalGattCharacteristic::Create(
+        BluetoothUUID(kTestUUIDGenericAttribute),
+        device::BluetoothLocalGattCharacteristic::Properties(),
+        device::BluetoothLocalGattCharacteristic::Permissions(),
+        service_.get());
+    descriptor_ = BluetoothLocalGattDescriptor::Create(
+        BluetoothUUID(kTestUUIDGenericAttribute),
+        device::BluetoothLocalGattCharacteristic::Permissions(),
+        characteristic_.get());
+    EXPECT_LT(0u, descriptor_->GetIdentifier().size());
+    CompleteGattSetup();
+  }
+
+ protected:
+  base::WeakPtr<BluetoothLocalGattCharacteristic> characteristic_;
+  base::WeakPtr<BluetoothLocalGattDescriptor> descriptor_;
+};
+
+#if defined(OS_CHROMEOS) || defined(OS_LINUX)
+TEST_F(BluetoothLocalGattDescriptorTest, ReadLocalDescriptorValue) {
+  delegate_->value_to_write_ = 0x1337;
+  SimulateLocalGattDescriptorValueReadRequest(
+      service_.get(), descriptor_.get(), GetReadValueCallback(Call::EXPECTED),
+      GetCallback(Call::NOT_EXPECTED));
+
+  EXPECT_EQ(delegate_->value_to_write_, GetInteger(last_read_value_));
+}
+#endif  // defined(OS_CHROMEOS) || defined(OS_LINUX)
+
+#if defined(OS_CHROMEOS) || defined(OS_LINUX)
+TEST_F(BluetoothLocalGattDescriptorTest, WriteLocalDescriptorValue) {
+  const uint64_t kValueToWrite = 0x7331ul;
+  SimulateLocalGattDescriptorValueWriteRequest(
+      service_.get(), descriptor_.get(), GetValue(kValueToWrite),
+      GetCallback(Call::EXPECTED), GetCallback(Call::NOT_EXPECTED));
+
+  EXPECT_EQ(kValueToWrite, delegate_->last_written_value_);
+}
+#endif  // defined(OS_CHROMEOS) || defined(OS_LINUX)
+
+#if defined(OS_CHROMEOS) || defined(OS_LINUX)
+TEST_F(BluetoothLocalGattDescriptorTest, ReadLocalDescriptorValueFail) {
+  delegate_->value_to_write_ = 0x1337;
+  delegate_->should_fail_ = true;
+  SimulateLocalGattDescriptorValueReadRequest(
+      service_.get(), descriptor_.get(),
+      GetReadValueCallback(Call::NOT_EXPECTED), GetCallback(Call::EXPECTED));
+
+  EXPECT_NE(delegate_->value_to_write_, GetInteger(last_read_value_));
+}
+#endif  // defined(OS_CHROMEOS) || defined(OS_LINUX)
+
+#if defined(OS_CHROMEOS) || defined(OS_LINUX)
+TEST_F(BluetoothLocalGattDescriptorTest, WriteLocalDescriptorValueFail) {
+  const uint64_t kValueToWrite = 0x7331ul;
+  delegate_->should_fail_ = true;
+  SimulateLocalGattDescriptorValueWriteRequest(
+      service_.get(), descriptor_.get(), GetValue(kValueToWrite),
+      GetCallback(Call::NOT_EXPECTED), GetCallback(Call::EXPECTED));
+
+  EXPECT_NE(kValueToWrite, delegate_->last_written_value_);
+}
+#endif  // defined(OS_CHROMEOS) || defined(OS_LINUX)
+
+}  // namespace device
diff --git a/device/bluetooth/bluetooth_low_energy_win_fake.cc b/device/bluetooth/bluetooth_low_energy_win_fake.cc
index e370b70..c7ccd33 100644
--- a/device/bluetooth/bluetooth_low_energy_win_fake.cc
+++ b/device/bluetooth/bluetooth_low_energy_win_fake.cc
@@ -261,7 +261,6 @@
   observer->callback = callback;
   observer->context = context;
   *out_handle = (BLUETOOTH_GATT_EVENT_HANDLE)observer.get();
-  gatt_characteristic_observers_[*out_handle] = std::move(observer);
 
   PBLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION parameter =
       (PBLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION)event_parameter;
@@ -269,8 +268,18 @@
     GattCharacteristic* target_characteristic = GetSimulatedGattCharacteristic(
         service_path, &parameter->Characteristics[i]);
     CHECK(target_characteristic);
+
+    // Return error simulated by SimulateGattCharacteristicSetNotifyError.
+    if (target_characteristic->notify_errors.size()) {
+      HRESULT error = target_characteristic->notify_errors[0];
+      target_characteristic->notify_errors.erase(
+          target_characteristic->notify_errors.begin());
+      return error;
+    }
+
     target_characteristic->observers.push_back(*out_handle);
   }
+  gatt_characteristic_observers_[*out_handle] = std::move(observer);
 
   if (observer_)
     observer_->OnStartCharacteristicNotification();
@@ -481,6 +490,12 @@
   }
 }
 
+void BluetoothLowEnergyWrapperFake::SimulateGattCharacteristicSetNotifyError(
+    GattCharacteristic* characteristic,
+    HRESULT error) {
+  characteristic->notify_errors.push_back(error);
+}
+
 void BluetoothLowEnergyWrapperFake::SimulateGattCharacteristicReadError(
     GattCharacteristic* characteristic,
     HRESULT error) {
diff --git a/device/bluetooth/bluetooth_low_energy_win_fake.h b/device/bluetooth/bluetooth_low_energy_win_fake.h
index 28b5884..ad13f27 100644
--- a/device/bluetooth/bluetooth_low_energy_win_fake.h
+++ b/device/bluetooth/bluetooth_low_energy_win_fake.h
@@ -65,6 +65,7 @@
   GattDescriptorsMap included_descriptors;
   std::vector<HRESULT> read_errors;
   std::vector<HRESULT> write_errors;
+  std::vector<HRESULT> notify_errors;
   std::vector<BLUETOOTH_GATT_EVENT_HANDLE> observers;
 };
 
@@ -177,6 +178,9 @@
                                        const std::vector<uint8_t>& value);
   void SimulateCharacteristicValueChangeNotification(
       GattCharacteristic* characteristic);
+  void SimulateGattCharacteristicSetNotifyError(
+      GattCharacteristic* characteristic,
+      HRESULT error);
   void SimulateGattCharacteristicReadError(GattCharacteristic* characteristic,
                                            HRESULT error);
   void SimulateGattCharacteristicWriteError(GattCharacteristic* characteristic,
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc b/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc
index d25944c..831a847 100644
--- a/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc
+++ b/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc
@@ -991,6 +991,117 @@
 }
 #endif  // defined(OS_ANDROID)
 
+#if defined(OS_WIN)
+// Tests StartNotifySession reentrant in start notify session success callback
+// and the reentrant start notify session success.
+TEST_F(BluetoothRemoteGattCharacteristicTest,
+       StartNotifySession_Reentrant_Success_Success) {
+  ASSERT_NO_FATAL_FAILURE(
+      FakeCharacteristicBoilerplate(/* properties: NOTIFY */ 0x10));
+  SimulateGattDescriptor(
+      characteristic1_,
+      BluetoothGattDescriptor::ClientCharacteristicConfigurationUuid().value());
+  ASSERT_EQ(1u, characteristic1_->GetDescriptors().size());
+
+  characteristic1_->StartNotifySession(
+      GetReentrantStartNotifySessionSuccessCallback(Call::EXPECTED,
+                                                    characteristic1_),
+      GetReentrantStartNotifySessionErrorCallback(
+          Call::NOT_EXPECTED, characteristic1_,
+          false /* error_in_reentrant */));
+  EXPECT_EQ(0, callback_count_);
+  SimulateGattNotifySessionStarted(characteristic1_);
+  EXPECT_EQ(1, gatt_notify_characteristic_attempts_);
+
+  // Simulate reentrant StartNotifySession request from
+  // BluetoothTestBase::ReentrantStartNotifySessionSuccessCallback.
+  SimulateGattNotifySessionStarted(characteristic1_);
+  EXPECT_EQ(1, gatt_notify_characteristic_attempts_);
+  EXPECT_EQ(2, callback_count_);
+  EXPECT_EQ(0, error_callback_count_);
+  ASSERT_EQ(2u, notify_sessions_.size());
+  for (unsigned int i = 0; i < notify_sessions_.size(); i++) {
+    ASSERT_TRUE(notify_sessions_[i]);
+    EXPECT_EQ(characteristic1_->GetIdentifier(),
+              notify_sessions_[i]->GetCharacteristicIdentifier());
+    EXPECT_TRUE(notify_sessions_[i]->IsActive());
+  }
+}
+#endif  // defined(OS_WIN)
+
+#if defined(OS_WIN)
+// Tests StartNotifySession reentrant in start notify session error callback
+// and the reentrant start notify session success.
+TEST_F(BluetoothRemoteGattCharacteristicTest,
+       StartNotifySession_Reentrant_Error_Success) {
+  ASSERT_NO_FATAL_FAILURE(
+      FakeCharacteristicBoilerplate(/* properties: NOTIFY */ 0x10));
+  SimulateGattDescriptor(
+      characteristic1_,
+      BluetoothGattDescriptor::ClientCharacteristicConfigurationUuid().value());
+  ASSERT_EQ(1u, characteristic1_->GetDescriptors().size());
+
+  SimulateGattNotifySessionStartError(
+      characteristic1_, BluetoothRemoteGattService::GATT_ERROR_UNKNOWN);
+
+  characteristic1_->StartNotifySession(
+      GetReentrantStartNotifySessionSuccessCallback(Call::NOT_EXPECTED,
+                                                    characteristic1_),
+      GetReentrantStartNotifySessionErrorCallback(
+          Call::EXPECTED, characteristic1_, false /* error_in_reentrant */));
+  EXPECT_EQ(0, callback_count_);
+  SimulateGattNotifySessionStarted(characteristic1_);
+  EXPECT_EQ(0, gatt_notify_characteristic_attempts_);
+  EXPECT_EQ(1, error_callback_count_);
+
+  // Simulate reentrant StartNotifySession request from
+  // BluetoothTestBase::ReentrantStartNotifySessionErrorCallback.
+  SimulateGattNotifySessionStarted(characteristic1_);
+  EXPECT_EQ(1, gatt_notify_characteristic_attempts_);
+  EXPECT_EQ(1, callback_count_);
+  EXPECT_EQ(1, error_callback_count_);
+  ASSERT_EQ(1u, notify_sessions_.size());
+  ASSERT_TRUE(notify_sessions_[0]);
+  EXPECT_EQ(characteristic1_->GetIdentifier(),
+            notify_sessions_[0]->GetCharacteristicIdentifier());
+  EXPECT_TRUE(notify_sessions_[0]->IsActive());
+}
+#endif  // defined(OS_WIN)
+
+#if defined(OS_WIN)
+// Tests StartNotifySession reentrant in start notify session error callback
+// and the reentrant start notify session error.
+TEST_F(BluetoothRemoteGattCharacteristicTest,
+       StartNotifySession_Reentrant_Error_Error) {
+  ASSERT_NO_FATAL_FAILURE(
+      FakeCharacteristicBoilerplate(/* properties: NOTIFY */ 0x10));
+  SimulateGattDescriptor(
+      characteristic1_,
+      BluetoothGattDescriptor::ClientCharacteristicConfigurationUuid().value());
+  ASSERT_EQ(1u, characteristic1_->GetDescriptors().size());
+
+  SimulateGattNotifySessionStartError(
+      characteristic1_, BluetoothRemoteGattService::GATT_ERROR_UNKNOWN);
+
+  characteristic1_->StartNotifySession(
+      GetReentrantStartNotifySessionSuccessCallback(Call::NOT_EXPECTED,
+                                                    characteristic1_),
+      GetReentrantStartNotifySessionErrorCallback(
+          Call::EXPECTED, characteristic1_, true /* error_in_reentrant */));
+  EXPECT_EQ(0, callback_count_);
+  SimulateGattNotifySessionStarted(characteristic1_);
+  EXPECT_EQ(0, gatt_notify_characteristic_attempts_);
+
+  // Simulate reentrant StartNotifySession request from
+  // BluetoothTestBase::ReentrantStartNotifySessionErrorCallback.
+  SimulateGattNotifySessionStarted(characteristic1_);
+  EXPECT_EQ(0, gatt_notify_characteristic_attempts_);
+  EXPECT_EQ(0, callback_count_);
+  EXPECT_EQ(2, error_callback_count_);
+  ASSERT_EQ(0u, notify_sessions_.size());
+}
+#endif  // defined(OS_WIN)
+
 #if defined(OS_ANDROID) || defined(OS_WIN)
 // Tests Characteristic Value changes during a Notify Session.
 TEST_F(BluetoothRemoteGattCharacteristicTest, GattCharacteristicValueChanged) {
diff --git a/device/bluetooth/bluez/bluetooth_adapter_bluez.cc b/device/bluetooth/bluez/bluetooth_adapter_bluez.cc
index 758e6b6..0bcf84f 100644
--- a/device/bluetooth/bluez/bluetooth_adapter_bluez.cc
+++ b/device/bluetooth/bluez/bluetooth_adapter_bluez.cc
@@ -26,6 +26,7 @@
 #include "device/bluetooth/bluez/bluetooth_advertisement_bluez.h"
 #include "device/bluetooth/bluez/bluetooth_audio_sink_bluez.h"
 #include "device/bluetooth/bluez/bluetooth_device_bluez.h"
+#include "device/bluetooth/bluez/bluetooth_gatt_service_bluez.h"
 #include "device/bluetooth/bluez/bluetooth_local_gatt_service_bluez.h"
 #include "device/bluetooth/bluez/bluetooth_pairing_bluez.h"
 #include "device/bluetooth/bluez/bluetooth_socket_bluez.h"
@@ -33,6 +34,8 @@
 #include "device/bluetooth/dbus/bluetooth_agent_manager_client.h"
 #include "device/bluetooth/dbus/bluetooth_agent_service_provider.h"
 #include "device/bluetooth/dbus/bluetooth_device_client.h"
+#include "device/bluetooth/dbus/bluetooth_gatt_application_service_provider.h"
+#include "device/bluetooth/dbus/bluetooth_gatt_manager_client.h"
 #include "device/bluetooth/dbus/bluetooth_input_client.h"
 #include "device/bluetooth/dbus/bluez_dbus_manager.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
@@ -54,6 +57,7 @@
 // The agent path is relatively meaningless since BlueZ only permits one to
 // exist per D-Bus connection, it just has to be unique within Chromium.
 const char kAgentPath[] = "/org/chromium/bluetooth_agent";
+const char kGattApplicationObjectPath[] = "/gatt_application";
 
 void OnUnregisterAgentError(const std::string& error_name,
                             const std::string& error_message) {
@@ -99,6 +103,20 @@
 
 namespace bluez {
 
+namespace {
+
+void OnRegisterationErrorCallback(
+    const device::BluetoothGattService::ErrorCallback& error_callback,
+    const std::string& error_name,
+    const std::string& error_message) {
+  VLOG(1) << "Failed to [Un]register service: " << error_name << ", "
+          << error_message;
+  error_callback.Run(
+      BluetoothGattServiceBlueZ::DBusErrorToServiceError(error_name));
+}
+
+}  // namespace
+
 // static
 base::WeakPtr<BluetoothAdapter> BluetoothAdapterBlueZ::CreateAdapter(
     const InitCallback& init_callback) {
@@ -1046,6 +1064,73 @@
   owned_gatt_services_.push_back(std::move(service));
 }
 
+void BluetoothAdapterBlueZ::RegisterGattService(
+    BluetoothLocalGattServiceBlueZ* service,
+    const base::Closure& callback,
+    const device::BluetoothGattService::ErrorCallback& error_callback) {
+  if (registered_gatt_services_.count(service->object_path()) > 0) {
+    LOG(WARNING) << "Re-registering a service that is already registered!";
+    error_callback.Run(device::BluetoothGattService::GATT_ERROR_FAILED);
+    return;
+  }
+
+  registered_gatt_services_[service->object_path()] = service;
+  gatt_application_provider_ = BluetoothGattApplicationServiceProvider::Create(
+      bluez::BluezDBusManager::Get()->GetSystemBus(),
+      GetApplicationObjectPath(), registered_gatt_services_);
+
+  RegisterApplication(callback, error_callback);
+}
+
+void BluetoothAdapterBlueZ::UnregisterGattService(
+    BluetoothLocalGattServiceBlueZ* service,
+    const base::Closure& callback,
+    const device::BluetoothGattService::ErrorCallback& error_callback) {
+  DCHECK(bluez::BluezDBusManager::Get());
+
+  if (registered_gatt_services_.count(service->object_path()) == 0) {
+    LOG(WARNING) << "Unregistering a service that isn't registered! path: "
+                 << service->object_path().value();
+    error_callback.Run(device::BluetoothGattService::GATT_ERROR_FAILED);
+    return;
+  }
+
+  registered_gatt_services_.erase(service->object_path());
+
+  // If we have no GATT services left, unregister our application.
+  if (registered_gatt_services_.size() == 0) {
+    bluez::BluezDBusManager::Get()
+        ->GetBluetoothGattManagerClient()
+        ->UnregisterApplication(
+            GetApplicationObjectPath(), callback,
+            base::Bind(&OnRegisterationErrorCallback, error_callback));
+    return;
+  }
+
+  // Otherwise, this is tricky (since at the moment, BlueZ does not support
+  // adding/removing services individually). We need to update our list of
+  // services, then unregister our application, then re-register it with the
+  // updated services. TODO(rkc): Fix this once BlueZ is fixed.
+  gatt_application_provider_ = BluetoothGattApplicationServiceProvider::Create(
+      bluez::BluezDBusManager::Get()->GetSystemBus(), object_path_,
+      registered_gatt_services_);
+
+  // Unregister our current application. If we are successful, make a call to
+  // register the application again with the current set of services.
+  bluez::BluezDBusManager::Get()
+      ->GetBluetoothGattManagerClient()
+      ->UnregisterApplication(
+          GetApplicationObjectPath(),
+          base::Bind(&BluetoothAdapterBlueZ::RegisterApplication,
+                     weak_ptr_factory_.GetWeakPtr(), callback, error_callback),
+          base::Bind(&OnRegisterationErrorCallback, error_callback));
+}
+
+// Returns the object path of the adapter.
+dbus::ObjectPath BluetoothAdapterBlueZ::GetApplicationObjectPath() const {
+  return dbus::ObjectPath(object_path_.value() + kGattApplicationObjectPath);
+}
+
 void BluetoothAdapterBlueZ::OnRegisterProfile(
     const BluetoothUUID& uuid,
     std::unique_ptr<BluetoothAdapterProfileBlueZ> profile) {
@@ -1480,4 +1565,15 @@
   }
 }
 
+void BluetoothAdapterBlueZ::RegisterApplication(
+    const base::Closure& callback,
+    const device::BluetoothGattService::ErrorCallback& error_callback) {
+  DCHECK(bluez::BluezDBusManager::Get());
+  bluez::BluezDBusManager::Get()
+      ->GetBluetoothGattManagerClient()
+      ->RegisterApplication(
+          GetApplicationObjectPath(), BluetoothGattManagerClient::Options(),
+          callback, base::Bind(&OnRegisterationErrorCallback, error_callback));
+}
+
 }  // namespace bluez
diff --git a/device/bluetooth/bluez/bluetooth_adapter_bluez.h b/device/bluetooth/bluez/bluetooth_adapter_bluez.h
index 07732c16..33e6f568 100644
--- a/device/bluetooth/bluez/bluetooth_adapter_bluez.h
+++ b/device/bluetooth/bluez/bluetooth_adapter_bluez.h
@@ -23,6 +23,7 @@
 #include "device/bluetooth/bluetooth_device.h"
 #include "device/bluetooth/bluetooth_discovery_session.h"
 #include "device/bluetooth/bluetooth_export.h"
+#include "device/bluetooth/bluetooth_gatt_service.h"
 #include "device/bluetooth/dbus/bluetooth_adapter_client.h"
 #include "device/bluetooth/dbus/bluetooth_agent_service_provider.h"
 #include "device/bluetooth/dbus/bluetooth_device_client.h"
@@ -45,6 +46,7 @@
 class BluetoothAdapterProfileBlueZ;
 class BluetoothDeviceBlueZ;
 class BluetoothLocalGattServiceBlueZ;
+class BluetoothGattApplicationServiceProvider;
 class BluetoothPairingBlueZ;
 
 // The BluetoothAdapterBlueZ class implements BluetoothAdapter for platforms
@@ -150,9 +152,25 @@
   void ReleaseProfile(const dbus::ObjectPath& device_path,
                       BluetoothAdapterProfileBlueZ* profile);
 
+  // Add a local GATT service to the list of services owned by this adapter.
   void AddLocalGattService(
       std::unique_ptr<BluetoothLocalGattServiceBlueZ> service);
 
+  // Register a GATT service. The service must belong to this adapter.
+  void RegisterGattService(
+      BluetoothLocalGattServiceBlueZ* service,
+      const base::Closure& callback,
+      const device::BluetoothGattService::ErrorCallback& error_callback);
+
+  // Unregister a GATT service. The service must already be registered.
+  void UnregisterGattService(
+      BluetoothLocalGattServiceBlueZ* service,
+      const base::Closure& callback,
+      const device::BluetoothGattService::ErrorCallback& error_callback);
+
+  // Returns the object path of the adapter.
+  dbus::ObjectPath GetApplicationObjectPath() const;
+
  protected:
   // BluetoothAdapter:
   void RemovePairingDelegateInternal(
@@ -348,6 +366,12 @@
   // ended (with either success or failure).
   void ProcessQueuedDiscoveryRequests();
 
+  // Make the call to GattManager1 to register the services currently exported
+  // by the GATT Application service provider.
+  void RegisterApplication(
+      const base::Closure& callback,
+      const device::BluetoothGattService::ErrorCallback& error_callback);
+
   InitCallback init_callback_;
 
   bool initialized_;
@@ -396,9 +420,19 @@
 
   std::unique_ptr<device::BluetoothDiscoveryFilter> current_filter_;
 
+  // List of GATT services that are owned by this adapter.
   std::vector<std::unique_ptr<BluetoothLocalGattServiceBlueZ>>
       owned_gatt_services_;
 
+  // GATT services that are currently available on the GATT server.
+  std::map<dbus::ObjectPath, BluetoothLocalGattServiceBlueZ*>
+      registered_gatt_services_;
+
+  // DBus Object Manager that acts as a service provider for all the services
+  // that are registered with this adapter.
+  std::unique_ptr<BluetoothGattApplicationServiceProvider>
+      gatt_application_provider_;
+
   // Note: This should remain the last member so it'll be destroyed and
   // invalidate its weak pointers before any other members are destroyed.
   base::WeakPtrFactory<BluetoothAdapterBlueZ> weak_ptr_factory_;
diff --git a/device/bluetooth/bluez/bluetooth_local_gatt_service_bluez.cc b/device/bluetooth/bluez/bluetooth_local_gatt_service_bluez.cc
index f965c8e76..dd044d2 100644
--- a/device/bluetooth/bluez/bluetooth_local_gatt_service_bluez.cc
+++ b/device/bluetooth/bluez/bluetooth_local_gatt_service_bluez.cc
@@ -28,7 +28,7 @@
   return service->weak_ptr_factory_.GetWeakPtr();
 }
 
-}  // device
+}  // namespace device
 
 namespace bluez {
 
@@ -37,12 +37,14 @@
     const device::BluetoothUUID& uuid,
     bool is_primary,
     device::BluetoothLocalGattService::Delegate* delegate)
-    : BluetoothGattServiceBlueZ(adapter, AddGuidToObjectPath("/service")),
+    : BluetoothGattServiceBlueZ(
+          adapter,
+          AddGuidToObjectPath(adapter->GetApplicationObjectPath().value() +
+                              "/service")),
       uuid_(uuid),
       is_primary_(is_primary),
       delegate_(delegate),
       weak_ptr_factory_(this) {
-  // TODO(rkc): Get base application path from adapter and prefix it here.
   VLOG(1) << "Creating local GATT service with identifier: " << GetIdentifier();
   adapter->AddLocalGattService(base::WrapUnique(this));
 }
@@ -60,14 +62,14 @@
 void BluetoothLocalGattServiceBlueZ::Register(
     const base::Closure& callback,
     const ErrorCallback& error_callback) {
-  //  GetAdapter()->RegisterGattService(this, callback, error_callback);
+  GetAdapter()->RegisterGattService(this, callback, error_callback);
 }
 
 void BluetoothLocalGattServiceBlueZ::Unregister(
     const base::Closure& callback,
     const ErrorCallback& error_callback) {
   DCHECK(GetAdapter());
-  //  GetAdapter()->UnregisterGattService(this, callback, error_callback);
+  GetAdapter()->UnregisterGattService(this, callback, error_callback);
 }
 
 const std::vector<std::unique_ptr<BluetoothLocalGattCharacteristicBlueZ>>&
diff --git a/device/bluetooth/test/bluetooth_gatt_server_test.cc b/device/bluetooth/test/bluetooth_gatt_server_test.cc
new file mode 100644
index 0000000..430f649
--- /dev/null
+++ b/device/bluetooth/test/bluetooth_gatt_server_test.cc
@@ -0,0 +1,79 @@
+// Copyright 2016 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 "device/bluetooth/test/bluetooth_gatt_server_test.h"
+
+#include "base/logging.h"
+#include "base/memory/ptr_util.h"
+#include "base/memory/ref_counted.h"
+#include "device/bluetooth/bluetooth_uuid.h"
+#include "device/bluetooth/test/bluetooth_test.h"
+
+namespace device {
+
+BluetoothGattServerTest::BluetoothGattServerTest() {}
+
+BluetoothGattServerTest::~BluetoothGattServerTest() {}
+
+void BluetoothGattServerTest::StartGattSetup() {
+  InitWithFakeAdapter();
+  delegate_ = base::WrapUnique(new TestBluetoothLocalGattServiceDelegate());
+  service_ = BluetoothLocalGattService::Create(
+      adapter_.get(), BluetoothUUID(kTestUUIDGenericAttribute), true, nullptr,
+      delegate_.get());
+  delegate_->set_expected_service(service_.get());
+}
+
+void BluetoothGattServerTest::CompleteGattSetup() {
+  service_->Register(GetCallback(Call::EXPECTED),
+                     GetGattErrorCallback(Call::NOT_EXPECTED));
+  EXPECT_EQ(1, callback_count_);
+  EXPECT_EQ(0, error_callback_count_);
+}
+
+void BluetoothGattServerTest::SetUp() {
+  BluetoothTest::SetUp();
+
+  last_read_value_ = std::vector<uint8_t>();
+}
+
+void BluetoothGattServerTest::TearDown() {
+  int callback_count = callback_count_;
+  int error_callback_count = error_callback_count_;
+  service_->Unregister(GetCallback(Call::EXPECTED),
+                       GetGattErrorCallback(Call::NOT_EXPECTED));
+  EXPECT_EQ(callback_count + 1, callback_count_);
+  EXPECT_EQ(error_callback_count, error_callback_count_);
+
+  delegate_ = nullptr;
+
+  BluetoothTest::TearDown();
+}
+
+// static
+uint64_t BluetoothGattServerTest::GetInteger(
+    const std::vector<uint8_t>& value) {
+  // Handling only up to 4 bytes value for tests.
+  CHECK_LE(value.size(), 4u);
+  uint64_t int_value = 0;
+  uint64_t powers_of_256 = 1;
+  for (uint8_t v : value) {
+    int_value += v * powers_of_256;
+    powers_of_256 *= 256;
+  }
+  return int_value;
+}
+
+// static
+std::vector<uint8_t> BluetoothGattServerTest::GetValue(uint64_t int_value) {
+  CHECK_LE(int_value, 0xFFFFFFFFul);
+  std::vector<uint8_t> value;
+  while (int_value) {
+    value.push_back(int_value & 0xff);
+    int_value >>= 8;
+  }
+  return value;
+}
+
+}  // namespace device
diff --git a/device/bluetooth/test/bluetooth_gatt_server_test.h b/device/bluetooth/test/bluetooth_gatt_server_test.h
new file mode 100644
index 0000000..b96a1b9
--- /dev/null
+++ b/device/bluetooth/test/bluetooth_gatt_server_test.h
@@ -0,0 +1,53 @@
+// Copyright 2016 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 DEVICE_BLUETOOTH_TEST_BLUETOOTH_GATT_SERVER_TEST_H_
+#define DEVICE_BLUETOOTH_TEST_BLUETOOTH_GATT_SERVER_TEST_H_
+
+#include <device/bluetooth/test/test_bluetooth_local_gatt_service_delegate.h>
+#include <cstdint>
+#include <vector>
+
+#include "base/memory/weak_ptr.h"
+#include "device/bluetooth/bluetooth_local_gatt_service.h"
+
+#if defined(OS_ANDROID)
+#include "device/bluetooth/test/bluetooth_test_android.h"
+#elif defined(OS_MACOSX)
+#include "device/bluetooth/test/bluetooth_test_mac.h"
+#elif defined(OS_WIN)
+#include "device/bluetooth/test/bluetooth_test_win.h"
+#elif defined(OS_CHROMEOS) || defined(OS_LINUX)
+#include "device/bluetooth/test/bluetooth_test_bluez.h"
+#endif
+
+namespace device {
+
+// Base class for BlueZ GATT server unit tests.
+class BluetoothGattServerTest : public BluetoothTest {
+ public:
+  BluetoothGattServerTest();
+  ~BluetoothGattServerTest() override;
+
+  // Start and complete boilerplate setup steps.
+  void StartGattSetup();
+  void CompleteGattSetup();
+
+  // BluetoothTest overrides:
+  void SetUp() override;
+  void TearDown() override;
+
+  // Utility methods to deal with values.
+  static uint64_t GetInteger(const std::vector<uint8_t>& value);
+  static std::vector<uint8_t> GetValue(uint64_t int_value);
+
+ protected:
+  base::WeakPtr<BluetoothLocalGattService> service_;
+
+  std::unique_ptr<TestBluetoothLocalGattServiceDelegate> delegate_;
+};
+
+}  // namespace device
+
+#endif  // DEVICE_BLUETOOTH_TEST_BLUETOOTH_GATT_SERVER_TEST_H_
diff --git a/device/bluetooth/test/bluetooth_test.cc b/device/bluetooth/test/bluetooth_test.cc
index ca050881..ee1ec95 100644
--- a/device/bluetooth/test/bluetooth_test.cc
+++ b/device/bluetooth/test/bluetooth_test.cc
@@ -161,6 +161,47 @@
     unexpected_error_callback_ = true;
 }
 
+void BluetoothTestBase::ReentrantStartNotifySessionSuccessCallback(
+    Call expected,
+    BluetoothRemoteGattCharacteristic* characteristic,
+    std::unique_ptr<BluetoothGattNotifySession> notify_session) {
+  ++callback_count_;
+  notify_sessions_.push_back(std::move(notify_session));
+
+  if (expected == Call::EXPECTED)
+    ++actual_success_callback_calls_;
+  else
+    unexpected_success_callback_ = true;
+
+  characteristic->StartNotifySession(GetNotifyCallback(Call::EXPECTED),
+                                     GetGattErrorCallback(Call::NOT_EXPECTED));
+}
+
+void BluetoothTestBase::ReentrantStartNotifySessionErrorCallback(
+    Call expected,
+    BluetoothRemoteGattCharacteristic* characteristic,
+    bool error_in_reentrant,
+    BluetoothGattService::GattErrorCode error_code) {
+  ++error_callback_count_;
+  last_gatt_error_code_ = error_code;
+
+  if (expected == Call::EXPECTED)
+    ++actual_error_callback_calls_;
+  else
+    unexpected_error_callback_ = true;
+
+  if (error_in_reentrant) {
+    SimulateGattNotifySessionStartError(
+        characteristic, BluetoothRemoteGattService::GATT_ERROR_UNKNOWN);
+    characteristic->StartNotifySession(GetNotifyCallback(Call::NOT_EXPECTED),
+                                       GetGattErrorCallback(Call::EXPECTED));
+  } else {
+    characteristic->StartNotifySession(
+        GetNotifyCallback(Call::EXPECTED),
+        GetGattErrorCallback(Call::NOT_EXPECTED));
+  }
+}
+
 base::Closure BluetoothTestBase::GetCallback(Call expected) {
   if (expected == Call::EXPECTED)
     ++expected_success_callback_calls_;
@@ -224,6 +265,29 @@
                     weak_factory_.GetWeakPtr(), expected);
 }
 
+BluetoothRemoteGattCharacteristic::NotifySessionCallback
+BluetoothTestBase::GetReentrantStartNotifySessionSuccessCallback(
+    Call expected,
+    BluetoothRemoteGattCharacteristic* characteristic) {
+  if (expected == Call::EXPECTED)
+    ++expected_success_callback_calls_;
+  return base::Bind(
+      &BluetoothTestBase::ReentrantStartNotifySessionSuccessCallback,
+      weak_factory_.GetWeakPtr(), expected, characteristic);
+}
+
+base::Callback<void(BluetoothGattService::GattErrorCode)>
+BluetoothTestBase::GetReentrantStartNotifySessionErrorCallback(
+    Call expected,
+    BluetoothRemoteGattCharacteristic* characteristic,
+    bool error_in_reentrant) {
+  if (expected == Call::EXPECTED)
+    ++expected_error_callback_calls_;
+  return base::Bind(
+      &BluetoothTestBase::ReentrantStartNotifySessionErrorCallback,
+      weak_factory_.GetWeakPtr(), expected, characteristic, error_in_reentrant);
+}
+
 void BluetoothTestBase::ResetEventCounts() {
   last_connect_error_code_ = BluetoothDevice::ERROR_UNKNOWN;
   callback_count_ = 0;
diff --git a/device/bluetooth/test/bluetooth_test.h b/device/bluetooth/test/bluetooth_test.h
index 51e6541..762450f 100644
--- a/device/bluetooth/test/bluetooth_test.h
+++ b/device/bluetooth/test/bluetooth_test.h
@@ -8,6 +8,8 @@
 #include <stdint.h>
 
 #include <memory>
+#include <string>
+#include <vector>
 
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
@@ -71,16 +73,16 @@
   virtual bool PlatformSupportsLowEnergy() = 0;
 
   // Initializes the BluetoothAdapter |adapter_| with the system adapter.
-  virtual void InitWithDefaultAdapter(){};
+  virtual void InitWithDefaultAdapter() {}
 
   // Initializes the BluetoothAdapter |adapter_| with the system adapter forced
   // to be ignored as if it did not exist. This enables tests for when an
   // adapter is not present on the system.
-  virtual void InitWithoutDefaultAdapter(){};
+  virtual void InitWithoutDefaultAdapter() {}
 
   // Initializes the BluetoothAdapter |adapter_| with a fake adapter that can be
   // controlled by this test fixture.
-  virtual void InitWithFakeAdapter(){};
+  virtual void InitWithFakeAdapter() {}
 
   // Configures the fake adapter to lack the necessary permissions to scan for
   // devices.  Returns false if the current platform always has permission.
@@ -213,6 +215,42 @@
       BluetoothRemoteGattCharacteristic* characteristic,
       const std::string& uuid) {}
 
+  // Simulates reading a value from a locally hosted GATT characteristic by a
+  // remote central device. Returns the value that was read from the local
+  // GATT characteristic in the value callback.
+  virtual void SimulateLocalGattCharacteristicValueReadRequest(
+      BluetoothLocalGattService* service,
+      BluetoothLocalGattCharacteristic* characteristic,
+      const BluetoothLocalGattService::Delegate::ValueCallback& value_callback,
+      const base::Closure& error_callback) {}
+
+  // Simulates write a value to a locally hosted GATT characteristic by a
+  // remote central device.
+  virtual void SimulateLocalGattCharacteristicValueWriteRequest(
+      BluetoothLocalGattService* service,
+      BluetoothLocalGattCharacteristic* characteristic,
+      const std::vector<uint8_t>& value_to_write,
+      const base::Closure& success_callback,
+      const base::Closure& error_callback) {}
+
+  // Simulates reading a value from a locally hosted GATT descriptor by a
+  // remote central device. Returns the value that was read from the local
+  // GATT descriptor in the value callback.
+  virtual void SimulateLocalGattDescriptorValueReadRequest(
+      BluetoothLocalGattService* service,
+      BluetoothLocalGattDescriptor* descriptor,
+      const BluetoothLocalGattService::Delegate::ValueCallback& value_callback,
+      const base::Closure& error_callback) {}
+
+  // Simulates write a value to a locally hosted GATT descriptor by a
+  // remote central device.
+  virtual void SimulateLocalGattDescriptorValueWriteRequest(
+      BluetoothLocalGattService* service,
+      BluetoothLocalGattDescriptor* descriptor,
+      const std::vector<uint8_t>& value_to_write,
+      const base::Closure& success_callback,
+      const base::Closure& error_callback) {}
+
   // Remembers |descriptor|'s platform specific object to be used in a
   // subsequent call to methods such as SimulateGattDescriptorRead that
   // accept a nullptr value to select this remembered descriptor. This
@@ -271,6 +309,15 @@
                             enum BluetoothDevice::ConnectErrorCode);
   void GattErrorCallback(Call expected,
                          BluetoothRemoteGattService::GattErrorCode);
+  void ReentrantStartNotifySessionSuccessCallback(
+      Call expected,
+      BluetoothRemoteGattCharacteristic* characteristic,
+      std::unique_ptr<BluetoothGattNotifySession> notify_session);
+  void ReentrantStartNotifySessionErrorCallback(
+      Call expected,
+      BluetoothRemoteGattCharacteristic* characteristic,
+      bool error_in_reentrant,
+      BluetoothGattService::GattErrorCode error_code);
 
   // Accessors to get callbacks bound to this fixture:
   base::Closure GetCallback(Call expected);
@@ -286,6 +333,15 @@
   BluetoothDevice::ConnectErrorCallback GetConnectErrorCallback(Call expected);
   base::Callback<void(BluetoothRemoteGattService::GattErrorCode)>
   GetGattErrorCallback(Call expected);
+  BluetoothRemoteGattCharacteristic::NotifySessionCallback
+  GetReentrantStartNotifySessionSuccessCallback(
+      Call expected,
+      BluetoothRemoteGattCharacteristic* characteristic);
+  base::Callback<void(BluetoothGattService::GattErrorCode)>
+  GetReentrantStartNotifySessionErrorCallback(
+      Call expected,
+      BluetoothRemoteGattCharacteristic* characteristic,
+      bool error_in_reentrant);
 
   // Reset all event count members to 0.
   void ResetEventCounts();
diff --git a/device/bluetooth/test/bluetooth_test_bluez.cc b/device/bluetooth/test/bluetooth_test_bluez.cc
index b27dd14..11876fb 100644
--- a/device/bluetooth/test/bluetooth_test_bluez.cc
+++ b/device/bluetooth/test/bluetooth_test_bluez.cc
@@ -4,36 +4,57 @@
 
 #include "device/bluetooth/test/bluetooth_test_bluez.h"
 
-#include <iterator>
-#include <sstream>
+#include <string>
 
-#include "base/logging.h"
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
+#include "dbus/object_path.h"
 #include "device/bluetooth/bluez/bluetooth_adapter_bluez.h"
-#include "device/bluetooth/bluez/bluetooth_device_bluez.h"
+#include "device/bluetooth/bluez/bluetooth_gatt_characteristic_bluez.h"
 #include "device/bluetooth/bluez/bluetooth_gatt_descriptor_bluez.h"
-#include "device/bluetooth/bluez/bluetooth_remote_gatt_characteristic_bluez.h"
-#include "device/bluetooth/bluez/bluetooth_remote_gatt_service_bluez.h"
+#include "device/bluetooth/bluez/bluetooth_local_gatt_characteristic_bluez.h"
+#include "device/bluetooth/bluez/bluetooth_local_gatt_descriptor_bluez.h"
 #include "device/bluetooth/dbus/bluez_dbus_manager.h"
 #include "device/bluetooth/dbus/fake_bluetooth_adapter_client.h"
 #include "device/bluetooth/dbus/fake_bluetooth_device_client.h"
-#include "device/bluetooth/test/test_bluetooth_adapter_observer.h"
+#include "device/bluetooth/dbus/fake_bluetooth_gatt_characteristic_service_provider.h"
+#include "device/bluetooth/dbus/fake_bluetooth_gatt_descriptor_service_provider.h"
+#include "device/bluetooth/dbus/fake_bluetooth_gatt_manager_client.h"
+#include "device/bluetooth/test/bluetooth_gatt_server_test.h"
 
 namespace device {
 
 namespace {
 
-void AdapterCallback(base::Closure quit_closure) {
+void AdapterCallback(const base::Closure& quit_closure) {
   quit_closure.Run();
 }
+
+void GetValueCallback(
+    const base::Closure& quit_closure,
+    const BluetoothLocalGattService::Delegate::ValueCallback& value_callback,
+    const std::vector<uint8_t>& value) {
+  value_callback.Run(value);
+  quit_closure.Run();
 }
 
+void ClosureCallback(const base::Closure& quit_closure,
+                     const base::Closure& callback) {
+  callback.Run();
+  quit_closure.Run();
+}
+
+}  // namespace
+
 BluetoothTestBlueZ::BluetoothTestBlueZ()
     : fake_bluetooth_device_client_(nullptr) {}
 
 BluetoothTestBlueZ::~BluetoothTestBlueZ() {}
 
 void BluetoothTestBlueZ::SetUp() {
+  BluetoothTestBase::SetUp();
   std::unique_ptr<bluez::BluezDBusManagerSetter> dbus_setter =
       bluez::BluezDBusManager::GetSetterForTesting();
   fake_bluetooth_device_client_ = new bluez::FakeBluetoothDeviceClient;
@@ -50,6 +71,7 @@
 void BluetoothTestBlueZ::TearDown() {
   adapter_ = nullptr;
   bluez::BluezDBusManager::Shutdown();
+  BluetoothTestBase::TearDown();
 }
 
 bool BluetoothTestBlueZ::PlatformSupportsLowEnergy() {
@@ -100,4 +122,121 @@
 
   return device;
 }
+
+void BluetoothTestBlueZ::SimulateLocalGattCharacteristicValueReadRequest(
+    BluetoothLocalGattService* service,
+    BluetoothLocalGattCharacteristic* characteristic,
+    const BluetoothLocalGattService::Delegate::ValueCallback& value_callback,
+    const base::Closure& error_callback) {
+  bluez::BluetoothLocalGattCharacteristicBlueZ* characteristic_bluez =
+      static_cast<bluez::BluetoothLocalGattCharacteristicBlueZ*>(
+          characteristic);
+  bluez::FakeBluetoothGattManagerClient* fake_bluetooth_gatt_manager_client =
+      static_cast<bluez::FakeBluetoothGattManagerClient*>(
+          bluez::BluezDBusManager::Get()->GetBluetoothGattManagerClient());
+  bluez::FakeBluetoothGattCharacteristicServiceProvider*
+      characteristic_provider =
+          fake_bluetooth_gatt_manager_client->GetCharacteristicServiceProvider(
+              characteristic_bluez->object_path());
+
+  bluez::BluetoothLocalGattServiceBlueZ* service_bluez =
+      static_cast<bluez::BluetoothLocalGattServiceBlueZ*>(service);
+  static_cast<TestBluetoothLocalGattServiceDelegate*>(
+      service_bluez->GetDelegate())
+      ->set_expected_characteristic(characteristic);
+
+  base::RunLoop run_loop;
+  characteristic_provider->GetValue(
+      base::Bind(&GetValueCallback, run_loop.QuitClosure(), value_callback),
+      base::Bind(&ClosureCallback, run_loop.QuitClosure(), error_callback));
+  run_loop.Run();
 }
+
+void BluetoothTestBlueZ::SimulateLocalGattCharacteristicValueWriteRequest(
+    BluetoothLocalGattService* service,
+    BluetoothLocalGattCharacteristic* characteristic,
+    const std::vector<uint8_t>& value_to_write,
+    const base::Closure& success_callback,
+    const base::Closure& error_callback) {
+  bluez::BluetoothLocalGattCharacteristicBlueZ* characteristic_bluez =
+      static_cast<bluez::BluetoothLocalGattCharacteristicBlueZ*>(
+          characteristic);
+  bluez::FakeBluetoothGattManagerClient* fake_bluetooth_gatt_manager_client =
+      static_cast<bluez::FakeBluetoothGattManagerClient*>(
+          bluez::BluezDBusManager::Get()->GetBluetoothGattManagerClient());
+  bluez::FakeBluetoothGattCharacteristicServiceProvider*
+      characteristic_provider =
+          fake_bluetooth_gatt_manager_client->GetCharacteristicServiceProvider(
+              characteristic_bluez->object_path());
+
+  bluez::BluetoothLocalGattServiceBlueZ* service_bluez =
+      static_cast<bluez::BluetoothLocalGattServiceBlueZ*>(service);
+  static_cast<TestBluetoothLocalGattServiceDelegate*>(
+      service_bluez->GetDelegate())
+      ->set_expected_characteristic(characteristic);
+
+  base::RunLoop run_loop;
+  characteristic_provider->SetValue(
+      value_to_write,
+      base::Bind(&ClosureCallback, run_loop.QuitClosure(), success_callback),
+      base::Bind(&ClosureCallback, run_loop.QuitClosure(), error_callback));
+  run_loop.Run();
+}
+
+void BluetoothTestBlueZ::SimulateLocalGattDescriptorValueReadRequest(
+    BluetoothLocalGattService* service,
+    BluetoothLocalGattDescriptor* descriptor,
+    const BluetoothLocalGattService::Delegate::ValueCallback& value_callback,
+    const base::Closure& error_callback) {
+  bluez::BluetoothLocalGattDescriptorBlueZ* descriptor_bluez =
+      static_cast<bluez::BluetoothLocalGattDescriptorBlueZ*>(descriptor);
+  bluez::FakeBluetoothGattManagerClient* fake_bluetooth_gatt_manager_client =
+      static_cast<bluez::FakeBluetoothGattManagerClient*>(
+          bluez::BluezDBusManager::Get()->GetBluetoothGattManagerClient());
+  bluez::FakeBluetoothGattDescriptorServiceProvider* descriptor_provider =
+      fake_bluetooth_gatt_manager_client->GetDescriptorServiceProvider(
+          descriptor_bluez->object_path());
+
+  bluez::BluetoothLocalGattServiceBlueZ* service_bluez =
+      static_cast<bluez::BluetoothLocalGattServiceBlueZ*>(service);
+  static_cast<TestBluetoothLocalGattServiceDelegate*>(
+      service_bluez->GetDelegate())
+      ->set_expected_descriptor(descriptor);
+
+  base::RunLoop run_loop;
+  descriptor_provider->GetValue(
+      base::Bind(&GetValueCallback, run_loop.QuitClosure(), value_callback),
+      base::Bind(&ClosureCallback, run_loop.QuitClosure(), error_callback));
+  run_loop.Run();
+}
+
+void BluetoothTestBlueZ::SimulateLocalGattDescriptorValueWriteRequest(
+    BluetoothLocalGattService* service,
+    BluetoothLocalGattDescriptor* descriptor,
+    const std::vector<uint8_t>& value_to_write,
+    const base::Closure& success_callback,
+    const base::Closure& error_callback) {
+  bluez::BluetoothLocalGattDescriptorBlueZ* descriptor_bluez =
+      static_cast<bluez::BluetoothLocalGattDescriptorBlueZ*>(descriptor);
+  bluez::FakeBluetoothGattManagerClient* fake_bluetooth_gatt_manager_client =
+      static_cast<bluez::FakeBluetoothGattManagerClient*>(
+          bluez::BluezDBusManager::Get()->GetBluetoothGattManagerClient());
+  bluez::FakeBluetoothGattDescriptorServiceProvider* descriptor_provider =
+      fake_bluetooth_gatt_manager_client->GetDescriptorServiceProvider(
+          descriptor_bluez->object_path());
+
+  bluez::BluetoothLocalGattServiceBlueZ* service_bluez =
+      static_cast<bluez::BluetoothLocalGattServiceBlueZ*>(service);
+  static_cast<TestBluetoothLocalGattServiceDelegate*>(
+      service_bluez->GetDelegate())
+      ->set_expected_descriptor(descriptor);
+
+  base::RunLoop run_loop;
+  descriptor_provider->SetValue(
+      value_to_write,
+      base::Bind(&ClosureCallback, run_loop.QuitClosure(), success_callback),
+      base::Bind(&ClosureCallback, run_loop.QuitClosure(), error_callback));
+  run_loop.Run();
+}
+
+}  // namespace device
diff --git a/device/bluetooth/test/bluetooth_test_bluez.h b/device/bluetooth/test/bluetooth_test_bluez.h
index a6805d0..5d46837 100644
--- a/device/bluetooth/test/bluetooth_test_bluez.h
+++ b/device/bluetooth/test/bluetooth_test_bluez.h
@@ -5,6 +5,14 @@
 #ifndef DEVICE_BLUETOOTH_TEST_BLUETOOTH_TEST_BLUEZ_H_
 #define DEVICE_BLUETOOTH_TEST_BLUETOOTH_TEST_BLUEZ_H_
 
+#include <cstdint>
+#include <vector>
+
+#include "base/callback_forward.h"
+#include "device/bluetooth/bluetooth_device.h"
+#include "device/bluetooth/bluetooth_local_gatt_characteristic.h"
+#include "device/bluetooth/bluetooth_local_gatt_descriptor.h"
+#include "device/bluetooth/bluetooth_local_gatt_service.h"
 #include "device/bluetooth/test/bluetooth_test.h"
 
 namespace bluez {
@@ -28,6 +36,30 @@
   void InitWithFakeAdapter() override;
   BluetoothDevice* DiscoverLowEnergyDevice(int device_ordinal) override;
 
+  void SimulateLocalGattCharacteristicValueReadRequest(
+      BluetoothLocalGattService* service,
+      BluetoothLocalGattCharacteristic* characteristic,
+      const BluetoothLocalGattService::Delegate::ValueCallback& value_callback,
+      const base::Closure& error_callback) override;
+  void SimulateLocalGattCharacteristicValueWriteRequest(
+      BluetoothLocalGattService* service,
+      BluetoothLocalGattCharacteristic* characteristic,
+      const std::vector<uint8_t>& value_to_write,
+      const base::Closure& success_callback,
+      const base::Closure& error_callback) override;
+
+  void SimulateLocalGattDescriptorValueReadRequest(
+      BluetoothLocalGattService* service,
+      BluetoothLocalGattDescriptor* descriptor,
+      const BluetoothLocalGattService::Delegate::ValueCallback& value_callback,
+      const base::Closure& error_callback) override;
+  void SimulateLocalGattDescriptorValueWriteRequest(
+      BluetoothLocalGattService* service,
+      BluetoothLocalGattDescriptor* descriptor,
+      const std::vector<uint8_t>& value_to_write,
+      const base::Closure& success_callback,
+      const base::Closure& error_callback) override;
+
  private:
   bluez::FakeBluetoothDeviceClient* fake_bluetooth_device_client_;
 };
diff --git a/device/bluetooth/test/bluetooth_test_win.cc b/device/bluetooth/test/bluetooth_test_win.cc
index 23ea410f..552148a 100644
--- a/device/bluetooth/test/bluetooth_test_win.cc
+++ b/device/bluetooth/test/bluetooth_test_win.cc
@@ -381,6 +381,17 @@
   FinishPendingTasks();
 }
 
+void BluetoothTestWin::SimulateGattNotifySessionStartError(
+    BluetoothRemoteGattCharacteristic* characteristic,
+    BluetoothRemoteGattService::GattErrorCode error_code) {
+  win::GattCharacteristic* simulated_characteristic =
+      GetSimulatedCharacteristic(characteristic);
+  DCHECK(simulated_characteristic);
+  DCHECK(error_code == BluetoothRemoteGattService::GATT_ERROR_UNKNOWN);
+  fake_bt_le_wrapper_->SimulateGattCharacteristicSetNotifyError(
+      simulated_characteristic, E_BLUETOOTH_ATT_UNKNOWN_ERROR);
+}
+
 void BluetoothTestWin::SimulateGattCharacteristicChanged(
     BluetoothRemoteGattCharacteristic* characteristic,
     const std::vector<uint8_t>& value) {
diff --git a/device/bluetooth/test/bluetooth_test_win.h b/device/bluetooth/test/bluetooth_test_win.h
index 9bc46a6..c590288 100644
--- a/device/bluetooth/test/bluetooth_test_win.h
+++ b/device/bluetooth/test/bluetooth_test_win.h
@@ -62,6 +62,9 @@
                               const std::string& uuid) override;
   void SimulateGattNotifySessionStarted(
       BluetoothRemoteGattCharacteristic* characteristic) override;
+  void SimulateGattNotifySessionStartError(
+      BluetoothRemoteGattCharacteristic* characteristic,
+      BluetoothRemoteGattService::GattErrorCode error_code) override;
   void SimulateGattCharacteristicChanged(
       BluetoothRemoteGattCharacteristic* characteristic,
       const std::vector<uint8_t>& value) override;
diff --git a/device/bluetooth/test/test_bluetooth_local_gatt_service_delegate.cc b/device/bluetooth/test/test_bluetooth_local_gatt_service_delegate.cc
new file mode 100644
index 0000000..c96c1a4
--- /dev/null
+++ b/device/bluetooth/test/test_bluetooth_local_gatt_service_delegate.cc
@@ -0,0 +1,83 @@
+// Copyright 2016 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 <device/bluetooth/test/test_bluetooth_local_gatt_service_delegate.h>
+#include "base/callback.h"
+#include "device/bluetooth/test/bluetooth_gatt_server_test.h"
+
+namespace device {
+
+TestBluetoothLocalGattServiceDelegate::TestBluetoothLocalGattServiceDelegate()
+    : should_fail_(false),
+      last_written_value_(0),
+      value_to_write_(0),
+      expected_service_(nullptr),
+      expected_characteristic_(nullptr),
+      expected_descriptor_(nullptr) {}
+
+void TestBluetoothLocalGattServiceDelegate::OnCharacteristicReadRequest(
+    const BluetoothLocalGattService* service,
+    const BluetoothLocalGattCharacteristic* characteristic,
+    int offset,
+    const ValueCallback& callback,
+    const ErrorCallback& error_callback) {
+  EXPECT_EQ(expected_service_, service);
+  EXPECT_EQ(expected_characteristic_, characteristic);
+  if (should_fail_) {
+    error_callback.Run();
+    return;
+  }
+  callback.Run(BluetoothGattServerTest::GetValue(value_to_write_));
+}
+
+void TestBluetoothLocalGattServiceDelegate::OnCharacteristicWriteRequest(
+    const BluetoothLocalGattService* service,
+    const BluetoothLocalGattCharacteristic* characteristic,
+    const std::vector<uint8_t>& value,
+    int offset,
+    const base::Closure& callback,
+    const ErrorCallback& error_callback) {
+  EXPECT_EQ(expected_service_, service);
+  EXPECT_EQ(expected_characteristic_, characteristic);
+  if (should_fail_) {
+    error_callback.Run();
+    return;
+  }
+  last_written_value_ = BluetoothGattServerTest::GetInteger(value);
+  callback.Run();
+}
+
+void TestBluetoothLocalGattServiceDelegate::OnDescriptorReadRequest(
+    const BluetoothLocalGattService* service,
+    const BluetoothLocalGattDescriptor* descriptor,
+    int offset,
+    const ValueCallback& callback,
+    const ErrorCallback& error_callback) {
+  EXPECT_EQ(expected_service_, service);
+  EXPECT_EQ(expected_descriptor_, descriptor);
+  if (should_fail_) {
+    error_callback.Run();
+    return;
+  }
+  callback.Run(BluetoothGattServerTest::GetValue(value_to_write_));
+}
+
+void TestBluetoothLocalGattServiceDelegate::OnDescriptorWriteRequest(
+    const BluetoothLocalGattService* service,
+    const BluetoothLocalGattDescriptor* descriptor,
+    const std::vector<uint8_t>& value,
+    int offset,
+    const base::Closure& callback,
+    const ErrorCallback& error_callback) {
+  EXPECT_EQ(expected_service_, service);
+  EXPECT_EQ(expected_descriptor_, descriptor);
+  if (should_fail_) {
+    error_callback.Run();
+    return;
+  }
+  last_written_value_ = BluetoothGattServerTest::GetInteger(value);
+  callback.Run();
+}
+
+}  // namespace device
diff --git a/device/bluetooth/test/test_bluetooth_local_gatt_service_delegate.h b/device/bluetooth/test/test_bluetooth_local_gatt_service_delegate.h
new file mode 100644
index 0000000..dec6c7a
--- /dev/null
+++ b/device/bluetooth/test/test_bluetooth_local_gatt_service_delegate.h
@@ -0,0 +1,77 @@
+// Copyright 2016 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 DEVICE_BLUETOOTH_TEST_TEST_BLUETOOTH_LOCAL_GATT_SERVICE_DELEGATE_H_
+#define DEVICE_BLUETOOTH_TEST_TEST_BLUETOOTH_LOCAL_GATT_SERVICE_DELEGATE_H_
+
+#include <cstdint>
+#include <vector>
+
+#include "base/callback_forward.h"
+#include "base/macros.h"
+#include "device/bluetooth/bluetooth_local_gatt_characteristic.h"
+#include "device/bluetooth/bluetooth_local_gatt_descriptor.h"
+#include "device/bluetooth/bluetooth_local_gatt_service.h"
+
+namespace device {
+
+class TestBluetoothLocalGattServiceDelegate
+    : public BluetoothLocalGattService::Delegate {
+ public:
+  TestBluetoothLocalGattServiceDelegate();
+
+  void OnCharacteristicReadRequest(
+      const BluetoothLocalGattService* service,
+      const BluetoothLocalGattCharacteristic* characteristic,
+      int offset,
+      const ValueCallback& callback,
+      const ErrorCallback& error_callback) override;
+  void OnCharacteristicWriteRequest(
+      const BluetoothLocalGattService* service,
+      const BluetoothLocalGattCharacteristic* characteristic,
+      const std::vector<uint8_t>& value,
+      int offset,
+      const base::Closure& callback,
+      const ErrorCallback& error_callback) override;
+  void OnDescriptorReadRequest(const BluetoothLocalGattService* service,
+                               const BluetoothLocalGattDescriptor* descriptor,
+                               int offset,
+                               const ValueCallback& callback,
+                               const ErrorCallback& error_callback) override;
+
+  void OnDescriptorWriteRequest(const BluetoothLocalGattService* service,
+                                const BluetoothLocalGattDescriptor* descriptor,
+                                const std::vector<uint8_t>& value,
+                                int offset,
+                                const base::Closure& callback,
+                                const ErrorCallback& error_callback) override;
+
+  void set_expected_service(BluetoothLocalGattService* service) {
+    expected_service_ = service;
+  }
+
+  void set_expected_characteristic(
+      BluetoothLocalGattCharacteristic* characteristic) {
+    expected_characteristic_ = characteristic;
+  }
+
+  void set_expected_descriptor(BluetoothLocalGattDescriptor* descriptor) {
+    expected_descriptor_ = descriptor;
+  }
+
+  bool should_fail_;
+  uint64_t last_written_value_;
+  uint64_t value_to_write_;
+
+ private:
+  BluetoothLocalGattService* expected_service_;
+  BluetoothLocalGattCharacteristic* expected_characteristic_;
+  BluetoothLocalGattDescriptor* expected_descriptor_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestBluetoothLocalGattServiceDelegate);
+};
+
+}  // namespace device
+
+#endif  // DEVICE_BLUETOOTH_TEST_TEST_BLUETOOTH_LOCAL_GATT_SERVICE_DELEGATE_H_
diff --git a/device/device_tests.gyp b/device/device_tests.gyp
index 6908207f..4f40cb2 100644
--- a/device/device_tests.gyp
+++ b/device/device_tests.gyp
@@ -44,6 +44,8 @@
         'bluetooth/bluetooth_device_unittest.cc',
         'bluetooth/bluetooth_device_win_unittest.cc',
         'bluetooth/bluetooth_discovery_filter_unittest.cc',
+        'bluetooth/bluetooth_local_gatt_characteristic_unittest.cc',
+        'bluetooth/bluetooth_local_gatt_descriptor_unittest.cc',
         'bluetooth/bluetooth_low_energy_win_unittest.cc',
         'bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc',
         'bluetooth/bluetooth_remote_gatt_descriptor_unittest.cc',
@@ -51,6 +53,8 @@
         'bluetooth/bluetooth_service_record_win_unittest.cc',
         'bluetooth/bluetooth_task_manager_win_unittest.cc',
         'bluetooth/bluetooth_uuid_unittest.cc',
+        'bluetooth/test/bluetooth_gatt_server_test.cc',
+        'bluetooth/test/bluetooth_gatt_server_test.h',
         'bluetooth/test/bluetooth_test.cc',
         'bluetooth/test/bluetooth_test.h',
         'bluetooth/test/bluetooth_test_android.cc',
@@ -65,6 +69,8 @@
         'bluetooth/test/mock_bluetooth_central_manager_mac.h',
         'bluetooth/test/test_bluetooth_adapter_observer.cc',
         'bluetooth/test/test_bluetooth_adapter_observer.h',
+        'bluetooth/test/test_bluetooth_local_gatt_service_delegate.cc',
+        'bluetooth/test/test_bluetooth_local_gatt_service_delegate.h',
         'hid/hid_connection_unittest.cc',
         'hid/hid_device_filter_unittest.cc',
         'hid/hid_report_descriptor_unittest.cc',
diff --git a/docs/closure_compilation.md b/docs/closure_compilation.md
index bc1cabd3..5ba5e05 100644
--- a/docs/closure_compilation.md
+++ b/docs/closure_compilation.md
@@ -1,73 +1,67 @@
 # Closure Compilation
 
-## I just need to fix the compile!
+## What is type safety?
 
-### Pre-requisites
+[Strongly-typed languages](https://en.wikipedia.org/wiki/Strong_and_weak_typing)
+like C++ and Java have the notion of variable types.
 
-You'll need Java 7 (preferably the OpenJDK version).  To install on Ubuntu:
+This is typically baked into how you declare variables:
 
-```shell
-sudo apt-get install openjdk-7-jre
+```c++
+const int32 kUniversalAnswer = 42;  // type = 32-bit integer
 ```
 
-On Mac or Windows, visit:
-[http://www.oracle.com/technetwork/java/javase/downloads/index.html](http://www.oracle.com/technetwork/java/javase/downloads/index.html)
+or as [templates](https://en.wikipedia.org/wiki/Template_metaprogramming) for
+containers or generics:
 
-### Using ninja to compile the code
-
-To compile the JavaScript, run this script:
-
-```shell
-third_party/closure_compiler/run_compiler
+```c++
+std::vector<int64> fibonacci_numbers;  // a vector of 64-bit integers
 ```
 
-The output should look something like this:
+When differently-typed variables interact with each other, the compiler can warn
+you if there's no sane default action to take.
 
-```shell
-ninja: Entering directory `out/Default/'
-[30/106] ACTION Compiling chrome/browser/resources/md_history/constants.js
+Typing can also be manually annotated via mechanisms like `dynamic_cast` and
+`static_cast` or older C-style casts (i.e. `(Type)`).
+
+Using stongly-typed languages provide _some_ level of protection against
+accidentally using variables in the wrong context.
+
+JavaScript is weakly-typed and doesn't offer this safety by default. This makes
+writing JavaScript more error prone, and various type errors have resulted in
+real bugs seen by many users.
+
+## Chrome's solution to typechecking JavaScript
+
+Enter [Closure Compiler](https://developers.google.com/closure/compiler/), a
+tool for analyzing JavaScript and checking for syntax errors, variable
+references, and other common JavaScript pitfalls.
+
+To get the fullest type safety possible, it's often required to annotate your
+JavaScript explicitly with [Closure-flavored @jsdoc
+tags](https://developers.google.com/closure/compiler/docs/js-for-compiler)
+
+```js
+/**
+ * @param {string} version A software version number (i.e. "50.0.2661.94").
+ * @return {!Array<number>} Numbers corresponing to |version| (i.e. [50, 0, 2661, 94]).
+ */
+function versionSplit(version) {
+  return version.split('.').map(Number);
+}
 ```
 
-To compile only a specific target, add an argument after the script name:
-
-```shell
-third_party/closure_compiler/run_compiler people_page
-```
-
-## Background
-
-In C++ and Java, compiling the code gives you _some_ level of protection against
-misusing variables based on their type information. JavaScript is loosely typed
-and therefore doesn't offer this safety. This makes writing JavaScript more
-error prone as it's _one more thing_ to mess up.
-
-Because having this safety is handy, Chrome now has a way to optionally
-typecheck your JavaScript and produce compiled output with
-[Closure Compiler](https://developers.google.com/closure/compiler/).
-The type information is
-[annotated in comment tags](https://developers.google.com/closure/compiler/docs/js-for-compiler)
-that are briefly described below.
-
 See also:
 [the design doc](https://docs.google.com/a/chromium.org/document/d/1Ee9ggmp6U-lM-w9WmxN5cSLkK9B5YAq14939Woo-JY0/edit).
 
-## Assumptions
-
-A working Chrome checkout. See here:
-https://www.chromium.org/developers/how-tos/get-the-code
-
 ## Typechecking Your Javascript
 
-So you'd like to compile your JavaScript!
+Given an example file structure of:
 
-Maybe you're working on a page that looks like this:
+  + lib/does_the_hard_stuff.js
+  + ui/makes_things_pretty.js
 
-```html
-<script src="other_file.js"></script>
-<script src="my_product/my_file.js"></script>
-```
-
-Where `other_file.js` contains:
+`lib/does_the_hard_stuff.js`:
 
 ```javascript
 var wit = 100;
@@ -77,18 +71,22 @@
 wit += ' IQ';  // '100 IQ'
 ```
 
-and `src/my_product/my_file.js` contains:
+`ui/makes_things_pretty.js`:
 
 ```javascript
 /** @type {number} */ var mensa = wit + 50;
+
 alert(mensa);  // '100 IQ50' instead of 150
 ```
 
-In order to check that our code acts as we'd expect, we can create a
+Closure compiler can notify us if we're using `string`s and `number`s in
+dangerous ways.
 
-    my_project/compiled_resources2.gyp
+To do this, we can create:
 
-with the contents:
+  + ui/compiled_resources2.gyp
+
+With these contents:
 
 ```
 # Copyright 2016 The Chromium Authors. All rights reserved.
@@ -97,36 +95,89 @@
 {
   'targets': [
     {
-      'target_name': 'my_file',  # file name without ".js"
-      'dependencies': [  # No need to specify empty lists.
-        '../compiled_resources2.gyp:other_file',
-        '<(EXTERNS_GYP):any_needed_externs'  # e.g. chrome.send(), chrome.app.window, etc.
+      # Target names is typically just without ".js"
+      'target_name': 'makes_things_pretty',
+
+      'dependencies': [
+        '../lib/compiled_resources2.gyp:does_the_hard_stuff',
+
+        # Teaches closure about non-standard environments/APIs, e.g.
+        # chrome.send(), chrome.app.window, etc.
+        '<(EXTERNS_GYP):extern_name_goes_here'
       ],
-      'includes': ['../third_party/closure_compiler/compile_js2.gypi'],
+
+      'includes': ['../path/to/third_party/closure_compiler/compile_js2.gypi'],
     },
   ],
 }
 ```
 
-You should get results like:
+## Running Closure compiler locally
+
+You can locally test that your code compiles on Linux or Mac.  This requires
+[Java](http://www.oracle.com/technetwork/java/javase/downloads/index.html) and a
+[Chrome checkout](http://www.chromium.org/developers/how-tos/get-the-code) (i.e.
+python, depot_tools). Note: on Ubuntu, you can probably just run `sudo apt-get
+install openjdk-7-jre`.
+
+Now you should be able to run:
+
+```shell
+third_party/closure_compiler/run_compiler
+```
+
+and should see output like this:
+
+```shell
+ninja: Entering directory `out/Default/'
+[0/1] ACTION Compiling ui/makes_things_pretty.js
+```
+
+To compile only a specific target, add an argument after the script name:
+
+```shell
+third_party/closure_compiler/run_compiler makes_things_pretty
+```
+
+In our example code, this error should appear:
 
 ```
-(ERROR) Error in: my_project/my_file.js
-## /my/home/chromium/src/my_project/my_file.js:1: ERROR - initializing variable
+(ERROR) Error in: ui/makes_things_pretty.js
+## /my/home/chromium/src/ui/makes_things_pretty.js:1: ERROR - initializing variable
 ## found   : string
 ## required: number
 ## /** @type {number} */ var mensa = wit + 50;
 ##                                   ^
 ```
 
-Yay! We can easily find our unexpected type errors and write less error-prone
-code!
+Hooray! We can catch type errors in JavaScript!
 
-## Continuous Checking
+## Trying your change
 
-To compile your code on every commit, add a line to
-/third_party/closure_compiler/compiled_resources.gyp
-like this:
+Closure compilation also has [try
+bots](https://build.chromium.org/p/tryserver.chromium.linux/builders/closure_compilation)
+which can check whether you could *would* break the build if it was committed.
+
+From the command line, you try your change with:
+
+```shell
+git cl try -b closure_compilation
+```
+
+To automatically check that your code typechecks cleanly before submitting, you
+can add this line to your CL description:
+
+```
+CQ_INCLUDE_TRYBOTS=tryserver.chromium.linux:closure_compilation
+```
+
+Working in common resource directories in Chrome automatically adds this line
+for you.
+
+## Integrating with the continuous build
+
+To compile your code on every commit, add your file to the `'dependencies'` list
+in `src/third_party/closure_compiler/compiled_resources2.gyp`:
 
 ```
 {
@@ -142,158 +193,6 @@
 }
 ```
 
-and the
+This file is used by the
 [Closure compiler bot](http://build.chromium.org/p/chromium.fyi/builders/Closure%20Compilation%20Linux)
-will [re-]compile your code whenever relevant .js files change.
-
-## Using Compiled JavaScript
-
-Compiled JavaScript is output in
-`src/out/<Debug|Release>/gen/closure/my_project/my_file.js` along with a source
-map for use in debugging. In order to use the compiled JavaScript, we can create
-a
-
-    my_project/my_project_resources.gyp
-
-with the contents:
-
-```
-# Copyright 2015 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.
-
-{
-  'targets': [
-    {
-      # GN version: //my_project/resources
-      'target_name': 'my_project_resources',
-      'type': 'none',
-      'variables': {
-        'grit_out_dir': '<(SHARED_INTERMEDIATE_DIR)/my_project',
-        'my_file_gen_js': '<(SHARED_INTERMEDIATE_DIR)/closure/my_project/my_file.js',
-      },
-      'actions': [
-        {
-          # GN version: //my_project/resources:my_project_resources
-          'action_name': 'generate_my_project_resources',
-          'variables': {
-            'grit_grd_file': 'resources/my_project_resources.grd',
-            'grit_additional_defines': [
-              '-E', 'my_file_gen_js=<(my_file_gen_js)',
-            ],
-          },
-          'includes': [ '../build/grit_action.gypi' ],
-        },
-      ],
-      'includes': [ '../build/grit_target.gypi' ],
-    },
-  ],
-}
-```
-
-The variables can also be defined in an existing .gyp file if appropriate. The
-variables can then be used in to create a
-
-    my_project/my_project_resources.grd
-
-with the contents:
-
-```
-<?xml version="1.0" encoding="utf-8"?>
-<grit-part>
-  <include name="IDR_MY_FILE_GEN_JS" file="${my_file_gen_js}" use_base_dir="false" type="BINDATA" />
-</grit-part>
-```
-
-In your C++, the resource can be retrieved like this:
-
-```
-base::string16 my_script =
-    base::UTF8ToUTF16(
-        ResourceBundle::GetSharedInstance()
-            .GetRawDataResource(IDR_MY_FILE_GEN_JS)
-            .as_string());
-```
-
-## Debugging Compiled JavaScript
-
-Along with the compiled JavaScript, a source map is created:
-`src/out/<Debug|Release>/gen/closure/my_project/my_file.js.map`
-
-Chrome DevTools has built in support for working with source maps:
-https://developer.chrome.com/devtools/docs/javascript-debugging#source-maps
-
-In order to use the source map, you must first manually edit the path to the
-'sources' in the .js.map file that was generated. For example, if the source map
-looks like this:
-
-```
-{
-"version":3,
-"file":"/tmp/gen/test_script.js",
-"lineCount":1,
-"mappings":"A,aAAA,IAAIA,OAASA,QAAQ,EAAG,CACtBC,KAAA,CAAM,OAAN,CADsB;",
-"sources":["/tmp/tmp70_QUi"],
-"names":["fooBar","alert"]
-}
-```
-
-sources should be changed to:
-
-```
-...
-"sources":["/tmp/test_script.js"],
-...
-```
-
-In your browser, the source map can be loaded through the Chrome DevTools
-context menu that appears when you right click in the compiled JavaScript source
-body. A dialog will pop up prompting you for the path to the source map file.
-Once the source map is loaded, the uncompiled version of the JavaScript will
-appear in the Sources panel on the left. You can set break points in the
-uncompiled version to help debug; behind the scenes Chrome will still be running
-the compiled version of the JavaScript.
-
-## Additional Arguments
-
-`compile_js.gypi` accepts an optional `script_args` variable, which passes
-additional arguments to `compile.py`, as well as an optional `closure_args`
-variable, which passes additional arguments to the closure compiler. You may
-also override the `disabled_closure_args` for more strict compilation.
-
-For example, if you would like to specify multiple sources, strict compilation,
-and an output wrapper, you would create a
-
-```
-my_project/compiled_resources.gyp
-```
-
-with contents similar to this:
-
-```
-# Copyright 2015 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.
-{
-  'targets' :[
-    {
-      'target_name': 'my_file',
-      'variables': {
-        'source_files': [
-          'my_file.js',
-          'my_file2.js',
-        ],
-        'script_args': ['--no-single-file'], # required to process multiple files at once
-        'closure_args': [
-          'output_wrapper=\'(function(){%output%})();\'',
-          'jscomp_error=reportUnknownTypes',     # the following three provide more strict compilation
-          'jscomp_error=duplicate',
-          'jscomp_error=misplacedTypeAnnotation',
-        ],
-        'disabled_closure_args': [], # remove the disabled closure args for more strict compilation
-      },
-      'includes': ['../third_party/closure_compiler/compile_js.gypi'],
-    },
-  ],
-}
-```
+to automatically compile your code on every commit.
diff --git a/extensions/browser/api/system_display/system_display_apitest.cc b/extensions/browser/api/system_display/system_display_apitest.cc
index a9f24c2..bdca5c3 100644
--- a/extensions/browser/api/system_display/system_display_apitest.cc
+++ b/extensions/browser/api/system_display/system_display_apitest.cc
@@ -40,9 +40,7 @@
  protected:
   // Overridden from display::Screen:
   gfx::Point GetCursorScreenPoint() override { return gfx::Point(); }
-  gfx::NativeWindow GetWindowUnderCursor() override {
-    return gfx::NativeWindow();
-  }
+  bool IsWindowUnderCursor(gfx::NativeWindow window) override { return false; }
   gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override {
     return gfx::NativeWindow();
   }
diff --git a/extensions/browser/api/system_network/system_network_api.cc b/extensions/browser/api/system_network/system_network_api.cc
index 0b196bd6..ece1ebb 100644
--- a/extensions/browser/api/system_network/system_network_api.cc
+++ b/extensions/browser/api/system_network/system_network_api.cc
@@ -4,8 +4,6 @@
 
 #include "extensions/browser/api/system_network/system_network_api.h"
 
-#include "net/base/ip_address_number.h"
-
 namespace {
 const char kNetworkListError[] = "Network lookup failed or unsupported";
 }  // namespace
diff --git a/extensions/browser/extension_function.cc b/extensions/browser/extension_function.cc
index 5c6319fa..fd7bae9 100644
--- a/extensions/browser/extension_function.cc
+++ b/extensions/browser/extension_function.cc
@@ -10,6 +10,7 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/singleton.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/synchronization/lock.h"
 #include "content/public/browser/notification_source.h"
 #include "content/public/browser/notification_types.h"
@@ -406,6 +407,20 @@
     results_.reset(new base::ListValue());
 
   response_callback_.Run(type, *results_, GetError(), histogram_value());
+
+  // TODO(devlin): Once we have a baseline metric for how long functions take,
+  // we can create a handful of buckets and record the function name so that we
+  // can find what the fastest/slowest are. See crbug.com/608561.
+  // Note: Certain functions perform actions that are inherently slow - such as
+  // anything waiting on user action. As such, we can't always assume that a
+  // long execution time equates to a poorly-performing function.
+  if (success) {
+    UMA_HISTOGRAM_TIMES("Extensions.Functions.SucceededTotalExecutionTime",
+                        timer_.Elapsed());
+  } else {
+    UMA_HISTOGRAM_TIMES("Extensions.Functions.FailedTotalExecutionTime",
+                        timer_.Elapsed());
+  }
 }
 
 void ExtensionFunction::OnRespondingLater(ResponseValue value) {
diff --git a/extensions/browser/extension_function.h b/extensions/browser/extension_function.h
index dfcefadc4..0bf87641 100644
--- a/extensions/browser/extension_function.h
+++ b/extensions/browser/extension_function.h
@@ -18,6 +18,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/process/process.h"
 #include "base/sequenced_task_runner_helpers.h"
+#include "base/timer/elapsed_timer.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/console_message_level.h"
 #include "extensions/browser/extension_function_histogram_value.h"
@@ -440,6 +441,8 @@
   int source_process_id_;
 
  private:
+  base::ElapsedTimer timer_;
+
   void OnRespondingLater(ResponseValue response);
 
   DISALLOW_COPY_AND_ASSIGN(ExtensionFunction);
diff --git a/extensions/browser/extension_function_dispatcher.cc b/extensions/browser/extension_function_dispatcher.cc
index db94833e..5f4d0df 100644
--- a/extensions/browser/extension_function_dispatcher.cc
+++ b/extensions/browser/extension_function_dispatcher.cc
@@ -292,7 +292,16 @@
     tracked_objects::ScopedProfile scoped_profile(
         FROM_HERE_WITH_EXPLICIT_FUNCTION(function->name()),
         tracked_objects::ScopedProfile::ENABLED);
+    base::ElapsedTimer timer;
     function->Run()->Execute();
+    // TODO(devlin): Once we have a baseline metric for how long functions take,
+    // we can create a handful of buckets and record the function name so that
+    // we can find what the fastest/slowest are.
+    // Note: Many functions execute finish asynchronously, so this time is not
+    // always a representation of total time taken. See also
+    // Extensions.Functions.TotalExecutionTime.
+    UMA_HISTOGRAM_TIMES("Extensions.Functions.SynchronousExecutionTime",
+                        timer.Elapsed());
   } else {
     function->OnQuotaExceeded(violation_error);
   }
@@ -402,7 +411,16 @@
     tracked_objects::ScopedProfile scoped_profile(
         FROM_HERE_WITH_EXPLICIT_FUNCTION(function->name()),
         tracked_objects::ScopedProfile::ENABLED);
+    base::ElapsedTimer timer;
     function->Run()->Execute();
+    // TODO(devlin): Once we have a baseline metric for how long functions take,
+    // we can create a handful of buckets and record the function name so that
+    // we can find what the fastest/slowest are.
+    // Note: Many functions execute finish asynchronously, so this time is not
+    // always a representation of total time taken. See also
+    // Extensions.Functions.TotalExecutionTime.
+    UMA_HISTOGRAM_TIMES("Extensions.Functions.SynchronousExecutionTime",
+                        timer.Elapsed());
   } else {
     function->OnQuotaExceeded(violation_error);
   }
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index 85c2825..5c54880 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1179,6 +1179,7 @@
   PASSWORDSPRIVATE_GETSAVEDPASSWORDLIST,
   PASSWORDSPRIVATE_GETPASSWORDEXCEPTIONLIST,
   INPUTMETHODPRIVATE_OPENOPTIONSPAGE,
+  FEEDBACKPRIVATE_LOGSRTPROMPTRESULT,
   // Last entry: Add new entries above, then run:
   // python tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/browser/value_store/leveldb_value_store.cc b/extensions/browser/value_store/leveldb_value_store.cc
index 8ab753e4..3a63af2 100644
--- a/extensions/browser/value_store/leveldb_value_store.cc
+++ b/extensions/browser/value_store/leveldb_value_store.cc
@@ -193,7 +193,7 @@
       return MakeWriteResult(status);
 
     if (old_value) {
-      changes->push_back(ValueStoreChange(key, old_value.release(), NULL));
+      changes->push_back(ValueStoreChange(key, std::move(old_value), nullptr));
       batch.Delete(key);
     }
   }
@@ -220,7 +220,8 @@
     std::string next_key = base::DictionaryValue::Iterator(whole_db).key();
     std::unique_ptr<base::Value> next_value;
     whole_db.RemoveWithoutPathExpansion(next_key, &next_value);
-    changes->push_back(ValueStoreChange(next_key, next_value.release(), NULL));
+    changes->push_back(
+        ValueStoreChange(next_key, std::move(next_value), nullptr));
   }
 
   DeleteDbFile();
@@ -280,7 +281,7 @@
       return status;
     if (!old_value || !old_value->Equals(&value)) {
       changes->push_back(
-          ValueStoreChange(key, old_value.release(), value.DeepCopy()));
+          ValueStoreChange(key, std::move(old_value), value.CreateDeepCopy()));
     } else {
       write_new_value = false;
     }
diff --git a/extensions/browser/value_store/testing_value_store.cc b/extensions/browser/value_store/testing_value_store.cc
index 5c719de..039d6c8 100644
--- a/extensions/browser/value_store/testing_value_store.cc
+++ b/extensions/browser/value_store/testing_value_store.cc
@@ -57,7 +57,7 @@
       it != keys.end(); ++it) {
     base::Value* value = NULL;
     if (storage_.GetWithoutPathExpansion(*it, &value)) {
-      settings->SetWithoutPathExpansion(*it, value->DeepCopy());
+      settings->SetWithoutPathExpansion(*it, value->CreateDeepCopy());
     }
   }
   return MakeReadResult(base::WrapUnique(settings), status_);
@@ -67,13 +67,13 @@
   read_count_++;
   if (!status_.ok())
     return MakeReadResult(status_);
-  return MakeReadResult(base::WrapUnique(storage_.DeepCopy()), status_);
+  return MakeReadResult(storage_.CreateDeepCopy(), status_);
 }
 
 ValueStore::WriteResult TestingValueStore::Set(
     WriteOptions options, const std::string& key, const base::Value& value) {
   base::DictionaryValue settings;
-  settings.SetWithoutPathExpansion(key, value.DeepCopy());
+  settings.SetWithoutPathExpansion(key, value.CreateDeepCopy());
   return Set(options, settings);
 }
 
@@ -89,12 +89,10 @@
     base::Value* old_value = NULL;
     if (!storage_.GetWithoutPathExpansion(it.key(), &old_value) ||
         !old_value->Equals(&it.value())) {
-      changes->push_back(
-          ValueStoreChange(
-              it.key(),
-              old_value ? old_value->DeepCopy() : old_value,
-              it.value().DeepCopy()));
-      storage_.SetWithoutPathExpansion(it.key(), it.value().DeepCopy());
+      changes->push_back(ValueStoreChange(
+          it.key(), old_value ? old_value->CreateDeepCopy() : nullptr,
+          it.value().CreateDeepCopy()));
+      storage_.SetWithoutPathExpansion(it.key(), it.value().CreateDeepCopy());
     }
   }
   return MakeWriteResult(std::move(changes), status_);
@@ -115,7 +113,7 @@
       it != keys.end(); ++it) {
     std::unique_ptr<base::Value> old_value;
     if (storage_.RemoveWithoutPathExpansion(*it, &old_value)) {
-      changes->push_back(ValueStoreChange(*it, old_value.release(), NULL));
+      changes->push_back(ValueStoreChange(*it, std::move(old_value), nullptr));
     }
   }
   return MakeWriteResult(std::move(changes), status_);
diff --git a/extensions/browser/value_store/value_store_change.cc b/extensions/browser/value_store/value_store_change.cc
index 3bbad59..423eb06 100644
--- a/extensions/browser/value_store/value_store_change.cc
+++ b/extensions/browser/value_store/value_store_change.cc
@@ -4,8 +4,11 @@
 
 #include "extensions/browser/value_store/value_store_change.h"
 
+#include <utility>
+
 #include "base/json/json_writer.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 
 // static
 std::string ValueStoreChange::ToJson(
@@ -27,9 +30,10 @@
   return json;
 }
 
-ValueStoreChange::ValueStoreChange(
-    const std::string& key, base::Value* old_value, base::Value* new_value)
-    : inner_(new Inner(key, old_value, new_value)) {}
+ValueStoreChange::ValueStoreChange(const std::string& key,
+                                   std::unique_ptr<base::Value> old_value,
+                                   std::unique_ptr<base::Value> new_value)
+    : inner_(new Inner(key, std::move(old_value), std::move(new_value))) {}
 
 ValueStoreChange::ValueStoreChange(const ValueStoreChange& other) = default;
 
@@ -50,8 +54,11 @@
   return inner_->new_value_.get();
 }
 
-ValueStoreChange::Inner::Inner(
-    const std::string& key, base::Value* old_value, base::Value* new_value)
-    : key_(key), old_value_(old_value), new_value_(new_value) {}
+ValueStoreChange::Inner::Inner(const std::string& key,
+                               std::unique_ptr<base::Value> old_value,
+                               std::unique_ptr<base::Value> new_value)
+    : key_(key),
+      old_value_(std::move(old_value)),
+      new_value_(std::move(new_value)) {}
 
 ValueStoreChange::Inner::~Inner() {}
diff --git a/extensions/browser/value_store/value_store_change.h b/extensions/browser/value_store/value_store_change.h
index 28dc3acc..8645b57 100644
--- a/extensions/browser/value_store/value_store_change.h
+++ b/extensions/browser/value_store/value_store_change.h
@@ -22,9 +22,9 @@
   // { "foo": { "key": "foo", "oldValue": "bar", "newValue": "baz" } }
   static std::string ToJson(const ValueStoreChangeList& changes);
 
-  // Ownership of |old_value| and |new_value| taken.
-  ValueStoreChange(
-      const std::string& key, base::Value* old_value, base::Value* new_value);
+  ValueStoreChange(const std::string& key,
+                   std::unique_ptr<base::Value> old_value,
+                   std::unique_ptr<base::Value> new_value);
 
   ValueStoreChange(const ValueStoreChange& other);
 
@@ -44,8 +44,9 @@
  private:
   class Inner : public base::RefCountedThreadSafe<Inner> {
    public:
-    Inner(
-        const std::string& key, base::Value* old_value, base::Value* new_value);
+    Inner(const std::string& key,
+          std::unique_ptr<base::Value> old_value,
+          std::unique_ptr<base::Value> new_value);
 
     const std::string key_;
     const std::unique_ptr<base::Value> old_value_;
diff --git a/extensions/browser/value_store/value_store_change_unittest.cc b/extensions/browser/value_store/value_store_change_unittest.cc
index c7ac07e..1d92a8a2 100644
--- a/extensions/browser/value_store/value_store_change_unittest.cc
+++ b/extensions/browser/value_store/value_store_change_unittest.cc
@@ -5,6 +5,7 @@
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/values.h"
 #include "extensions/browser/value_store/value_store_change.h"
 #include "extensions/common/value_builder.h"
@@ -18,40 +19,42 @@
 namespace {
 
 TEST(ValueStoreChangeTest, NullOldValue) {
-  ValueStoreChange change("key", NULL, new base::StringValue("value"));
+  ValueStoreChange change("key", nullptr,
+                          base::WrapUnique(new base::StringValue("value")));
 
   EXPECT_EQ("key", change.key());
   EXPECT_EQ(NULL, change.old_value());
   {
-    std::unique_ptr<base::Value> expected(new base::StringValue("value"));
-    EXPECT_TRUE(change.new_value()->Equals(expected.get()));
+    base::StringValue expected("value");
+    EXPECT_TRUE(change.new_value()->Equals(&expected));
   }
 }
 
 TEST(ValueStoreChangeTest, NullNewValue) {
-  ValueStoreChange change("key", new base::StringValue("value"), NULL);
+  ValueStoreChange change(
+      "key", base::WrapUnique(new base::StringValue("value")), nullptr);
 
   EXPECT_EQ("key", change.key());
   {
-    std::unique_ptr<base::Value> expected(new base::StringValue("value"));
-    EXPECT_TRUE(change.old_value()->Equals(expected.get()));
+    base::StringValue expected("value");
+    EXPECT_TRUE(change.old_value()->Equals(&expected));
   }
   EXPECT_EQ(NULL, change.new_value());
 }
 
 TEST(ValueStoreChangeTest, NonNullValues) {
   ValueStoreChange change("key",
-                          new base::StringValue("old_value"),
-                          new base::StringValue("new_value"));
+                          base::WrapUnique(new base::StringValue("old_value")),
+                          base::WrapUnique(new base::StringValue("new_value")));
 
   EXPECT_EQ("key", change.key());
   {
-    std::unique_ptr<base::Value> expected(new base::StringValue("old_value"));
-    EXPECT_TRUE(change.old_value()->Equals(expected.get()));
+    base::StringValue expected("old_value");
+    EXPECT_TRUE(change.old_value()->Equals(&expected));
   }
   {
-    std::unique_ptr<base::Value> expected(new base::StringValue("new_value"));
-    EXPECT_TRUE(change.new_value()->Equals(expected.get()));
+    base::StringValue expected("new_value");
+    EXPECT_TRUE(change.new_value()->Equals(&expected));
   }
 }
 
@@ -66,10 +69,10 @@
           .Build();
 
   ValueStoreChangeList change_list;
-  change_list.push_back(
-      ValueStoreChange("key", value->DeepCopy(), value->DeepCopy()));
-  change_list.push_back(
-      ValueStoreChange("key.with.dots", value->DeepCopy(), value->DeepCopy()));
+  change_list.push_back(ValueStoreChange("key", value->CreateDeepCopy(),
+                                         value->CreateDeepCopy()));
+  change_list.push_back(ValueStoreChange(
+      "key.with.dots", value->CreateDeepCopy(), value->CreateDeepCopy()));
 
   std::string json = ValueStoreChange::ToJson(change_list);
   std::unique_ptr<base::Value> from_json(base::JSONReader::Read(json));
diff --git a/extensions/browser/value_store/value_store_unittest.cc b/extensions/browser/value_store/value_store_unittest.cc
index 8c5f7ae..a6858b2a 100644
--- a/extensions/browser/value_store/value_store_unittest.cc
+++ b/extensions/browser/value_store/value_store_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "extensions/browser/value_store/value_store_unittest.h"
 
+#include <utility>
+
 #include "base/json/json_writer.h"
 #include "base/memory/linked_ptr.h"
 #include "base/values.h"
@@ -156,13 +158,13 @@
   set13_.insert(list13_.begin(), list13_.end());
   set123_.insert(list123_.begin(), list123_.end());
 
-  dict1_->Set(key1_, val1_->DeepCopy());
-  dict3_->Set(key3_, val3_->DeepCopy());
-  dict12_->Set(key1_, val1_->DeepCopy());
-  dict12_->Set(key2_, val2_->DeepCopy());
-  dict123_->Set(key1_, val1_->DeepCopy());
-  dict123_->Set(key2_, val2_->DeepCopy());
-  dict123_->Set(key3_, val3_->DeepCopy());
+  dict1_->Set(key1_, val1_->CreateDeepCopy());
+  dict3_->Set(key3_, val3_->CreateDeepCopy());
+  dict12_->Set(key1_, val1_->CreateDeepCopy());
+  dict12_->Set(key2_, val2_->CreateDeepCopy());
+  dict123_->Set(key1_, val1_->CreateDeepCopy());
+  dict123_->Set(key2_, val2_->CreateDeepCopy());
+  dict123_->Set(key3_, val3_->CreateDeepCopy());
 }
 
 ValueStoreTest::~ValueStoreTest() {}
@@ -187,7 +189,8 @@
 TEST_P(ValueStoreTest, GetWithSingleValue) {
   {
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange(key1_, NULL, val1_->DeepCopy()));
+    changes.push_back(
+        ValueStoreChange(key1_, nullptr, val1_->CreateDeepCopy()));
     EXPECT_PRED_FORMAT2(ChangesEq,
         changes, storage_->Set(DEFAULTS, key1_, *val1_));
   }
@@ -203,8 +206,10 @@
 TEST_P(ValueStoreTest, GetWithMultipleValues) {
   {
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange(key1_, NULL, val1_->DeepCopy()));
-    changes.push_back(ValueStoreChange(key2_, NULL, val2_->DeepCopy()));
+    changes.push_back(
+        ValueStoreChange(key1_, nullptr, val1_->CreateDeepCopy()));
+    changes.push_back(
+        ValueStoreChange(key2_, nullptr, val2_->CreateDeepCopy()));
     EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, *dict12_));
   }
 
@@ -228,7 +233,8 @@
   storage_->Set(DEFAULTS, *dict1_);
   {
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange(key1_, val1_->DeepCopy(), NULL));
+    changes.push_back(
+        ValueStoreChange(key1_, val1_->CreateDeepCopy(), nullptr));
     EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(key1_));
   }
 
@@ -243,7 +249,8 @@
   storage_->Set(DEFAULTS, *dict123_);
   {
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange(key3_, val3_->DeepCopy(), NULL));
+    changes.push_back(
+        ValueStoreChange(key3_, val3_->CreateDeepCopy(), nullptr));
     EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(key3_));
   }
 
@@ -258,8 +265,10 @@
 
   {
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange(key1_, val1_->DeepCopy(), NULL));
-    changes.push_back(ValueStoreChange(key2_, val2_->DeepCopy(), NULL));
+    changes.push_back(
+        ValueStoreChange(key1_, val1_->CreateDeepCopy(), nullptr));
+    changes.push_back(
+        ValueStoreChange(key2_, val2_->CreateDeepCopy(), nullptr));
     EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(list12_));
   }
 
@@ -277,9 +286,10 @@
   storage_->Set(DEFAULTS, key1_, *val2_);
   {
     ValueStoreChangeList changes;
+    changes.push_back(ValueStoreChange(key1_, val2_->CreateDeepCopy(),
+                                       val1_->CreateDeepCopy()));
     changes.push_back(
-        ValueStoreChange(key1_, val2_->DeepCopy(), val1_->DeepCopy()));
-    changes.push_back(ValueStoreChange(key2_, NULL, val2_->DeepCopy()));
+        ValueStoreChange(key2_, nullptr, val2_->CreateDeepCopy()));
     EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, *dict12_));
   }
 
@@ -306,8 +316,10 @@
   storage_->Set(DEFAULTS, *dict12_);
   {
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange(key1_, val1_->DeepCopy(), NULL));
-    changes.push_back(ValueStoreChange(key2_, val2_->DeepCopy(), NULL));
+    changes.push_back(
+        ValueStoreChange(key1_, val1_->CreateDeepCopy(), nullptr));
+    changes.push_back(
+        ValueStoreChange(key2_, val2_->CreateDeepCopy(), nullptr));
     EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Clear());
   }
 
@@ -325,14 +337,14 @@
   std::vector<std::string> dot_list;
   dot_list.push_back(dot_key);
   base::DictionaryValue dot_dict;
-  dot_dict.SetWithoutPathExpansion(dot_key, dot_value.DeepCopy());
+  dot_dict.SetWithoutPathExpansion(dot_key, dot_value.CreateDeepCopy());
 
   EXPECT_PRED_FORMAT2(SettingsEq, *empty_dict_, storage_->Get(dot_key));
 
   {
     ValueStoreChangeList changes;
     changes.push_back(
-        ValueStoreChange(dot_key, NULL, dot_value.DeepCopy()));
+        ValueStoreChange(dot_key, nullptr, dot_value.CreateDeepCopy()));
     EXPECT_PRED_FORMAT2(ChangesEq,
         changes, storage_->Set(DEFAULTS, dot_key, dot_value));
   }
@@ -344,7 +356,7 @@
   {
     ValueStoreChangeList changes;
     changes.push_back(
-        ValueStoreChange(dot_key, dot_value.DeepCopy(), NULL));
+        ValueStoreChange(dot_key, dot_value.CreateDeepCopy(), nullptr));
     EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(dot_key));
   }
   EXPECT_PRED_FORMAT2(ChangesEq,
@@ -352,7 +364,7 @@
   {
     ValueStoreChangeList changes;
     changes.push_back(
-        ValueStoreChange(dot_key, NULL, dot_value.DeepCopy()));
+        ValueStoreChange(dot_key, nullptr, dot_value.CreateDeepCopy()));
     EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, dot_dict));
   }
 
@@ -362,7 +374,7 @@
   {
     ValueStoreChangeList changes;
     changes.push_back(
-        ValueStoreChange(dot_key, dot_value.DeepCopy(), NULL));
+        ValueStoreChange(dot_key, dot_value.CreateDeepCopy(), nullptr));
     EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(dot_list));
   }
 
@@ -372,16 +384,16 @@
 
 TEST_P(ValueStoreTest, DotsInKeyNamesWithDicts) {
   base::DictionaryValue outer_dict;
-  base::DictionaryValue* inner_dict = new base::DictionaryValue();
-  outer_dict.Set("foo", inner_dict);
-  inner_dict->SetString("bar", "baz");
+  base::DictionaryValue inner_dict;
+  inner_dict.SetString("bar", "baz");
+  outer_dict.Set("foo", inner_dict.CreateDeepCopy());
 
   {
     ValueStoreChangeList changes;
     changes.push_back(
-        ValueStoreChange("foo", NULL, inner_dict->DeepCopy()));
-    EXPECT_PRED_FORMAT2(ChangesEq,
-        changes, storage_->Set(DEFAULTS, outer_dict));
+        ValueStoreChange("foo", nullptr, inner_dict.CreateDeepCopy()));
+    EXPECT_PRED_FORMAT2(ChangesEq, changes,
+                        storage_->Set(DEFAULTS, outer_dict));
   }
 
   EXPECT_PRED_FORMAT2(SettingsEq, outer_dict, storage_->Get("foo"));
@@ -401,63 +413,72 @@
       ValueStoreChangeList(), storage_->Set(DEFAULTS, key1_, *val1_));
   {
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange(
-        key1_, val1_->DeepCopy(), val2_->DeepCopy()));
+    changes.push_back(ValueStoreChange(key1_, val1_->CreateDeepCopy(),
+                                       val2_->CreateDeepCopy()));
     EXPECT_PRED_FORMAT2(ChangesEq,
         changes, storage_->Set(DEFAULTS, key1_, *val2_));
   }
   {
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange(key1_, val2_->DeepCopy(), NULL));
+    changes.push_back(
+        ValueStoreChange(key1_, val2_->CreateDeepCopy(), nullptr));
     EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(key1_));
     EXPECT_PRED_FORMAT2(ChangesEq,
         ValueStoreChangeList(), storage_->Remove(key1_));
   }
   {
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange(key1_, NULL, val1_->DeepCopy()));
+    changes.push_back(
+        ValueStoreChange(key1_, nullptr, val1_->CreateDeepCopy()));
     EXPECT_PRED_FORMAT2(ChangesEq,
         changes, storage_->Set(DEFAULTS, key1_, *val1_));
   }
   {
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange(key1_, val1_->DeepCopy(), NULL));
+    changes.push_back(
+        ValueStoreChange(key1_, val1_->CreateDeepCopy(), nullptr));
     EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Clear());
     EXPECT_PRED_FORMAT2(ChangesEq, ValueStoreChangeList(), storage_->Clear());
   }
 
   {
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange(key1_, NULL, val1_->DeepCopy()));
-    changes.push_back(ValueStoreChange(key2_, NULL, val2_->DeepCopy()));
+    changes.push_back(
+        ValueStoreChange(key1_, nullptr, val1_->CreateDeepCopy()));
+    changes.push_back(
+        ValueStoreChange(key2_, nullptr, val2_->CreateDeepCopy()));
     EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, *dict12_));
     EXPECT_PRED_FORMAT2(ChangesEq,
         ValueStoreChangeList(), storage_->Set(DEFAULTS, *dict12_));
   }
   {
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange(key3_, NULL, val3_->DeepCopy()));
+    changes.push_back(
+        ValueStoreChange(key3_, nullptr, val3_->CreateDeepCopy()));
     EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, *dict123_));
   }
   {
     base::DictionaryValue to_set;
-    to_set.Set(key1_, val2_->DeepCopy());
-    to_set.Set(key2_, val2_->DeepCopy());
-    to_set.Set("asdf", val1_->DeepCopy());
-    to_set.Set("qwerty", val3_->DeepCopy());
+    to_set.Set(key1_, val2_->CreateDeepCopy());
+    to_set.Set(key2_, val2_->CreateDeepCopy());
+    to_set.Set("asdf", val1_->CreateDeepCopy());
+    to_set.Set("qwerty", val3_->CreateDeepCopy());
 
     ValueStoreChangeList changes;
+    changes.push_back(ValueStoreChange(key1_, val1_->CreateDeepCopy(),
+                                       val2_->CreateDeepCopy()));
     changes.push_back(
-        ValueStoreChange(key1_, val1_->DeepCopy(), val2_->DeepCopy()));
-    changes.push_back(ValueStoreChange("asdf", NULL, val1_->DeepCopy()));
+        ValueStoreChange("asdf", nullptr, val1_->CreateDeepCopy()));
     changes.push_back(
-        ValueStoreChange("qwerty", NULL, val3_->DeepCopy()));
+        ValueStoreChange("qwerty", nullptr, val3_->CreateDeepCopy()));
     EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Set(DEFAULTS, to_set));
   }
   {
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange(key1_, val2_->DeepCopy(), NULL));
-    changes.push_back(ValueStoreChange(key2_, val2_->DeepCopy(), NULL));
+    changes.push_back(
+        ValueStoreChange(key1_, val2_->CreateDeepCopy(), nullptr));
+    changes.push_back(
+        ValueStoreChange(key2_, val2_->CreateDeepCopy(), nullptr));
     EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(list12_));
   }
   {
@@ -466,14 +487,16 @@
     to_remove.push_back("asdf");
 
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange("asdf", val1_->DeepCopy(), NULL));
+    changes.push_back(
+        ValueStoreChange("asdf", val1_->CreateDeepCopy(), nullptr));
     EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Remove(to_remove));
   }
   {
     ValueStoreChangeList changes;
-    changes.push_back(ValueStoreChange(key3_, val3_->DeepCopy(), NULL));
     changes.push_back(
-        ValueStoreChange("qwerty", val3_->DeepCopy(), NULL));
+        ValueStoreChange(key3_, val3_->CreateDeepCopy(), nullptr));
+    changes.push_back(
+        ValueStoreChange("qwerty", val3_->CreateDeepCopy(), nullptr));
     EXPECT_PRED_FORMAT2(ChangesEq, changes, storage_->Clear());
     EXPECT_PRED_FORMAT2(ChangesEq, ValueStoreChangeList(), storage_->Clear());
   }
diff --git a/extensions/common/api/externs_checker.py b/extensions/common/api/externs_checker.py
index fd60fdd..74906bd4 100644
--- a/extensions/common/api/externs_checker.py
+++ b/extensions/common/api/externs_checker.py
@@ -18,7 +18,8 @@
 
   def RunChecks(self):
     bad_files = []
-    affected = [f.AbsoluteLocalPath() for f in self._input_api.AffectedFiles()]
+    affected = [f.AbsoluteLocalPath() for f in
+                   self._input_api.change.AffectedFiles()]
     for path in affected:
       pair = self._api_pairs.get(path)
       if pair != None and pair not in affected:
diff --git a/extensions/common/api/externs_checker_test.py b/extensions/common/api/externs_checker_test.py
index 9bcc651..a28deaf 100755
--- a/extensions/common/api/externs_checker_test.py
+++ b/extensions/common/api/externs_checker_test.py
@@ -12,7 +12,8 @@
 sys.path.append(
     os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', '..', '..'))
 
-from PRESUBMIT_test_mocks import MockInputApi, MockOutputApi, MockFile
+from PRESUBMIT_test_mocks import (MockInputApi, MockOutputApi, MockFile,
+                                  MockChange)
 
 
 class ExternsCheckerTest(unittest.TestCase):
@@ -22,6 +23,7 @@
     input_api = MockInputApi()
     input_api.os_path.exists = exists
     input_api.files = [MockFile(f, '') for f in files]
+    input_api.change = MockChange(input_api.files)
     output_api = MockOutputApi()
     checker = ExternsChecker(input_api, output_api, self.API_PAIRS)
     return checker.RunChecks()
diff --git a/extensions/renderer/api/display_source/wifi_display/wifi_display_media_manager.cc b/extensions/renderer/api/display_source/wifi_display/wifi_display_media_manager.cc
index 20070fe..9895bb0 100644
--- a/extensions/renderer/api/display_source/wifi_display/wifi_display_media_manager.cc
+++ b/extensions/renderer/api/display_source/wifi_display/wifi_display_media_manager.cc
@@ -284,26 +284,26 @@
   return false;
 }
 
-bool FindOptimalFormat(
+void FindCompatibleFormats(
     const media::VideoCaptureFormat* capture_format,
     const std::vector<wds::H264VideoCodec>& sink_supported_codecs,
-    wds::H264VideoFormat* result /*out*/) {
+    std::vector<wds::H264VideoFormat>* result /*out*/) {
   DCHECK(result);
   for (const wds::H264VideoCodec& codec : sink_supported_codecs) {
+    wds::H264VideoFormat format;
     bool found =
         FindRateResolution<wds::CEA>(
-            capture_format, codec.cea_rr, cea_table, result) ||
+            capture_format, codec.cea_rr, cea_table, &format) ||
         FindRateResolution<wds::VESA>(
-            capture_format, codec.vesa_rr, vesa_table, result) ||
+            capture_format, codec.vesa_rr, vesa_table, &format) ||
         FindRateResolution<wds::HH>(
-            capture_format, codec.hh_rr, hh_table, result);
+            capture_format, codec.hh_rr, hh_table, &format);
     if (found) {
-      result->profile = codec.profile;
-      result->level = codec.level;
-      return true;
+      format.profile = codec.profile;
+      format.level = codec.level;
+      result->emplace_back(format);
     }
   }
-  return false;
 }
 
 }  // namespace
@@ -348,11 +348,48 @@
     return false;
   }
 
-  if (!FindOptimalFormat(
-      capture_format, sink_supported_codecs, &optimal_video_format_)) {
+  std::vector<wds::H264VideoFormat> compatible_formats;
+
+  FindCompatibleFormats(
+      capture_format, sink_supported_codecs, &compatible_formats);
+
+  if (compatible_formats.empty()) {
     error_callback_.Run(kErrorSinkCannotPlayVideo);
     return false;
   }
+
+  // The found compatible formats have the same frame rate and resolution but
+  // different video encoder profiles. Pick the appropriate profile from the
+  // supported by video encoder.
+  std::vector<wds::H264Profile> supported_profiles =
+      WiFiDisplayVideoEncoder::FindSupportedProfiles(
+          capture_format->frame_size,
+          capture_format->frame_rate);
+
+  if (supported_profiles.empty()) {
+    error_callback_.Run(kErrorSinkCannotPlayVideo);
+    return false;
+  }
+
+  bool profile_found = false;
+  for (wds::H264Profile profile : supported_profiles) {
+    if (profile_found)
+      break;
+
+    for (const auto& format : compatible_formats) {
+      if (format.profile == profile) {
+         optimal_video_format_ = format;
+         profile_found = true;
+         break;
+      }
+    }
+  }
+
+  if (!profile_found) {
+    error_callback_.Run(kErrorSinkCannotPlayVideo);
+    return false;
+  }
+
   video_encoder_parameters_.frame_size = capture_format->frame_size;
   video_encoder_parameters_.frame_rate =
       static_cast<int>(capture_format->frame_rate);
diff --git a/extensions/renderer/api/display_source/wifi_display/wifi_display_video_encoder.cc b/extensions/renderer/api/display_source/wifi_display/wifi_display_video_encoder.cc
index e4ca9aff..941ecab 100644
--- a/extensions/renderer/api/display_source/wifi_display/wifi_display_video_encoder.cc
+++ b/extensions/renderer/api/display_source/wifi_display/wifi_display_video_encoder.cc
@@ -6,7 +6,7 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
-
+#include "content/public/renderer/video_encode_accelerator.h"
 #include "extensions/renderer/api/display_source/wifi_display/wifi_display_elementary_stream_descriptor.h"
 
 namespace extensions {
@@ -29,6 +29,30 @@
 WiFiDisplayVideoEncoder::~WiFiDisplayVideoEncoder() = default;
 
 // static
+std::vector<wds::H264Profile> WiFiDisplayVideoEncoder::FindSupportedProfiles(
+    const gfx::Size& frame_size,
+    int32_t frame_rate) {
+  std::vector<wds::H264Profile> result;
+  media::VideoEncodeAccelerator::SupportedProfiles profiles =
+      content::GetSupportedVideoEncodeAcceleratorProfiles();
+  for (const auto& supported : profiles) {
+    if (supported.profile == media::H264PROFILE_HIGH &&
+        supported.max_resolution.width() >= frame_size.width() &&
+        supported.max_resolution.height() >= frame_size.height() &&
+        supported.max_framerate_numerator >= uint32_t(frame_rate)) {
+      result.push_back(wds::CHP);
+      break;
+    }
+  }
+
+  // Constrained profile is provided in any case (by the software encoder
+  // implementation).
+  result.push_back(wds::CBP);
+
+  return result;
+}
+
+// static
 void WiFiDisplayVideoEncoder::Create(
     const InitParameters& params,
     const VideoEncoderCallback& encoder_callback) {
diff --git a/extensions/renderer/api/display_source/wifi_display/wifi_display_video_encoder.h b/extensions/renderer/api/display_source/wifi_display/wifi_display_video_encoder.h
index 995920f5..28b0a43 100644
--- a/extensions/renderer/api/display_source/wifi_display/wifi_display_video_encoder.h
+++ b/extensions/renderer/api/display_source/wifi_display/wifi_display_video_encoder.h
@@ -52,6 +52,13 @@
     CreateVideoEncodeAcceleratorCallback vea_create_callback;
   };
 
+  // Returns the list of supported video encoder profiles
+  // for the given frame size and frame rate.
+  // If hight profile is supported it is to be first in the list.
+  static std::vector<wds::H264Profile> FindSupportedProfiles(
+      const gfx::Size& frame_size,
+      int32_t frame_rate);
+
   // A factory method that creates a new encoder instance from the given
   // |params|, the encoder instance is returned as an argument of
   // |result_callback| ('nullptr' argument means encoder creation failure).
diff --git a/extensions/renderer/api/display_source/wifi_display/wifi_display_video_encoder_vea.cc b/extensions/renderer/api/display_source/wifi_display/wifi_display_video_encoder_vea.cc
index a6f1aa7..b77dcfbe 100644
--- a/extensions/renderer/api/display_source/wifi_display/wifi_display_video_encoder_vea.cc
+++ b/extensions/renderer/api/display_source/wifi_display/wifi_display_video_encoder_vea.cc
@@ -119,11 +119,11 @@
 
 scoped_refptr<WiFiDisplayVideoEncoder>
 WiFiDisplayVideoEncoderVEA::InitOnMediaThread(const InitParameters& params) {
-  // TODO: Select media profile based on video format capabilities negotiations
-  // with sink device.
+  media::VideoCodecProfile profile = (params.profile == wds::CHP)
+      ? media::H264PROFILE_HIGH : media::H264PROFILE_BASELINE;
   bool success =
       vea_->Initialize(media::PIXEL_FORMAT_I420, params.frame_size,
-                       media::H264PROFILE_MAIN, params.bit_rate, this);
+                       profile, params.bit_rate, this);
   if (success)
     return this;
 
diff --git a/extensions/renderer/messaging_bindings.cc b/extensions/renderer/messaging_bindings.cc
index 4a7e733..c1da6263 100644
--- a/extensions/renderer/messaging_bindings.cc
+++ b/extensions/renderer/messaging_bindings.cc
@@ -449,15 +449,16 @@
     const ExtensionMsg_ExternalConnectionInfo& info,
     const std::string& tls_channel_id,
     content::RenderFrame* restrict_to_render_frame) {
+  int routing_id = restrict_to_render_frame
+                       ? restrict_to_render_frame->GetRoutingID()
+                       : MSG_ROUTING_NONE;
   bool port_created = false;
   context_set.ForEach(
       info.target_id, restrict_to_render_frame,
       base::Bind(&DispatchOnConnectToScriptContext, target_port_id,
                  channel_name, &source, info, tls_channel_id, &port_created));
+  // Note: |restrict_to_render_frame| may have been deleted at this point!
 
-  int routing_id = restrict_to_render_frame
-                       ? restrict_to_render_frame->GetRoutingID()
-                       : MSG_ROUTING_NONE;
   if (port_created) {
     content::RenderThread::Get()->Send(
         new ExtensionHostMsg_OpenMessagePort(routing_id, target_port_id));
diff --git a/extensions/renderer/runtime_custom_bindings.cc b/extensions/renderer/runtime_custom_bindings.cc
index cba96f6d..1e540f3 100644
--- a/extensions/renderer/runtime_custom_bindings.cc
+++ b/extensions/renderer/runtime_custom_bindings.cc
@@ -157,6 +157,7 @@
   std::vector<content::RenderFrame*> frames =
       ExtensionFrameHelper::GetExtensionFrames(extension_id, browser_window_id,
                                                view_type);
+  v8::Local<v8::Context> v8_context = args.GetIsolate()->GetCurrentContext();
   v8::Local<v8::Array> v8_views = v8::Array::New(args.GetIsolate());
   int v8_index = 0;
   for (content::RenderFrame* frame : frames) {
@@ -172,7 +173,9 @@
     if (!context.IsEmpty()) {
       v8::Local<v8::Value> window = context->Global();
       DCHECK(!window.IsEmpty());
-      v8_views->Set(v8::Integer::New(args.GetIsolate(), v8_index++), window);
+      v8::Maybe<bool> maybe =
+        v8_views->CreateDataProperty(v8_context, v8_index++, window);
+      DCHECK(maybe.IsJust() && maybe.FromJust());
     }
   }
 
diff --git a/extensions/shell/browser/shell_screen.cc b/extensions/shell/browser/shell_screen.cc
index 4b103bed..1577508 100644
--- a/extensions/shell/browser/shell_screen.cc
+++ b/extensions/shell/browser/shell_screen.cc
@@ -63,8 +63,8 @@
   return aura::Env::GetInstance()->last_mouse_location();
 }
 
-gfx::NativeWindow ShellScreen::GetWindowUnderCursor() {
-  return GetWindowAtScreenPoint(GetCursorScreenPoint());
+bool ShellScreen::IsWindowUnderCursor(gfx::NativeWindow window) {
+  return GetWindowAtScreenPoint(GetCursorScreenPoint()) == window;
 }
 
 gfx::NativeWindow ShellScreen::GetWindowAtScreenPoint(const gfx::Point& point) {
diff --git a/extensions/shell/browser/shell_screen.h b/extensions/shell/browser/shell_screen.h
index 412fa568..fed63dfd 100644
--- a/extensions/shell/browser/shell_screen.h
+++ b/extensions/shell/browser/shell_screen.h
@@ -39,7 +39,7 @@
 
   // display::Screen overrides:
   gfx::Point GetCursorScreenPoint() override;
-  gfx::NativeWindow GetWindowUnderCursor() override;
+  bool IsWindowUnderCursor(gfx::NativeWindow window) override;
   gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override;
   int GetNumDisplays() const override;
   std::vector<display::Display> GetAllDisplays() const override;
diff --git a/gpu/command_buffer/client/client_test_helper.cc b/gpu/command_buffer/client/client_test_helper.cc
index d442a88..ff7e069 100644
--- a/gpu/command_buffer/client/client_test_helper.cc
+++ b/gpu/command_buffer/client/client_test_helper.cc
@@ -26,10 +26,6 @@
 MockCommandBufferBase::~MockCommandBufferBase() {
 }
 
-bool MockCommandBufferBase::Initialize() {
-  return true;
-}
-
 CommandBuffer::State MockCommandBufferBase::GetLastState() {
   return state_;
 }
diff --git a/gpu/command_buffer/client/client_test_helper.h b/gpu/command_buffer/client/client_test_helper.h
index fed547a..3b85773 100644
--- a/gpu/command_buffer/client/client_test_helper.h
+++ b/gpu/command_buffer/client/client_test_helper.h
@@ -34,7 +34,6 @@
   MockCommandBufferBase();
   ~MockCommandBufferBase() override;
 
-  bool Initialize() override;
   State GetLastState() override;
   int32_t GetLastToken() override;
   void WaitForTokenInRange(int32_t start, int32_t end) override;
diff --git a/gpu/command_buffer/client/cmd_buffer_helper_test.cc b/gpu/command_buffer/client/cmd_buffer_helper_test.cc
index b569990..6b58a2c 100644
--- a/gpu/command_buffer/client/cmd_buffer_helper_test.cc
+++ b/gpu/command_buffer/client/cmd_buffer_helper_test.cc
@@ -106,7 +106,6 @@
     }
     command_buffer_.reset(
         new CommandBufferServiceLocked(transfer_buffer_manager_.get()));
-    EXPECT_TRUE(command_buffer_->Initialize());
 
     executor_.reset(
         new CommandExecutor(command_buffer_.get(), api_mock_.get(), NULL));
diff --git a/gpu/command_buffer/client/fenced_allocator_test.cc b/gpu/command_buffer/client/fenced_allocator_test.cc
index 7b3a6ec..5d23970f 100644
--- a/gpu/command_buffer/client/fenced_allocator_test.cc
+++ b/gpu/command_buffer/client/fenced_allocator_test.cc
@@ -54,7 +54,6 @@
     }
     command_buffer_.reset(
         new CommandBufferService(transfer_buffer_manager_.get()));
-    EXPECT_TRUE(command_buffer_->Initialize());
 
     executor_.reset(
         new CommandExecutor(command_buffer_.get(), api_mock_.get(), NULL));
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc
index a088537..4548a72 100644
--- a/gpu/command_buffer/client/gles2_implementation_unittest.cc
+++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc
@@ -436,8 +436,6 @@
                     int major_version,
                     int minor_version) {
       command_buffer_.reset(new StrictMock<MockClientCommandBuffer>());
-      if (!command_buffer_->Initialize())
-        return false;
 
       transfer_buffer_.reset(
           new MockTransferBuffer(command_buffer_.get(),
diff --git a/gpu/command_buffer/client/mapped_memory_unittest.cc b/gpu/command_buffer/client/mapped_memory_unittest.cc
index 8db9914..674d1a1 100644
--- a/gpu/command_buffer/client/mapped_memory_unittest.cc
+++ b/gpu/command_buffer/client/mapped_memory_unittest.cc
@@ -52,7 +52,6 @@
 
     command_buffer_.reset(
         new CommandBufferService(transfer_buffer_manager_.get()));
-    EXPECT_TRUE(command_buffer_->Initialize());
 
     executor_.reset(
         new CommandExecutor(command_buffer_.get(), api_mock_.get(), NULL));
diff --git a/gpu/command_buffer/client/ring_buffer_test.cc b/gpu/command_buffer/client/ring_buffer_test.cc
index 3e1b2667..ed59c33 100644
--- a/gpu/command_buffer/client/ring_buffer_test.cc
+++ b/gpu/command_buffer/client/ring_buffer_test.cc
@@ -76,7 +76,6 @@
     }
     command_buffer_.reset(
         new CommandBufferService(transfer_buffer_manager_.get()));
-    EXPECT_TRUE(command_buffer_->Initialize());
 
     executor_.reset(
         new CommandExecutor(command_buffer_.get(), api_mock_.get(), NULL));
diff --git a/gpu/command_buffer/client/transfer_buffer_unittest.cc b/gpu/command_buffer/client/transfer_buffer_unittest.cc
index 336b992..369adfd 100644
--- a/gpu/command_buffer/client/transfer_buffer_unittest.cc
+++ b/gpu/command_buffer/client/transfer_buffer_unittest.cc
@@ -66,7 +66,6 @@
 
 void TransferBufferTest::SetUp() {
   command_buffer_.reset(new StrictMock<MockClientCommandBufferMockFlush>());
-  ASSERT_TRUE(command_buffer_->Initialize());
 
   helper_.reset(new CommandBufferHelper(command_buffer()));
   ASSERT_TRUE(helper_->Initialize(kCommandBufferSizeBytes));
@@ -270,7 +269,6 @@
 
 void TransferBufferExpandContractTest::SetUp() {
   command_buffer_.reset(new StrictMock<MockClientCommandBufferCanFail>());
-  ASSERT_TRUE(command_buffer_->Initialize());
 
   EXPECT_CALL(*command_buffer(),
               CreateTransferBuffer(kCommandBufferSizeBytes, _))
diff --git a/gpu/command_buffer/common/command_buffer.h b/gpu/command_buffer/common/command_buffer.h
index 23cb406..dc3f7f78 100644
--- a/gpu/command_buffer/common/command_buffer.h
+++ b/gpu/command_buffer/common/command_buffer.h
@@ -75,9 +75,6 @@
       return start <= value || value <= end;
   }
 
-  // Initialize the command buffer with the given size.
-  virtual bool Initialize() = 0;
-
   // Returns the last state without synchronizing with the service.
   virtual State GetLastState() = 0;
 
diff --git a/gpu/command_buffer/common/command_buffer_mock.h b/gpu/command_buffer/common/command_buffer_mock.h
index 600ae7e5..6ece2d0 100644
--- a/gpu/command_buffer/common/command_buffer_mock.h
+++ b/gpu/command_buffer/common/command_buffer_mock.h
@@ -25,7 +25,6 @@
   MockCommandBuffer();
   virtual ~MockCommandBuffer();
 
-  MOCK_METHOD0(Initialize, bool());
   MOCK_METHOD0(GetLastState, State());
   MOCK_METHOD0(GetLastToken, int32_t());
   MOCK_METHOD1(Flush, void(int32_t put_offset));
diff --git a/gpu/command_buffer/common/id_type.h b/gpu/command_buffer/common/id_type.h
index 1977364..0d009c61 100644
--- a/gpu/command_buffer/common/id_type.h
+++ b/gpu/command_buffer/common/id_type.h
@@ -35,7 +35,7 @@
 // - it can be used as an argument to DCHECK_EQ or streamed to LOG(ERROR);
 // - it has the same memory footprint and runtime overhead as int32_t;
 // - it can be copied by memcpy.
-// - it can be used in IPC messages (for now via gpu/ipc/id_type_traits.h)
+// - it can be used in IPC messages.
 //
 // IdType32<Foo> has the following differences from a bare int32_t:
 // - it forces coercions to go through GetUnsafeValue and FromUnsafeValue;
diff --git a/gpu/command_buffer/service/command_buffer_service.cc b/gpu/command_buffer/service/command_buffer_service.cc
index 9c3d9b0..b4457d5 100644
--- a/gpu/command_buffer/service/command_buffer_service.cc
+++ b/gpu/command_buffer/service/command_buffer_service.cc
@@ -37,10 +37,6 @@
 CommandBufferService::~CommandBufferService() {
 }
 
-bool CommandBufferService::Initialize() {
-  return true;
-}
-
 CommandBufferService::State CommandBufferService::GetLastState() {
   State state;
   state.get_offset = get_offset_;
diff --git a/gpu/command_buffer/service/command_buffer_service.h b/gpu/command_buffer/service/command_buffer_service.h
index df058767..c3e4b17 100644
--- a/gpu/command_buffer/service/command_buffer_service.h
+++ b/gpu/command_buffer/service/command_buffer_service.h
@@ -53,7 +53,6 @@
   ~CommandBufferService() override;
 
   // CommandBuffer implementation:
-  bool Initialize() override;
   State GetLastState() override;
   int32_t GetLastToken() override;
   void Flush(int32_t put_offset) override;
diff --git a/gpu/command_buffer/service/command_buffer_service_unittest.cc b/gpu/command_buffer/service/command_buffer_service_unittest.cc
index 2ee87b8..f089f02 100644
--- a/gpu/command_buffer/service/command_buffer_service_unittest.cc
+++ b/gpu/command_buffer/service/command_buffer_service_unittest.cc
@@ -35,7 +35,6 @@
     }
     command_buffer_.reset(
         new CommandBufferService(transfer_buffer_manager_.get()));
-    EXPECT_TRUE(command_buffer_->Initialize());
   }
 
   int32_t GetGetOffset() { return command_buffer_->GetLastState().get_offset; }
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index fd688cf..d4d0fab 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -593,8 +593,7 @@
                   const std::vector<int32_t>& attribs) override;
   void Destroy(bool have_context) override;
   void SetSurface(const scoped_refptr<gfx::GLSurface>& surface) override;
-  void TakeFrontBuffer(const Mailbox& mailbox) override;
-  void ReturnFrontBuffer(const Mailbox& mailbox, bool is_lost) override;
+  void ProduceFrontBuffer(const Mailbox& mailbox) override;
   bool ResizeOffscreenFrameBuffer(const gfx::Size& size) override;
   void UpdateParentTextureInfo();
   bool MakeCurrent() override;
@@ -1260,6 +1259,15 @@
                   int height) override;
 
   // overridden from GLES2Decoder
+  bool ClearCompressedTextureLevel(Texture* texture,
+                                   unsigned target,
+                                   int level,
+                                   unsigned format,
+                                   int width,
+                                   int height) override;
+  bool IsCompressedTextureFormat(unsigned format) override;
+
+  // overridden from GLES2Decoder
   bool ClearLevel3D(Texture* texture,
                     unsigned target,
                     int level,
@@ -1999,33 +2007,6 @@
   scoped_refptr<TextureRef>
       offscreen_saved_color_texture_info_;
 
-  // When a client requests ownership of the swapped front buffer, all
-  // information is saved in this structure, and |in_use| is set to true. When a
-  // client releases ownership, |in_use| is set to false.
-  //
-  // An instance of this struct, with |in_use| = false may be reused instead of
-  // making a new BackTexture.
-  struct SavedBackTexture {
-    std::unique_ptr<BackTexture> back_texture;
-    scoped_refptr<TextureRef> texture_ref;
-    bool in_use;
-  };
-  std::vector<SavedBackTexture> saved_back_textures_;
-
-  // If there's a SavedBackTexture that's not in use, takes that. Otherwise,
-  // generates a new back texture.
-  void CreateBackTexture();
-  size_t create_back_texture_count_for_test_ = 0;
-
-  // Releases all saved BackTextures that are not in use by a client.
-  void ReleaseNotInUseBackTextures();
-
-  // Releases all saved BackTextures.
-  void ReleaseAllBackTextures();
-
-  size_t GetSavedBackTextureCountForTest() override;
-  size_t GetCreatedBackTextureCountForTest() override;
-
   // The copy that is used as the destination for multi-sample resolves.
   std::unique_ptr<BackFramebuffer> offscreen_resolved_frame_buffer_;
   std::unique_ptr<BackTexture> offscreen_resolved_color_texture_;
@@ -4100,7 +4081,6 @@
     offscreen_saved_color_texture_->Invalidate();
     offscreen_saved_color_texture_info_ = NULL;
   }
-  ReleaseAllBackTextures();
   if (have_context) {
     if (copy_texture_CHROMIUM_.get()) {
       copy_texture_CHROMIUM_->Destroy();
@@ -4239,12 +4219,11 @@
   RestoreCurrentFramebufferBindings();
 }
 
-void GLES2DecoderImpl::TakeFrontBuffer(const Mailbox& mailbox) {
+void GLES2DecoderImpl::ProduceFrontBuffer(const Mailbox& mailbox) {
   if (!offscreen_saved_color_texture_.get()) {
-    DLOG(ERROR) << "Called TakeFrontBuffer on a non-offscreen context";
+    LOG(ERROR) << "Called ProduceFrontBuffer on a non-offscreen context";
     return;
   }
-
   if (!offscreen_saved_color_texture_info_.get()) {
     GLuint service_id = offscreen_saved_color_texture_->id();
     offscreen_saved_color_texture_info_ = TextureRef::Create(
@@ -4253,92 +4232,8 @@
                                  GL_TEXTURE_2D);
     UpdateParentTextureInfo();
   }
-
   mailbox_manager()->ProduceTexture(
       mailbox, offscreen_saved_color_texture_info_->texture());
-
-  // Save the BackTexture and TextureRef.
-  SavedBackTexture save;
-  save.back_texture.swap(offscreen_saved_color_texture_);
-  save.texture_ref = offscreen_saved_color_texture_info_;
-  offscreen_saved_color_texture_info_ = nullptr;
-  save.in_use = true;
-  saved_back_textures_.push_back(std::move(save));
-
-  CreateBackTexture();
-}
-
-void GLES2DecoderImpl::ReturnFrontBuffer(const Mailbox& mailbox, bool is_lost) {
-  Texture* texture = mailbox_manager()->ConsumeTexture(mailbox);
-  for (auto it = saved_back_textures_.begin(); it != saved_back_textures_.end();
-       ++it) {
-    if (texture != it->texture_ref->texture())
-      continue;
-
-    if (is_lost || it->back_texture->size() != offscreen_size_) {
-      it->back_texture->Invalidate();
-      saved_back_textures_.erase(it);
-      return;
-    }
-
-    it->in_use = false;
-    return;
-  }
-
-  DLOG(ERROR) << "Attempting to return a frontbuffer that was not saved.";
-}
-
-void GLES2DecoderImpl::CreateBackTexture() {
-  for (auto it = saved_back_textures_.begin(); it != saved_back_textures_.end();
-       ++it) {
-    if (it->in_use)
-      continue;
-
-    if (it->back_texture->size() != offscreen_size_)
-      continue;
-    offscreen_saved_color_texture_ = std::move(it->back_texture);
-    offscreen_saved_color_texture_info_ = it->texture_ref;
-    saved_back_textures_.erase(it);
-    return;
-  }
-
-  ++create_back_texture_count_for_test_;
-  offscreen_saved_color_texture_.reset(
-      new BackTexture(memory_tracker(), &state_));
-  offscreen_saved_color_texture_->Create();
-  offscreen_saved_color_texture_->AllocateStorage(
-      offscreen_size_, offscreen_saved_color_format_, false);
-  offscreen_saved_frame_buffer_->AttachRenderTexture(
-      offscreen_saved_color_texture_.get());
-}
-
-void GLES2DecoderImpl::ReleaseNotInUseBackTextures() {
-  for (auto& saved_back_texture : saved_back_textures_) {
-    if (!saved_back_texture.in_use)
-      saved_back_texture.back_texture->Invalidate();
-  }
-
-  std::remove_if(saved_back_textures_.begin(), saved_back_textures_.end(),
-                 [](const SavedBackTexture& saved_back_texture) {
-                   return !saved_back_texture.in_use;
-                 });
-}
-
-void GLES2DecoderImpl::ReleaseAllBackTextures() {
-  for (auto& saved_back_texture : saved_back_textures_) {
-    // The texture will be destroyed by texture_ref's destructor.
-    DCHECK(saved_back_texture.texture_ref);
-    saved_back_texture.back_texture->Invalidate();
-  }
-  saved_back_textures_.clear();
-}
-
-size_t GLES2DecoderImpl::GetSavedBackTextureCountForTest() {
-  return saved_back_textures_.size();
-}
-
-size_t GLES2DecoderImpl::GetCreatedBackTextureCountForTest() {
-  return create_back_texture_count_for_test_;
 }
 
 bool GLES2DecoderImpl::ResizeOffscreenFrameBuffer(const gfx::Size& size) {
@@ -10525,6 +10420,52 @@
   return true;
 }
 
+bool GLES2DecoderImpl::ClearCompressedTextureLevel(Texture* texture,
+                                                   unsigned target,
+                                                   int level,
+                                                   unsigned format,
+                                                   int width,
+                                                   int height) {
+  DCHECK(target != GL_TEXTURE_3D && target != GL_TEXTURE_2D_ARRAY);
+  // This code path can only be called if the texture was originally
+  // allocated via TexStorage2D. Note that TexStorage2D is exposed
+  // internally for ES 2.0 contexts, but compressed texture support is
+  // not part of that exposure.
+  DCHECK(feature_info_->IsES3Enabled());
+
+  GLsizei bytes_required = 0;
+  if (!GetCompressedTexSizeInBytes(
+          "ClearCompressedTextureLevel", width, height, 1, format,
+          &bytes_required)) {
+    return false;
+  }
+
+  TRACE_EVENT1("gpu", "GLES2DecoderImpl::ClearCompressedTextureLevel",
+               "bytes_required", bytes_required);
+
+  glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
+  std::unique_ptr<char[]> zero(new char[bytes_required]);
+  memset(zero.get(), 0, bytes_required);
+  glBindTexture(texture->target(), texture->service_id());
+  glCompressedTexSubImage2D(
+      target, level, 0, 0, width, height, format, bytes_required, zero.get());
+  TextureRef* bound_texture =
+      texture_manager()->GetTextureInfoForTarget(&state_, texture->target());
+  glBindTexture(texture->target(),
+                bound_texture ? bound_texture->service_id() : 0);
+  Buffer* bound_buffer = buffer_manager()->GetBufferInfoForTarget(
+      &state_, GL_PIXEL_UNPACK_BUFFER);
+  if (bound_buffer) {
+    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, bound_buffer->service_id());
+  }
+  return true;
+}
+
+bool GLES2DecoderImpl::IsCompressedTextureFormat(unsigned format) {
+  return feature_info_->validators()->compressed_texture_format.IsValid(
+      format);
+}
+
 bool GLES2DecoderImpl::ClearLevel3D(Texture* texture,
                                     unsigned target,
                                     int level,
@@ -11741,11 +11682,24 @@
     return;
   }
 
+  if (!texture->IsLevelCleared(target, level)) {
+    // This can only happen if the compressed texture was allocated
+    // using TexStorage2D.
+    DCHECK(texture->IsImmutable());
+    GLsizei level_width = 0, level_height = 0;
+    bool success = texture->GetLevelSize(
+        target, level, &level_width, &level_height, nullptr);
+    DCHECK(success);
+    // We can skip the clear if we're uploading the entire level.
+    if (xoffset == 0 && yoffset == 0 &&
+        width == level_width && height == level_height) {
+      texture_manager()->SetLevelCleared(texture_ref, target, level, true);
+    } else {
+      texture_manager()->ClearTextureLevel(this, texture_ref, target, level);
+    }
+    DCHECK(texture->IsLevelCleared(target, level));
+  }
 
-  // Note: There is no need to deal with texture cleared tracking here
-  // because the validation above means you can only get here if the level
-  // is already a matching compressed format and in that case
-  // CompressedTexImage2D already cleared the texture.
   glCompressedTexSubImage2D(
       target, level, xoffset, yoffset, width, height, format, image_size, data);
 
@@ -12832,10 +12786,6 @@
         glFinish();
       }
 
-      // The size has changed, so none of the cached BackTextures are useful
-      // anymore.
-      ReleaseNotInUseBackTextures();
-
       // Allocate the offscreen saved color texture.
       DCHECK(offscreen_saved_color_format_);
       offscreen_saved_color_texture_->AllocateStorage(
@@ -14446,28 +14396,11 @@
         function_name, internal_format, "internal_format");
     return;
   }
-  bool is_compressed_format;
-  switch (internal_format) {
-    case GL_COMPRESSED_R11_EAC:
-    case GL_COMPRESSED_SIGNED_R11_EAC:
-    case GL_COMPRESSED_RG11_EAC:
-    case GL_COMPRESSED_SIGNED_RG11_EAC:
-    case GL_COMPRESSED_RGB8_ETC2:
-    case GL_COMPRESSED_SRGB8_ETC2:
-    case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
-    case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
-    case GL_COMPRESSED_RGBA8_ETC2_EAC:
-    case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
-      is_compressed_format = true;
-      if (target == GL_TEXTURE_3D) {
-        LOCAL_SET_GL_ERROR(
-            GL_INVALID_OPERATION, function_name, "target invalid for format");
-        return;
-      }
-      break;
-    default:
-      is_compressed_format = false;
-      break;
+  bool is_compressed_format = IsCompressedTextureFormat(internal_format);
+  if (is_compressed_format && target == GL_TEXTURE_3D) {
+    LOCAL_SET_GL_ERROR(
+        GL_INVALID_OPERATION, function_name, "target invalid for format");
+    return;
   }
   if (!texture_manager()->ValidForTarget(target, 0, width, height, depth) ||
       TextureManager::ComputeMipMapCount(
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.h b/gpu/command_buffer/service/gles2_cmd_decoder.h
index 668fbcf..dbc8dfb8 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.h
@@ -158,8 +158,7 @@
   // Set the surface associated with the default FBO.
   virtual void SetSurface(const scoped_refptr<gfx::GLSurface>& surface) = 0;
 
-  virtual void TakeFrontBuffer(const Mailbox& mailbox) = 0;
-  virtual void ReturnFrontBuffer(const Mailbox& mailbox, bool is_lost) = 0;
+  virtual void ProduceFrontBuffer(const Mailbox& mailbox) = 0;
 
   // Resize an offscreen frame buffer.
   virtual bool ResizeOffscreenFrameBuffer(const gfx::Size& size) = 0;
@@ -201,8 +200,6 @@
   virtual void SetIgnoreCachedStateForTest(bool ignore) = 0;
   virtual void SetForceShaderNameHashingForTest(bool force) = 0;
   virtual uint32_t GetAndClearBackbufferClearBitsForTest();
-  virtual size_t GetSavedBackTextureCountForTest() = 0;
-  virtual size_t GetCreatedBackTextureCountForTest() = 0;
 
   // Gets the QueryManager for this context.
   virtual QueryManager* GetQueryManager() = 0;
@@ -245,6 +242,19 @@
                           int width,
                           int height) = 0;
 
+  // Clears a level sub area of a compressed 2D texture.
+  // Returns false if a GL error should be generated.
+  virtual bool ClearCompressedTextureLevel(Texture* texture,
+                                           unsigned target,
+                                           int level,
+                                           unsigned format,
+                                           int width,
+                                           int height) = 0;
+
+  // Indicates whether a given internal format is one for a compressed
+  // texture.
+  virtual bool IsCompressedTextureFormat(unsigned format) = 0;
+
   // Clears a level of a 3D texture.
   // Returns false if a GL error should be generated.
   virtual bool ClearLevel3D(Texture* texture,
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_mock.h b/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
index 32dc5e6..60db8935 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
@@ -52,10 +52,7 @@
                     const std::vector<int32_t>& attribs));
   MOCK_METHOD1(Destroy, void(bool have_context));
   MOCK_METHOD1(SetSurface, void(const scoped_refptr<gfx::GLSurface>& surface));
-  MOCK_METHOD1(TakeFrontBuffer, void(const Mailbox& mailbox));
-  MOCK_METHOD2(ReturnFrontBuffer, void(const Mailbox& mailbox, bool is_lost));
-  MOCK_METHOD0(GetSavedBackTextureCountForTest, size_t());
-  MOCK_METHOD0(GetCreatedBackTextureCountForTest, size_t());
+  MOCK_METHOD1(ProduceFrontBuffer, void(const Mailbox& mailbox));
   MOCK_METHOD1(ResizeOffscreenFrameBuffer, bool(const gfx::Size& size));
   MOCK_METHOD0(MakeCurrent, bool());
   MOCK_METHOD1(GetServiceIdForTesting, uint32_t(uint32_t client_id));
@@ -115,6 +112,15 @@
                     int y_offset,
                     int width,
                     int height));
+  MOCK_METHOD6(ClearCompressedTextureLevel,
+               bool(Texture* texture,
+                    unsigned target,
+                    int level,
+                    unsigned format,
+                    int width,
+                    int height));
+  MOCK_METHOD1(IsCompressedTextureFormat,
+               bool(unsigned format));
   MOCK_METHOD8(ClearLevel3D,
                bool(Texture* texture,
                     unsigned target,
diff --git a/gpu/command_buffer/service/in_process_command_buffer.cc b/gpu/command_buffer/service/in_process_command_buffer.cc
index ceb8d6a..bf462e09 100644
--- a/gpu/command_buffer/service/in_process_command_buffer.cc
+++ b/gpu/command_buffer/service/in_process_command_buffer.cc
@@ -316,12 +316,6 @@
   command_buffer->SetParseErrorCallback(base::Bind(
       &InProcessCommandBuffer::OnContextLostOnGpuThread, gpu_thread_weak_ptr_));
 
-  if (!command_buffer->Initialize()) {
-    LOG(ERROR) << "Could not initialize command buffer.";
-    DestroyOnGpuThread();
-    return false;
-  }
-
   gl_share_group_ = params.context_group
                         ? params.context_group->gl_share_group_
                         : service_->share_group();
@@ -969,11 +963,6 @@
   return last_state_.error;
 }
 
-bool InProcessCommandBuffer::Initialize() {
-  NOTREACHED();
-  return false;
-}
-
 namespace {
 
 void PostCallback(
diff --git a/gpu/command_buffer/service/in_process_command_buffer.h b/gpu/command_buffer/service/in_process_command_buffer.h
index a731bf1..70891c2 100644
--- a/gpu/command_buffer/service/in_process_command_buffer.h
+++ b/gpu/command_buffer/service/in_process_command_buffer.h
@@ -88,7 +88,6 @@
                   ImageFactory* image_factory);
 
   // CommandBuffer implementation:
-  bool Initialize() override;
   State GetLastState() override;
   int32_t GetLastToken() override;
   void Flush(int32_t put_offset) override;
diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc
index b904fc9..9b61279 100644
--- a/gpu/command_buffer/service/texture_manager.cc
+++ b/gpu/command_buffer/service/texture_manager.cc
@@ -1424,30 +1424,45 @@
     if (!cleared)
       return false;
   } else {
-    // Clear all remaining sub regions.
-    const int x[] = {
+    if (decoder->IsCompressedTextureFormat(info.internal_format)) {
+      // An uncleared level of a compressed texture can only occur when
+      // allocating the texture with TexStorage2D. In this case the level
+      // is cleared just before a call to CompressedTexSubImage2D, to avoid
+      // having to clear a sub-rectangle of a compressed texture, which
+      // would be problematic.
+      DCHECK(IsImmutable());
+      DCHECK(info.cleared_rect == gfx::Rect());
+      bool cleared = decoder->ClearCompressedTextureLevel(
+          this, info.target, info.level, info.internal_format,
+          info.width, info.height);
+      if (!cleared)
+        return false;
+    } else {
+      // Clear all remaining sub regions.
+      const int x[] = {
         0, info.cleared_rect.x(), info.cleared_rect.right(), info.width};
-    const int y[] = {
+      const int y[] = {
         0, info.cleared_rect.y(), info.cleared_rect.bottom(), info.height};
 
-    for (size_t j = 0; j < 3; ++j) {
-      for (size_t i = 0; i < 3; ++i) {
-        // Center of nine patch is already cleared.
-        if (j == 1 && i == 1)
-          continue;
+      for (size_t j = 0; j < 3; ++j) {
+        for (size_t i = 0; i < 3; ++i) {
+          // Center of nine patch is already cleared.
+          if (j == 1 && i == 1)
+            continue;
 
-        gfx::Rect rect(x[i], y[j], x[i + 1] - x[i], y[j + 1] - y[j]);
-        if (rect.IsEmpty())
-          continue;
+          gfx::Rect rect(x[i], y[j], x[i + 1] - x[i], y[j + 1] - y[j]);
+          if (rect.IsEmpty())
+            continue;
 
-        // NOTE: It seems kind of gross to call back into the decoder for this
-        // but only the decoder knows all the state (like unpack_alignment_)
-        // that's needed to be able to call GL correctly.
-        bool cleared = decoder->ClearLevel(
-            this, info.target, info.level, info.format, info.type,
-            rect.x(), rect.y(), rect.width(), rect.height());
-        if (!cleared)
-          return false;
+          // NOTE: It seems kind of gross to call back into the decoder for this
+          // but only the decoder knows all the state (like unpack_alignment_)
+          // that's needed to be able to call GL correctly.
+          bool cleared = decoder->ClearLevel(
+              this, info.target, info.level, info.format, info.type,
+              rect.x(), rect.y(), rect.width(), rect.height());
+          if (!cleared)
+            return false;
+        }
       }
     }
   }
diff --git a/gpu/command_buffer/service/texture_manager_unittest.cc b/gpu/command_buffer/service/texture_manager_unittest.cc
index f430ce0..17113e0 100644
--- a/gpu/command_buffer/service/texture_manager_unittest.cc
+++ b/gpu/command_buffer/service/texture_manager_unittest.cc
@@ -1613,6 +1613,10 @@
 TEST_F(TextureTest, ClearTexture) {
   EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _))
       .WillRepeatedly(Return(true));
+  // The code path taken when IsCompressedTextureFormat returns true
+  // is covered best by the WebGL 2.0 conformance tests.
+  EXPECT_CALL(*decoder_, IsCompressedTextureFormat(_))
+      .WillRepeatedly(Return(false));
   manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D);
   manager_->SetLevelInfo(texture_ref_.get(), GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1,
                          0, GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect());
@@ -2039,6 +2043,10 @@
             GetLevelInfo(restored_texture.get(), GL_TEXTURE_RECTANGLE_ARB, 0));
   EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _))
       .WillRepeatedly(Return(true));
+  // The code path taken when IsCompressedTextureFormat returns true
+  // is covered best by the WebGL 2.0 conformance tests.
+  EXPECT_CALL(*decoder_, IsCompressedTextureFormat(_))
+      .WillRepeatedly(Return(false));
   EXPECT_TRUE(manager_->ClearTextureLevel(
       decoder_.get(), restored_texture.get(), GL_TEXTURE_RECTANGLE_ARB, 0));
 }
diff --git a/gpu/command_buffer/tests/gl_manager.cc b/gpu/command_buffer/tests/gl_manager.cc
index 4b8a498..a52e209 100644
--- a/gpu/command_buffer/tests/gl_manager.cc
+++ b/gpu/command_buffer/tests/gl_manager.cc
@@ -306,8 +306,6 @@
   }
   command_buffer_.reset(new CommandBufferService(
       decoder_->GetContextGroup()->transfer_buffer_manager()));
-  ASSERT_TRUE(command_buffer_->Initialize())
-      << "could not create command buffer service";
 
   executor_.reset(new CommandExecutor(command_buffer_.get(), decoder_.get(),
                                       decoder_.get()));
diff --git a/gpu/command_buffer/tests/gl_texture_mailbox_unittest.cc b/gpu/command_buffer/tests/gl_texture_mailbox_unittest.cc
index 81298299..beacdfb 100644
--- a/gpu/command_buffer/tests/gl_texture_mailbox_unittest.cc
+++ b/gpu/command_buffer/tests/gl_texture_mailbox_unittest.cc
@@ -68,29 +68,6 @@
     gl2_.Destroy();
   }
 
-  // The second GL context takes and consumes a mailbox from the first GL
-  // context. Assumes that |gl1_| is current.
-  Mailbox TakeAndConsumeMailbox() {
-    glResizeCHROMIUM(10, 10, 1, true);
-    glClearColor(0, 1, 1, 1);
-    glClear(GL_COLOR_BUFFER_BIT);
-    ::gles2::GetGLContext()->SwapBuffers();
-
-    Mailbox mailbox;
-    glGenMailboxCHROMIUM(mailbox.name);
-    gl1_.decoder()->TakeFrontBuffer(mailbox);
-
-    gl2_.MakeCurrent();
-    GLuint tex;
-    glGenTextures(1, &tex);
-    glBindTexture(GL_TEXTURE_2D, tex);
-    glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
-    glDeleteTextures(1, &tex);
-    glFlush();
-    gl1_.MakeCurrent();
-    return mailbox;
-  }
-
   GLManager gl1_;
   GLManager gl2_;
 };
@@ -350,17 +327,13 @@
   EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
 }
 
-TEST_F(GLTextureMailboxTest, TakeFrontBuffer) {
+TEST_F(GLTextureMailboxTest, ProduceFrontBuffer) {
   gl1_.MakeCurrent();
   Mailbox mailbox;
   glGenMailboxCHROMIUM(mailbox.name);
 
   gl2_.MakeCurrent();
-  glResizeCHROMIUM(10, 10, 1, true);
-  glClearColor(0, 1, 1, 1);
-  glClear(GL_COLOR_BUFFER_BIT);
-  ::gles2::GetGLContext()->SwapBuffers();
-  gl2_.decoder()->TakeFrontBuffer(mailbox);
+  gl2_.decoder()->ProduceFrontBuffer(mailbox);
 
   gl1_.MakeCurrent();
   GLuint tex1;
@@ -368,85 +341,41 @@
   glBindTexture(GL_TEXTURE_2D, tex1);
   glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
   EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
-  EXPECT_EQ(0xFFFFFF00u, ReadTexel(tex1, 0, 0));
 
   gl2_.MakeCurrent();
+  glResizeCHROMIUM(10, 10, 1, true);
   glClearColor(1, 0, 0, 1);
   glClear(GL_COLOR_BUFFER_BIT);
   ::gles2::GetGLContext()->SwapBuffers();
 
   gl1_.MakeCurrent();
-  EXPECT_EQ(0xFFFFFF00u, ReadTexel(tex1, 0, 0));
-
-  glDeleteTextures(1, &tex1);
-
-  Mailbox mailbox2;
-  glGenMailboxCHROMIUM(mailbox2.name);
+  EXPECT_EQ(0xFF0000FFu, ReadTexel(tex1, 0, 0));
+  EXPECT_EQ(0xFF0000FFu, ReadTexel(tex1, 9, 9));
+  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
 
   gl2_.MakeCurrent();
-  gl2_.decoder()->ReturnFrontBuffer(mailbox, false);
-
-  // Flushing doesn't matter, only SwapBuffers().
   glClearColor(0, 1, 0, 1);
   glClear(GL_COLOR_BUFFER_BIT);
   glFlush();
 
-  gl2_.decoder()->TakeFrontBuffer(mailbox2);
+  gl1_.MakeCurrent();
+  EXPECT_EQ(0xFF0000FFu, ReadTexel(tex1, 0, 0));
+
+  gl2_.MakeCurrent();
+  ::gles2::GetGLContext()->SwapBuffers();
 
   gl1_.MakeCurrent();
-  glGenTextures(1, &tex1);
-  glBindTexture(GL_TEXTURE_2D, tex1);
-  glConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox2.name);
-  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
-  EXPECT_EQ(0xFF0000FFu, ReadTexel(tex1, 0, 0));
+  EXPECT_EQ(0xFF00FF00u, ReadTexel(tex1, 0, 0));
 
   gl2_.MakeCurrent();
   gl2_.Destroy();
 
   gl1_.MakeCurrent();
-  EXPECT_EQ(0xFF0000FFu, ReadTexel(tex1, 0, 0));
+  EXPECT_EQ(0xFF00FF00u, ReadTexel(tex1, 0, 0));
   EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
   glDeleteTextures(1, &tex1);
 }
 
-// The client, represented by |gl2_|, will request 5 frontbuffers, and then
-// start returning them.
-TEST_F(GLTextureMailboxTest, FrontBufferCache) {
-  gl1_.MakeCurrent();
-
-  std::vector<Mailbox> mailboxes;
-  for (int i = 0; i < 5; ++i) {
-    Mailbox mailbox = TakeAndConsumeMailbox();
-    mailboxes.push_back(mailbox);
-  }
-  EXPECT_EQ(5u, gl1_.decoder()->GetSavedBackTextureCountForTest());
-  EXPECT_EQ(5u, gl1_.decoder()->GetCreatedBackTextureCountForTest());
-
-  // If the textures aren't lost, they're reused.
-  for (int i = 0; i < 100; ++i) {
-    gl1_.decoder()->ReturnFrontBuffer(mailboxes[0], false);
-    mailboxes.erase(mailboxes.begin());
-
-    Mailbox mailbox = TakeAndConsumeMailbox();
-    mailboxes.push_back(mailbox);
-  }
-
-  EXPECT_EQ(5u, gl1_.decoder()->GetSavedBackTextureCountForTest());
-  EXPECT_EQ(5u, gl1_.decoder()->GetCreatedBackTextureCountForTest());
-
-  // If the textures are lost, they're not reused.
-  for (int i = 0; i < 100; ++i) {
-    gl1_.decoder()->ReturnFrontBuffer(mailboxes[0], true);
-    mailboxes.erase(mailboxes.begin());
-
-    Mailbox mailbox = TakeAndConsumeMailbox();
-    mailboxes.push_back(mailbox);
-  }
-
-  EXPECT_EQ(5u, gl1_.decoder()->GetSavedBackTextureCountForTest());
-  EXPECT_EQ(105u, gl1_.decoder()->GetCreatedBackTextureCountForTest());
-}
-
 TEST_F(GLTextureMailboxTest, ProduceTextureDirectInvalidTarget) {
   gl1_.MakeCurrent();
 
@@ -473,7 +402,7 @@
 
 // http://crbug.com/281565
 #if !defined(OS_ANDROID)
-TEST_F(GLTextureMailboxTest, TakeFrontBufferMultipleContexts) {
+TEST_F(GLTextureMailboxTest, ProduceFrontBufferMultipleContexts) {
   gl1_.MakeCurrent();
   Mailbox mailbox[2];
   glGenMailboxCHROMIUM(mailbox[0].name);
@@ -487,16 +416,13 @@
   for (size_t i = 0; i < 2; ++i) {
     other_gl[i].Initialize(options);
     other_gl[i].MakeCurrent();
-    glResizeCHROMIUM(10, 10, 1, true);
-    glClearColor(1 - i % 2, i % 2, 0, 1);
-    glClear(GL_COLOR_BUFFER_BIT);
-    ::gles2::GetGLContext()->SwapBuffers();
-    other_gl[i].decoder()->TakeFrontBuffer(mailbox[i]);
+    other_gl[i].decoder()->ProduceFrontBuffer(mailbox[i]);
     // Make sure both "other gl" are in the same share group.
     if (!options.share_group_manager)
       options.share_group_manager = other_gl+i;
   }
 
+
   gl1_.MakeCurrent();
   for (size_t i = 0; i < 2; ++i) {
     glBindTexture(GL_TEXTURE_2D, tex[i]);
@@ -504,6 +430,14 @@
     EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
   }
 
+  for (size_t i = 0; i < 2; ++i) {
+    other_gl[i].MakeCurrent();
+    glResizeCHROMIUM(10, 10, 1, true);
+    glClearColor(1-i%2, i%2, 0, 1);
+    glClear(GL_COLOR_BUFFER_BIT);
+    ::gles2::GetGLContext()->SwapBuffers();
+  }
+
   gl1_.MakeCurrent();
   EXPECT_EQ(0xFF0000FFu, ReadTexel(tex[0], 0, 0));
   EXPECT_EQ(0xFF00FF00u, ReadTexel(tex[1], 9, 9));
diff --git a/gpu/command_buffer_traits.gypi b/gpu/command_buffer_traits.gypi
index 2b261f1..6be45451 100644
--- a/gpu/command_buffer_traits.gypi
+++ b/gpu/command_buffer_traits.gypi
@@ -14,7 +14,6 @@
   'sources': [
     'ipc/common/gpu_command_buffer_traits.cc',
     'ipc/common/gpu_command_buffer_traits.h',
-    'ipc/common/id_type_traits.h',
     'ipc/common/memory_stats.cc',
     'ipc/common/memory_stats.h',
     'ipc/common/surface_handle.h',
diff --git a/gpu/config/gpu_control_list.cc b/gpu/config/gpu_control_list.cc
index 9ff8a4d2..a8ba402 100644
--- a/gpu/config/gpu_control_list.cc
+++ b/gpu/config/gpu_control_list.cc
@@ -738,17 +738,40 @@
     const base::ListValue* feature_value = NULL;
     if (value->GetList("features", &feature_value)) {
       std::vector<std::string> feature_list;
+      std::vector<std::string> feature_exception_list;
       for (size_t i = 0; i < feature_value->GetSize(); ++i) {
         std::string feature;
+        const base::DictionaryValue* features_info_value = NULL;
         if (feature_value->GetString(i, &feature)) {
           feature_list.push_back(feature);
+        } else if (feature_value->GetDictionary(i, &features_info_value)) {
+          const base::ListValue* exception_list_value = NULL;
+          if (features_info_value->size() > 1) {
+            LOG(WARNING) << "Malformed feature entry " << entry->id();
+            return NULL;
+          }
+          if (features_info_value->GetList("exceptions",
+                                           &exception_list_value)) {
+            for (size_t i = 0; i < exception_list_value->GetSize(); ++i) {
+              std::string exception_feature;
+              if (exception_list_value->GetString(i, &exception_feature)) {
+                feature_exception_list.push_back(exception_feature);
+              } else {
+                LOG(WARNING) << "Malformed feature entry " << entry->id();
+                return NULL;
+              }
+            }
+          } else {
+            LOG(WARNING) << "Malformed feature entry " << entry->id();
+            return NULL;
+          }
         } else {
           LOG(WARNING) << "Malformed feature entry " << entry->id();
           return NULL;
         }
       }
-      if (!entry->SetFeatures(
-              feature_list, feature_map, supports_feature_type_all)) {
+      if (!entry->SetFeatures(feature_list, feature_exception_list, feature_map,
+                              supports_feature_type_all)) {
         LOG(WARNING) << "Malformed feature entry " << entry->id();
         return NULL;
       }
@@ -997,6 +1020,7 @@
 
 bool GpuControlList::GpuControlListEntry::SetFeatures(
     const std::vector<std::string>& feature_strings,
+    const std::vector<std::string>& exception_strings,
     const FeatureMap& feature_map,
     bool supports_feature_type_all) {
   size_t size = feature_strings.size();
@@ -1007,15 +1031,20 @@
     int feature = 0;
     if (supports_feature_type_all && feature_strings[i] == "all") {
       for (FeatureMap::const_iterator iter = feature_map.begin();
-           iter != feature_map.end(); ++iter)
-        features_.insert(iter->second);
+           iter != feature_map.end(); ++iter) {
+        if (std::find(exception_strings.begin(), exception_strings.end(),
+                      iter->first) == exception_strings.end())
+          features_.insert(iter->second);
+      }
       continue;
     }
     if (!StringToFeature(feature_strings[i], &feature, feature_map)) {
       features_.clear();
       return false;
     }
-    features_.insert(feature);
+    if (std::find(exception_strings.begin(), exception_strings.end(),
+                  feature_strings[i]) == exception_strings.end())
+      features_.insert(feature);
   }
   return true;
 }
diff --git a/gpu/config/gpu_control_list.h b/gpu/config/gpu_control_list.h
index 5d297761..6cd133ff 100644
--- a/gpu/config/gpu_control_list.h
+++ b/gpu/config/gpu_control_list.h
@@ -404,6 +404,7 @@
     void SetInProcessGPUInfo(bool value);
 
     bool SetFeatures(const std::vector<std::string>& features,
+                     const std::vector<std::string>& exceptions,
                      const FeatureMap& feature_map,
                      bool supports_feature_type_all);
 
diff --git a/gpu/config/gpu_control_list_entry_unittest.cc b/gpu/config/gpu_control_list_entry_unittest.cc
index f26e3ac..9228b97 100644
--- a/gpu/config/gpu_control_list_entry_unittest.cc
+++ b/gpu/config/gpu_control_list_entry_unittest.cc
@@ -816,6 +816,53 @@
   EXPECT_EQ(1u, entry->features().count(TEST_FEATURE_2));
 }
 
+TEST_F(GpuControlListEntryTest, FeatureTypeAllEntryWithExceptions) {
+  const std::string json = LONG_STRING_CONST(
+      {
+        "id": 1,
+        "features": [
+          "all",
+          {"exceptions" : [
+            "test_feature_0"
+          ]}
+        ]
+      }
+  );
+  bool supports_feature_type_all = true;
+  ScopedEntry entry(GetEntryFromString(json, supports_feature_type_all));
+  EXPECT_TRUE(entry.get() != NULL);
+  EXPECT_EQ(1u, entry->features().count(TEST_FEATURE_1));
+  EXPECT_EQ(1u, entry->features().count(TEST_FEATURE_2));
+  EXPECT_EQ(2u, entry->features().size());
+
+  supports_feature_type_all = false;
+  entry = ScopedEntry(GetEntryFromString(json, supports_feature_type_all));
+  EXPECT_TRUE(entry.get() == NULL);
+}
+
+TEST_F(GpuControlListEntryTest, FeatureTypeAllEntryWithUnknownField) {
+  const std::string json = LONG_STRING_CONST(
+      {
+        "id": 1,
+        "features": [
+          "all", {
+            "exceptions" : [
+              "test_feature_0"
+            ],
+            "unknown_field" : 0
+          }
+        ]
+      }
+  );
+  bool supports_feature_type_all = true;
+  ScopedEntry entry(GetEntryFromString(json, supports_feature_type_all));
+  EXPECT_TRUE(entry.get() == NULL);
+
+  supports_feature_type_all = false;
+  entry = ScopedEntry(GetEntryFromString(json, supports_feature_type_all));
+  EXPECT_TRUE(entry.get() == NULL);
+}
+
 TEST_F(GpuControlListEntryTest, InvalidVendorIdEntry) {
   const std::string json = LONG_STRING_CONST(
       {
diff --git a/gpu/config/gpu_control_list_format.txt b/gpu/config/gpu_control_list_format.txt
index 4e2df42..7b23ad8 100644
--- a/gpu/config/gpu_control_list_format.txt
+++ b/gpu/config/gpu_control_list_format.txt
@@ -52,6 +52,8 @@
 // 20. "features" is a list of gpu control list options, which can be
 //     configured by a specific list. See its *_json.cc file for a list of
 //     supported features. This field is mandatory.
+//     An "exceptions" list to the features can be added for convenience instead
+//     of listing all features except one.
 // 21. "description" has the description of the entry.
 // 22. "webkit_bugs" is an array of associated webkit bug numbers.
 // 23. "cr_bugs" is an array of associated webkit bug numbers.
diff --git a/gpu/config/software_rendering_list_json.cc b/gpu/config/software_rendering_list_json.cc
index e33a485..a907d32 100644
--- a/gpu/config/software_rendering_list_json.cc
+++ b/gpu/config/software_rendering_list_json.cc
@@ -18,7 +18,7 @@
 {
   "name": "software rendering list",
   // Please update the version number whenever you change this file.
-  "version": "10.20",
+  "version": "11.0",
   "entries": [
     {
       "id": 1,
@@ -1184,15 +1184,10 @@
       "gl_vendor": "VMware.*",
       "gl_renderer": ".*Gallium.*llvmpipe.*",
       "features": [
-        "accelerated_2d_canvas",
-        "gpu_compositing",
-        "flash_3d",
-        "flash_stage3d",
-        "flash_stage3d_baseline",
-        "accelerated_video_decode",
-        "accelerated_video_encode",
-        "panel_fitting",
-        "gpu_rasterization"
+        "all",
+        {"exceptions": [
+          "webgl"
+        ]}
       ]
     }
   ]
diff --git a/gpu/gles2_conform_support/egl/display.cc b/gpu/gles2_conform_support/egl/display.cc
index 83a8a87..f12c942 100644
--- a/gpu/gles2_conform_support/egl/display.cc
+++ b/gpu/gles2_conform_support/egl/display.cc
@@ -163,8 +163,6 @@
   }
   std::unique_ptr<gpu::CommandBufferService> command_buffer(
       new gpu::CommandBufferService(transfer_buffer_manager_.get()));
-  if (!command_buffer->Initialize())
-    return NULL;
 
   scoped_refptr<gpu::gles2::FeatureInfo> feature_info(
       new gpu::gles2::FeatureInfo(gpu_driver_bug_workarounds_));
diff --git a/gpu/gpu.gyp b/gpu/gpu.gyp
index 11b091d..e8ea6657 100644
--- a/gpu/gpu.gyp
+++ b/gpu/gpu.gyp
@@ -337,6 +337,9 @@
       ],
       'conditions': [
         ['OS == "android"', {
+          'dependencies': [
+            '../testing/android/native_test.gyp:native_test_native_code',
+          ],
           'sources': [
             'ipc/service/gpu_memory_buffer_factory_surface_texture_unittest.cc',
           ],
@@ -494,6 +497,9 @@
       'target_name': 'gpu_ipc_service_test_support',
       'type': 'static_library',
       'dependencies': [
+        # TODO(markdittmer): Shouldn't depend on client code for server tests.
+        # See crbug.com/608800.
+        'gpu_ipc_client',
       ],
       'include_dirs': [
         '..',
diff --git a/gpu/ipc/client/android/in_process_surface_texture_manager.h b/gpu/ipc/client/android/in_process_surface_texture_manager.h
index 95ce509..358f480e 100644
--- a/gpu/ipc/client/android/in_process_surface_texture_manager.h
+++ b/gpu/ipc/client/android/in_process_surface_texture_manager.h
@@ -19,7 +19,7 @@
 
 class GPU_EXPORT InProcessSurfaceTextureManager : public SurfaceTextureManager {
  public:
-  static InProcessSurfaceTextureManager* GetInstance();
+  static GPU_EXPORT InProcessSurfaceTextureManager* GetInstance();
 
   // Overridden from SurfaceTextureManager:
   void RegisterSurfaceTexture(int surface_texture_id,
diff --git a/gpu/ipc/client/command_buffer_proxy_impl.cc b/gpu/ipc/client/command_buffer_proxy_impl.cc
index 9e95c50e..714b4dc 100644
--- a/gpu/ipc/client/command_buffer_proxy_impl.cc
+++ b/gpu/ipc/client/command_buffer_proxy_impl.cc
@@ -39,13 +39,15 @@
 
 }  // namespace
 
-CommandBufferProxyImpl::CommandBufferProxyImpl(GpuChannelHost* channel,
-                                               int32_t route_id,
-                                               int32_t stream_id)
+CommandBufferProxyImpl::CommandBufferProxyImpl(
+    scoped_refptr<GpuChannelHost> channel,
+    int32_t route_id,
+    int32_t stream_id)
     : lock_(nullptr),
       gpu_control_client_(nullptr),
-      channel_(channel),
-      command_buffer_id_(CommandBufferProxyID(channel->channel_id(), route_id)),
+      channel_(std::move(channel)),
+      command_buffer_id_(
+          CommandBufferProxyID(channel_->channel_id(), route_id)),
       route_id_(route_id),
       stream_id_(stream_id),
       flush_count_(0),
@@ -57,7 +59,7 @@
       next_signal_id_(0),
       weak_this_(AsWeakPtr()),
       callback_thread_(base::ThreadTaskRunnerHandle::Get()) {
-  DCHECK(channel);
+  DCHECK(channel_);
   DCHECK(stream_id);
 }
 
@@ -606,23 +608,13 @@
   signal_tasks_.insert(std::make_pair(signal_id, callback));
 }
 
-void CommandBufferProxyImpl::TakeFrontBuffer(const gpu::Mailbox& mailbox) {
+bool CommandBufferProxyImpl::ProduceFrontBuffer(const gpu::Mailbox& mailbox) {
   CheckLock();
   if (last_state_.error != gpu::error::kNoError)
-    return;
+    return false;
 
-  Send(new GpuCommandBufferMsg_TakeFrontBuffer(route_id_, mailbox));
-}
-
-void CommandBufferProxyImpl::ReturnFrontBuffer(const gpu::Mailbox& mailbox,
-                                               const gpu::SyncToken& sync_token,
-                                               bool is_lost) {
-  CheckLock();
-  if (last_state_.error != gpu::error::kNoError)
-    return;
-
-  Send(new GpuCommandBufferMsg_ReturnFrontBuffer(route_id_, mailbox, sync_token,
-                                                 is_lost));
+  Send(new GpuCommandBufferMsg_ProduceFrontBuffer(route_id_, mailbox));
+  return true;
 }
 
 gpu::error::Error CommandBufferProxyImpl::GetLastError() {
diff --git a/gpu/ipc/client/command_buffer_proxy_impl.h b/gpu/ipc/client/command_buffer_proxy_impl.h
index 0fd2e93..203a8a9 100644
--- a/gpu/ipc/client/command_buffer_proxy_impl.h
+++ b/gpu/ipc/client/command_buffer_proxy_impl.h
@@ -66,17 +66,17 @@
   typedef base::Callback<void(const std::string& msg, int id)>
       GpuConsoleMessageCallback;
 
-  CommandBufferProxyImpl(GpuChannelHost* channel,
+  CommandBufferProxyImpl(scoped_refptr<GpuChannelHost> channel,
                          int32_t route_id,
                          int32_t stream_id);
   ~CommandBufferProxyImpl() override;
+  bool Initialize();
 
   // IPC::Listener implementation:
   bool OnMessageReceived(const IPC::Message& message) override;
   void OnChannelError() override;
 
   // CommandBuffer implementation:
-  bool Initialize() override;
   State GetLastState() override;
   int32_t GetLastToken() override;
   void Flush(int32_t put_offset) override;
@@ -114,10 +114,7 @@
                        const base::Closure& callback) override;
   bool CanWaitUnverifiedSyncToken(const gpu::SyncToken* sync_token) override;
 
-  void TakeFrontBuffer(const gpu::Mailbox& mailbox);
-  void ReturnFrontBuffer(const gpu::Mailbox& mailbox,
-                         const gpu::SyncToken& sync_token,
-                         bool is_lost);
+  bool ProduceFrontBuffer(const gpu::Mailbox& mailbox);
 
   void AddDeletionObserver(DeletionObserver* observer);
   void RemoveDeletionObserver(DeletionObserver* observer);
@@ -148,7 +145,7 @@
 
   int32_t stream_id() const { return stream_id_; }
 
-  GpuChannelHost* channel() const { return channel_; }
+  const scoped_refptr<GpuChannelHost>& channel() const { return channel_; }
 
   base::SharedMemoryHandle GetSharedStateHandle() const {
     return shared_state_shm_->handle();
@@ -235,9 +232,7 @@
   // The shared memory area used to update state.
   std::unique_ptr<base::SharedMemory> shared_state_shm_;
 
-  // |*this| is owned by |*channel_| and so is always outlived by it, so using a
-  // raw pointer is ok.
-  GpuChannelHost* channel_;
+  scoped_refptr<GpuChannelHost> channel_;
   const gpu::CommandBufferId command_buffer_id_;
   const int32_t route_id_;
   const int32_t stream_id_;
diff --git a/gpu/ipc/client/gpu_channel_host.cc b/gpu/ipc/client/gpu_channel_host.cc
index 68ed8cc..be6a3f7 100644
--- a/gpu/ipc/client/gpu_channel_host.cc
+++ b/gpu/ipc/client/gpu_channel_host.cc
@@ -238,6 +238,8 @@
   std::unique_ptr<CommandBufferProxyImpl> command_buffer =
       base::WrapUnique(new CommandBufferProxyImpl(this, route_id, stream_id));
   AddRoute(route_id, command_buffer->AsWeakPtr());
+  if (!command_buffer->Initialize())
+    return nullptr;
 
   return command_buffer;
 }
diff --git a/gpu/ipc/common/BUILD.gn b/gpu/ipc/common/BUILD.gn
index 7b31e89..33e8cd1 100644
--- a/gpu/ipc/common/BUILD.gn
+++ b/gpu/ipc/common/BUILD.gn
@@ -39,7 +39,6 @@
     "gpu_command_buffer_traits.cc",
     "gpu_command_buffer_traits.h",
     "gpu_command_buffer_traits_multi.h",
-    "id_type_traits.h",
   ]
 
   configs += [
diff --git a/gpu/ipc/common/gpu_command_buffer_traits.h b/gpu/ipc/common/gpu_command_buffer_traits.h
index 24a69c0..11209470 100644
--- a/gpu/ipc/common/gpu_command_buffer_traits.h
+++ b/gpu/ipc/common/gpu_command_buffer_traits.h
@@ -2,14 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef GPU_IPC_GPU_PARAM_TRAITS_H_
-#define GPU_IPC_GPU_PARAM_TRAITS_H_
+#ifndef GPU_IPC_COMMON_GPU_COMMAND_BUFFER_TRAITS_H_
+#define GPU_IPC_COMMON_GPU_COMMAND_BUFFER_TRAITS_H_
 
 #include "gpu/command_buffer/common/command_buffer.h"
+#include "gpu/command_buffer/common/id_type.h"
 #include "gpu/gpu_export.h"
 #include "gpu/ipc/common/gpu_command_buffer_traits_multi.h"
-#include "gpu/ipc/common/id_type_traits.h"
 #include "ipc/ipc_message_utils.h"
+#include "ipc/ipc_param_traits.h"
 
 namespace gpu {
 struct Mailbox;
@@ -21,7 +22,7 @@
 
 template <>
 struct GPU_EXPORT ParamTraits<gpu::CommandBuffer::State> {
-  typedef gpu::CommandBuffer::State param_type;
+  using param_type = gpu::CommandBuffer::State;
   static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
@@ -32,7 +33,7 @@
 
 template <>
 struct GPU_EXPORT ParamTraits<gpu::SyncToken> {
-  typedef gpu::SyncToken param_type;
+  using param_type = gpu::SyncToken;
   static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
@@ -43,7 +44,7 @@
 
 template<>
 struct GPU_EXPORT ParamTraits<gpu::Mailbox> {
-  typedef gpu::Mailbox param_type;
+  using param_type = gpu::Mailbox;
   static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
@@ -54,7 +55,7 @@
 
 template <>
 struct GPU_EXPORT ParamTraits<gpu::MailboxHolder> {
-  typedef gpu::MailboxHolder param_type;
+  using param_type = gpu::MailboxHolder;
   static void GetSize(base::PickleSizer* s, const param_type& p);
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
@@ -63,6 +64,29 @@
   static void Log(const param_type& p, std::string* l);
 };
 
+template <typename TypeMarker, typename WrappedType, WrappedType kInvalidValue>
+struct ParamTraits<gpu::IdType<TypeMarker, WrappedType, kInvalidValue>> {
+  using param_type = gpu::IdType<TypeMarker, WrappedType, kInvalidValue>;
+  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
+    GetParamSize(sizer, p.GetUnsafeValue());
+  }
+  static void Write(base::Pickle* m, const param_type& p) {
+    WriteParam(m, p.GetUnsafeValue());
+  }
+  static bool Read(const base::Pickle* m,
+                   base::PickleIterator* iter,
+                   param_type* r) {
+    WrappedType value;
+    if (!ReadParam(m, iter, &value))
+      return false;
+    *r = param_type::FromUnsafeValue(value);
+    return true;
+  }
+  static void Log(const param_type& p, std::string* l) {
+    LogParam(p.GetUnsafeValue(), l);
+  }
+};
+
 }  // namespace IPC
 
-#endif  // GPU_IPC_GPU_PARAM_TRAITS_H_
+#endif  // GPU_IPC_COMMON_GPU_COMMAND_BUFFER_TRAITS_H_
diff --git a/gpu/ipc/common/gpu_messages.h b/gpu/ipc/common/gpu_messages.h
index 3d658a56..8580054 100644
--- a/gpu/ipc/common/gpu_messages.h
+++ b/gpu/ipc/common/gpu_messages.h
@@ -138,18 +138,11 @@
 IPC_SYNC_MESSAGE_ROUTED1_0(GpuCommandBufferMsg_SetGetBuffer,
                            int32_t /* shm_id */)
 
-// Takes the front buffer into a mailbox. This allows another context to draw
+// Produces the front buffer into a mailbox. This allows another context to draw
 // the output of this context.
-IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_TakeFrontBuffer,
+IPC_MESSAGE_ROUTED1(GpuCommandBufferMsg_ProduceFrontBuffer,
                     gpu::Mailbox /* mailbox */)
 
-// Returns a front buffer taken with GpuCommandBufferMsg_TakeFrontBuffer. This
-// allows it to be reused.
-IPC_MESSAGE_ROUTED3(GpuCommandBufferMsg_ReturnFrontBuffer,
-                    gpu::Mailbox /* mailbox */,
-                    gpu::SyncToken /* sync_token */,
-                    bool /* is_lost */)
-
 // Wait until the token is in a specific range, inclusive.
 IPC_SYNC_MESSAGE_ROUTED2_1(GpuCommandBufferMsg_WaitForTokenInRange,
                            int32_t /* start */,
diff --git a/gpu/ipc/common/gpu_param_traits_macros.h b/gpu/ipc/common/gpu_param_traits_macros.h
index 8c65904..d97d87b35 100644
--- a/gpu/ipc/common/gpu_param_traits_macros.h
+++ b/gpu/ipc/common/gpu_param_traits_macros.h
@@ -13,7 +13,6 @@
 #include "ipc/ipc_message_macros.h"
 #include "ui/gfx/ipc/geometry/gfx_param_traits.h"
 #include "ui/gfx/ipc/gfx_param_traits.h"
-#include "ui/gfx/swap_result.h"
 #include "ui/gl/gpu_preference.h"
 #include "url/ipc/url_param_traits.h"
 
@@ -41,7 +40,6 @@
 
 IPC_ENUM_TRAITS_MAX_VALUE(gfx::GpuPreference, gfx::GpuPreferenceLast)
 IPC_ENUM_TRAITS_MAX_VALUE(gpu::GpuStreamPriority, gpu::GpuStreamPriority::LAST)
-IPC_ENUM_TRAITS_MAX_VALUE(gfx::SwapResult, gfx::SwapResult::SWAP_RESULT_LAST)
 IPC_ENUM_TRAITS_MAX_VALUE(gpu::MemoryAllocation::PriorityCutoff,
                           gpu::MemoryAllocation::CUTOFF_LAST)
 IPC_ENUM_TRAITS_MAX_VALUE(gpu::error::ContextLostReason,
diff --git a/gpu/ipc/common/id_type_traits.h b/gpu/ipc/common/id_type_traits.h
deleted file mode 100644
index d2decb7..0000000
--- a/gpu/ipc/common/id_type_traits.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2016 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 GPU_IPC_ID_TYPE_TRAITS_H_
-#define GPU_IPC_ID_TYPE_TRAITS_H_
-
-#include <string>
-
-#include "base/pickle.h"
-#include "gpu/command_buffer/common/id_type.h"
-#include "ipc/ipc_message_utils.h"
-#include "ipc/ipc_param_traits.h"
-
-namespace IPC {
-
-template <typename TypeMarker, typename WrappedType, WrappedType kInvalidValue>
-struct ParamTraits<gpu::IdType<TypeMarker, WrappedType, kInvalidValue>> {
-  using param_type = gpu::IdType<TypeMarker, WrappedType, kInvalidValue>;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, p.GetUnsafeValue());
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, p.GetUnsafeValue());
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    WrappedType value;
-    if (!ReadParam(m, iter, &value))
-      return false;
-    *r = param_type::FromUnsafeValue(value);
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-    LogParam(p.GetUnsafeValue(), l);
-  }
-};
-
-}  // namespace IPC
-
-#endif  // GPU_IPC_ID_TYPE_TRAITS_H_
diff --git a/gpu/ipc/service/BUILD.gn b/gpu/ipc/service/BUILD.gn
index ec4ce25..2213b0f 100644
--- a/gpu/ipc/service/BUILD.gn
+++ b/gpu/ipc/service/BUILD.gn
@@ -113,6 +113,9 @@
     "//testing/gtest:gtest",
   ]
   deps = [
+    # TODO(markdittmer): Shouldn't depend on client code for server tests.
+    # See crbug.com/608800.
+    "//gpu/ipc/client",
     "//gpu/ipc/common",
   ]
 }
diff --git a/gpu/ipc/service/gpu_channel_unittest.cc b/gpu/ipc/service/gpu_channel_unittest.cc
index b59ed38..9d5809a 100644
--- a/gpu/ipc/service/gpu_channel_unittest.cc
+++ b/gpu/ipc/service/gpu_channel_unittest.cc
@@ -70,6 +70,10 @@
 #endif
 
 TEST_F(GpuChannelTest, CreateViewCommandBufferAllowed) {
+  // We need GL bindings to actually initialize command buffers.
+  gfx::SetGLGetProcAddressProc(gfx::MockGLInterface::GetGLProcAddress);
+  gfx::GLSurfaceTestSupport::InitializeOneOffWithMockBindings();
+
   int32_t kClientId = 1;
   bool allow_view_command_buffers = true;
   GpuChannel* channel =
diff --git a/gpu/ipc/service/gpu_command_buffer_stub.cc b/gpu/ipc/service/gpu_command_buffer_stub.cc
index 90818f6..6d05eb5 100644
--- a/gpu/ipc/service/gpu_command_buffer_stub.cc
+++ b/gpu/ipc/service/gpu_command_buffer_stub.cc
@@ -295,9 +295,8 @@
                                     OnInitialize);
     IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_SetGetBuffer,
                                     OnSetGetBuffer);
-    IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_TakeFrontBuffer, OnTakeFrontBuffer);
-    IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_ReturnFrontBuffer,
-                        OnReturnFrontBuffer);
+    IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_ProduceFrontBuffer,
+                        OnProduceFrontBuffer);
     IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_WaitForTokenInRange,
                                     OnWaitForTokenInRange);
     IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_WaitForGetOffsetInRange,
@@ -534,15 +533,12 @@
   command_buffer_.reset(new CommandBufferService(
       context_group_->transfer_buffer_manager()));
 
-  bool result = command_buffer_->Initialize();
-  DCHECK(result);
-
   GpuChannelManager* manager = channel_->gpu_channel_manager();
   DCHECK(manager);
 
   decoder_.reset(gles2::GLES2Decoder::Create(context_group_.get()));
-  executor_.reset(new CommandExecutor(command_buffer_.get(),
-                                           decoder_.get(), decoder_.get()));
+  executor_.reset(new CommandExecutor(command_buffer_.get(), decoder_.get(),
+                                      decoder_.get()));
   sync_point_client_ = sync_point_manager_->CreateSyncPointClient(
       channel_->GetSyncPointOrderData(stream_id_),
       CommandBufferNamespace::GPU_IO, command_buffer_id_);
@@ -715,22 +711,14 @@
   Send(reply_message);
 }
 
-void GpuCommandBufferStub::OnTakeFrontBuffer(const Mailbox& mailbox) {
-  TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnTakeFrontBuffer");
+void GpuCommandBufferStub::OnProduceFrontBuffer(const Mailbox& mailbox) {
+  TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnProduceFrontBuffer");
   if (!decoder_) {
-    LOG(ERROR) << "Can't take front buffer before initialization.";
+    LOG(ERROR) << "Can't produce front buffer before initialization.";
     return;
   }
 
-  decoder_->TakeFrontBuffer(mailbox);
-}
-
-void GpuCommandBufferStub::OnReturnFrontBuffer(const Mailbox& mailbox,
-                                               const SyncToken& sync_token,
-                                               bool is_lost) {
-  OnWaitFenceSync(sync_token.namespace_id(), sync_token.command_buffer_id(),
-                  sync_token.release_count());
-  decoder_->ReturnFrontBuffer(mailbox, is_lost);
+  decoder_->ProduceFrontBuffer(mailbox);
 }
 
 void GpuCommandBufferStub::OnParseError() {
diff --git a/gpu/ipc/service/gpu_command_buffer_stub.h b/gpu/ipc/service/gpu_command_buffer_stub.h
index d99f59b4..bf40d4f 100644
--- a/gpu/ipc/service/gpu_command_buffer_stub.h
+++ b/gpu/ipc/service/gpu_command_buffer_stub.h
@@ -160,10 +160,7 @@
   void OnInitialize(base::SharedMemoryHandle shared_state_shm,
                     IPC::Message* reply_message);
   void OnSetGetBuffer(int32_t shm_id, IPC::Message* reply_message);
-  void OnTakeFrontBuffer(const Mailbox& mailbox);
-  void OnReturnFrontBuffer(const Mailbox& mailbox,
-                           const SyncToken& sync_token,
-                           bool is_lost);
+  void OnProduceFrontBuffer(const Mailbox& mailbox);
   void OnGetState(IPC::Message* reply_message);
   void OnWaitForTokenInRange(int32_t start,
                              int32_t end,
diff --git a/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h b/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h
index d3d42b64..7fa415e 100644
--- a/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h
+++ b/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h
@@ -8,8 +8,16 @@
 #ifndef GPU_IPC_SERVICE_GPU_MEMORY_BUFFER_FACTORY_TEST_TEMPLATE_H_
 #define GPU_IPC_SERVICE_GPU_MEMORY_BUFFER_FACTORY_TEST_TEMPLATE_H_
 
-#include "gpu/ipc/service/gpu_memory_buffer_factory.h"
+#if defined(OS_ANDROID)
+// TODO(markdittmer): Service code shouldn't depend on client code.
+// See crbug.com/608800.
+#include "gpu/ipc/client/android/in_process_surface_texture_manager.h"
+
+#include "gpu/ipc/common/android/surface_texture_manager.h"
+#endif
+
 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
+#include "gpu/ipc/service/gpu_memory_buffer_factory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/buffer_format_util.h"
 
@@ -24,6 +32,11 @@
 TYPED_TEST_CASE_P(GpuMemoryBufferFactoryTest);
 
 TYPED_TEST_P(GpuMemoryBufferFactoryTest, CreateGpuMemoryBuffer) {
+#if defined(OS_ANDROID)
+  SurfaceTextureManager::SetInstance(
+      InProcessSurfaceTextureManager::GetInstance());
+#endif
+
   const gfx::GpuMemoryBufferId kBufferId(1);
   const int kClientId = 1;
 
diff --git a/headless/BUILD.gn b/headless/BUILD.gn
index 5133e623..e1a853e 100644
--- a/headless/BUILD.gn
+++ b/headless/BUILD.gn
@@ -260,6 +260,7 @@
     "//ui/aura",
     "//ui/base",
     "//ui/compositor",
+    "//ui/display",
     "//ui/ozone",
     "//url",
   ]
diff --git a/headless/DEPS b/headless/DEPS
index b251cd9..2e747057 100644
--- a/headless/DEPS
+++ b/headless/DEPS
@@ -4,6 +4,7 @@
   "+net",
   "+ui/base",
   "+ui/base/resource",
+  "+ui/display",
   "+ui/gfx",
   "+ui/gfx/geometry",
   "+ui/ozone/public",
diff --git a/headless/lib/browser/headless_browser_main_parts.cc b/headless/lib/browser/headless_browser_main_parts.cc
index f3051ae..7a2ed47 100644
--- a/headless/lib/browser/headless_browser_main_parts.cc
+++ b/headless/lib/browser/headless_browser_main_parts.cc
@@ -10,7 +10,7 @@
 #include "headless/lib/browser/headless_devtools.h"
 #include "headless/lib/browser/headless_screen.h"
 #include "ui/aura/env.h"
-#include "ui/gfx/screen.h"
+#include "ui/display/screen.h"
 
 namespace headless {
 
@@ -18,7 +18,7 @@
 
 void PlatformInitialize() {
   HeadlessScreen* screen = HeadlessScreen::Create(gfx::Size());
-  gfx::Screen::SetScreenInstance(screen);
+  display::Screen::SetScreenInstance(screen);
 }
 
 void PlatformExit() {
diff --git a/headless/lib/browser/headless_screen.cc b/headless/lib/browser/headless_screen.cc
index 6d6f607..e7be71a 100644
--- a/headless/lib/browser/headless_screen.cc
+++ b/headless/lib/browser/headless_screen.cc
@@ -12,18 +12,18 @@
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/base/ime/input_method.h"
+#include "ui/display/screen.h"
 #include "ui/gfx/geometry/rect_conversions.h"
 #include "ui/gfx/geometry/size_conversions.h"
 #include "ui/gfx/native_widget_types.h"
-#include "ui/gfx/screen.h"
 
 namespace headless {
 
 namespace {
 
-bool IsRotationPortrait(gfx::Display::Rotation rotation) {
-  return rotation == gfx::Display::ROTATE_90 ||
-         rotation == gfx::Display::ROTATE_270;
+bool IsRotationPortrait(display::Display::Rotation rotation) {
+  return rotation == display::Display::ROTATE_90 ||
+         rotation == display::Display::ROTATE_270;
 }
 
 }  // namespace
@@ -52,7 +52,7 @@
   display_.SetScaleAndBounds(device_scale_factor, bounds_in_pixel);
 }
 
-void HeadlessScreen::SetDisplayRotation(gfx::Display::Rotation rotation) {
+void HeadlessScreen::SetDisplayRotation(display::Display::Rotation rotation) {
   gfx::Rect bounds_in_pixel(display_.GetSizeInPixel());
   gfx::Rect new_bounds(bounds_in_pixel);
   if (IsRotationPortrait(rotation) != IsRotationPortrait(display_.rotation())) {
@@ -80,17 +80,17 @@
 gfx::Transform HeadlessScreen::GetRotationTransform() const {
   gfx::Transform rotate;
   switch (display_.rotation()) {
-    case gfx::Display::ROTATE_0:
+    case display::Display::ROTATE_0:
       break;
-    case gfx::Display::ROTATE_90:
+    case display::Display::ROTATE_90:
       rotate.Translate(display_.bounds().height(), 0);
       rotate.Rotate(90);
       break;
-    case gfx::Display::ROTATE_270:
+    case display::Display::ROTATE_270:
       rotate.Translate(0, display_.bounds().width());
       rotate.Rotate(270);
       break;
-    case gfx::Display::ROTATE_180:
+    case display::Display::ROTATE_180:
       rotate.Translate(display_.bounds().width(), display_.bounds().height());
       rotate.Rotate(180);
       break;
@@ -122,8 +122,8 @@
   return aura::Env::GetInstance()->last_mouse_location();
 }
 
-gfx::NativeWindow HeadlessScreen::GetWindowUnderCursor() {
-  return GetWindowAtScreenPoint(GetCursorScreenPoint());
+bool HeadlessScreen::IsWindowUnderCursor(gfx::NativeWindow window) {
+  return GetWindowAtScreenPoint(GetCursorScreenPoint()) == window;
 }
 
 gfx::NativeWindow HeadlessScreen::GetWindowAtScreenPoint(
@@ -137,32 +137,32 @@
   return 1;
 }
 
-std::vector<gfx::Display> HeadlessScreen::GetAllDisplays() const {
-  return std::vector<gfx::Display>(1, display_);
+std::vector<display::Display> HeadlessScreen::GetAllDisplays() const {
+  return std::vector<display::Display>(1, display_);
 }
 
-gfx::Display HeadlessScreen::GetDisplayNearestWindow(
+display::Display HeadlessScreen::GetDisplayNearestWindow(
     gfx::NativeWindow window) const {
   return display_;
 }
 
-gfx::Display HeadlessScreen::GetDisplayNearestPoint(
+display::Display HeadlessScreen::GetDisplayNearestPoint(
     const gfx::Point& point) const {
   return display_;
 }
 
-gfx::Display HeadlessScreen::GetDisplayMatching(
+display::Display HeadlessScreen::GetDisplayMatching(
     const gfx::Rect& match_rect) const {
   return display_;
 }
 
-gfx::Display HeadlessScreen::GetPrimaryDisplay() const {
+display::Display HeadlessScreen::GetPrimaryDisplay() const {
   return display_;
 }
 
-void HeadlessScreen::AddObserver(gfx::DisplayObserver* observer) {}
+void HeadlessScreen::AddObserver(display::DisplayObserver* observer) {}
 
-void HeadlessScreen::RemoveObserver(gfx::DisplayObserver* observer) {}
+void HeadlessScreen::RemoveObserver(display::DisplayObserver* observer) {}
 
 HeadlessScreen::HeadlessScreen(const gfx::Rect& screen_bounds)
     : host_(NULL), ui_scale_(1.0f) {
diff --git a/headless/lib/browser/headless_screen.h b/headless/lib/browser/headless_screen.h
index bfa815ed..f0c363c 100644
--- a/headless/lib/browser/headless_screen.h
+++ b/headless/lib/browser/headless_screen.h
@@ -8,8 +8,8 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "ui/aura/window_observer.h"
-#include "ui/gfx/display.h"
-#include "ui/gfx/screen.h"
+#include "ui/display/display.h"
+#include "ui/display/screen.h"
 
 namespace gfx {
 class Insets;
@@ -25,17 +25,17 @@
 
 namespace headless {
 
-class HeadlessScreen : public gfx::Screen, public aura::WindowObserver {
+class HeadlessScreen : public display::Screen, public aura::WindowObserver {
  public:
-  // Creates a gfx::Screen of the specified size. If no size is specified, then
-  // creates a 800x600 screen. |size| is in physical pixels.
+  // Creates a display::Screen of the specified size. If no size is specified,
+  // then creates a 800x600 screen. |size| is in physical pixels.
   static HeadlessScreen* Create(const gfx::Size& size);
   ~HeadlessScreen() override;
 
   aura::WindowTreeHost* CreateHostForPrimaryDisplay();
 
   void SetDeviceScaleFactor(float device_scale_fator);
-  void SetDisplayRotation(gfx::Display::Rotation rotation);
+  void SetDisplayRotation(display::Display::Rotation rotation);
   void SetUIScale(float ui_scale);
   void SetWorkAreaInsets(const gfx::Insets& insets);
 
@@ -49,24 +49,26 @@
                              const gfx::Rect& new_bounds) override;
   void OnWindowDestroying(aura::Window* window) override;
 
-  // gfx::Screen overrides:
+  // display::Screen overrides:
   gfx::Point GetCursorScreenPoint() override;
-  gfx::NativeWindow GetWindowUnderCursor() override;
+  bool IsWindowUnderCursor(gfx::NativeWindow window) override;
   gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override;
   int GetNumDisplays() const override;
-  std::vector<gfx::Display> GetAllDisplays() const override;
-  gfx::Display GetDisplayNearestWindow(gfx::NativeView view) const override;
-  gfx::Display GetDisplayNearestPoint(const gfx::Point& point) const override;
-  gfx::Display GetDisplayMatching(const gfx::Rect& match_rect) const override;
-  gfx::Display GetPrimaryDisplay() const override;
-  void AddObserver(gfx::DisplayObserver* observer) override;
-  void RemoveObserver(gfx::DisplayObserver* observer) override;
+  std::vector<display::Display> GetAllDisplays() const override;
+  display::Display GetDisplayNearestWindow(gfx::NativeView view) const override;
+  display::Display GetDisplayNearestPoint(
+      const gfx::Point& point) const override;
+  display::Display GetDisplayMatching(
+      const gfx::Rect& match_rect) const override;
+  display::Display GetPrimaryDisplay() const override;
+  void AddObserver(display::DisplayObserver* observer) override;
+  void RemoveObserver(display::DisplayObserver* observer) override;
 
  private:
   explicit HeadlessScreen(const gfx::Rect& screen_bounds);
 
   aura::WindowTreeHost* host_;
-  gfx::Display display_;
+  display::Display display_;
   float ui_scale_;
 
   DISALLOW_COPY_AND_ASSIGN(HeadlessScreen);
diff --git a/infra/config/cq.cfg b/infra/config/cq.cfg
index 1512160..d459bfdc 100644
--- a/infra/config/cq.cfg
+++ b/infra/config/cq.cfg
@@ -55,26 +55,10 @@
     }
     buckets {
       name: "tryserver.chromium.mac"
-      builders {
-        name: "ios-device"
-        experiment_percentage: 10
-      }
-      builders {
-        name: "ios-device-gn"
-        experiment_percentage: 10
-      }
-      builders {
-        name: "ios-simulator"
-        experiment_percentage: 10
-      }
-      builders {
-        name: "ios-simulator-gn"
-        experiment_percentage: 10
-      }
-      builders { name: "ios_dbg_simulator_ninja" }
-      builders { name: "ios_dbg_simulator_gn" }
-      builders { name: "ios_rel_device_ninja" }
-      builders { name: "ios_rel_device_gn" }
+      builders { name: "ios-device" }
+      builders { name: "ios-device-gn" }
+      builders { name: "ios-simulator" }
+      builders { name: "ios-simulator-gn" }
       builders { name: "mac_chromium_compile_dbg_ng" }
       builders { name: "mac_chromium_gn_rel" }
       builders { name: "mac_chromium_rel_ng" }
diff --git a/ios/build/bots/chromium.mac/iOS_Device.json b/ios/build/bots/chromium.mac/iOS_Device.json
deleted file mode 100644
index 350f9d7..0000000
--- a/ios/build/bots/chromium.mac/iOS_Device.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "owners": [
-    "smut"
-  ],
-  "comments": [
-    "Builder for 32-bit devices."
-  ],
-  "xcode version": "7.0",
-  "GYP_DEFINES": {
-    "chromium_ios_signing": "0",
-    "target_subarch": "arm32"
-  },
-  "compiler": "ninja",
-  "configuration": "Release",
-  "sdk": "iphoneos9.0",
-  "tests": [
-  ]
-}
diff --git "a/ios/build/bots/chromium.mac/iOS_Device_\050ninja\051.json" "b/ios/build/bots/chromium.mac/iOS_Device_\050ninja\051.json"
deleted file mode 100644
index d36ef37..0000000
--- "a/ios/build/bots/chromium.mac/iOS_Device_\050ninja\051.json"
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-  "owners": [
-    "smut"
-  ],
-  "comments": [
-    "Builder for fat binaries using ninja."
-  ],
-  "xcode version": "7.0",
-  "GYP_DEFINES": {
-    "OS": "ios",
-    "chromium_ios_signing": "0",
-    "target_subarch": "both",
-    "use_goma": "1"
-  },
-  "mb_type": "gyp",
-  "compiler": "ninja",
-  "configuration": "Release",
-  "sdk": "iphoneos9.0",
-  "tests": [
-  ]
-}
diff --git a/ios/build/bots/chromium.mac/iOS_Device_GN.json b/ios/build/bots/chromium.mac/iOS_Device_GN.json
deleted file mode 100644
index 2b73b4c..0000000
--- a/ios/build/bots/chromium.mac/iOS_Device_GN.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "owners": [
-    "dpranke",
-    "smut"
-  ],
-  "comments": [
-    "GN + Ninja fat binary builder."
-  ],
-  "xcode version": "7.0",
-  "GYP_DEFINES": {
-    "chromium_ios_signing": "0",
-    "target_subarch": "both",
-    "use_goma": "1"
-  },
-  "gn_args": [
-    "ios_enable_code_signing=false",
-    "target_cpu=\"arm\"",
-    "target_os=\"ios\"",
-    "use_goma=true"
-  ],
-  "mb_type": "gn",
-  "compiler": "ninja",
-  "additional_compile_targets": ["gn_all"],
-  "configuration": "Release",
-  "sdk": "iphoneos9.0",
-  "tests": [
-  ]
-}
diff --git "a/ios/build/bots/chromium.mac/iOS_Simulator_\050dbg\051.json" "b/ios/build/bots/chromium.mac/iOS_Simulator_\050dbg\051.json"
deleted file mode 100644
index 54bc4cbf..0000000
--- "a/ios/build/bots/chromium.mac/iOS_Simulator_\050dbg\051.json"
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "owners": [
-    "smut"
-  ],
-  "comments": [
-    "Tests for 32- and 64-bit iOS 9.0 simulators."
-  ],
-  "xcode version": "7.0",
-  "GYP_DEFINES": {
-    "chromium_ios_signing": "0",
-    "target_subarch": "both"
-  },
-  "compiler": "ninja",
-  "configuration": "Debug",
-  "sdk": "iphonesimulator9.0",
-  "tests": [
-    {
-      "include": "common_tests.json",
-      "device type": "iPhone 5s",
-      "os": "9.0"
-    },
-    {
-      "include": "common_tests.json",
-      "device type": "iPad Retina",
-      "os": "9.0"
-    }
-  ]
-}
diff --git "a/ios/build/bots/chromium.mac/iOS_Simulator_GN_\050dbg\051.json" "b/ios/build/bots/chromium.mac/iOS_Simulator_GN_\050dbg\051.json"
deleted file mode 100644
index e62ed39..0000000
--- "a/ios/build/bots/chromium.mac/iOS_Simulator_GN_\050dbg\051.json"
+++ /dev/null
@@ -1,39 +0,0 @@
-{
-  "owners": [
-    "dpranke",
-    "smut"
-  ],
-  "comments": [
-    "GN + Ninja simulator build."
-  ],
-  "xcode version": "7.0",
-  "GYP_DEFINES": {
-    "chromium_ios_signing": "0",
-    "gomadir": "$(goma_dir)",
-    "use_goma": "1"
-  },
-  "gn_args": [
-    "target_os=\"ios\"",
-    "target_cpu=\"x64\"",
-    "is_debug=true",
-    "use_goma=true",
-    "goma_dir=\"$(goma_dir)\""
-  ],
-  "mb_type": "gn",
-  "compiler": "ninja",
-  "additional_compile_targets": ["gn_all"],
-  "configuration": "Debug",
-  "sdk": "iphonesimulator9.0",
-  "tests": [
-    {
-      "include": "common_tests.json",
-      "device type": "iPhone 5s",
-      "os": "9.0"
-    },
-    {
-      "include": "common_tests.json",
-      "device type": "iPad Air",
-      "os": "9.0"
-    }
-  ]
-}
diff --git a/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator.json b/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator.json
deleted file mode 100644
index 54bc4cbf..0000000
--- a/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "owners": [
-    "smut"
-  ],
-  "comments": [
-    "Tests for 32- and 64-bit iOS 9.0 simulators."
-  ],
-  "xcode version": "7.0",
-  "GYP_DEFINES": {
-    "chromium_ios_signing": "0",
-    "target_subarch": "both"
-  },
-  "compiler": "ninja",
-  "configuration": "Debug",
-  "sdk": "iphonesimulator9.0",
-  "tests": [
-    {
-      "include": "common_tests.json",
-      "device type": "iPhone 5s",
-      "os": "9.0"
-    },
-    {
-      "include": "common_tests.json",
-      "device type": "iPad Retina",
-      "os": "9.0"
-    }
-  ]
-}
diff --git a/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator_gn.json b/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator_gn.json
deleted file mode 100644
index 36127c8..0000000
--- a/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator_gn.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "owners": [
-    "dpranke",
-    "smut"
-  ],
-  "comments": [
-    "GN + Ninja simulator build."
-  ],
-  "xcode version": "7.0",
-  "GYP_DEFINES": {
-    "chromium_ios_signing": "0",
-    "gomadir": "$(goma_dir)",
-    "use_goma": "1"
-  },
-  "gn_args": [
-    "target_os=\"ios\"",
-    "target_cpu=\"x64\"",
-    "is_debug=true",
-    "use_goma=true",
-    "goma_dir=\"$(goma_dir)\""
-  ],
-  "mb_type": "gn",
-  "compiler": "ninja",
-  "configuration": "Debug",
-  "sdk": "iphonesimulator9.0",
-  "tests": [
-  ]
-}
diff --git a/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator_ninja.json b/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator_ninja.json
deleted file mode 100644
index c4d8ab5..0000000
--- a/ios/build/bots/tryserver.chromium.mac/ios_dbg_simulator_ninja.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "owners": [
-    "smut"
-  ],
-  "comments": [
-    "Tests for 32- and 64-bit iOS 9.0 simulators."
-  ],
-  "xcode version": "7.0",
-  "GYP_DEFINES": {
-    "OS": "ios",
-    "chromium_ios_signing": "0",
-    "target_subarch": "both",
-    "use_goma": "1"
-  },
-  "mb_type": "gyp",
-  "compiler": "ninja",
-  "configuration": "Debug",
-  "sdk": "iphonesimulator9.0",
-  "tests": [
-    {
-      "include": "common_tests.json",
-      "device type": "iPhone 5s",
-      "os": "9.0"
-    },
-    {
-      "include": "common_tests.json",
-      "device type": "iPad Retina",
-      "os": "9.0"
-    }
-  ]
-}
diff --git a/ios/build/bots/tryserver.chromium.mac/ios_rel_device.json b/ios/build/bots/tryserver.chromium.mac/ios_rel_device.json
deleted file mode 100644
index 350f9d7..0000000
--- a/ios/build/bots/tryserver.chromium.mac/ios_rel_device.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "owners": [
-    "smut"
-  ],
-  "comments": [
-    "Builder for 32-bit devices."
-  ],
-  "xcode version": "7.0",
-  "GYP_DEFINES": {
-    "chromium_ios_signing": "0",
-    "target_subarch": "arm32"
-  },
-  "compiler": "ninja",
-  "configuration": "Release",
-  "sdk": "iphoneos9.0",
-  "tests": [
-  ]
-}
diff --git a/ios/build/bots/tryserver.chromium.mac/ios_rel_device_gn.json b/ios/build/bots/tryserver.chromium.mac/ios_rel_device_gn.json
deleted file mode 100644
index c915591..0000000
--- a/ios/build/bots/tryserver.chromium.mac/ios_rel_device_gn.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-  "owners": [
-    "dpranke",
-    "smut"
-  ],
-  "comments": [
-    "GN + Ninja fat binary builder."
-  ],
-  "xcode version": "7.0",
-  "GYP_DEFINES": {
-    "chromium_ios_signing": "0",
-    "target_subarch": "both",
-    "use_goma": "1"
-  },
-  "gn_args": [
-    "ios_enable_code_signing=false",
-    "target_cpu=\"arm\"",
-    "target_os=\"ios\"",
-    "use_goma=true"
-  ],
-  "mb_type": "gn",
-  "compiler": "ninja",
-  "configuration": "Release",
-  "sdk": "iphoneos9.0",
-  "tests": [
-  ]
-}
diff --git a/ios/build/bots/tryserver.chromium.mac/ios_rel_device_ninja.json b/ios/build/bots/tryserver.chromium.mac/ios_rel_device_ninja.json
deleted file mode 100644
index d36ef37..0000000
--- a/ios/build/bots/tryserver.chromium.mac/ios_rel_device_ninja.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-  "owners": [
-    "smut"
-  ],
-  "comments": [
-    "Builder for fat binaries using ninja."
-  ],
-  "xcode version": "7.0",
-  "GYP_DEFINES": {
-    "OS": "ios",
-    "chromium_ios_signing": "0",
-    "target_subarch": "both",
-    "use_goma": "1"
-  },
-  "mb_type": "gyp",
-  "compiler": "ninja",
-  "configuration": "Release",
-  "sdk": "iphoneos9.0",
-  "tests": [
-  ]
-}
diff --git a/ios/chrome/browser/BUILD.gn b/ios/chrome/browser/BUILD.gn
index 8469c8d9..c46fcbb 100644
--- a/ios/chrome/browser/BUILD.gn
+++ b/ios/chrome/browser/BUILD.gn
@@ -311,8 +311,8 @@
     "reading_list/reading_list_model.h",
     "reading_list/reading_list_model_factory.cc",
     "reading_list/reading_list_model_factory.h",
-    "reading_list/reading_list_model_memory.cc",
-    "reading_list/reading_list_model_memory.h",
+    "reading_list/reading_list_model_impl.cc",
+    "reading_list/reading_list_model_impl.h",
     "reading_list/reading_list_model_observer.h",
     "reading_list/reading_list_model_storage.h",
     "reading_list/reading_list_model_storage_defaults.h",
diff --git a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm
index d7e5a0e..646debf0 100644
--- a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm
+++ b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm
@@ -64,6 +64,10 @@
   return g_on_browsing_data_removed_callbacks;
 }
 
+bool AllDomainsPredicate(const std::string& domain) {
+  return true;
+}
+
 }  // namespace
 
 bool IOSChromeBrowsingDataRemover::is_removing_ = false;
@@ -464,8 +468,8 @@
   DCHECK_CURRENTLY_ON(WebThread::IO);
   net::ChannelIDService* channel_id_service =
       rq_context->GetURLRequestContext()->channel_id_service();
-  channel_id_service->GetChannelIDStore()->DeleteAllCreatedBetween(
-      delete_begin_, delete_end_,
+  channel_id_service->GetChannelIDStore()->DeleteForDomainsCreatedBetween(
+      base::Bind(&AllDomainsPredicate), delete_begin_, delete_end_,
       base::Bind(&IOSChromeBrowsingDataRemover::OnClearedChannelIDsOnIOThread,
                  base::Unretained(this), rq_context));
 }
diff --git a/ios/chrome/browser/history/history_backend_client_impl.cc b/ios/chrome/browser/history/history_backend_client_impl.cc
index 4100bce..c8f67aa 100644
--- a/ios/chrome/browser/history/history_backend_client_impl.cc
+++ b/ios/chrome/browser/history/history_backend_client_impl.cc
@@ -48,3 +48,7 @@
 bool HistoryBackendClientImpl::ShouldReportDatabaseError() {
   return false;
 }
+
+bool HistoryBackendClientImpl::IsWebSafe(const GURL& url) {
+  return url.SchemeIsHTTPOrHTTPS();
+}
diff --git a/ios/chrome/browser/history/history_backend_client_impl.h b/ios/chrome/browser/history/history_backend_client_impl.h
index 421a3b3e..eba9ea9 100644
--- a/ios/chrome/browser/history/history_backend_client_impl.h
+++ b/ios/chrome/browser/history/history_backend_client_impl.h
@@ -26,6 +26,7 @@
   bool IsBookmarked(const GURL& url) override;
   void GetBookmarks(std::vector<history::URLAndTitle>* bookmarks) override;
   bool ShouldReportDatabaseError() override;
+  bool IsWebSafe(const GURL& url) override;
 
   // BookmarkModel instance providing access to bookmarks. May be null during
   // testing but must outlive HistoryBackendClientImpl if non-null.
diff --git a/ios/chrome/browser/ntp_snippets/ios_chrome_ntp_snippets_service_factory.cc b/ios/chrome/browser/ntp_snippets/ios_chrome_ntp_snippets_service_factory.cc
index c60c19c..f3b493dd 100644
--- a/ios/chrome/browser/ntp_snippets/ios_chrome_ntp_snippets_service_factory.cc
+++ b/ios/chrome/browser/ntp_snippets/ios_chrome_ntp_snippets_service_factory.cc
@@ -89,7 +89,6 @@
       chrome_browser_state->GetPrefs(), suggestions_service, task_runner,
       GetApplicationContext()->GetApplicationLocale(), scheduler,
       base::WrapUnique(new ntp_snippets::NTPSnippetsFetcher(
-          task_runner, request_context,
-          GetChannel() == version_info::Channel::STABLE)),
+          request_context, GetChannel() == version_info::Channel::STABLE)),
       base::Bind(&ParseJson)));
 }
diff --git a/ios/chrome/browser/passwords/credential_manager.mm b/ios/chrome/browser/passwords/credential_manager.mm
index 1389ebae..3ad9eb2 100644
--- a/ios/chrome/browser/passwords/credential_manager.mm
+++ b/ios/chrome/browser/passwords/credential_manager.mm
@@ -205,7 +205,9 @@
   // accordingly.
   form_manager_.reset(
       new password_manager::CredentialManagerPasswordFormManager(
-          client_, driver_->AsWeakPtr(), *form, this));
+          client_, driver_->AsWeakPtr(),
+          *password_manager::CreateObservedPasswordFormFromOrigin(page_url),
+          std::move(form), this));
 }
 
 void CredentialManager::SignedOut(int request_id, const GURL& source_url) {
diff --git a/ios/chrome/browser/reading_list/reading_list_model_factory.cc b/ios/chrome/browser/reading_list/reading_list_model_factory.cc
index a0b21662..5b892cf 100644
--- a/ios/chrome/browser/reading_list/reading_list_model_factory.cc
+++ b/ios/chrome/browser/reading_list/reading_list_model_factory.cc
@@ -10,20 +10,20 @@
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
 #include "ios/chrome/browser/browser_state/browser_state_otr_helper.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#include "ios/chrome/browser/reading_list/reading_list_model_memory.h"
+#include "ios/chrome/browser/reading_list/reading_list_model_impl.h"
 #include "ios/chrome/browser/reading_list/reading_list_model_storage_defaults.h"
 
 // static
 ReadingListModel* ReadingListModelFactory::GetForBrowserState(
     ios::ChromeBrowserState* browser_state) {
-  return static_cast<ReadingListModelMemory*>(
+  return static_cast<ReadingListModelImpl*>(
       GetInstance()->GetServiceForBrowserState(browser_state, true));
 }
 
 // static
 ReadingListModel* ReadingListModelFactory::GetForBrowserStateIfExists(
     ios::ChromeBrowserState* browser_state) {
-  return static_cast<ReadingListModelMemory*>(
+  return static_cast<ReadingListModelImpl*>(
       GetInstance()->GetServiceForBrowserState(browser_state, false));
 }
 
@@ -43,8 +43,8 @@
     web::BrowserState* context) const {
   std::unique_ptr<ReadingListModelStorage> storage(
       new ReadingListModelStorageDefaults());
-  std::unique_ptr<ReadingListModelMemory> reading_list_model(
-      new ReadingListModelMemory(std::move(storage)));
+  std::unique_ptr<ReadingListModelImpl> reading_list_model(
+      new ReadingListModelImpl(std::move(storage)));
   return std::move(reading_list_model);
 }
 
diff --git a/ios/chrome/browser/reading_list/reading_list_model_memory.cc b/ios/chrome/browser/reading_list/reading_list_model_impl.cc
similarity index 81%
rename from ios/chrome/browser/reading_list/reading_list_model_memory.cc
rename to ios/chrome/browser/reading_list/reading_list_model_impl.cc
index 7d9f99a..9c78587c 100644
--- a/ios/chrome/browser/reading_list/reading_list_model_memory.cc
+++ b/ios/chrome/browser/reading_list/reading_list_model_impl.cc
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ios/chrome/browser/reading_list/reading_list_model_memory.h"
+#include "ios/chrome/browser/reading_list/reading_list_model_impl.h"
+
 #include "ios/chrome/browser/reading_list/reading_list_model_storage.h"
 
 #include "url/gurl.h"
 
-ReadingListModelMemory::ReadingListModelMemory()
-    : ReadingListModelMemory(NULL) {}
+ReadingListModelImpl::ReadingListModelImpl() : ReadingListModelImpl(NULL) {}
 
-ReadingListModelMemory::ReadingListModelMemory(
+ReadingListModelImpl::ReadingListModelImpl(
     std::unique_ptr<ReadingListModelStorage> storage)
     : hasUnseen_(false) {
   if (storage) {
@@ -21,34 +21,34 @@
   }
   loaded_ = true;
 }
-ReadingListModelMemory::~ReadingListModelMemory() {}
+ReadingListModelImpl::~ReadingListModelImpl() {}
 
-void ReadingListModelMemory::Shutdown() {
+void ReadingListModelImpl::Shutdown() {
   FOR_EACH_OBSERVER(ReadingListModelObserver, observers_,
                     ReadingListModelBeingDeleted(this));
   loaded_ = false;
 }
 
-bool ReadingListModelMemory::loaded() const {
+bool ReadingListModelImpl::loaded() const {
   return loaded_;
 }
 
-size_t ReadingListModelMemory::unread_size() const {
+size_t ReadingListModelImpl::unread_size() const {
   DCHECK(loaded());
   return unread_.size();
 }
 
-size_t ReadingListModelMemory::read_size() const {
+size_t ReadingListModelImpl::read_size() const {
   DCHECK(loaded());
   return read_.size();
 }
 
-bool ReadingListModelMemory::HasUnseenEntries() const {
+bool ReadingListModelImpl::HasUnseenEntries() const {
   DCHECK(loaded());
   return unread_size() && hasUnseen_;
 }
 
-void ReadingListModelMemory::ResetUnseenEntries() {
+void ReadingListModelImpl::ResetUnseenEntries() {
   DCHECK(loaded());
   hasUnseen_ = false;
   if (storageLayer_ && !IsPerformingBatchUpdates()) {
@@ -57,18 +57,18 @@
 }
 
 // Returns a specific entry.
-const ReadingListEntry& ReadingListModelMemory::GetUnreadEntryAtIndex(
+const ReadingListEntry& ReadingListModelImpl::GetUnreadEntryAtIndex(
     size_t index) const {
   DCHECK(loaded());
   return unread_[index];
 }
-const ReadingListEntry& ReadingListModelMemory::GetReadEntryAtIndex(
+const ReadingListEntry& ReadingListModelImpl::GetReadEntryAtIndex(
     size_t index) const {
   DCHECK(loaded());
   return read_[index];
 }
 
-void ReadingListModelMemory::RemoveEntryByUrl(const GURL& url) {
+void ReadingListModelImpl::RemoveEntryByUrl(const GURL& url) {
   DCHECK(loaded());
   const ReadingListEntry entry(url, std::string());
 
@@ -101,7 +101,7 @@
   }
 }
 
-const ReadingListEntry& ReadingListModelMemory::AddEntry(
+const ReadingListEntry& ReadingListModelImpl::AddEntry(
     const GURL& url,
     const std::string& title) {
   DCHECK(loaded());
@@ -121,7 +121,7 @@
   return *unread_.begin();
 }
 
-void ReadingListModelMemory::MarkReadByURL(const GURL& url) {
+void ReadingListModelImpl::MarkReadByURL(const GURL& url) {
   DCHECK(loaded());
   const ReadingListEntry entry(url, std::string());
 
@@ -146,7 +146,7 @@
                     ReadingListDidApplyChanges(this));
 }
 
-void ReadingListModelMemory::EndBatchUpdates() {
+void ReadingListModelImpl::EndBatchUpdates() {
   ReadingListModel::EndBatchUpdates();
   if (IsPerformingBatchUpdates() || !storageLayer_) {
     return;
diff --git a/ios/chrome/browser/reading_list/reading_list_model_memory.h b/ios/chrome/browser/reading_list/reading_list_model_impl.h
similarity index 74%
rename from ios/chrome/browser/reading_list/reading_list_model_memory.h
rename to ios/chrome/browser/reading_list/reading_list_model_impl.h
index f7fbdcf3..509defce 100644
--- a/ios/chrome/browser/reading_list/reading_list_model_memory.h
+++ b/ios/chrome/browser/reading_list/reading_list_model_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 IOS_CHROME_BROWSER_READING_LIST_READING_LIST_MODEL_MEMORY_H_
-#define IOS_CHROME_BROWSER_READING_LIST_READING_LIST_MODEL_MEMORY_H_
+#ifndef IOS_CHROME_BROWSER_READING_LIST_READING_LIST_MODEL_IMPL_H_
+#define IOS_CHROME_BROWSER_READING_LIST_READING_LIST_MODEL_IMPL_H_
 
 #include <memory>
 
@@ -14,18 +14,17 @@
 class ReadingListModelStorage;
 
 // Concrete implementation of a reading list model using in memory lists.
-class ReadingListModelMemory : public ReadingListModel, public KeyedService {
+class ReadingListModelImpl : public ReadingListModel, public KeyedService {
  public:
-  // Initialize a ReadingListModelMemory to load and save data in
+  // Initialize a ReadingListModelImpl to load and save data in
   // |persistence_layer|.
-  ReadingListModelMemory(
-      std::unique_ptr<ReadingListModelStorage> storage_layer);
+  ReadingListModelImpl(std::unique_ptr<ReadingListModelStorage> storage_layer);
 
-  // Initialize a ReadingListModelMemory without persistence. Data will not be
+  // Initialize a ReadingListModelImpl without persistence. Data will not be
   // persistent across sessions.
-  ReadingListModelMemory();
+  ReadingListModelImpl();
 
-  ~ReadingListModelMemory() override;
+  ~ReadingListModelImpl() override;
   void Shutdown() override;
 
   bool loaded() const override;
diff --git a/ios/chrome/browser/reading_list/reading_list_model_unittest.cc b/ios/chrome/browser/reading_list/reading_list_model_unittest.cc
index dd0c466..7cf6d10a 100644
--- a/ios/chrome/browser/reading_list/reading_list_model_unittest.cc
+++ b/ios/chrome/browser/reading_list/reading_list_model_unittest.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 "ios/chrome/browser/reading_list/reading_list_model_memory.h"
+#include "ios/chrome/browser/reading_list/reading_list_model_impl.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
@@ -10,7 +10,7 @@
 class ReadingListModelTest : public ReadingListModelObserver,
                              public testing::Test {
  public:
-  ReadingListModelTest() : model_(new ReadingListModelMemory()) {
+  ReadingListModelTest() : model_(new ReadingListModelImpl()) {
     ClearCounts();
     model_->AddObserver(this);
   }
@@ -91,7 +91,7 @@
   int observer_add_read_;
   int observer_did_apply_;
 
-  std::unique_ptr<ReadingListModelMemory> model_;
+  std::unique_ptr<ReadingListModelImpl> model_;
 };
 
 TEST_F(ReadingListModelTest, EmptyLoaded) {
diff --git a/ios/chrome/ios_chrome.gyp b/ios/chrome/ios_chrome.gyp
index 0e99826..732b3d6 100644
--- a/ios/chrome/ios_chrome.gyp
+++ b/ios/chrome/ios_chrome.gyp
@@ -447,10 +447,11 @@
         'browser/reading_list/reading_list_entry.h',
         'browser/reading_list/reading_list_model.cc',
         'browser/reading_list/reading_list_model.h',
+        'browser/reading_list/reading_list_model_impl.cc',
+        'browser/reading_list/reading_list_model_impl.h',
+        'browser/reading_list/reading_list_model_observer.h',
         'browser/reading_list/reading_list_model_factory.cc',
         'browser/reading_list/reading_list_model_factory.h',
-        'browser/reading_list/reading_list_model_memory.cc',
-        'browser/reading_list/reading_list_model_memory.h',
         'browser/reading_list/reading_list_model_observer.h',
         'browser/reading_list/reading_list_model_storage.h',
         'browser/reading_list/reading_list_model_storage_defaults.h',
diff --git a/ios/chrome/today_extension/strings/resources/ios_today_extension_strings_fa.xtb b/ios/chrome/today_extension/strings/resources/ios_today_extension_strings_fa.xtb
index 6e529e0..1fa368a8 100644
--- a/ios/chrome/today_extension/strings/resources/ios_today_extension_strings_fa.xtb
+++ b/ios/chrome/today_extension/strings/resources/ios_today_extension_strings_fa.xtb
@@ -5,7 +5,7 @@
 <translation id="1418775127135578229">باز کردن پیوند کپی‌شده</translation>
 <translation id="1487576085940433465">‏BEGIN_LINK اشیای اطراف درحال پخش صفحه‌های وب هستند END_LINK. از یک سرویس Google برای بهبود کیفیت این نتایج استفاده می‌شود.</translation>
 <translation id="2026797012398135445">قفل دستگاه را باز کنید تا فعال شود.</translation>
-<translation id="2316129865977710310">نه سپاسگزارم</translation>
+<translation id="2316129865977710310">نه متشکرم</translation>
 <translation id="3435896845095436175">فعال کردن</translation>
 <translation id="4394049700291259645">غیر فعال کردن</translation>
 <translation id="5301954838959518834">بله، متوجه شدم</translation>
diff --git a/ios/web/BUILD.gn b/ios/web/BUILD.gn
index f044e915..d72fdba 100644
--- a/ios/web/BUILD.gn
+++ b/ios/web/BUILD.gn
@@ -124,6 +124,7 @@
     "public/web_client.h",
     "public/web_client.mm",
     "public/web_kit_constants.h",
+    "public/web_state/context_menu_params.h",
     "public/web_state/credential.h",
     "public/web_state/crw_web_controller_observer.h",
     "public/web_state/crw_web_user_interface_delegate.h",
@@ -161,6 +162,7 @@
     "web_kit_constants.cc",
     "web_state/blocked_popup_info.h",
     "web_state/blocked_popup_info.mm",
+    "web_state/context_menu_params.mm",
     "web_state/credential.cc",
     "web_state/crw_pass_kit_downloader.h",
     "web_state/crw_pass_kit_downloader.mm",
diff --git a/ios/web/ios_web.gyp b/ios/web/ios_web.gyp
index 268c64ee..76186ee4 100644
--- a/ios/web/ios_web.gyp
+++ b/ios/web/ios_web.gyp
@@ -160,6 +160,7 @@
         'public/web_client.h',
         'public/web_client.mm',
         'public/web_kit_constants.h',
+        'public/web_state/context_menu_params.h',
         'public/web_state/credential.h',
         'public/web_state/crw_web_controller_observer.h',
         'public/web_state/crw_web_user_interface_delegate.h',
@@ -197,6 +198,7 @@
         'web_kit_constants.cc',
         'web_state/blocked_popup_info.h',
         'web_state/blocked_popup_info.mm',
+        'web_state/context_menu_params.mm',
         'web_state/credential.cc',
         'web_state/crw_pass_kit_downloader.h',
         'web_state/crw_pass_kit_downloader.mm',
diff --git a/ios/web/public/web_state/context_menu_params.h b/ios/web/public/web_state/context_menu_params.h
new file mode 100644
index 0000000..1a97304c
--- /dev/null
+++ b/ios/web/public/web_state/context_menu_params.h
@@ -0,0 +1,45 @@
+// Copyright 2016 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 IOS_WEB_PUBLIC_WEB_STATE_CONTEXT_MENU_PARAMS_H_
+#define IOS_WEB_PUBLIC_WEB_STATE_CONTEXT_MENU_PARAMS_H_
+
+#import <UIKit/UIKit.h>
+
+#include "base/mac/scoped_nsobject.h"
+#include "base/strings/string16.h"
+#include "ios/web/public/referrer.h"
+#include "url/gurl.h"
+
+namespace web {
+
+// Wraps information needed to show a context menu.
+struct ContextMenuParams {
+ public:
+  ContextMenuParams();
+  ContextMenuParams(const ContextMenuParams& other);
+  ~ContextMenuParams();
+
+  // The title of the menu.
+  base::string16 menu_title;
+
+  // The URL of the link that encloses the node the context menu was invoked on.
+  GURL link_url;
+
+  // The source URL of the element the context menu was invoked on. Example of
+  // elements with source URLs are img, audio, and video.
+  GURL src_url;
+
+  // The referrer policy to use when opening the link.
+  web::ReferrerPolicy referrer_policy;
+
+  // The view in which to present the menu.
+  base::scoped_nsobject<UIView> view;
+
+  // The location in |view| to present the menu.
+  CGPoint location;
+};
+
+}  // namespace web
+
+#endif  // IOS_WEB_PUBLIC_WEB_STATE_CONTEXT_MENU_PARAMS_H_
diff --git a/ios/web/public/web_state/web_state_delegate.h b/ios/web/public/web_state/web_state_delegate.h
index f611da3..bebe64e 100644
--- a/ios/web/public/web_state/web_state_delegate.h
+++ b/ios/web/public/web_state/web_state_delegate.h
@@ -15,6 +15,7 @@
 
 namespace web {
 
+struct ContextMenuParams;
 struct SSLStatus;
 class WebState;
 
@@ -29,6 +30,12 @@
   // loaded).
   virtual void LoadProgressChanged(WebState* source, double progress);
 
+  // Notifies the delegate that the user triggered the context menu with the
+  // given |ContextMenuParams|. Returns true if the context menu operation was
+  // handled by the delegate.
+  virtual bool HandleContextMenu(WebState* source,
+                                 const ContextMenuParams& params);
+
  protected:
   virtual ~WebStateDelegate();
 
diff --git a/ios/web/public/web_state/web_state_delegate_bridge.h b/ios/web/public/web_state/web_state_delegate_bridge.h
index 8026bf7..d43e6077 100644
--- a/ios/web/public/web_state/web_state_delegate_bridge.h
+++ b/ios/web/public/web_state/web_state_delegate_bridge.h
@@ -18,6 +18,13 @@
 // between 0.0 (nothing loaded) to 1.0 (page fully loaded).
 - (void)webState:(web::WebState*)webState didChangeProgress:(double)progress;
 
+// Called when the user triggers the context menu with the given
+// |ContextMenuParams|. Returns YES if the context menu operation was
+// handled by the delegate. If this method is not implemented, the system
+// context menu will be displayed.
+- (BOOL)webState:(web::WebState*)webState
+    handleContextMenu:(const web::ContextMenuParams&)params;
+
 @end
 
 namespace web {
@@ -30,6 +37,8 @@
 
   // web::WebStateDelegate methods.
   void LoadProgressChanged(WebState* source, double progress) override;
+  bool HandleContextMenu(WebState* source,
+                         const ContextMenuParams& params) override;
 
  private:
   // CRWWebStateDelegate which receives forwarded calls.
diff --git a/ios/web/web_state/context_menu_params.mm b/ios/web/web_state/context_menu_params.mm
new file mode 100644
index 0000000..bfbe412
--- /dev/null
+++ b/ios/web/web_state/context_menu_params.mm
@@ -0,0 +1,16 @@
+// Copyright 2016 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 "ios/web/public/web_state/context_menu_params.h"
+
+namespace web {
+
+ContextMenuParams::ContextMenuParams()
+    : referrer_policy(ReferrerPolicyDefault), location(CGPointZero) {}
+
+ContextMenuParams::ContextMenuParams(const ContextMenuParams& other) = default;
+
+ContextMenuParams::~ContextMenuParams() {}
+
+}  // namespace web
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index 61dd29a..81b27238 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -64,6 +64,7 @@
 #include "ios/web/public/user_metrics.h"
 #include "ios/web/public/web_client.h"
 #include "ios/web/public/web_kit_constants.h"
+#import "ios/web/public/web_state/context_menu_params.h"
 #include "ios/web/public/web_state/credential.h"
 #import "ios/web/public/web_state/crw_web_controller_observer.h"
 #import "ios/web/public/web_state/crw_web_view_scroll_view_proxy.h"
@@ -734,9 +735,6 @@
 // Called when the window has determined there was a long-press and context menu
 // must be shown.
 - (void)showContextMenu:(UIGestureRecognizer*)gestureRecognizer;
-// YES if delegate supports showing context menu by responding to
-// webController:runContextMenu:atPoint:inView: selector.
-- (BOOL)supportsCustomContextMenu;
 // Cancels all touch events in the web view (long presses, tapping, scrolling).
 - (void)cancelAllTouches;
 // Returns the referrer for the current page.
@@ -1319,10 +1317,6 @@
 }
 
 - (void)showContextMenu:(UIGestureRecognizer*)gestureRecognizer {
-  // Calling this method if [self supportsCustomContextMenu] returned NO
-  // is a programmer error.
-  DCHECK([self supportsCustomContextMenu]);
-
   // We don't want ongoing notification that the long press is held.
   if ([gestureRecognizer state] != UIGestureRecognizerStateBegan)
     return;
@@ -1334,18 +1328,36 @@
       [self contextMenuInfoForElement:_DOMElementForLastTouch.get()];
   CGPoint point = [gestureRecognizer locationInView:_webView];
 
-  // Cancelling all touches has the intended side effect of suppressing the
-  // system's context menu.
-  [self cancelAllTouches];
-  [self.UIDelegate webController:self
-                  runContextMenu:info
-                         atPoint:point
-                          inView:_webView];
-}
-
-- (BOOL)supportsCustomContextMenu {
   SEL runMenuSelector = @selector(webController:runContextMenu:atPoint:inView:);
-  return [self.UIDelegate respondsToSelector:runMenuSelector];
+  if ([self.UIDelegate respondsToSelector:runMenuSelector]) {
+    // Cancelling all touches has the intended side effect of suppressing the
+    // system's context menu.
+    [self cancelAllTouches];
+    [self.UIDelegate webController:self
+                    runContextMenu:info
+                           atPoint:point
+                            inView:_webView];
+  } else {
+    web::ContextMenuParams params;
+    params.menu_title = base::SysNSStringToUTF16(info[web::kContextTitle]);
+    NSString* linkUrl = info[web::kContextLinkURLString];
+    if (linkUrl) {
+      params.link_url = GURL(base::SysNSStringToUTF8(linkUrl));
+    }
+    NSString* srcURL = info[web::kContextImageURLString];
+    if (srcURL) {
+      params.src_url = GURL(base::SysNSStringToUTF8(srcURL));
+    }
+    params.referrer_policy = static_cast<web::ReferrerPolicy>(
+        [info[web::kContextLinkReferrerPolicy] intValue]);
+    params.view.reset([_webView retain]);
+    params.location = point;
+    if (self.webStateImpl->HandleContextMenu(params)) {
+      // Cancelling all touches has the intended side effect of suppressing the
+      // system's context menu.
+      [self cancelAllTouches];
+    }
+  }
 }
 
 - (void)cancelAllTouches {
@@ -3266,18 +3278,25 @@
     return NO;
   }
 
-  // Check If the URL is handled by a native app.
-  if ([self urlTriggersNativeAppLaunch:requestURL
-                             sourceURL:[self currentNavigationURL]
-                           linkClicked:isLinkClick]) {
-    // External app has been launched successfully. Stop the current page
-    // load operation (e.g. notifying all observers) and record the URL so
-    // that errors reported following the 'NO' reply can be safely ignored.
-    if ([self shouldClosePageOnNativeApplicationLoad])
-      [_delegate webPageOrderedClose];
-    [self stopLoading];
-    [_openedApplicationURL addObject:request.URL];
-    return NO;
+  // Check if the link navigation leads to a launch of an external app.
+  // TODO(crbug.com/607780): Revise the logic of allowing external app launch
+  // and move it to externalAppLauncher.
+  BOOL isOpenInNewTabNavigation =
+      !_webStateImpl->GetNavigationManager()->GetItemCount();
+  if (isLinkClick || isOpenInNewTabNavigation) {
+    // Check If the URL is handled by a native app.
+    if ([self urlTriggersNativeAppLaunch:requestURL
+                               sourceURL:[self currentNavigationURL]
+                             linkClicked:isLinkClick]) {
+      // External app has been launched successfully. Stop the current page
+      // load operation (e.g. notifying all observers) and record the URL so
+      // that errors reported following the 'NO' reply can be safely ignored.
+      if ([self shouldClosePageOnNativeApplicationLoad])
+        [_delegate webPageOrderedClose];
+      [self stopLoading];
+      [_openedApplicationURL addObject:request.URL];
+      return NO;
+    }
   }
 
   // The WebDelegate may instruct the CRWWebController to stop loading, and
@@ -3475,11 +3494,6 @@
        shouldReceiveTouch:(UITouch*)touch {
   // Expect only _contextMenuRecognizer.
   DCHECK([gestureRecognizer isEqual:_contextMenuRecognizer]);
-  if (![self supportsCustomContextMenu]) {
-    // Fetching context menu info is not a free operation, early return if a
-    // context menu should not be shown.
-    return YES;
-  }
 
   // This is custom long press gesture recognizer. By the time the gesture is
   // recognized the web controller needs to know if there is a link under the
@@ -3499,7 +3513,7 @@
 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer {
   // Expect only _contextMenuRecognizer.
   DCHECK([gestureRecognizer isEqual:_contextMenuRecognizer]);
-  if (!_webView || ![self supportsCustomContextMenu]) {
+  if (!_webView) {
     // Show the context menu iff currently displaying a web view.
     // Do nothing for native views.
     return NO;
diff --git a/ios/web/web_state/web_state_delegate.mm b/ios/web/web_state/web_state_delegate.mm
index 516f155..7722a61 100644
--- a/ios/web/web_state/web_state_delegate.mm
+++ b/ios/web/web_state/web_state_delegate.mm
@@ -20,6 +20,10 @@
 
 void WebStateDelegate::LoadProgressChanged(WebState*, double) {}
 
+bool WebStateDelegate::HandleContextMenu(WebState*, const ContextMenuParams&) {
+  return false;
+}
+
 void WebStateDelegate::Attach(WebState* source) {
   DCHECK(attached_states_.find(source) == attached_states_.end());
   attached_states_.insert(source);
diff --git a/ios/web/web_state/web_state_delegate_bridge.mm b/ios/web/web_state/web_state_delegate_bridge.mm
index 2ce0f6a..1e279aa 100644
--- a/ios/web/web_state/web_state_delegate_bridge.mm
+++ b/ios/web/web_state/web_state_delegate_bridge.mm
@@ -5,6 +5,7 @@
 #import "ios/web/public/web_state/web_state_delegate_bridge.h"
 
 #include "base/logging.h"
+#import "ios/web/public/web_state/context_menu_params.h"
 
 namespace web {
 
@@ -19,4 +20,13 @@
     [delegate_ webState:source didChangeProgress:progress];
 }
 
+bool WebStateDelegateBridge::HandleContextMenu(
+    WebState* source,
+    const ContextMenuParams& params) {
+  if ([delegate_ respondsToSelector:@selector(webState:handleContextMenu:)]) {
+    return [delegate_ webState:source handleContextMenu:params];
+  }
+  return NO;
+}
+
 }  // web
\ No newline at end of file
diff --git a/ios/web/web_state/web_state_delegate_bridge_unittest.mm b/ios/web/web_state/web_state_delegate_bridge_unittest.mm
index a650633a..0b5c48f 100644
--- a/ios/web/web_state/web_state_delegate_bridge_unittest.mm
+++ b/ios/web/web_state/web_state_delegate_bridge_unittest.mm
@@ -7,6 +7,8 @@
 #include <memory>
 
 #import "base/mac/scoped_nsobject.h"
+#include "base/strings/utf_string_conversions.h"
+#include "ios/web/public/web_state/context_menu_params.h"
 #import "ios/web/web_state/web_state_delegate_stub.h"
 #include "testing/platform_test.h"
 #import "third_party/ocmock/gtest_support.h"
@@ -43,4 +45,26 @@
   EXPECT_EQ(1.0, [delegate_ changedProgress]);
 }
 
+// Tests |HandleContextMenu| forwarding.
+TEST_F(WebStateDelegateBridgeTest, HandleContextMenu) {
+  EXPECT_EQ(nil, [delegate_ contextMenuParams]);
+  web::ContextMenuParams contextMenuParams;
+  contextMenuParams.menu_title = base::UTF8ToUTF16("Menu title");
+  contextMenuParams.link_url = GURL("http://www.url.com");
+  contextMenuParams.src_url = GURL("http://www.url.com/image.jpeg");
+  contextMenuParams.referrer_policy = web::ReferrerPolicyOrigin;
+  contextMenuParams.view = [UIView new];
+  contextMenuParams.location = CGPointMake(5.0, 5.0);
+  bridge_->HandleContextMenu(nullptr, contextMenuParams);
+  web::ContextMenuParams* resultParams = [delegate_ contextMenuParams];
+  EXPECT_NE(nullptr, resultParams);
+  EXPECT_EQ(contextMenuParams.menu_title, resultParams->menu_title);
+  EXPECT_EQ(contextMenuParams.link_url, resultParams->link_url);
+  EXPECT_EQ(contextMenuParams.src_url, resultParams->src_url);
+  EXPECT_EQ(contextMenuParams.referrer_policy, resultParams->referrer_policy);
+  EXPECT_EQ(contextMenuParams.view, resultParams->view);
+  EXPECT_EQ(contextMenuParams.location.x, resultParams->location.x);
+  EXPECT_EQ(contextMenuParams.location.y, resultParams->location.y);
+}
+
 }  // namespace web
diff --git a/ios/web/web_state/web_state_delegate_stub.h b/ios/web/web_state/web_state_delegate_stub.h
index afd86ac..b21ce34 100644
--- a/ios/web/web_state/web_state_delegate_stub.h
+++ b/ios/web/web_state/web_state_delegate_stub.h
@@ -15,6 +15,9 @@
 @property(nonatomic, readonly) web::WebState* webState;
 // Progress received in |webState:didChangeProgress| call.
 @property(nonatomic, readonly) double changedProgress;
+// ContextMenuParams reveived in |webState:handleContextMenu:| call.
+// nullptr if that delegate method was not called.
+@property(nonatomic, readonly) web::ContextMenuParams* contextMenuParams;
 @end
 
 #endif  // IOS_WEB_WEB_STATE_WEB_STATE_DELEGATE_STUB_H_
diff --git a/ios/web/web_state/web_state_delegate_stub.mm b/ios/web/web_state/web_state_delegate_stub.mm
index 78a438c..53d0de4 100644
--- a/ios/web/web_state/web_state_delegate_stub.mm
+++ b/ios/web/web_state/web_state_delegate_stub.mm
@@ -5,8 +5,12 @@
 #import "ios/web/web_state/web_state_delegate_stub.h"
 
 #import "ios/web/public/web_state/web_state.h"
+#import "ios/web/public/web_state/context_menu_params.h"
 
-@implementation CRWWebStateDelegateStub
+@implementation CRWWebStateDelegateStub {
+  // Backs up the property with the same name.
+  std::unique_ptr<web::ContextMenuParams> _contextMenuParams;
+}
 
 @synthesize webState = _webState;
 @synthesize changedProgress = _changedProgress;
@@ -16,4 +20,15 @@
   _changedProgress = progress;
 }
 
+- (BOOL)webState:(web::WebState*)webState
+    handleContextMenu:(const web::ContextMenuParams&)params {
+  _webState = webState;
+  _contextMenuParams.reset(new web::ContextMenuParams(params));
+  return YES;
+}
+
+- (web::ContextMenuParams*)contextMenuParams {
+  return _contextMenuParams.get();
+}
+
 @end
diff --git a/ios/web/web_state/web_state_impl.h b/ios/web/web_state/web_state_impl.h
index a492b4cc..8c28792 100644
--- a/ios/web/web_state/web_state_impl.h
+++ b/ios/web/web_state/web_state_impl.h
@@ -36,6 +36,7 @@
 namespace web {
 
 class BrowserState;
+struct ContextMenuParams;
 struct Credential;
 struct FaviconURL;
 struct LoadCommittedDetails;
@@ -261,6 +262,8 @@
 
   // Notifies the delegate that the load progress was updated.
   void SendChangeLoadProgress(double progress);
+  // Notifies the delegate that a context menu needs handling.
+  bool HandleContextMenu(const ContextMenuParams& params);
 
   // NavigationManagerDelegate:
   void NavigateToPendingEntry() override;
diff --git a/ios/web/web_state/web_state_impl.mm b/ios/web/web_state/web_state_impl.mm
index cfb5fb3..82287e0 100644
--- a/ios/web/web_state/web_state_impl.mm
+++ b/ios/web/web_state/web_state_impl.mm
@@ -17,6 +17,7 @@
 #include "ios/web/public/navigation_item.h"
 #include "ios/web/public/url_util.h"
 #include "ios/web/public/web_client.h"
+#import "ios/web/public/web_state/context_menu_params.h"
 #include "ios/web/public/web_state/credential.h"
 #include "ios/web/public/web_state/ui/crw_content_view.h"
 #include "ios/web/public/web_state/web_state_delegate.h"
@@ -420,6 +421,13 @@
   }
 }
 
+bool WebStateImpl::HandleContextMenu(const web::ContextMenuParams& params) {
+  if (delegate_) {
+    return delegate_->HandleContextMenu(this, params);
+  }
+  return false;
+}
+
 WebUIIOS* WebStateImpl::CreateWebUIIOS(const GURL& url) {
   WebUIIOSControllerFactory* factory =
       WebUIIOSControllerFactoryRegistry::GetInstance();
diff --git a/ipc/BUILD.gn b/ipc/BUILD.gn
index 9964e59..7f5429c6 100644
--- a/ipc/BUILD.gn
+++ b/ipc/BUILD.gn
@@ -176,6 +176,7 @@
     "ipc_test_message_generator.cc",
     "ipc_test_message_generator.h",
     "ipc_test_messages.h",
+    "run_all_unittests.cc",
     "sync_socket_unittest.cc",
     "unix_domain_socket_util_unittest.cc",
   ]
@@ -199,7 +200,6 @@
     ":test_support",
     "//base",
     "//base:i18n",
-    "//base/test:run_all_unittests",
     "//base/test:test_support",
     "//crypto",
     "//testing/gtest",
diff --git a/ipc/ipc_channel_posix_unittest.cc b/ipc/ipc_channel_posix_unittest.cc
index c76af5a..0ed6679 100644
--- a/ipc/ipc_channel_posix_unittest.cc
+++ b/ipc/ipc_channel_posix_unittest.cc
@@ -114,6 +114,15 @@
   static const std::string GetConnectionSocketName();
   static const std::string GetChannelDirName();
 
+  bool WaitForExit(base::Process& process, int* exit_code) {
+#if defined(OS_ANDROID)
+    return AndroidWaitForChildExitWithTimeout(
+        process, base::TimeDelta::Max(), exit_code);
+#else
+    return process.WaitForExit(exit_code);
+#endif  // defined(OS_ANDROID)
+  }
+
  protected:
   void SetUp() override;
   void TearDown() override;
@@ -258,12 +267,7 @@
   ASSERT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, out_listener.status());
 }
 
-#if defined(OS_ANDROID)
-#define MAYBE_AdvancedConnected DISABLED_AdvancedConnected
-#else
-#define MAYBE_AdvancedConnected AdvancedConnected
-#endif
-TEST_F(IPCChannelPosixTest, MAYBE_AdvancedConnected) {
+TEST_F(IPCChannelPosixTest, AdvancedConnected) {
   // Test creating a connection to an external process.
   IPCChannelPosixTestListener listener(false);
   IPC::ChannelHandle chan_handle(GetConnectionSocketName());
@@ -285,19 +289,14 @@
   channel->Send(message);
   SpinRunLoop(TestTimeouts::action_timeout());
   int exit_code = 0;
-  EXPECT_TRUE(process.WaitForExit(&exit_code));
+  EXPECT_TRUE(WaitForExit(process, &exit_code));
   EXPECT_EQ(0, exit_code);
   ASSERT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, listener.status());
   ASSERT_FALSE(channel->HasAcceptedConnection());
   unlink(chan_handle.name.c_str());
 }
 
-#if defined(OS_ANDROID)
-#define MAYBE_ResetState DISABLED_ResetState
-#else
-#define MAYBE_ResetState ResetState
-#endif
-TEST_F(IPCChannelPosixTest, MAYBE_ResetState) {
+TEST_F(IPCChannelPosixTest, ResetState) {
   // Test creating a connection to an external process. Close the connection,
   // but continue to listen and make sure another external process can connect
   // to us.
@@ -330,7 +329,7 @@
   SpinRunLoop(TestTimeouts::action_timeout());
   EXPECT_TRUE(process.Terminate(0, false));
   int exit_code = 0;
-  EXPECT_TRUE(process2.WaitForExit(&exit_code));
+  EXPECT_TRUE(WaitForExit(process2, &exit_code));
   EXPECT_EQ(0, exit_code);
   ASSERT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, listener.status());
   ASSERT_FALSE(channel->HasAcceptedConnection());
@@ -359,12 +358,7 @@
   EXPECT_FALSE(channel2->Connect());
 }
 
-#if defined(OS_ANDROID)
-#define MAYBE_MultiConnection DISABLED_MultiConnection
-#else
-#define MAYBE_MultiConnection MultiConnection
-#endif
-TEST_F(IPCChannelPosixTest, MAYBE_MultiConnection) {
+TEST_F(IPCChannelPosixTest, MultiConnection) {
   // Test setting up a connection to an external process, and then have
   // another external process attempt to connect to us.
   IPCChannelPosixTestListener listener(false);
@@ -385,7 +379,7 @@
   ASSERT_TRUE(process2.IsValid());
   SpinRunLoop(TestTimeouts::action_max_timeout());
   int exit_code = 0;
-  EXPECT_TRUE(process2.WaitForExit(&exit_code));
+  EXPECT_TRUE(WaitForExit(process2, &exit_code));
   EXPECT_EQ(exit_code, 0);
   ASSERT_EQ(IPCChannelPosixTestListener::DENIED, listener.status());
   ASSERT_TRUE(channel->HasAcceptedConnection());
@@ -394,7 +388,7 @@
                                            IPC::Message::PRIORITY_NORMAL);
   channel->Send(message);
   SpinRunLoop(TestTimeouts::action_timeout());
-  EXPECT_TRUE(process.WaitForExit(&exit_code));
+  EXPECT_TRUE(WaitForExit(process, &exit_code));
   EXPECT_EQ(exit_code, 0);
   ASSERT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, listener.status());
   ASSERT_FALSE(channel->HasAcceptedConnection());
diff --git a/ipc/ipc_channel_proxy_unittest.cc b/ipc/ipc_channel_proxy_unittest.cc
index 5997668..5367157e 100644
--- a/ipc/ipc_channel_proxy_unittest.cc
+++ b/ipc/ipc_channel_proxy_unittest.cc
@@ -273,12 +273,7 @@
   std::unique_ptr<QuitListener> listener_;
 };
 
-#if defined(OS_ANDROID)
-#define MAYBE_MessageClassFilters DISABLED_MessageClassFilters
-#else
-#define MAYBE_MessageClassFilters MessageClassFilters
-#endif
-TEST_F(IPCChannelProxyTest, MAYBE_MessageClassFilters) {
+TEST_F(IPCChannelProxyTest, MessageClassFilters) {
   // Construct a filter per message class.
   std::vector<scoped_refptr<MessageCountFilter> > class_filters;
   class_filters.push_back(make_scoped_refptr(
@@ -302,12 +297,7 @@
     EXPECT_EQ(1U, class_filters[i]->messages_received());
 }
 
-#if defined(OS_ANDROID)
-#define MAYBE_GlobalAndMessageClassFilters DISABLED_GlobalAndMessageClassFilters
-#else
-#define MAYBE_GlobalAndMessageClassFilters GlobalAndMessageClassFilters
-#endif
-TEST_F(IPCChannelProxyTest, MAYBE_GlobalAndMessageClassFilters) {
+TEST_F(IPCChannelProxyTest, GlobalAndMessageClassFilters) {
   // Add a class and global filter.
   scoped_refptr<MessageCountFilter> class_filter(
       new MessageCountFilter(TestMsgStart));
@@ -336,12 +326,7 @@
   EXPECT_EQ(3U, global_filter->messages_received());
 }
 
-#if defined(OS_ANDROID)
-#define MAYBE_FilterRemoval DISABLED_FilterRemoval
-#else
-#define MAYBE_FilterRemoval FilterRemoval
-#endif
-TEST_F(IPCChannelProxyTest, MAYBE_FilterRemoval) {
+TEST_F(IPCChannelProxyTest, FilterRemoval) {
   // Add a class and global filter.
   scoped_refptr<MessageCountFilter> class_filter(
       new MessageCountFilter(TestMsgStart));
diff --git a/ipc/ipc_fuzzing_tests.cc b/ipc/ipc_fuzzing_tests.cc
index 00e91f3..f197a6b 100644
--- a/ipc/ipc_fuzzing_tests.cc
+++ b/ipc/ipc_fuzzing_tests.cc
@@ -271,14 +271,9 @@
 class IPCFuzzingTest : public IPCTestBase {
 };
 
-#if defined(OS_ANDROID)
-#define MAYBE_SanityTest DISABLED_SanityTest
-#else
-#define MAYBE_SanityTest SanityTest
-#endif
 // This test makes sure that the FuzzerClientListener and FuzzerServerListener
 // are working properly by generating two well formed IPC calls.
-TEST_F(IPCFuzzingTest, MAYBE_SanityTest) {
+TEST_F(IPCFuzzingTest, SanityTest) {
   Init("FuzzServerClient");
 
   FuzzerClientListener listener;
@@ -301,17 +296,12 @@
   DestroyChannel();
 }
 
-#if defined(OS_ANDROID)
-#define MAYBE_MsgBadPayloadShort DISABLED_MsgBadPayloadShort
-#else
-#define MAYBE_MsgBadPayloadShort MsgBadPayloadShort
-#endif
 // This test uses a payload that is smaller than expected. This generates an
 // error while unpacking the IPC buffer which in debug trigger an assertion and
 // in release is ignored (!). Right after we generate another valid IPC to make
 // sure framing is working properly.
 #if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON)
-TEST_F(IPCFuzzingTest, MAYBE_MsgBadPayloadShort) {
+TEST_F(IPCFuzzingTest, MsgBadPayloadShort) {
   Init("FuzzServerClient");
 
   FuzzerClientListener listener;
@@ -335,16 +325,11 @@
 }
 #endif
 
-#if defined(OS_ANDROID)
-#define MAYBE_MsgBadPayloadArgs DISABLED_MsgBadPayloadArgs
-#else
-#define MAYBE_MsgBadPayloadArgs MsgBadPayloadArgs
-#endif
 // This test uses a payload that has too many arguments, but so the payload size
 // is big enough so the unpacking routine does not generate an error as in the
 // case of MsgBadPayloadShort test. This test does not pinpoint a flaw (per se)
 // as by design we don't carry type information on the IPC message.
-TEST_F(IPCFuzzingTest, MAYBE_MsgBadPayloadArgs) {
+TEST_F(IPCFuzzingTest, MsgBadPayloadArgs) {
   Init("FuzzServerClient");
 
   FuzzerClientListener listener;
diff --git a/ipc/ipc_send_fds_test.cc b/ipc/ipc_send_fds_test.cc
index 81a995da..9480d0e 100644
--- a/ipc/ipc_send_fds_test.cc
+++ b/ipc/ipc_send_fds_test.cc
@@ -143,12 +143,7 @@
   }
 };
 
-#if defined(OS_ANDROID)
-#define MAYBE_DescriptorTest DISABLED_DescriptorTest
-#else
-#define MAYBE_DescriptorTest DescriptorTest
-#endif
-TEST_F(IPCSendFdsTest, MAYBE_DescriptorTest) {
+TEST_F(IPCSendFdsTest, DescriptorTest) {
   Init("SendFdsClient");
   RunServer();
 }
diff --git a/ipc/ipc_test_base.cc b/ipc/ipc_test_base.cc
index 831a59ad..757d9f5b 100644
--- a/ipc/ipc_test_base.cc
+++ b/ipc/ipc_test_base.cc
@@ -144,8 +144,13 @@
   DCHECK(client_process_.IsValid());
 
   int exit_code;
+#if defined(OS_ANDROID)
+  bool rv = AndroidWaitForChildExitWithTimeout(
+      client_process_, base::TimeDelta::FromSeconds(5), &exit_code);
+#else
   bool rv = client_process_.WaitForExitWithTimeout(
       base::TimeDelta::FromSeconds(5), &exit_code);
+#endif  // defined(OS_ANDROID)
   client_process_.Close();
   return rv;
 }
diff --git a/ipc/mojo/ipc_channel_mojo_unittest.cc b/ipc/mojo/ipc_channel_mojo_unittest.cc
index e282f17..1a67e31 100644
--- a/ipc/mojo/ipc_channel_mojo_unittest.cc
+++ b/ipc/mojo/ipc_channel_mojo_unittest.cc
@@ -171,13 +171,7 @@
   bool is_connected_called_;
 };
 
-// Times out on Android; see http://crbug.com/502290
-#if defined(OS_ANDROID)
-#define MAYBE_ConnectedFromClient DISABLED_ConnectedFromClient
-#else
-#define MAYBE_ConnectedFromClient ConnectedFromClient
-#endif
-TEST_F(IPCChannelMojoTest, MAYBE_ConnectedFromClient) {
+TEST_F(IPCChannelMojoTest, ConnectedFromClient) {
   InitWithMojo("IPCChannelMojoTestClient");
 
   // Set up IPC channel and start client.
@@ -256,13 +250,7 @@
   Close();
 }
 
-// Times out on Android; see http://crbug.com/502290
-#if defined(OS_ANDROID)
-#define MAYBE_SendFailWithPendingMessages DISABLED_SendFailWithPendingMessages
-#else
-#define MAYBE_SendFailWithPendingMessages SendFailWithPendingMessages
-#endif
-TEST_F(IPCChannelMojoTest, MAYBE_SendFailWithPendingMessages) {
+TEST_F(IPCChannelMojoTest, SendFailWithPendingMessages) {
   InitWithMojo("IPCChannelMojoErraticTestClient");
 
   // Set up IPC channel and start client.
@@ -405,13 +393,7 @@
   IPC::Sender* sender_;
 };
 
-// Times out on Android; see http://crbug.com/502290
-#if defined(OS_ANDROID)
-#define MAYBE_SendMessagePipe DISABLED_SendMessagePipe
-#else
-#define MAYBE_SendMessagePipe SendMessagePipe
-#endif
-TEST_F(IPCChannelMojoTest, MAYBE_SendMessagePipe) {
+TEST_F(IPCChannelMojoTest, SendMessagePipe) {
   InitWithMojo("IPCChannelMojoTestSendMessagePipeClient");
 
   ListenerThatExpectsOK listener;
@@ -502,13 +484,7 @@
   }
 };
 
-// Times out on Android; see http://crbug.com/502290
-#if defined(OS_ANDROID)
-#define MAYBE_ParamTraitValidMessagePipe DISABLED_ParamTraitValidMessagePipe
-#else
-#define MAYBE_ParamTraitValidMessagePipe ParamTraitValidMessagePipe
-#endif
-TEST_F(IPCChannelMojoTest, MAYBE_ParamTraitValidMessagePipe) {
+TEST_F(IPCChannelMojoTest, ParamTraitValidMessagePipe) {
   InitWithMojo("ParamTraitValidMessagePipeClient");
 
   ListenerThatExpectsOK listener;
@@ -535,13 +511,7 @@
   RunTest(true);
 }
 
-// Times out on Android; see http://crbug.com/502290
-#if defined(OS_ANDROID)
-#define MAYBE_ParamTraitInvalidMessagePipe DISABLED_ParamTraitInvalidMessagePipe
-#else
-#define MAYBE_ParamTraitInvalidMessagePipe ParamTraitInvalidMessagePipe
-#endif
-TEST_F(IPCChannelMojoTest, MAYBE_ParamTraitInvalidMessagePipe) {
+TEST_F(IPCChannelMojoTest, ParamTraitInvalidMessagePipe) {
   InitWithMojo("ParamTraitInvalidMessagePipeClient");
 
   ListenerThatExpectsOK listener;
@@ -566,13 +536,7 @@
   RunTest(false);
 }
 
-// Times out on Android. crbug.com/593790
-#if defined(OS_ANDROID)
-#define MAYBE_SendFailAfterClose DISABLED_SendFailAfterClose
-#else
-#define MAYBE_SendFailAfterClose SendFailAfterClose
-#endif
-TEST_F(IPCChannelMojoTest, MAYBE_SendFailAfterClose) {
+TEST_F(IPCChannelMojoTest, SendFailAfterClose) {
   InitWithMojo("IPCChannelMojoTestSendOkClient");
 
   ListenerThatExpectsOK listener;
@@ -638,13 +602,7 @@
   IPC::Sender* sender_;
 };
 
-// Times out on Android; see http://crbug.com/502290
-#if defined(OS_ANDROID)
-#define MAYBE_SendPlatformHandle DISABLED_SendPlatformHandle
-#else
-#define MAYBE_SendPlatformHandle SendPlatformHandle
-#endif
-TEST_F(IPCChannelMojoTest, MAYBE_SendPlatformHandle) {
+TEST_F(IPCChannelMojoTest, SendPlatformHandle) {
   InitWithMojo("IPCChannelMojoTestSendPlatformHandleClient");
 
   ListenerThatExpectsOK listener;
@@ -697,13 +655,7 @@
   IPC::Sender* sender_;
 };
 
-// Times out on Android; see http://crbug.com/502290
-#if defined(OS_ANDROID)
-#define MAYBE_SendPlatformHandleAndPipe DISABLED_SendPlatformHandleAndPipe
-#else
-#define MAYBE_SendPlatformHandleAndPipe SendPlatformHandleAndPipe
-#endif
-TEST_F(IPCChannelMojoTest, MAYBE_SendPlatformHandleAndPipe) {
+TEST_F(IPCChannelMojoTest, SendPlatformHandleAndPipe) {
   InitWithMojo("IPCChannelMojoTestSendPlatformHandleAndPipeClient");
 
   ListenerThatExpectsOK listener;
@@ -781,12 +733,4 @@
 
 #endif  // OS_LINUX
 
-// This test always passes; it ensures that there is at least one test on all
-// targets. Otherwise, Android bots will fail because there is a test target
-// that runs 0 tests.
-// TODO(amistry): Remove this once at least one other test has been enabled.
-// https://crbug.com/606624.
-TEST_F(IPCChannelMojoTest, DummyAlwaysPasses) {
-}
-
 }  // namespace
diff --git a/ipc/mojo/ipc_mojo_bootstrap_unittest.cc b/ipc/mojo/ipc_mojo_bootstrap_unittest.cc
index dcf68bd..4fa52e2 100644
--- a/ipc/mojo/ipc_mojo_bootstrap_unittest.cc
+++ b/ipc/mojo/ipc_mojo_bootstrap_unittest.cc
@@ -59,13 +59,7 @@
   quit_callback_.Run();
 }
 
-// Times out on Android; see http://crbug.com/502290
-#if defined(OS_ANDROID)
-#define MAYBE_Connect DISABLED_Connect
-#else
-#define MAYBE_Connect Connect
-#endif
-TEST_F(IPCMojoBootstrapTest, MAYBE_Connect) {
+TEST_F(IPCMojoBootstrapTest, Connect) {
   base::MessageLoop message_loop;
   base::RunLoop run_loop;
   TestingDelegate delegate(run_loop.QuitClosure());
diff --git a/ipc/mojo/run_all_unittests.cc b/ipc/mojo/run_all_unittests.cc
index 4416932..a831c2d 100644
--- a/ipc/mojo/run_all_unittests.cc
+++ b/ipc/mojo/run_all_unittests.cc
@@ -5,6 +5,7 @@
 #include "base/at_exit.h"
 #include "base/bind.h"
 #include "base/test/launcher/unit_test_launcher.h"
+#include "base/test/multiprocess_test.h"
 #include "base/test/test_io_thread.h"
 #include "base/test/test_suite.h"
 #include "build/build_config.h"
@@ -18,6 +19,10 @@
 
 int main(int argc, char** argv) {
 #if defined(OS_ANDROID)
+  // Enable the alternate test child implementation. This is needed because Mojo
+  // tests need to spawn test children after initialising the Mojo system.
+  base::InitAndroidMultiProcessTestHelper(main);
+
   JNIEnv* env = base::android::AttachCurrentThread();
   base::RegisterContentUriTestUtils(env);
 #endif
diff --git a/ipc/run_all_unittests.cc b/ipc/run_all_unittests.cc
index 26a7395..5f9cc16 100644
--- a/ipc/run_all_unittests.cc
+++ b/ipc/run_all_unittests.cc
@@ -4,6 +4,7 @@
 
 #include "base/bind.h"
 #include "base/test/launcher/unit_test_launcher.h"
+#include "base/test/multiprocess_test.h"
 #include "base/test/test_suite.h"
 #include "build/build_config.h"
 
@@ -14,6 +15,8 @@
 
 int main(int argc, char** argv) {
 #if defined(OS_ANDROID)
+  base::InitAndroidMultiProcessTestHelper(main);
+
   JNIEnv* env = base::android::AttachCurrentThread();
   base::RegisterContentUriTestUtils(env);
 #endif
diff --git a/ipc/sync_socket_unittest.cc b/ipc/sync_socket_unittest.cc
index 7c83b24..3385646b 100644
--- a/ipc/sync_socket_unittest.cc
+++ b/ipc/sync_socket_unittest.cc
@@ -167,12 +167,7 @@
 class SyncSocketTest : public IPCTestBase {
 };
 
-#if defined(OS_ANDROID)
-#define MAYBE_SanityTest DISABLED_SanityTest
-#else
-#define MAYBE_SanityTest SanityTest
-#endif
-TEST_F(SyncSocketTest, MAYBE_SanityTest) {
+TEST_F(SyncSocketTest, SanityTest) {
   Init("SyncSocketServerClient");
 
   SyncSocketClientListener listener;
@@ -254,13 +249,8 @@
   EXPECT_EQ(0U, received);
 }
 
-#if defined(OS_ANDROID)
-#define MAYBE_BlockingReceiveTest DISABLED_BlockingReceiveTest
-#else
-#define MAYBE_BlockingReceiveTest BlockingReceiveTest
-#endif
 // Tests that read is a blocking operation.
-TEST_F(SyncSocketTest, MAYBE_BlockingReceiveTest) {
+TEST_F(SyncSocketTest, BlockingReceiveTest) {
   base::CancelableSyncSocket pair[2];
   ASSERT_TRUE(base::CancelableSyncSocket::CreatePair(&pair[0], &pair[1]));
 
diff --git a/mash/shelf/public/interfaces/shelf.mojom b/mash/shelf/public/interfaces/shelf.mojom
index 9b21fb1..0779002 100644
--- a/mash/shelf/public/interfaces/shelf.mojom
+++ b/mash/shelf/public/interfaces/shelf.mojom
@@ -18,6 +18,8 @@
 
   PinItem(ShelfItem item, associated ShelfItemDelegate delegate);
   UnpinItem(string app_id);
+
+  SetItemImage(string app_id, skia.mojom.Bitmap image);
 };
 
 // ShelfObserver is notified on shelf changes; used to persist profile settings.
@@ -28,6 +30,9 @@
 
 // ShelfItemDelegate handles command execution and observes shelf item changes.
 interface ShelfItemDelegate {
+  // Called when a pinned shelf item is invoked without an open window.
+  LaunchItem();
+
   // Called on invocation of a shelf item's context menu command.
   ExecuteCommand(uint32 command_id, int32 event_flags);
 
diff --git a/media/audio/BUILD.gn b/media/audio/BUILD.gn
index 7771432..6e7fe3fe 100644
--- a/media/audio/BUILD.gn
+++ b/media/audio/BUILD.gn
@@ -190,6 +190,8 @@
       "android/opensles_input.h",
       "android/opensles_output.cc",
       "android/opensles_output.h",
+      "android/opensles_util.cc",
+      "android/opensles_util.h",
       "android/opensles_wrapper.cc",
     ]
     deps += [ "//media/base/android:media_jni_headers" ]
diff --git a/media/audio/android/audio_manager_android.cc b/media/audio/android/audio_manager_android.cc
index 8325801e4..e48aa5bb 100644
--- a/media/audio/android/audio_manager_android.cc
+++ b/media/audio/android/audio_manager_android.cc
@@ -314,7 +314,16 @@
     // Use the client's input parameters if they are valid.
     sample_rate = input_params.sample_rate();
     bits_per_sample = input_params.bits_per_sample();
-    channel_layout = input_params.channel_layout();
+
+    // Pre-Lollipop devices don't support > stereo OpenSLES output and the
+    // AudioManager APIs for GetOptimalOutputFrameSize() don't support channel
+    // layouts greater than stereo unless low latency audio is supported.
+    if (input_params.channels() <= 2 ||
+        (base::android::BuildInfo::GetInstance()->sdk_int() >= 21 &&
+         IsAudioLowLatencySupported())) {
+      channel_layout = input_params.channel_layout();
+    }
+
     buffer_size = GetOptimalOutputFrameSize(
         sample_rate, ChannelLayoutToChannelCount(channel_layout));
   }
diff --git a/media/audio/android/opensles_input.cc b/media/audio/android/opensles_input.cc
index afbe02e..748a9cc 100644
--- a/media/audio/android/opensles_input.cc
+++ b/media/audio/android/opensles_input.cc
@@ -39,12 +39,7 @@
   format_.bitsPerSample = params.bits_per_sample();
   format_.containerSize = params.bits_per_sample();
   format_.endianness = SL_BYTEORDER_LITTLEENDIAN;
-  if (format_.numChannels == 1)
-    format_.channelMask = SL_SPEAKER_FRONT_CENTER;
-  else if (format_.numChannels == 2)
-    format_.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
-  else
-    NOTREACHED() << "Unsupported number of channels: " << format_.numChannels;
+  format_.channelMask = ChannelCountToSLESChannelMask(params.channels());
 
   buffer_size_bytes_ = params.GetBytesPerBuffer();
 
diff --git a/media/audio/android/opensles_output.cc b/media/audio/android/opensles_output.cc
index 005b0e7..bf1957f7 100644
--- a/media/audio/android/opensles_output.cc
+++ b/media/audio/android/opensles_output.cc
@@ -42,12 +42,7 @@
   format_.bitsPerSample = params.bits_per_sample();
   format_.containerSize = params.bits_per_sample();
   format_.endianness = SL_BYTEORDER_LITTLEENDIAN;
-  if (format_.numChannels == 1)
-    format_.channelMask = SL_SPEAKER_FRONT_CENTER;
-  else if (format_.numChannels == 2)
-    format_.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
-  else
-    NOTREACHED() << "Unsupported number of channels: " << format_.numChannels;
+  format_.channelMask = ChannelCountToSLESChannelMask(params.channels());
 
   buffer_size_bytes_ = params.GetBytesPerBuffer();
   audio_bus_ = AudioBus::Create(params);
diff --git a/media/audio/android/opensles_util.cc b/media/audio/android/opensles_util.cc
new file mode 100644
index 0000000..cf5ea3b9
--- /dev/null
+++ b/media/audio/android/opensles_util.cc
@@ -0,0 +1,50 @@
+// Copyright 2016 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/audio/android/opensles_util.h"
+
+namespace media {
+
+#define SL_ANDROID_SPEAKER_QUAD                                            \
+  (SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT | SL_SPEAKER_BACK_LEFT | \
+   SL_SPEAKER_BACK_RIGHT)
+#define SL_ANDROID_SPEAKER_5DOT1                                              \
+  (SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT | SL_SPEAKER_FRONT_CENTER | \
+   SL_SPEAKER_LOW_FREQUENCY | SL_SPEAKER_BACK_LEFT | SL_SPEAKER_BACK_RIGHT)
+#define SL_ANDROID_SPEAKER_7DOT1 \
+  (SL_ANDROID_SPEAKER_5DOT1 | SL_SPEAKER_SIDE_LEFT | SL_SPEAKER_SIDE_RIGHT)
+
+// Ported from:
+// https://android.googlesource.com/platform/frameworks/wilhelm/+/refs/heads/master/src/android/channels.h
+// https://android.googlesource.com/platform/frameworks/wilhelm/+/refs/heads/master/src/android/channels.c
+SLuint32 ChannelCountToSLESChannelMask(int channel_count) {
+  if (channel_count > 2) {
+    LOG(WARNING) << "Guessing channel layout for " << channel_count
+                 << " channels; speaker order may be incorrect.";
+  }
+
+  switch (channel_count) {
+    case 1:
+      return SL_SPEAKER_FRONT_LEFT;
+    case 2:
+      return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
+    case 3:
+      return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT |
+             SL_SPEAKER_FRONT_CENTER;
+    case 4:
+      return SL_ANDROID_SPEAKER_QUAD;
+    case 5:
+      return SL_ANDROID_SPEAKER_QUAD | SL_SPEAKER_FRONT_CENTER;
+    case 6:
+      return SL_ANDROID_SPEAKER_5DOT1;
+    case 7:
+      return SL_ANDROID_SPEAKER_5DOT1 | SL_SPEAKER_BACK_CENTER;
+    case 8:
+      return SL_ANDROID_SPEAKER_7DOT1;
+  }
+
+  return 0;
+}
+
+}  // namespace media
diff --git a/media/audio/android/opensles_util.h b/media/audio/android/opensles_util.h
index bc6d041..2673d14 100644
--- a/media/audio/android/opensles_util.h
+++ b/media/audio/android/opensles_util.h
@@ -8,6 +8,7 @@
 #include <SLES/OpenSLES.h>
 
 #include "base/logging.h"
+#include "media/base/media_export.h"
 
 namespace media {
 
@@ -40,6 +41,11 @@
 
 typedef ScopedSLObject<SLObjectItf, const SLObjectItf_*> ScopedSLObjectItf;
 
+// Guesses the channel mask for a given channel count. Android does not offer a
+// way to configure the layout, so this will be incorrect for less common
+// channel layouts.
+MEDIA_EXPORT SLuint32 ChannelCountToSLESChannelMask(int channel_count);
+
 }  // namespace media
 
 #endif  // MEDIA_AUDIO_ANDROID_OPENSLES_UTIL_H_
diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn
index b825c20..f78b7263 100644
--- a/media/base/BUILD.gn
+++ b/media/base/BUILD.gn
@@ -13,6 +13,7 @@
 source_set("base") {
   # This is part of the media component.
   visibility = [
+    ":*",
     "//media",
     "//media/capture",
   ]
@@ -385,12 +386,17 @@
     "test_helpers.cc",
     "test_helpers.h",
     "test_random.h",
+    "vector_math_testing.h",
   ]
   configs += [ "//media:media_config" ]
   deps = [
+    "//base",
+    "//base/test:test_support",
+    "//media",
     "//media:media_features",
     "//media:shared_memory_support",
     "//testing/gmock",
+    "//ui/gfx/geometry",
   ]
 }
 
@@ -445,7 +451,6 @@
     "text_renderer_unittest.cc",
     "time_delta_interpolator_unittest.cc",
     "user_input_monitor_unittest.cc",
-    "vector_math_testing.h",
     "vector_math_unittest.cc",
     "video_decoder_config_unittest.cc",
     "video_frame_pool_unittest.cc",
@@ -460,6 +465,7 @@
   ]
   deps = [
     ":test_support",
+    "//base/test:test_support",
     "//gpu/command_buffer/common",
     "//media",
     "//skia",
@@ -498,9 +504,12 @@
   configs += [ "//media:media_config" ]
   deps = [
     ":test_support",
+    "//base",
+    "//base/test:test_support",
     "//media",
     "//testing/gmock",
     "//testing/gtest",
+    "//testing/perf",
     "//third_party/libyuv",
   ]
 
@@ -580,6 +589,7 @@
     "bit_reader_fuzzertest.cc",
   ]
   deps = [
+    ":test_support",
     "//base",
     "//media",
   ]
diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java
index 4befc19..de7603ad 100644
--- a/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java
+++ b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java
@@ -182,6 +182,11 @@
         private int sampleRate() {
             return mFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE);
         }
+
+        @CalledByNative("GetOutputFormatResult")
+        private int channelCount() {
+            return mFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
+        }
     }
 
     private MediaCodecBridge(
diff --git a/media/base/android/media_codec_bridge.h b/media/base/android/media_codec_bridge.h
index 25d61f97..f45f873 100644
--- a/media/base/android/media_codec_bridge.h
+++ b/media/base/android/media_codec_bridge.h
@@ -75,6 +75,11 @@
   // Returns MEDIA_CODEC_ERROR if an error occurs, or MEDIA_CODEC_OK otherwise.
   virtual MediaCodecStatus GetOutputSamplingRate(int* sampling_rate) = 0;
 
+  // Fills |channel_count| with the number of audio channels. Useful after
+  // INFO_OUTPUT_FORMAT_CHANGED.
+  // Returns MEDIA_CODEC_ERROR if an error occurs, or MEDIA_CODEC_OK otherwise.
+  virtual MediaCodecStatus GetOutputChannelCount(int* channel_count) = 0;
+
   // Submits a byte array to the given input buffer. Call this after getting an
   // available buffer from DequeueInputBuffer(). If |data| is NULL, assume the
   // input buffer has already been populated (but still obey |size|).
diff --git a/media/base/android/ndk_media_codec_bridge.cc b/media/base/android/ndk_media_codec_bridge.cc
index 3a66db6..0c3a2cd 100644
--- a/media/base/android/ndk_media_codec_bridge.cc
+++ b/media/base/android/ndk_media_codec_bridge.cc
@@ -85,6 +85,7 @@
     AMediaFormat_getInt32(format, AMEDIAFORMAT_KEY_WIDTH, &width);
     AMediaFormat_getInt32(format, AMEDIAFORMAT_KEY_HEIGHT, &height);
   }
+  AMediaFormat_delete(format);
   size->SetSize(width, height);
   return MEDIA_CODEC_OK;
 }
@@ -94,10 +95,21 @@
   AMediaFormat* format = AMediaCodec_getOutputFormat(media_codec_.get());
   *sampling_rate = 0;
   AMediaFormat_getInt32(format, AMEDIAFORMAT_KEY_SAMPLE_RATE, sampling_rate);
+  AMediaFormat_delete(format);
   DCHECK_NE(*sampling_rate, 0);
   return MEDIA_CODEC_OK;
 }
 
+MediaCodecStatus NdkMediaCodecBridge::GetOutputChannelCount(
+    int* channel_count) {
+  AMediaFormat* format = AMediaCodec_getOutputFormat(media_codec_.get());
+  *channel_count = 0;
+  AMediaFormat_getInt32(format, AMEDIAFORMAT_KEY_CHANNEL_COUNT, channel_count);
+  AMediaFormat_delete(format);
+  DCHECK_NE(*channel_count, 0);
+  return MEDIA_CODEC_OK;
+}
+
 MediaCodecStatus NdkMediaCodecBridge::QueueInputBuffer(
     int index,
     const uint8_t* data,
diff --git a/media/base/android/ndk_media_codec_bridge.h b/media/base/android/ndk_media_codec_bridge.h
index 3f75a73e..8278a1ba 100644
--- a/media/base/android/ndk_media_codec_bridge.h
+++ b/media/base/android/ndk_media_codec_bridge.h
@@ -29,6 +29,7 @@
   void Stop() override;
   MediaCodecStatus GetOutputSize(gfx::Size* size) override;
   MediaCodecStatus GetOutputSamplingRate(int* sampling_rate) override;
+  MediaCodecStatus GetOutputChannelCount(int* channel_count) override;
   MediaCodecStatus QueueInputBuffer(
       int index,
       const uint8_t* data,
diff --git a/media/base/android/ndk_media_codec_wrapper.cc b/media/base/android/ndk_media_codec_wrapper.cc
index e4709a6..ba8a250 100644
--- a/media/base/android/ndk_media_codec_wrapper.cc
+++ b/media/base/android/ndk_media_codec_wrapper.cc
@@ -26,6 +26,7 @@
 // The constants used in chromium. Those symbols are defined as extern symbols
 // in the NdkMediaFormat headers. They will be initialized to their correct
 // values when the library is loaded.
+const char* AMEDIAFORMAT_KEY_CHANNEL_COUNT;
 const char* AMEDIAFORMAT_KEY_HEIGHT;
 const char* AMEDIAFORMAT_KEY_SAMPLE_RATE;
 const char* AMEDIAFORMAT_KEY_WIDTH;
@@ -50,9 +51,10 @@
 
   // The list of defined symbols.
   const SymbolDefinition kSymbols[] = {
+      {"AMEDIAFORMAT_KEY_CHANNEL_COUNT", &AMEDIAFORMAT_KEY_CHANNEL_COUNT},
       {"AMEDIAFORMAT_KEY_HEIGHT", &AMEDIAFORMAT_KEY_HEIGHT},
       {"AMEDIAFORMAT_KEY_SAMPLE_RATE", &AMEDIAFORMAT_KEY_SAMPLE_RATE},
-      {"AMEDIAFORMAT_KEY_SAMPLE_RATE", &AMEDIAFORMAT_KEY_SAMPLE_RATE},
+      {"AMEDIAFORMAT_KEY_WIDTH", &AMEDIAFORMAT_KEY_WIDTH},
   };
 
   for (size_t i = 0; i < sizeof(kSymbols) / sizeof(kSymbols[0]); ++i) {
@@ -158,6 +160,10 @@
             media_status_t,
             (AMediaCodecCryptoInfo * info),
             (info));
+LOOKUP_FUNC(AMediaFormat_delete,
+            media_status_t,
+            (AMediaFormat * format),
+            (format));
 LOOKUP_FUNC(AMediaFormat_getInt32,
             bool,
             (AMediaFormat * format, const char* name, int32_t* out),
diff --git a/media/base/android/sdk_media_codec_bridge.cc b/media/base/android/sdk_media_codec_bridge.cc
index b380288..5dd7d539 100644
--- a/media/base/android/sdk_media_codec_bridge.cc
+++ b/media/base/android/sdk_media_codec_bridge.cc
@@ -138,6 +138,18 @@
   return status;
 }
 
+MediaCodecStatus SdkMediaCodecBridge::GetOutputChannelCount(
+    int* channel_count) {
+  JNIEnv* env = AttachCurrentThread();
+  ScopedJavaLocalRef<jobject> result =
+      Java_MediaCodecBridge_getOutputFormat(env, j_media_codec_.obj());
+  MediaCodecStatus status = static_cast<MediaCodecStatus>(
+      Java_GetOutputFormatResult_status(env, result.obj()));
+  if (status == MEDIA_CODEC_OK)
+    *channel_count = Java_GetOutputFormatResult_channelCount(env, result.obj());
+  return status;
+}
+
 MediaCodecStatus SdkMediaCodecBridge::QueueInputBuffer(
     int index,
     const uint8_t* data,
diff --git a/media/base/android/sdk_media_codec_bridge.h b/media/base/android/sdk_media_codec_bridge.h
index e23400d..5c47d94 100644
--- a/media/base/android/sdk_media_codec_bridge.h
+++ b/media/base/android/sdk_media_codec_bridge.h
@@ -34,6 +34,7 @@
   void Stop() override;
   MediaCodecStatus GetOutputSize(gfx::Size* size) override;
   MediaCodecStatus GetOutputSamplingRate(int* sampling_rate) override;
+  MediaCodecStatus GetOutputChannelCount(int* channel_count) override;
   MediaCodecStatus QueueInputBuffer(
       int index,
       const uint8_t* data,
diff --git a/media/blink/BUILD.gn b/media/blink/BUILD.gn
index 25d7d3d5..fef7d09 100644
--- a/media/blink/BUILD.gn
+++ b/media/blink/BUILD.gn
@@ -122,7 +122,10 @@
     "//url",
   ]
 
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
+  configs += [
+    "//build/config/compiler:no_size_t_to_int_warning",
+    "//v8:external_startup_data",
+  ]
 
   sources = [
     "buffered_data_source_host_impl_unittest.cc",
@@ -147,8 +150,10 @@
   ]
 
   if (is_android) {
-    deps += [ "//ui/gl" ]
+    deps += [
+      "//media/base/android",
+      "//media/base/android:media_java",
+      "//v8:v8_external_startup_data_assets",
+    ]
   }
-
-  configs += [ "//v8:external_startup_data" ]
 }
diff --git a/media/blink/buffered_data_source.cc b/media/blink/buffered_data_source.cc
index 7b15b11..26cf3ec 100644
--- a/media/blink/buffered_data_source.cc
+++ b/media/blink/buffered_data_source.cc
@@ -11,6 +11,7 @@
 #include "base/location.h"
 #include "base/macros.h"
 #include "base/single_thread_task_runner.h"
+#include "build/build_config.h"
 #include "media/base/media_log.h"
 #include "net/base/net_errors.h"
 
@@ -387,7 +388,19 @@
     loader_->Stop();
     return;
   }
+
   response_original_url_ = loader_->response_original_url();
+#if defined(OS_ANDROID)
+  // The response original url is the URL of this resource after following
+  // redirects. Update |url_| to this so that we only follow redirects once.
+  // We do this on Android only to preserve the behavior we had before the
+  // unified media pipeline. This behavior will soon exist on all platforms
+  // as we switch to MultiBufferDataSource (http://crbug.com/514719).
+  // If the response URL is empty (which happens when it's from a Service
+  // Worker), keep the original one.
+  if (!response_original_url_.is_empty())
+    url_ = response_original_url_;
+#endif  // defined(OS_ANDROID)
 
   // All responses must be successful. Resources that are assumed to be fully
   // buffered must have a known content length.
diff --git a/media/blink/buffered_data_source_unittest.cc b/media/blink/buffered_data_source_unittest.cc
index 79445c1..605a46d7 100644
--- a/media/blink/buffered_data_source_unittest.cc
+++ b/media/blink/buffered_data_source_unittest.cc
@@ -8,6 +8,7 @@
 #include "base/macros.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
+#include "build/build_config.h"
 #include "media/base/media_log.h"
 #include "media/base/mock_filters.h"
 #include "media/base/test_helpers.h"
@@ -296,6 +297,7 @@
   void set_might_be_reused_from_cache_in_future(bool value) {
     loader()->might_be_reused_from_cache_in_future_ = value;
   }
+  GURL url() { return data_source_->url_; }
 
   std::unique_ptr<MockBufferedDataSource> data_source_;
 
@@ -499,6 +501,67 @@
   Stop();
 }
 
+#if defined(OS_ANDROID)
+// If the initial response is a redirect, BDS saves it and uses it for future
+// requests.
+TEST_F(BufferedDataSourceTest, Http_InitialReponseRedirectsAreCached) {
+  Initialize(kHttpUrl, true);
+
+  WebURLResponse redirect =
+      response_generator_->GeneratePartial206(0, kDataSize - 1);
+  redirect.setURL(GURL(kHttpDifferentPathUrl));
+
+  EXPECT_CALL(host_, SetTotalBytes(kFileSize));
+  Respond(redirect);
+  ASSERT_TRUE(url() == GURL(kHttpDifferentPathUrl));
+}
+
+TEST_F(BufferedDataSourceTest,
+       Http_RedirectsAfterTheInitialReponseAreNotCached) {
+  Initialize(kHttpUrl, true);
+
+  WebURLResponse response =
+      response_generator_->GeneratePartial206(0, kDataSize - 1);
+  response.setURL(GURL(kHttpUrl));
+
+  EXPECT_CALL(host_, SetTotalBytes(kFileSize));
+  EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1));
+  EXPECT_CALL(host_, AddBufferedByteRange(kDataSize, kDataSize * 2 - 1));
+  EXPECT_CALL(*this, ReadCallback(kDataSize)).Times(2);
+
+  Respond(response);
+  ReadAt(0);
+  ReceiveData(kDataSize);
+
+  WebURLResponse redirect =
+      response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1);
+  redirect.setURL(GURL(kHttpDifferentPathUrl));
+
+  ExpectCreateResourceLoader();
+  FinishLoading();
+  ReadAt(kDataSize);
+  Respond(redirect);
+  // The redirect isn't cached.
+  ASSERT_TRUE(url() == GURL(kHttpUrl));
+  ReceiveData(kDataSize);
+  FinishLoading();
+  Stop();
+}
+
+TEST_F(BufferedDataSourceTest, Http_ServiceWorkerRedirectsAreNotCached) {
+  Initialize(kHttpUrl, true);
+
+  WebURLResponse redirect =
+      response_generator_->GeneratePartial206(0, kDataSize - 1);
+  redirect.setURL(GURL(kHttpDifferentPathUrl));
+  redirect.setWasFetchedViaServiceWorker(true);
+
+  EXPECT_CALL(host_, SetTotalBytes(kFileSize));
+  Respond(redirect);
+  ASSERT_TRUE(url() == GURL(kHttpUrl));
+}
+#endif  // defined(OS_ANDROID)
+
 TEST_F(BufferedDataSourceTest, Http_PartialResponse) {
   Initialize(kHttpUrl, true);
   WebURLResponse response1 =
diff --git a/media/blink/run_all_unittests.cc b/media/blink/run_all_unittests.cc
index 8873803..38ca6aa6 100644
--- a/media/blink/run_all_unittests.cc
+++ b/media/blink/run_all_unittests.cc
@@ -6,7 +6,6 @@
 
 #include "base/bind.h"
 #include "base/message_loop/message_loop.h"
-#include "base/rand_util.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
 #include "build/build_config.h"
@@ -25,7 +24,6 @@
 #if defined(OS_ANDROID)
 #include "base/android/jni_android.h"
 #include "media/base/android/media_jni_registrar.h"
-#include "ui/gl/android/gl_jni_registrar.h"
 #endif
 
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
@@ -107,11 +105,7 @@
   base::TestSuite::Initialize();
 
 #if defined(OS_ANDROID)
-  // Register JNI bindings for android.
-  JNIEnv* env = base::android::AttachCurrentThread();
-  // Needed for surface texture support.
-  ui::gl::android::RegisterJni(env);
-  media::RegisterJni(env);
+  media::RegisterJni(base::android::AttachCurrentThread());
 #endif
 
   // Run this here instead of main() to ensure an AtExitManager is already
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
index 020fba5..1ecb4bd 100644
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
@@ -951,6 +951,8 @@
   if (suppress_destruction_errors_)
     return;
 
+  ReportPipelineError(load_type_, frame_->getSecurityOrigin(), error);
+
   media_log_->AddEvent(media_log_->CreatePipelineErrorEvent(error));
 
   if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing) {
diff --git a/media/blink/webmediaplayer_util.cc b/media/blink/webmediaplayer_util.cc
index 981cba2..297ff68 100644
--- a/media/blink/webmediaplayer_util.cc
+++ b/media/blink/webmediaplayer_util.cc
@@ -139,6 +139,20 @@
   }
 }
 
+void ReportPipelineError(blink::WebMediaPlayer::LoadType load_type,
+                         const blink::WebSecurityOrigin& security_origin,
+                         PipelineStatus error) {
+  DCHECK_NE(PIPELINE_OK, error);
+
+  // Report the origin from where the media player is created.
+  if (!GetMediaClient())
+    return;
+
+  GetMediaClient()->RecordRapporURL(
+      "Media.OriginUrl." + LoadTypeToString(load_type) + "PipelineError",
+      blink::WebStringToGURL(security_origin.toString()));
+}
+
 void RecordOriginOfHLSPlayback(const GURL& origin_url) {
   if (media::GetMediaClient())
     GetMediaClient()->RecordRapporURL("Media.OriginUrl.HLS", origin_url);
diff --git a/media/blink/webmediaplayer_util.h b/media/blink/webmediaplayer_util.h
index c71e6c03..1ae2a93 100644
--- a/media/blink/webmediaplayer_util.h
+++ b/media/blink/webmediaplayer_util.h
@@ -32,6 +32,12 @@
               const GURL& url,
               const blink::WebSecurityOrigin& security_origin);
 
+// Report metrics about pipeline errors.
+void MEDIA_BLINK_EXPORT
+ReportPipelineError(blink::WebMediaPlayer::LoadType load_type,
+                    const blink::WebSecurityOrigin& security_origin,
+                    PipelineStatus error);
+
 // Record a RAPPOR metric for the origin of an HLS playback.
 void MEDIA_BLINK_EXPORT RecordOriginOfHLSPlayback(const GURL& origin_url);
 
diff --git a/media/capture.gypi b/media/capture.gypi
index 554cb25b..071a0629 100644
--- a/media/capture.gypi
+++ b/media/capture.gypi
@@ -13,7 +13,6 @@
       'capture/content/animated_content_sampler.h',
       'capture/content/capture_resolution_chooser.cc',
       'capture/content/capture_resolution_chooser.h',
-      'capture/content/feedback_signal_accumulator.cc',
       'capture/content/feedback_signal_accumulator.h',
       'capture/content/screen_capture_device_core.cc',
       'capture/content/screen_capture_device_core.h',
diff --git a/media/capture/BUILD.gn b/media/capture/BUILD.gn
index 036a33c..3860b8b 100644
--- a/media/capture/BUILD.gn
+++ b/media/capture/BUILD.gn
@@ -12,7 +12,6 @@
     "content/animated_content_sampler.h",
     "content/capture_resolution_chooser.cc",
     "content/capture_resolution_chooser.h",
-    "content/feedback_signal_accumulator.cc",
     "content/feedback_signal_accumulator.h",
     "content/screen_capture_device_core.cc",
     "content/screen_capture_device_core.h",
diff --git a/media/capture/content/feedback_signal_accumulator.cc b/media/capture/content/feedback_signal_accumulator.cc
deleted file mode 100644
index ba0e08e..0000000
--- a/media/capture/content/feedback_signal_accumulator.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (c) 2015 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_CAPTURE_FEEDBACK_SIGNAL_ACCUMULATOR_CC_
-#define MEDIA_CAPTURE_FEEDBACK_SIGNAL_ACCUMULATOR_CC_
-
-#include "media/capture/content/feedback_signal_accumulator.h"
-
-#include <algorithm>
-#include <cmath>
-
-namespace media {
-
-template <typename TimeType>
-FeedbackSignalAccumulator<TimeType>::FeedbackSignalAccumulator(
-    base::TimeDelta half_life)
-    : half_life_(half_life), average_(NAN) {
-  DCHECK(half_life_ > base::TimeDelta());
-}
-
-template <typename TimeType>
-void FeedbackSignalAccumulator<TimeType>::Reset(double starting_value,
-                                                TimeType timestamp) {
-  average_ = update_value_ = prior_average_ = starting_value;
-  reset_time_ = update_time_ = prior_update_time_ = timestamp;
-}
-
-template <typename TimeType>
-bool FeedbackSignalAccumulator<TimeType>::Update(double value,
-                                                 TimeType timestamp) {
-  DCHECK(!std::isnan(average_)) << "Reset() must be called once.";
-
-  if (timestamp < update_time_) {
-    return false;  // Not in chronological order.
-  } else if (timestamp == update_time_) {
-    if (timestamp == reset_time_) {
-      // Edge case: Multiple updates at reset timestamp.
-      average_ = update_value_ = prior_average_ =
-          std::max(value, update_value_);
-      return true;
-    }
-    if (value <= update_value_)
-      return true;
-    update_value_ = value;
-  } else {
-    prior_average_ = average_;
-    prior_update_time_ = update_time_;
-    update_value_ = value;
-    update_time_ = timestamp;
-  }
-
-  const double elapsed_us =
-      static_cast<double>((update_time_ - prior_update_time_).InMicroseconds());
-  const double weight = elapsed_us / (elapsed_us + half_life_.InMicroseconds());
-  average_ = weight * update_value_ + (1.0 - weight) * prior_average_;
-  DCHECK(std::isfinite(average_));
-
-  return true;
-}
-
-template class MEDIA_EXPORT FeedbackSignalAccumulator<base::TimeDelta>;
-template class MEDIA_EXPORT FeedbackSignalAccumulator<base::TimeTicks>;
-}  // namespace media
-
-#endif  // MEDIA_CAPTURE_FEEDBACK_SIGNAL_ACCUMULATOR_CC_
diff --git a/media/capture/content/feedback_signal_accumulator.h b/media/capture/content/feedback_signal_accumulator.h
index 08a11e90..a934516 100644
--- a/media/capture/content/feedback_signal_accumulator.h
+++ b/media/capture/content/feedback_signal_accumulator.h
@@ -33,11 +33,17 @@
   // move the accumulated average value halfway in-between.  Example: If
   // |half_life| is one second, then calling Reset(0.0, t=0s) and then
   // Update(1.0, t=1s) will result in an accumulated average value of 0.5.
-  explicit FeedbackSignalAccumulator(base::TimeDelta half_life);
+  explicit FeedbackSignalAccumulator(base::TimeDelta half_life)
+      : half_life_(half_life), average_(NAN) {
+    DCHECK(half_life_ > base::TimeDelta());
+  }
 
   // Erase all memory of historical values, re-starting with the given
   // |starting_value|.
-  void Reset(double starting_value, TimeType timestamp);
+  void Reset(double starting_value, TimeType timestamp) {
+    average_ = update_value_ = prior_average_ = starting_value;
+    reset_time_ = update_time_ = prior_update_time_ = timestamp;
+  }
 
   TimeType reset_time() const { return reset_time_; }
 
@@ -47,7 +53,37 @@
   // effect and false is returned.  If there are two or more updates at the same
   // |timestamp|, only the one with the greatest value will be accounted for
   // (see class comments for elaboration).
-  bool Update(double value, TimeType timestamp);
+  bool Update(double value, TimeType timestamp) {
+    DCHECK(!std::isnan(average_)) << "Reset() must be called once.";
+
+    if (timestamp < update_time_) {
+      return false;  // Not in chronological order.
+    } else if (timestamp == update_time_) {
+      if (timestamp == reset_time_) {
+        // Edge case: Multiple updates at reset timestamp.
+        average_ = update_value_ = prior_average_ =
+            std::max(value, update_value_);
+        return true;
+      }
+      if (value <= update_value_)
+        return true;
+      update_value_ = value;
+    } else {
+      prior_average_ = average_;
+      prior_update_time_ = update_time_;
+      update_value_ = value;
+      update_time_ = timestamp;
+    }
+
+    const double elapsed_us = static_cast<double>(
+        (update_time_ - prior_update_time_).InMicroseconds());
+    const double weight =
+        elapsed_us / (elapsed_us + half_life_.InMicroseconds());
+    average_ = weight * update_value_ + (1.0 - weight) * prior_average_;
+    DCHECK(std::isfinite(average_));
+
+    return true;
+  }
 
   TimeType update_time() const { return update_time_; }
 
diff --git a/media/capture/content/feedback_signal_accumulator_unittest.cc b/media/capture/content/feedback_signal_accumulator_unittest.cc
index c8ee7f7..7195a367 100644
--- a/media/capture/content/feedback_signal_accumulator_unittest.cc
+++ b/media/capture/content/feedback_signal_accumulator_unittest.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 "media/capture/content/feedback_signal_accumulator.cc"
+#include "media/capture/content/feedback_signal_accumulator.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/media/capture/content/video_capture_oracle.h b/media/capture/content/video_capture_oracle.h
index 29c7fcb..36779b94 100644
--- a/media/capture/content/video_capture_oracle.h
+++ b/media/capture/content/video_capture_oracle.h
@@ -10,7 +10,7 @@
 #include "media/base/media_export.h"
 #include "media/capture/content/animated_content_sampler.h"
 #include "media/capture/content/capture_resolution_chooser.h"
-#include "media/capture/content/feedback_signal_accumulator.cc"
+#include "media/capture/content/feedback_signal_accumulator.h"
 #include "media/capture/content/smooth_event_sampler.h"
 #include "ui/gfx/geometry/rect.h"
 
diff --git a/media/cast/net/cast_transport.h b/media/cast/net/cast_transport.h
index 7f37da0..48fc5fe 100644
--- a/media/cast/net/cast_transport.h
+++ b/media/cast/net/cast_transport.h
@@ -50,12 +50,30 @@
 
 // Following the initialization of either audio or video an initialization
 // status will be sent via this callback.
-typedef base::Callback<void(CastTransportStatus status)>
-    CastTransportStatusCallback;
+using CastTransportStatusCallback =
+    base::Callback<void(CastTransportStatus status)>;
 
-typedef base::Callback<void(std::unique_ptr<std::vector<FrameEvent>>,
-                            std::unique_ptr<std::vector<PacketEvent>>)>
-    BulkRawEventsCallback;
+using BulkRawEventsCallback =
+    base::Callback<void(std::unique_ptr<std::vector<FrameEvent>>,
+                        std::unique_ptr<std::vector<PacketEvent>>)>;
+
+// Interface to handle received RTCP messages on RTP sender.
+class RtcpObserver {
+ public:
+  virtual ~RtcpObserver() {}
+
+  // Called on receiving cast message from RTP receiver.
+  virtual void OnReceivedCastMessage(const RtcpCastMessage& cast_message) = 0;
+
+  // Called on receiving Rtt message from RTP receiver.
+  virtual void OnReceivedRtt(base::TimeDelta round_trip_time) = 0;
+
+  // Called on receiving PLI from RTP receiver.
+  virtual void OnReceivedPli() = 0;
+
+  // Called on receiving RTP receiver logs.
+  virtual void OnReceivedReceiverLog(const RtcpReceiverLogMessage& log) {}
+};
 
 // The application should only trigger this class from the transport thread.
 class CastTransport : public base::NonThreadSafe {
@@ -93,13 +111,9 @@
   // Encoded frames cannot be transmitted until the relevant initialize method
   // is called.
   virtual void InitializeAudio(const CastTransportRtpConfig& config,
-                               const RtcpCastMessageCallback& cast_message_cb,
-                               const RtcpRttCallback& rtt_cb,
-                               const RtcpPliCallback& pli_cb) = 0;
+                               std::unique_ptr<RtcpObserver> rtcp_observer) {}
   virtual void InitializeVideo(const CastTransportRtpConfig& config,
-                               const RtcpCastMessageCallback& cast_message_cb,
-                               const RtcpRttCallback& rtt_cb,
-                               const RtcpPliCallback& pli_cb) = 0;
+                               std::unique_ptr<RtcpObserver> rtcp_observer) {}
 
   // Encrypt, packetize and transmit |frame|. |ssrc| must refer to a
   // a channel already established with InitializeAudio / InitializeVideo.
diff --git a/media/cast/net/cast_transport_impl.cc b/media/cast/net/cast_transport_impl.cc
index c1c5fd5..5ace37f 100644
--- a/media/cast/net/cast_transport_impl.cc
+++ b/media/cast/net/cast_transport_impl.cc
@@ -56,6 +56,41 @@
   return PacketReceiverCallback();
 }
 
+class CastTransportImpl::RtcpClient : public RtcpObserver {
+ public:
+  RtcpClient(std::unique_ptr<RtcpObserver> observer,
+             uint32_t rtp_sender_ssrc,
+             EventMediaType media_type,
+             CastTransportImpl* cast_transport_impl)
+      : rtp_sender_ssrc_(rtp_sender_ssrc),
+        rtcp_observer_(std::move(observer)),
+        media_type_(media_type),
+        cast_transport_impl_(cast_transport_impl) {}
+
+  void OnReceivedCastMessage(const RtcpCastMessage& cast_message) override {
+    rtcp_observer_->OnReceivedCastMessage(cast_message);
+    cast_transport_impl_->OnReceivedCastMessage(rtp_sender_ssrc_, cast_message);
+  }
+
+  void OnReceivedRtt(base::TimeDelta round_trip_time) override {
+    rtcp_observer_->OnReceivedRtt(round_trip_time);
+  }
+
+  void OnReceivedReceiverLog(const RtcpReceiverLogMessage& log) override {
+    cast_transport_impl_->OnReceivedLogMessage(media_type_, log);
+  }
+
+  void OnReceivedPli() override { rtcp_observer_->OnReceivedPli(); }
+
+ private:
+  const uint32_t rtp_sender_ssrc_;
+  const std::unique_ptr<RtcpObserver> rtcp_observer_;
+  const EventMediaType media_type_;
+  CastTransportImpl* const cast_transport_impl_;
+
+  DISALLOW_COPY_AND_ASSIGN(RtcpClient);
+};
+
 CastTransportImpl::CastTransportImpl(
     base::TickClock* clock,
     base::TimeDelta logging_flush_interval,
@@ -96,9 +131,7 @@
 
 void CastTransportImpl::InitializeAudio(
     const CastTransportRtpConfig& config,
-    const RtcpCastMessageCallback& cast_message_cb,
-    const RtcpRttCallback& rtt_cb,
-    const RtcpPliCallback& pli_cb) {
+    std::unique_ptr<RtcpObserver> rtcp_observer) {
   LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty())
       << "Unsafe to send audio with encryption DISABLED.";
   if (!audio_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) {
@@ -118,12 +151,11 @@
     return;
   }
 
-  audio_rtcp_session_.reset(new SenderRtcpSession(
-      base::Bind(&CastTransportImpl::OnReceivedCastMessage,
-                 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb),
-      rtt_cb, base::Bind(&CastTransportImpl::OnReceivedLogMessage,
-                         weak_factory_.GetWeakPtr(), AUDIO_EVENT),
-      pli_cb, clock_, &pacer_, config.ssrc, config.feedback_ssrc));
+  audio_rtcp_observer_.reset(
+      new RtcpClient(std::move(rtcp_observer), config.ssrc, AUDIO_EVENT, this));
+  audio_rtcp_session_.reset(
+      new SenderRtcpSession(clock_, &pacer_, audio_rtcp_observer_.get(),
+                            config.ssrc, config.feedback_ssrc));
   pacer_.RegisterAudioSsrc(config.ssrc);
   valid_sender_ssrcs_.insert(config.feedback_ssrc);
   transport_client_->OnStatusChanged(TRANSPORT_AUDIO_INITIALIZED);
@@ -131,9 +163,7 @@
 
 void CastTransportImpl::InitializeVideo(
     const CastTransportRtpConfig& config,
-    const RtcpCastMessageCallback& cast_message_cb,
-    const RtcpRttCallback& rtt_cb,
-    const RtcpPliCallback& pli_cb) {
+    std::unique_ptr<RtcpObserver> rtcp_observer) {
   LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty())
       << "Unsafe to send video with encryption DISABLED.";
   if (!video_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) {
@@ -148,12 +178,11 @@
     return;
   }
 
-  video_rtcp_session_.reset(new SenderRtcpSession(
-      base::Bind(&CastTransportImpl::OnReceivedCastMessage,
-                 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb),
-      rtt_cb, base::Bind(&CastTransportImpl::OnReceivedLogMessage,
-                         weak_factory_.GetWeakPtr(), VIDEO_EVENT),
-      pli_cb, clock_, &pacer_, config.ssrc, config.feedback_ssrc));
+  video_rtcp_observer_.reset(
+      new RtcpClient(std::move(rtcp_observer), config.ssrc, VIDEO_EVENT, this));
+  video_rtcp_session_.reset(
+      new SenderRtcpSession(clock_, &pacer_, video_rtcp_observer_.get(),
+                            config.ssrc, config.feedback_ssrc));
   pacer_.RegisterVideoSsrc(config.ssrc);
   valid_sender_ssrcs_.insert(config.feedback_ssrc);
   transport_client_->OnStatusChanged(TRANSPORT_VIDEO_INITIALIZED);
@@ -349,10 +378,7 @@
 
 void CastTransportImpl::OnReceivedCastMessage(
     uint32_t ssrc,
-    const RtcpCastMessageCallback& cast_message_cb,
     const RtcpCastMessage& cast_message) {
-  if (!cast_message_cb.is_null())
-    cast_message_cb.Run(cast_message);
 
   DedupInfo dedup_info;
   if (audio_sender_ && audio_sender_->ssrc() == ssrc) {
diff --git a/media/cast/net/cast_transport_impl.h b/media/cast/net/cast_transport_impl.h
index 7f6c085..5dff2b5 100644
--- a/media/cast/net/cast_transport_impl.h
+++ b/media/cast/net/cast_transport_impl.h
@@ -66,13 +66,9 @@
 
   // CastTransport implementation for sending.
   void InitializeAudio(const CastTransportRtpConfig& config,
-                       const RtcpCastMessageCallback& cast_message_cb,
-                       const RtcpRttCallback& rtt_cb,
-                       const RtcpPliCallback& pli_cb) final;
+                       std::unique_ptr<RtcpObserver> rtcp_observer) final;
   void InitializeVideo(const CastTransportRtpConfig& config,
-                       const RtcpCastMessageCallback& cast_message_cb,
-                       const RtcpRttCallback& rtt_cb,
-                       const RtcpPliCallback& pli_cb) final;
+                       std::unique_ptr<RtcpObserver> rtcp_observer) final;
   void InsertFrame(uint32_t ssrc, const EncodedFrame& frame) final;
 
   void SendSenderReport(uint32_t ssrc,
@@ -117,6 +113,9 @@
   void SendRtcpFromRtpReceiver() final;
 
  private:
+  // Handle received RTCP messages on RTP sender.
+  class RtcpClient;
+
   FRIEND_TEST_ALL_PREFIXES(CastTransportImplTest, NacksCancelRetransmits);
   FRIEND_TEST_ALL_PREFIXES(CastTransportImplTest, CancelRetransmits);
   FRIEND_TEST_ALL_PREFIXES(CastTransportImplTest, Kickstart);
@@ -144,7 +143,6 @@
 
   // Called when a RTCP Cast message is received.
   void OnReceivedCastMessage(uint32_t ssrc,
-                             const RtcpCastMessageCallback& cast_message_cb,
                              const RtcpCastMessage& cast_message);
 
   base::TickClock* const clock_;  // Not owned by this class.
@@ -170,6 +168,10 @@
   std::unique_ptr<SenderRtcpSession> audio_rtcp_session_;
   std::unique_ptr<SenderRtcpSession> video_rtcp_session_;
 
+  // RTCP observer for SenderRtcpSession.
+  std::unique_ptr<RtcpObserver> audio_rtcp_observer_;
+  std::unique_ptr<RtcpObserver> video_rtcp_observer_;
+
   // Encrypts data in EncodedFrames before they are sent.  Note that it's
   // important for the encryption to happen here, in code that would execute in
   // the main browser process, for security reasons.  This helps to mitigate
diff --git a/media/cast/net/cast_transport_impl_unittest.cc b/media/cast/net/cast_transport_impl_unittest.cc
index f907823..fdc2657 100644
--- a/media/cast/net/cast_transport_impl_unittest.cc
+++ b/media/cast/net/cast_transport_impl_unittest.cc
@@ -30,6 +30,17 @@
 const uint32_t kVideoSsrc = 1;
 const uint32_t kAudioSsrc = 2;
 
+class StubRtcpObserver : public RtcpObserver {
+ public:
+  StubRtcpObserver() {}
+
+  void OnReceivedCastMessage(const RtcpCastMessage& cast_message) final {}
+  void OnReceivedRtt(base::TimeDelta round_trip_time) final {}
+  void OnReceivedPli() final {}
+
+  DISALLOW_COPY_AND_ASSIGN(StubRtcpObserver);
+};
+
 }  // namespace
 
 class FakePacketSender : public PacketTransport {
@@ -96,8 +107,8 @@
     rtp_config.ssrc = kVideoSsrc;
     rtp_config.feedback_ssrc = 2;
     rtp_config.rtp_payload_type = 3;
-    transport_sender_->InitializeVideo(rtp_config, RtcpCastMessageCallback(),
-                                       RtcpRttCallback(), RtcpPliCallback());
+    transport_sender_->InitializeVideo(
+        rtp_config, base::WrapUnique(new StubRtcpObserver()));
   }
 
   void InitializeAudio() {
@@ -105,8 +116,8 @@
     rtp_config.ssrc = kAudioSsrc;
     rtp_config.feedback_ssrc = 3;
     rtp_config.rtp_payload_type = 4;
-    transport_sender_->InitializeAudio(rtp_config, RtcpCastMessageCallback(),
-                                       RtcpRttCallback(), RtcpPliCallback());
+    transport_sender_->InitializeAudio(
+        rtp_config, base::WrapUnique(new StubRtcpObserver()));
   }
 
   base::SimpleTestTickClock testing_clock_;
@@ -131,7 +142,7 @@
     CHECK(cast_transport_sender_impl_test_);
     cast_transport_sender_impl_test_->ReceivedLoggingEvents();
   };
-  void ProcessRtpPacket(std::unique_ptr<Packet> packet) final{};
+  void ProcessRtpPacket(std::unique_ptr<Packet> packet) final {}
 
  private:
   CastTransportImplTest* const cast_transport_sender_impl_test_;
@@ -224,8 +235,7 @@
   cast_message.remote_ssrc = kVideoSsrc;
   cast_message.ack_frame_id = FrameId::first() + 1;
   cast_message.missing_frames_and_packets[fake_frame.frame_id].insert(3);
-  transport_sender_->OnReceivedCastMessage(
-      kVideoSsrc, RtcpCastMessageCallback(), cast_message);
+  transport_sender_->OnReceivedCastMessage(kVideoSsrc, cast_message);
   transport_->SetPaused(false);
   task_runner_->Sleep(base::TimeDelta::FromMilliseconds(10));
   EXPECT_EQ(3, num_times_logging_callback_called_);
@@ -346,8 +356,7 @@
   RtcpCastMessage cast_message;
   cast_message.remote_ssrc = kAudioSsrc;
   cast_message.ack_frame_id = FrameId::first() + 1;
-  transport_sender_->OnReceivedCastMessage(
-      kAudioSsrc, RtcpCastMessageCallback(), cast_message);
+  transport_sender_->OnReceivedCastMessage(kAudioSsrc, cast_message);
   task_runner_->RunTasks();
   EXPECT_EQ(2, transport_->packets_sent());
   EXPECT_EQ(0, num_times_logging_callback_called_);  // Only 4 ms since last.
@@ -368,8 +377,7 @@
   cast_message.ack_frame_id = FrameId::first();
   cast_message.missing_frames_and_packets[fake_video.frame_id].insert(3);
   task_runner_->Sleep(base::TimeDelta::FromMilliseconds(10));
-  transport_sender_->OnReceivedCastMessage(
-      kVideoSsrc, RtcpCastMessageCallback(), cast_message);
+  transport_sender_->OnReceivedCastMessage(kVideoSsrc, cast_message);
   task_runner_->RunTasks();
   EXPECT_EQ(6, transport_->packets_sent());
   EXPECT_EQ(1, num_times_logging_callback_called_);
@@ -379,8 +387,7 @@
   cast_message.ack_frame_id = FrameId::first() + 2;
   cast_message.missing_frames_and_packets.clear();
   task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2));
-  transport_sender_->OnReceivedCastMessage(
-      kAudioSsrc, RtcpCastMessageCallback(), cast_message);
+  transport_sender_->OnReceivedCastMessage(kAudioSsrc, cast_message);
   task_runner_->RunTasks();
   EXPECT_EQ(6, transport_->packets_sent());
   EXPECT_EQ(1, num_times_logging_callback_called_);  // Only 6 ms since last.
@@ -390,8 +397,7 @@
   cast_message.ack_frame_id = FrameId::first() + 1;
   cast_message.missing_frames_and_packets[fake_video.frame_id].insert(3);
   task_runner_->Sleep(base::TimeDelta::FromMilliseconds(2));
-  transport_sender_->OnReceivedCastMessage(
-      kVideoSsrc, RtcpCastMessageCallback(), cast_message);
+  transport_sender_->OnReceivedCastMessage(kVideoSsrc, cast_message);
   task_runner_->RunTasks();
   EXPECT_EQ(7, transport_->packets_sent());
   EXPECT_EQ(1, num_times_logging_callback_called_);  // Only 8 ms since last.
diff --git a/media/cast/net/mock_cast_transport.h b/media/cast/net/mock_cast_transport.h
index d888921..df6e9c5d 100644
--- a/media/cast/net/mock_cast_transport.h
+++ b/media/cast/net/mock_cast_transport.h
@@ -18,16 +18,6 @@
   MockCastTransport();
   virtual ~MockCastTransport();
 
-  MOCK_METHOD4(InitializeAudio,
-               void(const CastTransportRtpConfig& config,
-                    const RtcpCastMessageCallback& cast_message_cb,
-                    const RtcpRttCallback& rtt_cb,
-                    const RtcpPliCallback& pli_cb));
-  MOCK_METHOD4(InitializeVideo,
-               void(const CastTransportRtpConfig& config,
-                    const RtcpCastMessageCallback& cast_message_cb,
-                    const RtcpRttCallback& rtt_cb,
-                    const RtcpPliCallback& pli_cb));
   MOCK_METHOD2(InsertFrame, void(uint32_t ssrc, const EncodedFrame& frame));
   MOCK_METHOD3(SendSenderReport,
                void(uint32_t ssrc,
diff --git a/media/cast/net/rtcp/rtcp_defines.h b/media/cast/net/rtcp/rtcp_defines.h
index a78a1d7d..51f3925 100644
--- a/media/cast/net/rtcp/rtcp_defines.h
+++ b/media/cast/net/rtcp/rtcp_defines.h
@@ -126,12 +126,6 @@
   uint16_t packet_id;
 };
 
-typedef base::Callback<void(const RtcpCastMessage&)> RtcpCastMessageCallback;
-typedef base::Callback<void(base::TimeDelta)> RtcpRttCallback;
-typedef
-base::Callback<void(const RtcpReceiverLogMessage&)> RtcpLogMessageCallback;
-typedef base::Callback<void()> RtcpPliCallback;
-
 // TODO(hubbe): Document members of this struct.
 struct RtpReceiverStatistics {
   RtpReceiverStatistics();
diff --git a/media/cast/net/rtcp/rtcp_unittest.cc b/media/cast/net/rtcp/rtcp_unittest.cc
index a0f0c2e..779c789 100644
--- a/media/cast/net/rtcp/rtcp_unittest.cc
+++ b/media/cast/net/rtcp/rtcp_unittest.cc
@@ -31,8 +31,6 @@
   return ret;
 }
 
-}  // namespace
-
 using testing::_;
 
 static const uint32_t kSenderSsrc = 0x10203;
@@ -75,24 +73,20 @@
   DISALLOW_COPY_AND_ASSIGN(FakeRtcpTransport);
 };
 
-class RtcpTest : public ::testing::Test {
+}  // namespace
+
+class RtcpTest : public ::testing::Test, public RtcpObserver {
  protected:
   RtcpTest()
       : sender_clock_(new base::SimpleTestTickClock()),
         receiver_clock_(new test::SkewedTickClock(sender_clock_.get())),
         rtp_sender_pacer_(sender_clock_.get()),
         rtp_receiver_pacer_(sender_clock_.get()),
-        rtcp_at_rtp_sender_(
-            base::Bind(&RtcpTest::OnReceivedCastFeedback,
-                       base::Unretained(this)),
-            base::Bind(&RtcpTest::OnMeasuredRoundTripTime,
-                       base::Unretained(this)),
-            base::Bind(&RtcpTest::OnReceivedLogs, base::Unretained(this)),
-            base::Bind(&RtcpTest::OnReceivedPli, base::Unretained(this)),
-            sender_clock_.get(),
-            &rtp_sender_pacer_,
-            kSenderSsrc,
-            kReceiverSsrc),
+        rtcp_at_rtp_sender_(sender_clock_.get(),
+                            &rtp_sender_pacer_,
+                            this,
+                            kSenderSsrc,
+                            kReceiverSsrc),
         rtcp_at_rtp_receiver_(receiver_clock_.get(),
                               kReceiverSsrc,
                               kSenderSsrc),
@@ -108,19 +102,18 @@
 
   ~RtcpTest() override {}
 
-  void OnReceivedCastFeedback(const RtcpCastMessage& cast_message) {
+  // RtcpObserver implementation.
+  void OnReceivedCastMessage(const RtcpCastMessage& cast_message) override {
     last_cast_message_ = cast_message;
   }
-
-  void OnMeasuredRoundTripTime(base::TimeDelta rtt) {
-    current_round_trip_time_ = rtt;
+  void OnReceivedRtt(base::TimeDelta round_trip_time) override {
+    current_round_trip_time_ = round_trip_time;
   }
-
-  void OnReceivedLogs(const RtcpReceiverLogMessage& receiver_logs) {
+  void OnReceivedReceiverLog(const RtcpReceiverLogMessage& logs) override {
     RtcpReceiverLogMessage().swap(last_logs_);
 
     // Make a copy of the logs.
-    for (const RtcpReceiverFrameLogMessage& frame_log_msg : receiver_logs) {
+    for (const RtcpReceiverFrameLogMessage& frame_log_msg : logs) {
       last_logs_.push_back(
           RtcpReceiverFrameLogMessage(frame_log_msg.rtp_timestamp_));
       for (const RtcpReceiverEventLogMessage& event_log_msg :
@@ -135,6 +128,8 @@
     }
   }
 
+  void OnReceivedPli() override { received_pli_ = true; }
+
   PacketRef BuildRtcpPacketFromRtpReceiver(
       const RtcpTimeData& time_data,
       const RtcpCastMessage* cast_message,
@@ -182,8 +177,6 @@
     return builder.Finish();
   }
 
-  void OnReceivedPli() { received_pli_ = true; }
-
   std::unique_ptr<base::SimpleTestTickClock> sender_clock_;
   std::unique_ptr<test::SkewedTickClock> receiver_clock_;
   FakeRtcpTransport rtp_sender_pacer_;
diff --git a/media/cast/net/rtcp/sender_rtcp_session.cc b/media/cast/net/rtcp/sender_rtcp_session.cc
index 7a8df42..15c568c 100644
--- a/media/cast/net/rtcp/sender_rtcp_session.cc
+++ b/media/cast/net/rtcp/sender_rtcp_session.cc
@@ -68,23 +68,16 @@
 
 }  // namespace
 
-SenderRtcpSession::SenderRtcpSession(
-    const RtcpCastMessageCallback& cast_callback,
-    const RtcpRttCallback& rtt_callback,
-    const RtcpLogMessageCallback& log_callback,
-    const RtcpPliCallback pli_callback,
-    base::TickClock* clock,
-    PacedPacketSender* packet_sender,
-    uint32_t local_ssrc,
-    uint32_t remote_ssrc)
+SenderRtcpSession::SenderRtcpSession(base::TickClock* clock,
+                                     PacedPacketSender* packet_sender,
+                                     RtcpObserver* observer,
+                                     uint32_t local_ssrc,
+                                     uint32_t remote_ssrc)
     : clock_(clock),
       packet_sender_(packet_sender),
       local_ssrc_(local_ssrc),
       remote_ssrc_(remote_ssrc),
-      cast_callback_(cast_callback),
-      rtt_callback_(rtt_callback),
-      log_callback_(log_callback),
-      pli_callback_(pli_callback),
+      rtcp_observer_(observer),
       largest_seen_timestamp_(base::TimeTicks::FromInternalValue(
           std::numeric_limits<int64_t>::min())),
       parser_(local_ssrc, remote_ssrc) {}
@@ -115,10 +108,8 @@
   // Parse this packet.
   base::BigEndianReader reader(reinterpret_cast<const char*>(data), length);
   if (parser_.Parse(&reader)) {
-    if (parser_.has_picture_loss_indicator()) {
-      if (!pli_callback_.is_null())
-        pli_callback_.Run();
-    }
+    if (parser_.has_picture_loss_indicator())
+      rtcp_observer_->OnReceivedPli();
     if (parser_.has_receiver_reference_time_report()) {
       base::TimeTicks t = ConvertNtpToTimeTicks(
           parser_.receiver_reference_time_report().ntp_seconds,
@@ -135,7 +126,7 @@
     }
     if (parser_.has_receiver_log()) {
       if (DedupeReceiverLog(parser_.mutable_receiver_log())) {
-        OnReceivedReceiverLog(parser_.receiver_log());
+        rtcp_observer_->OnReceivedReceiverLog(parser_.receiver_log());
       }
     }
     if (parser_.has_last_report()) {
@@ -143,7 +134,7 @@
                                      parser_.delay_since_last_report());
     }
     if (parser_.has_cast_message()) {
-      OnReceivedCastFeedback(parser_.cast_message());
+      rtcp_observer_->OnReceivedCastMessage(parser_.cast_message());
     }
   }
   return true;
@@ -169,8 +160,7 @@
   current_round_trip_time_ =
       std::max(current_round_trip_time_, base::TimeDelta::FromMilliseconds(1));
 
-  if (!rtt_callback_.is_null())
-    rtt_callback_.Run(current_round_trip_time_);
+  rtcp_observer_->OnReceivedRtt(current_round_trip_time_);
 }
 
 void SenderRtcpSession::SaveLastSentNtpTime(const base::TimeTicks& now,
@@ -255,19 +245,5 @@
                                  rtcp_builder.BuildRtcpFromSender(sender_info));
 }
 
-void SenderRtcpSession::OnReceivedCastFeedback(
-    const RtcpCastMessage& cast_message) {
-  if (cast_callback_.is_null())
-    return;
-  cast_callback_.Run(cast_message);
-}
-
-void SenderRtcpSession::OnReceivedReceiverLog(
-    const RtcpReceiverLogMessage& receiver_log) {
-  if (log_callback_.is_null())
-    return;
-  log_callback_.Run(receiver_log);
-}
-
 }  // namespace cast
 }  // namespace media
diff --git a/media/cast/net/rtcp/sender_rtcp_session.h b/media/cast/net/rtcp/sender_rtcp_session.h
index 1f38124..a9a05117 100644
--- a/media/cast/net/rtcp/sender_rtcp_session.h
+++ b/media/cast/net/rtcp/sender_rtcp_session.h
@@ -11,6 +11,7 @@
 
 #include "base/containers/hash_tables.h"
 #include "base/time/time.h"
+#include "media/cast/net/cast_transport.h"
 #include "media/cast/net/pacing/paced_sender.h"
 #include "media/cast/net/rtcp/rtcp_defines.h"
 #include "media/cast/net/rtcp/rtcp_session.h"
@@ -19,33 +20,30 @@
 namespace media {
 namespace cast {
 
-typedef std::pair<uint32_t, base::TimeTicks> RtcpSendTimePair;
-typedef std::map<uint32_t, base::TimeTicks> RtcpSendTimeMap;
-typedef std::queue<RtcpSendTimePair> RtcpSendTimeQueue;
+using RtcpSendTimePair = std::pair<uint32_t, base::TimeTicks>;
+using RtcpSendTimeMap = std::map<uint32_t, base::TimeTicks>;
+using RtcpSendTimeQueue = std::queue<RtcpSendTimePair>;
 
 // This class represents a RTCP session on a RTP sender. It provides an
 // interface to send RTCP sender report (SR). RTCP SR packets allow
 // receiver to maintain clock offsets and synchronize between audio and video.
 //
 // RTCP session on sender handles the following incoming RTCP reports
-// from receiver:
+// from receiver and passes the information to a RtcpObserver:
 // - Receiver reference time report: Helps with tracking largest timestamp
 //   seen and as a result rejecting old RTCP reports.
-// - Receiver logs: The sender receives log events from the receiver and
-//   invokes a callback passed.
-// - cast message: Receives feedback from receiver on missing packets/frames
-//   and last frame id received and invokes a callback passed.
+// - Receiver logs: The sender receives log events from the receiver.
+// - cast message: Receives feedback from receiver on missing packets/frames,
+//   later frames received, and last frame id.
 // - Last report: The receiver provides feedback on delay since last report
-//   received which helps it compute round trip time and invoke a callback.
+//   received which helps it compute round trip time.
+// - PLI: Receiver sends PLI when decoding error exists on ultra-low latency
+//   applications.
 class SenderRtcpSession : public RtcpSession {
  public:
-  // TODO(xjz): Simplify the interface. http://crbug.com/588275.
-  SenderRtcpSession(const RtcpCastMessageCallback& cast_callback,
-                    const RtcpRttCallback& rtt_callback,
-                    const RtcpLogMessageCallback& log_callback,
-                    const RtcpPliCallback pli_callback,
-                    base::TickClock* clock,            // Not owned.
+  SenderRtcpSession(base::TickClock* clock,            // Not owned.
                     PacedPacketSender* packet_sender,  // Not owned.
+                    RtcpObserver* observer,            // Not owned.
                     uint32_t local_ssrc,
                     uint32_t remote_ssrc);
 
@@ -104,11 +102,7 @@
   PacedPacketSender* packet_sender_;  // Not owned.
   const uint32_t local_ssrc_;
   const uint32_t remote_ssrc_;
-
-  const RtcpCastMessageCallback cast_callback_;
-  const RtcpRttCallback rtt_callback_;
-  const RtcpLogMessageCallback log_callback_;
-  const RtcpPliCallback pli_callback_;
+  RtcpObserver* const rtcp_observer_;  // Owned by |CastTransportImpl|.
 
   // Computed from RTCP RRTR report.
   base::TimeTicks largest_seen_timestamp_;
diff --git a/media/cast/sender/audio_sender.cc b/media/cast/sender/audio_sender.cc
index f81e941..12580f8c 100644
--- a/media/cast/sender/audio_sender.cc
+++ b/media/cast/sender/audio_sender.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "media/cast/common/rtp_time.h"
 #include "media/cast/net/cast_transport_config.h"
@@ -68,11 +69,8 @@
   transport_config.aes_iv_mask = audio_config.aes_iv_mask;
 
   transport_sender->InitializeAudio(
-      transport_config, base::Bind(&AudioSender::OnReceivedCastFeedback,
-                                   weak_factory_.GetWeakPtr()),
-      base::Bind(&AudioSender::OnMeasuredRoundTripTime,
-                 weak_factory_.GetWeakPtr()),
-      base::Bind(&AudioSender::OnReceivedPli, weak_factory_.GetWeakPtr()));
+      transport_config, base::WrapUnique(new FrameSender::RtcpClient(
+                            weak_factory_.GetWeakPtr())));
 }
 
 AudioSender::~AudioSender() {}
diff --git a/media/cast/sender/frame_sender.cc b/media/cast/sender/frame_sender.cc
index bf3d6d7..5818e87 100644
--- a/media/cast/sender/frame_sender.cc
+++ b/media/cast/sender/frame_sender.cc
@@ -31,6 +31,27 @@
 // Convenience macro used in logging statements throughout this file.
 #define SENDER_SSRC (is_audio_ ? "AUDIO[" : "VIDEO[") << ssrc_ << "] "
 
+FrameSender::RtcpClient::RtcpClient(base::WeakPtr<FrameSender> frame_sender)
+    : frame_sender_(frame_sender) {}
+
+FrameSender::RtcpClient::~RtcpClient() {}
+
+void FrameSender::RtcpClient::OnReceivedCastMessage(
+    const RtcpCastMessage& cast_message) {
+  if (frame_sender_)
+    frame_sender_->OnReceivedCastFeedback(cast_message);
+}
+
+void FrameSender::RtcpClient::OnReceivedRtt(base::TimeDelta round_trip_time) {
+  if (frame_sender_)
+    frame_sender_->OnMeasuredRoundTripTime(round_trip_time);
+}
+
+void FrameSender::RtcpClient::OnReceivedPli() {
+  if (frame_sender_)
+    frame_sender_->OnReceivedPli();
+}
+
 FrameSender::FrameSender(scoped_refptr<CastEnvironment> cast_environment,
                          bool is_audio,
                          CastTransport* const transport_sender,
diff --git a/media/cast/sender/frame_sender.h b/media/cast/sender/frame_sender.h
index 226d3ef9..6f73df3 100644
--- a/media/cast/sender/frame_sender.h
+++ b/media/cast/sender/frame_sender.h
@@ -62,10 +62,28 @@
   virtual base::TimeDelta GetInFlightMediaDuration() const = 0;
 
  protected:
+  class RtcpClient : public RtcpObserver {
+   public:
+    explicit RtcpClient(base::WeakPtr<FrameSender> frame_sender);
+    ~RtcpClient() override;
+
+    void OnReceivedCastMessage(const RtcpCastMessage& cast_message) override;
+    void OnReceivedRtt(base::TimeDelta round_trip_time) override;
+    void OnReceivedPli() override;
+
+   private:
+    const base::WeakPtr<FrameSender> frame_sender_;
+  };
   // Schedule and execute periodic sending of RTCP report.
   void ScheduleNextRtcpReport();
   void SendRtcpReport(bool schedule_future_reports);
 
+  // Protected for testability.
+  void OnReceivedCastFeedback(const RtcpCastMessage& cast_feedback);
+
+  // Called when a Pli message is received.
+  void OnReceivedPli();
+
   void OnMeasuredRoundTripTime(base::TimeDelta rtt);
 
   const scoped_refptr<CastEnvironment> cast_environment_;
@@ -89,12 +107,6 @@
   void ResendCheck();
   void ResendForKickstart();
 
-  // Protected for testability.
-  void OnReceivedCastFeedback(const RtcpCastMessage& cast_feedback);
-
-  // Called when a Pli message is received.
-  void OnReceivedPli();
-
   // Returns true if too many frames would be in-flight by encoding and sending
   // the next frame having the given |frame_duration|.
   bool ShouldDropNextFrame(base::TimeDelta frame_duration) const;
diff --git a/media/cast/sender/video_sender.cc b/media/cast/sender/video_sender.cc
index b926cb0..a229f2d6 100644
--- a/media/cast/sender/video_sender.cc
+++ b/media/cast/sender/video_sender.cc
@@ -12,6 +12,7 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/trace_event/trace_event.h"
 #include "media/cast/net/cast_transport_config.h"
 #include "media/cast/sender/performance_metrics_overlay.h"
@@ -139,11 +140,8 @@
   transport_config.aes_iv_mask = video_config.aes_iv_mask;
 
   transport_sender->InitializeVideo(
-      transport_config, base::Bind(&VideoSender::OnReceivedCastFeedback,
-                                   weak_factory_.GetWeakPtr()),
-      base::Bind(&VideoSender::OnMeasuredRoundTripTime,
-                 weak_factory_.GetWeakPtr()),
-      base::Bind(&VideoSender::OnReceivedPli, weak_factory_.GetWeakPtr()));
+      transport_config, base::WrapUnique(new FrameSender::RtcpClient(
+                            weak_factory_.GetWeakPtr())));
 }
 
 VideoSender::~VideoSender() {
diff --git a/media/cast/sender/video_sender_unittest.cc b/media/cast/sender/video_sender_unittest.cc
index d8c6079..480edd1 100644
--- a/media/cast/sender/video_sender_unittest.cc
+++ b/media/cast/sender/video_sender_unittest.cc
@@ -186,8 +186,7 @@
     if (external) {
       vea_factory_.SetInitializationWillSucceed(expect_init_success);
       video_sender_.reset(new PeerVideoSender(
-          cast_environment_,
-          video_config,
+          cast_environment_, video_config,
           base::Bind(&SaveOperationalStatus, &operational_status_),
           base::Bind(
               &FakeVideoEncodeAcceleratorFactory::CreateVideoEncodeAccelerator,
@@ -197,12 +196,10 @@
           transport_sender_.get()));
     } else {
       video_sender_.reset(new PeerVideoSender(
-          cast_environment_,
-          video_config,
+          cast_environment_, video_config,
           base::Bind(&SaveOperationalStatus, &operational_status_),
           CreateDefaultVideoEncodeAcceleratorCallback(),
-          CreateDefaultVideoEncodeMemoryCallback(),
-          transport_sender_.get()));
+          CreateDefaultVideoEncodeMemoryCallback(), transport_sender_.get()));
     }
     task_runner_->RunTasks();
   }
diff --git a/media/cast/sender/vp8_encoder.h b/media/cast/sender/vp8_encoder.h
index 3d7a0d1..d468008 100644
--- a/media/cast/sender/vp8_encoder.h
+++ b/media/cast/sender/vp8_encoder.h
@@ -11,7 +11,7 @@
 
 #include "base/macros.h"
 #include "base/threading/thread_checker.h"
-#include "media/capture/content/feedback_signal_accumulator.cc"
+#include "media/capture/content/feedback_signal_accumulator.h"
 #include "media/cast/cast_config.h"
 #include "media/cast/sender/software_video_encoder.h"
 #include "third_party/libvpx/source/libvpx/vpx/vpx_encoder.h"
diff --git a/media/cast/test/cast_benchmarks.cc b/media/cast/test/cast_benchmarks.cc
index f92cc10..c24785d 100644
--- a/media/cast/test/cast_benchmarks.cc
+++ b/media/cast/test/cast_benchmarks.cc
@@ -97,19 +97,15 @@
   }
 
   void InitializeAudio(const CastTransportRtpConfig& config,
-                       const RtcpCastMessageCallback& cast_message_cb,
-                       const RtcpRttCallback& rtt_cb,
-                       const RtcpPliCallback& key_frame_cb) final {
+                       std::unique_ptr<RtcpObserver> rtcp_observer) final {
     audio_ssrc_ = config.ssrc;
-    transport_->InitializeAudio(config, cast_message_cb, rtt_cb, key_frame_cb);
+    transport_->InitializeAudio(config, std::move(rtcp_observer));
   }
 
   void InitializeVideo(const CastTransportRtpConfig& config,
-                       const RtcpCastMessageCallback& cast_message_cb,
-                       const RtcpRttCallback& rtt_cb,
-                       const RtcpPliCallback& key_frame_cb) final {
+                       std::unique_ptr<RtcpObserver> rtcp_observer) final {
     video_ssrc_ = config.ssrc;
-    transport_->InitializeVideo(config, cast_message_cb, rtt_cb, key_frame_cb);
+    transport_->InitializeVideo(config, std::move(rtcp_observer));
   }
 
   void InsertFrame(uint32_t ssrc, const EncodedFrame& frame) final {
diff --git a/media/filters/frame_processor.cc b/media/filters/frame_processor.cc
index bf8546e..8360722 100644
--- a/media/filters/frame_processor.cc
+++ b/media/filters/frame_processor.cc
@@ -354,7 +354,7 @@
     base::TimeDelta append_window_start,
     base::TimeDelta append_window_end,
     const scoped_refptr<StreamParserBuffer>& buffer) {
-  DCHECK(buffer->duration() > base::TimeDelta());
+  DCHECK(buffer->duration() >= base::TimeDelta());
   DCHECK_EQ(DemuxerStream::AUDIO, buffer->type());
   DCHECK(buffer->is_key_frame());
 
diff --git a/media/filters/frame_processor_unittest.cc b/media/filters/frame_processor_unittest.cc
index 03c7cf07..d226e91d 100644
--- a/media/filters/frame_processor_unittest.cc
+++ b/media/filters/frame_processor_unittest.cc
@@ -67,9 +67,9 @@
                 base::Unretained(&callbacks_)),
             new MediaLog())),
         append_window_end_(kInfiniteDuration()),
+        frame_duration_(base::TimeDelta::FromMilliseconds(10)),
         audio_id_(FrameProcessor::kAudioTrackId),
-        video_id_(FrameProcessor::kVideoTrackId),
-        frame_duration_(base::TimeDelta::FromMilliseconds(10)) {}
+        video_id_(FrameProcessor::kVideoTrackId) {}
 
   enum StreamFlags {
     HAS_AUDIO = 1 << 0,
@@ -258,11 +258,11 @@
   base::TimeDelta append_window_start_;
   base::TimeDelta append_window_end_;
   base::TimeDelta timestamp_offset_;
+  base::TimeDelta frame_duration_;
   std::unique_ptr<ChunkDemuxerStream> audio_;
   std::unique_ptr<ChunkDemuxerStream> video_;
   const TrackId audio_id_;
   const TrackId video_id_;
-  const base::TimeDelta frame_duration_;  // Currently the same for all streams.
   const BufferQueue empty_queue_;
   const TextBufferQueueMap empty_text_buffers_;
 
@@ -741,6 +741,60 @@
   CheckReadsThenReadStalls(audio_.get(), "0 10:100");
 }
 
+TEST_P(FrameProcessorTest, PartialAppendWindowZeroDurationPreroll) {
+  InSequence s;
+  AddTestTracks(HAS_AUDIO);
+  bool is_sequence_mode = GetParam();
+  frame_processor_->SetSequenceMode(is_sequence_mode);
+
+  append_window_start_ = base::TimeDelta::FromMilliseconds(5);
+
+  // Append a 0 duration frame that falls just before the append window.
+  frame_duration_ = base::TimeDelta::FromMilliseconds(0);
+  EXPECT_FALSE(in_coded_frame_group());
+  EXPECT_CALL(callbacks_, PossibleDurationIncrease(frame_duration_));
+  ProcessFrames("4K", "");
+  // Verify buffer is not part of ranges. It should be silently saved for
+  // preroll for future append.
+  CheckExpectedRangesByTimestamp(audio_.get(), "{ }");
+  CheckReadsThenReadStalls(audio_.get(), "");
+  EXPECT_FALSE(in_coded_frame_group());
+
+  // Abort the reads from last stall. We don't want those reads to "complete"
+  // when we append below. We will initiate new reads to confirm the buffer
+  // looks as we expect.
+  audio_->AbortReads();
+  audio_->Seek(base::TimeDelta());
+  audio_->StartReturningData();
+
+  // Append a frame with 10ms duration, with 9ms falling after the window start.
+  base::TimeDelta expected_duration =
+      base::TimeDelta::FromMilliseconds(is_sequence_mode ? 10 : 14);
+  EXPECT_CALL(callbacks_, PossibleDurationIncrease(expected_duration));
+  frame_duration_ = base::TimeDelta::FromMilliseconds(10);
+  ProcessFrames("4K", "");
+  EXPECT_TRUE(in_coded_frame_group());
+
+  // Verify range updated to reflect last append was processed and trimmed, and
+  // also that zero duration buffer was saved and attached as preroll.
+  if (is_sequence_mode) {
+    // For sequence mode, append window trimming is applied after the append
+    // is adjusted for timestampOffset. Basically, everything gets rebased to 0
+    // and trimming then removes 5 seconds from the front.
+    CheckExpectedRangesByTimestamp(audio_.get(), "{ [5,10) }");
+    CheckReadsThenReadStalls(audio_.get(), "5:4P 5:4");
+  } else {  // segments mode
+    CheckExpectedRangesByTimestamp(audio_.get(), "{ [5,14) }");
+    CheckReadsThenReadStalls(audio_.get(), "5:4P 5:4");
+  }
+
+  // Verify the preroll buffer still has zero duration.
+  StreamParserBuffer* last_read_parser_buffer =
+      static_cast<StreamParserBuffer*>(last_read_buffer_.get());
+  ASSERT_EQ(base::TimeDelta::FromMilliseconds(0),
+            last_read_parser_buffer->preroll_buffer()->duration());
+}
+
 INSTANTIATE_TEST_CASE_P(SequenceMode, FrameProcessorTest, Values(true));
 INSTANTIATE_TEST_CASE_P(SegmentsMode, FrameProcessorTest, Values(false));
 
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn
index e52aa3e4..59a88c9 100644
--- a/media/gpu/BUILD.gn
+++ b/media/gpu/BUILD.gn
@@ -298,12 +298,14 @@
         "//third_party/libyuv",
       ]
       if (use_x11) {
+        configs += [ "//build/config/linux:x11" ]
         sources += [
           "vaapi_tfp_picture.cc",
           "vaapi_tfp_picture.h",
         ]
       }
       if (use_ozone) {
+        deps += [ "//ui/ozone" ]
         sources += [
           "vaapi_drm_picture.cc",
           "vaapi_drm_picture.h",
@@ -386,6 +388,7 @@
         "//media/base/android",
         "//media/base/android:media_java",
         "//media/capture/video/android:capture_java",
+        "//mojo/public/c/system:for_shared_library",
         "//testing/gmock",
         "//ui/android:ui_java",
       ]
diff --git a/media/gpu/android_deferred_rendering_backing_strategy.cc b/media/gpu/android_deferred_rendering_backing_strategy.cc
index 1f6cfd74a..3b675f9 100644
--- a/media/gpu/android_deferred_rendering_backing_strategy.cc
+++ b/media/gpu/android_deferred_rendering_backing_strategy.cc
@@ -434,6 +434,22 @@
     }
   }
 
+  // Samsung Galaxy Tab A, J3, and J1 Mini all like to crash on Lollipop in
+  // glEGLImageTargetTexture2DOES .  Exact models were SM-T280, SM-J320F,
+  // and SM-j105H.
+  if (base::android::BuildInfo::GetInstance()->sdk_int() <= 22) {  // L MR1
+    const std::string brand(
+        base::ToLowerASCII(base::android::BuildInfo::GetInstance()->brand()));
+    if (brand == "samsung") {
+      const std::string model(
+          base::ToLowerASCII(base::android::BuildInfo::GetInstance()->model()));
+      if (model.find("sm-t280") != std::string::npos ||
+          model.find("sm-j320f") != std::string::npos ||
+          model.find("sm-j105") != std::string::npos)
+        return false;
+    }
+  }
+
   // Assume so.
   return true;
 }
diff --git a/media/gpu/android_video_decode_accelerator.cc b/media/gpu/android_video_decode_accelerator.cc
index f6b7178..b9c86d1 100644
--- a/media/gpu/android_video_decode_accelerator.cc
+++ b/media/gpu/android_video_decode_accelerator.cc
@@ -507,9 +507,13 @@
     return;
 
   strategy_->MaybeRenderEarly();
-  bool did_work = QueueInput();
-  while (DequeueOutput())
-    did_work = true;
+  bool did_work = false, did_input = false, did_output = false;
+  do {
+    did_input = QueueInput();
+    did_output = DequeueOutput();
+    if (did_input || did_output)
+      did_work = true;
+  } while (did_input || did_output);
 
   ManageTimer(did_work || start_timer);
 }
diff --git a/media/gpu/ipc/client/gpu_jpeg_decode_accelerator_host.cc b/media/gpu/ipc/client/gpu_jpeg_decode_accelerator_host.cc
index c7f3ef14c..f937a60 100644
--- a/media/gpu/ipc/client/gpu_jpeg_decode_accelerator_host.cc
+++ b/media/gpu/ipc/client/gpu_jpeg_decode_accelerator_host.cc
@@ -97,10 +97,10 @@
 };
 
 GpuJpegDecodeAcceleratorHost::GpuJpegDecodeAcceleratorHost(
-    gpu::GpuChannelHost* channel,
+    scoped_refptr<gpu::GpuChannelHost> channel,
     int32_t route_id,
     const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner)
-    : channel_(channel),
+    : channel_(std::move(channel)),
       decoder_route_id_(route_id),
       io_task_runner_(io_task_runner) {
   DCHECK(channel_);
diff --git a/media/gpu/ipc/client/gpu_jpeg_decode_accelerator_host.h b/media/gpu/ipc/client/gpu_jpeg_decode_accelerator_host.h
index ca16f17..4293961 100644
--- a/media/gpu/ipc/client/gpu_jpeg_decode_accelerator_host.h
+++ b/media/gpu/ipc/client/gpu_jpeg_decode_accelerator_host.h
@@ -34,11 +34,8 @@
 class GpuJpegDecodeAcceleratorHost : public JpegDecodeAccelerator,
                                      public base::NonThreadSafe {
  public:
-  // VideoCaptureGpuJpegDecoder owns |this| and |channel|. And
-  // VideoCaptureGpuJpegDecoder delete |this| before |channel|. So |this| is
-  // guaranteed not to outlive |channel|.
   GpuJpegDecodeAcceleratorHost(
-      gpu::GpuChannelHost* channel,
+      scoped_refptr<gpu::GpuChannelHost> channel,
       int32_t route_id,
       const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner);
   ~GpuJpegDecodeAcceleratorHost() override;
@@ -58,9 +55,7 @@
 
   void Send(IPC::Message* message);
 
-  // Unowned reference to the GpuChannelHost to send IPC messages to the GPU
-  // process.
-  gpu::GpuChannelHost* channel_;
+  scoped_refptr<gpu::GpuChannelHost> channel_;
 
   // Route ID for the associated decoder in the GPU process.
   int32_t decoder_route_id_;
diff --git a/media/gpu/ipc/client/gpu_video_decode_accelerator_host.cc b/media/gpu/ipc/client/gpu_video_decode_accelerator_host.cc
index 0d3d068..2c6b087 100644
--- a/media/gpu/ipc/client/gpu_video_decode_accelerator_host.cc
+++ b/media/gpu/ipc/client/gpu_video_decode_accelerator_host.cc
@@ -18,9 +18,8 @@
 namespace media {
 
 GpuVideoDecodeAcceleratorHost::GpuVideoDecodeAcceleratorHost(
-    gpu::GpuChannelHost* channel,
     gpu::CommandBufferProxyImpl* impl)
-    : channel_(channel),
+    : channel_(impl->channel()),
       decoder_route_id_(MSG_ROUTING_NONE),
       client_(NULL),
       impl_(impl),
diff --git a/media/gpu/ipc/client/gpu_video_decode_accelerator_host.h b/media/gpu/ipc/client/gpu_video_decode_accelerator_host.h
index c60d2b5..ee80d44d 100644
--- a/media/gpu/ipc/client/gpu_video_decode_accelerator_host.h
+++ b/media/gpu/ipc/client/gpu_video_decode_accelerator_host.h
@@ -31,10 +31,8 @@
       public gpu::CommandBufferProxyImpl::DeletionObserver,
       public base::NonThreadSafe {
  public:
-  // |this| is guaranteed not to outlive |channel| and |impl|.  (See comments
-  // for |channel_| and |impl_|.)
-  GpuVideoDecodeAcceleratorHost(gpu::GpuChannelHost* channel,
-                                gpu::CommandBufferProxyImpl* impl);
+  // |this| is guaranteed not to outlive |impl|.  (See comments for |impl_|.)
+  explicit GpuVideoDecodeAcceleratorHost(gpu::CommandBufferProxyImpl* impl);
 
   // IPC::Listener implementation.
   void OnChannelError() override;
@@ -80,10 +78,7 @@
   void OnResetDone();
   void OnNotifyError(uint32_t error);
 
-  // Unowned reference to the GpuChannelHost to send IPC messages to the GPU
-  // process.  |channel_| outlives |impl_|, so the reference is always valid as
-  // long as it is not NULL.
-  gpu::GpuChannelHost* channel_;
+  scoped_refptr<gpu::GpuChannelHost> channel_;
 
   // Route ID for the associated decoder in the GPU process.
   int32_t decoder_route_id_;
diff --git a/media/gpu/ipc/client/gpu_video_encode_accelerator_host.cc b/media/gpu/ipc/client/gpu_video_encode_accelerator_host.cc
index 0d3cae9..4fd698c 100644
--- a/media/gpu/ipc/client/gpu_video_encode_accelerator_host.cc
+++ b/media/gpu/ipc/client/gpu_video_encode_accelerator_host.cc
@@ -17,9 +17,8 @@
 namespace media {
 
 GpuVideoEncodeAcceleratorHost::GpuVideoEncodeAcceleratorHost(
-    gpu::GpuChannelHost* channel,
     gpu::CommandBufferProxyImpl* impl)
-    : channel_(channel),
+    : channel_(impl->channel()),
       encoder_route_id_(MSG_ROUTING_NONE),
       client_(NULL),
       impl_(impl),
diff --git a/media/gpu/ipc/client/gpu_video_encode_accelerator_host.h b/media/gpu/ipc/client/gpu_video_encode_accelerator_host.h
index b1dc8f72..c7365fa 100644
--- a/media/gpu/ipc/client/gpu_video_encode_accelerator_host.h
+++ b/media/gpu/ipc/client/gpu_video_encode_accelerator_host.h
@@ -46,10 +46,8 @@
       public gpu::CommandBufferProxyImpl::DeletionObserver,
       public base::NonThreadSafe {
  public:
-  // |this| is guaranteed not to outlive |channel| and |impl|.  (See comments
-  // for |channel_| and |impl_|.)
-  GpuVideoEncodeAcceleratorHost(gpu::GpuChannelHost* channel,
-                                gpu::CommandBufferProxyImpl* impl);
+  // |this| is guaranteed not to outlive |impl|.  (See comments for |impl_|.)
+  explicit GpuVideoEncodeAcceleratorHost(gpu::CommandBufferProxyImpl* impl);
 
   // IPC::Listener implementation.
   bool OnMessageReceived(const IPC::Message& message) override;
@@ -100,10 +98,7 @@
                               bool key_frame);
   void OnNotifyError(Error error);
 
-  // Unowned reference to the GpuChannelHost to send IPC messages to the GPU
-  // process.  |channel_| outlives |impl_|, so the reference is always valid as
-  // long as it is not NULL.
-  gpu::GpuChannelHost* channel_;
+  scoped_refptr<gpu::GpuChannelHost> channel_;
 
   // Route ID for the associated encoder in the GPU process.
   int32_t encoder_route_id_;
diff --git a/media/gpu/vt_video_decode_accelerator_mac.h b/media/gpu/vt_video_decode_accelerator_mac.h
index 77d3915..fdcae956 100644
--- a/media/gpu/vt_video_decode_accelerator_mac.h
+++ b/media/gpu/vt_video_decode_accelerator_mac.h
@@ -20,6 +20,7 @@
 #include "base/threading/thread_checker.h"
 #include "media/filters/h264_parser.h"
 #include "media/gpu/gpu_video_decode_accelerator_helpers.h"
+#include "media/gpu/media_gpu_export.h"
 #include "media/gpu/vt_mac.h"
 #include "media/video/h264_poc.h"
 #include "media/video/video_decode_accelerator.h"
@@ -30,7 +31,7 @@
 namespace media {
 
 // Preload VideoToolbox libraries, needed for sandbox warmup.
-bool InitializeVideoToolbox();
+MEDIA_GPU_EXPORT bool InitializeVideoToolbox();
 
 // VideoToolbox.framework implementation of the VideoDecodeAccelerator
 // interface for Mac OS X (currently limited to 10.9+).
diff --git a/media/media.gyp b/media/media.gyp
index 9c03efa..e826ade7 100644
--- a/media/media.gyp
+++ b/media/media.gyp
@@ -123,6 +123,8 @@
         'audio/android/opensles_input.h',
         'audio/android/opensles_output.cc',
         'audio/android/opensles_output.h',
+        'audio/android/opensles_util.cc',
+        'audio/android/opensles_util.h',
         'audio/android/opensles_wrapper.cc',
         'audio/audio_device_description.cc',
         'audio/audio_device_description.h',
@@ -1621,7 +1623,7 @@
     {
       # GN version: //media/gpu
       'target_name': 'media_gpu',
-      'type': 'static_library',
+      'type': '<(component)',
       'includes': [ 'media_gpu.gypi' ],
     },
   ],
diff --git a/media/media_gpu.gypi b/media/media_gpu.gypi
index df2597b..88563bb 100644
--- a/media/media_gpu.gypi
+++ b/media/media_gpu.gypi
@@ -245,6 +245,10 @@
       ],
       'conditions': [
         ['use_x11 == 1', {
+          'dependencies': [
+            '../build/linux/system.gyp:x11',
+            '../ui/gfx/x/gfx_x11.gyp:gfx_x11',
+          ],
           'variables': {
             'sig_files': [
               'gpu/va.sigs',
diff --git a/mojo/OWNERS b/mojo/OWNERS
index e4e22be3..7252d2b 100644
--- a/mojo/OWNERS
+++ b/mojo/OWNERS
@@ -2,3 +2,4 @@
 ben@chromium.org
 rockot@chromium.org
 sky@chromium.org
+yzshen@chromium.org
diff --git a/mojo/android/javatests/src/org/chromium/mojo/MojoTestCase.java b/mojo/android/javatests/src/org/chromium/mojo/MojoTestCase.java
index 3e81b7a8..c7348caa 100644
--- a/mojo/android/javatests/src/org/chromium/mojo/MojoTestCase.java
+++ b/mojo/android/javatests/src/org/chromium/mojo/MojoTestCase.java
@@ -4,6 +4,7 @@
 
 package org.chromium.mojo;
 
+import android.content.Context;
 import android.test.InstrumentationTestCase;
 
 import org.chromium.base.ContextUtils;
@@ -25,9 +26,9 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        LibraryLoader.get(LibraryProcessType.PROCESS_BROWSER)
-                .ensureInitialized(getInstrumentation().getTargetContext());
-        ContextUtils.initApplicationContext(getInstrumentation().getTargetContext());
+        Context appContext = getInstrumentation().getTargetContext().getApplicationContext();
+        ContextUtils.initApplicationContext(appContext);
+        LibraryLoader.get(LibraryProcessType.PROCESS_BROWSER).ensureInitialized(appContext);
         nativeInit();
         mTestEnvironmentPointer = nativeSetupTestEnvironment();
     }
diff --git a/mojo/edk/embedder/embedder_unittest.cc b/mojo/edk/embedder/embedder_unittest.cc
index 99f0b7f..0904799 100644
--- a/mojo/edk/embedder/embedder_unittest.cc
+++ b/mojo/edk/embedder/embedder_unittest.cc
@@ -198,13 +198,7 @@
 
 #if !defined(OS_IOS)
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_MultiprocessChannels DISABLED_MultiprocessChannels
-#else
-#define MAYBE_MultiprocessChannels MultiprocessChannels
-#endif  // defined(OS_ANDROID)
-TEST_F(EmbedderTest, MAYBE_MultiprocessChannels) {
+TEST_F(EmbedderTest, MultiprocessChannels) {
   RUN_CHILD_ON_PIPE(MultiprocessChannelsClient, server_mp)
     // 1. Write a message to |server_mp| (attaching nothing).
     WriteMessage(server_mp, "hello");
@@ -290,13 +284,7 @@
   ASSERT_EQ(MOJO_RESULT_OK, MojoClose(mp1));
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_MultiprocessBaseSharedMemory DISABLED_MultiprocessBaseSharedMemory
-#else
-#define MAYBE_MultiprocessBaseSharedMemory MultiprocessBaseSharedMemory
-#endif  // defined(OS_ANDROID)
-TEST_F(EmbedderTest, MAYBE_MultiprocessBaseSharedMemory) {
+TEST_F(EmbedderTest, MultiprocessBaseSharedMemory) {
   RUN_CHILD_ON_PIPE(MultiprocessSharedMemoryClient, server_mp)
     // 1. Create a base::SharedMemory object and create a mojo shared buffer
     // from it.
diff --git a/mojo/edk/embedder/platform_handle_utils_win.cc b/mojo/edk/embedder/platform_handle_utils_win.cc
index eebfdeb7..32ed49af 100644
--- a/mojo/edk/embedder/platform_handle_utils_win.cc
+++ b/mojo/edk/embedder/platform_handle_utils_win.cc
@@ -15,6 +15,7 @@
   DCHECK(platform_handle.is_valid());
 
   HANDLE new_handle;
+  CHECK_NE(platform_handle.handle, INVALID_HANDLE_VALUE);
   if (!DuplicateHandle(GetCurrentProcess(), platform_handle.handle,
                        GetCurrentProcess(), &new_handle, 0, TRUE,
                        DUPLICATE_SAME_ACCESS))
diff --git a/mojo/edk/system/channel.cc b/mojo/edk/system/channel.cc
index a03668ba..c8d6931 100644
--- a/mojo/edk/system/channel.cc
+++ b/mojo/edk/system/channel.cc
@@ -336,10 +336,17 @@
         from_process, handles[i].handle, to_process,
         &handles[i].handle, 0, FALSE,
         DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);
-    if (result)
+    if (result) {
       handles[i].owning_process = to_process;
-    else
+    } else {
       success = false;
+
+      // If handle duplication fails, the source handle will already be closed
+      // due to DUPLICATE_CLOSE_SOURCE. Replace the handle in the message with
+      // an invalid handle.
+      handles[i].handle = INVALID_HANDLE_VALUE;
+      handles[i].owning_process = base::GetCurrentProcessHandle();
+    }
   }
   return success;
 }
diff --git a/mojo/edk/system/data_pipe_unittest.cc b/mojo/edk/system/data_pipe_unittest.cc
index a1d0129..526444c 100644
--- a/mojo/edk/system/data_pipe_unittest.cc
+++ b/mojo/edk/system/data_pipe_unittest.cc
@@ -1658,13 +1658,7 @@
 
 #if !defined(OS_IOS)
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_Multiprocess DISABLED_Multiprocess
-#else
-#define MAYBE_Multiprocess Multiprocess
-#endif  // defined(OS_ANDROID)
-TEST_F(DataPipeTest, MAYBE_Multiprocess) {
+TEST_F(DataPipeTest, Multiprocess) {
   const uint32_t kTestDataSize =
       static_cast<uint32_t>(sizeof(kMultiprocessTestData));
   const MojoCreateDataPipeOptions options = {
@@ -1837,13 +1831,7 @@
   EXPECT_EQ("quit", ReadMessage(h));
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_SendConsumerAndCloseProducer DISABLED_SendConsumerAndCloseProducer
-#else
-#define MAYBE_SendConsumerAndCloseProducer SendConsumerAndCloseProducer
-#endif  // defined(OS_ANDROID)
-TEST_F(DataPipeTest, MAYBE_SendConsumerAndCloseProducer) {
+TEST_F(DataPipeTest, SendConsumerAndCloseProducer) {
   // Create a new data pipe.
   MojoHandle p, c;
   EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(nullptr, &p ,&c));
@@ -1886,13 +1874,7 @@
   EXPECT_EQ("quit", ReadMessage(h));
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_CreateInChild DISABLED_CreateInChild
-#else
-#define MAYBE_CreateInChild CreateInChild
-#endif  // defined(OS_ANDROID)
-TEST_F(DataPipeTest, MAYBE_CreateInChild) {
+TEST_F(DataPipeTest, CreateInChild) {
   RUN_CHILD_ON_PIPE(CreateAndWrite, child)
     MojoHandle c;
     std::string expected_message = ReadMessageWithHandles(child, &c, 1);
diff --git a/mojo/edk/system/message_pipe_unittest.cc b/mojo/edk/system/message_pipe_unittest.cc
index 3c53c58..fcfaeca1 100644
--- a/mojo/edk/system/message_pipe_unittest.cc
+++ b/mojo/edk/system/message_pipe_unittest.cc
@@ -534,13 +534,7 @@
     MojoClose(p[i]);
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_SharedBufferHandlePingPong DISABLED_SharedBufferHandlePingPong
-#else
-#define MAYBE_SharedBufferHandlePingPong SharedBufferHandlePingPong
-#endif
-TEST_F(MessagePipeTest, MAYBE_SharedBufferHandlePingPong) {
+TEST_F(MessagePipeTest, SharedBufferHandlePingPong) {
   MojoHandle buffers[kPingPongHandlesPerIteration];
   for (size_t i = 0; i <kPingPongHandlesPerIteration; ++i)
     EXPECT_EQ(MOJO_RESULT_OK, MojoCreateSharedBuffer(nullptr, 1, &buffers[i]));
diff --git a/mojo/edk/system/multiprocess_message_pipe_unittest.cc b/mojo/edk/system/multiprocess_message_pipe_unittest.cc
index 1d07d0f..946322c 100644
--- a/mojo/edk/system/multiprocess_message_pipe_unittest.cc
+++ b/mojo/edk/system/multiprocess_message_pipe_unittest.cc
@@ -115,14 +115,7 @@
   return rv;
 }
 
-// Sends "hello" to child, and expects "hellohello" back.
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_Basic DISABLED_Basic
-#else
-#define MAYBE_Basic Basic
-#endif  // defined(OS_ANDROID)
-TEST_F(MultiprocessMessagePipeTest, MAYBE_Basic) {
+TEST_F(MultiprocessMessagePipeTest, Basic) {
   RUN_CHILD_ON_PIPE(EchoEcho, h)
     std::string hello("hello");
     ASSERT_EQ(MOJO_RESULT_OK,
@@ -158,15 +151,7 @@
   END_CHILD_AND_EXPECT_EXIT_CODE(1 % 100);
 }
 
-// Sends a bunch of messages to the child. Expects them "repeated" back. Waits
-// for the child to close its end before quitting.
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_QueueMessages DISABLED_QueueMessages
-#else
-#define MAYBE_QueueMessages QueueMessages
-#endif  // defined(OS_ANDROID)
-TEST_F(MultiprocessMessagePipeTest, MAYBE_QueueMessages) {
+TEST_F(MultiprocessMessagePipeTest, QueueMessages) {
   static const size_t kNumMessages = 1001;
   RUN_CHILD_ON_PIPE(EchoEcho, h)
     for (size_t i = 0; i < kNumMessages; i++) {
@@ -292,13 +277,7 @@
   return 0;
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_SharedBufferPassing DISABLED_SharedBufferPassing
-#else
-#define MAYBE_SharedBufferPassing SharedBufferPassing
-#endif
-TEST_F(MultiprocessMessagePipeTest, MAYBE_SharedBufferPassing) {
+TEST_F(MultiprocessMessagePipeTest, SharedBufferPassing) {
   RUN_CHILD_ON_PIPE(CheckSharedBuffer, h)
     // Make a shared buffer.
     MojoCreateSharedBufferOptions options;
@@ -529,13 +508,7 @@
   return 0;
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_MessagePipePassing DISABLED_MessagePipePassing
-#else
-#define MAYBE_MessagePipePassing MessagePipePassing
-#endif
-TEST_F(MultiprocessMessagePipeTest, MAYBE_MessagePipePassing) {
+TEST_F(MultiprocessMessagePipeTest, MessagePipePassing) {
   RUN_CHILD_ON_PIPE(CheckMessagePipe, h)
     MojoCreateSharedBufferOptions options;
     options.struct_size = sizeof(options);
@@ -577,14 +550,7 @@
   END_CHILD()
 }
 
-// Like above test, but verifies passing the other MP handle works as well.
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_MessagePipeTwoPassing DISABLED_MessagePipeTwoPassing
-#else
-#define MAYBE_MessagePipeTwoPassing MessagePipeTwoPassing
-#endif
-TEST_F(MultiprocessMessagePipeTest, MAYBE_MessagePipeTwoPassing) {
+TEST_F(MultiprocessMessagePipeTest, MessagePipeTwoPassing) {
   RUN_CHILD_ON_PIPE(CheckMessagePipe, h)
     MojoHandle mp1, mp2;
     ASSERT_EQ(MOJO_RESULT_OK,
@@ -672,13 +638,7 @@
   return 0;
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_DataPipeConsumer DISABLED_DataPipeConsumer
-#else
-#define MAYBE_DataPipeConsumer DataPipeConsumer
-#endif
-TEST_F(MultiprocessMessagePipeTest, MAYBE_DataPipeConsumer) {
+TEST_F(MultiprocessMessagePipeTest, DataPipeConsumer) {
   RUN_CHILD_ON_PIPE(DataPipeConsumer, h)
     MojoCreateSharedBufferOptions options;
     options.struct_size = sizeof(options);
@@ -772,13 +732,7 @@
   return 0;
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_MultiprocessChannelPipe DISABLED_MultiprocessChannelPipe
-#else
-#define MAYBE_MultiprocessChannelPipe MultiprocessChannelPipe
-#endif
-TEST_F(MultiprocessMessagePipeTest, MAYBE_MultiprocessChannelPipe) {
+TEST_F(MultiprocessMessagePipeTest, MultiprocessChannelPipe) {
   RUN_CHILD_ON_PIPE(ChannelEchoClient, h)
     VerifyEcho(h, "in an interstellar burst");
     VerifyEcho(h, "i am back to save the universe");
@@ -803,13 +757,7 @@
   return 0;
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_PassMessagePipeCrossProcess DISABLED_PassMessagePipeCrossProcess
-#else
-#define MAYBE_PassMessagePipeCrossProcess PassMessagePipeCrossProcess
-#endif
-TEST_F(MultiprocessMessagePipeTest, MAYBE_PassMessagePipeCrossProcess) {
+TEST_F(MultiprocessMessagePipeTest, PassMessagePipeCrossProcess) {
   MojoHandle p0, p1;
   CreateMessagePipe(&p0, &p1);
   RUN_CHILD_ON_PIPE(EchoServiceClient, h)
@@ -866,14 +814,7 @@
   return 0;
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_PassMoarMessagePipesCrossProcess \
-    DISABLED_PassMoarMessagePipesCrossProcess
-#else
-#define MAYBE_PassMoarMessagePipesCrossProcess PassMoarMessagePipesCrossProcess
-#endif
-TEST_F(MultiprocessMessagePipeTest, MAYBE_PassMoarMessagePipesCrossProcess) {
+TEST_F(MultiprocessMessagePipeTest, PassMoarMessagePipesCrossProcess) {
   MojoHandle echo_factory_proxy, echo_factory_request;
   CreateMessagePipe(&echo_factory_proxy, &echo_factory_request);
 
@@ -918,14 +859,7 @@
   CloseHandle(echo_proxy_c);
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_ChannelPipesWithMultipleChildren \
-    DISABLED_ChannelPipesWithMultipleChildren
-#else
-#define MAYBE_ChannelPipesWithMultipleChildren ChannelPipesWithMultipleChildren
-#endif
-TEST_F(MultiprocessMessagePipeTest, MAYBE_ChannelPipesWithMultipleChildren) {
+TEST_F(MultiprocessMessagePipeTest, ChannelPipesWithMultipleChildren) {
   RUN_CHILD_ON_PIPE(ChannelEchoClient, a)
     RUN_CHILD_ON_PIPE(ChannelEchoClient, b)
       VerifyEcho(a, "hello child 0");
@@ -955,13 +889,7 @@
   EXPECT_EQ("quit", ReadMessage(h));
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_PingPongPipe DISABLED_PingPongPipe
-#else
-#define MAYBE_PingPongPipe PingPongPipe
-#endif
-TEST_F(MultiprocessMessagePipeTest, MAYBE_PingPongPipe) {
+TEST_F(MultiprocessMessagePipeTest, PingPongPipe) {
   MojoHandle p0, p1;
   CreateMessagePipe(&p0, &p1);
 
@@ -1060,13 +988,7 @@
   return 0;
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_ChildToChildPipes DISABLED_ChildToChildPipes
-#else
-#define MAYBE_ChildToChildPipes ChildToChildPipes
-#endif
-TEST_F(MultiprocessMessagePipeTest, MAYBE_ChildToChildPipes) {
+TEST_F(MultiprocessMessagePipeTest, ChildToChildPipes) {
   RUN_CHILD_ON_PIPE(CommandDrivenClient, h0)
     RUN_CHILD_ON_PIPE(CommandDrivenClient, h1)
       CommandDrivenClientController a(h0);
@@ -1091,13 +1013,7 @@
   END_CHILD()
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_MoreChildToChildPipes DISABLED_MoreChildToChildPipes
-#else
-#define MAYBE_MoreChildToChildPipes MoreChildToChildPipes
-#endif
-TEST_F(MultiprocessMessagePipeTest, MAYBE_MoreChildToChildPipes) {
+TEST_F(MultiprocessMessagePipeTest, MoreChildToChildPipes) {
   RUN_CHILD_ON_PIPE(CommandDrivenClient, h0)
     RUN_CHILD_ON_PIPE(CommandDrivenClient, h1)
       RUN_CHILD_ON_PIPE(CommandDrivenClient, h2)
@@ -1183,13 +1099,7 @@
                                      MOJO_DEADLINE_INDEFINITE, nullptr));
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_SendPipeThenClosePeer DISABLED_SendPipeThenClosePeer
-#else
-#define MAYBE_SendPipeThenClosePeer SendPipeThenClosePeer
-#endif
-TEST_F(MultiprocessMessagePipeTest, MAYBE_SendPipeThenClosePeer) {
+TEST_F(MultiprocessMessagePipeTest, SendPipeThenClosePeer) {
   RUN_CHILD_ON_PIPE(ReceivePipeWithClosedPeer, h)
     MojoHandle a, b;
     CreateMessagePipe(&a, &b);
@@ -1266,13 +1176,7 @@
 }
 
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_SendClosePeerSend DISABLED_SendClosePeerSend
-#else
-#define MAYBE_SendClosePeerSend SendClosePeerSend
-#endif
-TEST_F(MultiprocessMessagePipeTest, MAYBE_SendClosePeerSend) {
+TEST_F(MultiprocessMessagePipeTest, SendClosePeerSend) {
   MojoHandle a, b;
   CreateMessagePipe(&a, &b);
 
@@ -1315,13 +1219,7 @@
   EXPECT_EQ("quit", ReadMessage(h));
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_WriteCloseSendPeer DISABLED_WriteCloseSendPeer
-#else
-#define MAYBE_WriteCloseSendPeer WriteCloseSendPeer
-#endif
-TEST_F(MultiprocessMessagePipeTest, MAYBE_WriteCloseSendPeer) {
+TEST_F(MultiprocessMessagePipeTest, WriteCloseSendPeer) {
   MojoHandle pipe[2];
   CreateMessagePipe(&pipe[0], &pipe[1]);
 
@@ -1361,13 +1259,7 @@
   VerifyEcho(pipe.get().value(), "goodbye");
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_BootstrapMessagePipeAsync DISABLED_BootstrapMessagePipeAsync
-#else
-#define MAYBE_BootstrapMessagePipeAsync BootstrapMessagePipeAsync
-#endif
-TEST_F(MultiprocessMessagePipeTest, MAYBE_BootstrapMessagePipeAsync) {
+TEST_F(MultiprocessMessagePipeTest, BootstrapMessagePipeAsync) {
   // Tests that new cross-process message pipes can be created synchronously
   // using asynchronous negotiation over an arbitrary platform channel.
   RUN_CHILD_ON_PIPE(BootstrapMessagePipeAsyncClient, child)
diff --git a/mojo/edk/system/node_channel.cc b/mojo/edk/system/node_channel.cc
index a50e1c6..1a7426d 100644
--- a/mojo/edk/system/node_channel.cc
+++ b/mojo/edk/system/node_channel.cc
@@ -187,6 +187,7 @@
 void NodeChannel::SetRemoteProcessHandle(base::ProcessHandle process_handle) {
   DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
   base::AutoLock lock(remote_process_handle_lock_);
+  CHECK_NE(remote_process_handle_, base::GetCurrentProcessHandle());
   remote_process_handle_ = process_handle;
 }
 
diff --git a/mojo/edk/system/shared_buffer_unittest.cc b/mojo/edk/system/shared_buffer_unittest.cc
index bdead31d..3a728728 100644
--- a/mojo/edk/system/shared_buffer_unittest.cc
+++ b/mojo/edk/system/shared_buffer_unittest.cc
@@ -63,13 +63,7 @@
   EXPECT_EQ("quit", ReadMessage(h));
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_PassSharedBufferCrossProcess DISABLED_PassSharedBufferCrossProcess
-#else
-#define MAYBE_PassSharedBufferCrossProcess PassSharedBufferCrossProcess
-#endif
-TEST_F(SharedBufferTest, MAYBE_PassSharedBufferCrossProcess) {
+TEST_F(SharedBufferTest, PassSharedBufferCrossProcess) {
   const std::string message = "hello";
   MojoHandle b = CreateBuffer(message.size());
 
@@ -93,13 +87,7 @@
   EXPECT_EQ("quit", ReadMessage(h));
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_PassSharedBufferFromChild DISABLED_PassSharedBufferFromChild
-#else
-#define MAYBE_PassSharedBufferFromChild PassSharedBufferFromChild
-#endif
-TEST_F(SharedBufferTest, MAYBE_PassSharedBufferFromChild) {
+TEST_F(SharedBufferTest, PassSharedBufferFromChild) {
   const std::string message = "hello";
   MojoHandle b;
   RUN_CHILD_ON_PIPE(CreateBufferClient, h)
@@ -144,14 +132,7 @@
   EXPECT_EQ("quit", ReadMessage(h));
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_PassSharedBufferFromChildToChild \
-    DISABLED_PassSharedBufferFromChildToChild
-#else
-#define MAYBE_PassSharedBufferFromChildToChild PassSharedBufferFromChildToChild
-#endif
-TEST_F(SharedBufferTest, MAYBE_PassSharedBufferFromChildToChild) {
+TEST_F(SharedBufferTest, PassSharedBufferFromChildToChild) {
   const std::string message = "hello";
   MojoHandle p0, p1;
   CreateMessagePipe(&p0, &p1);
diff --git a/mojo/edk/test/multiprocess_test_helper.cc b/mojo/edk/test/multiprocess_test_helper.cc
index 7098934f..8de370a 100644
--- a/mojo/edk/test/multiprocess_test_helper.cc
+++ b/mojo/edk/test/multiprocess_test_helper.cc
@@ -132,8 +132,14 @@
   CHECK(test_child_.IsValid());
 
   int rv = -1;
+#if defined(OS_ANDROID)
+  // On Android, we need to use a special function to wait for the child.
+  CHECK(AndroidWaitForChildExitWithTimeout(
+      test_child_, TestTimeouts::action_timeout(), &rv));
+#else
   CHECK(
       test_child_.WaitForExitWithTimeout(TestTimeouts::action_timeout(), &rv));
+#endif
   test_child_.Close();
   return rv;
 }
diff --git a/mojo/edk/test/multiprocess_test_helper_unittest.cc b/mojo/edk/test/multiprocess_test_helper_unittest.cc
index babe5b2..f7e9e83 100644
--- a/mojo/edk/test/multiprocess_test_helper_unittest.cc
+++ b/mojo/edk/test/multiprocess_test_helper_unittest.cc
@@ -48,13 +48,7 @@
 
 using MultiprocessTestHelperTest = testing::Test;
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_RunChild DISABLED_RunChild
-#else
-#define MAYBE_RunChild RunChild
-#endif  // defined(OS_ANDROID)
-TEST_F(MultiprocessTestHelperTest, MAYBE_RunChild) {
+TEST_F(MultiprocessTestHelperTest, RunChild) {
   MultiprocessTestHelper helper;
   EXPECT_TRUE(helper.server_platform_handle.is_valid());
 
@@ -67,26 +61,14 @@
   return 123;
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_TestChildMainNotFound DISABLED_TestChildMainNotFound
-#else
-#define MAYBE_TestChildMainNotFound TestChildMainNotFound
-#endif  // defined(OS_ANDROID)
-TEST_F(MultiprocessTestHelperTest, MAYBE_TestChildMainNotFound) {
+TEST_F(MultiprocessTestHelperTest, TestChildMainNotFound) {
   MultiprocessTestHelper helper;
   helper.StartChild("NoSuchTestChildMain");
   int result = helper.WaitForChildShutdown();
   EXPECT_FALSE(result >= 0 && result <= 127);
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_PassedChannel DISABLED_PassedChannel
-#else
-#define MAYBE_PassedChannel PassedChannel
-#endif  // defined(OS_ANDROID)
-TEST_F(MultiprocessTestHelperTest, MAYBE_PassedChannel) {
+TEST_F(MultiprocessTestHelperTest, PassedChannel) {
   MultiprocessTestHelper helper;
   EXPECT_TRUE(helper.server_platform_handle.is_valid());
   helper.StartChild("PassedChannel");
@@ -133,13 +115,7 @@
   return static_cast<int>(c);
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_ChildTestPasses DISABLED_ChildTestPasses
-#else
-#define MAYBE_ChildTestPasses ChildTestPasses
-#endif  // defined(OS_ANDROID)
-TEST_F(MultiprocessTestHelperTest, MAYBE_ChildTestPasses) {
+TEST_F(MultiprocessTestHelperTest, ChildTestPasses) {
   MultiprocessTestHelper helper;
   EXPECT_TRUE(helper.server_platform_handle.is_valid());
   helper.StartChild("ChildTestPasses");
@@ -152,13 +128,7 @@
       IsNonBlocking(MultiprocessTestHelper::client_platform_handle.get()));
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_ChildTestFailsAssert DISABLED_ChildTestFailsAssert
-#else
-#define MAYBE_ChildTestFailsAssert ChildTestFailsAssert
-#endif  // defined(OS_ANDROID)
-TEST_F(MultiprocessTestHelperTest, MAYBE_ChildTestFailsAssert) {
+TEST_F(MultiprocessTestHelperTest, ChildTestFailsAssert) {
   MultiprocessTestHelper helper;
   EXPECT_TRUE(helper.server_platform_handle.is_valid());
   helper.StartChild("ChildTestFailsAssert");
@@ -174,13 +144,7 @@
   CHECK(false) << "Not reached";
 }
 
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_ChildTestFailsExpect DISABLED_ChildTestFailsExpect
-#else
-#define MAYBE_ChildTestFailsExpect ChildTestFailsExpect
-#endif  // defined(OS_ANDROID)
-TEST_F(MultiprocessTestHelperTest, MAYBE_ChildTestFailsExpect) {
+TEST_F(MultiprocessTestHelperTest, ChildTestFailsExpect) {
   MultiprocessTestHelper helper;
   EXPECT_TRUE(helper.server_platform_handle.is_valid());
   helper.StartChild("ChildTestFailsExpect");
diff --git a/mojo/edk/test/run_all_unittests.cc b/mojo/edk/test/run_all_unittests.cc
index 0afc2ff..05aed913 100644
--- a/mojo/edk/test/run_all_unittests.cc
+++ b/mojo/edk/test/run_all_unittests.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/test/launcher/unit_test_launcher.h"
+#include "base/test/multiprocess_test.h"
 #include "base/test/test_io_thread.h"
 #include "base/test/test_suite.h"
 #include "mojo/edk/embedder/embedder.h"
@@ -25,6 +26,10 @@
   testing::GTEST_FLAG(death_test_style) = "threadsafe";
 #endif
 #if defined(OS_ANDROID)
+  // Enable the alternate test child implementation. This is needed because Mojo
+  // tests need to spawn test children after initialising the Mojo system.
+  base::InitAndroidMultiProcessTestHelper(main);
+
   // On android, the test framework has a signal handler that will print a
   // [ CRASH ] line when the application crashes. This breaks death test has the
   // test runner will consider the death of the child process a test failure.
diff --git a/mojo/gles2/command_buffer_client_impl.h b/mojo/gles2/command_buffer_client_impl.h
index 1fd14ab..45bcf40 100644
--- a/mojo/gles2/command_buffer_client_impl.h
+++ b/mojo/gles2/command_buffer_client_impl.h
@@ -36,9 +36,9 @@
       const std::vector<int32_t>& attribs,
       mojo::ScopedMessagePipeHandle command_buffer_handle);
   ~CommandBufferClientImpl() override;
+  bool Initialize();
 
   // CommandBuffer implementation:
-  bool Initialize() override;
   State GetLastState() override;
   int32_t GetLastToken() override;
   void Flush(int32_t put_offset) override;
diff --git a/mojo/mojo_public.gyp b/mojo/mojo_public.gyp
index 77e0b7726..2227d76 100644
--- a/mojo/mojo_public.gyp
+++ b/mojo/mojo_public.gyp
@@ -140,8 +140,6 @@
         'public/cpp/bindings/lib/associated_interface_ptr_state.h',
         'public/cpp/bindings/lib/binding_state.h',
         'public/cpp/bindings/lib/bindings_internal.h',
-        'public/cpp/bindings/lib/bindings_serialization.cc',
-        'public/cpp/bindings/lib/bindings_serialization.h',
         'public/cpp/bindings/lib/bounds_checker.cc',
         'public/cpp/bindings/lib/bounds_checker.h',
         'public/cpp/bindings/lib/buffer.h',
@@ -192,6 +190,8 @@
         'public/cpp/bindings/lib/scoped_interface_endpoint_handle.h',
         'public/cpp/bindings/lib/serialization_forward.h',
         'public/cpp/bindings/lib/serialization.h',
+        'public/cpp/bindings/lib/serialization_util.cc',
+        'public/cpp/bindings/lib/serialization_util.h',
         'public/cpp/bindings/lib/shared_data.h',
         'public/cpp/bindings/lib/shared_ptr.h',
         'public/cpp/bindings/lib/string_serialization.cc',
@@ -215,6 +215,9 @@
         'public/cpp/bindings/no_interface.h',
         'public/cpp/bindings/stl_converters.h',
         'public/cpp/bindings/string.h',
+        'public/cpp/bindings/string_traits.h',
+        'public/cpp/bindings/string_traits_standard.h',
+        'public/cpp/bindings/string_traits_string_piece.h',
         'public/cpp/bindings/struct_ptr.h',
         'public/cpp/bindings/strong_binding.h',
         'public/cpp/bindings/type_converter.h',
@@ -236,10 +239,12 @@
       ],
       'sources': [
         'public/cpp/bindings/lib/array_traits_wtf.h',
+        'public/cpp/bindings/lib/string_traits_wtf.cc',
         'public/cpp/bindings/lib/wtf_array_serialization.h',
         'public/cpp/bindings/lib/wtf_serialization.h',
         'public/cpp/bindings/lib/wtf_string_serialization.cc',
         'public/cpp/bindings/lib/wtf_string_serialization.h',
+        'public/cpp/bindings/string_traits_wtf.h',
         'public/cpp/bindings/wtf_array.h',
       ],
       'dependencies': [
diff --git a/mojo/public/OWNERS b/mojo/public/OWNERS
deleted file mode 100644
index 557fed8..0000000
--- a/mojo/public/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-yzshen@chromium.org
diff --git a/mojo/public/cpp/bindings/BUILD.gn b/mojo/public/cpp/bindings/BUILD.gn
index 4666453..0cf4a68 100644
--- a/mojo/public/cpp/bindings/BUILD.gn
+++ b/mojo/public/cpp/bindings/BUILD.gn
@@ -26,8 +26,6 @@
     "lib/associated_interface_ptr_state.h",
     "lib/binding_state.h",
     "lib/bindings_internal.h",
-    "lib/bindings_serialization.cc",
-    "lib/bindings_serialization.h",
     "lib/bounds_checker.cc",
     "lib/bounds_checker.h",
     "lib/buffer.h",
@@ -77,6 +75,8 @@
     "lib/scoped_interface_endpoint_handle.h",
     "lib/serialization.h",
     "lib/serialization_forward.h",
+    "lib/serialization_util.cc",
+    "lib/serialization_util.h",
     "lib/string_serialization.cc",
     "lib/string_serialization.h",
     "lib/sync_handle_registry.cc",
@@ -101,6 +101,9 @@
     "no_interface.h",
     "stl_converters.h",
     "string.h",
+    "string_traits.h",
+    "string_traits_standard.h",
+    "string_traits_string_piece.h",
     "strong_binding.h",
     "struct_ptr.h",
     "type_converter.h",
@@ -144,10 +147,12 @@
 source_set("wtf_support") {
   sources = [
     "lib/array_traits_wtf.h",
+    "lib/string_traits_wtf.cc",
     "lib/wtf_array_serialization.h",
     "lib/wtf_serialization.h",
     "lib/wtf_string_serialization.cc",
     "lib/wtf_string_serialization.h",
+    "string_traits_wtf.h",
     "wtf_array.h",
   ]
 
diff --git a/mojo/public/cpp/bindings/lib/TODO b/mojo/public/cpp/bindings/lib/TODO
deleted file mode 100644
index ea4ce81..0000000
--- a/mojo/public/cpp/bindings/lib/TODO
+++ /dev/null
@@ -1,4 +0,0 @@
-TODOs:
- - Optimize Buffer classes?
- - Add compile-time asserts to verify object packing and padding.
- - Investigate making arrays of objects not be arrays of pointers.
diff --git a/mojo/public/cpp/bindings/lib/array_internal.h b/mojo/public/cpp/bindings/lib/array_internal.h
index 623fef0..00ae00b 100644
--- a/mojo/public/cpp/bindings/lib/array_internal.h
+++ b/mojo/public/cpp/bindings/lib/array_internal.h
@@ -14,10 +14,10 @@
 #include "base/logging.h"
 #include "mojo/public/c/system/macros.h"
 #include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/bindings_serialization.h"
 #include "mojo/public/cpp/bindings/lib/bounds_checker.h"
 #include "mojo/public/cpp/bindings/lib/buffer.h"
 #include "mojo/public/cpp/bindings/lib/map_data_internal.h"
+#include "mojo/public/cpp/bindings/lib/serialization_util.h"
 #include "mojo/public/cpp/bindings/lib/template_util.h"
 #include "mojo/public/cpp/bindings/lib/validate_params.h"
 #include "mojo/public/cpp/bindings/lib/validation_errors.h"
diff --git a/mojo/public/cpp/bindings/lib/bounds_checker.cc b/mojo/public/cpp/bindings/lib/bounds_checker.cc
index 2ee43d5..49416d1 100644
--- a/mojo/public/cpp/bindings/lib/bounds_checker.cc
+++ b/mojo/public/cpp/bindings/lib/bounds_checker.cc
@@ -8,7 +8,7 @@
 #include <stdint.h>
 
 #include "base/logging.h"
-#include "mojo/public/cpp/bindings/lib/bindings_serialization.h"
+#include "mojo/public/cpp/bindings/lib/serialization_util.h"
 #include "mojo/public/cpp/system/handle.h"
 
 namespace mojo {
diff --git a/mojo/public/cpp/bindings/lib/fixed_buffer.cc b/mojo/public/cpp/bindings/lib/fixed_buffer.cc
index e9517f3..50b8a21 100644
--- a/mojo/public/cpp/bindings/lib/fixed_buffer.cc
+++ b/mojo/public/cpp/bindings/lib/fixed_buffer.cc
@@ -10,7 +10,7 @@
 #include <algorithm>
 
 #include "base/logging.h"
-#include "mojo/public/cpp/bindings/lib/bindings_serialization.h"
+#include "mojo/public/cpp/bindings/lib/serialization_util.h"
 
 namespace mojo {
 namespace internal {
diff --git a/mojo/public/cpp/bindings/lib/message_buffer.cc b/mojo/public/cpp/bindings/lib/message_buffer.cc
index 8315263..7a153647 100644
--- a/mojo/public/cpp/bindings/lib/message_buffer.cc
+++ b/mojo/public/cpp/bindings/lib/message_buffer.cc
@@ -6,7 +6,7 @@
 
 #include <limits>
 
-#include "mojo/public/cpp/bindings/lib/bindings_serialization.h"
+#include "mojo/public/cpp/bindings/lib/serialization_util.h"
 
 namespace mojo {
 namespace internal {
diff --git a/mojo/public/cpp/bindings/lib/message_builder.cc b/mojo/public/cpp/bindings/lib/message_builder.cc
index 428fa91..4ffa180 100644
--- a/mojo/public/cpp/bindings/lib/message_builder.cc
+++ b/mojo/public/cpp/bindings/lib/message_builder.cc
@@ -7,7 +7,7 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include "mojo/public/cpp/bindings/lib/bindings_serialization.h"
+#include "mojo/public/cpp/bindings/lib/serialization_util.h"
 #include "mojo/public/cpp/bindings/message.h"
 
 namespace mojo {
diff --git a/mojo/public/cpp/bindings/lib/native_struct_serialization.h b/mojo/public/cpp/bindings/lib/native_struct_serialization.h
index 60d610b..91d9572 100644
--- a/mojo/public/cpp/bindings/lib/native_struct_serialization.h
+++ b/mojo/public/cpp/bindings/lib/native_struct_serialization.h
@@ -15,9 +15,9 @@
 #include "ipc/ipc_param_traits.h"
 #include "mojo/public/cpp/bindings/lib/array_internal.h"
 #include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/bindings_serialization.h"
 #include "mojo/public/cpp/bindings/lib/native_struct_data.h"
 #include "mojo/public/cpp/bindings/lib/serialization_forward.h"
+#include "mojo/public/cpp/bindings/lib/serialization_util.h"
 
 namespace mojo {
 namespace internal {
diff --git a/mojo/public/cpp/bindings/lib/serialization.h b/mojo/public/cpp/bindings/lib/serialization.h
index cb29def8..fe5fecb 100644
--- a/mojo/public/cpp/bindings/lib/serialization.h
+++ b/mojo/public/cpp/bindings/lib/serialization.h
@@ -10,5 +10,7 @@
 #include "mojo/public/cpp/bindings/lib/map_serialization.h"
 #include "mojo/public/cpp/bindings/lib/native_struct_serialization.h"
 #include "mojo/public/cpp/bindings/lib/string_serialization.h"
+#include "mojo/public/cpp/bindings/string_traits_standard.h"
+#include "mojo/public/cpp/bindings/string_traits_string_piece.h"
 
 #endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/lib/serialization_forward.h b/mojo/public/cpp/bindings/lib/serialization_forward.h
index 2c6d239b..fab421ce 100644
--- a/mojo/public/cpp/bindings/lib/serialization_forward.h
+++ b/mojo/public/cpp/bindings/lib/serialization_forward.h
@@ -9,10 +9,11 @@
 
 #include "mojo/public/cpp/bindings/array.h"
 #include "mojo/public/cpp/bindings/array_traits.h"
-#include "mojo/public/cpp/bindings/lib/string_serialization.h"
 #include "mojo/public/cpp/bindings/lib/wtf_string_serialization.h"
 #include "mojo/public/cpp/bindings/map.h"
 #include "mojo/public/cpp/bindings/native_struct.h"
+#include "mojo/public/cpp/bindings/string_traits.h"
+#include "mojo/public/cpp/bindings/struct_traits.h"
 
 // This file is included by serialization implementation files to avoid circular
 // includes.
@@ -60,6 +61,9 @@
                         T* out,
                         SerializationContext* context);
 
+template <typename MojomType, typename InputUserType>
+struct Serializer;
+
 }  // namespace internal
 
 size_t GetSerializedSize_(const NativeStructPtr& input,
@@ -140,6 +144,21 @@
                          Map<MapKey, MapValue>* output,
                          internal::SerializationContext* context);
 
+// -----------------------------------------------------------------------------
+// Forward declaration for String.
+
+// TODO(yzshen): These methods are simply wrappers of the Serializer interface.
+// Remove them.
+size_t GetSerializedSize_(const String& input,
+                          internal::SerializationContext* context);
+void Serialize_(const String& input,
+                internal::Buffer* buffer,
+                internal::String_Data** output,
+                internal::SerializationContext* context);
+bool Deserialize_(internal::String_Data* input,
+                  String* output,
+                  internal::SerializationContext* context);
+
 }  // namespace mojo
 
 #endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_FORWARD_H_
diff --git a/mojo/public/cpp/bindings/lib/bindings_serialization.cc b/mojo/public/cpp/bindings/lib/serialization_util.cc
similarity index 96%
rename from mojo/public/cpp/bindings/lib/bindings_serialization.cc
rename to mojo/public/cpp/bindings/lib/serialization_util.cc
index 0522da7..91a0dd0 100644
--- a/mojo/public/cpp/bindings/lib/bindings_serialization.cc
+++ b/mojo/public/cpp/bindings/lib/serialization_util.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 "mojo/public/cpp/bindings/lib/bindings_serialization.h"
+#include "mojo/public/cpp/bindings/lib/serialization_util.h"
 
 #include <stddef.h>
 #include <stdint.h>
diff --git a/mojo/public/cpp/bindings/lib/bindings_serialization.h b/mojo/public/cpp/bindings/lib/serialization_util.h
similarity index 62%
rename from mojo/public/cpp/bindings/lib/bindings_serialization.h
rename to mojo/public/cpp/bindings/lib/serialization_util.h
index 49a151d..40c9b46 100644
--- a/mojo/public/cpp/bindings/lib/bindings_serialization.h
+++ b/mojo/public/cpp/bindings/lib/serialization_util.h
@@ -8,6 +8,7 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include <queue>
 #include <vector>
 
 #include "base/macros.h"
@@ -85,11 +86,6 @@
   output->set_version(input->version);
 }
 
-class WTFStringContext {
- public:
-  virtual ~WTFStringContext() {}
-};
-
 // A container for handles during serialization/deserialization.
 class SerializedHandleVector {
  public:
@@ -131,7 +127,8 @@
   // Used to serialize/deserialize associated interface pointers and requests.
   scoped_refptr<MultiplexRouter> router;
 
-  std::unique_ptr<WTFStringContext> wtf_string_context;
+  // Opaque context pointers returned by StringTraits::SetUpContext().
+  std::unique_ptr<std::queue<void*>> custom_contexts;
 
   // Stashes handles encoded in a message by index.
   SerializedHandleVector handles;
@@ -155,6 +152,102 @@
       input->version));
 }
 
+template <typename T>
+struct HasIsNullMethod {
+  template <typename U>
+  static char Test(decltype(U::IsNull)*);
+  template <typename U>
+  static int Test(...);
+  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
+
+ private:
+  EnsureTypeIsComplete<T> check_t_;
+};
+
+template <
+    typename Traits,
+    typename UserType,
+    typename std::enable_if<HasIsNullMethod<Traits>::value>::type* = nullptr>
+bool CallIsNullIfExists(const UserType& input) {
+  return Traits::IsNull(input);
+}
+
+template <
+    typename Traits,
+    typename UserType,
+    typename std::enable_if<!HasIsNullMethod<Traits>::value>::type* = nullptr>
+bool CallIsNullIfExists(const UserType& input) {
+  return false;
+}
+
+template <typename T>
+struct HasSetUpContextMethod {
+  template <typename U>
+  static char Test(decltype(U::SetUpContext)*);
+  template <typename U>
+  static int Test(...);
+  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
+
+ private:
+  EnsureTypeIsComplete<T> check_t_;
+};
+
+template <typename Traits,
+          bool has_context = HasSetUpContextMethod<Traits>::value>
+struct CustomContextHelper;
+
+template <typename Traits>
+struct CustomContextHelper<Traits, true> {
+  template <typename MaybeConstUserType>
+  static void* SetUp(MaybeConstUserType& input, SerializationContext* context) {
+    void* custom_context = Traits::SetUpContext(input);
+    if (!context->custom_contexts)
+      context->custom_contexts.reset(new std::queue<void*>());
+    context->custom_contexts->push(custom_context);
+    return custom_context;
+  }
+
+  static void* GetNext(SerializationContext* context) {
+    void* custom_context = context->custom_contexts->front();
+    context->custom_contexts->pop();
+    return custom_context;
+  }
+
+  template <typename MaybeConstUserType>
+  static void TearDown(MaybeConstUserType& input, void* custom_context) {
+    Traits::TearDownContext(input, custom_context);
+  }
+};
+
+template <typename Traits>
+struct CustomContextHelper<Traits, false> {
+  template <typename MaybeConstUserType>
+  static void* SetUp(MaybeConstUserType& input, SerializationContext* context) {
+    return nullptr;
+  }
+
+  static void* GetNext(SerializationContext* context) { return nullptr; }
+
+  template <typename MaybeConstUserType>
+  static void TearDown(MaybeConstUserType& input, void* custom_context) {
+    DCHECK(!custom_context);
+  }
+};
+
+template <typename ReturnType, typename ParamType, typename MaybeConstUserType>
+ReturnType CallWithContext(ReturnType (*f)(ParamType, void*),
+                           MaybeConstUserType& input,
+                           void* context) {
+  return f(input, context);
+}
+
+template <typename ReturnType, typename ParamType, typename MaybeConstUserType>
+ReturnType CallWithContext(ReturnType (*f)(ParamType),
+                           MaybeConstUserType& input,
+                           void* context) {
+  return f(input);
+}
+
 }  // namespace internal
 }  // namespace mojo
 
diff --git a/mojo/public/cpp/bindings/lib/string_serialization.cc b/mojo/public/cpp/bindings/lib/string_serialization.cc
index 6b9f741..a274686 100644
--- a/mojo/public/cpp/bindings/lib/string_serialization.cc
+++ b/mojo/public/cpp/bindings/lib/string_serialization.cc
@@ -4,43 +4,31 @@
 
 #include "mojo/public/cpp/bindings/lib/string_serialization.h"
 
-#include <stddef.h>
-#include <string.h>
+#include "mojo/public/cpp/bindings/lib/serialization.h"
 
 namespace mojo {
+namespace {
+
+using StringSerializer = internal::Serializer<String, const String>;
+
+}  // namespace
 
 size_t GetSerializedSize_(const String& input,
                           internal::SerializationContext* context) {
-  if (!input)
-    return 0;
-  return internal::Align(sizeof(internal::String_Data) + input.size());
+  return StringSerializer::PrepareToSerialize(input, context);
 }
 
 void Serialize_(const String& input,
                 internal::Buffer* buf,
                 internal::String_Data** output,
                 internal::SerializationContext* context) {
-  if (input) {
-    internal::String_Data* result =
-        internal::String_Data::New(input.size(), buf);
-    if (result)
-      memcpy(result->storage(), input.data(), input.size());
-    *output = result;
-  } else {
-    *output = nullptr;
-  }
+  StringSerializer::Serialize(input, buf, output, context);
 }
 
 bool Deserialize_(internal::String_Data* input,
                   String* output,
                   internal::SerializationContext* context) {
-  if (input) {
-    String result(input->storage(), input->size());
-    result.Swap(output);
-  } else {
-    *output = nullptr;
-  }
-  return true;
+  return StringSerializer::Deserialize(input, output, context);
 }
 
 }  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/string_serialization.h b/mojo/public/cpp/bindings/lib/string_serialization.h
index a1ae951..6cae708 100644
--- a/mojo/public/cpp/bindings/lib/string_serialization.h
+++ b/mojo/public/cpp/bindings/lib/string_serialization.h
@@ -6,22 +6,65 @@
 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_STRING_SERIALIZATION_H_
 
 #include <stddef.h>
+#include <string.h>
 
 #include "mojo/public/cpp/bindings/lib/array_internal.h"
+#include "mojo/public/cpp/bindings/lib/serialization_forward.h"
+#include "mojo/public/cpp/bindings/lib/serialization_util.h"
 #include "mojo/public/cpp/bindings/string.h"
+#include "mojo/public/cpp/bindings/string_traits.h"
 
 namespace mojo {
+namespace internal {
 
-size_t GetSerializedSize_(const String& input,
-                          internal::SerializationContext* context);
-void Serialize_(const String& input,
-                internal::Buffer* buffer,
-                internal::String_Data** output,
-                internal::SerializationContext* context);
-bool Deserialize_(internal::String_Data* input,
-                  String* output,
-                  internal::SerializationContext* context);
+template <typename InputUserType>
+struct Serializer<String, InputUserType> {
+  using MaybeConstUserType =
+      typename std::remove_reference<InputUserType>::type;
+  using UserType = typename std::remove_const<MaybeConstUserType>::type;
+  using Traits = StringTraits<UserType>;
 
+  static size_t PrepareToSerialize(MaybeConstUserType& input,
+                                   SerializationContext* context) {
+    if (CallIsNullIfExists<Traits>(input))
+      return 0;
+
+    void* custom_context = CustomContextHelper<Traits>::SetUp(input, context);
+    return Align(sizeof(String_Data) +
+                 CallWithContext(Traits::GetSize, input, custom_context));
+  }
+
+  static void Serialize(MaybeConstUserType& input,
+                        Buffer* buffer,
+                        String_Data** output,
+                        SerializationContext* context) {
+    if (CallIsNullIfExists<Traits>(input)) {
+      *output = nullptr;
+      return;
+    }
+
+    void* custom_context = CustomContextHelper<Traits>::GetNext(context);
+
+    String_Data* result = String_Data::New(
+        CallWithContext(Traits::GetSize, input, custom_context), buffer);
+    if (result) {
+      memcpy(result->storage(),
+             CallWithContext(Traits::GetData, input, custom_context),
+             CallWithContext(Traits::GetSize, input, custom_context));
+    }
+    *output = result;
+
+    CustomContextHelper<Traits>::TearDown(input, custom_context);
+  }
+
+  static bool Deserialize(String_Data* input,
+                          UserType* output,
+                          SerializationContext* context) {
+    return Traits::Read(input, output);
+  }
+};
+
+}  // namespace internal
 }  // namespace mojo
 
 #endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_STRING_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/lib/string_traits_wtf.cc b/mojo/public/cpp/bindings/lib/string_traits_wtf.cc
new file mode 100644
index 0000000..557c28908
--- /dev/null
+++ b/mojo/public/cpp/bindings/lib/string_traits_wtf.cc
@@ -0,0 +1,81 @@
+// Copyright 2016 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 "mojo/public/cpp/bindings/string_traits_wtf.h"
+
+#include <string.h>
+
+#include "base/logging.h"
+#include "mojo/public/cpp/bindings/lib/array_internal.h"
+#include "third_party/WebKit/Source/wtf/text/StringUTF8Adaptor.h"
+
+namespace mojo {
+namespace {
+
+struct UTF8AdaptorInfo {
+  explicit UTF8AdaptorInfo(const WTF::String& input) : utf8_adaptor(input) {
+#if DCHECK_IS_ON()
+    original_size_in_bytes = static_cast<size_t>(input.sizeInBytes());
+#endif
+  }
+
+  ~UTF8AdaptorInfo() {}
+
+  WTF::StringUTF8Adaptor utf8_adaptor;
+
+#if DCHECK_IS_ON()
+  // For sanity check only.
+  size_t original_size_in_bytes;
+#endif
+};
+
+UTF8AdaptorInfo* ToAdaptor(const WTF::String& input, void* context) {
+  UTF8AdaptorInfo* adaptor = static_cast<UTF8AdaptorInfo*>(context);
+
+#if DCHECK_IS_ON()
+  DCHECK_EQ(adaptor->original_size_in_bytes,
+            static_cast<size_t>(input.sizeInBytes()));
+#endif
+  return adaptor;
+}
+
+}  // namespace
+
+// static
+void* StringTraits<WTF::String>::SetUpContext(const WTF::String& input) {
+  return new UTF8AdaptorInfo(input);
+}
+
+// static
+void StringTraits<WTF::String>::TearDownContext(const WTF::String& input,
+                                                void* context) {
+  delete ToAdaptor(input, context);
+}
+
+// static
+size_t StringTraits<WTF::String>::GetSize(const WTF::String& input,
+                                          void* context) {
+  return ToAdaptor(input, context)->utf8_adaptor.length();
+}
+
+// static
+const char* StringTraits<WTF::String>::GetData(const WTF::String& input,
+                                               void* context) {
+  return ToAdaptor(input, context)->utf8_adaptor.data();
+}
+
+// static
+bool StringTraits<WTF::String>::Read(internal::String_Data* input,
+                                     WTF::String* output) {
+  if (input) {
+    WTF::String result = WTF::String::fromUTF8(input->storage(), input->size());
+    output->swap(result);
+  } else if (!output->isNull()) {
+    WTF::String result;
+    output->swap(result);
+  }
+  return true;
+}
+
+}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/validation_util.cc b/mojo/public/cpp/bindings/lib/validation_util.cc
index 64fb1a6..4553d3f 100644
--- a/mojo/public/cpp/bindings/lib/validation_util.cc
+++ b/mojo/public/cpp/bindings/lib/validation_util.cc
@@ -8,8 +8,8 @@
 
 #include <limits>
 
-#include "mojo/public/cpp/bindings/lib/bindings_serialization.h"
 #include "mojo/public/cpp/bindings/lib/message_internal.h"
+#include "mojo/public/cpp/bindings/lib/serialization_util.h"
 #include "mojo/public/cpp/bindings/lib/validation_errors.h"
 #include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
 
diff --git a/mojo/public/cpp/bindings/lib/validation_util.h b/mojo/public/cpp/bindings/lib/validation_util.h
index 53fe0f6..0d425b5 100644
--- a/mojo/public/cpp/bindings/lib/validation_util.h
+++ b/mojo/public/cpp/bindings/lib/validation_util.h
@@ -9,6 +9,7 @@
 
 #include "mojo/public/cpp/bindings/lib/bindings_internal.h"
 #include "mojo/public/cpp/bindings/lib/bounds_checker.h"
+#include "mojo/public/cpp/bindings/lib/serialization_util.h"
 #include "mojo/public/cpp/bindings/lib/validate_params.h"
 #include "mojo/public/cpp/bindings/lib/validation_errors.h"
 #include "mojo/public/cpp/bindings/message.h"
diff --git a/mojo/public/cpp/bindings/lib/wtf_serialization.h b/mojo/public/cpp/bindings/lib/wtf_serialization.h
index c7e0cb7..321c8fc3 100644
--- a/mojo/public/cpp/bindings/lib/wtf_serialization.h
+++ b/mojo/public/cpp/bindings/lib/wtf_serialization.h
@@ -8,5 +8,6 @@
 #include "mojo/public/cpp/bindings/lib/array_traits_wtf.h"
 #include "mojo/public/cpp/bindings/lib/wtf_array_serialization.h"
 #include "mojo/public/cpp/bindings/lib/wtf_string_serialization.h"
+#include "mojo/public/cpp/bindings/string_traits_wtf.h"
 
 #endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/lib/wtf_string_serialization.cc b/mojo/public/cpp/bindings/lib/wtf_string_serialization.cc
index febd073..7148d65 100644
--- a/mojo/public/cpp/bindings/lib/wtf_string_serialization.cc
+++ b/mojo/public/cpp/bindings/lib/wtf_string_serialization.cc
@@ -4,115 +4,37 @@
 
 #include "mojo/public/cpp/bindings/lib/wtf_string_serialization.h"
 
-#include <string.h>
-
-#include <queue>
-
-#include "base/logging.h"
-#include "third_party/WebKit/Source/wtf/text/StringUTF8Adaptor.h"
+#include "mojo/public/cpp/bindings/lib/serialization.h"
+#include "mojo/public/cpp/bindings/lib/wtf_serialization.h"
+#include "mojo/public/cpp/bindings/string.h"
+#include "mojo/public/cpp/bindings/string_traits.h"
 #include "third_party/WebKit/Source/wtf/text/WTFString.h"
 
-namespace WTF {
 namespace {
 
-struct UTF8AdaptorInfo {
-  explicit UTF8AdaptorInfo(const WTF::String& input) : utf8_adaptor(input) {
-#if DCHECK_IS_ON()
-    original_size_in_bytes = static_cast<size_t>(input.sizeInBytes());
-#endif
-  }
-
-  ~UTF8AdaptorInfo() {}
-
-  WTF::StringUTF8Adaptor utf8_adaptor;
-
-#if DCHECK_IS_ON()
-  // For sanity check only.
-  size_t original_size_in_bytes;
-#endif
-};
-
-class WTFStringContextImpl : public mojo::internal::WTFStringContext {
- public:
-  WTFStringContextImpl() {}
-  ~WTFStringContextImpl() override {}
-
-  std::queue<UTF8AdaptorInfo>& utf8_adaptors() { return utf8_adaptors_; }
-
- private:
-  // When serializing an object, we call GetSerializedSize_() recursively on
-  // all its elements/members to compute the total size, and then call
-  // Serialize*_() recursively in the same order to do the actual
-  // serialization. If some WTF::Strings need to be converted to UTF8, we don't
-  // want to do that twice. Therefore, we store a WTF::StringUTF8Adaptor for
-  // each in the first pass, and reuse it in the second pass.
-  std::queue<UTF8AdaptorInfo> utf8_adaptors_;
-
-  DISALLOW_COPY_AND_ASSIGN(WTFStringContextImpl);
-};
+using StringSerializer =
+    mojo::internal::Serializer<mojo::String, const WTF::String>;
 
 }  // namespace
 
+namespace WTF {
+
 size_t GetSerializedSize_(const WTF::String& input,
                           mojo::internal::SerializationContext* context) {
-  if (input.isNull())
-    return 0;
-
-  if (!context->wtf_string_context)
-    context->wtf_string_context.reset(new WTFStringContextImpl);
-
-  auto& utf8_adaptors =
-      static_cast<WTFStringContextImpl*>(context->wtf_string_context.get())
-          ->utf8_adaptors();
-
-  utf8_adaptors.emplace(input);
-
-  return mojo::internal::Align(sizeof(mojo::internal::String_Data) +
-                               utf8_adaptors.back().utf8_adaptor.length());
+  return StringSerializer::PrepareToSerialize(input, context);
 }
 
 void Serialize_(const WTF::String& input,
                 mojo::internal::Buffer* buf,
                 mojo::internal::String_Data** output,
                 mojo::internal::SerializationContext* context) {
-  if (input.isNull()) {
-    *output = nullptr;
-    return;
-  }
-
-  auto& utf8_adaptors =
-      static_cast<WTFStringContextImpl*>(context->wtf_string_context.get())
-          ->utf8_adaptors();
-
-  DCHECK(!utf8_adaptors.empty());
-#if DCHECK_IS_ON()
-  DCHECK_EQ(utf8_adaptors.front().original_size_in_bytes,
-            static_cast<size_t>(input.sizeInBytes()));
-#endif
-
-  const WTF::StringUTF8Adaptor& adaptor = utf8_adaptors.front().utf8_adaptor;
-
-  mojo::internal::String_Data* result =
-      mojo::internal::String_Data::New(adaptor.length(), buf);
-  if (result)
-    memcpy(result->storage(), adaptor.data(), adaptor.length());
-
-  utf8_adaptors.pop();
-
-  *output = result;
+  StringSerializer::Serialize(input, buf, output, context);
 }
 
 bool Deserialize_(mojo::internal::String_Data* input,
                   WTF::String* output,
                   mojo::internal::SerializationContext* context) {
-  if (input) {
-    WTF::String result = WTF::String::fromUTF8(input->storage(), input->size());
-    output->swap(result);
-  } else if (!output->isNull()) {
-    WTF::String result;
-    output->swap(result);
-  }
-  return true;
+  return StringSerializer::Deserialize(input, output, context);
 }
 
 }  // namespace WTF
diff --git a/mojo/public/cpp/bindings/lib/wtf_string_serialization.h b/mojo/public/cpp/bindings/lib/wtf_string_serialization.h
index a110265..17f0b4b 100644
--- a/mojo/public/cpp/bindings/lib/wtf_string_serialization.h
+++ b/mojo/public/cpp/bindings/lib/wtf_string_serialization.h
@@ -8,11 +8,13 @@
 #include <stddef.h>
 
 #include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/bindings_serialization.h"
+#include "mojo/public/cpp/bindings/lib/serialization_util.h"
 
 namespace WTF {
 class String;
 
+// TODO(yzshen): These methods are simply wrappers of the Serialzer interface.
+// Remove them.
 size_t GetSerializedSize_(const WTF::String& input,
                           mojo::internal::SerializationContext* context);
 void Serialize_(const WTF::String& input,
diff --git a/mojo/public/cpp/bindings/string_traits.h b/mojo/public/cpp/bindings/string_traits.h
new file mode 100644
index 0000000..c046854c
--- /dev/null
+++ b/mojo/public/cpp/bindings/string_traits.h
@@ -0,0 +1,20 @@
+// Copyright 2016 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 MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_H_
+#define MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_H_
+
+namespace mojo {
+
+// This must be specialized for any UserType to be serialized/deserialized as
+// a mojom string.
+//
+// TODO(yzshen): This is work in progress. Add better documentation once the
+// interface becomes more stable.
+template <typename UserType>
+struct StringTraits;
+
+}  // namespace mojo
+
+#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/string_traits_standard.h b/mojo/public/cpp/bindings/string_traits_standard.h
new file mode 100644
index 0000000..056546eb4
--- /dev/null
+++ b/mojo/public/cpp/bindings/string_traits_standard.h
@@ -0,0 +1,36 @@
+// Copyright 2016 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 MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STANDARD_H_
+#define MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STANDARD_H_
+
+#include "mojo/public/cpp/bindings/string.h"
+#include "mojo/public/cpp/bindings/string_traits.h"
+
+namespace mojo {
+
+template <>
+struct StringTraits<String> {
+  static bool IsNull(const String& input) { return input.is_null(); }
+
+  static size_t GetSize(const String& input) { return input.size(); }
+
+  static const char* GetData(const String& input) { return input.data(); }
+
+  // TODO(yzshen): Use a public type, such as mojo::String::DataView, for
+  // |input|.
+  static bool Read(internal::String_Data* input, String* output) {
+    if (input) {
+      String result(input->storage(), input->size());
+      result.Swap(output);
+    } else {
+      *output = nullptr;
+    }
+    return true;
+  }
+};
+
+}  // namespace mojo
+
+#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STANDARD_H_
diff --git a/mojo/public/cpp/bindings/string_traits_string_piece.h b/mojo/public/cpp/bindings/string_traits_string_piece.h
new file mode 100644
index 0000000..cc126ed
--- /dev/null
+++ b/mojo/public/cpp/bindings/string_traits_string_piece.h
@@ -0,0 +1,41 @@
+// Copyright 2016 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 MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STRING_PIECE_H_
+#define MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STRING_PIECE_H_
+
+#include "base/strings/string_piece.h"
+#include "mojo/public/cpp/bindings/string_traits.h"
+
+namespace mojo {
+
+template <>
+struct StringTraits<base::StringPiece> {
+  // No IsNull() function, which means that base::StringPiece is always
+  // considered as non-null mojom string. We could have let StringPiece
+  // containing a null data pointer map to null mojom string, but
+  // StringPiece::empty() returns true in this case. It seems confusing to mix
+  // the concept of empty and null strings, especially because they mean
+  // different things in mojom.
+
+  static size_t GetSize(const base::StringPiece& input) { return input.size(); }
+
+  static const char* GetData(const base::StringPiece& input) {
+    return input.data();
+  }
+
+  // TODO(yzshen): Use a public type, such as mojo::String::DataView, for
+  // |input|.
+  static bool Read(internal::String_Data* input, base::StringPiece* output) {
+    if (input)
+      output->set(input->storage(), input->size());
+    else
+      output->set(nullptr, 0);
+    return true;
+  }
+};
+
+}  // namespace mojo
+
+#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STRING_PIECE_H_
diff --git a/mojo/public/cpp/bindings/string_traits_wtf.h b/mojo/public/cpp/bindings/string_traits_wtf.h
new file mode 100644
index 0000000..f65592c
--- /dev/null
+++ b/mojo/public/cpp/bindings/string_traits_wtf.h
@@ -0,0 +1,32 @@
+// Copyright 2016 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 MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_WTF_H_
+#define MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_WTF_H_
+
+#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
+#include "mojo/public/cpp/bindings/string_traits.h"
+#include "third_party/WebKit/Source/wtf/text/WTFString.h"
+
+namespace mojo {
+
+template <>
+struct StringTraits<WTF::String> {
+  static bool IsNull(const WTF::String& input) { return input.isNull(); }
+
+  static void* SetUpContext(const WTF::String& input);
+  static void TearDownContext(const WTF::String& input, void* context);
+
+  static size_t GetSize(const WTF::String& input, void* context);
+
+  static const char* GetData(const WTF::String& input, void* context);
+
+  // TODO(yzshen): Use a public type, such as mojo::String::DataView, for
+  // |input|.
+  static bool Read(internal::String_Data* input, WTF::String* output);
+};
+
+}  // namespace mojo
+
+#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_WTF_H_
diff --git a/mojo/public/cpp/bindings/tests/bounds_checker_unittest.cc b/mojo/public/cpp/bindings/tests/bounds_checker_unittest.cc
index 8511890d..0d129a5 100644
--- a/mojo/public/cpp/bindings/tests/bounds_checker_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/bounds_checker_unittest.cc
@@ -7,8 +7,8 @@
 
 #include <limits>
 
-#include "mojo/public/cpp/bindings/lib/bindings_serialization.h"
 #include "mojo/public/cpp/bindings/lib/bounds_checker.h"
+#include "mojo/public/cpp/bindings/lib/serialization_util.h"
 #include "mojo/public/cpp/system/core.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/mojo/public/cpp/bindings/tests/buffer_unittest.cc b/mojo/public/cpp/bindings/tests/buffer_unittest.cc
index 3243940..d75bdd0 100644
--- a/mojo/public/cpp/bindings/tests/buffer_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/buffer_unittest.cc
@@ -6,8 +6,8 @@
 
 #include <limits>
 
-#include "mojo/public/cpp/bindings/lib/bindings_serialization.h"
 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
+#include "mojo/public/cpp/bindings/lib/serialization_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
diff --git a/mojo/public/cpp/bindings/tests/e2e_perftest.cc b/mojo/public/cpp/bindings/tests/e2e_perftest.cc
index cfa507b..30a83b8 100644
--- a/mojo/public/cpp/bindings/tests/e2e_perftest.cc
+++ b/mojo/public/cpp/bindings/tests/e2e_perftest.cc
@@ -161,6 +161,11 @@
   }
 };
 
+void CreateAndRunService(InterfaceRequest<test::EchoService> request,
+                         const base::Closure& cb) {
+  new EchoServiceImpl(std::move(request), cb);
+}
+
 DEFINE_TEST_CLIENT_TEST_WITH_PIPE(PingService, MojoE2EPerftest, mp) {
   MojoHandle service_mp;
   EXPECT_EQ("hello", ReadMessageWithHandles(mp, &service_mp, 1));
@@ -168,7 +173,12 @@
   InterfaceRequest<test::EchoService> request;
   request.Bind(ScopedMessagePipeHandle(MessagePipeHandle(service_mp)));
   base::RunLoop run_loop;
-  new EchoServiceImpl(std::move(request), run_loop.QuitClosure());
+  edk::test::GetIoTaskRunner()->PostTask(
+      FROM_HERE,
+      base::Bind(&CreateAndRunService, base::Passed(&request),
+                 base::Bind(base::IgnoreResult(&base::TaskRunner::PostTask),
+                            message_loop_.task_runner(), FROM_HERE,
+                            run_loop.QuitClosure())));
   run_loop.Run();
 }
 
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl
index 76888c79..014e8d57 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl
@@ -45,12 +45,9 @@
 {%- for method in interface.methods %}
 {%    if method.response_parameters != None %}
 {%-     if method.sync %}
-  virtual bool {{method.name}}({{interface_macros.declare_sync_method_params("", method)}}) {
-    // Sync method. This signature is used by the client side; the service side
-    // should implement the signature with callback below.
-    NOTREACHED();
-    return false;
-  }
+  // Sync method. This signature is used by the client side; the service side
+  // should implement the signature with callback below.
+  virtual bool {{method.name}}({{interface_macros.declare_sync_method_params("", method)}});
 {%-     endif %}
 
   using {{method.name}}Callback = {{interface_macros.declare_callback(method, for_blink)}};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
index 441a0b0..2100034 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
@@ -53,6 +53,16 @@
 {%-   endif %}
 {%- endfor %}
 
+
+{%- for method in interface.methods %}
+{%-   if method.sync %}
+bool {{class_name}}::{{method.name}}({{interface_macros.declare_sync_method_params("", method)}}) {
+  NOTREACHED();
+  return false;
+}
+{%-   endif %}
+{%- endfor %}
+
 {#--- ForwardToCallback definition #}
 {%- for method in interface.methods -%}
 {%-   if method.response_parameters != None %}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl
index 3a75bcf..5bbf6de 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl
@@ -26,10 +26,10 @@
 
 #include "base/logging.h"
 #include "base/trace_event/trace_event.h"
-#include "mojo/public/cpp/bindings/lib/bindings_serialization.h"
 #include "mojo/public/cpp/bindings/lib/bounds_checker.h"
 #include "mojo/public/cpp/bindings/lib/map_data_internal.h"
 #include "mojo/public/cpp/bindings/lib/message_builder.h"
+#include "mojo/public/cpp/bindings/lib/serialization_util.h"
 #include "mojo/public/cpp/bindings/lib/validate_params.h"
 #include "mojo/public/cpp/bindings/lib/validation_errors.h"
 #include "mojo/public/cpp/bindings/lib/validation_util.h"
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl
index 9a62cd4..d3fd5c0 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl
@@ -50,6 +50,7 @@
   mojo::internal::SerializationContext* context_;
 };
 
+{#- TODO(yzshen): Unify with the non-typemapped path. #}
 template <typename NativeType>
 struct {{struct.name}}_SerializerTraits_ {
   static size_t GetSize(const NativeType& input) {
@@ -62,11 +63,11 @@
         break;
 {%-   endif %}
 {%-   if pf.field.kind|is_string_kind %}
-      size += mojo::internal::Align(
-          mojo::internal::String_Data::Traits::GetStorageSize(
-              static_cast<uint32_t>(
-                  mojo::StructTraits<{{struct.name}}, NativeType>
-                      ::{{pf.field.name}}(input).size())));
+      size += mojo::internal::Serializer<
+          mojo::String, const base::StringPiece>::PrepareToSerialize(
+              mojo::StructTraits<{{struct.name}},
+                                 NativeType>::{{pf.field.name}}(input),
+              nullptr);
 {%-   elif pf.field.kind|is_object_kind %}
       NOTREACHED() << "Unsupported field type for StructTraits: "
                    << "{{pf.field.name}}";
@@ -91,12 +92,11 @@
         break;
 {%-   endif %}
 {%-   if kind|is_string_kind %}
-      base::StringPiece input_{{name}} =
-          mojo::StructTraits<{{struct.name}}, NativeType>::{{name}}(input);
-      result->{{name}}.ptr =
-          mojo::internal::String_Data::New(input_{{name}}.size(), buffer);
-      memcpy(result->{{name}}.ptr->storage(), input_{{name}}.data(),
-             input_{{name}}.size());
+      mojo::internal::Serializer<mojo::String,
+                                 const base::StringPiece>::Serialize(
+          mojo::StructTraits<{{struct.name}}, NativeType>::{{pf.field.name}}(
+              input),
+          buffer, &result->{{name}}.ptr, nullptr);
 {%-   elif kind|is_object_kind %}
       NOTREACHED() << "Unsupported field type for StructTraits: "
                    << "{{pf.field.name}}";
diff --git a/mojo/public/tools/bindings/mojom.gni b/mojo/public/tools/bindings/mojom.gni
index ccee9c3b..1d97898 100644
--- a/mojo/public/tools/bindings/mojom.gni
+++ b/mojo/public/tools/bindings/mojom.gni
@@ -388,7 +388,7 @@
         }
 
         srcjar_deps = [ ":$java_srcjar_target_name" ]
-        run_findbugs = false
+        run_findbugs_override = false
       }
     }
   }
diff --git a/net/android/junit/src/org/chromium/net/HttpNegotiateAuthenticatorTest.java b/net/android/junit/src/org/chromium/net/HttpNegotiateAuthenticatorTest.java
index de211a1..09485e3 100644
--- a/net/android/junit/src/org/chromium/net/HttpNegotiateAuthenticatorTest.java
+++ b/net/android/junit/src/org/chromium/net/HttpNegotiateAuthenticatorTest.java
@@ -98,7 +98,7 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        ContextUtils.initApplicationContextForJUnitTests(Robolectric.application);
+        ContextUtils.initApplicationContextForTests(Robolectric.application);
     }
 
     @After
diff --git a/net/base/address_list_unittest.cc b/net/base/address_list_unittest.cc
index 1e2fa427..7553463 100644
--- a/net/base/address_list_unittest.cc
+++ b/net/base/address_list_unittest.cc
@@ -52,7 +52,7 @@
         reinterpret_cast<struct sockaddr_in*>(storage[i].addr);
     storage[i].addr_len = sizeof(struct sockaddr_in);
     // Populating the address with { i, i, i, i }.
-    memset(&addr->sin_addr, i, kIPv4AddressSize);
+    memset(&addr->sin_addr, i, IPAddress::kIPv4AddressSize);
     addr->sin_family = AF_INET;
     // Set port to i << 2;
     addr->sin_port = base::HostToNet16(static_cast<uint16_t>(i << 2));
diff --git a/net/base/fuzzer_test_support.cc b/net/base/fuzzer_test_support.cc
index 7d5b8ea..f355c88 100644
--- a/net/base/fuzzer_test_support.cc
+++ b/net/base/fuzzer_test_support.cc
@@ -6,6 +6,7 @@
 #include "base/i18n/icu_util.h"
 #include "base/logging.h"
 #include "base/message_loop/message_loop.h"
+#include "base/metrics/statistics_recorder.h"
 
 namespace {
 
@@ -19,6 +20,10 @@
     // //net code. Initializing ICU is important to prevent fuzztests from
     // asserting when handling non-ASCII urls.
     CHECK(base::i18n::InitializeICU());
+
+    // Prevent every call to get a Histogram* from leaking memory. Instead, only
+    // the fist call to get each Histogram* leaks memory.
+    base::StatisticsRecorder::Initialize();
   }
 
   // A number of tests use async code which depends on there being a message
diff --git a/net/base/ip_address.cc b/net/base/ip_address.cc
index ea64065b..9edb0997 100644
--- a/net/base/ip_address.cc
+++ b/net/base/ip_address.cc
@@ -9,7 +9,6 @@
 #include "base/strings/string_piece.h"
 #include "base/strings/string_split.h"
 #include "base/strings/stringprintf.h"
-#include "net/base/ip_address_number.h"
 #include "net/base/parse_number.h"
 #include "url/gurl.h"
 #include "url/url_canon_ip.h"
@@ -135,7 +134,8 @@
 
 IPAddress::IPAddress() {}
 
-IPAddress::IPAddress(const IPAddressNumber& address) : ip_address_(address) {}
+IPAddress::IPAddress(const std::vector<uint8_t>& address)
+    : ip_address_(address) {}
 
 IPAddress::IPAddress(const IPAddress& other) = default;
 
diff --git a/net/base/ip_address.h b/net/base/ip_address.h
index 5ccddde..72348c17 100644
--- a/net/base/ip_address.h
+++ b/net/base/ip_address.h
@@ -13,7 +13,6 @@
 
 #include "base/compiler_specific.h"
 #include "base/strings/string_piece.h"
-#include "net/base/ip_address_number.h"
 #include "net/base/net_export.h"
 
 namespace net {
@@ -25,8 +24,9 @@
   // Creates a zero-sized, invalid address.
   IPAddress();
 
-  // Creates an IP address from a deprecated IPAddressNumber.
-  explicit IPAddress(const IPAddressNumber& address);
+  // Copies the input address to |ip_address_|. The input is expected to be in
+  // network byte order.
+  explicit IPAddress(const std::vector<uint8_t>& address);
 
   IPAddress(const IPAddress& other);
 
diff --git a/net/base/ip_address_number.h b/net/base/ip_address_number.h
deleted file mode 100644
index 4f8c249..0000000
--- a/net/base/ip_address_number.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 NET_BASE_IP_ADDRESS_NUMBER_H_
-#define NET_BASE_IP_ADDRESS_NUMBER_H_
-
-#include <vector>
-
-namespace net {
-
-// IPAddressNumber is used to represent an IP address's numeric value as an
-// array of bytes, from most significant to least significant. This is the
-// network byte ordering.
-//
-// IPv4 addresses will have length 4, whereas IPv6 address will have length 16.
-//
-// TODO(Martijnc): Remove the IPAddressNumber typedef. New code should use
-// IPAddress instead and existing code should be switched over.
-// https://crbug.com/496258
-typedef std::vector<unsigned char> IPAddressNumber;
-
-static const size_t kIPv4AddressSize = 4;
-static const size_t kIPv6AddressSize = 16;
-
-}  // namespace net
-
-#endif  // NET_BASE_IP_ADDRESS_NUMBER_H_
diff --git a/net/base/ip_endpoint.cc b/net/base/ip_endpoint.cc
index 150093c0..e24a5d6f 100644
--- a/net/base/ip_endpoint.cc
+++ b/net/base/ip_endpoint.cc
@@ -44,7 +44,7 @@
     const struct sockaddr_in* addr =
         reinterpret_cast<const struct sockaddr_in*>(sock_addr);
     *address = reinterpret_cast<const uint8_t*>(&addr->sin_addr);
-    *address_len = kIPv4AddressSize;
+    *address_len = IPAddress::kIPv4AddressSize;
     if (port)
       *port = base::NetToHost16(addr->sin_port);
     return true;
@@ -56,7 +56,7 @@
     const struct sockaddr_in6* addr =
         reinterpret_cast<const struct sockaddr_in6*>(sock_addr);
     *address = reinterpret_cast<const uint8_t*>(&addr->sin6_addr);
-    *address_len = kIPv6AddressSize;
+    *address_len = IPAddress::kIPv6AddressSize;
     if (port)
       *port = base::NetToHost16(addr->sin6_port);
     return true;
@@ -84,10 +84,6 @@
 
 IPEndPoint::~IPEndPoint() {}
 
-IPEndPoint::IPEndPoint(const IPAddressNumber& address, uint16_t port)
-    : address_(address), port_(port) {
-}
-
 IPEndPoint::IPEndPoint(const IPAddress& address, uint16_t port)
     : address_(address), port_(port) {}
 
@@ -102,9 +98,9 @@
 
 int IPEndPoint::GetSockAddrFamily() const {
   switch (address_.size()) {
-    case kIPv4AddressSize:
+    case IPAddress::kIPv4AddressSize:
       return AF_INET;
-    case kIPv6AddressSize:
+    case IPAddress::kIPv6AddressSize:
       return AF_INET6;
     default:
       NOTREACHED() << "Bad IP address";
@@ -117,7 +113,7 @@
   DCHECK(address);
   DCHECK(address_length);
   switch (address_.size()) {
-    case kIPv4AddressSize: {
+    case IPAddress::kIPv4AddressSize: {
       if (*address_length < kSockaddrInSize)
         return false;
       *address_length = kSockaddrInSize;
@@ -125,10 +121,11 @@
       memset(addr, 0, sizeof(struct sockaddr_in));
       addr->sin_family = AF_INET;
       addr->sin_port = base::HostToNet16(port_);
-      memcpy(&addr->sin_addr, &address_.bytes()[0], kIPv4AddressSize);
+      memcpy(&addr->sin_addr, address_.bytes().data(),
+             IPAddress::kIPv4AddressSize);
       break;
     }
-    case kIPv6AddressSize: {
+    case IPAddress::kIPv6AddressSize: {
       if (*address_length < kSockaddrIn6Size)
         return false;
       *address_length = kSockaddrIn6Size;
@@ -137,7 +134,8 @@
       memset(addr6, 0, sizeof(struct sockaddr_in6));
       addr6->sin6_family = AF_INET6;
       addr6->sin6_port = base::HostToNet16(port_);
-      memcpy(&addr6->sin6_addr, &address_.bytes()[0], kIPv6AddressSize);
+      memcpy(&addr6->sin6_addr, address_.bytes().data(),
+             IPAddress::kIPv6AddressSize);
       break;
     }
     default:
diff --git a/net/base/ip_endpoint.h b/net/base/ip_endpoint.h
index a1c12296..f9eb2775 100644
--- a/net/base/ip_endpoint.h
+++ b/net/base/ip_endpoint.h
@@ -26,8 +26,6 @@
  public:
   IPEndPoint();
   ~IPEndPoint();
-  // DEPRECATED(crbug.com/496258): Use the ctor that takes IPAddress instead.
-  IPEndPoint(const IPAddressNumber& address, uint16_t port);
   IPEndPoint(const IPAddress& address, uint16_t port);
   IPEndPoint(const IPEndPoint& endpoint);
 
diff --git a/net/base/linked_hash_map.h b/net/base/linked_hash_map.h
index e3d12d63..306ac52b 100644
--- a/net/base/linked_hash_map.h
+++ b/net/base/linked_hash_map.h
@@ -224,6 +224,19 @@
     return list_.size();
   }
 
+  template <typename... Args>
+  std::pair<iterator, bool> emplace(Args&&... args) {
+    ListType node_donor;
+    auto node_pos =
+        node_donor.emplace(node_donor.end(), std::forward<Args>(args)...);
+    const auto& k = node_pos->first;
+    auto ins = map_.insert({k, node_pos});
+    if (!ins.second)
+      return {ins.first->second, false};
+    list_.splice(list_.end(), node_donor, node_pos);
+    return {ins.first->second, true};
+  }
+
   void swap(linked_hash_map& other) {
     map_.swap(other.map_);
     list_.swap(other.list_);
diff --git a/net/cert/x509_certificate_ios.cc b/net/cert/x509_certificate_ios.cc
index 96ed1de..553c63a 100644
--- a/net/cert/x509_certificate_ios.cc
+++ b/net/cert/x509_certificate_ios.cc
@@ -16,7 +16,7 @@
 #include "base/strings/string_util.h"
 #include "crypto/openssl_util.h"
 #include "crypto/scoped_openssl_types.h"
-#include "net/base/ip_address_number.h"
+#include "net/base/ip_address.h"
 #include "net/cert/x509_util_openssl.h"
 #include "net/ssl/openssl_ssl_util.h"
 
@@ -136,8 +136,8 @@
       if (!ip_addr)
         continue;
       int ip_addr_len = name->d.iPAddress->length;
-      if (ip_addr_len != static_cast<int>(kIPv4AddressSize) &&
-          ip_addr_len != static_cast<int>(kIPv6AddressSize)) {
+      if (ip_addr_len != static_cast<int>(IPAddress::kIPv4AddressSize) &&
+          ip_addr_len != static_cast<int>(IPAddress::kIPv6AddressSize)) {
         // http://www.ietf.org/rfc/rfc3280.txt requires subjectAltName iPAddress
         // to have 4 or 16 bytes, whereas in a name constraint it includes a
         // net mask hence 8 or 32 bytes. Logging to help diagnose any mixup.
diff --git a/net/cert/x509_certificate_openssl.cc b/net/cert/x509_certificate_openssl.cc
index ec31e6e..dc1b4ee6 100644
--- a/net/cert/x509_certificate_openssl.cc
+++ b/net/cert/x509_certificate_openssl.cc
@@ -23,7 +23,7 @@
 #include "base/strings/string_util.h"
 #include "crypto/openssl_util.h"
 #include "crypto/scoped_openssl_types.h"
-#include "net/base/ip_address_number.h"
+#include "net/base/ip_address.h"
 #include "net/base/net_errors.h"
 #include "net/cert/x509_util_openssl.h"
 
@@ -125,8 +125,8 @@
       if (!ip_addr)
         continue;
       int ip_addr_len = name->d.iPAddress->length;
-      if (ip_addr_len != static_cast<int>(kIPv4AddressSize) &&
-          ip_addr_len != static_cast<int>(kIPv6AddressSize)) {
+      if (ip_addr_len != static_cast<int>(IPAddress::kIPv4AddressSize) &&
+          ip_addr_len != static_cast<int>(IPAddress::kIPv6AddressSize)) {
         // http://www.ietf.org/rfc/rfc3280.txt requires subjectAltName iPAddress
         // to have 4 or 16 bytes, whereas in a name constraint it includes a
         // net mask hence 8 or 32 bytes. Logging to help diagnose any mixup.
diff --git a/net/cert/x509_util_nss.cc b/net/cert/x509_util_nss.cc
index 134c085..04c34c5 100644
--- a/net/cert/x509_util_nss.cc
+++ b/net/cert/x509_util_nss.cc
@@ -25,7 +25,6 @@
 #include "crypto/nss_util_internal.h"
 #include "crypto/rsa_private_key.h"
 #include "crypto/scoped_nss_types.h"
-#include "crypto/third_party/nss/chromium-nss.h"
 #include "net/cert/x509_certificate.h"
 #include "net/cert/x509_util.h"
 #include "net/cert/x509_util_nss.h"
diff --git a/net/data/update_net_gypi.py b/net/data/update_net_gypi.py
new file mode 100644
index 0000000..af252b7
--- /dev/null
+++ b/net/data/update_net_gypi.py
@@ -0,0 +1,139 @@
+# Copyright 2016 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 os
+import re
+import StringIO
+import sys
+
+
+VARIABLE_PATTERN = re.compile("^(?P<indentation>\s*)'(?P<name>[^']*)':\s*\[$")
+EXCLUSION_PATTERN = re.compile("^(?:README|OWNERS|.*\.(pyc?|sh|swp)|.*~)$")
+
+DATA_SOURCES_PATH_FOR_VARIABLES = {
+  "net_test_support_data_sources": [
+    "net/data/ssl/certificates",
+  ],
+  "net_unittests_data_sources": [
+    "net/data/certificate_policies_unittest",
+    "net/data/name_constraints_unittest",
+    "net/data/parse_certificate_unittest",
+    "net/data/parse_ocsp_unittest",
+    "net/data/test.html",
+    "net/data/url_request_unittest",
+    "net/data/verify_certificate_chain_unittest",
+    "net/data/verify_name_match_unittest/names",
+    "net/data/verify_signed_data_unittest",
+    "net/third_party/nist-pkits/certs",
+    "net/third_party/nist-pkits/crls",
+  ],
+}
+
+
+def list_data_sources(root, paths, exclusion):
+  """Returns the list of data source found in |paths|.
+
+  Args:
+    root: string, path to the repository root
+    paths: list of string, paths relative to repository root
+    exclusion: compiled regular expression, filename matching this pattern
+        will be excluded from the result
+  """
+  data_sources = []
+  for path in paths:
+    fullpath = os.path.normpath(os.path.join(root, path))
+    if os.path.isfile(fullpath):
+      if not exclusion.match(os.path.basename(path)):
+        data_sources.append(path)
+      continue
+
+    for dirpath, dirnames, filenames in os.walk(fullpath):
+      for filename in filenames:
+        if not exclusion.match(filename):
+          data_sources.append(os.path.normpath(os.path.join(dirpath, filename)))
+  return data_sources
+
+
+def format_data_sources(name, dir, data_sources, indentation):
+  """Converts |data_sources| to a gyp variable assignment.
+
+  Args:
+    name: string, name of the variable
+    dir: string, path to the directory containing the gyp file
+    data_sources: list of filenames
+    indentation: string
+  """
+  buffer = StringIO.StringIO()
+  buffer.write("%s'%s': [\n" % (indentation, name))
+  for data_source in sorted(data_sources):
+    buffer.write("  %s'%s',\n" % (
+        indentation, os.path.relpath(data_source, dir)))
+  buffer.write("%s],\n" % (indentation,))
+  return buffer.getvalue()
+
+
+def save_file_if_changed(path, content):
+  """Writes |content| to file at |path| if file has changed.
+
+  Args:
+    path: string, path of the file to save
+    content: string, content to write to file
+  """
+  with open(path, "r") as file:
+    old_content = file.read()
+  if content != old_content:
+    with open(path, "w") as file:
+      file.write(content)
+    sys.stdout.write("updated %s, do not forget to run 'git add'\n" % (path,))
+
+
+def edit_file(path, root, data_sources_for_variables):
+  """Updates file at |path| by rewriting variables values.
+
+  Args:
+    path: string, path of the file to edit
+    root: string, path to the repository root
+    data_sources_for_variables: dictionary mapping variable names to
+        the list of data sources to use
+  """
+  dir = os.path.relpath(os.path.dirname(path), root)
+  buffer = StringIO.StringIO()
+  with open(path, "r") as file:
+    indentation = ""
+    current_var = None
+    for line in file:
+      if not current_var:
+        match = VARIABLE_PATTERN.match(line)
+        if not match:
+          buffer.write(line)
+          continue
+        variable = match.group("name")
+        if variable not in data_sources_for_variables:
+          buffer.write(line)
+          continue
+        current_var = variable
+        indentation = match.group("indentation")
+        buffer.write(format_data_sources(
+            variable, dir, data_sources_for_variables[variable], indentation))
+      else:
+        if line == indentation + "],\n":
+          current_var = None
+  save_file_if_changed(path, buffer.getvalue())
+
+
+def main(args):
+  root_dir = os.path.normpath(os.path.join(
+      os.path.dirname(__file__), os.pardir, os.pardir))
+  net_gypi = os.path.normpath(os.path.join(root_dir, "net", "net.gypi"))
+
+  data_sources_for_variables = {}
+  for variable in DATA_SOURCES_PATH_FOR_VARIABLES:
+    data_sources_for_variables[variable] = list_data_sources(
+        root_dir, DATA_SOURCES_PATH_FOR_VARIABLES[variable], EXCLUSION_PATTERN)
+
+  edit_file(net_gypi, root_dir, data_sources_for_variables)
+
+
+if __name__ == "__main__":
+  sys.exit(main(sys.argv[1:]))
diff --git a/net/dns/address_sorter_posix.h b/net/dns/address_sorter_posix.h
index 3f3840e..e370f22 100644
--- a/net/dns/address_sorter_posix.h
+++ b/net/dns/address_sorter_posix.h
@@ -30,7 +30,7 @@
   // Generic policy entry.
   struct PolicyEntry {
     // IPv4 addresses must be mapped to IPv6.
-    unsigned char prefix[kIPv6AddressSize];
+    unsigned char prefix[IPAddress::kIPv6AddressSize];
     unsigned prefix_length;
     unsigned value;
   };
diff --git a/net/dns/dns_test_util.cc b/net/dns/dns_test_util.cc
index 1237be1..16cefed 100644
--- a/net/dns/dns_test_util.cc
+++ b/net/dns/dns_test_util.cc
@@ -108,8 +108,9 @@
           const uint32_t kTTL = 86400;  // One day.
 
           // Size of RDATA which is a IPv4 or IPv6 address.
-          size_t rdata_size = qtype_ == dns_protocol::kTypeA ? kIPv4AddressSize
-                                                             : kIPv6AddressSize;
+          size_t rdata_size = qtype_ == dns_protocol::kTypeA
+                                  ? IPAddress::kIPv4AddressSize
+                                  : IPAddress::kIPv6AddressSize;
 
           // 12 is the sum of sizes of the compressed name reference, TYPE,
           // CLASS, TTL and RDLENGTH.
diff --git a/net/dns/record_rdata.cc b/net/dns/record_rdata.cc
index d413f4e..ff9434b 100644
--- a/net/dns/record_rdata.cc
+++ b/net/dns/record_rdata.cc
@@ -5,7 +5,6 @@
 #include "net/dns/record_rdata.h"
 
 #include "base/big_endian.h"
-#include "net/base/ip_address_number.h"
 #include "net/dns/dns_protocol.h"
 #include "net/dns/dns_response.h"
 
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index 66b3866d..bc23ba7 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -99,7 +99,6 @@
       parse_alternative_services(false),
       enable_alternative_service_with_different_host(false),
       enable_npn(false),
-      enable_brotli(false),
       enable_priority_dependencies(true),
       enable_quic(false),
       disable_quic_on_timeout_with_open_streams(false),
diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h
index c3cea43b..f0206fd 100644
--- a/net/http/http_network_session.h
+++ b/net/http/http_network_session.h
@@ -103,9 +103,6 @@
     // Enables NPN support.  Note that ALPN is always enabled.
     bool enable_npn;
 
-    // Enables Brotli Content-Encoding support.
-    bool enable_brotli;
-
     // Enable setting of HTTP/2 dependencies based on priority.
     bool enable_priority_dependencies;
 
diff --git a/net/http/http_stream_factory_impl_unittest.cc b/net/http/http_stream_factory_impl_unittest.cc
index 962527c..39094c7 100644
--- a/net/http/http_stream_factory_impl_unittest.cc
+++ b/net/http/http_stream_factory_impl_unittest.cc
@@ -1482,7 +1482,16 @@
  protected:
   HttpStreamFactoryBidirectionalQuicTest()
       : clock_(new MockClock),
-        packet_maker_(GetParam(), 0, clock_, "www.example.org"),
+        client_packet_maker_(GetParam(),
+                             0,
+                             clock_,
+                             "www.example.org",
+                             Perspective::IS_CLIENT),
+        server_packet_maker_(GetParam(),
+                             0,
+                             clock_,
+                             "www.example.org",
+                             Perspective::IS_SERVER),
         random_generator_(0),
         proxy_service_(ProxyService::CreateDirect()),
         ssl_config_service_(new SSLConfigServiceDefaults) {
@@ -1533,7 +1542,12 @@
         server, alternative_service_info_vector);
   };
 
-  test::QuicTestPacketMaker& packet_maker() { return packet_maker_; }
+  test::QuicTestPacketMaker& client_packet_maker() {
+    return client_packet_maker_;
+  }
+  test::QuicTestPacketMaker& server_packet_maker() {
+    return server_packet_maker_;
+  }
 
   MockClientSocketFactory& socket_factory() { return socket_factory_; }
 
@@ -1541,7 +1555,8 @@
 
  private:
   MockClock* clock_;  // Owned by QuicStreamFactory
-  test::QuicTestPacketMaker packet_maker_;
+  test::QuicTestPacketMaker client_packet_maker_;
+  test::QuicTestPacketMaker server_packet_maker_;
   MockClientSocketFactory socket_factory_;
   std::unique_ptr<HttpNetworkSession> session_;
   test::MockRandom random_generator_;
@@ -1567,15 +1582,15 @@
   SpdyPriority priority =
       ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
   size_t spdy_headers_frame_length;
-  mock_quic_data.AddWrite(packet_maker().MakeRequestHeadersPacket(
+  mock_quic_data.AddWrite(client_packet_maker().MakeRequestHeadersPacket(
       1, test::kClientDataStreamId1, /*should_include_version=*/true,
       /*fin=*/true, priority,
-      packet_maker().GetRequestHeaders("GET", "https", "/"),
+      client_packet_maker().GetRequestHeaders("GET", "https", "/"),
       &spdy_headers_frame_length));
   size_t spdy_response_headers_frame_length;
-  mock_quic_data.AddRead(packet_maker().MakeResponseHeadersPacket(
+  mock_quic_data.AddRead(server_packet_maker().MakeResponseHeadersPacket(
       1, test::kClientDataStreamId1, /*should_include_version=*/false,
-      /*fin=*/true, packet_maker().GetResponseHeaders("200"),
+      /*fin=*/true, server_packet_maker().GetResponseHeaders("200"),
       &spdy_response_headers_frame_length));
   mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);  // No more read data.
   mock_quic_data.AddSocketDataToFactory(&socket_factory());
@@ -1693,15 +1708,15 @@
   SpdyPriority priority =
       ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
   size_t spdy_headers_frame_length;
-  mock_quic_data.AddWrite(packet_maker().MakeRequestHeadersPacket(
+  mock_quic_data.AddWrite(client_packet_maker().MakeRequestHeadersPacket(
       1, test::kClientDataStreamId1, /*should_include_version=*/true,
       /*fin=*/true, priority,
-      packet_maker().GetRequestHeaders("GET", "https", "/"),
+      client_packet_maker().GetRequestHeaders("GET", "https", "/"),
       &spdy_headers_frame_length));
   size_t spdy_response_headers_frame_length;
-  mock_quic_data.AddRead(packet_maker().MakeResponseHeadersPacket(
+  mock_quic_data.AddRead(server_packet_maker().MakeResponseHeadersPacket(
       1, test::kClientDataStreamId1, /*should_include_version=*/false,
-      /*fin=*/true, packet_maker().GetResponseHeaders("200"),
+      /*fin=*/true, server_packet_maker().GetResponseHeaders("200"),
       &spdy_response_headers_frame_length));
   mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);  // No more read data.
   mock_quic_data.AddSocketDataToFactory(&socket_factory());
diff --git a/net/net.gyp b/net/net.gyp
index 95879db2..9147afe 100644
--- a/net/net.gyp
+++ b/net/net.gyp
@@ -224,7 +224,7 @@
           'conditions': [
             [ 'desktop_linux == 1 or chromeos == 1', {
               'dependencies': [
-                '../build/linux/system.gyp:ssl',
+                '../build/linux/system.gyp:nss',
               ],
             }, {  # desktop_linux == 0 and chromeos == 0
               'dependencies': [
@@ -656,7 +656,7 @@
           'conditions': [
             [ 'desktop_linux == 1 or chromeos == 1', {
               'dependencies': [
-                '../build/linux/system.gyp:ssl',
+                '../build/linux/system.gyp:nss',
               ],
             }, {  # desktop_linux == 0 and chromeos == 0
               'dependencies': [
diff --git a/net/net.gypi b/net/net.gypi
index b3868c1..c03a622 100644
--- a/net/net.gypi
+++ b/net/net.gypi
@@ -30,7 +30,6 @@
       'base/io_buffer.h',
       'base/ip_address.cc',
       'base/ip_address.h',
-      'base/ip_address_number.h',
       'base/ip_endpoint.cc',
       'base/ip_endpoint.h',
       'base/load_timing_info.cc',
@@ -231,7 +230,6 @@
       'quic/congestion_control/general_loss_algorithm.h',
       'quic/congestion_control/hybrid_slow_start.cc',
       'quic/congestion_control/hybrid_slow_start.h',
-      'quic/congestion_control/loss_detection_interface.cc',
       'quic/congestion_control/loss_detection_interface.h',
       'quic/congestion_control/pacing_sender.cc',
       'quic/congestion_control/pacing_sender.h',
@@ -1967,12 +1965,8 @@
       "websockets/websocket_stream.cc",
       "websockets/websocket_stream.h",
     ],
-    # List of test data files for //net:test_support. Can be regenerated with
-    # the following command:
-    #
-    #   for path in net/data/ssl/certificates; do
-    #     find "$path" -type f ! -name README -o -name OWNERS
-    #   done|sed -e "s:^net/\(.*\):      '\1',:"|sort
+    # List of test data files for //net:test_support. Can be regenerated by
+    # running net/data/update_net_gypi.py.
     'net_test_support_data_sources': [
       'data/ssl/certificates/1024-rsa-ee-by-1024-rsa-intermediate.pem',
       'data/ssl/certificates/1024-rsa-ee-by-2048-rsa-intermediate.pem',
@@ -2146,26 +2140,11 @@
       'data/ssl/certificates/www_us_army_mil_cert.der',
       'data/ssl/certificates/x509_verify_results.chain.pem',
     ],
-    # List of test data files for //net:net_unittests. Can be regenerated with
-    # the following command:
-    #
-    #   for path in net/data/certificate_policies_unittest \
-    #               net/data/name_constraints_unittest \
-    #               net/data/parse_certificate_unittest \
-    #               net/data/parse_ocsp_unittest \
-    #               net/data/test.html \
-    #               net/data/url_request_unittest \
-    #               net/data/verify_certificate_chain_unittest \
-    #               net/data/verify_name_match_unittest/names \
-    #               net/data/verify_signed_data_unittest \
-    #               net/third_party/nist-pkits/certs \
-    #               net/third_party/nist-pkits/crls; do
-    #     find "$path" -type f ! -name README -o -name OWNERS
-    #   done|sed -e "s:^net/\(.*\):      '\1',:"|sort
+    # List of test data files for //net:net_unittests. Can be regenerated by
+    # running net/data/update_net_gypi.py.
     'net_unittests_data_sources': [
       'data/certificate_policies_unittest/anypolicy.pem',
       'data/certificate_policies_unittest/anypolicy_with_qualifier.pem',
-      'data/certificate_policies_unittest/generate_policies.py',
       'data/certificate_policies_unittest/invalid-anypolicy_with_custom_qualifier.pem',
       'data/certificate_policies_unittest/invalid-empty.pem',
       'data/certificate_policies_unittest/invalid-policy_1_2_3_dupe.pem',
@@ -2196,7 +2175,6 @@
       'data/name_constraints_unittest/dnsname2.pem',
       'data/name_constraints_unittest/edipartyname-excluded.pem',
       'data/name_constraints_unittest/edipartyname-permitted.pem',
-      'data/name_constraints_unittest/generate_name_constraints.py',
       'data/name_constraints_unittest/invalid-empty_excluded_subtree.pem',
       'data/name_constraints_unittest/invalid-empty_permitted_subtree.pem',
       'data/name_constraints_unittest/invalid-no_subtrees.pem',
@@ -2307,7 +2285,6 @@
       'data/parse_certificate_unittest/tbs_validity_generalized_time_and_utc_time.pem',
       'data/parse_certificate_unittest/tbs_validity_relaxed.pem',
       'data/parse_certificate_unittest/tbs_validity_utc_time_and_generalized_time.pem',
-      'data/parse_ocsp_unittest/annotate_test_data.py',
       'data/parse_ocsp_unittest/bad_ocsp_type.pem',
       'data/parse_ocsp_unittest/bad_signature.pem',
       'data/parse_ocsp_unittest/bad_status.pem',
@@ -2391,34 +2368,10 @@
       'data/url_request_unittest/with-headers.html',
       'data/url_request_unittest/with-headers.html.mock-http-headers',
       'data/verify_certificate_chain_unittest/basic-constraints-pathlen-0-self-issued.pem',
-      'data/verify_certificate_chain_unittest/common.py',
       'data/verify_certificate_chain_unittest/expired-intermediary.pem',
       'data/verify_certificate_chain_unittest/expired-root.pem',
       'data/verify_certificate_chain_unittest/expired-target-notBefore.pem',
       'data/verify_certificate_chain_unittest/expired-target.pem',
-      'data/verify_certificate_chain_unittest/generate-all.sh',
-      'data/verify_certificate_chain_unittest/generate-basic-constraints-pathlen-0-self-issued.py',
-      'data/verify_certificate_chain_unittest/generate-expired-intermediary.py',
-      'data/verify_certificate_chain_unittest/generate-expired-target-notBefore.py',
-      'data/verify_certificate_chain_unittest/generate-expired-target.py',
-      'data/verify_certificate_chain_unittest/generate-intermediary-basic-constraints-ca-false.py',
-      'data/verify_certificate_chain_unittest/generate-intermediary-basic-constraints-not-critical.py',
-      'data/verify_certificate_chain_unittest/generate-intermediary-lacks-basic-constraints.py',
-      'data/verify_certificate_chain_unittest/generate-intermediary-lacks-signing-key-usage.py',
-      'data/verify_certificate_chain_unittest/generate-intermediary-signed-with-md5.py',
-      'data/verify_certificate_chain_unittest/generate-intermediary-unknown-critical-extension.py',
-      'data/verify_certificate_chain_unittest/generate-intermediary-unknown-non-critical-extension.py',
-      'data/verify_certificate_chain_unittest/generate-target-and-intermediary.py',
-      'data/verify_certificate_chain_unittest/generate-target-has-keycertsign-but-not-ca.py',
-      'data/verify_certificate_chain_unittest/generate-target-has-pathlen-but-not-ca.py',
-      'data/verify_certificate_chain_unittest/generate-target-not-end-entity.py',
-      'data/verify_certificate_chain_unittest/generate-target-signed-by-512bit-rsa.py',
-      'data/verify_certificate_chain_unittest/generate-target-signed-using-ecdsa.py',
-      'data/verify_certificate_chain_unittest/generate-target-signed-with-md5.py',
-      'data/verify_certificate_chain_unittest/generate-target-unknown-critical-extension.py',
-      'data/verify_certificate_chain_unittest/generate-target-wrong-signature.py',
-      'data/verify_certificate_chain_unittest/generate-unknown-root.py',
-      'data/verify_certificate_chain_unittest/generate-violates-basic-constraints-pathlen-0.py',
       'data/verify_certificate_chain_unittest/intermediary-basic-constraints-ca-false.pem',
       'data/verify_certificate_chain_unittest/intermediary-basic-constraints-not-critical.pem',
       'data/verify_certificate_chain_unittest/intermediary-lacks-basic-constraints.pem',
@@ -2429,7 +2382,6 @@
       'data/verify_certificate_chain_unittest/issuer-and-subject-not-byte-for-byte-equal-anchor.pem',
       'data/verify_certificate_chain_unittest/issuer-and-subject-not-byte-for-byte-equal.pem',
       'data/verify_certificate_chain_unittest/non-self-signed-root.pem',
-      'data/verify_certificate_chain_unittest/openssl_conf.py',
       'data/verify_certificate_chain_unittest/target-and-intermediary.pem',
       'data/verify_certificate_chain_unittest/target-has-keycertsign-but-not-ca.pem',
       'data/verify_certificate_chain_unittest/target-has-pathlen-but-not-ca.pem',
@@ -2523,7 +2475,6 @@
       'data/verify_name_match_unittest/names/unicode_supplementary-UTF8-unmangled.pem',
       'data/verify_name_match_unittest/names/valid-Name-empty.pem',
       'data/verify_name_match_unittest/names/valid-minimal.pem',
-      'data/verify_signed_data_unittest/annotate_test_data.py',
       'data/verify_signed_data_unittest/ecdsa-prime256v1-sha512-spki-params-null.pem',
       'data/verify_signed_data_unittest/ecdsa-prime256v1-sha512-unused-bits-signature.pem',
       'data/verify_signed_data_unittest/ecdsa-prime256v1-sha512-using-ecdh-key.pem',
diff --git a/net/net_common.gypi b/net/net_common.gypi
index 54bd346..fc5649f 100644
--- a/net/net_common.gypi
+++ b/net/net_common.gypi
@@ -109,7 +109,7 @@
     }],
     [ 'use_nss_certs == 1', {
         'dependencies': [
-          '../build/linux/system.gyp:ssl',
+          '../build/linux/system.gyp:nss',
         ],
       }, {
         'sources!': [
diff --git a/net/quic/bidirectional_stream_quic_impl_unittest.cc b/net/quic/bidirectional_stream_quic_impl_unittest.cc
index 7110a7e..d8e98e7 100644
--- a/net/quic/bidirectional_stream_quic_impl_unittest.cc
+++ b/net/quic/bidirectional_stream_quic_impl_unittest.cc
@@ -295,7 +295,16 @@
         read_buffer_(new IOBufferWithSize(4096)),
         connection_id_(2),
         stream_id_(kClientDataStreamId1),
-        maker_(GetParam(), connection_id_, &clock_, kDefaultServerHostName),
+        client_maker_(GetParam(),
+                      connection_id_,
+                      &clock_,
+                      kDefaultServerHostName,
+                      Perspective::IS_CLIENT),
+        server_maker_(GetParam(),
+                      connection_id_,
+                      &clock_,
+                      kDefaultServerHostName,
+                      Perspective::IS_SERVER),
         random_generator_(0) {
     IPAddress ip(192, 0, 2, 33);
     peer_addr_ = IPEndPoint(ip, 443);
@@ -371,11 +380,11 @@
   void SetRequest(const std::string& method,
                   const std::string& path,
                   RequestPriority priority) {
-    request_headers_ = maker_.GetRequestHeaders(method, "http", path);
+    request_headers_ = client_maker_.GetRequestHeaders(method, "http", path);
   }
 
   SpdyHeaderBlock ConstructResponseHeaders(const std::string& response_code) {
-    return maker_.GetResponseHeaders(response_code);
+    return server_maker_.GetResponseHeaders(response_code);
   }
 
   std::unique_ptr<QuicReceivedPacket> ConstructDataPacket(
@@ -383,24 +392,36 @@
       bool should_include_version,
       bool fin,
       QuicStreamOffset offset,
-      base::StringPiece data) {
-    std::unique_ptr<QuicReceivedPacket> packet(maker_.MakeDataPacket(
+      base::StringPiece data,
+      QuicTestPacketMaker* maker) {
+    std::unique_ptr<QuicReceivedPacket> packet(maker->MakeDataPacket(
         packet_number, stream_id_, should_include_version, fin, offset, data));
     DVLOG(2) << "packet(" << packet_number << "): " << std::endl
              << QuicUtils::StringToHexASCIIDump(packet->AsStringPiece());
     return packet;
   }
+
+  std::unique_ptr<QuicReceivedPacket> ConstructServerDataPacket(
+      QuicPacketNumber packet_number,
+      bool should_include_version,
+      bool fin,
+      QuicStreamOffset offset,
+      base::StringPiece data) {
+    return ConstructDataPacket(packet_number, should_include_version, fin,
+                               offset, data, &server_maker_);
+  }
+
   // Construct a data packet with multiple data frames
-  std::unique_ptr<QuicReceivedPacket> ConstructMultipleDataFramesPacket(
+  std::unique_ptr<QuicReceivedPacket> ConstructClientMultipleDataFramesPacket(
       QuicPacketNumber packet_number,
       bool should_include_version,
       bool fin,
       QuicStreamOffset offset,
       const std::vector<std::string>& data_writes) {
     std::unique_ptr<QuicReceivedPacket> packet(
-        maker_.MakeMultipleDataFramesPacket(packet_number, stream_id_,
-                                            should_include_version, fin, offset,
-                                            data_writes));
+        client_maker_.MakeMultipleDataFramesPacket(packet_number, stream_id_,
+                                                   should_include_version, fin,
+                                                   offset, data_writes));
     DVLOG(2) << "packet(" << packet_number << "): " << std::endl
              << QuicUtils::StringToHexASCIIDump(packet->AsStringPiece());
     return packet;
@@ -413,7 +434,7 @@
       size_t* spdy_headers_frame_length) {
     SpdyPriority priority =
         ConvertRequestPriorityToQuicPriority(request_priority);
-    return maker_.MakeRequestHeadersPacket(
+    return client_maker_.MakeRequestHeadersPacket(
         packet_number, stream_id_, kIncludeVersion, fin, priority,
         request_headers_, spdy_headers_frame_length);
   }
@@ -428,7 +449,7 @@
     SpdyPriority priority =
         ConvertRequestPriorityToQuicPriority(request_priority);
     std::unique_ptr<QuicReceivedPacket> packet(
-        maker_.MakeRequestHeadersAndMultipleDataFramesPacket(
+        client_maker_.MakeRequestHeadersAndMultipleDataFramesPacket(
             packet_number, stream_id_, kIncludeVersion, fin, priority,
             request_headers_, spdy_headers_frame_length, data));
     DVLOG(2) << "packet(" << packet_number << "): " << std::endl
@@ -442,7 +463,7 @@
       const SpdyHeaderBlock& response_headers,
       size_t* spdy_headers_frame_length,
       QuicStreamOffset* offset) {
-    return maker_.MakeResponseHeadersPacket(
+    return server_maker_.MakeResponseHeadersPacket(
         packet_number, stream_id_, !kIncludeVersion, fin, response_headers,
         spdy_headers_frame_length, offset);
   }
@@ -453,33 +474,39 @@
       const SpdyHeaderBlock& trailers,
       size_t* spdy_headers_frame_length,
       QuicStreamOffset* offset) {
-    return maker_.MakeResponseHeadersPacket(packet_number, stream_id_,
-                                            !kIncludeVersion, fin, trailers,
-                                            spdy_headers_frame_length, offset);
+    return server_maker_.MakeResponseHeadersPacket(
+        packet_number, stream_id_, !kIncludeVersion, fin, trailers,
+        spdy_headers_frame_length, offset);
   }
 
-  std::unique_ptr<QuicReceivedPacket> ConstructRstStreamPacket(
+  std::unique_ptr<QuicReceivedPacket> ConstructClientRstStreamPacket(
       QuicPacketNumber packet_number) {
-    return ConstructRstStreamCancelledPacket(packet_number, 0);
+    return ConstructRstStreamCancelledPacket(packet_number, 0, &client_maker_);
+  }
+
+  std::unique_ptr<QuicReceivedPacket> ConstructServerRstStreamPacket(
+      QuicPacketNumber packet_number) {
+    return ConstructRstStreamCancelledPacket(packet_number, 0, &server_maker_);
   }
 
   std::unique_ptr<QuicReceivedPacket> ConstructRstStreamCancelledPacket(
       QuicPacketNumber packet_number,
-      size_t bytes_written) {
+      size_t bytes_written,
+      QuicTestPacketMaker* maker) {
     std::unique_ptr<QuicReceivedPacket> packet(
-        maker_.MakeRstPacket(packet_number, !kIncludeVersion, stream_id_,
+        maker->MakeRstPacket(packet_number, !kIncludeVersion, stream_id_,
                              QUIC_STREAM_CANCELLED, bytes_written));
     DVLOG(2) << "packet(" << packet_number << "): " << std::endl
              << QuicUtils::StringToHexASCIIDump(packet->AsStringPiece());
     return packet;
   }
 
-  std::unique_ptr<QuicReceivedPacket> ConstructAckAndRstStreamPacket(
+  std::unique_ptr<QuicReceivedPacket> ConstructClientAckAndRstStreamPacket(
       QuicPacketNumber packet_number,
       QuicPacketNumber largest_received,
       QuicPacketNumber ack_least_unacked,
       QuicPacketNumber stop_least_unacked) {
-    return maker_.MakeAckAndRstPacket(
+    return client_maker_.MakeAckAndRstPacket(
         packet_number, !kIncludeVersion, stream_id_, QUIC_STREAM_CANCELLED,
         largest_received, ack_least_unacked, stop_least_unacked,
         !kIncludeCongestionFeedback);
@@ -492,8 +519,9 @@
       QuicPacketNumber least_unacked,
       bool fin,
       QuicStreamOffset offset,
-      base::StringPiece data) {
-    std::unique_ptr<QuicReceivedPacket> packet(maker_.MakeAckAndDataPacket(
+      base::StringPiece data,
+      QuicTestPacketMaker* maker) {
+    std::unique_ptr<QuicReceivedPacket> packet(maker->MakeAckAndDataPacket(
         packet_number, should_include_version, stream_id_, largest_received,
         least_unacked, fin, offset, data));
     DVLOG(2) << "packet(" << packet_number << "): " << std::endl
@@ -501,19 +529,29 @@
     return packet;
   }
 
-  std::unique_ptr<QuicReceivedPacket> ConstructAckPacket(
+  std::unique_ptr<QuicReceivedPacket> ConstructClientAckPacket(
       QuicPacketNumber packet_number,
       QuicPacketNumber largest_received,
       QuicPacketNumber least_unacked) {
-    return maker_.MakeAckPacket(packet_number, largest_received, least_unacked,
-                                !kIncludeCongestionFeedback);
+    return client_maker_.MakeAckPacket(packet_number, largest_received,
+                                       least_unacked,
+                                       !kIncludeCongestionFeedback);
+  }
+
+  std::unique_ptr<QuicReceivedPacket> ConstructServerAckPacket(
+      QuicPacketNumber packet_number,
+      QuicPacketNumber largest_received,
+      QuicPacketNumber least_unacked) {
+    return server_maker_.MakeAckPacket(packet_number, largest_received,
+                                       least_unacked,
+                                       !kIncludeCongestionFeedback);
   }
 
   const BoundTestNetLog& net_log() const { return net_log_; }
 
   QuicChromiumClientSession* session() const { return session_.get(); }
 
- private:
+ protected:
   BoundTestNetLog net_log_;
   scoped_refptr<TestTaskRunner> runner_;
   std::unique_ptr<MockWrite[]> mock_writes_;
@@ -530,7 +568,8 @@
   SpdyHeaderBlock request_headers_;
   const QuicConnectionId connection_id_;
   const QuicStreamId stream_id_;
-  QuicTestPacketMaker maker_;
+  QuicTestPacketMaker client_maker_;
+  QuicTestPacketMaker server_maker_;
   IPEndPoint self_addr_;
   IPEndPoint peer_addr_;
   MockRandom random_generator_;
@@ -550,7 +589,7 @@
   AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY,
                                          &spdy_request_headers_frame_length));
 
-  AddWrite(ConstructAckPacket(2, 3, 1));
+  AddWrite(ConstructClientAckPacket(2, 3, 1));
   Initialize();
 
   BidirectionalStreamRequestInfo request;
@@ -566,7 +605,7 @@
   delegate->WaitUntilNextCallback();  // OnStreamReady
 
   // Server acks the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   // Server sends the response headers.
   SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
@@ -585,7 +624,7 @@
   const char kResponseBody[] = "Hello world!";
   // Server sends data.
   ProcessPacket(
-      ConstructDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody));
+      ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody));
   EXPECT_EQ(12, cb.WaitForResult());
 
   EXPECT_EQ(std::string(kResponseBody), delegate->data_received());
@@ -645,12 +684,12 @@
       1, !kFin, DEFAULT_PRIORITY, &spdy_request_headers_frame_length,
       two_writes));
   // Ack server's data packet.
-  AddWrite(ConstructAckPacket(2, 3, 1));
+  AddWrite(ConstructClientAckPacket(2, 3, 1));
   const char kBody3[] = "hello there";
   const char kBody4[] = "another piece of small data";
   const char kBody5[] = "really small";
   QuicStreamOffset data_offset = strlen(kBody1) + strlen(kBody2);
-  AddWrite(ConstructMultipleDataFramesPacket(
+  AddWrite(ConstructClientMultipleDataFramesPacket(
       3, !kIncludeVersion, kFin, data_offset, {kBody3, kBody4, kBody5}));
 
   Initialize();
@@ -678,7 +717,7 @@
   delegate->WaitUntilNextCallback();  // OnDataSent
 
   // Server acks the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   // Server sends the response headers.
   SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
@@ -696,7 +735,7 @@
   const char kResponseBody[] = "Hello world!";
   // Server sends data.
   ProcessPacket(
-      ConstructDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody));
+      ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody));
 
   EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), cb.WaitForResult());
 
@@ -741,8 +780,9 @@
   size_t spdy_request_headers_frame_length;
   AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
                                          &spdy_request_headers_frame_length));
-  AddWrite(ConstructDataPacket(2, kIncludeVersion, kFin, 0, kUploadData));
-  AddWrite(ConstructAckPacket(3, 3, 1));
+  AddWrite(ConstructDataPacket(2, kIncludeVersion, kFin, 0, kUploadData,
+                               &client_maker_));
+  AddWrite(ConstructClientAckPacket(3, 3, 1));
 
   Initialize();
 
@@ -765,7 +805,7 @@
   delegate->WaitUntilNextCallback();  // OnDataSent
 
   // Server acks the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   // Server sends the response headers.
   SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
@@ -783,7 +823,7 @@
   const char kResponseBody[] = "Hello world!";
   // Server sends data.
   ProcessPacket(
-      ConstructDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody));
+      ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody));
 
   EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), cb.WaitForResult());
 
@@ -818,9 +858,10 @@
   AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
                                          &spdy_request_headers_frame_length));
   AddWrite(ConstructAckAndDataPacket(2, !kIncludeVersion, 2, 1, !kFin, 0,
-                                     kUploadData));
+                                     kUploadData, &client_maker_));
   AddWrite(ConstructAckAndDataPacket(3, !kIncludeVersion, 3, 3, kFin,
-                                     strlen(kUploadData), kUploadData));
+                                     strlen(kUploadData), kUploadData,
+                                     &client_maker_));
   Initialize();
 
   BidirectionalStreamRequestInfo request;
@@ -836,7 +877,7 @@
   delegate->WaitUntilNextCallback();  // OnStreamReady
 
   // Server acks the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   // Server sends the response headers.
   SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
@@ -860,7 +901,7 @@
 
   // Server sends a data packet.
   ProcessPacket(ConstructAckAndDataPacket(3, !kIncludeVersion, 2, 1, !kFin, 0,
-                                          kResponseBody));
+                                          kResponseBody, &server_maker_));
 
   EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), cb.WaitForResult());
   EXPECT_EQ(std::string(kResponseBody), delegate->data_received());
@@ -872,8 +913,9 @@
   TestCompletionCallback cb2;
   rv = delegate->ReadData(cb2.callback());
   EXPECT_EQ(ERR_IO_PENDING, rv);
-  ProcessPacket(ConstructAckAndDataPacket(
-      4, !kIncludeVersion, 3, 1, kFin, strlen(kResponseBody), kResponseBody));
+  ProcessPacket(ConstructAckAndDataPacket(4, !kIncludeVersion, 3, 1, kFin,
+                                          strlen(kResponseBody), kResponseBody,
+                                          &server_maker_));
 
   EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), cb2.WaitForResult());
 
@@ -913,7 +955,7 @@
   delegate->WaitUntilNextCallback();  // OnStreamReady
 
   // Server sends a Rst.
-  ProcessPacket(ConstructRstStreamPacket(1));
+  ProcessPacket(ConstructServerRstStreamPacket(1));
 
   delegate->WaitUntilNextCallback();  // OnFailed
   TestCompletionCallback cb;
@@ -935,7 +977,7 @@
   AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY,
                                          &spdy_request_headers_frame_length));
   // Why does QUIC ack Rst? Is this expected?
-  AddWrite(ConstructAckPacket(2, 3, 1));
+  AddWrite(ConstructClientAckPacket(2, 3, 1));
 
   Initialize();
 
@@ -952,7 +994,7 @@
   delegate->WaitUntilNextCallback();  // OnStreamReady
 
   // Server acks the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   // Server sends the response headers.
   SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
@@ -971,7 +1013,7 @@
   EXPECT_EQ(ERR_IO_PENDING, rv);
 
   // Server sends a Rst.
-  ProcessPacket(ConstructRstStreamPacket(3));
+  ProcessPacket(ConstructServerRstStreamPacket(3));
 
   delegate->WaitUntilNextCallback();  // OnFailed
 
@@ -991,8 +1033,9 @@
   AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
                                          &spdy_request_headers_frame_length));
   AddWrite(ConstructAckAndDataPacket(2, !kIncludeVersion, 2, 1, !kFin, 0,
-                                     kUploadData));
-  AddWrite(ConstructRstStreamCancelledPacket(3, strlen(kUploadData)));
+                                     kUploadData, &client_maker_));
+  AddWrite(ConstructRstStreamCancelledPacket(3, strlen(kUploadData),
+                                             &client_maker_));
 
   Initialize();
 
@@ -1009,7 +1052,7 @@
   delegate->WaitUntilNextCallback();  // OnStreamReady
 
   // Server acks the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   // Server sends the response headers.
   SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
@@ -1059,7 +1102,7 @@
   delegate->WaitUntilNextCallback();  // OnStreamReady
 
   // Server acks the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   // Server sends the response headers.
   SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
@@ -1096,7 +1139,7 @@
   size_t spdy_request_headers_frame_length;
   AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
                                          &spdy_request_headers_frame_length));
-  AddWrite(ConstructAckAndRstStreamPacket(2, 2, 1, 1));
+  AddWrite(ConstructClientAckAndRstStreamPacket(2, 2, 1, 1));
 
   Initialize();
 
@@ -1113,7 +1156,7 @@
   delegate->WaitUntilNextCallback();  // OnStreamReady
 
   // Server acks the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   // Server sends the response headers.
   SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
@@ -1145,7 +1188,7 @@
   size_t spdy_request_headers_frame_length;
   AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
                                          &spdy_request_headers_frame_length));
-  AddWrite(ConstructAckAndRstStreamPacket(2, 2, 1, 1));
+  AddWrite(ConstructClientAckAndRstStreamPacket(2, 2, 1, 1));
 
   Initialize();
 
@@ -1163,7 +1206,7 @@
   delegate->WaitUntilNextCallback();  // OnStreamReady
 
   // Server acks the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   // Server sends the response headers.
   SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
@@ -1187,8 +1230,8 @@
   size_t spdy_request_headers_frame_length;
   AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
                                          &spdy_request_headers_frame_length));
-  AddWrite(ConstructAckPacket(2, 3, 1));
-  AddWrite(ConstructRstStreamPacket(3));
+  AddWrite(ConstructClientAckPacket(2, 3, 1));
+  AddWrite(ConstructClientRstStreamPacket(3));
 
   Initialize();
 
@@ -1206,7 +1249,7 @@
   delegate->WaitUntilNextCallback();  // OnStreamReady
 
   // Server acks the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   // Server sends the response headers.
   SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
@@ -1226,7 +1269,7 @@
   const char kResponseBody[] = "Hello world!";
   // Server sends data.
   ProcessPacket(
-      ConstructDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody));
+      ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody));
   EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), cb.WaitForResult());
 
   base::MessageLoop::current()->RunUntilIdle();
@@ -1240,7 +1283,7 @@
   size_t spdy_request_headers_frame_length;
   AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY,
                                          &spdy_request_headers_frame_length));
-  AddWrite(ConstructAckPacket(2, 3, 1));  // Ack the data packet
+  AddWrite(ConstructClientAckPacket(2, 3, 1));  // Ack the data packet
 
   Initialize();
 
@@ -1258,7 +1301,7 @@
   delegate->WaitUntilNextCallback();  // OnStreamReady
 
   // Server acks the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   // Server sends the response headers.
   SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
@@ -1279,7 +1322,7 @@
   const char kResponseBody[] = "Hello world!";
   // Server sends data.
   ProcessPacket(
-      ConstructDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody));
+      ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody));
 
   EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), cb.WaitForResult());
   EXPECT_EQ(std::string(kResponseBody), delegate->data_received());
diff --git a/net/quic/congestion_control/loss_detection_interface.cc b/net/quic/congestion_control/loss_detection_interface.cc
deleted file mode 100644
index bf89428..0000000
--- a/net/quic/congestion_control/loss_detection_interface.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2014 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/quic/congestion_control/loss_detection_interface.h"
-
-#include "net/quic/congestion_control/general_loss_algorithm.h"
-#include "net/quic/quic_bug_tracker.h"
-#include "net/quic/quic_flags.h"
-
-namespace net {
-
-// Factory for loss detection algorithm.
-LossDetectionInterface* LossDetectionInterface::Create(
-    LossDetectionType loss_type) {
-  return new GeneralLossAlgorithm(loss_type);
-}
-
-}  // namespace net
diff --git a/net/quic/congestion_control/loss_detection_interface.h b/net/quic/congestion_control/loss_detection_interface.h
index 323c2fd7..b68ea29 100644
--- a/net/quic/congestion_control/loss_detection_interface.h
+++ b/net/quic/congestion_control/loss_detection_interface.h
@@ -18,9 +18,6 @@
 
 class NET_EXPORT_PRIVATE LossDetectionInterface {
  public:
-  // Creates a TCP loss detector.
-  static LossDetectionInterface* Create(LossDetectionType loss_type);
-
   virtual ~LossDetectionInterface() {}
 
   virtual LossDetectionType GetLossDetectionType() const = 0;
diff --git a/net/quic/congestion_control/pacing_sender.cc b/net/quic/congestion_control/pacing_sender.cc
index 8b1e535..80ee60f 100644
--- a/net/quic/congestion_control/pacing_sender.cc
+++ b/net/quic/congestion_control/pacing_sender.cc
@@ -4,6 +4,8 @@
 
 #include "net/quic/congestion_control/pacing_sender.h"
 
+#include "net/quic/quic_flags.h"
+
 using std::min;
 
 namespace net {
@@ -14,6 +16,7 @@
     : sender_(sender),
       alarm_granularity_(alarm_granularity),
       initial_packet_burst_(initial_packet_burst),
+      max_pacing_rate_(QuicBandwidth::Zero()),
       burst_tokens_(initial_packet_burst),
       last_delayed_packet_sent_time_(QuicTime::Zero()),
       ideal_next_packet_send_time_(QuicTime::Zero()),
@@ -41,6 +44,10 @@
   sender_->SetMaxCongestionWindow(max_congestion_window);
 }
 
+void PacingSender::SetMaxPacingRate(QuicBandwidth max_pacing_rate) {
+  max_pacing_rate_ = max_pacing_rate;
+}
+
 void PacingSender::OnCongestionEvent(bool rtt_updated,
                                      QuicByteCount bytes_in_flight,
                                      const CongestionVector& acked_packets,
@@ -79,7 +86,7 @@
   }
   // The next packet should be sent as soon as the current packets has been
   // transferred.
-  QuicTime::Delta delay = sender_->PacingRate().TransferTime(bytes);
+  QuicTime::Delta delay = PacingRate().TransferTime(bytes);
   // If the last send was delayed, and the alarm took a long time to get
   // invoked, allow the connection to make up for lost time.
   if (was_last_send_delayed_) {
@@ -144,6 +151,11 @@
 }
 
 QuicBandwidth PacingSender::PacingRate() const {
+  if (FLAGS_quic_max_pacing_rate && !max_pacing_rate_.IsZero()) {
+    return QuicBandwidth::FromBitsPerSecond(
+        min(max_pacing_rate_.ToBitsPerSecond(),
+            sender_->PacingRate().ToBitsPerSecond()));
+  }
   return sender_->PacingRate();
 }
 
diff --git a/net/quic/congestion_control/pacing_sender.h b/net/quic/congestion_control/pacing_sender.h
index 5c48320..f1e2895f 100644
--- a/net/quic/congestion_control/pacing_sender.h
+++ b/net/quic/congestion_control/pacing_sender.h
@@ -36,6 +36,8 @@
                uint32_t initial_packet_burst);
   ~PacingSender() override;
 
+  void SetMaxPacingRate(QuicBandwidth max_pacing_rate);
+
   // SendAlgorithmInterface methods.
   void SetFromConfig(const QuicConfig& config,
                      Perspective perspective) override;
@@ -74,6 +76,9 @@
   // Configured maximum size of the burst coming out of quiescence.  The burst
   // is never larger than the current CWND in packets.
   const uint32_t initial_packet_burst_;
+  // If not QuicBandidth::Zero, the maximum rate the PacingSender will use.
+  QuicBandwidth max_pacing_rate_;
+
   // Number of unpaced packets to be sent before packets are delayed.
   uint32_t burst_tokens_;
   // Send time of the last packet considered delayed.
diff --git a/net/quic/quic_chromium_client_session_test.cc b/net/quic/quic_chromium_client_session_test.cc
index 15f50be..68443526 100644
--- a/net/quic/quic_chromium_client_session_test.cc
+++ b/net/quic/quic_chromium_client_session_test.cc
@@ -66,7 +66,16 @@
         random_(0),
         helper_(&clock_, &random_),
         alarm_factory_(base::ThreadTaskRunnerHandle::Get().get(), &clock_),
-        maker_(GetParam(), 0, &clock_, kServerHostname) {
+        client_maker_(GetParam(),
+                      0,
+                      &clock_,
+                      kServerHostname,
+                      Perspective::IS_CLIENT),
+        server_maker_(GetParam(),
+                      0,
+                      &clock_,
+                      kServerHostname,
+                      Perspective::IS_SERVER) {
     // Advance the time, because timers do not like uninitialized times.
     clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
   }
@@ -135,7 +144,8 @@
   std::unique_ptr<QuicChromiumClientSession> session_;
   QuicConnectionVisitorInterface* visitor_;
   TestCompletionCallback callback_;
-  QuicTestPacketMaker maker_;
+  QuicTestPacketMaker client_maker_;
+  QuicTestPacketMaker server_maker_;
   ProofVerifyDetailsChromium verify_details_;
   QuicClientPushPromiseIndex push_promise_index_;
 };
@@ -151,7 +161,7 @@
 
 TEST_P(QuicChromiumClientSessionTest, MaxNumStreams) {
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
+  std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
       1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
   MockWrite writes[] = {
       MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1)};
@@ -186,7 +196,7 @@
 
 TEST_P(QuicChromiumClientSessionTest, MaxNumStreamsViaRequest) {
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
+  std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
       1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
   MockWrite writes[] = {
       MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1)};
@@ -334,16 +344,20 @@
   CompleteCryptoHandshake();
 
   char data[] = "ABCD";
-  std::unique_ptr<QuicEncryptedPacket> ping(
-      maker_.MakePingPacket(1, /*include_version=*/false));
+  std::unique_ptr<QuicEncryptedPacket> client_ping(
+      client_maker_.MakePingPacket(1, /*include_version=*/false));
+  std::unique_ptr<QuicEncryptedPacket> server_ping(
+      server_maker_.MakePingPacket(1, /*include_version=*/false));
   std::unique_ptr<QuicEncryptedPacket> ack_and_data_out(
-      maker_.MakeAckAndDataPacket(2, false, 5, 1, 1, false, 0,
-                                  StringPiece(data)));
-  MockRead reads[] = {MockRead(SYNCHRONOUS, ping->data(), ping->length(), 0),
-                      MockRead(SYNCHRONOUS, ERR_IO_PENDING, 1)};
-  MockWrite writes[] = {MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 2),
-                        MockWrite(SYNCHRONOUS, ack_and_data_out->data(),
-                                  ack_and_data_out->length(), 3)};
+      client_maker_.MakeAckAndDataPacket(2, false, 5, 1, 1, false, 0,
+                                         StringPiece(data)));
+  MockRead reads[] = {
+      MockRead(SYNCHRONOUS, server_ping->data(), server_ping->length(), 0),
+      MockRead(SYNCHRONOUS, ERR_IO_PENDING, 1)};
+  MockWrite writes[] = {
+      MockWrite(SYNCHRONOUS, client_ping->data(), client_ping->length(), 2),
+      MockWrite(SYNCHRONOUS, ack_and_data_out->data(),
+                ack_and_data_out->length(), 3)};
   StaticSocketDataProvider socket_data(reads, arraysize(reads), writes,
                                        arraysize(writes));
   socket_factory_.AddSocketDataProvider(&socket_data);
@@ -387,7 +401,7 @@
   for (size_t i = 0; i < kMaxReadersPerQuicSession; ++i) {
     MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 1)};
     std::unique_ptr<QuicEncryptedPacket> ping_out(
-        maker_.MakePingPacket(i + 1, /*include_version=*/true));
+        client_maker_.MakePingPacket(i + 1, /*include_version=*/true));
     MockWrite writes[] = {
         MockWrite(SYNCHRONOUS, ping_out->data(), ping_out->length(), i + 2)};
     StaticSocketDataProvider socket_data(reads, arraysize(reads), writes,
@@ -429,10 +443,12 @@
 }
 
 TEST_P(QuicChromiumClientSessionTest, MigrateToSocketReadError) {
-  std::unique_ptr<QuicEncryptedPacket> ping(
-      maker_.MakePingPacket(1, /*include_version=*/true));
+  std::unique_ptr<QuicEncryptedPacket> client_ping(
+      client_maker_.MakePingPacket(1, /*include_version=*/false));
+  std::unique_ptr<QuicEncryptedPacket> server_ping(
+      server_maker_.MakePingPacket(1, /*include_version=*/false));
   MockRead old_reads[] = {
-      MockRead(SYNCHRONOUS, ping->data(), ping->length(), 0),
+      MockRead(SYNCHRONOUS, client_ping->data(), client_ping->length(), 0),
       MockRead(ASYNC, ERR_IO_PENDING, 1),  // causes reading to pause.
       MockRead(ASYNC, ERR_NETWORK_CHANGED, 2)};
   socket_data_.reset(
@@ -441,11 +457,11 @@
   CompleteCryptoHandshake();
 
   MockWrite writes[] = {
-      MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 1)};
+      MockWrite(SYNCHRONOUS, client_ping->data(), client_ping->length(), 1)};
   MockRead new_reads[] = {
-      MockRead(SYNCHRONOUS, ping->data(), ping->length(), 0),
+      MockRead(SYNCHRONOUS, server_ping->data(), server_ping->length(), 0),
       MockRead(ASYNC, ERR_IO_PENDING, 2),  // pause reading.
-      MockRead(ASYNC, ping->data(), ping->length(), 3),
+      MockRead(ASYNC, server_ping->data(), server_ping->length(), 3),
       MockRead(ASYNC, ERR_IO_PENDING, 4),  // pause reading
       MockRead(ASYNC, ERR_NETWORK_CHANGED, 5)};
   SequencedSocketData new_socket_data(new_reads, arraysize(new_reads), writes,
@@ -497,7 +513,7 @@
   CompleteCryptoHandshake();
 
   std::unique_ptr<QuicEncryptedPacket> ping(
-      maker_.MakePingPacket(1, /*include_version=*/true));
+      client_maker_.MakePingPacket(1, /*include_version=*/true));
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
   MockWrite writes[] = {MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 1),
                         MockWrite(SYNCHRONOUS, ERR_FAILED, 2)};
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc
index 5c633d3c..ef6b4da 100644
--- a/net/quic/quic_connection.cc
+++ b/net/quic/quic_connection.cc
@@ -316,6 +316,7 @@
   SetMaxPacketLength(perspective_ == Perspective::IS_SERVER
                          ? kDefaultServerMaxPacketSize
                          : kDefaultMaxPacketSize);
+  received_packet_manager_.SetVersion(version());
 }
 
 QuicConnection::~QuicConnection() {
@@ -323,9 +324,6 @@
     delete writer_;
   }
   STLDeleteElements(&undecryptable_packets_);
-  if (termination_packets_.get() != nullptr) {
-    STLDeleteElements(termination_packets_.get());
-  }
   ClearQueuedPackets();
 }
 
@@ -388,8 +386,7 @@
     ack_mode_ = ACK_DECIMATION_WITH_REORDERING;
     ack_decimation_delay_ = kShortAckDecimationDelay;
   }
-  if (FLAGS_quic_enable_rto_timeout &&
-      config.HasClientSentConnectionOption(k5RTO, perspective_)) {
+  if (config.HasClientSentConnectionOption(k5RTO, perspective_)) {
     close_connection_after_five_rtos_ = true;
   }
 }
@@ -415,6 +412,10 @@
                                              max_bandwidth_resumption);
 }
 
+void QuicConnection::SetMaxPacingRate(QuicBandwidth max_pacing_rate) {
+  sent_packet_manager_.SetMaxPacingRate(max_pacing_rate);
+}
+
 void QuicConnection::SetNumOpenStreams(size_t num_streams) {
   sent_packet_manager_.SetNumOpenStreams(num_streams);
 }
@@ -507,6 +508,7 @@
   }
 
   version_negotiation_state_ = NEGOTIATED_VERSION;
+  received_packet_manager_.SetVersion(received_version);
   visitor_->OnSuccessfulVersionNegotiation(received_version);
   if (debug_visitor_ != nullptr) {
     debug_visitor_->OnSuccessfulVersionNegotiation(received_version);
@@ -564,6 +566,7 @@
 
   DVLOG(1) << ENDPOINT
            << "Negotiated version: " << QuicVersionToString(version());
+  received_packet_manager_.SetVersion(version());
   server_supported_versions_ = packet.versions;
   version_negotiation_state_ = NEGOTIATION_IN_PROGRESS;
   RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION);
@@ -723,10 +726,14 @@
   if (incoming_ack.is_truncated) {
     should_last_packet_instigate_acks_ = true;
   }
-  // If the peer is still waiting for a packet that we are no longer planning to
-  // send, send an ack to raise the high water mark.
-  if (!incoming_ack.missing_packets.Empty() &&
-      GetLeastUnacked() > incoming_ack.missing_packets.Min()) {
+  // If the incoming ack's packets set expresses missing packets: peer is still
+  // waiting for a packet lower than a packet that we are no longer planning to
+  // send.
+  // If the incoming ack's packets set expresses received packets: peer is still
+  // acking packets which we never care about.
+  // Send an ack to raise the high water mark.
+  if (!incoming_ack.packets.Empty() &&
+      GetLeastUnacked() > incoming_ack.packets.Min()) {
     ++stop_waiting_count_;
   } else {
     stop_waiting_count_ = 0;
@@ -739,9 +746,10 @@
   largest_seen_packet_with_ack_ = last_header_.packet_number;
   sent_packet_manager_.OnIncomingAck(incoming_ack,
                                      time_of_last_received_packet_);
-  sent_entropy_manager_.ClearEntropyBefore(
-      sent_packet_manager_.least_packet_awaited_by_peer() - 1);
-
+  if (version() <= QUIC_VERSION_33) {
+    sent_entropy_manager_.ClearEntropyBefore(
+        sent_packet_manager_.least_packet_awaited_by_peer() - 1);
+  }
   // Always reset the retransmission alarm when an ack comes in, since we now
   // have a better estimate of the current rtt than when it was set.
   SetRetransmissionAlarm();
@@ -814,32 +822,42 @@
     return "Largest observed too low.";
   }
 
-  if (!incoming_ack.missing_packets.Empty() &&
-      incoming_ack.missing_packets.Max() > incoming_ack.largest_observed) {
-    LOG(WARNING) << ENDPOINT << "Peer sent missing packet: "
-                 << incoming_ack.missing_packets.Max()
-                 << " which is greater than largest observed: "
-                 << incoming_ack.largest_observed;
-    return "Missing packet higher than largest observed.";
-  }
+  if (version() <= QUIC_VERSION_33) {
+    if (!incoming_ack.packets.Empty() &&
+        incoming_ack.packets.Max() > incoming_ack.largest_observed) {
+      LOG(WARNING) << ENDPOINT
+                   << "Peer sent missing packet: " << incoming_ack.packets.Max()
+                   << " which is greater than largest observed: "
+                   << incoming_ack.largest_observed;
+      return "Missing packet higher than largest observed.";
+    }
 
-  if (!incoming_ack.missing_packets.Empty() &&
-      incoming_ack.missing_packets.Min() <
-          sent_packet_manager_.least_packet_awaited_by_peer()) {
-    LOG(WARNING) << ENDPOINT << "Peer sent missing packet: "
-                 << incoming_ack.missing_packets.Min()
-                 << " which is smaller than least_packet_awaited_by_peer_: "
-                 << sent_packet_manager_.least_packet_awaited_by_peer();
-    return "Missing packet smaller than least awaited.";
-  }
-
-  if (!sent_entropy_manager_.IsValidEntropy(incoming_ack.largest_observed,
-                                            incoming_ack.missing_packets,
-                                            incoming_ack.entropy_hash)) {
-    LOG(WARNING) << ENDPOINT << "Peer sent invalid entropy."
-                 << " largest_observed:" << incoming_ack.largest_observed
-                 << " last_received:" << last_header_.packet_number;
-    return "Invalid entropy.";
+    if (!incoming_ack.packets.Empty() &&
+        incoming_ack.packets.Min() <
+            sent_packet_manager_.least_packet_awaited_by_peer()) {
+      LOG(WARNING) << ENDPOINT
+                   << "Peer sent missing packet: " << incoming_ack.packets.Min()
+                   << " which is smaller than least_packet_awaited_by_peer_: "
+                   << sent_packet_manager_.least_packet_awaited_by_peer();
+      return "Missing packet smaller than least awaited.";
+    }
+    if (!sent_entropy_manager_.IsValidEntropy(incoming_ack.largest_observed,
+                                              incoming_ack.packets,
+                                              incoming_ack.entropy_hash)) {
+      LOG(WARNING) << ENDPOINT << "Peer sent invalid entropy."
+                   << " largest_observed:" << incoming_ack.largest_observed
+                   << " last_received:" << last_header_.packet_number;
+      return "Invalid entropy.";
+    }
+  } else {
+    if (!incoming_ack.packets.Empty() &&
+        incoming_ack.packets.Max() != incoming_ack.largest_observed) {
+      QUIC_BUG << ENDPOINT
+               << "Peer last received packet: " << incoming_ack.packets.Max()
+               << " which is not equal to largest observed: "
+               << incoming_ack.largest_observed;
+      return "Last received packet not equal to largest observed.";
+    }
   }
 
   return nullptr;
@@ -1060,6 +1078,9 @@
 }
 
 void QuicConnection::MaybeCloseIfTooManyOutstandingPackets() {
+  if (version() > QUIC_VERSION_33) {
+    return;
+  }
   // This occurs if we don't discard old packets we've sent fast enough.
   // It's possible largest observed is less than least unacked.
   if (sent_packet_manager_.largest_observed() >
@@ -1086,8 +1107,10 @@
 void QuicConnection::PopulateStopWaitingFrame(
     QuicStopWaitingFrame* stop_waiting) {
   stop_waiting->least_unacked = GetLeastUnacked();
-  stop_waiting->entropy_hash = sent_entropy_manager_.GetCumulativeEntropy(
-      stop_waiting->least_unacked - 1);
+  if (version() <= QUIC_VERSION_33) {
+    stop_waiting->entropy_hash = sent_entropy_manager_.GetCumulativeEntropy(
+        stop_waiting->least_unacked - 1);
+  }
 }
 
 QuicPacketNumber QuicConnection::GetLeastUnacked() const {
@@ -1393,6 +1416,7 @@
         DCHECK_EQ(1u, header.public_header.versions.size());
         DCHECK_EQ(header.public_header.versions[0], version());
         version_negotiation_state_ = NEGOTIATED_VERSION;
+        received_packet_manager_.SetVersion(version());
         visitor_->OnSuccessfulVersionNegotiation(version());
         if (debug_visitor_ != nullptr) {
           debug_visitor_->OnSuccessfulVersionNegotiation(version());
@@ -1404,6 +1428,7 @@
       // it should stop sending version since the version negotiation is done.
       packet_generator_.StopSendingVersion();
       version_negotiation_state_ = NEGOTIATED_VERSION;
+      received_packet_manager_.SetVersion(version());
       visitor_->OnSuccessfulVersionNegotiation(version());
       if (debug_visitor_ != nullptr) {
         debug_visitor_->OnSuccessfulVersionNegotiation(version());
@@ -1560,12 +1585,13 @@
   // Others are deleted at the end of this call.
   if (is_termination_packet) {
     if (termination_packets_.get() == nullptr) {
-      termination_packets_.reset(new std::vector<QuicEncryptedPacket*>);
+      termination_packets_.reset(
+          new std::vector<std::unique_ptr<QuicEncryptedPacket>>);
     }
     // Copy the buffer so it's owned in the future.
     char* buffer_copy = QuicUtils::CopyBuffer(*packet);
-    termination_packets_->push_back(
-        new QuicEncryptedPacket(buffer_copy, encrypted_length, true));
+    termination_packets_->push_back(std::unique_ptr<QuicEncryptedPacket>(
+        new QuicEncryptedPacket(buffer_copy, encrypted_length, true)));
     // This assures we won't try to write *forced* packets when blocked.
     // Return true to stop processing.
     if (writer_->IsWriteBlocked()) {
@@ -1763,9 +1789,10 @@
     QUIC_BUG << "packet.encrypted_buffer == nullptr in to SendOrQueuePacket";
     return;
   }
-
-  sent_entropy_manager_.RecordPacketEntropyHash(packet->packet_number,
-                                                packet->entropy_hash);
+  if (version() <= QUIC_VERSION_33) {
+    sent_entropy_manager_.RecordPacketEntropyHash(packet->packet_number,
+                                                  packet->entropy_hash);
+  }
   // If there are already queued packets, queue this one immediately to ensure
   // it's written in sequence number order.
   if (!queued_packets_.empty() || !WritePacket(packet)) {
diff --git a/net/quic/quic_connection.h b/net/quic/quic_connection.h
index c8ece04..ea9d79b5 100644
--- a/net/quic/quic_connection.h
+++ b/net/quic/quic_connection.h
@@ -327,6 +327,9 @@
       const CachedNetworkParameters& cached_network_params,
       bool max_bandwidth_resumption);
 
+  // Called by the Session when a max pacing rate for the connection is needed.
+  virtual void SetMaxPacingRate(QuicBandwidth max_pacing_rate);
+
   // Sets the number of active streams on the connection for congestion control.
   void SetNumOpenStreams(size_t num_streams);
 
@@ -653,7 +656,7 @@
   // Return the id of the cipher of the primary decrypter of the framer.
   uint32_t cipher_id() const { return framer_.decrypter()->cipher_id(); }
 
-  std::vector<QuicEncryptedPacket*>* termination_packets() {
+  std::vector<std::unique_ptr<QuicEncryptedPacket>>* termination_packets() {
     return termination_packets_.get();
   }
 
@@ -908,7 +911,8 @@
   bool save_crypto_packets_as_termination_packets_;
 
   // Contains the connection close packets if the connection has been closed.
-  std::unique_ptr<std::vector<QuicEncryptedPacket*>> termination_packets_;
+  std::unique_ptr<std::vector<std::unique_ptr<QuicEncryptedPacket>>>
+      termination_packets_;
 
   // Determines whether or not a connection close packet is sent to the peer
   // after idle timeout due to lack of network activity.
diff --git a/net/quic/quic_connection_logger.cc b/net/quic/quic_connection_logger.cc
index 99f6991..e0e3f7e54 100644
--- a/net/quic/quic_connection_logger.cc
+++ b/net/quic/quic_connection_logger.cc
@@ -120,8 +120,8 @@
   dict->SetBoolean("truncated", frame->is_truncated);
 
   base::ListValue* missing = new base::ListValue();
-  dict->Set("missing_packets", missing);
-  for (QuicPacketNumber packet : frame->missing_packets)
+  dict->Set("packets", missing);
+  for (QuicPacketNumber packet : frame->packets)
     missing->AppendString(base::Uint64ToString(packet));
 
   base::ListValue* received = new base::ListValue();
@@ -351,8 +351,12 @@
       net_log_.AddEvent(
           NetLog::TYPE_QUIC_SESSION_ACK_FRAME_SENT,
           base::Bind(&NetLogQuicAckFrameCallback, frame.ack_frame));
-      const PacketNumberQueue& missing_packets =
-          frame.ack_frame->missing_packets;
+      // Missing packets histogram only relevant for v33 and lower
+      // TODO(rch, rtenneti) sort out histograms for v34+
+      if (session_->connection()->version() > QUIC_VERSION_33) {
+        break;
+      }
+      const PacketNumberQueue& missing_packets = frame.ack_frame->packets;
       const uint8_t max_ranges = std::numeric_limits<uint8_t>::max();
       // Compute an upper bound on the number of NACK ranges. If the bound
       // is below the max, then it clearly isn't truncated.
@@ -543,10 +547,14 @@
   if (frame.is_truncated)
     ++num_truncated_acks_received_;
 
-  if (frame.missing_packets.Empty())
+  if (frame.packets.Empty())
     return;
 
-  const PacketNumberQueue& missing_packets = frame.missing_packets;
+  // TODO(rch, rtenneti) sort out histograms for QUIC_VERSION_34 and above.
+  if (session_->connection()->version() > QUIC_VERSION_33) {
+    return;
+  }
+  const PacketNumberQueue& missing_packets = frame.packets;
   PacketNumberQueue::const_iterator it =
       missing_packets.lower_bound(largest_received_missing_packet_number_);
   if (it == missing_packets.end())
diff --git a/net/quic/quic_connection_logger_unittest.cc b/net/quic/quic_connection_logger_unittest.cc
index a92ad7ae..5bebd10 100644
--- a/net/quic/quic_connection_logger_unittest.cc
+++ b/net/quic/quic_connection_logger_unittest.cc
@@ -5,6 +5,7 @@
 #include "net/quic/quic_connection_logger.h"
 
 #include "net/quic/quic_protocol.h"
+#include "net/quic/test_tools/quic_connection_peer.h"
 #include "net/quic/test_tools/quic_test_utils.h"
 #include "net/socket/socket_performance_watcher.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -38,7 +39,10 @@
         logger_(&session_,
                 "CONNECTION_UNKNOWN",
                 /*socket_performance_watcher=*/nullptr,
-                net_log_) {}
+                net_log_) {
+    QuicConnectionPeer::GetFramer(session_.connection())
+        ->set_version(QUIC_VERSION_33);
+  }
 
   BoundNetLog net_log_;
   MockConnectionHelper helper_;
@@ -53,7 +57,7 @@
   EXPECT_EQ(0u, QuicConnectionLoggerPeer::num_truncated_acks_sent(logger_));
 
   for (QuicPacketNumber i = 0; i < 256; ++i) {
-    frame.missing_packets.Add(i);
+    frame.packets.Add(i);
   }
   logger_.OnFrameAddedToPacket(QuicFrame(&frame));
   EXPECT_EQ(0u, QuicConnectionLoggerPeer::num_truncated_acks_sent(logger_));
@@ -62,7 +66,7 @@
 TEST_F(QuicConnectionLoggerTest, TruncatedAcksSent) {
   QuicAckFrame frame;
   for (QuicPacketNumber i = 0; i < 512; i += 2) {
-    frame.missing_packets.Add(i);
+    frame.packets.Add(i);
   }
   logger_.OnFrameAddedToPacket(QuicFrame(&frame));
   EXPECT_EQ(1u, QuicConnectionLoggerPeer::num_truncated_acks_sent(logger_));
diff --git a/net/quic/quic_connection_test.cc b/net/quic/quic_connection_test.cc
index b1d77f2..add0a1e 100644
--- a/net/quic/quic_connection_test.cc
+++ b/net/quic/quic_connection_test.cc
@@ -74,6 +74,11 @@
 const IPEndPoint kPeerAddress = IPEndPoint(Loopback6(), /*port=*/12345);
 const IPEndPoint kSelfAddress = IPEndPoint(Loopback6(), /*port=*/443);
 
+Perspective InvertPerspective(Perspective perspective) {
+  return perspective == Perspective::IS_CLIENT ? Perspective::IS_SERVER
+                                               : Perspective::IS_CLIENT;
+}
+
 // TaggingEncrypter appends kTagSize bytes of |tag| to the end of each message.
 class TaggingEncrypter : public QuicEncrypter {
  public:
@@ -387,10 +392,8 @@
   void set_perspective(Perspective perspective) {
     // We invert perspective here, because the framer needs to parse packets
     // we send.
-    perspective = perspective == Perspective::IS_CLIENT
-                      ? Perspective::IS_SERVER
-                      : Perspective::IS_CLIENT;
-    QuicFramerPeer::SetPerspective(framer_.framer(), perspective);
+    QuicFramerPeer::SetPerspective(framer_.framer(),
+                                   InvertPerspective(perspective));
   }
 
   // final_bytes_of_last_packet_ returns the last four bytes of the previous
@@ -657,8 +660,11 @@
         loss_algorithm_(new MockLossAlgorithm()),
         helper_(new TestConnectionHelper(&clock_, &random_generator_)),
         alarm_factory_(new TestAlarmFactory()),
+        peer_framer_(SupportedVersions(version()),
+                     QuicTime::Zero(),
+                     Perspective::IS_SERVER),
         peer_creator_(connection_id_,
-                      &framer_,
+                      &peer_framer_,
                       &random_generator_,
                       &buffer_allocator_,
                       /*delegate=*/nullptr),
@@ -684,6 +690,7 @@
     connection_.SetSendAlgorithm(send_algorithm_);
     connection_.SetLossAlgorithm(loss_algorithm_);
     framer_.set_received_entropy_calculator(&entropy_calculator_);
+    peer_framer_.set_received_entropy_calculator(&peer_entropy_calculator_);
     EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _))
         .WillRepeatedly(Return(QuicTime::Delta::Zero()));
     EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
@@ -891,11 +898,11 @@
   }
 
   bool IsMissing(QuicPacketNumber number) {
-    return IsAwaitingPacket(*outgoing_ack(), number);
+    return IsAwaitingPacket(*outgoing_ack(), number, 0);
   }
 
   QuicPacket* ConstructPacket(QuicPacketHeader header, QuicFrames frames) {
-    QuicPacket* packet = BuildUnsizedDataPacket(&framer_, header, frames);
+    QuicPacket* packet = BuildUnsizedDataPacket(&peer_framer_, header, frames);
     EXPECT_NE(nullptr, packet);
     return packet;
   }
@@ -949,9 +956,16 @@
   // Initialize a frame acknowledging all packets up to largest_observed.
   const QuicAckFrame InitAckFrame(QuicPacketNumber largest_observed) {
     QuicAckFrame frame(MakeAckFrame(largest_observed));
-    if (largest_observed > 0) {
-      frame.entropy_hash = QuicConnectionPeer::GetSentEntropyHash(
-          &connection_, largest_observed);
+    if (GetParam().version <= QUIC_VERSION_33) {
+      if (largest_observed > 0) {
+        frame.entropy_hash = QuicConnectionPeer::GetSentEntropyHash(
+            &connection_, largest_observed);
+      }
+    } else {
+      frame.missing = false;
+      if (largest_observed > 0) {
+        frame.packets.Add(1, largest_observed + 1);
+      }
     }
     return frame;
   }
@@ -965,17 +979,26 @@
 
   // Explicitly nack a packet.
   void NackPacket(QuicPacketNumber missing, QuicAckFrame* frame) {
-    frame->missing_packets.Add(missing);
-    frame->entropy_hash ^=
-        QuicConnectionPeer::PacketEntropy(&connection_, missing);
+    if (frame->missing) {
+      frame->packets.Add(missing);
+      frame->entropy_hash ^=
+          QuicConnectionPeer::PacketEntropy(&connection_, missing);
+    } else {
+      frame->packets.Remove(missing);
+    }
   }
 
   // Undo nacking a packet within the frame.
   void AckPacket(QuicPacketNumber arrived, QuicAckFrame* frame) {
-    EXPECT_TRUE(frame->missing_packets.Contains(arrived));
-    frame->missing_packets.Remove(arrived);
-    frame->entropy_hash ^=
-        QuicConnectionPeer::PacketEntropy(&connection_, arrived);
+    if (frame->missing) {
+      EXPECT_TRUE(frame->packets.Contains(arrived));
+      frame->packets.Remove(arrived);
+      frame->entropy_hash ^=
+          QuicConnectionPeer::PacketEntropy(&connection_, arrived);
+    } else {
+      EXPECT_FALSE(frame->packets.Contains(arrived));
+      frame->packets.Add(arrived);
+    }
   }
 
   void TriggerConnectionClose() {
@@ -1008,9 +1031,16 @@
         .WillRepeatedly(testing::Return(QuicTime::Delta::Zero()));
   }
 
+  void set_perspective(Perspective perspective) {
+    connection_.set_perspective(perspective);
+    QuicFramerPeer::SetPerspective(&peer_framer_,
+                                   InvertPerspective(perspective));
+  }
+
   QuicConnectionId connection_id_;
   QuicFramer framer_;
   MockEntropyCalculator entropy_calculator_;
+  MockEntropyCalculator peer_entropy_calculator_;
 
   MockSendAlgorithm* send_algorithm_;
   MockLossAlgorithm* loss_algorithm_;
@@ -1019,6 +1049,7 @@
   SimpleBufferAllocator buffer_allocator_;
   std::unique_ptr<TestConnectionHelper> helper_;
   std::unique_ptr<TestAlarmFactory> alarm_factory_;
+  QuicFramer peer_framer_;
   QuicPacketCreator peer_creator_;
   std::unique_ptr<TestPacketWriter> writer_;
   TestConnection connection_;
@@ -1064,7 +1095,7 @@
 TEST_P(QuicConnectionTest, SelfAddressChangeAtServer) {
   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
 
-  connection_.set_perspective(Perspective::IS_SERVER);
+  set_perspective(Perspective::IS_SERVER);
   QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
 
   EXPECT_EQ(Perspective::IS_SERVER, connection_.perspective());
@@ -1099,7 +1130,7 @@
 TEST_P(QuicConnectionTest, IncreaseServerMaxPacketSize) {
   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
 
-  connection_.set_perspective(Perspective::IS_SERVER);
+  set_perspective(Perspective::IS_SERVER);
   connection_.SetMaxPacketLength(1000);
 
   QuicPacketHeader header;
@@ -1132,7 +1163,7 @@
 
   const QuicByteCount lower_max_packet_size = 1240;
   writer_->set_max_packet_size(lower_max_packet_size);
-  connection_.set_perspective(Perspective::IS_SERVER);
+  set_perspective(Perspective::IS_SERVER);
   connection_.SetMaxPacketLength(1000);
   EXPECT_EQ(1000u, connection_.max_packet_length());
 
@@ -1190,15 +1221,27 @@
 
   ProcessPacket(kDefaultPathId, 1);
   EXPECT_EQ(1u, outgoing_ack()->largest_observed);
-  EXPECT_TRUE(outgoing_ack()->missing_packets.Empty());
+  if (outgoing_ack()->missing) {
+    EXPECT_TRUE(outgoing_ack()->packets.Empty());
+  } else {
+    EXPECT_EQ(1u, outgoing_ack()->packets.NumIntervals());
+  }
 
   ProcessPacket(kDefaultPathId, 2);
   EXPECT_EQ(2u, outgoing_ack()->largest_observed);
-  EXPECT_TRUE(outgoing_ack()->missing_packets.Empty());
+  if (outgoing_ack()->missing) {
+    EXPECT_TRUE(outgoing_ack()->packets.Empty());
+  } else {
+    EXPECT_EQ(1u, outgoing_ack()->packets.NumIntervals());
+  }
 
   ProcessPacket(kDefaultPathId, 3);
   EXPECT_EQ(3u, outgoing_ack()->largest_observed);
-  EXPECT_TRUE(outgoing_ack()->missing_packets.Empty());
+  if (outgoing_ack()->missing) {
+    EXPECT_TRUE(outgoing_ack()->packets.Empty());
+  } else {
+    EXPECT_EQ(1u, outgoing_ack()->packets.NumIntervals());
+  }
 }
 
 TEST_P(QuicConnectionTest, PacketsOutOfOrder) {
@@ -1293,6 +1336,9 @@
 }
 
 TEST_P(QuicConnectionTest, TruncatedAck) {
+  if (GetParam().version > QUIC_VERSION_33) {
+    return;
+  }
   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
   QuicPacketNumber num_packets = 256 * 2 + 1;
   for (QuicPacketNumber i = 0; i < num_packets; ++i) {
@@ -1309,7 +1355,7 @@
     }
   }
   EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _));
-  EXPECT_CALL(entropy_calculator_, EntropyHash(511))
+  EXPECT_CALL(peer_entropy_calculator_, EntropyHash(511))
       .WillOnce(Return(static_cast<QuicPacketEntropyHash>(0)));
   EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
   ProcessAckPacket(&frame);
@@ -1499,11 +1545,13 @@
 
   // Ack packet 1, which leaves more than the limit outstanding.
   EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
-  EXPECT_CALL(visitor_,
-              OnConnectionClosed(QUIC_TOO_MANY_OUTSTANDING_SENT_PACKETS, _,
-                                 ConnectionCloseSource::FROM_SELF));
-  // We're receive buffer limited, so the connection won't try to write more.
-  EXPECT_CALL(visitor_, OnCanWrite()).Times(0);
+  if (GetParam().version <= QUIC_VERSION_33) {
+    EXPECT_CALL(visitor_,
+                OnConnectionClosed(QUIC_TOO_MANY_OUTSTANDING_SENT_PACKETS, _,
+                                   ConnectionCloseSource::FROM_SELF));
+    // We're receive buffer limited, so the connection won't try to write more.
+    EXPECT_CALL(visitor_, OnCanWrite()).Times(0);
+  }
 
   // Nack the first packet and ack the rest, leaving a huge gap.
   QuicAckFrame frame1 = InitAckFrame(num_packets);
@@ -1513,10 +1561,11 @@
 
 TEST_P(QuicConnectionTest, TooManyReceivedPackets) {
   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
-  EXPECT_CALL(visitor_,
-              OnConnectionClosed(QUIC_TOO_MANY_OUTSTANDING_RECEIVED_PACKETS, _,
-                                 ConnectionCloseSource::FROM_SELF));
-
+  if (GetParam().version <= QUIC_VERSION_33) {
+    EXPECT_CALL(visitor_,
+                OnConnectionClosed(QUIC_TOO_MANY_OUTSTANDING_RECEIVED_PACKETS,
+                                   _, ConnectionCloseSource::FROM_SELF));
+  }
   // Miss 99 of every 100 packets for 5500 packets.
   for (QuicPacketNumber i = 1; i < kMaxTrackedPackets + 500; i += 100) {
     ProcessPacket(kDefaultPathId, i);
@@ -3367,7 +3416,6 @@
 }
 
 TEST_P(QuicConnectionTest, TimeoutAfter5RTOs) {
-  FLAGS_quic_enable_rto_timeout = true;
   QuicSentPacketManagerPeer::SetMaxTailLossProbes(manager_, 2);
   EXPECT_TRUE(connection_.connected());
   EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
@@ -4164,10 +4212,17 @@
   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
   QuicStopWaitingFrame frame = InitStopWaitingFrame(4);
   ProcessStopWaitingPacket(&frame);
-  EXPECT_TRUE(outgoing_ack()->missing_packets.Empty());
+  if (outgoing_ack()->missing) {
+    EXPECT_TRUE(outgoing_ack()->packets.Empty());
+  } else {
+    EXPECT_FALSE(outgoing_ack()->packets.Empty());
+  }
 }
 
 TEST_P(QuicConnectionTest, ReceivedEntropyHashCalculation) {
+  if (GetParam().version > QUIC_VERSION_33) {
+    return;
+  }
   EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(AtLeast(1));
   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
   ProcessDataPacket(kDefaultPathId, 1, kEntropyFlag);
@@ -4178,6 +4233,9 @@
 }
 
 TEST_P(QuicConnectionTest, UpdateEntropyForReceivedPackets) {
+  if (GetParam().version > QUIC_VERSION_33) {
+    return;
+  }
   EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(AtLeast(1));
   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
   ProcessDataPacket(kDefaultPathId, 1, kEntropyFlag);
@@ -4199,6 +4257,9 @@
 }
 
 TEST_P(QuicConnectionTest, UpdateEntropyHashUptoCurrentPacket) {
+  if (GetParam().version > QUIC_VERSION_33) {
+    return;
+  }
   EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(AtLeast(1));
   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
   ProcessDataPacket(kDefaultPathId, 1, kEntropyFlag);
@@ -4220,6 +4281,9 @@
 }
 
 TEST_P(QuicConnectionTest, EntropyCalculationForTruncatedAck) {
+  if (GetParam().version > QUIC_VERSION_33) {
+    return;
+  }
   EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(AtLeast(1));
   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
   QuicPacketEntropyHash entropy[51];
@@ -4246,7 +4310,8 @@
 
 TEST_P(QuicConnectionTest, ServerSendsVersionNegotiationPacket) {
   connection_.SetSupportedVersions(QuicSupportedVersions());
-  framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
+  set_perspective(Perspective::IS_SERVER);
+  peer_framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
 
   QuicPacketHeader header;
   header.public_header.connection_id = connection_id_;
@@ -4262,7 +4327,6 @@
       ENCRYPTION_NONE, kDefaultPathId, 12, *packet, buffer, kMaxPacketSize);
 
   framer_.set_version(version());
-  connection_.set_perspective(Perspective::IS_SERVER);
   connection_.ProcessUdpPacket(
       kSelfAddress, kPeerAddress,
       QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false));
@@ -4282,7 +4346,8 @@
 
 TEST_P(QuicConnectionTest, ServerSendsVersionNegotiationPacketSocketBlocked) {
   connection_.SetSupportedVersions(QuicSupportedVersions());
-  framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
+  set_perspective(Perspective::IS_SERVER);
+  peer_framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
 
   QuicPacketHeader header;
   header.public_header.connection_id = connection_id_;
@@ -4297,7 +4362,6 @@
       ENCRYPTION_NONE, kDefaultPathId, 12, *packet, buffer, kMaxPacketSize);
 
   framer_.set_version(version());
-  connection_.set_perspective(Perspective::IS_SERVER);
   BlockOnNextWrite();
   connection_.ProcessUdpPacket(
       kSelfAddress, kPeerAddress,
@@ -4324,7 +4388,8 @@
 TEST_P(QuicConnectionTest,
        ServerSendsVersionNegotiationPacketSocketBlockedDataBuffered) {
   connection_.SetSupportedVersions(QuicSupportedVersions());
-  framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
+  set_perspective(Perspective::IS_SERVER);
+  peer_framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
 
   QuicPacketHeader header;
   header.public_header.connection_id = connection_id_;
@@ -4339,7 +4404,7 @@
       ENCRYPTION_NONE, kDefaultPathId, 12, *packet, buffer, kMaxPacketSize);
 
   framer_.set_version(version());
-  connection_.set_perspective(Perspective::IS_SERVER);
+  set_perspective(Perspective::IS_SERVER);
   BlockOnNextWrite();
   writer_->set_is_write_blocked_data_buffered(true);
   connection_.ProcessUdpPacket(
diff --git a/net/quic/quic_flags.cc b/net/quic/quic_flags.cc
index bf304b9..dd343dd2 100644
--- a/net/quic/quic_flags.cc
+++ b/net/quic/quic_flags.cc
@@ -92,10 +92,6 @@
 // If true, QUIC connections will defer responding to ACKs to their send alarms.
 bool FLAGS_quic_connection_defer_ack_response = true;
 
-// Enable a connection option allowing connections to time out if more than 5
-// consecutive RTOs are sent.
-bool FLAGS_quic_enable_rto_timeout = true;
-
 // Try to use the socket timestamp to determine the time a packet was
 // received instead of Now().
 bool FLAGS_quic_use_socket_timestamp = true;
@@ -120,3 +116,6 @@
 
 // If true, do not check HasUnackedPackets on retransmission timeout.
 bool FLAGS_quic_always_has_unacked_packets_on_timeout = true;
+
+// If true, respect any configured max pacing rate.
+bool FLAGS_quic_max_pacing_rate = true;
diff --git a/net/quic/quic_flags.h b/net/quic/quic_flags.h
index a897bfd..85e0a93 100644
--- a/net/quic/quic_flags.h
+++ b/net/quic/quic_flags.h
@@ -33,7 +33,6 @@
     FLAGS_quic_crypto_server_config_default_has_chacha20;
 NET_EXPORT_PRIVATE extern bool FLAGS_quic_use_new_tcp_sender;
 NET_EXPORT_PRIVATE extern bool FLAGS_quic_connection_defer_ack_response;
-NET_EXPORT_PRIVATE extern bool FLAGS_quic_enable_rto_timeout;
 NET_EXPORT_PRIVATE extern bool FLAGS_quic_use_socket_timestamp;
 NET_EXPORT_PRIVATE extern bool FLAGS_quic_reply_to_rej;
 NET_EXPORT_PRIVATE extern bool FLAGS_quic_ignore_invalid_error_code;
@@ -41,5 +40,5 @@
 NET_EXPORT_PRIVATE extern bool FLAGS_quic_sslr_limit_reduction;
 NET_EXPORT_PRIVATE extern bool FLAGS_quic_simplify_loss_detection;
 NET_EXPORT_PRIVATE extern bool FLAGS_quic_always_has_unacked_packets_on_timeout;
-
+NET_EXPORT_PRIVATE extern bool FLAGS_quic_max_pacing_rate;
 #endif  // NET_QUIC_QUIC_FLAGS_H_
diff --git a/net/quic/quic_framer.cc b/net/quic/quic_framer.cc
index 59052ac..0508359 100644
--- a/net/quic/quic_framer.cc
+++ b/net/quic/quic_framer.cc
@@ -6,6 +6,7 @@
 
 #include <cstdint>
 #include <memory>
+#include <vector>
 
 #include "base/compiler_specific.h"
 #include "base/logging.h"
@@ -95,6 +96,9 @@
 
 // Acks may not have any nacks.
 const uint8_t kQuicHasNacksMask = 0x01;
+// Acks may have only one ack block.
+const uint8_t kQuicHasMultipleAckBlocksMask = 0x01;
+const uint8_t kQuicHasMultipleAckBlocksShift = 1;
 
 // Returns the absolute value of the difference between |a| and |b|.
 QuicPacketNumber Delta(QuicPacketNumber a, QuicPacketNumber b) {
@@ -165,15 +169,25 @@
 
 // static
 size_t QuicFramer::GetMinAckFrameSize(
+    QuicVersion version,
     QuicPacketNumberLength largest_observed_length) {
-  return kQuicFrameTypeSize + kQuicEntropyHashSize + largest_observed_length +
-         kQuicDeltaTimeLargestObservedSize;
+  size_t min_size = kQuicFrameTypeSize + largest_observed_length +
+                    kQuicDeltaTimeLargestObservedSize;
+  if (version <= QUIC_VERSION_33) {
+    return min_size + kQuicEntropyHashSize;
+  }
+  return min_size + kQuicNumTimestampsSize;
 }
 
 // static
 size_t QuicFramer::GetStopWaitingFrameSize(
+    QuicVersion version,
     QuicPacketNumberLength packet_number_length) {
-  return kQuicFrameTypeSize + kQuicEntropyHashSize + packet_number_length;
+  size_t min_size = kQuicFrameTypeSize + packet_number_length;
+  if (version <= QUIC_VERSION_33) {
+    return min_size + kQuicEntropyHashSize;
+  }
+  return min_size;
 }
 
 // static
@@ -303,7 +317,8 @@
   }
   bool can_truncate =
       frame.type == ACK_FRAME &&
-      free_bytes >= GetMinAckFrameSize(PACKET_6BYTE_PACKET_NUMBER);
+      free_bytes >=
+          GetMinAckFrameSize(quic_version_, PACKET_6BYTE_PACKET_NUMBER);
   if (can_truncate) {
     // Truncate the frame so the packet will not exceed kMaxPacketSize.
     // Note that we may not use every byte of the writer in this case.
@@ -319,6 +334,21 @@
 
 QuicFramer::AckFrameInfo::~AckFrameInfo() {}
 
+QuicFramer::AckBlock::AckBlock(uint8_t gap, QuicPacketNumber length)
+    : gap(gap), length(length) {}
+
+QuicFramer::AckBlock::AckBlock(const AckBlock& other) = default;
+
+QuicFramer::AckBlock::~AckBlock() {}
+
+QuicFramer::NewAckFrameInfo::NewAckFrameInfo()
+    : max_block_length(0), first_block_length(0) {}
+
+QuicFramer::NewAckFrameInfo::NewAckFrameInfo(const NewAckFrameInfo& other) =
+    default;
+
+QuicFramer::NewAckFrameInfo::~NewAckFrameInfo() {}
+
 // static
 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash(
     const QuicPacketHeader& header) {
@@ -356,9 +386,16 @@
         }
         break;
       case ACK_FRAME:
-        if (!AppendAckFrameAndTypeByte(header, *frame.ack_frame, &writer)) {
-          QUIC_BUG << "AppendAckFrameAndTypeByte failed";
-          return 0;
+        if (quic_version_ <= QUIC_VERSION_33) {
+          if (!AppendAckFrameAndTypeByte(header, *frame.ack_frame, &writer)) {
+            QUIC_BUG << "AppendAckFrameAndTypeByte failed";
+            return 0;
+          }
+        } else {
+          if (!AppendNewAckFrameAndTypeByte(*frame.ack_frame, &writer)) {
+            QUIC_BUG << "AppendNewAckFrameAndTypeByte failed";
+            return 0;
+          }
         }
         break;
       case STOP_WAITING_FRAME:
@@ -472,8 +509,10 @@
   std::unique_ptr<char[]> buffer(new char[len]);
   QuicDataWriter writer(len, buffer.get());
 
-  uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_VERSION |
-                                       PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID);
+  uint8_t flags = static_cast<uint8_t>(
+      PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID |
+      // TODO(rch): Remove this QUIC_VERSION_32 is retired.
+      PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD);
   if (!writer.WriteUInt8(flags)) {
     return nullptr;
   }
@@ -674,6 +713,11 @@
     case PACKET_8BYTE_CONNECTION_ID:
       if (quic_version_ > QUIC_VERSION_32) {
         public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID;
+        if (perspective_ == Perspective::IS_CLIENT) {
+          // TODO(rch): Fix this when v33 flags are supported by middle boxes.
+          public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD;
+        }
+
       } else {
         public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD;
       }
@@ -862,6 +906,7 @@
   // not be interpreted as indicating a nonce is present.
   if (quic_version_ > QUIC_VERSION_32 &&
       public_flags & PACKET_PUBLIC_FLAGS_NONCE &&
+      !(public_flags & PACKET_PUBLIC_FLAGS_VERSION) &&
       // The nonce flag from a client is ignored and is assumed to be an older
       // client indicating an eight-byte connection ID.
       perspective_ == Perspective::IS_CLIENT) {
@@ -914,17 +959,17 @@
 QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo(
     const QuicAckFrame& frame) {
   AckFrameInfo ack_info;
-  if (frame.missing_packets.Empty()) {
+  if (frame.packets.Empty()) {
     return ack_info;
   }
-  DCHECK_GE(frame.largest_observed, frame.missing_packets.Max());
+  DCHECK_GE(frame.largest_observed, frame.packets.Max());
   size_t cur_range_length = 0;
-  PacketNumberQueue::const_iterator iter = frame.missing_packets.begin();
+  PacketNumberQueue::const_iterator iter = frame.packets.begin();
   // TODO(jdorfman): Switch this logic to use the intervals in PacketNumberQueue
   // instead of reconstructing them from the sequence.
   QuicPacketNumber last_missing = *iter;
   ++iter;
-  for (; iter != frame.missing_packets.end(); ++iter) {
+  for (; iter != frame.packets.end(); ++iter) {
     if (cur_range_length < numeric_limits<uint8_t>::max() &&
         *iter == (last_missing + 1)) {
       ++cur_range_length;
@@ -945,6 +990,49 @@
   return ack_info;
 }
 
+// static
+QuicFramer::NewAckFrameInfo QuicFramer::GetNewAckFrameInfo(
+    const QuicAckFrame& frame) {
+  NewAckFrameInfo new_ack_info;
+  if (frame.packets.Empty()) {
+    return new_ack_info;
+  }
+  uint64_t cur_range_length = 1;
+  PacketNumberQueue::const_iterator iter = frame.packets.begin();
+  QuicPacketNumber last_received = *iter;
+  ++iter;
+  for (; iter != frame.packets.end(); ++iter) {
+    if (*iter == (last_received + 1)) {
+      ++cur_range_length;
+    } else {
+      size_t total_gap = *iter - last_received - 1;
+      size_t num_blocks = static_cast<size_t>(ceil(
+          static_cast<double>(total_gap) / numeric_limits<uint8_t>::max()));
+      uint8_t last_gap = static_cast<uint8_t>(
+          total_gap - (num_blocks - 1) * numeric_limits<uint8_t>::max());
+      for (size_t i = 0; i < num_blocks; ++i) {
+        if (i == 0) {
+          new_ack_info.ack_blocks.push_back(
+              AckBlock(last_gap, cur_range_length));
+        } else {
+          // Add an ack block of length 0 because there are more than 255
+          // missing packets in a row.
+          new_ack_info.ack_blocks.push_back(
+              AckBlock(numeric_limits<uint8_t>::max(), 0));
+        }
+      }
+      new_ack_info.max_block_length =
+          max(new_ack_info.max_block_length, cur_range_length);
+      cur_range_length = 1;
+    }
+    last_received = *iter;
+  }
+  new_ack_info.first_block_length = cur_range_length;
+  new_ack_info.max_block_length =
+      max(new_ack_info.max_block_length, new_ack_info.first_block_length);
+  return new_ack_info;
+}
+
 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader,
                                               QuicPacketHeader* header) {
   header->path_id = kDefaultPathId;
@@ -1091,8 +1179,14 @@
       // Ack Frame
       if (frame_type & kQuicFrameTypeAckMask) {
         QuicAckFrame frame;
-        if (!ProcessAckFrame(reader, frame_type, &frame)) {
-          return RaiseError(QUIC_INVALID_ACK_DATA);
+        if (quic_version_ <= QUIC_VERSION_33) {
+          if (!ProcessAckFrame(reader, frame_type, &frame)) {
+            return RaiseError(QUIC_INVALID_ACK_DATA);
+          }
+        } else {
+          if (!ProcessNewAckFrame(reader, frame_type, &frame)) {
+            return RaiseError(QUIC_INVALID_ACK_DATA);
+          }
         }
         if (!visitor_->OnAckFrame(frame)) {
           DVLOG(1) << "Visitor asked to stop further processing.";
@@ -1351,8 +1445,8 @@
       set_detailed_error("Unable to read missing packet number range.");
       return false;
     }
-    ack_frame->missing_packets.Add(last_packet_number - range_length,
-                                   last_packet_number + 1);
+    ack_frame->packets.Add(last_packet_number - range_length,
+                           last_packet_number + 1);
     // Subtract an extra 1 to ensure ranges are represented efficiently and
     // can't overlap by 1 packet number.  This allows a missing_delta of 0
     // to represent an adjacent nack range.
@@ -1383,6 +1477,83 @@
   return true;
 }
 
+bool QuicFramer::ProcessNewAckFrame(QuicDataReader* reader,
+                                    uint8_t frame_type,
+                                    QuicAckFrame* ack_frame) {
+  // Determine the two lengths from the frame type: largest acked length,
+  // ack block length.
+  const QuicPacketNumberLength ack_block_length =
+      ReadSequenceNumberLength(frame_type);
+  frame_type >>= kQuicSequenceNumberLengthShift;
+  const QuicPacketNumberLength largest_acked_length =
+      ReadSequenceNumberLength(frame_type);
+  frame_type >>= kQuicSequenceNumberLengthShift;
+  frame_type >>= kQuicHasMultipleAckBlocksShift;
+  bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask;
+  ack_frame->missing = false;
+
+  if (!reader->ReadBytes(&ack_frame->largest_observed, largest_acked_length)) {
+    set_detailed_error("Unable to read largest acked.");
+    return false;
+  }
+
+  uint64_t ack_delay_time_us;
+  if (!reader->ReadUFloat16(&ack_delay_time_us)) {
+    set_detailed_error("Unable to read ack delay time.");
+    return false;
+  }
+
+  if (ack_delay_time_us == kUFloat16MaxValue) {
+    ack_frame->ack_delay_time = QuicTime::Delta::Infinite();
+  } else {
+    ack_frame->ack_delay_time =
+        QuicTime::Delta::FromMicroseconds(ack_delay_time_us);
+  }
+
+  uint8_t num_ack_blocks = 0;
+  if (has_ack_blocks) {
+    if (!reader->ReadBytes(&num_ack_blocks, 1)) {
+      set_detailed_error("Unable to read num of ack blocks.");
+      return false;
+    }
+  }
+
+  size_t first_block_length = 0;
+  if (!reader->ReadBytes(&first_block_length, ack_block_length)) {
+    set_detailed_error("Unable to read first ack block length.");
+    return false;
+  }
+  QuicPacketNumber first_received =
+      ack_frame->largest_observed + 1 - first_block_length;
+  ack_frame->packets.Add(first_received, ack_frame->largest_observed + 1);
+
+  if (num_ack_blocks > 0) {
+    for (size_t i = 0; i < num_ack_blocks; ++i) {
+      size_t gap = 0;
+      if (!reader->ReadBytes(&gap, PACKET_1BYTE_PACKET_NUMBER)) {
+        set_detailed_error("Unable to read gap to next ack block.");
+        return false;
+      }
+      size_t current_block_length = 0;
+      if (!reader->ReadBytes(&current_block_length, ack_block_length)) {
+        set_detailed_error("Unable to ack block length.");
+        return false;
+      }
+      first_received -= (gap + current_block_length);
+      if (current_block_length > 0) {
+        ack_frame->packets.Add(first_received,
+                               first_received + current_block_length);
+      }
+    }
+  }
+
+  if (!ProcessTimestampsInAckFrame(reader, ack_frame)) {
+    return false;
+  }
+
+  return true;
+}
+
 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader,
                                              QuicAckFrame* ack_frame) {
   if (ack_frame->is_truncated) {
@@ -1447,9 +1618,11 @@
 bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader,
                                          const QuicPacketHeader& header,
                                          QuicStopWaitingFrame* stop_waiting) {
-  if (!reader->ReadBytes(&stop_waiting->entropy_hash, 1)) {
-    set_detailed_error("Unable to read entropy hash for sent packets.");
-    return false;
+  if (quic_version_ <= QUIC_VERSION_33) {
+    if (!reader->ReadBytes(&stop_waiting->entropy_hash, 1)) {
+      set_detailed_error("Unable to read entropy hash for sent packets.");
+      return false;
+    }
   }
 
   QuicPacketNumber least_unacked_delta = 0;
@@ -1769,40 +1942,63 @@
   return true;
 }
 
+size_t QuicFramer::GetAckFrameTimeStampSize(const QuicAckFrame& ack) {
+  if (ack.received_packet_times.empty()) {
+    return 0;
+  }
+
+  return 5 + 3 * (ack.received_packet_times.size() - 1);
+}
+
 size_t QuicFramer::GetAckFrameSize(
     const QuicAckFrame& ack,
     QuicPacketNumberLength packet_number_length) {
-  AckFrameInfo ack_info = GetAckFrameInfo(ack);
-  QuicPacketNumberLength largest_observed_length =
+  size_t ack_size = 0;
+  if (quic_version_ <= QUIC_VERSION_33) {
+    AckFrameInfo ack_info = GetAckFrameInfo(ack);
+    QuicPacketNumberLength largest_observed_length =
+        GetMinSequenceNumberLength(ack.largest_observed);
+    QuicPacketNumberLength missing_packet_number_length =
+        GetMinSequenceNumberLength(ack_info.max_delta);
+
+    ack_size = GetMinAckFrameSize(quic_version_, largest_observed_length);
+    if (!ack_info.nack_ranges.empty()) {
+      ack_size += kNumberOfNackRangesSize;
+      if (quic_version_ <= QUIC_VERSION_31) {
+        ack_size += kNumberOfRevivedPacketsSize;
+      }
+      ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) *
+                  (missing_packet_number_length + PACKET_1BYTE_PACKET_NUMBER);
+    }
+
+    // In version 23, if the ack will be truncated due to too many nack ranges,
+    // then do not include the number of timestamps (1 byte).
+    if (ack_info.nack_ranges.size() <= kMaxNackRanges) {
+      // 1 byte for the number of timestamps.
+      ack_size += 1;
+      ack_size += GetAckFrameTimeStampSize(ack);
+    }
+
+    return ack_size;
+  }
+
+  NewAckFrameInfo ack_info = GetNewAckFrameInfo(ack);
+  QuicPacketNumberLength largest_acked_length =
       GetMinSequenceNumberLength(ack.largest_observed);
-  QuicPacketNumberLength missing_packet_number_length =
-      GetMinSequenceNumberLength(ack_info.max_delta);
+  QuicPacketNumberLength ack_block_length =
+      GetMinSequenceNumberLength(ack_info.max_block_length);
 
-  size_t ack_size = GetMinAckFrameSize(largest_observed_length);
-  if (!ack_info.nack_ranges.empty()) {
-    ack_size += kNumberOfNackRangesSize;
-    if (quic_version_ <= QUIC_VERSION_31) {
-      ack_size += kNumberOfRevivedPacketsSize;
-    }
-    ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) *
-                (missing_packet_number_length + PACKET_1BYTE_PACKET_NUMBER);
+  ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length);
+  // First ack block length.
+  ack_size += ack_block_length;
+  if (!ack_info.ack_blocks.empty()) {
+    ack_size += kNumberOfAckBlocksSize;
+    ack_size += min(ack_info.ack_blocks.size(), kMaxAckBlocks) *
+                (ack_block_length + PACKET_1BYTE_PACKET_NUMBER);
   }
 
-  // In version 23, if the ack will be truncated due to too many nack ranges,
-  // then do not include the number of timestamps (1 byte).
-  if (ack_info.nack_ranges.size() <= kMaxNackRanges) {
-    // 1 byte for the number of timestamps.
-    ack_size += 1;
-    if (ack.received_packet_times.size() > 0) {
-      // 1 byte for packet number, 4 bytes for timestamp for the first
-      // packet.
-      ack_size += 5;
-
-      // 1 byte for packet number, 2 bytes for timestamp for the other
-      // packets.
-      ack_size += 3 * (ack.received_packet_times.size() - 1);
-    }
-  }
+  // Include timestamps.
+  ack_size += GetAckFrameTimeStampSize(ack);
 
   return ack_size;
 }
@@ -1821,7 +2017,7 @@
       return GetAckFrameSize(*frame.ack_frame, packet_number_length);
     }
     case STOP_WAITING_FRAME:
-      return GetStopWaitingFrameSize(packet_number_length);
+      return GetStopWaitingFrameSize(quic_version_, packet_number_length);
     case MTU_DISCOVERY_FRAME:
     // MTU discovery frames are serialized as ping frames.
     case PING_FRAME:
@@ -1965,9 +2161,9 @@
   QuicPacketNumberLength missing_packet_number_length =
       GetMinSequenceNumberLength(ack_info.max_delta);
   // Determine whether we need to truncate ranges.
-  size_t available_range_bytes = writer->capacity() - writer->length() -
-                                 kNumberOfNackRangesSize -
-                                 GetMinAckFrameSize(largest_observed_length);
+  size_t available_range_bytes =
+      writer->capacity() - writer->length() - kNumberOfNackRangesSize -
+      GetMinAckFrameSize(quic_version_, largest_observed_length);
   if (quic_version_ <= QUIC_VERSION_31) {
     available_range_bytes -= kNumberOfRevivedPacketsSize;
   }
@@ -2090,6 +2286,118 @@
   return true;
 }
 
+bool QuicFramer::AppendNewAckFrameAndTypeByte(const QuicAckFrame& frame,
+                                              QuicDataWriter* writer) {
+  NewAckFrameInfo new_ack_info = GetNewAckFrameInfo(frame);
+  QuicPacketNumber largest_acked = frame.largest_observed;
+  QuicPacketNumberLength largest_acked_length =
+      GetMinSequenceNumberLength(largest_acked);
+  QuicPacketNumberLength ack_block_length =
+      GetMinSequenceNumberLength(new_ack_info.max_block_length);
+  // Calculate available bytes for timestamps and ack blocks.
+  int32_t available_timestamp_and_ack_block_bytes =
+      writer->capacity() - writer->length() - ack_block_length -
+      GetMinAckFrameSize(quic_version_, largest_acked_length) -
+      (!new_ack_info.ack_blocks.empty() ? kNumberOfAckBlocksSize : 0);
+  DCHECK_LE(0, available_timestamp_and_ack_block_bytes);
+
+  // Write out the type byte by setting the low order bits and doing shifts
+  // to make room for the next bit flags to be set.
+  // Whether there are multiple ack blocks.
+  uint8_t type_byte =
+      new_ack_info.ack_blocks.empty() ? 0 : kQuicHasMultipleAckBlocksMask;
+  type_byte <<= kQuicHasMultipleAckBlocksShift;
+
+  // Largest acked length.
+  type_byte <<= kQuicSequenceNumberLengthShift;
+  type_byte |= GetSequenceNumberFlags(largest_acked_length);
+
+  // Ack block length.
+  type_byte <<= kQuicSequenceNumberLengthShift;
+  type_byte |= GetSequenceNumberFlags(ack_block_length);
+
+  type_byte |= kQuicFrameTypeAckMask;
+
+  if (!writer->WriteUInt8(type_byte)) {
+    return false;
+  }
+
+  // Largest acked.
+  if (!AppendPacketSequenceNumber(largest_acked_length, largest_acked,
+                                  writer)) {
+    return false;
+  }
+
+  // Largest acked delta time.
+  uint64_t ack_delay_time_us = kUFloat16MaxValue;
+  if (!frame.ack_delay_time.IsInfinite()) {
+    DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds());
+    ack_delay_time_us = frame.ack_delay_time.ToMicroseconds();
+  }
+  if (!writer->WriteUFloat16(ack_delay_time_us)) {
+    return false;
+  }
+
+  size_t max_num_ack_blocks = available_timestamp_and_ack_block_bytes /
+                              (ack_block_length + PACKET_1BYTE_PACKET_NUMBER);
+
+  // Number of ack blocks.
+  size_t num_ack_blocks =
+      min(new_ack_info.ack_blocks.size(), max_num_ack_blocks);
+  if (num_ack_blocks > numeric_limits<uint8_t>::max()) {
+    num_ack_blocks = numeric_limits<uint8_t>::max();
+  }
+
+  if (num_ack_blocks > 0) {
+    if (!writer->WriteBytes(&num_ack_blocks, 1)) {
+      return false;
+    }
+  }
+
+  // First ack block length.
+  if (!AppendPacketSequenceNumber(ack_block_length,
+                                  new_ack_info.first_block_length, writer)) {
+    return false;
+  }
+
+  // Ack blocks.
+  if (num_ack_blocks > 0) {
+    std::vector<AckBlock>::reverse_iterator iter =
+        new_ack_info.ack_blocks.rbegin();
+    size_t num_ack_blocks_written = 0;
+    for (; iter != new_ack_info.ack_blocks.rend(); ++iter) {
+      if (!AppendPacketSequenceNumber(PACKET_1BYTE_PACKET_NUMBER, iter->gap,
+                                      writer)) {
+        return false;
+      }
+      if (!AppendPacketSequenceNumber(ack_block_length, iter->length, writer)) {
+        return false;
+      }
+      if (++num_ack_blocks_written == num_ack_blocks) {
+        break;
+      }
+    }
+    DCHECK_EQ(num_ack_blocks, num_ack_blocks_written);
+  }
+
+  // Timestamps.
+  // If we don't have enough available space to append all the timestamps, don't
+  // append any of them.
+  if (writer->capacity() - writer->length() >=
+      GetAckFrameTimeStampSize(frame)) {
+    if (!AppendTimestampToAckFrame(frame, writer)) {
+      return false;
+    }
+  } else {
+    uint8_t num_received_packets = 0;
+    if (!writer->WriteBytes(&num_received_packets, 1)) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
 bool QuicFramer::AppendTimestampToAckFrame(const QuicAckFrame& frame,
                                            QuicDataWriter* writer) {
   DCHECK_GE(numeric_limits<uint8_t>::max(), frame.received_packet_times.size());
@@ -2163,9 +2471,11 @@
       header.packet_number - frame.least_unacked;
   const QuicPacketNumber length_shift =
       header.public_header.packet_number_length * 8;
-  if (!writer->WriteUInt8(frame.entropy_hash)) {
-    QUIC_BUG << " hash failed";
-    return false;
+  if (quic_version_ <= QUIC_VERSION_33) {
+    if (!writer->WriteUInt8(frame.entropy_hash)) {
+      QUIC_BUG << " hash failed";
+      return false;
+    }
   }
 
   if (least_unacked_delta >> length_shift > 0) {
diff --git a/net/quic/quic_framer.h b/net/quic/quic_framer.h
index 694f572..dfcd43b 100644
--- a/net/quic/quic_framer.h
+++ b/net/quic/quic_framer.h
@@ -55,8 +55,12 @@
 const size_t kQuicNumTimestampsSize = 1;
 // Size in bytes reserved for the number of missing packets in ack frames.
 const size_t kNumberOfNackRangesSize = 1;
+// Size in bytes reserved for the number of ack blocks in ack frames.
+const size_t kNumberOfAckBlocksSize = 1;
 // Maximum number of missing packet ranges that can fit within an ack frame.
 const size_t kMaxNackRanges = (1 << (kNumberOfNackRangesSize * 8)) - 1;
+// Maximum number of ack blocks that can fit within an ack frame.
+const size_t kMaxAckBlocks = (1 << (kNumberOfAckBlocksSize * 8)) - 1;
 // Size in bytes reserved for the number of revived packets in ack frames.
 const size_t kNumberOfRevivedPacketsSize = 1;
 // Maximum number of revived packets that can fit within an ack frame.
@@ -222,11 +226,14 @@
   static size_t GetMinStreamFrameSize(QuicStreamId stream_id,
                                       QuicStreamOffset offset,
                                       bool last_frame_in_packet);
-  // Size in bytes of all ack frame fields without the missing packets.
+  // Size in bytes of all ack frame fields without the missing packets or ack
+  // blocks.
   static size_t GetMinAckFrameSize(
+      QuicVersion version,
       QuicPacketNumberLength largest_observed_length);
   // Size in bytes of a stop waiting frame.
   static size_t GetStopWaitingFrameSize(
+      QuicVersion version,
       QuicPacketNumberLength packet_number_length);
   // Size in bytes of all reset stream frame without the error details.
   // Used before QUIC_VERSION_25.
@@ -374,6 +381,30 @@
     NackRangeMap nack_ranges;
   };
 
+  struct AckBlock {
+    AckBlock(uint8_t gap, QuicPacketNumber length);
+    AckBlock(const AckBlock& other);
+    ~AckBlock();
+
+    // Gap to the next ack block.
+    uint8_t gap;
+    // Length of this ack block.
+    QuicPacketNumber length;
+  };
+
+  struct NewAckFrameInfo {
+    NewAckFrameInfo();
+    NewAckFrameInfo(const NewAckFrameInfo& other);
+    ~NewAckFrameInfo();
+
+    // The maximum ack block length.
+    QuicPacketNumber max_block_length;
+    // Length of first ack block.
+    QuicPacketNumber first_block_length;
+    // Ack blocks starting with gaps to next block and ack block lengths.
+    std::vector<AckBlock> ack_blocks;
+  };
+
   bool ProcessDataPacket(QuicDataReader* reader,
                          const QuicPacketPublicHeader& public_header,
                          const QuicEncryptedPacket& packet,
@@ -411,6 +442,9 @@
   bool ProcessAckFrame(QuicDataReader* reader,
                        uint8_t frame_type,
                        QuicAckFrame* frame);
+  bool ProcessNewAckFrame(QuicDataReader* reader,
+                          uint8_t frame_type,
+                          QuicAckFrame* frame);
   bool ProcessTimestampsInAckFrame(QuicDataReader* reader, QuicAckFrame* frame);
   bool ProcessStopWaitingFrame(QuicDataReader* reader,
                                const QuicPacketHeader& public_header,
@@ -447,10 +481,16 @@
   // was created.
   const QuicTime::Delta CalculateTimestampFromWire(uint32_t time_delta_us);
 
+  // Computes the wire size in bytes of time stamps in |ack|.
+  size_t GetAckFrameTimeStampSize(const QuicAckFrame& ack);
+
   // Computes the wire size in bytes of the |ack| frame, assuming no truncation.
   size_t GetAckFrameSize(const QuicAckFrame& ack,
                          QuicPacketNumberLength packet_number_length);
 
+  // Computes the wire size in bytes of the |ack| frame.
+  size_t GetNewAckFrameSize(const QuicAckFrame& ack);
+
   // Computes the wire size in bytes of the payload of |frame|.
   size_t ComputeFrameLength(const QuicFrame& frame,
                             bool last_frame_in_packet,
@@ -466,6 +506,8 @@
 
   static AckFrameInfo GetAckFrameInfo(const QuicAckFrame& frame);
 
+  static NewAckFrameInfo GetNewAckFrameInfo(const QuicAckFrame& frame);
+
   // The Append* methods attempt to write the provided header or frame using the
   // |writer|, and return true if successful.
 
@@ -483,6 +525,8 @@
   bool AppendAckFrameAndTypeByte(const QuicPacketHeader& header,
                                  const QuicAckFrame& frame,
                                  QuicDataWriter* builder);
+  bool AppendNewAckFrameAndTypeByte(const QuicAckFrame& frame,
+                                    QuicDataWriter* builder);
   bool AppendTimestampToAckFrame(const QuicAckFrame& frame,
                                  QuicDataWriter* builder);
   bool AppendStopWaitingFrame(const QuicPacketHeader& header,
diff --git a/net/quic/quic_framer_test.cc b/net/quic/quic_framer_test.cc
index 2039bd3..88fa85ce 100644
--- a/net/quic/quic_framer_test.cc
+++ b/net/quic/quic_framer_test.cc
@@ -45,7 +45,9 @@
 const QuicPathId kPathId = 0x42;
 const QuicPacketNumber kPacketNumber = UINT64_C(0x123456789ABC);
 const QuicPacketNumber kLargestObserved = UINT64_C(0x0123456789ABF);
+const QuicPacketNumber kSmallLargestObserved = UINT16_C(0x1234);
 const QuicPacketNumber kMissingPacket = UINT64_C(0x0123456789ABE);
+const QuicPacketNumber kSmallMissingPacket = UINT16_C(0x1233);
 const QuicPacketNumber kLeastUnacked = UINT64_C(0x0123456789AA0);
 const QuicStreamId kStreamId = UINT64_C(0x01020304);
 const QuicStreamOffset kStreamOffset = UINT64_C(0xBA98FEDC32107654);
@@ -1786,9 +1788,9 @@
   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
   EXPECT_EQ(0xBA, frame.entropy_hash);
   EXPECT_EQ(kLargestObserved, frame.largest_observed);
-  ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow());
+  ASSERT_EQ(1u, frame.packets.NumPacketsSlow());
   ASSERT_EQ(2u, frame.received_packet_times.size());
-  EXPECT_EQ(kMissingPacket, frame.missing_packets.Min());
+  EXPECT_EQ(kMissingPacket, frame.packets.Min());
 
   const size_t kReceivedEntropyOffset = kQuicFrameTypeSize;
   const size_t kLargestObservedOffset =
@@ -1893,7 +1895,8 @@
   };
   // clang-format on
 
-  if (framer_.version() <= QUIC_VERSION_31) {
+  if (framer_.version() <= QUIC_VERSION_31 ||
+      framer_.version() > QUIC_VERSION_33) {
     return;
   }
 
@@ -1910,9 +1913,9 @@
   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
   EXPECT_EQ(0xBA, frame.entropy_hash);
   EXPECT_EQ(kLargestObserved, frame.largest_observed);
-  ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow());
+  ASSERT_EQ(1u, frame.packets.NumPacketsSlow());
   ASSERT_EQ(2u, frame.received_packet_times.size());
-  EXPECT_EQ(kMissingPacket, frame.missing_packets.Min());
+  EXPECT_EQ(kMissingPacket, frame.packets.Min());
 
   const size_t kReceivedEntropyOffset = kQuicFrameTypeSize;
   const size_t kLargestObservedOffset =
@@ -2023,9 +2026,9 @@
   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
   EXPECT_EQ(0xBA, frame.entropy_hash);
   EXPECT_EQ(kLargestObserved, frame.largest_observed);
-  ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow());
+  ASSERT_EQ(1u, frame.packets.NumPacketsSlow());
   ASSERT_EQ(1u, frame.received_packet_times.size());
-  EXPECT_EQ(kMissingPacket, frame.missing_packets.Min());
+  EXPECT_EQ(kMissingPacket, frame.packets.Min());
 
   const size_t kReceivedEntropyOffset = kQuicFrameTypeSize;
   const size_t kLargestObservedOffset =
@@ -2116,7 +2119,8 @@
   };
   // clang-format on
 
-  if (framer_.version() <= QUIC_VERSION_31) {
+  if (framer_.version() <= QUIC_VERSION_31 ||
+      framer_.version() > QUIC_VERSION_33) {
     return;
   }
 
@@ -2133,9 +2137,9 @@
   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
   EXPECT_EQ(0xBA, frame.entropy_hash);
   EXPECT_EQ(kLargestObserved, frame.largest_observed);
-  ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow());
+  ASSERT_EQ(1u, frame.packets.NumPacketsSlow());
   ASSERT_EQ(1u, frame.received_packet_times.size());
-  EXPECT_EQ(kMissingPacket, frame.missing_packets.Min());
+  EXPECT_EQ(kMissingPacket, frame.packets.Min());
 
   const size_t kReceivedEntropyOffset = kQuicFrameTypeSize;
   const size_t kLargestObservedOffset =
@@ -2232,8 +2236,8 @@
   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
   EXPECT_EQ(0xBA, frame.entropy_hash);
   EXPECT_EQ(kLargestObserved, frame.largest_observed);
-  ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow());
-  EXPECT_EQ(kMissingPacket, frame.missing_packets.Min());
+  ASSERT_EQ(1u, frame.packets.NumPacketsSlow());
+  EXPECT_EQ(kMissingPacket, frame.packets.Min());
 
   const size_t kReceivedEntropyOffset = kQuicFrameTypeSize;
   const size_t kLargestObservedOffset =
@@ -2281,6 +2285,233 @@
   }
 }
 
+TEST_P(QuicFramerTest, NewAckFrameOneAckBlock) {
+  // clang-format off
+  unsigned char packet[] = {
+      // public flags (8 byte connection_id)
+      0x3C,
+      // connection_id
+      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
+      // packet number
+      0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+      // private flags
+      0x00,
+
+      // frame type (ack frame)
+      // (one ack block, 2 byte largest observed, 2 byte block length)
+      0x45,
+      // largest acked
+      0x34, 0x12,
+      // Zero delta time.
+      0x00, 0x00,
+      // first ack block length.
+      0x34, 0x12,
+      // num timestamps.
+      0x00,
+  };
+  // clang-format on
+
+  if (framer_.version() <= QUIC_VERSION_33) {
+    return;
+  }
+
+  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+
+  EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
+  ASSERT_TRUE(visitor_.header_.get());
+  EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
+                              !kIncludeDiversificationNonce));
+
+  EXPECT_EQ(0u, visitor_.stream_frames_.size());
+  ASSERT_EQ(1u, visitor_.ack_frames_.size());
+  const QuicAckFrame& frame = *visitor_.ack_frames_[0];
+  EXPECT_EQ(kSmallLargestObserved, frame.largest_observed);
+  EXPECT_FALSE(frame.missing);
+  ASSERT_EQ(4660u, frame.packets.NumPacketsSlow());
+
+  const size_t kLargestAckedOffset = kQuicFrameTypeSize;
+  const size_t kLargestAckedDeltaTimeOffset =
+      kLargestAckedOffset + PACKET_2BYTE_PACKET_NUMBER;
+  const size_t kFirstAckBlockLengthOffset =
+      kLargestAckedDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize;
+  const size_t kNumTimestampsOffset =
+      kFirstAckBlockLengthOffset + PACKET_2BYTE_PACKET_NUMBER;
+  // Now test framing boundaries.
+  const size_t ack_frame_size =
+      kFirstAckBlockLengthOffset + PACKET_2BYTE_PACKET_NUMBER;
+  for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) {
+    string expected_error;
+    if (i < kLargestAckedDeltaTimeOffset) {
+      expected_error = "Unable to read largest acked.";
+    } else if (i < kFirstAckBlockLengthOffset) {
+      expected_error = "Unable to read ack delay time.";
+    } else if (i < kNumTimestampsOffset) {
+      expected_error = "Unable to read first ack block length.";
+    } else {
+      expected_error = "Unable to read num received packets.";
+    }
+    CheckProcessingFails(
+        packet,
+        i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
+                                !kIncludePathId, !kIncludeDiversificationNonce,
+                                PACKET_6BYTE_PACKET_NUMBER),
+        expected_error, QUIC_INVALID_ACK_DATA);
+  }
+}
+
+TEST_P(QuicFramerTest, NewAckFrameTwoTimeStampsMultipleAckBlocks) {
+  // clang-format off
+  unsigned char packet[] = {
+      // public flags (8 byte connection_id)
+      0x3C,
+      // connection_id
+      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
+      // packet number
+      0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+      // private flags
+      0x00,
+
+      // frame type (ack frame)
+      // (more than one ack block, 2 byte largest observed, 2 byte block length)
+      0x65,
+      // largest acked
+      0x34, 0x12,
+      // Zero delta time.
+      0x00, 0x00,
+      // num ack blocks ranges.
+      0x04,
+      // first ack block length.
+      0x01, 0x00,
+      // gap to next block.
+      0x01,
+      // ack block length.
+      0xaf, 0x0e,
+      // gap to next block.
+      0xff,
+      // ack block length.
+      0x00, 0x00,
+      // gap to next block.
+      0x91,
+      // ack block length.
+      0xea, 0x01,
+      // gap to next block.
+      0x05,
+      // ack block length.
+      0x04, 0x00,
+      // Number of timestamps.
+      0x02,
+      // Delta from largest observed.
+      0x01,
+      // Delta time.
+      0x10, 0x32, 0x54, 0x76,
+      // Delta from largest observed.
+      0x02,
+      // Delta time.
+      0x10, 0x32,
+  };
+  // clang-format on
+
+  if (framer_.version() <= QUIC_VERSION_33) {
+    return;
+  }
+
+  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+
+  EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
+  ASSERT_TRUE(visitor_.header_.get());
+  EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
+                              !kIncludeDiversificationNonce));
+
+  EXPECT_EQ(0u, visitor_.stream_frames_.size());
+  ASSERT_EQ(1u, visitor_.ack_frames_.size());
+  const QuicAckFrame& frame = *visitor_.ack_frames_[0];
+  EXPECT_EQ(kSmallLargestObserved, frame.largest_observed);
+  EXPECT_FALSE(frame.missing);
+  ASSERT_EQ(4254u, frame.packets.NumPacketsSlow());
+
+  const size_t kLargestAckedOffset = kQuicFrameTypeSize;
+  const size_t kLargestAckedDeltaTimeOffset =
+      kLargestAckedOffset + PACKET_2BYTE_PACKET_NUMBER;
+  const size_t kNumberOfAckBlocksOffset =
+      kLargestAckedDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize;
+  const size_t kFirstAckBlockLengthOffset =
+      kNumberOfAckBlocksOffset + kNumberOfAckBlocksSize;
+  const size_t kGapToNextBlockOffset1 =
+      kFirstAckBlockLengthOffset + PACKET_2BYTE_PACKET_NUMBER;
+  const size_t kAckBlockLengthOffset1 = kGapToNextBlockOffset1 + 1;
+  const size_t kGapToNextBlockOffset2 =
+      kAckBlockLengthOffset1 + PACKET_2BYTE_PACKET_NUMBER;
+  const size_t kAckBlockLengthOffset2 = kGapToNextBlockOffset2 + 1;
+  const size_t kGapToNextBlockOffset3 =
+      kAckBlockLengthOffset2 + PACKET_2BYTE_PACKET_NUMBER;
+  const size_t kAckBlockLengthOffset3 = kGapToNextBlockOffset3 + 1;
+  const size_t kGapToNextBlockOffset4 =
+      kAckBlockLengthOffset3 + PACKET_2BYTE_PACKET_NUMBER;
+  const size_t kAckBlockLengthOffset4 = kGapToNextBlockOffset3 + 1;
+  const size_t kNumTimestampsOffset =
+      kAckBlockLengthOffset4 + PACKET_2BYTE_PACKET_NUMBER;
+  const size_t kTimestampDeltaLargestObserved1 =
+      kNumTimestampsOffset + kQuicNumTimestampsSize;
+  const size_t kTimestampTimeDeltaLargestObserved1 =
+      kTimestampDeltaLargestObserved1 + 1;
+  const size_t kTimestampDeltaLargestObserved2 =
+      kTimestampTimeDeltaLargestObserved1 + 4;
+  const size_t kTimestampTimeDeltaLargestObserved2 =
+      kTimestampDeltaLargestObserved2 + 1;
+
+  // Now test framing boundaries.
+  const size_t ack_frame_size =
+      kAckBlockLengthOffset4 + PACKET_2BYTE_PACKET_NUMBER;
+  for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) {
+    string expected_error;
+    if (i < kLargestAckedDeltaTimeOffset) {
+      expected_error = "Unable to read largest acked.";
+    } else if (i < kNumberOfAckBlocksOffset) {
+      expected_error = "Unable to read ack delay time.";
+    } else if (i < kFirstAckBlockLengthOffset) {
+      expected_error = "Unable to read num of ack blocks.";
+    } else if (i < kGapToNextBlockOffset1) {
+      expected_error = "Unable to read first ack block length.";
+    } else if (i < kAckBlockLengthOffset1) {
+      expected_error = "Unable to read gap to next ack block.";
+    } else if (i < kGapToNextBlockOffset2) {
+      expected_error = "Unable to ack block length.";
+    } else if (i < kAckBlockLengthOffset2) {
+      expected_error = "Unable to read gap to next ack block.";
+    } else if (i < kGapToNextBlockOffset3) {
+      expected_error = "Unable to ack block length.";
+    } else if (i < kAckBlockLengthOffset3) {
+      expected_error = "Unable to read gap to next ack block.";
+    } else if (i < kGapToNextBlockOffset4) {
+      expected_error = "Unable to ack block length.";
+    } else if (i < kAckBlockLengthOffset4) {
+      expected_error = "Unable to read gap to next ack block.";
+    } else if (i < kNumTimestampsOffset) {
+      expected_error = "Unable to ack block length.";
+    } else if (i < kTimestampDeltaLargestObserved1) {
+      expected_error = "Unable to read num received packets.";
+    } else if (i < kTimestampTimeDeltaLargestObserved1) {
+      expected_error = "Unable to read sequence delta in received packets.";
+    } else if (i < kTimestampDeltaLargestObserved2) {
+      expected_error = "Unable to read time delta in received packets.";
+    } else if (i < kTimestampTimeDeltaLargestObserved2) {
+      expected_error = "Unable to read sequence delta in received packets.";
+    } else {
+      expected_error =
+          "Unable to read incremental time delta in received packets.";
+    }
+
+    CheckProcessingFails(
+        packet,
+        i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
+                                !kIncludePathId, !kIncludeDiversificationNonce,
+                                PACKET_6BYTE_PACKET_NUMBER),
+        expected_error, QUIC_INVALID_ACK_DATA);
+  }
+}
+
 TEST_P(QuicFramerTest, AckFrameVersion32) {
   // clang-format off
   unsigned char packet[] = {
@@ -2313,7 +2544,8 @@
   };
   // clang-format on
 
-  if (framer_.version() <= QUIC_VERSION_31) {
+  if (framer_.version() <= QUIC_VERSION_31 ||
+      framer_.version() > QUIC_VERSION_33) {
     return;
   }
 
@@ -2330,8 +2562,8 @@
   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
   EXPECT_EQ(0xBA, frame.entropy_hash);
   EXPECT_EQ(kLargestObserved, frame.largest_observed);
-  ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow());
-  EXPECT_EQ(kMissingPacket, frame.missing_packets.Min());
+  ASSERT_EQ(1u, frame.packets.NumPacketsSlow());
+  EXPECT_EQ(kMissingPacket, frame.packets.Min());
 
   const size_t kReceivedEntropyOffset = kQuicFrameTypeSize;
   const size_t kLargestObservedOffset =
@@ -2425,8 +2657,8 @@
   const QuicAckFrame& frame = *visitor_.ack_frames_[0];
   EXPECT_EQ(0xBA, frame.entropy_hash);
   EXPECT_EQ(kLargestObserved, frame.largest_observed);
-  ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow());
-  EXPECT_EQ(kMissingPacket, frame.missing_packets.Min());
+  ASSERT_EQ(1u, frame.packets.NumPacketsSlow());
+  EXPECT_EQ(kMissingPacket, frame.packets.Min());
 
   const size_t kReceivedEntropyOffset = kQuicFrameTypeSize;
   const size_t kLargestObservedOffset =
@@ -2506,6 +2738,9 @@
       0x00,
   };
   // clang-format on
+  if (framer_.version() >= QUIC_VERSION_31) {
+    return;
+  }
 
   QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
@@ -2520,7 +2755,7 @@
   QuicAckFrame* frame = visitor_.ack_frames_[0];
   EXPECT_EQ(0xBA, frame->entropy_hash);
   EXPECT_EQ(kLargestObserved, frame->largest_observed);
-  ASSERT_TRUE(frame->missing_packets.Empty());
+  ASSERT_TRUE(frame->packets.Empty());
 
   // Verify that the packet re-serializes identically.
   QuicFrames frames;
@@ -2591,9 +2826,9 @@
   QuicAckFrame* frame = visitor_.ack_frames_[0];
   EXPECT_EQ(0xBA, frame->entropy_hash);
   EXPECT_EQ(kLargestObserved, frame->largest_observed);
-  ASSERT_EQ(500u, frame->missing_packets.NumPacketsSlow());
-  EXPECT_EQ(kMissingPacket - 499, frame->missing_packets.Min());
-  EXPECT_EQ(kMissingPacket, frame->missing_packets.Max());
+  ASSERT_EQ(500u, frame->packets.NumPacketsSlow());
+  EXPECT_EQ(kMissingPacket - 499, frame->packets.Min());
+  EXPECT_EQ(kMissingPacket, frame->packets.Max());
 
   // Verify that the packet re-serializes identically.
   QuicFrames frames;
@@ -2645,7 +2880,8 @@
   };
   // clang-format on
 
-  if (framer_.version() <= QUIC_VERSION_31) {
+  if (framer_.version() <= QUIC_VERSION_31 ||
+      framer_.version() > QUIC_VERSION_33) {
     return;
   }
 
@@ -2662,9 +2898,9 @@
   QuicAckFrame* frame = visitor_.ack_frames_[0];
   EXPECT_EQ(0xBA, frame->entropy_hash);
   EXPECT_EQ(kLargestObserved, frame->largest_observed);
-  ASSERT_EQ(500u, frame->missing_packets.NumPacketsSlow());
-  EXPECT_EQ(kMissingPacket - 499, frame->missing_packets.Min());
-  EXPECT_EQ(kMissingPacket, frame->missing_packets.Max());
+  ASSERT_EQ(500u, frame->packets.NumPacketsSlow());
+  EXPECT_EQ(kMissingPacket - 499, frame->packets.Min());
+  EXPECT_EQ(kMissingPacket, frame->packets.Max());
 
   // Verify that the packet re-serializes identically.
   QuicFrames frames;
@@ -2678,6 +2914,9 @@
 }
 
 TEST_P(QuicFramerTest, StopWaitingFrame) {
+  if (framer_.version() > QUIC_VERSION_33) {
+    return;
+  }
   // clang-format off
   unsigned char packet[] = {
     // public flags (8 byte connection_id)
@@ -2735,6 +2974,56 @@
   }
 }
 
+TEST_P(QuicFramerTest, NewStopWaitingFrame) {
+  if (framer_.version() <= QUIC_VERSION_33) {
+    return;
+  }
+  // clang-format off
+  unsigned char packet[] = {
+    // public flags (8 byte connection_id)
+    0x3C,
+    // connection_id
+    0x10, 0x32, 0x54, 0x76,
+    0x98, 0xBA, 0xDC, 0xFE,
+    // packet number
+    0xA8, 0x9A, 0x78, 0x56,
+    0x34, 0x12,
+    // private flags
+    0x00,
+    // frame type (stop waiting frame)
+    0x06,
+    // least packet number awaiting an ack, delta from packet number.
+    0x08, 0x00, 0x00, 0x00,
+    0x00, 0x00,
+  };
+  // clang-format on
+
+  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+
+  EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
+  ASSERT_TRUE(visitor_.header_.get());
+  EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
+                              !kIncludeDiversificationNonce));
+
+  EXPECT_EQ(0u, visitor_.stream_frames_.size());
+  ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size());
+  const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0];
+  EXPECT_EQ(kLeastUnacked, frame.least_unacked);
+
+  const size_t frame_size = 7;
+  for (size_t i = kQuicFrameTypeSize; i < frame_size; ++i) {
+    string expected_error;
+    expected_error = "Unable to read least unacked delta.";
+    CheckProcessingFails(
+        packet,
+        i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
+                                !kIncludePathId, !kIncludeDiversificationNonce,
+                                PACKET_6BYTE_PACKET_NUMBER),
+        expected_error, QUIC_INVALID_STOP_WAITING_DATA);
+  }
+}
+
 TEST_P(QuicFramerTest, RstStreamFrameQuic) {
   // clang-format off
   unsigned char packet[] = {
@@ -3306,6 +3595,44 @@
   }
 }
 
+TEST_P(QuicFramerTest, OldVersionNegotiationPacket) {
+  // clang-format off
+  unsigned char packet[] = {
+    // public flags (version, 8 byte connection_id)
+    0x3D,
+    // connection_id
+    0x10, 0x32, 0x54, 0x76,
+    0x98, 0xBA, 0xDC, 0xFE,
+    // version tag
+    'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
+    'Q', '2', '.', '0',
+  };
+  // clang-format on
+
+  QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
+
+  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+  EXPECT_TRUE(framer_.ProcessPacket(encrypted));
+  ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
+  ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
+  EXPECT_EQ(2u, visitor_.version_negotiation_packet_->versions.size());
+  EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]);
+
+  for (size_t i = 0; i <= kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID; ++i) {
+    string expected_error;
+    QuicErrorCode error_code = QUIC_INVALID_PACKET_HEADER;
+    if (i < kConnectionIdOffset) {
+      expected_error = "Unable to read public flags.";
+    } else if (i < kVersionOffset) {
+      expected_error = "Unable to read ConnectionId.";
+    } else {
+      expected_error = "Unable to read supported version in negotiation.";
+      error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET;
+    }
+    CheckProcessingFails(packet, i, expected_error, error_code);
+  }
+}
+
 TEST_P(QuicFramerTest, DropFecPacket) {
   // clang-format off
   unsigned char packet[] = {
@@ -3605,7 +3932,7 @@
   unsigned char packet[] = {
       // public flags (version, 8 byte connection_id)
       static_cast<unsigned char>(
-          framer_.version() > QUIC_VERSION_32 ? 0x39 : 0x3D),
+          framer_.version() > QUIC_VERSION_32 ? 0x3D : 0x3D),
       // connection_id
       0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
       // version tag
@@ -3713,7 +4040,7 @@
   unsigned char packet[] = {
     // public flags (8 byte connection_id)
     static_cast<unsigned char>(
-        framer_.version() > QUIC_VERSION_32 ? 0x79 : 0x7D),
+        framer_.version() > QUIC_VERSION_32 ? 0x7D : 0x7D),
     // connection_id
     0x10, 0x32, 0x54, 0x76,
     0x98, 0xBA, 0xDC, 0xFE,
@@ -3754,7 +4081,7 @@
   // clang-format off
   unsigned char packet[] = {
       // public flags (version, 8 byte connection_id)
-      0x09,
+      0x0D,
       // connection_id
       0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
       // version tag
@@ -3772,6 +4099,10 @@
 }
 
 TEST_P(QuicFramerTest, BuildAckFramePacket) {
+  if (framer_.version() > QUIC_VERSION_33) {
+    return;
+  }
+
   QuicPacketHeader header;
   header.public_header.connection_id = kConnectionId;
   header.public_header.reset_flag = false;
@@ -3785,7 +4116,7 @@
   ack_frame.entropy_hash = 0x43;
   ack_frame.largest_observed = kLargestObserved;
   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
-  ack_frame.missing_packets.Add(kMissingPacket);
+  ack_frame.packets.Add(kMissingPacket);
 
   QuicFrames frames;
   frames.push_back(QuicFrame(&ack_frame));
@@ -3873,6 +4204,10 @@
 // revived packets. (In both the large and small packet cases below).
 
 TEST_P(QuicFramerTest, BuildTruncatedAckFrameLargePacket) {
+  if (framer_.version() > QUIC_VERSION_33) {
+    return;
+  }
+
   QuicPacketHeader header;
   header.public_header.connection_id = kConnectionId;
   header.public_header.reset_flag = false;
@@ -3890,7 +4225,7 @@
   ack_frame.largest_observed = 2 * 300;
   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
   for (size_t i = 1; i < 2 * 300; i += 2) {
-    ack_frame.missing_packets.Add(i);
+    ack_frame.packets.Add(i);
   }
 
   QuicFrames frames;
@@ -4067,6 +4402,10 @@
 }
 
 TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacket) {
+  if (framer_.version() > QUIC_VERSION_33) {
+    return;
+  }
+
   QuicPacketHeader header;
   header.public_header.connection_id = kConnectionId;
   header.public_header.reset_flag = false;
@@ -4084,7 +4423,7 @@
   ack_frame.largest_observed = 2 * 300;
   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
   for (size_t i = 1; i < 2 * 300; i += 2) {
-    ack_frame.missing_packets.Add(i);
+    ack_frame.packets.Add(i);
   }
 
   QuicFrames frames;
@@ -4172,7 +4511,268 @@
   }
 }
 
+TEST_P(QuicFramerTest, BuildNewAckFramePacketOneAckBlock) {
+  if (framer_.version() <= QUIC_VERSION_33) {
+    return;
+  }
+
+  QuicPacketHeader header;
+  header.public_header.connection_id = kConnectionId;
+  header.public_header.reset_flag = false;
+  header.public_header.version_flag = false;
+  header.packet_number = kPacketNumber;
+
+  // Use kSmallLargestObserved to make this test finished in a short time.
+  QuicAckFrame ack_frame;
+  ack_frame.largest_observed = kSmallLargestObserved;
+  ack_frame.ack_delay_time = QuicTime::Delta::Zero();
+  ack_frame.missing = false;
+  ack_frame.packets.Add(1, kSmallLargestObserved + 1);
+
+  QuicFrames frames;
+  frames.push_back(QuicFrame(&ack_frame));
+
+  // clang-format off
+  unsigned char packet[] = {
+      // public flags (8 byte connection_id)
+      0x38,
+      // connection_id
+      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
+      // packet number
+      0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+      // private flags
+      0x00,
+
+      // frame type (ack frame)
+      // (no ack blocks, 2 byte largest observed, 2 byte block length)
+      0x45,
+      // largest acked
+      0x34, 0x12,
+      // Zero delta time.
+      0x00, 0x00,
+      // first ack block length.
+      0x34, 0x12,
+      // num timestamps.
+      0x00,
+  };
+  // clang-format on
+
+  std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
+  ASSERT_TRUE(data != nullptr);
+
+  test::CompareCharArraysWithHexError("constructed packet", data->data(),
+                                      data->length(), AsChars(packet),
+                                      arraysize(packet));
+}
+
+TEST_P(QuicFramerTest, BuildNewAckFramePacketMultipleAckBlocks) {
+  if (framer_.version() <= QUIC_VERSION_33) {
+    return;
+  }
+
+  QuicPacketHeader header;
+  header.public_header.connection_id = kConnectionId;
+  header.public_header.reset_flag = false;
+  header.public_header.version_flag = false;
+  header.packet_number = kPacketNumber;
+
+  // Use kSmallLargestObserved to make this test finished in a short time.
+  QuicAckFrame ack_frame;
+  ack_frame.largest_observed = kSmallLargestObserved;
+  ack_frame.ack_delay_time = QuicTime::Delta::Zero();
+  ack_frame.missing = false;
+  ack_frame.packets.Add(1, 5);
+  ack_frame.packets.Add(10, 500);
+  ack_frame.packets.Add(900, kSmallMissingPacket);
+  ack_frame.packets.Add(kSmallMissingPacket + 1, kSmallLargestObserved + 1);
+
+  QuicFrames frames;
+  frames.push_back(QuicFrame(&ack_frame));
+
+  // clang-format off
+  unsigned char packet[] = {
+      // public flags (8 byte connection_id)
+      0x38,
+      // connection_id
+      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
+      // packet number
+      0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+      // private flags
+      0x00,
+
+      // frame type (ack frame)
+      // (has ack blocks, 2 byte largest observed, 2 byte block length)
+      0x65,
+      // largest acked
+      0x34, 0x12,
+      // Zero delta time.
+      0x00, 0x00,
+      // num ack blocks ranges.
+      0x04,
+      // first ack block length.
+      0x01, 0x00,
+      // gap to next block.
+      0x01,
+      // ack block length.
+      0xaf, 0x0e,
+      // gap to next block.
+      0xff,
+      // ack block length.
+      0x00, 0x00,
+      // gap to next block.
+      0x91,
+      // ack block length.
+      0xea, 0x01,
+      // gap to next block.
+      0x05,
+      // ack block length.
+      0x04, 0x00,
+      // num timestamps.
+      0x00,
+  };
+  // clang-format on
+
+  std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
+  ASSERT_TRUE(data != nullptr);
+
+  test::CompareCharArraysWithHexError("constructed packet", data->data(),
+                                      data->length(), AsChars(packet),
+                                      arraysize(packet));
+}
+
+TEST_P(QuicFramerTest, BuildNewAckFramePacketMaxAckBlocks) {
+  if (framer_.version() <= QUIC_VERSION_33) {
+    return;
+  }
+
+  QuicPacketHeader header;
+  header.public_header.connection_id = kConnectionId;
+  header.public_header.reset_flag = false;
+  header.public_header.version_flag = false;
+  header.packet_number = kPacketNumber;
+
+  // Use kSmallLargestObservedto make this test finished in a short time.
+  QuicAckFrame ack_frame;
+  ack_frame.largest_observed = kSmallLargestObserved;
+  ack_frame.ack_delay_time = QuicTime::Delta::Zero();
+  ack_frame.missing = false;
+  // 300 ack blocks.
+  for (size_t i = 2; i < 2 * 300; i += 2) {
+    ack_frame.packets.Add(i);
+  }
+  ack_frame.packets.Add(600, kSmallLargestObserved + 1);
+
+  QuicFrames frames;
+  frames.push_back(QuicFrame(&ack_frame));
+
+  // clang-format off
+  unsigned char packet[] = {
+      // public flags (8 byte connection_id)
+      0x38,
+      // connection_id
+      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
+      // packet number
+      0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+      // private flags
+      0x00,
+      // frame type (ack frame)
+      // (has ack blocks, 2 byte largest observed, 2 byte block length)
+      0x65,
+      // largest acked
+      0x34, 0x12,
+      // Zero delta time.
+      0x00, 0x00,
+      // num ack blocks ranges.
+      0xff,
+      // first ack block length.
+      0xdd, 0x0f,
+      // 255 = 4 * 63 + 3
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+      // num timestamps.
+      0x00,
+  };
+
+  std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
+  ASSERT_TRUE(data != nullptr);
+
+  test::CompareCharArraysWithHexError("constructed packet", data->data(),
+                                      data->length(), AsChars(packet),
+                                      arraysize(packet));
+}
+
 TEST_P(QuicFramerTest, BuildStopWaitingPacket) {
+  if (framer_.version() > QUIC_VERSION_33) {
+    return;
+  }
   QuicPacketHeader header;
   header.public_header.connection_id = kConnectionId;
   header.public_header.reset_flag = false;
@@ -4220,6 +4820,53 @@
                                       arraysize(packet));
 }
 
+TEST_P(QuicFramerTest, BuildNewStopWaitingPacket) {
+  if (framer_.version() <= QUIC_VERSION_33) {
+    return;
+  }
+  QuicPacketHeader header;
+  header.public_header.connection_id = kConnectionId;
+  header.public_header.reset_flag = false;
+  header.public_header.version_flag = false;
+  header.fec_flag = false;
+  header.entropy_flag = false;
+  header.packet_number = kPacketNumber;
+  header.fec_group = 0;
+
+  QuicStopWaitingFrame stop_waiting_frame;
+  stop_waiting_frame.least_unacked = kLeastUnacked;
+
+  QuicFrames frames;
+  frames.push_back(QuicFrame(&stop_waiting_frame));
+
+  // clang-format off
+  unsigned char packet[] = {
+    // public flags (8 byte connection_id)
+    0x38,
+    // connection_id
+    0x10, 0x32, 0x54, 0x76,
+    0x98, 0xBA, 0xDC, 0xFE,
+    // packet number
+    0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+    // private flags (entropy)
+    0x00,
+
+    // frame type (stop waiting frame)
+    0x06,
+    // least packet number awaiting an ack, delta from packet number.
+    0x1C, 0x00, 0x00, 0x00,
+    0x00, 0x00,
+  };
+  // clang-format on
+
+  std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
+  ASSERT_TRUE(data != nullptr);
+
+  test::CompareCharArraysWithHexError("constructed packet", data->data(),
+                                      data->length(), AsChars(packet),
+                                      arraysize(packet));
+}
+
 TEST_P(QuicFramerTest, BuildRstFramePacketQuic) {
   QuicPacketHeader header;
   header.public_header.connection_id = kConnectionId;
@@ -4866,8 +5513,13 @@
   header.packet_number = kPacketNumber;
   header.fec_group = 0;
 
+  QuicAckFrame ack_frame;
   // Create a packet with just the ack.
-  QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u);
+  if (framer_.version() <= QUIC_VERSION_33) {
+    ack_frame = MakeAckFrameWithNackRanges(300, 0u);
+  } else {
+    ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
+  }
   QuicFrame frame;
   frame.type = ACK_FRAME;
   frame.ack_frame = &ack_frame;
@@ -4887,11 +5539,21 @@
       QuicEncryptedPacket(buffer, encrypted_length, false)));
   ASSERT_EQ(1u, visitor_.ack_frames_.size());
   QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
-  EXPECT_TRUE(processed_ack_frame.is_truncated);
-  EXPECT_EQ(510u, processed_ack_frame.largest_observed);
-  ASSERT_EQ(255u, processed_ack_frame.missing_packets.NumPacketsSlow());
-  EXPECT_EQ(1u, processed_ack_frame.missing_packets.Min());
-  EXPECT_EQ(509u, processed_ack_frame.missing_packets.Max());
+  if (framer_.version() <= QUIC_VERSION_33) {
+    EXPECT_TRUE(processed_ack_frame.is_truncated);
+    EXPECT_EQ(510u, processed_ack_frame.largest_observed);
+    EXPECT_TRUE(processed_ack_frame.missing);
+    ASSERT_EQ(255u, processed_ack_frame.packets.NumPacketsSlow());
+    EXPECT_EQ(1u, processed_ack_frame.packets.Min());
+    EXPECT_EQ(509u, processed_ack_frame.packets.Max());
+  } else {
+    EXPECT_FALSE(processed_ack_frame.is_truncated);
+    EXPECT_FALSE(processed_ack_frame.missing);
+    EXPECT_EQ(600u, processed_ack_frame.largest_observed);
+    ASSERT_EQ(256u, processed_ack_frame.packets.NumPacketsSlow());
+    EXPECT_EQ(90u, processed_ack_frame.packets.Min());
+    EXPECT_EQ(600u, processed_ack_frame.packets.Max());
+  }
 }
 
 TEST_P(QuicFramerTest, AckTruncationSmallPacket) {
@@ -4905,7 +5567,12 @@
   header.fec_group = 0;
 
   // Create a packet with just the ack.
-  QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u);
+  QuicAckFrame ack_frame;
+  if (framer_.version() <= QUIC_VERSION_33) {
+    ack_frame = MakeAckFrameWithNackRanges(300, 0u);
+  } else {
+    ack_frame = MakeAckFrameWithAckBlocks(300, 0u);
+  }
   QuicFrame frame;
   frame.type = ACK_FRAME;
   frame.ack_frame = &ack_frame;
@@ -4926,11 +5593,21 @@
       QuicEncryptedPacket(buffer, encrypted_length, false)));
   ASSERT_EQ(1u, visitor_.ack_frames_.size());
   QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
-  EXPECT_TRUE(processed_ack_frame.is_truncated);
-  EXPECT_EQ(476u, processed_ack_frame.largest_observed);
-  ASSERT_EQ(238u, processed_ack_frame.missing_packets.NumPacketsSlow());
-  EXPECT_EQ(1u, processed_ack_frame.missing_packets.Min());
-  EXPECT_EQ(475u, processed_ack_frame.missing_packets.Max());
+  if (framer_.version() <= QUIC_VERSION_33) {
+    EXPECT_TRUE(processed_ack_frame.is_truncated);
+    EXPECT_EQ(476u, processed_ack_frame.largest_observed);
+    EXPECT_TRUE(processed_ack_frame.missing);
+    ASSERT_EQ(238u, processed_ack_frame.packets.NumPacketsSlow());
+    EXPECT_EQ(1u, processed_ack_frame.packets.Min());
+    EXPECT_EQ(475u, processed_ack_frame.packets.Max());
+  } else {
+    EXPECT_FALSE(processed_ack_frame.is_truncated);
+    EXPECT_EQ(600u, processed_ack_frame.largest_observed);
+    EXPECT_FALSE(processed_ack_frame.missing);
+    ASSERT_EQ(239u, processed_ack_frame.packets.NumPacketsSlow());
+    EXPECT_EQ(124u, processed_ack_frame.packets.Min());
+    EXPECT_EQ(600u, processed_ack_frame.packets.Max());
+  }
 }
 
 TEST_P(QuicFramerTest, CleanTruncation) {
@@ -4945,7 +5622,7 @@
 
   QuicAckFrame ack_frame;
   ack_frame.largest_observed = 201;
-  ack_frame.missing_packets.Add(1, ack_frame.largest_observed);
+  ack_frame.packets.Add(1, ack_frame.largest_observed);
 
   // Create a packet with just the ack.
   QuicFrame frame;
@@ -5137,7 +5814,8 @@
 
   std::unique_ptr<QuicEncryptedPacket> packet(ConstructMisFramedEncryptedPacket(
       42, false, false, false, kDefaultPathId, kTestQuicStreamId, kTestString,
-      PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, nullptr));
+      PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, nullptr,
+      Perspective::IS_SERVER));
 
   MockFramerVisitor visitor;
   framer_.set_visitor(&visitor);
diff --git a/net/quic/quic_headers_stream_test.cc b/net/quic/quic_headers_stream_test.cc
index d2c241d..f84dc9b 100644
--- a/net/quic/quic_headers_stream_test.cc
+++ b/net/quic/quic_headers_stream_test.cc
@@ -373,6 +373,9 @@
 }
 
 TEST_P(QuicHeadersStreamTest, EmptyHeaderHOLBlockedTime) {
+  if (!FLAGS_quic_measure_headers_hol_blocking_time) {
+    return;
+  }
   EXPECT_CALL(session_, OnHeadersHeadOfLineBlocking(_)).Times(0);
   testing::InSequence seq;
   bool fin = true;
@@ -405,6 +408,9 @@
 }
 
 TEST_P(QuicHeadersStreamTest, NonEmptyHeaderHOLBlockedTime) {
+  if (!FLAGS_quic_measure_headers_hol_blocking_time) {
+    return;
+  }
   QuicStreamId stream_id;
   bool fin = true;
   QuicStreamFrame stream_frames[10];
diff --git a/net/quic/quic_http_stream_test.cc b/net/quic/quic_http_stream_test.cc
index b24dabf..d8556f5 100644
--- a/net/quic/quic_http_stream_test.cc
+++ b/net/quic/quic_http_stream_test.cc
@@ -149,7 +149,16 @@
         promise_id_(kServerDataStreamId1),
         stream_id_(kClientDataStreamId1),
         connection_id_(2),
-        maker_(GetParam(), connection_id_, &clock_, kDefaultServerHostName),
+        client_maker_(GetParam(),
+                      connection_id_,
+                      &clock_,
+                      kDefaultServerHostName,
+                      Perspective::IS_CLIENT),
+        server_maker_(GetParam(),
+                      connection_id_,
+                      &clock_,
+                      kDefaultServerHostName,
+                      Perspective::IS_SERVER),
         random_generator_(0),
         response_offset_(0) {
     IPAddress ip(192, 0, 2, 33);
@@ -284,11 +293,11 @@
   void SetRequest(const string& method,
                   const string& path,
                   RequestPriority priority) {
-    request_headers_ = maker_.GetRequestHeaders(method, "http", path);
+    request_headers_ = client_maker_.GetRequestHeaders(method, "http", path);
   }
 
   void SetResponse(const string& status, const string& body) {
-    response_headers_ = maker_.GetResponseHeaders(status);
+    response_headers_ = server_maker_.GetResponseHeaders(status);
     response_data_ = body;
   }
 
@@ -298,19 +307,32 @@
       bool should_include_version,
       bool fin,
       QuicStreamOffset offset,
-      base::StringPiece data) {
-    return maker_.MakeDataPacket(packet_number, stream_id,
+      base::StringPiece data,
+      QuicTestPacketMaker* maker) {
+    return maker->MakeDataPacket(packet_number, stream_id,
                                  should_include_version, fin, offset, data);
   }
 
-  std::unique_ptr<QuicReceivedPacket> ConstructDataPacket(
+  std::unique_ptr<QuicReceivedPacket> ConstructClientDataPacket(
       QuicPacketNumber packet_number,
       bool should_include_version,
       bool fin,
       QuicStreamOffset offset,
       base::StringPiece data) {
     return InnerConstructDataPacket(packet_number, stream_id_,
-                                    should_include_version, fin, offset, data);
+                                    should_include_version, fin, offset, data,
+                                    &client_maker_);
+  }
+
+  std::unique_ptr<QuicReceivedPacket> ConstructServerDataPacket(
+      QuicPacketNumber packet_number,
+      bool should_include_version,
+      bool fin,
+      QuicStreamOffset offset,
+      base::StringPiece data) {
+    return InnerConstructDataPacket(packet_number, stream_id_,
+                                    should_include_version, fin, offset, data,
+                                    &server_maker_);
   }
 
   std::unique_ptr<QuicReceivedPacket> InnerConstructRequestHeadersPacket(
@@ -322,7 +344,7 @@
       size_t* spdy_headers_frame_length) {
     SpdyPriority priority =
         ConvertRequestPriorityToQuicPriority(request_priority);
-    return maker_.MakeRequestHeadersPacket(
+    return client_maker_.MakeRequestHeadersPacket(
         packet_number, stream_id, should_include_version, fin, priority,
         request_headers_, spdy_headers_frame_length);
   }
@@ -342,7 +364,7 @@
       QuicStreamId stream_id,
       bool fin,
       size_t* spdy_headers_frame_length) {
-    return maker_.MakeResponseHeadersPacket(
+    return server_maker_.MakeResponseHeadersPacket(
         packet_number, stream_id, !kIncludeVersion, fin, response_headers_,
         spdy_headers_frame_length, &response_offset_);
   }
@@ -360,7 +382,7 @@
       bool fin,
       size_t* spdy_headers_frame_length,
       QuicStreamOffset* offset) {
-    return maker_.MakeResponseHeadersPacket(
+    return server_maker_.MakeResponseHeadersPacket(
         packet_number, stream_id_, !kIncludeVersion, fin, response_headers_,
         spdy_headers_frame_length, offset);
   }
@@ -371,28 +393,28 @@
       const SpdyHeaderBlock& trailers,
       size_t* spdy_headers_frame_length,
       QuicStreamOffset* offset) {
-    return maker_.MakeResponseHeadersPacket(packet_number, stream_id_,
-                                            !kIncludeVersion, fin, trailers,
-                                            spdy_headers_frame_length, offset);
+    return server_maker_.MakeResponseHeadersPacket(
+        packet_number, stream_id_, !kIncludeVersion, fin, trailers,
+        spdy_headers_frame_length, offset);
   }
 
-  std::unique_ptr<QuicReceivedPacket> ConstructRstStreamPacket(
+  std::unique_ptr<QuicReceivedPacket> ConstructClientRstStreamPacket(
       QuicPacketNumber packet_number) {
-    return maker_.MakeRstPacket(
+    return client_maker_.MakeRstPacket(
         packet_number, true, stream_id_,
         AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam()));
   }
 
-  std::unique_ptr<QuicReceivedPacket> ConstructRstStreamCancelledPacket(
+  std::unique_ptr<QuicReceivedPacket> ConstructClientRstStreamCancelledPacket(
       QuicPacketNumber packet_number) {
-    return maker_.MakeRstPacket(packet_number, !kIncludeVersion, stream_id_,
-                                QUIC_STREAM_CANCELLED);
+    return client_maker_.MakeRstPacket(packet_number, !kIncludeVersion,
+                                       stream_id_, QUIC_STREAM_CANCELLED);
   }
 
-  std::unique_ptr<QuicReceivedPacket> ConstructRstStreamVaryMismatchPacket(
-      QuicPacketNumber packet_number) {
-    return maker_.MakeRstPacket(packet_number, !kIncludeVersion, promise_id_,
-                                QUIC_PROMISE_VARY_MISMATCH);
+  std::unique_ptr<QuicReceivedPacket>
+  ConstructClientRstStreamVaryMismatchPacket(QuicPacketNumber packet_number) {
+    return client_maker_.MakeRstPacket(packet_number, !kIncludeVersion,
+                                       promise_id_, QUIC_PROMISE_VARY_MISMATCH);
   }
 
   std::unique_ptr<QuicReceivedPacket> ConstructAckAndRstStreamPacket(
@@ -400,7 +422,7 @@
       QuicPacketNumber largest_received,
       QuicPacketNumber ack_least_unacked,
       QuicPacketNumber stop_least_unacked) {
-    return maker_.MakeAckAndRstPacket(
+    return client_maker_.MakeAckAndRstPacket(
         packet_number, !kIncludeVersion, stream_id_, QUIC_STREAM_CANCELLED,
         largest_received, ack_least_unacked, stop_least_unacked,
         !kIncludeCongestionFeedback);
@@ -411,12 +433,22 @@
     return ConstructAckAndRstStreamPacket(packet_number, 2, 1, 1);
   }
 
-  std::unique_ptr<QuicReceivedPacket> ConstructAckPacket(
+  std::unique_ptr<QuicReceivedPacket> ConstructClientAckPacket(
       QuicPacketNumber packet_number,
       QuicPacketNumber largest_received,
       QuicPacketNumber least_unacked) {
-    return maker_.MakeAckPacket(packet_number, largest_received, least_unacked,
-                                !kIncludeCongestionFeedback);
+    return client_maker_.MakeAckPacket(packet_number, largest_received,
+                                       least_unacked,
+                                       !kIncludeCongestionFeedback);
+  }
+
+  std::unique_ptr<QuicReceivedPacket> ConstructServerAckPacket(
+      QuicPacketNumber packet_number,
+      QuicPacketNumber largest_received,
+      QuicPacketNumber least_unacked) {
+    return server_maker_.MakeAckPacket(packet_number, largest_received,
+                                       least_unacked,
+                                       !kIncludeCongestionFeedback);
   }
 
   void ReceivePromise(QuicStreamId id) {
@@ -461,9 +493,9 @@
   string serialized_push_promise_;
   const QuicStreamId stream_id_;
 
- private:
   const QuicConnectionId connection_id_;
-  QuicTestPacketMaker maker_;
+  QuicTestPacketMaker client_maker_;
+  QuicTestPacketMaker server_maker_;
   IPEndPoint self_addr_;
   IPEndPoint peer_addr_;
   MockRandom random_generator_;
@@ -516,7 +548,7 @@
             stream_->SendRequest(headers_, &response_, callback_.callback()));
 
   // Ack the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback()));
 
@@ -555,7 +587,7 @@
   size_t spdy_request_header_frame_length;
   AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY,
                                          &spdy_request_header_frame_length));
-  AddWrite(ConstructAckPacket(2, 3, 1));  // Ack the data packet.
+  AddWrite(ConstructClientAckPacket(2, 3, 1));  // Ack the data packet.
 
   Initialize();
 
@@ -568,9 +600,8 @@
 
   EXPECT_EQ(OK,
             stream_->SendRequest(headers_, &response_, callback_.callback()));
-
   // Ack the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback()));
 
@@ -592,7 +623,7 @@
   // Send the response body.
   const char kResponseBody[] = "Hello world!";
   ProcessPacket(
-      ConstructDataPacket(3, false, !kFin, /*offset=*/0, kResponseBody));
+      ConstructServerDataPacket(3, false, !kFin, /*offset=*/0, kResponseBody));
   SpdyHeaderBlock trailers;
   size_t spdy_trailers_frame_length;
   trailers["foo"] = "bar";
@@ -658,7 +689,7 @@
             stream_->SendRequest(headers_, &response_, callback_.callback()));
 
   // Ack the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback()));
 
@@ -760,7 +791,7 @@
             stream_->SendRequest(headers_, &response_, callback_.callback()));
 
   // Ack the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
   EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback()));
 
   EXPECT_TRUE(QuicHttpStreamPeer::WasHandshakeConfirmed(stream_.get()));
@@ -791,7 +822,7 @@
             stream_->SendRequest(headers_, &response_, callback_.callback()));
 
   // Ack the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
   EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback()));
 
   // The test setup defaults handshake to be confirmed. Manually set
@@ -843,8 +874,8 @@
   size_t spdy_request_headers_frame_length;
   AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
                                          &spdy_request_headers_frame_length));
-  AddWrite(ConstructDataPacket(2, kIncludeVersion, kFin, 0, kUploadData));
-  AddWrite(ConstructAckPacket(3, 3, 1));
+  AddWrite(ConstructClientDataPacket(2, kIncludeVersion, kFin, 0, kUploadData));
+  AddWrite(ConstructClientAckPacket(3, 3, 1));
 
   Initialize();
 
@@ -864,7 +895,7 @@
             stream_->SendRequest(headers_, &response_, callback_.callback()));
 
   // Ack both packets in the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   // Send the response headers (but not the body).
   SetResponse("200 OK", string());
@@ -881,7 +912,7 @@
 
   // Send the response body.
   const char kResponseBody[] = "Hello world!";
-  ProcessPacket(ConstructDataPacket(3, false, kFin, 0, kResponseBody));
+  ProcessPacket(ConstructServerDataPacket(3, false, kFin, 0, kResponseBody));
   // Since the body has already arrived, this should return immediately.
   EXPECT_EQ(static_cast<int>(strlen(kResponseBody)),
             stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(),
@@ -906,10 +937,11 @@
   size_t spdy_request_headers_frame_length;
   AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
                                          &spdy_request_headers_frame_length));
-  AddWrite(ConstructDataPacket(2, kIncludeVersion, !kFin, 0, kUploadData));
   AddWrite(
-      ConstructDataPacket(3, kIncludeVersion, kFin, chunk_size, kUploadData));
-  AddWrite(ConstructAckPacket(4, 3, 1));
+      ConstructClientDataPacket(2, kIncludeVersion, !kFin, 0, kUploadData));
+  AddWrite(ConstructClientDataPacket(3, kIncludeVersion, kFin, chunk_size,
+                                     kUploadData));
+  AddWrite(ConstructClientAckPacket(4, 3, 1));
   Initialize();
 
   ChunkedUploadDataStream upload_data_stream(0);
@@ -931,7 +963,7 @@
   EXPECT_EQ(OK, callback_.WaitForResult());
 
   // Ack both packets in the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   // Send the response headers (but not the body).
   SetResponse("200 OK", string());
@@ -948,8 +980,8 @@
 
   // Send the response body.
   const char kResponseBody[] = "Hello world!";
-  ProcessPacket(ConstructDataPacket(3, false, kFin, response_data_.length(),
-                                    kResponseBody));
+  ProcessPacket(ConstructServerDataPacket(
+      3, false, kFin, response_data_.length(), kResponseBody));
 
   // Since the body has already arrived, this should return immediately.
   ASSERT_EQ(static_cast<int>(strlen(kResponseBody)),
@@ -975,9 +1007,10 @@
   size_t spdy_request_headers_frame_length;
   AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
                                          &spdy_request_headers_frame_length));
-  AddWrite(ConstructDataPacket(2, kIncludeVersion, !kFin, 0, kUploadData));
-  AddWrite(ConstructDataPacket(3, kIncludeVersion, kFin, chunk_size, ""));
-  AddWrite(ConstructAckPacket(4, 3, 1));
+  AddWrite(
+      ConstructClientDataPacket(2, kIncludeVersion, !kFin, 0, kUploadData));
+  AddWrite(ConstructClientDataPacket(3, kIncludeVersion, kFin, chunk_size, ""));
+  AddWrite(ConstructClientAckPacket(4, 3, 1));
   Initialize();
 
   ChunkedUploadDataStream upload_data_stream(0);
@@ -998,7 +1031,7 @@
   upload_data_stream.AppendData(nullptr, 0, true);
   EXPECT_EQ(OK, callback_.WaitForResult());
 
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   // Send the response headers (but not the body).
   SetResponse("200 OK", string());
@@ -1015,8 +1048,8 @@
 
   // Send the response body.
   const char kResponseBody[] = "Hello world!";
-  ProcessPacket(ConstructDataPacket(3, false, kFin, response_data_.length(),
-                                    kResponseBody));
+  ProcessPacket(ConstructServerDataPacket(
+      3, false, kFin, response_data_.length(), kResponseBody));
 
   // The body has arrived, but it is delivered asynchronously
   ASSERT_EQ(static_cast<int>(strlen(kResponseBody)),
@@ -1040,8 +1073,8 @@
   size_t spdy_request_headers_frame_length;
   AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
                                          &spdy_request_headers_frame_length));
-  AddWrite(ConstructDataPacket(2, kIncludeVersion, kFin, 0, ""));
-  AddWrite(ConstructAckPacket(3, 3, 1));
+  AddWrite(ConstructClientDataPacket(2, kIncludeVersion, kFin, 0, ""));
+  AddWrite(ConstructClientAckPacket(3, 3, 1));
   Initialize();
 
   ChunkedUploadDataStream upload_data_stream(0);
@@ -1061,7 +1094,7 @@
   upload_data_stream.AppendData(nullptr, 0, true);
   EXPECT_EQ(OK, callback_.WaitForResult());
 
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
 
   // Send the response headers (but not the body).
   SetResponse("200 OK", string());
@@ -1078,8 +1111,8 @@
 
   // Send the response body.
   const char kResponseBody[] = "Hello world!";
-  ProcessPacket(ConstructDataPacket(3, false, kFin, response_data_.length(),
-                                    kResponseBody));
+  ProcessPacket(ConstructServerDataPacket(
+      3, false, kFin, response_data_.length(), kResponseBody));
 
   // The body has arrived, but it is delivered asynchronously
   ASSERT_EQ(static_cast<int>(strlen(kResponseBody)),
@@ -1117,7 +1150,7 @@
             stream_->SendRequest(headers_, &response_, callback_.callback()));
 
   // Ack the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
   EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback()));
 
   // Send the response with a body.
@@ -1166,7 +1199,7 @@
             ConvertQuicPriorityToRequestPriority(reliable_stream->priority()));
 
   // Ack the request.
-  ProcessPacket(ConstructAckPacket(1, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(1, 0, 0));
   EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback()));
 
   // Send the response with a body.
@@ -1191,7 +1224,7 @@
   SetRequest("GET", "/", MEDIUM);
   use_closing_stream_ = true;
 
-  AddWrite(ConstructRstStreamPacket(1));
+  AddWrite(ConstructClientRstStreamPacket(1));
 
   Initialize();
 
@@ -1297,8 +1330,8 @@
 
   // Receive the promised response body.
   const char kResponseBody[] = "Hello world!";
-  ProcessPacket(
-      InnerConstructDataPacket(2, promise_id_, false, kFin, 0, kResponseBody));
+  ProcessPacket(InnerConstructDataPacket(2, promise_id_, false, kFin, 0,
+                                         kResponseBody, &server_maker_));
 
   // Now sending a matching request will have successful rendezvous
   // with the promised stream.
@@ -1367,8 +1400,8 @@
 
   // Receive the promised response body.
   const char kResponseBody[] = "Hello world!";
-  ProcessPacket(
-      InnerConstructDataPacket(2, promise_id_, false, kFin, 0, kResponseBody));
+  ProcessPacket(InnerConstructDataPacket(2, promise_id_, false, kFin, 0,
+                                         kResponseBody, &server_maker_));
 
   base::MessageLoop::current()->RunUntilIdle();
 
@@ -1440,8 +1473,8 @@
 
   // Receive the promised response body.
   const char kResponseBody[] = "Hello world!";
-  ProcessPacket(
-      InnerConstructDataPacket(2, promise_id_, false, kFin, 0, kResponseBody));
+  ProcessPacket(InnerConstructDataPacket(2, promise_id_, false, kFin, 0,
+                                         kResponseBody, &server_maker_));
 
   // Now sending a matching request will have successful rendezvous
   // with the promised stream.
@@ -1542,8 +1575,8 @@
 
   // Receive the promised response body.
   const char kResponseBody[] = "Hello world!";
-  ProcessPacket(
-      InnerConstructDataPacket(2, promise_id_, false, kFin, 0, kResponseBody));
+  ProcessPacket(InnerConstructDataPacket(2, promise_id_, false, kFin, 0,
+                                         kResponseBody, &server_maker_));
 
   base::MessageLoop::current()->RunUntilIdle();
 
@@ -1583,12 +1616,12 @@
   request_headers_["accept-encoding"] = "sdch";
 
   size_t spdy_request_header_frame_length;
-  AddWrite(ConstructRstStreamVaryMismatchPacket(1));
+  AddWrite(ConstructClientRstStreamVaryMismatchPacket(1));
   AddWrite(InnerConstructRequestHeadersPacket(
       2, stream_id_ + 2, !kIncludeVersion, kFin, DEFAULT_PRIORITY,
       &spdy_request_header_frame_length));
-  AddWrite(ConstructAckPacket(3, 3, 1));
-  AddWrite(ConstructRstStreamCancelledPacket(4));
+  AddWrite(ConstructClientAckPacket(3, 3, 1));
+  AddWrite(ConstructClientRstStreamCancelledPacket(4));
   Initialize();
 
   // Initialize the first stream, for receiving the promise on.
@@ -1656,7 +1689,7 @@
   // client-initiated version of |promised_stream_| works as intended.
 
   // Ack the request.
-  ProcessPacket(ConstructAckPacket(2, 0, 0));
+  ProcessPacket(ConstructServerAckPacket(2, 0, 0));
 
   SetResponse("404 Not Found", string());
   size_t spdy_response_header_frame_length;
diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc
index 31e6b04..e17b2435 100644
--- a/net/quic/quic_network_transaction_unittest.cc
+++ b/net/quic/quic_network_transaction_unittest.cc
@@ -244,7 +244,16 @@
  protected:
   QuicNetworkTransactionTest()
       : clock_(new MockClock),
-        maker_(GetParam(), 0, clock_, kDefaultServerHostName),
+        client_maker_(GetParam(),
+                      0,
+                      clock_,
+                      kDefaultServerHostName,
+                      Perspective::IS_CLIENT),
+        server_maker_(GetParam(),
+                      0,
+                      clock_,
+                      kDefaultServerHostName,
+                      Perspective::IS_SERVER),
         cert_transparency_verifier_(new MultiLogCTVerifier()),
         ssl_config_service_(new SSLConfigServiceDefaults),
         proxy_service_(ProxyService::CreateDirect()),
@@ -283,79 +292,88 @@
     base::MessageLoop::current()->RunUntilIdle();
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructClientConnectionClosePacket(
       QuicPacketNumber num) {
-    return maker_.MakeConnectionClosePacket(num);
+    return client_maker_.MakeConnectionClosePacket(num);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructGoAwayPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructServerConnectionClosePacket(
+      QuicPacketNumber num) {
+    return server_maker_.MakeConnectionClosePacket(num);
+  }
+
+  std::unique_ptr<QuicEncryptedPacket> ConstructServerGoAwayPacket(
       QuicPacketNumber num,
       QuicErrorCode error_code,
       std::string reason_phrase) {
-    return maker_.MakeGoAwayPacket(num, error_code, reason_phrase);
+    return server_maker_.MakeGoAwayPacket(num, error_code, reason_phrase);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructAckPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
       QuicPacketNumber largest_received,
       QuicPacketNumber least_unacked) {
-    return maker_.MakeAckPacket(2, largest_received, least_unacked,
-                                least_unacked, true);
+    return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
+                                       least_unacked, true);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructAckAndRstPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructClientAckAndRstPacket(
       QuicPacketNumber num,
       QuicStreamId stream_id,
       QuicRstStreamErrorCode error_code,
       QuicPacketNumber largest_received,
       QuicPacketNumber ack_least_unacked,
       QuicPacketNumber stop_least_unacked) {
-    return maker_.MakeAckAndRstPacket(num, false, stream_id, error_code,
-                                      largest_received, ack_least_unacked,
-                                      stop_least_unacked, true);
+    return client_maker_.MakeAckAndRstPacket(
+        num, false, stream_id, error_code, largest_received, ack_least_unacked,
+        stop_least_unacked, true);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructAckPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
       QuicPacketNumber largest_received,
       QuicPacketNumber least_unacked,
       QuicTestPacketMaker* maker) {
-    return maker->MakeAckPacket(2, largest_received, least_unacked,
-                                least_unacked, true);
+    return client_maker_.MakeAckPacket(2, largest_received, least_unacked,
+                                       least_unacked, true);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
+  std::unique_ptr<QuicEncryptedPacket>
+  ConstructClientAckAndConnectionClosePacket(
       QuicPacketNumber packet_number,
       QuicPacketNumber largest_received,
       QuicPacketNumber ack_least_unacked,
       QuicPacketNumber stop_least_unacked) {
-    return maker_.MakeAckPacket(packet_number, largest_received,
-                                ack_least_unacked, stop_least_unacked, true);
+    return client_maker_.MakeAckPacket(packet_number, largest_received,
+                                       ack_least_unacked, stop_least_unacked,
+                                       true);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
+  std::unique_ptr<QuicEncryptedPacket>
+  ConstructClientAckAndConnectionClosePacket(
       QuicPacketNumber num,
       QuicTime::Delta delta_time_largest_observed,
       QuicPacketNumber largest_received,
       QuicPacketNumber least_unacked,
       QuicErrorCode quic_error,
       const std::string& quic_error_details) {
-    return maker_.MakeAckAndConnectionClosePacket(
+    return client_maker_.MakeAckAndConnectionClosePacket(
         num, false, delta_time_largest_observed, largest_received,
         least_unacked, quic_error, quic_error_details);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructRstPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructServerRstPacket(
       QuicPacketNumber num,
       bool include_version,
       QuicStreamId stream_id,
       QuicRstStreamErrorCode error_code) {
-    return maker_.MakeRstPacket(num, include_version, stream_id, error_code);
+    return server_maker_.MakeRstPacket(num, include_version, stream_id,
+                                       error_code);
   }
 
   // Uses default QuicTestPacketMaker.
   SpdyHeaderBlock GetRequestHeaders(const std::string& method,
                                     const std::string& scheme,
                                     const std::string& path) {
-    return GetRequestHeaders(method, scheme, path, &maker_);
+    return GetRequestHeaders(method, scheme, path, &client_maker_);
   }
 
   // Uses customized QuicTestPacketMaker.
@@ -367,27 +385,27 @@
   }
 
   SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
-    return maker_.GetResponseHeaders(status);
+    return server_maker_.GetResponseHeaders(status);
   }
 
   // Appends alt_svc headers in the response headers.
   SpdyHeaderBlock GetResponseHeaders(const std::string& status,
                                      const std::string& alt_svc) {
-    return maker_.GetResponseHeaders(status, alt_svc);
+    return server_maker_.GetResponseHeaders(status, alt_svc);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructDataPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
       QuicPacketNumber packet_number,
       QuicStreamId stream_id,
       bool should_include_version,
       bool fin,
       QuicStreamOffset offset,
       base::StringPiece data) {
-    return maker_.MakeDataPacket(packet_number, stream_id,
-                                 should_include_version, fin, offset, data);
+    return server_maker_.MakeDataPacket(
+        packet_number, stream_id, should_include_version, fin, offset, data);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
       QuicPacketNumber packet_number,
       QuicStreamId stream_id,
       bool should_include_version,
@@ -396,12 +414,12 @@
       QuicStreamOffset* offset) {
     SpdyPriority priority =
         ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
-    return maker_.MakeRequestHeadersPacketWithOffsetTracking(
+    return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
         packet_number, stream_id, should_include_version, fin, priority,
         headers, offset);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
       QuicPacketNumber packet_number,
       QuicStreamId stream_id,
       bool should_include_version,
@@ -411,68 +429,68 @@
       QuicTestPacketMaker* maker) {
     SpdyPriority priority =
         ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
-    return maker->MakeRequestHeadersPacketWithOffsetTracking(
+    return client_maker_.MakeRequestHeadersPacketWithOffsetTracking(
         packet_number, stream_id, should_include_version, fin, priority,
         headers, offset);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
       QuicPacketNumber packet_number,
       QuicStreamId stream_id,
       bool should_include_version,
       bool fin,
       const SpdyHeaderBlock& headers) {
-    return ConstructRequestHeadersPacket(packet_number, stream_id,
-                                         should_include_version, fin, headers,
-                                         nullptr, &maker_);
+    return ConstructClientRequestHeadersPacket(
+        packet_number, stream_id, should_include_version, fin, headers, nullptr,
+        &client_maker_);
   }
-  std::unique_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
       QuicPacketNumber packet_number,
       QuicStreamId stream_id,
       bool should_include_version,
       bool fin,
       const SpdyHeaderBlock& headers,
       QuicTestPacketMaker* maker) {
-    return ConstructRequestHeadersPacket(packet_number, stream_id,
-                                         should_include_version, fin, headers,
-                                         nullptr, maker);
+    return ConstructClientRequestHeadersPacket(packet_number, stream_id,
+                                               should_include_version, fin,
+                                               headers, nullptr, maker);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
       QuicPacketNumber packet_number,
       QuicStreamId stream_id,
       bool should_include_version,
       bool fin,
       const SpdyHeaderBlock& headers) {
-    return ConstructResponseHeadersPacket(packet_number, stream_id,
-                                          should_include_version, fin, headers,
-                                          nullptr, &maker_);
+    return ConstructServerResponseHeadersPacket(
+        packet_number, stream_id, should_include_version, fin, headers, nullptr,
+        &server_maker_);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
       QuicPacketNumber packet_number,
       QuicStreamId stream_id,
       bool should_include_version,
       bool fin,
       const SpdyHeaderBlock& headers,
       QuicTestPacketMaker* maker) {
-    return ConstructResponseHeadersPacket(packet_number, stream_id,
-                                          should_include_version, fin, headers,
-                                          nullptr, maker);
+    return ConstructServerResponseHeadersPacket(packet_number, stream_id,
+                                                should_include_version, fin,
+                                                headers, nullptr, maker);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
       QuicPacketNumber packet_number,
       QuicStreamId stream_id,
       bool should_include_version,
       bool fin,
       const SpdyHeaderBlock& headers,
       QuicStreamOffset* offset) {
-    return maker_.MakeResponseHeadersPacketWithOffsetTracking(
+    return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
         packet_number, stream_id, should_include_version, fin, headers, offset);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
       QuicPacketNumber packet_number,
       QuicStreamId stream_id,
       bool should_include_version,
@@ -480,7 +498,7 @@
       const SpdyHeaderBlock& headers,
       QuicStreamOffset* offset,
       QuicTestPacketMaker* maker) {
-    return maker->MakeResponseHeadersPacketWithOffsetTracking(
+    return server_maker_.MakeResponseHeadersPacketWithOffsetTracking(
         packet_number, stream_id, should_include_version, fin, headers, offset);
   }
 
@@ -627,7 +645,8 @@
   }
 
   MockClock* clock_;  // Owned by QuicStreamFactory after CreateSession.
-  QuicTestPacketMaker maker_;
+  QuicTestPacketMaker client_maker_;
+  QuicTestPacketMaker server_maker_;
   std::unique_ptr<HttpNetworkSession> session_;
   MockClientSocketFactory socket_factory_;
   ProofVerifyDetailsChromium verify_details_;
@@ -676,14 +695,14 @@
       HostPortPair::FromString("mail.example.org:443"));
 
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);  // No more data to read
 
   mock_quic_data.AddSocketDataToFactory(&socket_factory_);
@@ -743,14 +762,14 @@
       ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70");
 
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "http", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "http", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);               // EOF
 
@@ -782,16 +801,16 @@
   proxy_service_ =
       ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70");
 
-  maker_.set_hostname(origin_host);
+  client_maker_.set_hostname(origin_host);
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "http", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "http", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);
   mock_quic_data.AddSocketDataToFactory(&socket_factory_);
@@ -835,16 +854,16 @@
   verify_details.cert_verify_result.verified_cert = cert;
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
-  maker_.set_hostname(origin.host());
+  client_maker_.set_hostname(origin.host());
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);
   mock_quic_data.AddSocketDataToFactory(&socket_factory_);
@@ -924,14 +943,14 @@
   socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
 
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);               // EOF
 
@@ -958,14 +977,14 @@
   socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
 
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);               // EOF
 
@@ -1058,14 +1077,14 @@
   socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
 
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);               // EOF
 
@@ -1079,20 +1098,20 @@
 
 TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
   // Read a GoAway packet with
   // QuicErrorCode: QUIC_ERROR_MIGRATING_PORT from the peer.
-  mock_quic_data.AddRead(
-      ConstructGoAwayPacket(2, QUIC_ERROR_MIGRATING_PORT,
-                            "connection migration with port change only"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(3, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckAndRstPacket(
+  mock_quic_data.AddRead(ConstructServerGoAwayPacket(
+      2, QUIC_ERROR_MIGRATING_PORT,
+      "connection migration with port change only"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(3, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckAndRstPacket(
       3, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 3, 3, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);               // EOF
@@ -1184,32 +1203,33 @@
   // Open a session to foo.example.org:443 using the first entry of the
   // alternative service list.
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
       1, kClientDataStreamId1, true, true,
       GetRequestHeaders("GET", "https", "/"), &request_header_offset));
 
   std::string alt_svc_list =
       "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", "
       "quic=\"bar.example.org:445\"";
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false,
       GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
 
   // Second QUIC request data.
   // Connection pooling, using existing session, no need to include version
   // as version negotiation has been completed.
-  mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
       3, kClientDataStreamId2, false, true,
       GetRequestHeaders("GET", "https", "/"), &request_header_offset));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
       &response_header_offset));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(4, kClientDataStreamId2, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(
+      ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);               // EOF
 
@@ -1231,26 +1251,27 @@
   QuicStreamOffset response_header_offset(0);
 
   // First request.
-  mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
       1, kClientDataStreamId1, true, true,
       GetRequestHeaders("GET", "https", "/"), &request_header_offset));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
       &response_header_offset));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
 
   // Second request.
-  mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
       3, kClientDataStreamId2, false, true,
       GetRequestHeaders("GET", "https", "/"), &request_header_offset));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
       &response_header_offset));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(4, kClientDataStreamId2, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(
+      ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);               // EOF
 
@@ -1296,28 +1317,32 @@
   QuicStreamOffset response_header_offset(0);
 
   // First request.
-  mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
       1, kClientDataStreamId1, true, true,
       GetRequestHeaders("GET", "https", "/"), &request_header_offset));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
       &response_header_offset));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
 
   // Second request.
-  QuicTestPacketMaker maker2(GetParam(), 0, clock_, origin2.host());
-  mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
+  QuicTestPacketMaker client_maker2(GetParam(), 0, clock_, origin2.host(),
+                                    Perspective::IS_CLIENT);
+  QuicTestPacketMaker server_maker2(GetParam(), 0, clock_, origin2.host(),
+                                    Perspective::IS_SERVER);
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
       3, kClientDataStreamId2, false, true,
-      GetRequestHeaders("GET", "https", "/", &maker2), &request_header_offset,
-      &maker2));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+      GetRequestHeaders("GET", "https", "/", &client_maker2),
+      &request_header_offset, &client_maker2));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
-      &response_header_offset, &maker2));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(4, kClientDataStreamId2, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
+      &response_header_offset, &server_maker2));
+  mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId2,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(
+      ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);               // EOF
 
@@ -1349,7 +1374,6 @@
       AlternativeServiceInfo(alternative_service1, expiration));
   http_server_properties_.SetAlternativeServices(url::SchemeHostPort(origin2),
                                                  alternative_services);
-
   // First request opens connection to |destination1|
   // with QuicServerId.host() == origin1.host().
   SendRequestAndExpectQuicResponse("hello!");
@@ -1357,6 +1381,7 @@
   // Second request pools to existing connection with same destination,
   // because certificate matches, even though QuicServerId is different.
   request_.url = origin2;
+
   SendRequestAndExpectQuicResponse("hello!");
 }
 
@@ -1397,32 +1422,35 @@
   QuicStreamOffset request_header_offset = 0;
   QuicStreamOffset response_header_offset = 0;
 
-  QuicTestPacketMaker maker(GetParam(), 0, clock_, "mail.example.org");
-  maker_.set_hostname("www.example.org");
+  QuicTestPacketMaker client_maker(GetParam(), 0, clock_, "mail.example.org",
+                                   Perspective::IS_CLIENT);
+  server_maker_.set_hostname("www.example.org");
+  client_maker_.set_hostname("www.example.org");
   MockQuicData mock_quic_data;
 
   // First QUIC request data.
-  mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
       1, kClientDataStreamId1, true, true,
       GetRequestHeaders("GET", "https", "/"), &request_header_offset));
 
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
       &response_header_offset));
-  mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
-                                             true, 0, "hello from mail QUIC!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(
+      2, kClientDataStreamId1, false, true, 0, "hello from mail QUIC!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   // Second QUIC request data.
-  mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
       3, kClientDataStreamId2, false, true,
-      GetRequestHeaders("GET", "https", "/", &maker), &request_header_offset,
-      &maker));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+      GetRequestHeaders("GET", "https", "/", &client_maker),
+      &request_header_offset, &client_maker));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
       &response_header_offset));
-  mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false,
-                                             true, 0, "hello from mail QUIC!"));
-  mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(
+      4, kClientDataStreamId2, false, true, 0, "hello from mail QUIC!"));
+  mock_quic_data.AddWrite(
+      ConstructClientAckAndConnectionClosePacket(4, 4, 3, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);               // EOF
 
@@ -1486,14 +1514,14 @@
   socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
 
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);               // EOF
 
@@ -1530,14 +1558,14 @@
   socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
 
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddRead(SYNCHRONOUS, 0);  // EOF
 
   mock_quic_data.AddSocketDataToFactory(&socket_factory_);
@@ -1562,14 +1590,14 @@
   socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
 
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);               // EOF
 
@@ -1597,14 +1625,14 @@
   socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
 
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);               // EOF
 
@@ -1659,14 +1687,14 @@
   socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
 
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);               // EOF
 
@@ -1704,14 +1732,14 @@
   socket_factory_.AddSocketDataProvider(&http_data);
 
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);               // EOF
 
@@ -1778,14 +1806,14 @@
 
 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) {
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);               // EOF
 
@@ -1798,14 +1826,14 @@
 
 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) {
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);               // EOF
   mock_quic_data.AddSocketDataToFactory(&socket_factory_);
@@ -1863,14 +1891,14 @@
 
 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) {
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddSocketDataToFactory(&socket_factory_);
 
@@ -1912,12 +1940,12 @@
 TEST_P(QuicNetworkTransactionTest,
        LogGranularQuicErrorCodeOnQuicProtocolErrorLocal) {
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
   // Read a close connection packet with
   // QuicErrorCode: QUIC_CRYPTO_VERSION_NOT_SUPPORTED from the peer.
-  mock_quic_data.AddRead(ConstructConnectionClosePacket(1));
+  mock_quic_data.AddRead(ConstructServerConnectionClosePacket(1));
   mock_quic_data.AddSocketDataToFactory(&socket_factory_);
 
   // The non-alternate protocol job needs to hang in order to guarantee that
@@ -1962,15 +1990,15 @@
 TEST_P(QuicNetworkTransactionTest,
        LogGranularQuicErrorCodeOnQuicProtocolErrorRemote) {
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
   // Peer sending data from an non-existing stream causes this end to raise
   // error and close connection.
   mock_quic_data.AddRead(
-      ConstructRstPacket(1, false, 99, QUIC_STREAM_LAST_ERROR));
+      ConstructServerRstPacket(1, false, 99, QUIC_STREAM_LAST_ERROR));
   std::string quic_error_details = "Data for nonexistent stream";
-  mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(
+  mock_quic_data.AddWrite(ConstructClientAckAndConnectionClosePacket(
       2, QuicTime::Delta::Infinite(), 0, 1, QUIC_INVALID_STREAM_ID,
       quic_error_details));
   mock_quic_data.AddSocketDataToFactory(&socket_factory_);
@@ -2014,7 +2042,8 @@
 
 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) {
   // Alternate-protocol job
-  std::unique_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1));
+  std::unique_ptr<QuicEncryptedPacket> close(
+      ConstructServerConnectionClosePacket(1));
   MockRead quic_reads[] = {
       MockRead(ASYNC, close->data(), close->length()),
       MockRead(ASYNC, ERR_IO_PENDING),  // No more data to read
@@ -2191,11 +2220,11 @@
 
 TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
   MockQuicData mock_quic_data;
-  mock_quic_data.AddSynchronousRead(ConstructConnectionClosePacket(1));
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddSynchronousRead(ConstructServerConnectionClosePacket(1));
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddSocketDataToFactory(&socket_factory_);
 
   // When the QUIC connection fails, we will try the request again over HTTP.
@@ -2227,18 +2256,18 @@
 }
 
 TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) {
-  maker_.set_hostname("www.example.org");
+  client_maker_.set_hostname("www.example.org");
   EXPECT_FALSE(
       test_socket_performance_watcher_factory_.rtt_notification_received());
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
-                                    GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/")));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
       1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
-  mock_quic_data.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 1));
   mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);  // No more read data.
   mock_quic_data.AddSocketDataToFactory(&socket_factory_);
 
@@ -2360,7 +2389,7 @@
         expiration);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
       QuicPacketNumber packet_number,
       QuicStreamId stream_id,
       bool should_include_version,
@@ -2374,16 +2403,16 @@
         headers, offset);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructClientRequestHeadersPacket(
       QuicPacketNumber packet_number,
       QuicStreamId stream_id,
       bool should_include_version,
       QuicTestPacketMaker* maker) {
-    return ConstructRequestHeadersPacket(
+    return ConstructClientRequestHeadersPacket(
         packet_number, stream_id, should_include_version, nullptr, maker);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
       QuicPacketNumber packet_number,
       QuicStreamId stream_id,
       QuicStreamOffset* offset,
@@ -2393,15 +2422,15 @@
         packet_number, stream_id, false, false, headers, offset);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructServerResponseHeadersPacket(
       QuicPacketNumber packet_number,
       QuicStreamId stream_id,
       QuicTestPacketMaker* maker) {
-    return ConstructResponseHeadersPacket(packet_number, stream_id, nullptr,
-                                          maker);
+    return ConstructServerResponseHeadersPacket(packet_number, stream_id,
+                                                nullptr, maker);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructDataPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructServerDataPacket(
       QuicPacketNumber packet_number,
       QuicStreamId stream_id,
       QuicTestPacketMaker* maker) {
@@ -2409,7 +2438,7 @@
                                  "hello");
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructAckPacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructClientAckPacket(
       QuicPacketNumber packet_number,
       QuicPacketNumber largest_received,
       QuicPacketNumber ack_least_unacked,
@@ -2570,27 +2599,35 @@
   verify_details.cert_verify_result.is_issued_by_known_root = true;
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
-  QuicTestPacketMaker maker1(version_, 0, clock_, origin1_);
+  QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
+                                    Perspective::IS_CLIENT);
+  QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
+                                    Perspective::IS_SERVER);
 
   QuicStreamOffset request_header_offset(0);
   QuicStreamOffset response_header_offset(0);
 
   MockQuicData mock_quic_data;
-  mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
-      1, kClientDataStreamId1, true, &request_header_offset, &maker1));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
-      1, kClientDataStreamId1, &response_header_offset, &maker1));
-  mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, &maker1));
-  mock_quic_data.AddWrite(ConstructAckPacket(2, 2, 1, 1, &maker1));
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, &request_header_offset, &client_maker1));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
+      1, kClientDataStreamId1, &response_header_offset, &server_maker1));
+  mock_quic_data.AddRead(
+      ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
 
-  QuicTestPacketMaker maker2(version_, 0, clock_, origin2_);
+  QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
+                                    Perspective::IS_CLIENT);
+  QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
+                                    Perspective::IS_SERVER);
 
-  mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
-      3, kClientDataStreamId2, false, &request_header_offset, &maker2));
-  mock_quic_data.AddRead(ConstructResponseHeadersPacket(
-      3, kClientDataStreamId2, &response_header_offset, &maker2));
-  mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, &maker2));
-  mock_quic_data.AddWrite(ConstructAckPacket(4, 4, 3, 1, &maker2));
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      3, kClientDataStreamId2, false, &request_header_offset, &client_maker2));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
+      3, kClientDataStreamId2, &response_header_offset, &server_maker2));
+  mock_quic_data.AddRead(
+      ConstructServerDataPacket(4, kClientDataStreamId2, &server_maker2));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(4, 4, 3, 1, &client_maker2));
   mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data.AddRead(ASYNC, 0);               // EOF
 
@@ -2639,16 +2676,20 @@
   verify_details2.cert_verify_result.is_issued_by_known_root = true;
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
 
-  QuicTestPacketMaker maker1(version_, 0, clock_, origin1_);
+  QuicTestPacketMaker client_maker1(version_, 0, clock_, origin1_,
+                                    Perspective::IS_CLIENT);
+  QuicTestPacketMaker server_maker1(version_, 0, clock_, origin1_,
+                                    Perspective::IS_SERVER);
 
   MockQuicData mock_quic_data1;
+  mock_quic_data1.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, &client_maker1));
+  mock_quic_data1.AddRead(ConstructServerResponseHeadersPacket(
+      1, kClientDataStreamId1, &server_maker1));
+  mock_quic_data1.AddRead(
+      ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker1));
   mock_quic_data1.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, &maker1));
-  mock_quic_data1.AddRead(
-      ConstructResponseHeadersPacket(1, kClientDataStreamId1, &maker1));
-  mock_quic_data1.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, &maker1));
-  mock_quic_data1.AddWrite(ConstructAckPacket(2, 2, 1, 1, &maker1));
+      ConstructClientAckPacket(2, 2, 1, 1, &client_maker1));
   mock_quic_data1.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data1.AddRead(ASYNC, 0);               // EOF
 
@@ -2656,16 +2697,20 @@
 
   AddHangingSocketData();
 
-  QuicTestPacketMaker maker2(version_, 0, clock_, origin2_);
+  QuicTestPacketMaker client_maker2(version_, 0, clock_, origin2_,
+                                    Perspective::IS_CLIENT);
+  QuicTestPacketMaker server_maker2(version_, 0, clock_, origin2_,
+                                    Perspective::IS_SERVER);
 
   MockQuicData mock_quic_data2;
+  mock_quic_data2.AddWrite(ConstructClientRequestHeadersPacket(
+      1, kClientDataStreamId1, true, &client_maker2));
+  mock_quic_data2.AddRead(ConstructServerResponseHeadersPacket(
+      1, kClientDataStreamId1, &server_maker2));
+  mock_quic_data2.AddRead(
+      ConstructServerDataPacket(2, kClientDataStreamId1, &server_maker2));
   mock_quic_data2.AddWrite(
-      ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, &maker2));
-  mock_quic_data2.AddRead(
-      ConstructResponseHeadersPacket(1, kClientDataStreamId1, &maker2));
-  mock_quic_data2.AddRead(
-      ConstructDataPacket(2, kClientDataStreamId1, &maker2));
-  mock_quic_data2.AddWrite(ConstructAckPacket(2, 2, 1, 1, &maker2));
+      ConstructClientAckPacket(2, 2, 1, 1, &client_maker2));
   mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING);  // No more data to read
   mock_quic_data2.AddRead(ASYNC, 0);               // EOF
 
diff --git a/net/quic/quic_packet_creator_test.cc b/net/quic/quic_packet_creator_test.cc
index 73b5bef..e96b5bb 100644
--- a/net/quic/quic_packet_creator_test.cc
+++ b/net/quic/quic_packet_creator_test.cc
@@ -964,7 +964,10 @@
 
   // Ensure the packet is successfully created, and the packet size estimate
   // matches the serialized packet length.
-  EXPECT_CALL(entropy_calculator_, EntropyHash(_)).WillOnce(testing::Return(0));
+  if (GetParam().version <= QUIC_VERSION_33) {
+    EXPECT_CALL(entropy_calculator_, EntropyHash(_))
+        .WillOnce(testing::Return(0));
+  }
   EXPECT_CALL(delegate_, OnSerializedPacket(_))
       .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
   size_t est_packet_size = creator_.PacketSize();
@@ -1002,7 +1005,9 @@
 
   // Ensure the packet is successfully created, and the packet size estimate
   // may not match the serialized packet length.
-  EXPECT_CALL(entropy_calculator_, EntropyHash(_)).WillOnce(Return(0));
+  if (GetParam().version <= QUIC_VERSION_33) {
+    EXPECT_CALL(entropy_calculator_, EntropyHash(_)).WillOnce(Return(0));
+  }
   size_t est_packet_size = creator_.PacketSize();
   EXPECT_CALL(delegate_, OnSerializedPacket(_))
       .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
diff --git a/net/quic/quic_protocol.cc b/net/quic/quic_protocol.cc
index 2a64fd3..6de40b4 100644
--- a/net/quic/quic_protocol.cc
+++ b/net/quic/quic_protocol.cc
@@ -198,6 +198,8 @@
       return MakeQuicTag('Q', '0', '3', '2');
     case QUIC_VERSION_33:
       return MakeQuicTag('Q', '0', '3', '3');
+    case QUIC_VERSION_34:
+      return MakeQuicTag('Q', '0', '3', '4');
     default:
       // This shold be an ERROR because we should never attempt to convert an
       // invalid QuicVersion to be written to the wire.
@@ -233,6 +235,7 @@
     RETURN_STRING_LITERAL(QUIC_VERSION_31);
     RETURN_STRING_LITERAL(QUIC_VERSION_32);
     RETURN_STRING_LITERAL(QUIC_VERSION_33);
+    RETURN_STRING_LITERAL(QUIC_VERSION_34);
     default:
       return "QUIC_VERSION_UNSUPPORTED";
   }
@@ -287,9 +290,14 @@
 }
 
 bool IsAwaitingPacket(const QuicAckFrame& ack_frame,
-                      QuicPacketNumber packet_number) {
-  return packet_number > ack_frame.largest_observed ||
-         ack_frame.missing_packets.Contains(packet_number);
+                      QuicPacketNumber packet_number,
+                      QuicPacketNumber peer_least_packet_awaiting_ack) {
+  if (ack_frame.missing) {
+    return packet_number > ack_frame.largest_observed ||
+           ack_frame.packets.Contains(packet_number);
+  }
+  return packet_number >= peer_least_packet_awaiting_ack &&
+         !ack_frame.packets.Contains(packet_number);
 }
 
 QuicStopWaitingFrame::QuicStopWaitingFrame()
@@ -302,7 +310,8 @@
       entropy_hash(0),
       is_truncated(false),
       largest_observed(0),
-      ack_delay_time(QuicTime::Delta::Infinite()) {}
+      ack_delay_time(QuicTime::Delta::Infinite()),
+      missing(true) {}
 
 QuicAckFrame::QuicAckFrame(const QuicAckFrame& other) = default;
 
@@ -451,6 +460,11 @@
   packet_number_intervals_.Difference(packet_number, packet_number + 1);
 }
 
+void PacketNumberQueue::Remove(QuicPacketNumber lower,
+                               QuicPacketNumber higher) {
+  packet_number_intervals_.Difference(lower, higher);
+}
+
 bool PacketNumberQueue::RemoveUpTo(QuicPacketNumber higher) {
   if (Empty()) {
     return false;
@@ -486,6 +500,15 @@
   return num_packets;
 }
 
+size_t PacketNumberQueue::NumIntervals() const {
+  return packet_number_intervals_.Size();
+}
+
+QuicPacketNumber PacketNumberQueue::LastIntervalLength() const {
+  DCHECK(!Empty());
+  return packet_number_intervals_.rbegin()->Length();
+}
+
 PacketNumberQueue::const_iterator PacketNumberQueue::begin() const {
   QuicPacketNumber first;
   QuicPacketNumber last;
@@ -536,7 +559,7 @@
   os << "entropy_hash: " << static_cast<int>(ack_frame.entropy_hash)
      << " largest_observed: " << ack_frame.largest_observed
      << " ack_delay_time: " << ack_frame.ack_delay_time.ToMicroseconds()
-     << " missing_packets: [ " << ack_frame.missing_packets
+     << " packets: [ " << ack_frame.packets
      << " ] is_truncated: " << ack_frame.is_truncated
      << " received_packets: [ ";
   for (const std::pair<QuicPacketNumber, QuicTime>& p :
diff --git a/net/quic/quic_protocol.h b/net/quic/quic_protocol.h
index 4d4c051..eaef7c5 100644
--- a/net/quic/quic_protocol.h
+++ b/net/quic/quic_protocol.h
@@ -378,6 +378,8 @@
   QUIC_VERSION_31 = 31,  // Adds a hash of the client hello to crypto proof.
   QUIC_VERSION_32 = 32,  // FEC related fields are removed from wire format.
   QUIC_VERSION_33 = 33,  // Adds diversification nonces.
+  QUIC_VERSION_34 = 34,  // Deprecates entropy and uses new ack and stop waiting
+                         // wire format.
 };
 
 // This vector contains QUIC versions which we currently support.
@@ -388,9 +390,9 @@
 // IMPORTANT: if you are adding to this list, follow the instructions at
 // http://sites/quic/adding-and-removing-versions
 static const QuicVersion kSupportedQuicVersions[] = {
-    QUIC_VERSION_33, QUIC_VERSION_32, QUIC_VERSION_31,
-    QUIC_VERSION_30, QUIC_VERSION_29, QUIC_VERSION_28,
-    QUIC_VERSION_27, QUIC_VERSION_26, QUIC_VERSION_25};
+    QUIC_VERSION_34, QUIC_VERSION_33, QUIC_VERSION_32, QUIC_VERSION_31,
+    QUIC_VERSION_30, QUIC_VERSION_29, QUIC_VERSION_28, QUIC_VERSION_27,
+    QUIC_VERSION_26, QUIC_VERSION_25};
 
 typedef std::vector<QuicVersion> QuicVersionVector;
 
@@ -945,6 +947,10 @@
   // Removes |packet_number| from the set of packets in the queue.
   void Remove(QuicPacketNumber packet_number);
 
+  // Removes packets numbers between [lower, higher) to the set of packets in
+  // the queue. It is undefined behavior to call this with |higher| < |lower|.
+  void Remove(QuicPacketNumber lower, QuicPacketNumber higher);
+
   // Removes packets with values less than |higher| from the set of packets in
   // the queue. Returns true if packets were removed.
   bool RemoveUpTo(QuicPacketNumber higher);
@@ -967,6 +973,13 @@
   // exposed for testing.
   size_t NumPacketsSlow() const;
 
+  // Returns the number of disjoint packet number intervals contained in the
+  // queue.
+  size_t NumIntervals() const;
+
+  // Returns the length of last interval.
+  QuicPacketNumber LastIntervalLength() const;
+
   // Returns iterators over the individual packet numbers.
   const_iterator begin() const;
   const_iterator end() const;
@@ -1015,15 +1028,21 @@
   // Vector of <packet_number, time> for when packets arrived.
   PacketTimeVector received_packet_times;
 
-  // The set of packets which we're expecting and have not received.
-  PacketNumberQueue missing_packets;
+  // Set of packets.
+  PacketNumberQueue packets;
+
+  // If true, |packets| express missing packets. Otherwise, |packets| express
+  // received packets.
+  bool missing;
 };
 
 // True if the packet number is greater than largest_observed or is listed
 // as missing.
 // Always returns false for packet numbers less than least_unacked.
-bool NET_EXPORT_PRIVATE IsAwaitingPacket(const QuicAckFrame& ack_frame,
-                                         QuicPacketNumber packet_number);
+bool NET_EXPORT_PRIVATE
+IsAwaitingPacket(const QuicAckFrame& ack_frame,
+                 QuicPacketNumber packet_number,
+                 QuicPacketNumber peer_least_packet_awaiting_ack);
 
 // Defines for all types of congestion control algorithms that can be used in
 // QUIC. Note that this is separate from the congestion feedback type -
diff --git a/net/quic/quic_protocol_test.cc b/net/quic/quic_protocol_test.cc
index 6a34620..9768004 100644
--- a/net/quic/quic_protocol_test.cc
+++ b/net/quic/quic_protocol_test.cc
@@ -39,11 +39,32 @@
 TEST(QuicProtocolTest, IsAawaitingPacket) {
   QuicAckFrame ack_frame;
   ack_frame.largest_observed = 10u;
-  EXPECT_TRUE(IsAwaitingPacket(ack_frame, 11u));
-  EXPECT_FALSE(IsAwaitingPacket(ack_frame, 1u));
+  EXPECT_TRUE(IsAwaitingPacket(ack_frame, 11u, 0u));
+  EXPECT_FALSE(IsAwaitingPacket(ack_frame, 1u, 0u));
 
-  ack_frame.missing_packets.Add(10);
-  EXPECT_TRUE(IsAwaitingPacket(ack_frame, 10u));
+  ack_frame.packets.Add(10);
+  EXPECT_TRUE(IsAwaitingPacket(ack_frame, 10u, 0u));
+
+  QuicAckFrame ack_frame1;
+  ack_frame1.missing = false;
+  ack_frame1.largest_observed = 10u;
+  ack_frame1.packets.Add(1, 11);
+  EXPECT_TRUE(IsAwaitingPacket(ack_frame1, 11u, 0u));
+  EXPECT_FALSE(IsAwaitingPacket(ack_frame1, 1u, 0u));
+
+  ack_frame1.packets.Remove(10);
+  EXPECT_TRUE(IsAwaitingPacket(ack_frame1, 10u, 0u));
+
+  QuicAckFrame ack_frame2;
+  ack_frame2.missing = false;
+  ack_frame2.largest_observed = 100u;
+  ack_frame2.packets.Add(21, 100);
+  EXPECT_FALSE(IsAwaitingPacket(ack_frame2, 11u, 20u));
+  EXPECT_FALSE(IsAwaitingPacket(ack_frame2, 80u, 20u));
+  EXPECT_TRUE(IsAwaitingPacket(ack_frame2, 101u, 20u));
+
+  ack_frame2.packets.Remove(50);
+  EXPECT_TRUE(IsAwaitingPacket(ack_frame2, 50u, 20u));
 }
 
 TEST(QuicProtocolTest, QuicDeprecatedErrorCodeCount) {
@@ -266,6 +287,19 @@
   EXPECT_TRUE(queue.end() == it_low);
 }
 
+TEST(PacketNumberQueueTest, IntervalLengthAndRemoveInterval) {
+  PacketNumberQueue queue;
+  queue.Add(1, 10);
+  queue.Add(20, 30);
+  queue.Add(40, 50);
+  EXPECT_EQ(3u, queue.NumIntervals());
+  EXPECT_EQ(10u, queue.LastIntervalLength());
+  queue.Remove(9, 21);
+  EXPECT_EQ(3u, queue.NumIntervals());
+  EXPECT_FALSE(queue.Contains(9));
+  EXPECT_FALSE(queue.Contains(20));
+}
+
 }  // namespace
 }  // namespace test
 }  // namespace net
diff --git a/net/quic/quic_received_packet_manager.cc b/net/quic/quic_received_packet_manager.cc
index 9e7a9e5..73226a1 100644
--- a/net/quic/quic_received_packet_manager.cc
+++ b/net/quic/quic_received_packet_manager.cc
@@ -151,17 +151,23 @@
     ack_frame_.received_packet_times.clear();
   }
   ack_frame_updated_ = true;
-  // Adds the range of packet numbers from max(largest observed + 1, least
-  // awaiting ack) up to packet_number not including packet_number.
-  ack_frame_.missing_packets.Add(
-      max(ack_frame_.largest_observed + 1, peer_least_packet_awaiting_ack_),
-      packet_number);
+  if (ack_frame_.missing) {
+    // Adds the range of packet numbers from max(largest observed + 1, least
+    // awaiting ack) up to packet_number not including packet_number.
+    ack_frame_.packets.Add(
+        max(ack_frame_.largest_observed + 1, peer_least_packet_awaiting_ack_),
+        packet_number);
+  } else {
+    ack_frame_.packets.Add(header.packet_number);
+  }
 
   if (ack_frame_.largest_observed > packet_number) {
-    // We've gotten one of the out of order packets - remove it from our
-    // "missing packets" list.
-    DVLOG(1) << "Removing " << packet_number << " from missing list";
-    ack_frame_.missing_packets.Remove(packet_number);
+    if (ack_frame_.missing) {
+      // We've gotten one of the out of order packets - remove it from our
+      // "missing packets" list.
+      DVLOG(1) << "Removing " << packet_number << " from missing list";
+      ack_frame_.packets.Remove(packet_number);
+    }
 
     // Record how out of order stats.
     ++stats_->packets_reordered;
@@ -177,19 +183,27 @@
     ack_frame_.largest_observed = packet_number;
     time_largest_observed_ = receipt_time;
   }
-  entropy_tracker_.RecordPacketEntropyHash(packet_number, header.entropy_hash);
+  if (ack_frame_.missing) {
+    entropy_tracker_.RecordPacketEntropyHash(packet_number,
+                                             header.entropy_hash);
+  }
 
   ack_frame_.received_packet_times.push_back(
       std::make_pair(packet_number, receipt_time));
 }
 
 bool QuicReceivedPacketManager::IsMissing(QuicPacketNumber packet_number) {
-  return ack_frame_.missing_packets.Contains(packet_number);
+  if (ack_frame_.missing) {
+    return ack_frame_.packets.Contains(packet_number);
+  }
+  return packet_number < ack_frame_.largest_observed &&
+         !ack_frame_.packets.Contains(packet_number);
 }
 
 bool QuicReceivedPacketManager::IsAwaitingPacket(
     QuicPacketNumber packet_number) {
-  return ::net::IsAwaitingPacket(ack_frame_, packet_number);
+  return ::net::IsAwaitingPacket(ack_frame_, packet_number,
+                                 peer_least_packet_awaiting_ack_);
 }
 
 namespace {
@@ -208,7 +222,9 @@
 const QuicFrame QuicReceivedPacketManager::GetUpdatedAckFrame(
     QuicTime approximate_now) {
   ack_frame_updated_ = false;
-  ack_frame_.entropy_hash = EntropyHash(ack_frame_.largest_observed);
+  if (ack_frame_.missing) {
+    ack_frame_.entropy_hash = EntropyHash(ack_frame_.largest_observed);
+  }
 
   if (time_largest_observed_ == QuicTime::Zero()) {
     // We have received no packets.
@@ -243,45 +259,63 @@
 
 bool QuicReceivedPacketManager::DontWaitForPacketsBefore(
     QuicPacketNumber least_unacked) {
-  return ack_frame_.missing_packets.RemoveUpTo(least_unacked);
+  peer_least_packet_awaiting_ack_ = least_unacked;
+  return ack_frame_.packets.RemoveUpTo(least_unacked);
 }
 
 void QuicReceivedPacketManager::UpdatePacketInformationSentByPeer(
     const QuicStopWaitingFrame& stop_waiting) {
-  // ValidateAck() should fail if peer_least_packet_awaiting_ack_ shrinks.
+  // ValidateAck() should fail if peer_least_packet_awaiting_ack shrinks.
   DCHECK_LE(peer_least_packet_awaiting_ack_, stop_waiting.least_unacked);
   if (stop_waiting.least_unacked > peer_least_packet_awaiting_ack_) {
-    bool missed_packets = DontWaitForPacketsBefore(stop_waiting.least_unacked);
-    if (missed_packets) {
-      DVLOG(1) << "Updating entropy hashed since we missed packets";
-      // There were some missing packets that we won't ever get now. Recalculate
-      // the received entropy hash.
-      entropy_tracker_.SetCumulativeEntropyUpTo(stop_waiting.least_unacked,
-                                                stop_waiting.entropy_hash);
-      // Ack frame gets updated because missing packets are updated because of
-      // stop waiting frame.
+    bool packets_updated = DontWaitForPacketsBefore(stop_waiting.least_unacked);
+    if (packets_updated) {
+      if (ack_frame_.missing) {
+        DVLOG(1) << "Updating entropy hashed since we missed packets";
+        // There were some missing packets that we won't ever get now.
+        // Recalculate the received entropy hash.
+        entropy_tracker_.SetCumulativeEntropyUpTo(stop_waiting.least_unacked,
+                                                  stop_waiting.entropy_hash);
+      }
+      // Ack frame gets updated because packets set is updated because of stop
+      // waiting frame.
       ack_frame_updated_ = true;
     }
-    peer_least_packet_awaiting_ack_ = stop_waiting.least_unacked;
   }
-  DCHECK(ack_frame_.missing_packets.Empty() ||
-         ack_frame_.missing_packets.Min() >= peer_least_packet_awaiting_ack_);
+  DCHECK(ack_frame_.packets.Empty() ||
+         ack_frame_.packets.Min() >= peer_least_packet_awaiting_ack_);
 }
 
 bool QuicReceivedPacketManager::HasMissingPackets() const {
-  return !ack_frame_.missing_packets.Empty();
+  if (ack_frame_.missing) {
+    return !ack_frame_.packets.Empty();
+  }
+
+  return ack_frame_.packets.NumIntervals() > 1 ||
+         (!ack_frame_.packets.Empty() &&
+          ack_frame_.packets.Min() >
+              max(QuicPacketNumber(1), peer_least_packet_awaiting_ack_));
 }
 
 bool QuicReceivedPacketManager::HasNewMissingPackets() const {
-  return !ack_frame_.missing_packets.Empty() &&
-         (ack_frame_.largest_observed - ack_frame_.missing_packets.Max()) <=
-             kMaxPacketsAfterNewMissing;
+  if (ack_frame_.missing) {
+    return !ack_frame_.packets.Empty() &&
+           (ack_frame_.largest_observed - ack_frame_.packets.Max()) <=
+               kMaxPacketsAfterNewMissing;
+  }
+
+  return HasMissingPackets() &&
+         ack_frame_.packets.LastIntervalLength() <= kMaxPacketsAfterNewMissing;
 }
 
 size_t QuicReceivedPacketManager::NumTrackedPackets() const {
   return entropy_tracker_.size();
 }
 
+void QuicReceivedPacketManager::SetVersion(QuicVersion version) {
+  ack_frame_.missing = version <= QUIC_VERSION_33;
+}
+
 bool QuicReceivedPacketManager::ack_frame_updated() const {
   return ack_frame_updated_;
 }
diff --git a/net/quic/quic_received_packet_manager.h b/net/quic/quic_received_packet_manager.h
index 99f0a5c..44a770b 100644
--- a/net/quic/quic_received_packet_manager.h
+++ b/net/quic/quic_received_packet_manager.h
@@ -140,6 +140,9 @@
   // Returns the number of packets being tracked in the EntropyTracker.
   size_t NumTrackedPackets() const;
 
+  // Sets the mode of packets set of ack_frame_ based on |version|.
+  void SetVersion(QuicVersion version);
+
   QuicPacketNumber peer_least_packet_awaiting_ack() {
     return peer_least_packet_awaiting_ack_;
   }
diff --git a/net/quic/quic_received_packet_manager_test.cc b/net/quic/quic_received_packet_manager_test.cc
index 8016fbd3..a3bca2f5 100644
--- a/net/quic/quic_received_packet_manager_test.cc
+++ b/net/quic/quic_received_packet_manager_test.cc
@@ -186,9 +186,32 @@
   EXPECT_EQ(42 ^ 21, tracker.EntropyHash(9));
 }
 
-class QuicReceivedPacketManagerTest : public ::testing::Test {
+struct TestParams {
+  explicit TestParams(QuicVersion version) : version(version) {}
+
+  friend std::ostream& operator<<(std::ostream& os, const TestParams& p) {
+    os << "{ version: " << QuicVersionToString(p.version) << " }";
+    return os;
+  }
+
+  QuicVersion version;
+};
+
+vector<TestParams> GetTestParams() {
+  vector<TestParams> params;
+  QuicVersionVector all_supported_versions = QuicSupportedVersions();
+  for (size_t i = 0; i < all_supported_versions.size(); ++i) {
+    params.push_back(TestParams(all_supported_versions[i]));
+  }
+  return params;
+}
+
+class QuicReceivedPacketManagerTest
+    : public ::testing::TestWithParam<TestParams> {
  protected:
-  QuicReceivedPacketManagerTest() : received_manager_(&stats_) {}
+  QuicReceivedPacketManagerTest() : received_manager_(&stats_) {
+    received_manager_.SetVersion(GetParam().version);
+  }
 
   void RecordPacketReceipt(QuicPacketNumber packet_number,
                            QuicPacketEntropyHash entropy_hash) {
@@ -208,7 +231,14 @@
   QuicReceivedPacketManager received_manager_;
 };
 
-TEST_F(QuicReceivedPacketManagerTest, ReceivedPacketEntropyHash) {
+INSTANTIATE_TEST_CASE_P(QuicReceivedPacketManagerTest,
+                        QuicReceivedPacketManagerTest,
+                        ::testing::ValuesIn(GetTestParams()));
+
+TEST_P(QuicReceivedPacketManagerTest, ReceivedPacketEntropyHash) {
+  if (GetParam().version > QUIC_VERSION_33) {
+    return;
+  }
   vector<pair<QuicPacketNumber, QuicPacketEntropyHash>> entropies;
   entropies.push_back(std::make_pair(1, 12));
   entropies.push_back(std::make_pair(7, 1));
@@ -239,19 +269,28 @@
   EXPECT_EQ(2u, stats_.packets_reordered);
 }
 
-TEST_F(QuicReceivedPacketManagerTest, EntropyHashBelowLeastObserved) {
+TEST_P(QuicReceivedPacketManagerTest, EntropyHashBelowLeastObserved) {
+  if (GetParam().version > QUIC_VERSION_33) {
+    return;
+  }
   EXPECT_EQ(0, received_manager_.EntropyHash(0));
   RecordPacketReceipt(4, 5);
   EXPECT_EQ(0, received_manager_.EntropyHash(3));
 }
 
-TEST_F(QuicReceivedPacketManagerTest, EntropyHashAboveLargestObserved) {
+TEST_P(QuicReceivedPacketManagerTest, EntropyHashAboveLargestObserved) {
+  if (GetParam().version > QUIC_VERSION_33) {
+    return;
+  }
   EXPECT_EQ(0, received_manager_.EntropyHash(0));
   RecordPacketReceipt(4, 5);
   EXPECT_EQ(0, received_manager_.EntropyHash(3));
 }
 
-TEST_F(QuicReceivedPacketManagerTest, SetCumulativeEntropyUpTo) {
+TEST_P(QuicReceivedPacketManagerTest, SetCumulativeEntropyUpTo) {
+  if (GetParam().version > QUIC_VERSION_33) {
+    return;
+  }
   vector<pair<QuicPacketNumber, QuicPacketEntropyHash>> entropies;
   entropies.push_back(std::make_pair(1, 12));
   entropies.push_back(std::make_pair(2, 1));
@@ -286,7 +325,7 @@
   EXPECT_EQ(0u, stats_.packets_reordered);
 }
 
-TEST_F(QuicReceivedPacketManagerTest, DontWaitForPacketsBefore) {
+TEST_P(QuicReceivedPacketManagerTest, DontWaitForPacketsBefore) {
   QuicPacketHeader header;
   header.packet_number = 2u;
   received_manager_.RecordPacketReceived(0u, header, QuicTime::Zero());
@@ -300,7 +339,7 @@
   EXPECT_TRUE(received_manager_.IsAwaitingPacket(6u));
 }
 
-TEST_F(QuicReceivedPacketManagerTest, GetUpdatedAckFrame) {
+TEST_P(QuicReceivedPacketManagerTest, GetUpdatedAckFrame) {
   QuicPacketHeader header;
   header.packet_number = 2u;
   QuicTime two_ms = QuicTime::Zero().Add(QuicTime::Delta::FromMilliseconds(2));
@@ -339,7 +378,7 @@
   EXPECT_EQ(2u, ack.ack_frame->received_packet_times.size());
 }
 
-TEST_F(QuicReceivedPacketManagerTest, UpdateReceivedConnectionStats) {
+TEST_P(QuicReceivedPacketManagerTest, UpdateReceivedConnectionStats) {
   EXPECT_FALSE(received_manager_.ack_frame_updated());
   RecordPacketReceipt(1, 0);
   EXPECT_TRUE(received_manager_.ack_frame_updated());
diff --git a/net/quic/quic_sent_packet_manager.cc b/net/quic/quic_sent_packet_manager.cc
index 1dc40bf..e9f283b6 100644
--- a/net/quic/quic_sent_packet_manager.cc
+++ b/net/quic/quic_sent_packet_manager.cc
@@ -8,6 +8,7 @@
 
 #include "base/logging.h"
 #include "base/stl_util.h"
+#include "net/quic/congestion_control/general_loss_algorithm.h"
 #include "net/quic/congestion_control/pacing_sender.h"
 #include "net/quic/crypto/crypto_protocol.h"
 #include "net/quic/proto/cached_network_parameters.pb.h"
@@ -85,7 +86,7 @@
                                          congestion_control_type,
                                          stats,
                                          initial_congestion_window_)),
-      loss_algorithm_(LossDetectionInterface::Create(loss_type)),
+      loss_algorithm_(new GeneralLossAlgorithm(loss_type)),
       n_connection_simulation_(false),
       receive_buffer_bytes_(kDefaultSocketReceiveBuffer),
       least_packet_awaited_by_peer_(1),
@@ -165,7 +166,7 @@
   }
   if (config.HasReceivedConnectionOptions() &&
       ContainsQuicTag(config.ReceivedConnectionOptions(), kTIME)) {
-    loss_algorithm_.reset(LossDetectionInterface::Create(kTime));
+    loss_algorithm_.reset(new GeneralLossAlgorithm(kTime));
   }
   if (config.HasReceivedSocketReceiveBuffer()) {
     receive_buffer_bytes_ =
@@ -204,6 +205,13 @@
   }
 }
 
+void QuicSentPacketManager::SetMaxPacingRate(QuicBandwidth max_pacing_rate) {
+  if (FLAGS_quic_max_pacing_rate && using_pacing_) {
+    static_cast<PacingSender*>(send_algorithm_.get())
+        ->SetMaxPacingRate(max_pacing_rate);
+  }
+}
+
 void QuicSentPacketManager::OnIncomingAck(const QuicAckFrame& ack_frame,
                                           QuicTime ack_receive_time) {
   QuicByteCount bytes_in_flight = unacked_packets_.bytes_in_flight();
@@ -258,10 +266,10 @@
 
 void QuicSentPacketManager::UpdatePacketInformationReceivedByPeer(
     const QuicAckFrame& ack_frame) {
-  if (ack_frame.missing_packets.Empty()) {
+  if (ack_frame.packets.Empty()) {
     least_packet_awaited_by_peer_ = ack_frame.largest_observed + 1;
   } else {
-    least_packet_awaited_by_peer_ = ack_frame.missing_packets.Min();
+    least_packet_awaited_by_peer_ = ack_frame.packets.Min();
   }
 }
 
@@ -293,7 +301,8 @@
       break;
     }
 
-    if (ack_frame.missing_packets.Contains(packet_number)) {
+    if ((ack_frame.missing && ack_frame.packets.Contains(packet_number)) ||
+        (!ack_frame.missing && !ack_frame.packets.Contains(packet_number))) {
       // Don't continue to increase the nack count for packets not in flight.
       if (FLAGS_quic_simplify_loss_detection || !it->in_flight) {
         continue;
diff --git a/net/quic/quic_sent_packet_manager.h b/net/quic/quic_sent_packet_manager.h
index 7fa3743..fe1af4c 100644
--- a/net/quic/quic_sent_packet_manager.h
+++ b/net/quic/quic_sent_packet_manager.h
@@ -127,6 +127,8 @@
 
   void SetNumOpenStreams(size_t num_streams);
 
+  void SetMaxPacingRate(QuicBandwidth max_pacing_rate);
+
   void SetHandshakeConfirmed() { handshake_confirmed_ = true; }
 
   // Processes the incoming ack.
diff --git a/net/quic/quic_sent_packet_manager_test.cc b/net/quic/quic_sent_packet_manager_test.cc
index c36bab5b4..441f1661 100644
--- a/net/quic/quic_sent_packet_manager_test.cc
+++ b/net/quic/quic_sent_packet_manager_test.cc
@@ -55,7 +55,27 @@
                     QuicTime detection_time));
 };
 
-class QuicSentPacketManagerTest : public ::testing::TestWithParam<bool> {
+// Run tests with different ack frame packets set mode.
+struct TestParams {
+  explicit TestParams(bool missing) : missing(missing) {}
+
+  friend std::ostream& operator<<(std::ostream& os, const TestParams& p) {
+    os << "{ ack frame packets set mode: " << p.missing << " }";
+    return os;
+  }
+
+  bool missing;
+};
+
+vector<TestParams> GetTestParams() {
+  vector<TestParams> params;
+  for (bool missing : {true, false}) {
+    params.push_back(TestParams(missing));
+  }
+  return params;
+}
+
+class QuicSentPacketManagerTest : public ::testing::TestWithParam<TestParams> {
  protected:
   QuicSentPacketManagerTest()
       : manager_(Perspective::IS_SERVER,
@@ -257,6 +277,29 @@
                           pending.transmission_type, HAS_RETRANSMITTABLE_DATA);
   }
 
+  // Initialize a frame acknowledging all packets up to largest_observed.
+  const QuicAckFrame InitAckFrame(QuicPacketNumber largest_observed) {
+    QuicAckFrame frame(MakeAckFrame(largest_observed));
+    frame.missing = GetParam().missing;
+    if (!GetParam().missing) {
+      if (largest_observed > 0) {
+        frame.packets.Add(1, largest_observed + 1);
+      }
+    }
+    return frame;
+  }
+
+  // Explicitly nack packet [lower, higher).
+  void NackPackets(QuicPacketNumber lower,
+                   QuicPacketNumber higher,
+                   QuicAckFrame* frame) {
+    if (frame->missing) {
+      frame->packets.Add(lower, higher);
+    } else {
+      frame->packets.Remove(lower, higher);
+    }
+  }
+
   QuicSentPacketManager manager_;
   vector<QuicEncryptedPacket*> packets_;
   MockClock clock_;
@@ -266,7 +309,11 @@
   bool saved_FLAGS_quic_disable_pacing_;
 };
 
-TEST_F(QuicSentPacketManagerTest, IsUnacked) {
+INSTANTIATE_TEST_CASE_P(QuicSentPacketManagerTest,
+                        QuicSentPacketManagerTest,
+                        ::testing::ValuesIn(GetTestParams()));
+
+TEST_P(QuicSentPacketManagerTest, IsUnacked) {
   VerifyUnackedPackets(nullptr, 0);
   SendDataPacket(1);
 
@@ -276,7 +323,7 @@
   VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
 }
 
-TEST_F(QuicSentPacketManagerTest, IsUnAckedRetransmit) {
+TEST_P(QuicSentPacketManagerTest, IsUnAckedRetransmit) {
   SendDataPacket(1);
   RetransmitAndSendPacket(1, 2);
 
@@ -287,14 +334,13 @@
   VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
 }
 
-TEST_F(QuicSentPacketManagerTest, RetransmitThenAck) {
+TEST_P(QuicSentPacketManagerTest, RetransmitThenAck) {
   SendDataPacket(1);
   RetransmitAndSendPacket(1, 2);
 
   // Ack 2 but not 1.
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = 2;
-  ack_frame.missing_packets.Add(1);
+  QuicAckFrame ack_frame = InitAckFrame(2);
+  NackPackets(1, 2, &ack_frame);
   ExpectAck(2);
   manager_.OnIncomingAck(ack_frame, clock_.Now());
 
@@ -305,15 +351,14 @@
   VerifyRetransmittablePackets(nullptr, 0);
 }
 
-TEST_F(QuicSentPacketManagerTest, RetransmitThenAckBeforeSend) {
+TEST_P(QuicSentPacketManagerTest, RetransmitThenAckBeforeSend) {
   SendDataPacket(1);
   QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, 1,
                                                    TLP_RETRANSMISSION);
   EXPECT_TRUE(manager_.HasPendingRetransmissions());
 
   // Ack 1.
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = 1;
+  QuicAckFrame ack_frame = InitAckFrame(1);
   ExpectAck(1);
   manager_.OnIncomingAck(ack_frame, clock_.Now());
 
@@ -326,7 +371,7 @@
   EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted);
 }
 
-TEST_F(QuicSentPacketManagerTest, RetransmitThenStopRetransmittingBeforeSend) {
+TEST_P(QuicSentPacketManagerTest, RetransmitThenStopRetransmittingBeforeSend) {
   SendDataPacket(1);
   QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, 1,
                                                    TLP_RETRANSMISSION);
@@ -343,7 +388,7 @@
   EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted);
 }
 
-TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPrevious) {
+TEST_P(QuicSentPacketManagerTest, RetransmitThenAckPrevious) {
   SendDataPacket(1);
   RetransmitAndSendPacket(1, 2);
   QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
@@ -351,8 +396,7 @@
 
   // Ack 1 but not 2.
   ExpectAck(1);
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = 1;
+  QuicAckFrame ack_frame = InitAckFrame(1);
   manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
 
   // 2 remains unacked, but no packets have retransmittable data.
@@ -364,7 +408,7 @@
   EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
 }
 
-TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) {
+TEST_P(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) {
   SendDataPacket(1);
   RetransmitAndSendPacket(1, 2);
   QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
@@ -372,8 +416,7 @@
 
   // First, ACK packet 1 which makes packet 2 non-retransmittable.
   ExpectAck(1);
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = 1;
+  QuicAckFrame ack_frame = InitAckFrame(1);
   manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
 
   SendDataPacket(3);
@@ -382,16 +425,18 @@
   clock_.AdvanceTime(rtt);
 
   // Next, NACK packet 2 three times.
-  ack_frame.largest_observed = 3;
-  ack_frame.missing_packets.Add(2);
+  ack_frame = InitAckFrame(3);
+  NackPackets(2, 3, &ack_frame);
   ExpectAck(3);
   manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
 
-  ack_frame.largest_observed = 4;
+  ack_frame = InitAckFrame(4);
+  NackPackets(2, 3, &ack_frame);
   ExpectAck(4);
   manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
 
-  ack_frame.largest_observed = 5;
+  ack_frame = InitAckFrame(5);
+  NackPackets(2, 3, &ack_frame);
   ExpectAckAndLoss(true, 5, 2);
   manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
 
@@ -405,7 +450,7 @@
   EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
 }
 
-TEST_F(QuicSentPacketManagerTest,
+TEST_P(QuicSentPacketManagerTest,
        DISABLED_RetransmitTwiceThenAckPreviousBeforeSend) {
   SendDataPacket(1);
   RetransmitAndSendPacket(1, 2);
@@ -419,8 +464,7 @@
   // Ack 1 but not 2, before 2 is able to be sent.
   // Since 1 has been retransmitted, it has already been lost, and so the
   // send algorithm is not informed that it has been ACK'd.
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = 1;
+  QuicAckFrame ack_frame = InitAckFrame(1);
   ExpectUpdatedRtt(1);
   EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout());
   manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
@@ -436,7 +480,7 @@
   EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
 }
 
-TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) {
+TEST_P(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) {
   StrictMock<MockDebugDelegate> debug_delegate;
   EXPECT_CALL(debug_delegate, OnSpuriousPacketRetransmission(TLP_RETRANSMISSION,
                                                              kDefaultLength))
@@ -451,8 +495,7 @@
 
   // Ack 1 but not 2 or 3.
   ExpectAck(1);
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = 1;
+  QuicAckFrame ack_frame = InitAckFrame(1);
   manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
 
   // 2 and 3 remain unacked, but no packets have retransmittable data.
@@ -463,8 +506,8 @@
 
   // Ensure packet 2 is lost when 4 is sent and 3 and 4 are acked.
   SendDataPacket(4);
-  ack_frame.largest_observed = 4;
-  ack_frame.missing_packets.Add(2);
+  ack_frame = InitAckFrame(4);
+  NackPackets(2, 3, &ack_frame);
   QuicPacketNumber acked[] = {3, 4};
   ExpectAcksAndLosses(true, acked, arraysize(acked), nullptr, 0);
   manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
@@ -474,7 +517,8 @@
   EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
 
   SendDataPacket(5);
-  ack_frame.largest_observed = 5;
+  ack_frame = InitAckFrame(5);
+  NackPackets(2, 3, &ack_frame);
   ExpectAckAndLoss(true, 5, 2);
   EXPECT_CALL(debug_delegate, OnPacketLoss(2, LOSS_RETRANSMISSION, _));
   manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
@@ -484,7 +528,10 @@
   EXPECT_EQ(2u, stats_.packets_spuriously_retransmitted);
 }
 
-TEST_F(QuicSentPacketManagerTest, AckPreviousTransmissionThenTruncatedAck) {
+TEST_P(QuicSentPacketManagerTest, AckPreviousTransmissionThenTruncatedAck) {
+  if (!GetParam().missing) {
+    return;
+  }
   SendDataPacket(1);
   RetransmitAndSendPacket(1, 2);
   RetransmitAndSendPacket(2, 3);
@@ -497,9 +544,8 @@
 
   // Ack previous transmission
   {
-    QuicAckFrame ack_frame;
-    ack_frame.largest_observed = 2;
-    ack_frame.missing_packets.Add(1);
+    QuicAckFrame ack_frame = InitAckFrame(2);
+    NackPackets(1, 2, &ack_frame);
     ExpectAck(2);
     manager_.OnIncomingAck(ack_frame, clock_.Now());
     EXPECT_TRUE(manager_.IsUnacked(4));
@@ -507,9 +553,8 @@
 
   // Truncated ack with 4 NACKs
   {
-    QuicAckFrame ack_frame;
-    ack_frame.largest_observed = 6;
-    ack_frame.missing_packets.Add(3, 7);
+    QuicAckFrame ack_frame = InitAckFrame(6);
+    NackPackets(3, 7, &ack_frame);
     ack_frame.is_truncated = true;
     ExpectAckAndLoss(true, 1, 3);
     manager_.OnIncomingAck(ack_frame, clock_.Now());
@@ -522,22 +567,21 @@
   VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
 }
 
-TEST_F(QuicSentPacketManagerTest, GetLeastUnacked) {
+TEST_P(QuicSentPacketManagerTest, GetLeastUnacked) {
   EXPECT_EQ(1u, manager_.GetLeastUnacked());
 }
 
-TEST_F(QuicSentPacketManagerTest, GetLeastUnackedUnacked) {
+TEST_P(QuicSentPacketManagerTest, GetLeastUnackedUnacked) {
   SendDataPacket(1);
   EXPECT_EQ(1u, manager_.GetLeastUnacked());
 }
 
-TEST_F(QuicSentPacketManagerTest, AckAckAndUpdateRtt) {
+TEST_P(QuicSentPacketManagerTest, AckAckAndUpdateRtt) {
   SendDataPacket(1);
   SendAckPacket(2);
 
   // Now ack the ack and expect an RTT update.
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = 2;
+  QuicAckFrame ack_frame = InitAckFrame(2);
   ack_frame.ack_delay_time = QuicTime::Delta::FromMilliseconds(5);
 
   ExpectAck(1);
@@ -546,27 +590,26 @@
   SendAckPacket(3);
 
   // Now ack the ack and expect only an RTT update.
-  ack_frame.largest_observed = 3;
+  ack_frame = InitAckFrame(3);
   ExpectUpdatedRtt(3);
   manager_.OnIncomingAck(ack_frame, clock_.Now());
 }
 
-TEST_F(QuicSentPacketManagerTest, Rtt) {
+TEST_P(QuicSentPacketManagerTest, Rtt) {
   QuicPacketNumber packet_number = 1;
   QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(15);
   SendDataPacket(packet_number);
   clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
 
   ExpectAck(packet_number);
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = packet_number;
+  QuicAckFrame ack_frame = InitAckFrame(packet_number);
   ack_frame.ack_delay_time = QuicTime::Delta::FromMilliseconds(5);
   manager_.OnIncomingAck(ack_frame, clock_.Now());
   EXPECT_EQ(expected_rtt,
             QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt());
 }
 
-TEST_F(QuicSentPacketManagerTest, RttWithInvalidDelta) {
+TEST_P(QuicSentPacketManagerTest, RttWithInvalidDelta) {
   // Expect that the RTT is equal to the local time elapsed, since the
   // ack_delay_time is larger than the local time elapsed
   // and is hence invalid.
@@ -576,15 +619,14 @@
   clock_.AdvanceTime(expected_rtt);
 
   ExpectAck(packet_number);
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = packet_number;
+  QuicAckFrame ack_frame = InitAckFrame(packet_number);
   ack_frame.ack_delay_time = QuicTime::Delta::FromMilliseconds(11);
   manager_.OnIncomingAck(ack_frame, clock_.Now());
   EXPECT_EQ(expected_rtt,
             QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt());
 }
 
-TEST_F(QuicSentPacketManagerTest, RttWithInfiniteDelta) {
+TEST_P(QuicSentPacketManagerTest, RttWithInfiniteDelta) {
   // Expect that the RTT is equal to the local time elapsed, since the
   // ack_delay_time is infinite, and is hence invalid.
   QuicPacketNumber packet_number = 1;
@@ -593,15 +635,14 @@
   clock_.AdvanceTime(expected_rtt);
 
   ExpectAck(packet_number);
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = packet_number;
+  QuicAckFrame ack_frame = InitAckFrame(packet_number);
   ack_frame.ack_delay_time = QuicTime::Delta::Infinite();
   manager_.OnIncomingAck(ack_frame, clock_.Now());
   EXPECT_EQ(expected_rtt,
             QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt());
 }
 
-TEST_F(QuicSentPacketManagerTest, RttZeroDelta) {
+TEST_P(QuicSentPacketManagerTest, RttZeroDelta) {
   // Expect that the RTT is the time between send and receive since the
   // ack_delay_time is zero.
   QuicPacketNumber packet_number = 1;
@@ -610,15 +651,14 @@
   clock_.AdvanceTime(expected_rtt);
 
   ExpectAck(packet_number);
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = packet_number;
+  QuicAckFrame ack_frame = InitAckFrame(packet_number);
   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
   manager_.OnIncomingAck(ack_frame, clock_.Now());
   EXPECT_EQ(expected_rtt,
             QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt());
 }
 
-TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeout) {
+TEST_P(QuicSentPacketManagerTest, TailLossProbeTimeout) {
   QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
 
   // Send 1 packet.
@@ -651,9 +691,9 @@
 
   // Ack the third and ensure the first two are still pending.
   ExpectAck(3);
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = 3;
-  ack_frame.missing_packets.Add(1, 3);
+
+  QuicAckFrame ack_frame = InitAckFrame(3);
+  NackPackets(1, 3, &ack_frame);
   manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
 
   EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
@@ -670,7 +710,7 @@
   EXPECT_EQ(0u, stats_.rto_count);
 }
 
-TEST_F(QuicSentPacketManagerTest, TailLossProbeThenRTO) {
+TEST_P(QuicSentPacketManagerTest, TailLossProbeThenRTO) {
   QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
 
   // Send 100 packets.
@@ -730,9 +770,8 @@
             QuicSentPacketManagerPeer::GetBytesInFlight(&manager_));
 
   RetransmitNextPacket(103);
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = 103;
-  ack_frame.missing_packets.Add(0, 103);
+  QuicAckFrame ack_frame = InitAckFrame(103);
+  NackPackets(0, 103, &ack_frame);
   EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
   EXPECT_CALL(*send_algorithm_,
               OnCongestionEvent(true, _, ElementsAre(Pair(103, _)), _));
@@ -743,7 +782,7 @@
   EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(&manager_));
 }
 
-TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeout) {
+TEST_P(QuicSentPacketManagerTest, CryptoHandshakeTimeout) {
   // Send 2 crypto packets and 3 data packets.
   const size_t kNumSentCryptoPackets = 2;
   for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
@@ -777,16 +816,15 @@
   // and ensure the first four crypto packets get abandoned, but not lost.
   QuicPacketNumber acked[] = {3, 4, 5, 8, 9};
   ExpectAcksAndLosses(true, acked, arraysize(acked), nullptr, 0);
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = 9;
-  ack_frame.missing_packets.Add(1, 3);
-  ack_frame.missing_packets.Add(6, 8);
+  QuicAckFrame ack_frame = InitAckFrame(9);
+  NackPackets(1, 3, &ack_frame);
+  NackPackets(6, 8, &ack_frame);
   manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
 
   EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
 }
 
-TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeoutVersionNegotiation) {
+TEST_P(QuicSentPacketManagerTest, CryptoHandshakeTimeoutVersionNegotiation) {
   // Send 2 crypto packets and 3 data packets.
   const size_t kNumSentCryptoPackets = 2;
   for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
@@ -828,16 +866,15 @@
   // crypto packets.
   QuicPacketNumber acked[] = {8, 9};
   ExpectAcksAndLosses(true, acked, arraysize(acked), nullptr, 0);
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = 9;
+  QuicAckFrame ack_frame = InitAckFrame(9);
   for (QuicPacketNumber i = 1; i < 8; ++i) {
-    ack_frame.missing_packets.Add(i);
+    NackPackets(i, i + 1, &ack_frame);
   }
   manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
   EXPECT_EQ(10u, manager_.GetLeastUnacked());
 }
 
-TEST_F(QuicSentPacketManagerTest, CryptoHandshakeSpuriousRetransmission) {
+TEST_P(QuicSentPacketManagerTest, CryptoHandshakeSpuriousRetransmission) {
   // Send 1 crypto packet.
   SendCryptoPacket(1);
   EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
@@ -853,9 +890,8 @@
   // Now ack the second crypto packet, and ensure the first gets removed, but
   // the third does not.
   ExpectUpdatedRtt(2);
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = 2;
-  ack_frame.missing_packets.Add(1);
+  QuicAckFrame ack_frame = InitAckFrame(2);
+  NackPackets(1, 2, &ack_frame);
   manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
 
   EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
@@ -863,7 +899,7 @@
   VerifyUnackedPackets(unacked, arraysize(unacked));
 }
 
-TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeoutUnsentDataPacket) {
+TEST_P(QuicSentPacketManagerTest, CryptoHandshakeTimeoutUnsentDataPacket) {
   // Send 2 crypto packets and 1 data packet.
   const size_t kNumSentCryptoPackets = 2;
   for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
@@ -880,7 +916,7 @@
   EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
 }
 
-TEST_F(QuicSentPacketManagerTest,
+TEST_P(QuicSentPacketManagerTest,
        CryptoHandshakeRetransmissionThenRetransmitAll) {
   // Send 1 crypto packet.
   SendCryptoPacket(1);
@@ -900,7 +936,7 @@
   EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
 }
 
-TEST_F(QuicSentPacketManagerTest,
+TEST_P(QuicSentPacketManagerTest,
        CryptoHandshakeRetransmissionThenNeuterAndAck) {
   // Send 1 crypto packet.
   SendCryptoPacket(1);
@@ -928,16 +964,15 @@
   EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
 
   // Ensure both packets get discarded when packet 2 is acked.
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = 3;
-  ack_frame.missing_packets.Add(1, 3);
+  QuicAckFrame ack_frame = InitAckFrame(3);
+  NackPackets(1, 3, &ack_frame);
   ExpectUpdatedRtt(3);
   manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
   VerifyUnackedPackets(nullptr, 0);
   VerifyRetransmittablePackets(nullptr, 0);
 }
 
-TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) {
+TEST_P(QuicSentPacketManagerTest, RetransmissionTimeout) {
   StrictMock<MockDebugDelegate> debug_delegate;
   manager_.set_debug_delegate(&debug_delegate);
 
@@ -957,10 +992,9 @@
   EXPECT_FALSE(manager_.HasPendingRetransmissions());
 
   // Ack a retransmission.
-  QuicAckFrame ack_frame;
+  QuicAckFrame ack_frame = InitAckFrame(102);
+  NackPackets(0, 102, &ack_frame);
   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
-  ack_frame.largest_observed = 102;
-  ack_frame.missing_packets.Add(0, 102);
   // Ensure no packets are lost.
   EXPECT_CALL(*send_algorithm_,
               OnCongestionEvent(true, _, ElementsAre(Pair(102, _)),
@@ -976,7 +1010,7 @@
   manager_.OnIncomingAck(ack_frame, clock_.Now());
 }
 
-TEST_F(QuicSentPacketManagerTest, NewRetransmissionTimeout) {
+TEST_P(QuicSentPacketManagerTest, NewRetransmissionTimeout) {
   QuicConfig client_config;
   QuicTagVector options;
   options.push_back(kNRTO);
@@ -1008,10 +1042,9 @@
   EXPECT_FALSE(manager_.HasPendingRetransmissions());
 
   // Ack a retransmission and expect no call to OnRetransmissionTimeout.
-  QuicAckFrame ack_frame;
+  QuicAckFrame ack_frame = InitAckFrame(102);
+  NackPackets(0, 102, &ack_frame);
   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
-  ack_frame.largest_observed = 102;
-  ack_frame.missing_packets.Add(0, 102);
   // This will include packets in the lost packet map.
   EXPECT_CALL(*send_algorithm_,
               OnCongestionEvent(true, _, ElementsAre(Pair(102, _)),
@@ -1021,7 +1054,7 @@
   manager_.OnIncomingAck(ack_frame, clock_.Now());
 }
 
-TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckSecond) {
+TEST_P(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckSecond) {
   // Send 1 packet.
   SendDataPacket(1);
 
@@ -1043,10 +1076,9 @@
 
   // Ack a retransmission and ensure OnRetransmissionTimeout is called.
   EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
-  QuicAckFrame ack_frame;
+  QuicAckFrame ack_frame = InitAckFrame(2);
+  NackPackets(1, 2, &ack_frame);
   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
-  ack_frame.largest_observed = 2;
-  ack_frame.missing_packets.Add(1);
   ExpectAck(2);
   manager_.OnIncomingAck(ack_frame, clock_.Now());
 
@@ -1055,7 +1087,7 @@
             QuicSentPacketManagerPeer::GetBytesInFlight(&manager_));
 }
 
-TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckFirst) {
+TEST_P(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckFirst) {
   // Send 1 packet.
   SendDataPacket(1);
 
@@ -1077,10 +1109,9 @@
 
   // Ack a retransmission and ensure OnRetransmissionTimeout is called.
   EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
-  QuicAckFrame ack_frame;
+  QuicAckFrame ack_frame = InitAckFrame(3);
+  NackPackets(1, 3, &ack_frame);
   ack_frame.ack_delay_time = QuicTime::Delta::Zero();
-  ack_frame.largest_observed = 3;
-  ack_frame.missing_packets.Add(1, 3);
   ExpectAck(3);
   manager_.OnIncomingAck(ack_frame, clock_.Now());
 
@@ -1089,7 +1120,7 @@
             QuicSentPacketManagerPeer::GetBytesInFlight(&manager_));
 }
 
-TEST_F(QuicSentPacketManagerTest, OnPathDegrading) {
+TEST_P(QuicSentPacketManagerTest, OnPathDegrading) {
   SendDataPacket(1);
   QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500);
   EXPECT_CALL(*send_algorithm_, RetransmissionDelay())
@@ -1104,11 +1135,11 @@
   manager_.OnRetransmissionTimeout();
 }
 
-TEST_F(QuicSentPacketManagerTest, GetTransmissionTime) {
+TEST_P(QuicSentPacketManagerTest, GetTransmissionTime) {
   EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
 }
 
-TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeCryptoHandshake) {
+TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeCryptoHandshake) {
   SendCryptoPacket(1);
 
   // Check the min.
@@ -1135,7 +1166,7 @@
   EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
 }
 
-TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeTailLossProbe) {
+TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeTailLossProbe) {
   QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
   SendDataPacket(1);
   SendDataPacket(2);
@@ -1173,7 +1204,7 @@
   EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
 }
 
-TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeSpuriousRTO) {
+TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeSpuriousRTO) {
   QuicSentPacketManagerPeer::GetRttStats(&manager_)
       ->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
                   QuicTime::Delta::Zero(), QuicTime::Zero());
@@ -1210,9 +1241,8 @@
 
   // Ack a packet before the first RTO and ensure the RTO timeout returns to the
   // original value and OnRetransmissionTimeout is not called or reverted.
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = 2;
-  ack_frame.missing_packets.Add(1);
+  QuicAckFrame ack_frame = InitAckFrame(2);
+  NackPackets(1, 2, &ack_frame);
   ExpectAck(2);
   manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
   EXPECT_FALSE(manager_.HasPendingRetransmissions());
@@ -1229,7 +1259,7 @@
   EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
 }
 
-TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMin) {
+TEST_P(QuicSentPacketManagerTest, GetTransmissionDelayMin) {
   SendDataPacket(1);
   EXPECT_CALL(*send_algorithm_, RetransmissionDelay())
       .WillRepeatedly(Return(QuicTime::Delta::FromMilliseconds(1)));
@@ -1247,7 +1277,7 @@
   }
 }
 
-TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMax) {
+TEST_P(QuicSentPacketManagerTest, GetTransmissionDelayMax) {
   EXPECT_CALL(*send_algorithm_, RetransmissionDelay())
       .WillOnce(Return(QuicTime::Delta::FromSeconds(500)));
 
@@ -1255,7 +1285,7 @@
             QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
 }
 
-TEST_F(QuicSentPacketManagerTest, GetTransmissionDelay) {
+TEST_P(QuicSentPacketManagerTest, GetTransmissionDelay) {
   SendDataPacket(1);
   QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500);
   EXPECT_CALL(*send_algorithm_, RetransmissionDelay())
@@ -1272,7 +1302,7 @@
   }
 }
 
-TEST_F(QuicSentPacketManagerTest, GetLossDelay) {
+TEST_P(QuicSentPacketManagerTest, GetLossDelay) {
   MockLossAlgorithm* loss_algorithm = new MockLossAlgorithm();
   QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm);
 
@@ -1285,9 +1315,8 @@
   // set the loss timeout.
   ExpectAck(2);
   EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _));
-  QuicAckFrame ack_frame;
-  ack_frame.largest_observed = 2;
-  ack_frame.missing_packets.Add(1);
+  QuicAckFrame ack_frame = InitAckFrame(2);
+  NackPackets(1, 2, &ack_frame);
   manager_.OnIncomingAck(ack_frame, clock_.Now());
 
   QuicTime timeout(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10)));
@@ -1301,7 +1330,7 @@
   manager_.OnRetransmissionTimeout();
 }
 
-TEST_F(QuicSentPacketManagerTest, NegotiateTimeLossDetectionFromOptions) {
+TEST_P(QuicSentPacketManagerTest, NegotiateTimeLossDetectionFromOptions) {
   EXPECT_EQ(kNack, QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
                        ->GetLossDetectionType());
 
@@ -1318,8 +1347,8 @@
                        ->GetLossDetectionType());
 }
 
-TEST_F(QuicSentPacketManagerTest, NegotiateCongestionControlFromOptions) {
-  ValueRestore<bool> old_flag(&FLAGS_quic_allow_bbr, true);
+TEST_P(QuicSentPacketManagerTest, NegotiateCongestionControlFromOptions) {
+  FLAGS_quic_allow_bbr = true;
   QuicConfig config;
   QuicTagVector options;
 
@@ -1363,7 +1392,7 @@
                             ->GetCongestionControlType());
 }
 
-TEST_F(QuicSentPacketManagerTest, NegotiateNumConnectionsFromOptions) {
+TEST_P(QuicSentPacketManagerTest, NegotiateNumConnectionsFromOptions) {
   QuicConfig config;
   QuicTagVector options;
 
@@ -1385,7 +1414,7 @@
   manager_.SetFromConfig(client_config);
 }
 
-TEST_F(QuicSentPacketManagerTest, NegotiateNConnectionFromOptions) {
+TEST_P(QuicSentPacketManagerTest, NegotiateNConnectionFromOptions) {
   // By default, changing the number of open streams does nothing.
   manager_.SetNumOpenStreams(5);
 
@@ -1403,7 +1432,7 @@
   manager_.SetNumOpenStreams(5);
 }
 
-TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtServer) {
+TEST_P(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtServer) {
   QuicConfig config;
   QuicTagVector options;
 
@@ -1416,7 +1445,7 @@
   EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
 }
 
-TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtClient) {
+TEST_P(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtClient) {
   QuicConfig client_config;
   QuicTagVector options;
 
@@ -1430,7 +1459,7 @@
   EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
 }
 
-TEST_F(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtServer) {
+TEST_P(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtServer) {
   QuicConfig config;
   QuicTagVector options;
 
@@ -1444,7 +1473,7 @@
       QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
 }
 
-TEST_F(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtClient) {
+TEST_P(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtClient) {
   QuicConfig client_config;
   QuicTagVector options;
 
@@ -1459,7 +1488,7 @@
       QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
 }
 
-TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtServer) {
+TEST_P(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtServer) {
   EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
   QuicConfig config;
   QuicTagVector options;
@@ -1473,7 +1502,7 @@
   EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
 }
 
-TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtClient) {
+TEST_P(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtClient) {
   EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
   QuicConfig client_config;
   QuicTagVector options;
@@ -1488,7 +1517,7 @@
   EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
 }
 
-TEST_F(QuicSentPacketManagerTest,
+TEST_P(QuicSentPacketManagerTest,
        NegotiateConservativeReceiveWindowFromOptions) {
   EXPECT_EQ(kDefaultSocketReceiveBuffer,
             QuicSentPacketManagerPeer::GetReceiveWindow(&manager_));
@@ -1530,7 +1559,7 @@
             manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
 }
 
-TEST_F(QuicSentPacketManagerTest, ReceiveWindowLimited) {
+TEST_P(QuicSentPacketManagerTest, ReceiveWindowLimited) {
   EXPECT_EQ(kDefaultSocketReceiveBuffer,
             QuicSentPacketManagerPeer::GetReceiveWindow(&manager_));
 
@@ -1554,7 +1583,7 @@
             manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
 }
 
-TEST_F(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) {
+TEST_P(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) {
   uint32_t initial_rtt_us = 325000;
   EXPECT_NE(initial_rtt_us,
             manager_.GetRttStats()->smoothed_rtt().ToMicroseconds());
@@ -1570,7 +1599,7 @@
   EXPECT_EQ(initial_rtt_us, manager_.GetRttStats()->initial_rtt_us());
 }
 
-TEST_F(QuicSentPacketManagerTest, ResumeConnectionState) {
+TEST_P(QuicSentPacketManagerTest, ResumeConnectionState) {
   // The sent packet manager should use the RTT from CachedNetworkParameters if
   // it is provided.
   const int kRttMs = 1234;
@@ -1583,7 +1612,7 @@
             static_cast<uint64_t>(manager_.GetRttStats()->initial_rtt_us()));
 }
 
-TEST_F(QuicSentPacketManagerTest, ConnectionMigrationUnspecifiedChange) {
+TEST_P(QuicSentPacketManagerTest, ConnectionMigrationUnspecifiedChange) {
   RttStats* rtt_stats = QuicSentPacketManagerPeer::GetRttStats(&manager_);
   int64_t default_init_rtt = rtt_stats->initial_rtt_us();
   rtt_stats->set_initial_rtt_us(default_init_rtt * 2);
@@ -1602,7 +1631,7 @@
   EXPECT_EQ(0u, manager_.consecutive_tlp_count());
 }
 
-TEST_F(QuicSentPacketManagerTest, ConnectionMigrationIPSubnetChange) {
+TEST_P(QuicSentPacketManagerTest, ConnectionMigrationIPSubnetChange) {
   RttStats* rtt_stats = QuicSentPacketManagerPeer::GetRttStats(&manager_);
   int64_t default_init_rtt = rtt_stats->initial_rtt_us();
   rtt_stats->set_initial_rtt_us(default_init_rtt * 2);
@@ -1620,7 +1649,7 @@
   EXPECT_EQ(2u, manager_.consecutive_tlp_count());
 }
 
-TEST_F(QuicSentPacketManagerTest, ConnectionMigrationPortChange) {
+TEST_P(QuicSentPacketManagerTest, ConnectionMigrationPortChange) {
   RttStats* rtt_stats = QuicSentPacketManagerPeer::GetRttStats(&manager_);
   int64_t default_init_rtt = rtt_stats->initial_rtt_us();
   rtt_stats->set_initial_rtt_us(default_init_rtt * 2);
diff --git a/net/quic/quic_socket_address_coder.cc b/net/quic/quic_socket_address_coder.cc
index c0f528d..f0d213e 100644
--- a/net/quic/quic_socket_address_coder.cc
+++ b/net/quic/quic_socket_address_coder.cc
@@ -60,10 +60,10 @@
   size_t ip_length;
   switch (address_family) {
     case kIPv4:
-      ip_length = kIPv4AddressSize;
+      ip_length = IPAddress::kIPv4AddressSize;
       break;
     case kIPv6:
-      ip_length = kIPv6AddressSize;
+      ip_length = IPAddress::kIPv6AddressSize;
       break;
     default:
       return false;
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc
index dda32e5..33462c9 100644
--- a/net/quic/quic_stream_factory_test.cc
+++ b/net/quic/quic_stream_factory_test.cc
@@ -257,7 +257,16 @@
         clock_(new MockClock()),
         runner_(new TestTaskRunner(clock_)),
         version_(version),
-        maker_(version_, 0, clock_, kDefaultServerHostName),
+        client_maker_(version_,
+                      0,
+                      clock_,
+                      kDefaultServerHostName,
+                      Perspective::IS_CLIENT),
+        server_maker_(version_,
+                      0,
+                      clock_,
+                      kDefaultServerHostName,
+                      Perspective::IS_SERVER),
         cert_verifier_(CertVerifier::CreateDefault()),
         channel_id_service_(
             new ChannelIDService(new DefaultChannelIDStore(nullptr),
@@ -407,14 +416,14 @@
     return socket_factory_.udp_client_socket_ports()[socket_count];
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
+  std::unique_ptr<QuicEncryptedPacket> ConstructClientConnectionClosePacket(
       QuicPacketNumber num) {
-    return maker_.MakeConnectionClosePacket(num);
+    return client_maker_.MakeConnectionClosePacket(num);
   }
 
-  std::unique_ptr<QuicEncryptedPacket> ConstructRstPacket() {
+  std::unique_ptr<QuicEncryptedPacket> ConstructClientRstPacket() {
     QuicStreamId stream_id = kClientDataStreamId1;
-    return maker_.MakeRstPacket(
+    return client_maker_.MakeRstPacket(
         1, true, stream_id,
         AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, version_));
   }
@@ -441,11 +450,12 @@
       QuicStreamId stream_id,
       bool should_include_version,
       bool fin) {
-    SpdyHeaderBlock headers = maker_.GetRequestHeaders("GET", "https", "/");
+    SpdyHeaderBlock headers =
+        client_maker_.GetRequestHeaders("GET", "https", "/");
     SpdyPriority priority =
         ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
     size_t spdy_headers_frame_len;
-    return maker_.MakeRequestHeadersPacket(
+    return client_maker_.MakeRequestHeadersPacket(
         packet_number, stream_id, should_include_version, fin, priority,
         headers, &spdy_headers_frame_len);
   }
@@ -455,11 +465,11 @@
       QuicStreamId stream_id,
       bool should_include_version,
       bool fin) {
-    SpdyHeaderBlock headers = maker_.GetResponseHeaders("200 OK");
+    SpdyHeaderBlock headers = server_maker_.GetResponseHeaders("200 OK");
     size_t spdy_headers_frame_len;
-    return maker_.MakeResponseHeadersPacket(packet_number, stream_id,
-                                            should_include_version, fin,
-                                            headers, &spdy_headers_frame_len);
+    return server_maker_.MakeResponseHeadersPacket(
+        packet_number, stream_id, should_include_version, fin, headers,
+        &spdy_headers_frame_len);
   }
 
   MockHostResolver host_resolver_;
@@ -469,7 +479,8 @@
   MockClock* clock_;  // Owned by |factory_| once created.
   scoped_refptr<TestTaskRunner> runner_;
   QuicVersion version_;
-  QuicTestPacketMaker maker_;
+  QuicTestPacketMaker client_maker_;
+  QuicTestPacketMaker server_maker_;
   HttpServerPropertiesImpl http_server_properties_;
   std::unique_ptr<CertVerifier> cert_verifier_;
   std::unique_ptr<ChannelIDService> channel_id_service_;
@@ -1105,12 +1116,12 @@
 
   QuicStreamId stream_id = kClientDataStreamId1;
   std::unique_ptr<QuicEncryptedPacket> client_rst(
-      maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
+      client_maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
   MockWrite writes[] = {
       MockWrite(ASYNC, client_rst->data(), client_rst->length(), 0),
   };
   std::unique_ptr<QuicEncryptedPacket> server_rst(
-      maker_.MakeRstPacket(1, false, stream_id, QUIC_STREAM_CANCELLED));
+      server_maker_.MakeRstPacket(1, false, stream_id, QUIC_STREAM_CANCELLED));
   MockRead reads[] = {
       MockRead(ASYNC, server_rst->data(), server_rst->length(), 1),
       MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
@@ -1272,7 +1283,7 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
+  std::unique_ptr<QuicEncryptedPacket> rst(ConstructClientRstPacket());
   std::vector<MockWrite> writes;
   writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
   SequencedSocketData socket_data(reads, arraysize(reads),
@@ -1328,7 +1339,7 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
+  std::unique_ptr<QuicEncryptedPacket> rst(ConstructClientRstPacket());
   std::vector<MockWrite> writes;
   writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
   SequencedSocketData socket_data(reads, arraysize(reads),
@@ -1424,7 +1435,7 @@
   // Set up second socket data provider that is used after migration.
   // The response to the earlier request is read on this new socket.
   std::unique_ptr<QuicEncryptedPacket> ping(
-      maker_.MakePingPacket(2, /*include_version=*/true));
+      client_maker_.MakePingPacket(2, /*include_version=*/true));
   MockWrite writes1[] = {
       MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
   std::unique_ptr<QuicEncryptedPacket> response_headers_packet(
@@ -1535,8 +1546,8 @@
 
   // Set up second socket data provider that is used after migration.
   std::unique_ptr<QuicEncryptedPacket> ping(
-      maker_.MakePingPacket(2, /*include_version=*/true));
-  std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
+      client_maker_.MakePingPacket(2, /*include_version=*/true));
+  std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
       3, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
   MockWrite writes1[] = {
       MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
@@ -1595,7 +1606,7 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
+  std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
       1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
   MockWrite writes[] = {
       MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
@@ -1648,7 +1659,7 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
+  std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
       1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
   MockWrite writes[] = {
       MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
@@ -1696,7 +1707,7 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
+  std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
       1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
   MockWrite writes[] = {
       MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
@@ -1747,7 +1758,7 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
+  std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
       1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
   MockWrite writes[] = {
       MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
@@ -1797,7 +1808,7 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
+  std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
       1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
   MockWrite writes[] = {
       MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
@@ -1850,7 +1861,7 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
+  std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
       1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
   MockWrite writes[] = {
       MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
@@ -1905,7 +1916,7 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
+  std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
       1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
   MockWrite writes[] = {
       MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
@@ -1956,7 +1967,7 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
+  std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
       1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
   MockWrite writes[] = {
       MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1),
@@ -2123,7 +2134,7 @@
   // Set up second socket data provider that is used after migration.
   // The response to the earlier request is read on this new socket.
   std::unique_ptr<QuicEncryptedPacket> ping(
-      maker_.MakePingPacket(2, /*include_version=*/true));
+      client_maker_.MakePingPacket(2, /*include_version=*/true));
   MockWrite writes1[] = {
       MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 0)};
   std::unique_ptr<QuicEncryptedPacket> response_headers_packet(
@@ -2203,7 +2214,7 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
+  std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
       1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
   MockWrite writes[] = {
       MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
@@ -2258,7 +2269,7 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
+  std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
       1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
   MockWrite writes[] = {
       MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
@@ -2313,7 +2324,7 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
+  std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
       1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
   MockWrite writes[] = {
       MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
@@ -2371,7 +2382,7 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
+  std::unique_ptr<QuicEncryptedPacket> rst(ConstructClientRstPacket());
   std::vector<MockWrite> writes;
   writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
   SequencedSocketData socket_data(reads, arraysize(reads),
@@ -2426,7 +2437,7 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
+  std::unique_ptr<QuicEncryptedPacket> rst(ConstructClientRstPacket());
   std::vector<MockWrite> writes;
   writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
   SequencedSocketData socket_data(reads, arraysize(reads),
@@ -2482,7 +2493,7 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
-  std::unique_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
+  std::unique_ptr<QuicEncryptedPacket> rst(ConstructClientRstPacket());
   std::vector<MockWrite> writes;
   writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
   SequencedSocketData socket_data(reads, arraysize(reads),
@@ -3863,7 +3874,7 @@
   QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
 
   std::unique_ptr<QuicEncryptedPacket> close_packet(
-      ConstructConnectionClosePacket(0));
+      ConstructClientConnectionClosePacket(0));
   vector<MockRead> reads;
   reads.push_back(
       MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
@@ -3912,7 +3923,7 @@
       factory_.get(), QuicTime::Delta::FromMilliseconds(-1));
 
   std::unique_ptr<QuicEncryptedPacket> close_packet(
-      ConstructConnectionClosePacket(0));
+      ConstructClientConnectionClosePacket(0));
   vector<MockRead> reads;
   reads.push_back(
       MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0));
@@ -3998,7 +4009,7 @@
 
   MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
 
-  std::unique_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
+  std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
       1, true, kServerDataStreamId1, QUIC_STREAM_CANCELLED));
   MockWrite writes[] = {
       MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1),
diff --git a/net/quic/test_tools/quic_connection_peer.cc b/net/quic/test_tools/quic_connection_peer.cc
index 619d4ee..d5bbac4 100644
--- a/net/quic/test_tools/quic_connection_peer.cc
+++ b/net/quic/test_tools/quic_connection_peer.cc
@@ -223,7 +223,7 @@
       connection->termination_packets_->empty()) {
     return nullptr;
   }
-  return (*connection->termination_packets_)[0];
+  return (*connection->termination_packets_)[0].get();
 }
 
 // static
diff --git a/net/quic/test_tools/quic_test_packet_maker.cc b/net/quic/test_tools/quic_test_packet_maker.cc
index 21ceb0f..08aca3a 100644
--- a/net/quic/test_tools/quic_test_packet_maker.cc
+++ b/net/quic/test_tools/quic_test_packet_maker.cc
@@ -21,13 +21,15 @@
 QuicTestPacketMaker::QuicTestPacketMaker(QuicVersion version,
                                          QuicConnectionId connection_id,
                                          MockClock* clock,
-                                         const std::string& host)
+                                         const std::string& host,
+                                         Perspective perspective)
     : version_(version),
       connection_id_(connection_id),
       clock_(clock),
       host_(host),
       spdy_request_framer_(HTTP2),
-      spdy_response_framer_(HTTP2) {}
+      spdy_response_framer_(HTTP2),
+      perspective_(perspective) {}
 
 QuicTestPacketMaker::~QuicTestPacketMaker() {}
 
@@ -107,6 +109,10 @@
   for (QuicPacketNumber i = ack_least_unacked; i <= largest_received; ++i) {
     ack.received_packet_times.push_back(make_pair(i, clock_->Now()));
   }
+  if (largest_received > 0 && version_ > QUIC_VERSION_33) {
+    ack.missing = false;
+    ack.packets.Add(1, largest_received + 1);
+  }
   QuicFrames frames;
   frames.push_back(QuicFrame(&ack));
   DVLOG(1) << "Adding frame: " << frames[0];
@@ -120,8 +126,7 @@
   frames.push_back(QuicFrame(&rst));
   DVLOG(1) << "Adding frame: " << frames[2];
 
-  QuicFramer framer(SupportedVersions(version_), clock_->Now(),
-                    Perspective::IS_CLIENT);
+  QuicFramer framer(SupportedVersions(version_), clock_->Now(), perspective_);
   std::unique_ptr<QuicPacket> packet(
       BuildUnsizedDataPacket(&framer, header, frames));
   char buffer[kMaxPacketSize];
@@ -157,6 +162,10 @@
   for (QuicPacketNumber i = least_unacked; i <= largest_received; ++i) {
     ack.received_packet_times.push_back(make_pair(i, clock_->Now()));
   }
+  if (largest_received > 0 && version_ > QUIC_VERSION_33) {
+    ack.missing = false;
+    ack.packets.Add(1, largest_received + 1);
+  }
   QuicFrames frames;
   frames.push_back(QuicFrame(&ack));
   DVLOG(1) << "Adding frame: " << frames[0];
@@ -173,8 +182,7 @@
   frames.push_back(QuicFrame(&close));
   DVLOG(1) << "Adding frame: " << frames[2];
 
-  QuicFramer framer(SupportedVersions(version_), clock_->Now(),
-                    Perspective::IS_CLIENT);
+  QuicFramer framer(SupportedVersions(version_), clock_->Now(), perspective_);
   std::unique_ptr<QuicPacket> packet(
       BuildUnsizedDataPacket(&framer, header, frames));
   char buffer[kMaxPacketSize];
@@ -259,9 +267,12 @@
   for (QuicPacketNumber i = ack_least_unacked; i <= largest_received; ++i) {
     ack.received_packet_times.push_back(make_pair(i, clock_->Now()));
   }
+  if (largest_received > 0 && version_ > QUIC_VERSION_33) {
+    ack.missing = false;
+    ack.packets.Add(1, largest_received + 1);
+  }
 
-  QuicFramer framer(SupportedVersions(version_), clock_->Now(),
-                    Perspective::IS_CLIENT);
+  QuicFramer framer(SupportedVersions(version_), clock_->Now(), perspective_);
   QuicFrames frames;
   frames.push_back(QuicFrame(&ack));
 
@@ -336,6 +347,10 @@
   for (QuicPacketNumber i = least_unacked; i <= largest_received; ++i) {
     ack.received_packet_times.push_back(make_pair(i, clock_->Now()));
   }
+  if (largest_received > 0 && version_ > QUIC_VERSION_33) {
+    ack.missing = false;
+    ack.packets.Add(1, largest_received + 1);
+  }
   QuicFrames frames;
   frames.push_back(QuicFrame(&ack));
 
@@ -588,8 +603,7 @@
 std::unique_ptr<QuicReceivedPacket>
 QuicTestPacketMaker::MakeMultipleFramesPacket(const QuicPacketHeader& header,
                                               const QuicFrames& frames) {
-  QuicFramer framer(SupportedVersions(version_), clock_->Now(),
-                    Perspective::IS_CLIENT);
+  QuicFramer framer(SupportedVersions(version_), clock_->Now(), perspective_);
   std::unique_ptr<QuicPacket> packet(
       BuildUnsizedDataPacket(&framer, header, frames));
   char buffer[kMaxPacketSize];
diff --git a/net/quic/test_tools/quic_test_packet_maker.h b/net/quic/test_tools/quic_test_packet_maker.h
index 4adf912..34f8915 100644
--- a/net/quic/test_tools/quic_test_packet_maker.h
+++ b/net/quic/test_tools/quic_test_packet_maker.h
@@ -27,7 +27,8 @@
   QuicTestPacketMaker(QuicVersion version,
                       QuicConnectionId connection_id,
                       MockClock* clock,
-                      const std::string& host);
+                      const std::string& host,
+                      Perspective perspective);
   ~QuicTestPacketMaker();
 
   void set_hostname(const std::string& host);
@@ -202,6 +203,7 @@
   SpdyFramer spdy_response_framer_;
   MockRandom random_generator_;
   QuicPacketHeader header_;
+  Perspective perspective_;
 
   DISALLOW_COPY_AND_ASSIGN(QuicTestPacketMaker);
 };
diff --git a/net/quic/test_tools/quic_test_utils.cc b/net/quic/test_tools/quic_test_utils.cc
index 61d1908..f262672 100644
--- a/net/quic/test_tools/quic_test_utils.cc
+++ b/net/quic/test_tools/quic_test_utils.cc
@@ -47,7 +47,18 @@
   QuicAckFrame ack = MakeAckFrame(2 * num_nack_ranges + least_unacked);
   // Add enough missing packets to get num_nack_ranges nack ranges.
   for (QuicPacketNumber i = 1; i < 2 * num_nack_ranges; i += 2) {
-    ack.missing_packets.Add(least_unacked + i);
+    ack.packets.Add(least_unacked + i);
+  }
+  return ack;
+}
+
+QuicAckFrame MakeAckFrameWithAckBlocks(size_t num_ack_blocks,
+                                       QuicPacketNumber least_unacked) {
+  QuicAckFrame ack = MakeAckFrame(2 * num_ack_blocks + least_unacked);
+  ack.missing = false;
+  // Add enough received packets to get num_ack_blocks ack blocks.
+  for (QuicPacketNumber i = 2; i < 2 * num_ack_blocks + 1; i += 2) {
+    ack.packets.Add(least_unacked + i);
   }
   return ack;
 }
@@ -555,6 +566,23 @@
     QuicConnectionIdLength connection_id_length,
     QuicPacketNumberLength packet_number_length,
     QuicVersionVector* versions) {
+  return ConstructEncryptedPacket(connection_id, version_flag, multipath_flag,
+                                  reset_flag, path_id, packet_number, data,
+                                  connection_id_length, packet_number_length,
+                                  versions, Perspective::IS_CLIENT);
+}
+QuicEncryptedPacket* ConstructEncryptedPacket(
+    QuicConnectionId connection_id,
+    bool version_flag,
+    bool multipath_flag,
+    bool reset_flag,
+    QuicPathId path_id,
+    QuicPacketNumber packet_number,
+    const string& data,
+    QuicConnectionIdLength connection_id_length,
+    QuicPacketNumberLength packet_number_length,
+    QuicVersionVector* versions,
+    Perspective perspective) {
   QuicPacketHeader header;
   header.public_header.connection_id = connection_id;
   header.public_header.connection_id_length = connection_id_length;
@@ -574,7 +602,7 @@
   QuicFrames frames;
   frames.push_back(frame);
   QuicFramer framer(versions != nullptr ? *versions : QuicSupportedVersions(),
-                    QuicTime::Zero(), Perspective::IS_CLIENT);
+                    QuicTime::Zero(), perspective);
 
   std::unique_ptr<QuicPacket> packet(
       BuildUnsizedDataPacket(&framer, header, frames));
@@ -605,7 +633,8 @@
     const string& data,
     QuicConnectionIdLength connection_id_length,
     QuicPacketNumberLength packet_number_length,
-    QuicVersionVector* versions) {
+    QuicVersionVector* versions,
+    Perspective perspective) {
   QuicPacketHeader header;
   header.public_header.connection_id = connection_id;
   header.public_header.connection_id_length = connection_id_length;
@@ -625,7 +654,7 @@
   QuicFrames frames;
   frames.push_back(frame);
   QuicFramer framer(versions != nullptr ? *versions : QuicSupportedVersions(),
-                    QuicTime::Zero(), Perspective::IS_CLIENT);
+                    QuicTime::Zero(), perspective);
 
   std::unique_ptr<QuicPacket> packet(
       BuildUnsizedDataPacket(&framer, header, frames));
@@ -738,7 +767,7 @@
           include_diversification_nonce, packet_number_length, 0u);
   const size_t ack_length =
       NullEncrypter().GetCiphertextSize(
-          QuicFramer::GetMinAckFrameSize(PACKET_1BYTE_PACKET_NUMBER)) +
+          QuicFramer::GetMinAckFrameSize(version, PACKET_1BYTE_PACKET_NUMBER)) +
       GetPacketHeaderSize(connection_id_length, include_version,
                           include_path_id, include_diversification_nonce,
                           packet_number_length);
diff --git a/net/quic/test_tools/quic_test_utils.h b/net/quic/test_tools/quic_test_utils.h
index 07ea1f7..462af58 100644
--- a/net/quic/test_tools/quic_test_utils.h
+++ b/net/quic/test_tools/quic_test_utils.h
@@ -88,6 +88,23 @@
     const std::string& data,
     QuicConnectionIdLength connection_id_length,
     QuicPacketNumberLength packet_number_length,
+    QuicVersionVector* versions,
+    Perspective perspective);
+
+// Create an encrypted packet for testing.
+// If versions == nullptr, uses &QuicSupportedVersions().
+// Note that the packet is encrypted with NullEncrypter, so to decrypt the
+// constructed packet, the framer must be set to use NullDecrypter.
+QuicEncryptedPacket* ConstructEncryptedPacket(
+    QuicConnectionId connection_id,
+    bool version_flag,
+    bool multipath_flag,
+    bool reset_flag,
+    QuicPathId path_id,
+    QuicPacketNumber packet_number,
+    const std::string& data,
+    QuicConnectionIdLength connection_id_length,
+    QuicPacketNumberLength packet_number_length,
     QuicVersionVector* versions);
 
 // This form assumes |versions| == nullptr.
@@ -134,7 +151,8 @@
     const std::string& data,
     QuicConnectionIdLength connection_id_length,
     QuicPacketNumberLength packet_number_length,
-    QuicVersionVector* versions);
+    QuicVersionVector* versions,
+    Perspective perspective);
 
 void CompareCharArraysWithHexError(const std::string& description,
                                    const char* actual,
@@ -173,6 +191,11 @@
 QuicAckFrame MakeAckFrameWithNackRanges(size_t num_nack_ranges,
                                         QuicPacketNumber least_unacked);
 
+// Testing convenience method to construct a QuicAckFrame with |num_ack_blocks|
+// ack blocks of width 1 packet, starting from |least_unacked| + 2.
+QuicAckFrame MakeAckFrameWithAckBlocks(size_t num_ack_blocks,
+                                       QuicPacketNumber least_unacked);
+
 // Returns a QuicPacket that is owned by the caller, and
 // is populated with the fields in |header| and |frames|, or is nullptr if the
 // packet could not be created.
@@ -426,6 +449,7 @@
   MOCK_METHOD1(OnSendConnectionState, void(const CachedNetworkParameters&));
   MOCK_METHOD2(ResumeConnectionState,
                void(const CachedNetworkParameters&, bool));
+  MOCK_METHOD1(SetMaxPacingRate, void(QuicBandwidth));
 
   MOCK_METHOD1(OnError, void(QuicFramer* framer));
   void QuicConnection_OnError(QuicFramer* framer) {
diff --git a/net/socket/fuzzed_socket.cc b/net/socket/fuzzed_socket.cc
index 4ff9f28..e4a5c37 100644
--- a/net/socket/fuzzed_socket.cc
+++ b/net/socket/fuzzed_socket.cc
@@ -197,7 +197,7 @@
 int FuzzedSocket::GetPeerAddress(IPEndPoint* address) const {
   if (!IsConnected())
     return ERR_SOCKET_NOT_CONNECTED;
-  *address = IPEndPoint(IPAddress(127, 0, 0, 1), 80);
+  *address = remote_address_;
   return OK;
 }
 
diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc
index e93b1bd..231d1d5f 100644
--- a/net/socket/ssl_client_socket_unittest.cc
+++ b/net/socket/ssl_client_socket_unittest.cc
@@ -644,7 +644,8 @@
   void SetChannelID(std::unique_ptr<ChannelID> channel_id) override {}
   void DeleteChannelID(const std::string& server_identifier,
                        const base::Closure& completion_callback) override {}
-  void DeleteAllCreatedBetween(
+  void DeleteForDomainsCreatedBetween(
+      const base::Callback<bool(const std::string&)>& domain_predicate,
       base::Time delete_begin,
       base::Time delete_end,
       const base::Closure& completion_callback) override {}
@@ -669,7 +670,8 @@
   void SetChannelID(std::unique_ptr<ChannelID> channel_id) override {}
   void DeleteChannelID(const std::string& server_identifier,
                        const base::Closure& completion_callback) override {}
-  void DeleteAllCreatedBetween(
+  void DeleteForDomainsCreatedBetween(
+      const base::Callback<bool(const std::string&)>& domain_predicate,
       base::Time delete_begin,
       base::Time delete_end,
       const base::Closure& completion_callback) override {}
diff --git a/net/socket/transport_client_socket_pool_unittest.cc b/net/socket/transport_client_socket_pool_unittest.cc
index 75c2d42df..0695c0b5 100644
--- a/net/socket/transport_client_socket_pool_unittest.cc
+++ b/net/socket/transport_client_socket_pool_unittest.cc
@@ -885,14 +885,14 @@
   EXPECT_TRUE(handle.socket());
   IPEndPoint endpoint;
   handle.socket()->GetLocalAddress(&endpoint);
-  EXPECT_EQ(kIPv4AddressSize, endpoint.address().size());
+  EXPECT_TRUE(endpoint.address().IsIPv4());
 
   // Check that the failed connection attempt on the main socket is collected.
   ConnectionAttempts attempts;
   handle.socket()->GetConnectionAttempts(&attempts);
   ASSERT_EQ(1u, attempts.size());
   EXPECT_EQ(ERR_CONNECTION_FAILED, attempts[0].result);
-  EXPECT_EQ(kIPv6AddressSize, attempts[0].endpoint.address().size());
+  EXPECT_TRUE(attempts[0].endpoint.address().IsIPv6());
 
   EXPECT_EQ(2, client_socket_factory_.allocation_count());
 }
@@ -936,7 +936,7 @@
   EXPECT_TRUE(handle.socket());
   IPEndPoint endpoint;
   handle.socket()->GetLocalAddress(&endpoint);
-  EXPECT_EQ(kIPv6AddressSize, endpoint.address().size());
+  EXPECT_TRUE(endpoint.address().IsIPv6());
 
   // Check that the failed connection attempt on the fallback socket is
   // collected.
@@ -944,7 +944,7 @@
   handle.socket()->GetConnectionAttempts(&attempts);
   ASSERT_EQ(1u, attempts.size());
   EXPECT_EQ(ERR_CONNECTION_FAILED, attempts[0].result);
-  EXPECT_EQ(kIPv4AddressSize, attempts[0].endpoint.address().size());
+  EXPECT_TRUE(attempts[0].endpoint.address().IsIPv4());
 
   EXPECT_EQ(2, client_socket_factory_.allocation_count());
 }
@@ -977,7 +977,7 @@
   EXPECT_TRUE(handle.socket());
   IPEndPoint endpoint;
   handle.socket()->GetLocalAddress(&endpoint);
-  EXPECT_EQ(kIPv6AddressSize, endpoint.address().size());
+  EXPECT_TRUE(endpoint.address().IsIPv6());
   EXPECT_EQ(0u, handle.connection_attempts().size());
   EXPECT_EQ(1, client_socket_factory_.allocation_count());
 }
@@ -1009,7 +1009,7 @@
   EXPECT_TRUE(handle.socket());
   IPEndPoint endpoint;
   handle.socket()->GetLocalAddress(&endpoint);
-  EXPECT_EQ(kIPv4AddressSize, endpoint.address().size());
+  EXPECT_TRUE(endpoint.address().IsIPv4());
   EXPECT_EQ(0u, handle.connection_attempts().size());
   EXPECT_EQ(1, client_socket_factory_.allocation_count());
 }
@@ -1093,7 +1093,7 @@
   // Verify that the socket used is connected to the fallback IPv4 address.
   IPEndPoint endpoint;
   handle.socket()->GetPeerAddress(&endpoint);
-  EXPECT_EQ(kIPv4AddressSize, endpoint.address().size());
+  EXPECT_TRUE(endpoint.address().IsIPv4());
   // Verify that TCP FastOpen was not turned on for the socket.
   EXPECT_FALSE(socket_data_1.IsUsingTCPFastOpen());
 }
@@ -1125,7 +1125,7 @@
   IPEndPoint endpoint;
   handle.socket()->GetPeerAddress(&endpoint);
   // Verify that the socket used is connected to the IPv6 address.
-  EXPECT_EQ(kIPv6AddressSize, endpoint.address().size());
+  EXPECT_TRUE(endpoint.address().IsIPv6());
   // Verify that TCP FastOpen was not turned on for the socket.
   EXPECT_FALSE(socket_data.IsUsingTCPFastOpen());
 }
diff --git a/net/socket/websocket_transport_client_socket_pool_unittest.cc b/net/socket/websocket_transport_client_socket_pool_unittest.cc
index 48026dd..4afd764 100644
--- a/net/socket/websocket_transport_client_socket_pool_unittest.cc
+++ b/net/socket/websocket_transport_client_socket_pool_unittest.cc
@@ -544,7 +544,7 @@
   EXPECT_TRUE(handle.socket());
   IPEndPoint endpoint;
   handle.socket()->GetLocalAddress(&endpoint);
-  EXPECT_EQ(kIPv4AddressSize, endpoint.address().size());
+  EXPECT_TRUE(endpoint.address().IsIPv4());
   EXPECT_EQ(2, client_socket_factory_.allocation_count());
 }
 
@@ -587,7 +587,7 @@
   EXPECT_TRUE(handle.socket());
   IPEndPoint endpoint;
   handle.socket()->GetLocalAddress(&endpoint);
-  EXPECT_EQ(kIPv6AddressSize, endpoint.address().size());
+  EXPECT_TRUE(endpoint.address().IsIPv6());
   EXPECT_EQ(2, client_socket_factory_.allocation_count());
 }
 
@@ -620,7 +620,7 @@
   EXPECT_TRUE(handle.socket());
   IPEndPoint endpoint;
   handle.socket()->GetLocalAddress(&endpoint);
-  EXPECT_EQ(kIPv6AddressSize, endpoint.address().size());
+  EXPECT_TRUE(endpoint.address().IsIPv6());
   EXPECT_EQ(1, client_socket_factory_.allocation_count());
 }
 
@@ -651,7 +651,7 @@
   EXPECT_TRUE(handle.socket());
   IPEndPoint endpoint;
   handle.socket()->GetLocalAddress(&endpoint);
-  EXPECT_EQ(kIPv4AddressSize, endpoint.address().size());
+  EXPECT_TRUE(endpoint.address().IsIPv4());
   EXPECT_EQ(1, client_socket_factory_.allocation_count());
 }
 
diff --git a/net/ssl/channel_id_store.h b/net/ssl/channel_id_store.h
index 21c513a..abd09f64 100644
--- a/net/ssl/channel_id_store.h
+++ b/net/ssl/channel_id_store.h
@@ -79,10 +79,12 @@
       const std::string& server_identifier,
       const base::Closure& completion_callback) = 0;
 
-  // Deletes all of the channel ID keypairs that have a creation_date greater
-  // than or equal to |delete_begin| and less than |delete_end|.  If a
-  // base::Time value is_null, that side of the comparison is unbounded.
-  virtual void DeleteAllCreatedBetween(
+  // Deletes the channel ID keypairs that have a creation_date greater than
+  // or equal to |delete_begin| and less than |delete_end| and whose server
+  // identifier matches the |domain_predicate|. If base::Time value is_null,
+  // that side of the comparison is unbounded.
+  virtual void DeleteForDomainsCreatedBetween(
+      const base::Callback<bool(const std::string&)>& domain_predicate,
       base::Time delete_begin,
       base::Time delete_end,
       const base::Closure& completion_callback) = 0;
diff --git a/net/ssl/default_channel_id_store.cc b/net/ssl/default_channel_id_store.cc
index 8287077..ebac855 100644
--- a/net/ssl/default_channel_id_store.cc
+++ b/net/ssl/default_channel_id_store.cc
@@ -12,6 +12,14 @@
 #include "crypto/ec_private_key.h"
 #include "net/base/net_errors.h"
 
+namespace {
+
+bool AllDomainsPredicate(const std::string& domain) {
+  return true;
+}
+
+}  // namespace
+
 namespace net {
 
 // --------------------------------------------------------------------------
@@ -133,39 +141,43 @@
 }
 
 // --------------------------------------------------------------------------
-// DeleteAllCreatedBetweenTask
-class DefaultChannelIDStore::DeleteAllCreatedBetweenTask
+// DeleteForDomainssCreatedBetweenTask
+class DefaultChannelIDStore::DeleteForDomainsCreatedBetweenTask
     : public DefaultChannelIDStore::Task {
  public:
-  DeleteAllCreatedBetweenTask(base::Time delete_begin,
-                              base::Time delete_end,
-                              const base::Closure& callback);
-  ~DeleteAllCreatedBetweenTask() override;
+  DeleteForDomainsCreatedBetweenTask(
+      const base::Callback<bool(const std::string&)>& domain_predicate,
+      base::Time delete_begin,
+      base::Time delete_end,
+      const base::Closure& callback);
+  ~DeleteForDomainsCreatedBetweenTask() override;
   void Run(DefaultChannelIDStore* store) override;
 
  private:
+  const base::Callback<bool(const std::string&)> domain_predicate_;
   base::Time delete_begin_;
   base::Time delete_end_;
   base::Closure callback_;
 };
 
-DefaultChannelIDStore::DeleteAllCreatedBetweenTask::
-    DeleteAllCreatedBetweenTask(
+DefaultChannelIDStore::DeleteForDomainsCreatedBetweenTask::
+    DeleteForDomainsCreatedBetweenTask(
+        const base::Callback<bool(const std::string&)>& domain_predicate,
         base::Time delete_begin,
         base::Time delete_end,
         const base::Closure& callback)
-        : delete_begin_(delete_begin),
-          delete_end_(delete_end),
-          callback_(callback) {
-}
+    : domain_predicate_(domain_predicate),
+      delete_begin_(delete_begin),
+      delete_end_(delete_end),
+      callback_(callback) {}
 
-DefaultChannelIDStore::DeleteAllCreatedBetweenTask::
-    ~DeleteAllCreatedBetweenTask() {
-}
+DefaultChannelIDStore::DeleteForDomainsCreatedBetweenTask::
+    ~DeleteForDomainsCreatedBetweenTask() {}
 
-void DefaultChannelIDStore::DeleteAllCreatedBetweenTask::Run(
+void DefaultChannelIDStore::DeleteForDomainsCreatedBetweenTask::Run(
     DefaultChannelIDStore* store) {
-  store->SyncDeleteAllCreatedBetween(delete_begin_, delete_end_);
+  store->SyncDeleteForDomainsCreatedBetween(domain_predicate_, delete_begin_,
+                                            delete_end_);
 
   InvokeCallback(callback_);
 }
@@ -248,17 +260,19 @@
       new DeleteChannelIDTask(server_identifier, callback)));
 }
 
-void DefaultChannelIDStore::DeleteAllCreatedBetween(
+void DefaultChannelIDStore::DeleteForDomainsCreatedBetween(
+    const base::Callback<bool(const std::string&)>& domain_predicate,
     base::Time delete_begin,
     base::Time delete_end,
     const base::Closure& callback) {
-  RunOrEnqueueTask(std::unique_ptr<Task>(
-      new DeleteAllCreatedBetweenTask(delete_begin, delete_end, callback)));
+  RunOrEnqueueTask(std::unique_ptr<Task>(new DeleteForDomainsCreatedBetweenTask(
+      domain_predicate, delete_begin, delete_end, callback)));
 }
 
 void DefaultChannelIDStore::DeleteAll(
     const base::Closure& callback) {
-  DeleteAllCreatedBetween(base::Time(), base::Time(), callback);
+  DeleteForDomainsCreatedBetween(base::Bind(&AllDomainsPredicate), base::Time(),
+                                 base::Time(), callback);
 }
 
 void DefaultChannelIDStore::GetAllChannelIDs(
@@ -351,7 +365,8 @@
   InternalDeleteChannelID(server_identifier);
 }
 
-void DefaultChannelIDStore::SyncDeleteAllCreatedBetween(
+void DefaultChannelIDStore::SyncDeleteForDomainsCreatedBetween(
+    const base::Callback<bool(const std::string&)>& domain_predicate,
     base::Time delete_begin,
     base::Time delete_end) {
   DCHECK(CalledOnValidThread());
@@ -361,9 +376,11 @@
     ChannelIDMap::iterator cur = it;
     ++it;
     ChannelID* channel_id = cur->second;
+
     if ((delete_begin.is_null() ||
          channel_id->creation_time() >= delete_begin) &&
-        (delete_end.is_null() || channel_id->creation_time() < delete_end)) {
+        (delete_end.is_null() || channel_id->creation_time() < delete_end) &&
+        domain_predicate.Run(channel_id->server_identifier())) {
       if (store_.get())
         store_->DeleteChannelID(*channel_id);
       delete channel_id;
diff --git a/net/ssl/default_channel_id_store.h b/net/ssl/default_channel_id_store.h
index dc7e85f..7d439b0 100644
--- a/net/ssl/default_channel_id_store.h
+++ b/net/ssl/default_channel_id_store.h
@@ -54,9 +54,11 @@
   void SetChannelID(std::unique_ptr<ChannelID> channel_id) override;
   void DeleteChannelID(const std::string& server_identifier,
                        const base::Closure& callback) override;
-  void DeleteAllCreatedBetween(base::Time delete_begin,
-                               base::Time delete_end,
-                               const base::Closure& callback) override;
+  void DeleteForDomainsCreatedBetween(
+      const base::Callback<bool(const std::string&)>& domain_predicate,
+      base::Time delete_begin,
+      base::Time delete_end,
+      const base::Closure& callback) override;
   void DeleteAll(const base::Closure& callback) override;
   void GetAllChannelIDs(const GetChannelIDListCallback& callback) override;
   int GetChannelIDCount() override;
@@ -68,7 +70,7 @@
   class GetChannelIDTask;
   class SetChannelIDTask;
   class DeleteChannelIDTask;
-  class DeleteAllCreatedBetweenTask;
+  class DeleteForDomainsCreatedBetweenTask;
   class GetAllChannelIDsTask;
 
   // Deletes all of the certs. Does not delete them from |store_|.
@@ -101,8 +103,10 @@
   // initialization is complete.
   void SyncSetChannelID(std::unique_ptr<ChannelID> channel_id);
   void SyncDeleteChannelID(const std::string& server_identifier);
-  void SyncDeleteAllCreatedBetween(base::Time delete_begin,
-                                   base::Time delete_end);
+  void SyncDeleteForDomainsCreatedBetween(
+      const base::Callback<bool(const std::string&)>& domain_predicate,
+      base::Time delete_begin,
+      base::Time delete_end);
   void SyncGetAllChannelIDs(ChannelIDList* channel_id_list);
 
   // Add |task| to |waiting_tasks_|.
diff --git a/net/ssl/default_channel_id_store_unittest.cc b/net/ssl/default_channel_id_store_unittest.cc
index 97f6add..06322caa 100644
--- a/net/ssl/default_channel_id_store_unittest.cc
+++ b/net/ssl/default_channel_id_store_unittest.cc
@@ -118,6 +118,14 @@
 
 MockPersistentStore::~MockPersistentStore() {}
 
+bool DomainEquals(const std::string& domain1, const std::string& domain2) {
+  return domain1 == domain2;
+}
+
+bool DomainNotEquals(const std::string& domain1, const std::string& domain2) {
+  return !DomainEquals(domain1, domain2);
+}
+
 }  // namespace
 
 TEST(DefaultChannelIDStoreTest, TestLoading) {
@@ -241,6 +249,47 @@
   EXPECT_EQ(0, store.GetChannelIDCount());
 }
 
+TEST(DefaultChannelIDStoreTest, TestDeleteForDomains) {
+  scoped_refptr<MockPersistentStore> persistent_store(new MockPersistentStore);
+  DefaultChannelIDStore store(persistent_store.get());
+
+  store.SetChannelID(base::WrapUnique(new ChannelIDStore::ChannelID(
+      "verisign.com", base::Time(),
+      base::WrapUnique(crypto::ECPrivateKey::Create()))));
+  store.SetChannelID(base::WrapUnique(new ChannelIDStore::ChannelID(
+      "google.com", base::Time(),
+      base::WrapUnique(crypto::ECPrivateKey::Create()))));
+  store.SetChannelID(base::WrapUnique(new ChannelIDStore::ChannelID(
+      "harvard.com", base::Time(),
+      base::WrapUnique(crypto::ECPrivateKey::Create()))));
+  // Wait for load & queued set tasks.
+  base::MessageLoop::current()->RunUntilIdle();
+  EXPECT_EQ(3, store.GetChannelIDCount());
+
+  // Whitelist deletion.
+  int deletions_finished = 0;
+  store.DeleteForDomainsCreatedBetween(
+      base::Bind(&DomainEquals, base::ConstRef(std::string("verisign.com"))),
+      base::Time(), base::Time(),
+      base::Bind(&CallCounter, &deletions_finished));
+  ASSERT_EQ(1, deletions_finished);
+  EXPECT_EQ(2, store.GetChannelIDCount());
+  ChannelIDStore::ChannelIDList channel_ids;
+  store.GetAllChannelIDs(base::Bind(GetAllCallback, &channel_ids));
+  EXPECT_EQ("google.com", channel_ids.begin()->server_identifier());
+  EXPECT_EQ("harvard.com", channel_ids.back().server_identifier());
+
+  // Blacklist deletion.
+  store.DeleteForDomainsCreatedBetween(
+      base::Bind(&DomainNotEquals, base::ConstRef(std::string("google.com"))),
+      base::Time(), base::Time(),
+      base::Bind(&CallCounter, &deletions_finished));
+  ASSERT_EQ(2, deletions_finished);
+  EXPECT_EQ(1, store.GetChannelIDCount());
+  store.GetAllChannelIDs(base::Bind(GetAllCallback, &channel_ids));
+  EXPECT_EQ("google.com", channel_ids.begin()->server_identifier());
+}
+
 TEST(DefaultChannelIDStoreTest, TestAsyncGetAndDeleteAll) {
   scoped_refptr<MockPersistentStore> persistent_store(new MockPersistentStore);
   persistent_store->AddChannelID(ChannelIDStore::ChannelID(
diff --git a/net/tools/quic/end_to_end_test.cc b/net/tools/quic/end_to_end_test.cc
index bae38ec..2e413ea 100644
--- a/net/tools/quic/end_to_end_test.cc
+++ b/net/tools/quic/end_to_end_test.cc
@@ -144,15 +144,20 @@
   // to do 0-RTT across incompatible versions. Chromium only supports
   // a single version at a time anyway. :)
   QuicVersionVector all_supported_versions = QuicSupportedVersions();
-  QuicVersionVector version_buckets[2];
+  QuicVersionVector version_buckets[3];
   for (const QuicVersion version : all_supported_versions) {
     if (version <= QUIC_VERSION_25) {
       // SPDY/4
       version_buckets[0].push_back(version);
-    } else {
+    } else if (version <= QUIC_VERSION_33) {
       // QUIC_VERSION_26 changes the kdf in a way that is incompatible with
       // version negotiation across the version 26 boundary.
       version_buckets[1].push_back(version);
+    } else {
+      // QUIC_VERSION_34 deprecates entropy and uses new ack and stop waiting
+      // wire formats, so it is incompatible with version negotiation across the
+      // verion 34 boundary.
+      version_buckets[2].push_back(version);
     }
   }
 
@@ -2646,7 +2651,10 @@
   SetPacketLossPercentage(1);
   client_->SendRequest("/huge_response");
   client_->WaitForResponse();
-  VerifyCleanConnection(false);
+  // TODO(fayang): Fix this test to work with stateless rejects.
+  if (!BothSidesSupportStatelessRejects()) {
+    VerifyCleanConnection(false);
+  }
 }
 
 }  // namespace
diff --git a/net/tools/quic/quic_client.cc b/net/tools/quic/quic_client.cc
index cf7bd7b..ca015ac6 100644
--- a/net/tools/quic/quic_client.cc
+++ b/net/tools/quic/quic_client.cc
@@ -236,7 +236,7 @@
       GetNextConnectionId(), server_address_, helper(), alarm_factory(), writer,
       /* owns_writer= */ false, Perspective::IS_CLIENT, supported_versions()));
 
-  // Reset |writer_| after |session()| so that the old writer outlives the old
+  // Reset |writer()| after |session()| so that the old writer outlives the old
   // session.
   set_writer(writer);
   session()->Initialize();
@@ -303,7 +303,6 @@
     QUIC_BUG << "stream creation failed!";
     return;
   }
-  stream->set_visitor(this);
   stream->SendRequest(SpdyBalsaUtils::RequestHeadersToSpdyHeaders(headers),
                       body, fin);
   if (FLAGS_enable_quic_stateless_reject_support) {
@@ -350,6 +349,14 @@
   }
 }
 
+QuicSpdyClientStream* QuicClient::CreateReliableClientStream() {
+  QuicSpdyClientStream* stream = QuicClientBase::CreateReliableClientStream();
+  if (stream) {
+    stream->set_visitor(this);
+  }
+  return stream;
+}
+
 bool QuicClient::WaitForEvents() {
   DCHECK(connected());
 
diff --git a/net/tools/quic/quic_client.h b/net/tools/quic/quic_client.h
index ce9b5a13..99e529c 100644
--- a/net/tools/quic/quic_client.h
+++ b/net/tools/quic/quic_client.h
@@ -99,6 +99,7 @@
   // From QuicClientBase
   bool Initialize() override;
   bool WaitForEvents() override;
+  QuicSpdyClientStream* CreateReliableClientStream() override;
 
   // "Connect" to the QUIC server, including performing synchronous crypto
   // handshake.
@@ -122,7 +123,7 @@
                                      base::StringPiece body,
                                      bool fin);
 
-  // Sends a request simple GET for each URL in |args|, and then waits for
+  // Sends a request simple GET for each URL in |url_list|, and then waits for
   // each to complete.
   void SendRequestsAndWaitForResponse(const std::vector<std::string>& url_list);
 
@@ -182,6 +183,7 @@
   const std::string& latest_response_body() const;
   const std::string& latest_response_trailers() const;
 
+ protected:
   // Implements ProcessPacketInterface. This will be called for each received
   // packet.
   void ProcessPacket(const IPEndPoint& self_address,
diff --git a/net/tools/quic/quic_client_base.h b/net/tools/quic/quic_client_base.h
index 6558a97..3f9e514 100644
--- a/net/tools/quic/quic_client_base.h
+++ b/net/tools/quic/quic_client_base.h
@@ -54,7 +54,7 @@
 
   // Returns a newly created QuicSpdyClientStream, owned by the
   // QuicSimpleClient.
-  QuicSpdyClientStream* CreateReliableClientStream();
+  virtual QuicSpdyClientStream* CreateReliableClientStream();
 
   // Wait for events until the stream with the given ID is closed.
   void WaitForStreamToClose(QuicStreamId id);
diff --git a/net/tools/quic/quic_client_session_test.cc b/net/tools/quic/quic_client_session_test.cc
index 414fc55..64cc084 100644
--- a/net/tools/quic/quic_client_session_test.cc
+++ b/net/tools/quic/quic_client_session_test.cc
@@ -266,7 +266,9 @@
   // Verify that a non-decryptable packet doesn't close the connection.
   QuicConnectionId connection_id = session_->connection()->connection_id();
   std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket(
-      connection_id, false, false, false, kDefaultPathId, 100, "data"));
+      connection_id, false, false, false, kDefaultPathId, 100, "data",
+      PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, nullptr,
+      Perspective::IS_SERVER));
   std::unique_ptr<QuicReceivedPacket> received(
       ConstructReceivedPacket(*packet, QuicTime::Zero()));
   // Change the last byte of the encrypted data.
@@ -290,7 +292,8 @@
   QuicConnectionId connection_id = session_->connection()->connection_id();
   std::unique_ptr<QuicEncryptedPacket> packet(ConstructMisFramedEncryptedPacket(
       connection_id, false, false, false, kDefaultPathId, 100, "data",
-      PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, nullptr));
+      PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, nullptr,
+      Perspective::IS_SERVER));
   std::unique_ptr<QuicReceivedPacket> received(
       ConstructReceivedPacket(*packet, QuicTime::Zero()));
   EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(1);
diff --git a/net/tools/quic/quic_time_wait_list_manager.cc b/net/tools/quic/quic_time_wait_list_manager.cc
index 92278b3..8df250c1 100644
--- a/net/tools/quic/quic_time_wait_list_manager.cc
+++ b/net/tools/quic/quic_time_wait_list_manager.cc
@@ -92,17 +92,13 @@
 QuicTimeWaitListManager::~QuicTimeWaitListManager() {
   connection_id_clean_up_alarm_->Cancel();
   STLDeleteElements(&pending_packets_queue_);
-  for (ConnectionIdMap::iterator it = connection_id_map_.begin();
-       it != connection_id_map_.end(); ++it) {
-    STLDeleteElements(&it->second.termination_packets);
-  }
 }
 
 void QuicTimeWaitListManager::AddConnectionIdToTimeWait(
     QuicConnectionId connection_id,
     QuicVersion version,
     bool connection_rejected_statelessly,
-    std::vector<QuicEncryptedPacket*>* termination_packets) {
+    std::vector<std::unique_ptr<QuicEncryptedPacket>>* termination_packets) {
   if (connection_rejected_statelessly) {
     DCHECK(termination_packets != nullptr && !termination_packets->empty())
         << "Connections that were rejected statelessly must "
@@ -113,7 +109,6 @@
   const bool new_connection_id = it == connection_id_map_.end();
   if (!new_connection_id) {  // Replace record if it is reinserted.
     num_packets = it->second.num_packets;
-    STLDeleteElements(&it->second.termination_packets);
     connection_id_map_.erase(it);
   }
   TrimTimeWaitListIfNeeded();
@@ -124,7 +119,7 @@
   if (termination_packets != nullptr) {
     data.termination_packets.swap(*termination_packets);
   }
-  connection_id_map_.insert(std::make_pair(connection_id, data));
+  connection_id_map_.emplace(std::make_pair(connection_id, std::move(data)));
   if (new_connection_id) {
     visitor_->OnConnectionAddedToTimeWaitList(connection_id);
   }
@@ -178,7 +173,7 @@
       DVLOG(3) << "Time wait list sending previous stateless reject response "
                << "for connection " << connection_id;
     }
-    for (QuicEncryptedPacket* packet : connection_data->termination_packets) {
+    for (const auto& packet : connection_data->termination_packets) {
       QueuedPacket* queued_packet =
           new QueuedPacket(server_address, client_address, packet->Clone());
       // Takes ownership of the packet.
@@ -300,7 +295,6 @@
   }
   // This connection_id has lived its age, retire it now.
   const QuicConnectionId connection_id = it->first;
-  STLDeleteElements(&it->second.termination_packets);
   connection_id_map_.erase(it);
   visitor_->OnConnectionRemovedFromTimeWaitList(connection_id);
   return true;
@@ -337,7 +331,7 @@
       connection_rejected_statelessly(connection_rejected_statelessly) {}
 
 QuicTimeWaitListManager::ConnectionIdData::ConnectionIdData(
-    const ConnectionIdData& other) = default;
+    ConnectionIdData&& other) = default;
 
 QuicTimeWaitListManager::ConnectionIdData::~ConnectionIdData() {}
 
diff --git a/net/tools/quic/quic_time_wait_list_manager.h b/net/tools/quic/quic_time_wait_list_manager.h
index ac0cae7..b76dd74 100644
--- a/net/tools/quic/quic_time_wait_list_manager.h
+++ b/net/tools/quic/quic_time_wait_list_manager.h
@@ -63,7 +63,7 @@
       QuicConnectionId connection_id,
       QuicVersion version,
       bool connection_rejected_statelessly,
-      std::vector<QuicEncryptedPacket*>* termination_packets);
+      std::vector<std::unique_ptr<QuicEncryptedPacket>>* termination_packets);
 
   // Returns true if the connection_id is in time wait state, false otherwise.
   // Packets received for this connection_id should not lead to creation of new
@@ -160,7 +160,8 @@
                      QuicTime time_added_,
                      bool connection_rejected_statelessly);
 
-    ConnectionIdData(const ConnectionIdData& other);
+    ConnectionIdData(const ConnectionIdData& other) = delete;
+    ConnectionIdData(ConnectionIdData&& other);
 
     ~ConnectionIdData();
 
@@ -168,7 +169,7 @@
     QuicVersion version;
     QuicTime time_added;
     // These packets may contain CONNECTION_CLOSE frames, or SREJ messages.
-    std::vector<QuicEncryptedPacket*> termination_packets;
+    std::vector<std::unique_ptr<QuicEncryptedPacket>> termination_packets;
     bool connection_rejected_statelessly;
   };
 
diff --git a/net/tools/quic/quic_time_wait_list_manager_test.cc b/net/tools/quic/quic_time_wait_list_manager_test.cc
index 2958dfd..9597bf3 100644
--- a/net/tools/quic/quic_time_wait_list_manager_test.cc
+++ b/net/tools/quic/quic_time_wait_list_manager_test.cc
@@ -118,17 +118,19 @@
   }
 
   void AddStatelessConnectionId(QuicConnectionId connection_id) {
-    std::vector<QuicEncryptedPacket*> termination_packets;
-    termination_packets.push_back(new QuicEncryptedPacket(nullptr, 0, false));
+    std::vector<std::unique_ptr<QuicEncryptedPacket>> termination_packets;
+    termination_packets.push_back(std::unique_ptr<QuicEncryptedPacket>(
+        new QuicEncryptedPacket(nullptr, 0, false)));
     time_wait_list_manager_.AddConnectionIdToTimeWait(
         connection_id, QuicVersionMax(),
         /*connection_rejected_statelessly=*/true, &termination_packets);
   }
 
-  void AddConnectionId(QuicConnectionId connection_id,
-                       QuicVersion version,
-                       bool connection_rejected_statelessly,
-                       std::vector<QuicEncryptedPacket*>* packets) {
+  void AddConnectionId(
+      QuicConnectionId connection_id,
+      QuicVersion version,
+      bool connection_rejected_statelessly,
+      std::vector<std::unique_ptr<QuicEncryptedPacket>>* packets) {
     time_wait_list_manager_.AddConnectionIdToTimeWait(
         connection_id, version, connection_rejected_statelessly, packets);
   }
@@ -240,9 +242,10 @@
 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) {
   const size_t kConnectionCloseLength = 100;
   EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_));
-  std::vector<QuicEncryptedPacket*> termination_packets;
-  termination_packets.push_back(new QuicEncryptedPacket(
-      new char[kConnectionCloseLength], kConnectionCloseLength, true));
+  std::vector<std::unique_ptr<QuicEncryptedPacket>> termination_packets;
+  termination_packets.push_back(
+      std::unique_ptr<QuicEncryptedPacket>(new QuicEncryptedPacket(
+          new char[kConnectionCloseLength], kConnectionCloseLength, true)));
   AddConnectionId(connection_id_, QuicVersionMax(),
                   /*connection_rejected_statelessly=*/false,
                   &termination_packets);
@@ -258,11 +261,13 @@
 TEST_F(QuicTimeWaitListManagerTest, SendTwoConnectionCloses) {
   const size_t kConnectionCloseLength = 100;
   EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_));
-  std::vector<QuicEncryptedPacket*> termination_packets;
-  termination_packets.push_back(new QuicEncryptedPacket(
-      new char[kConnectionCloseLength], kConnectionCloseLength, true));
-  termination_packets.push_back(new QuicEncryptedPacket(
-      new char[kConnectionCloseLength], kConnectionCloseLength, true));
+  std::vector<std::unique_ptr<QuicEncryptedPacket>> termination_packets;
+  termination_packets.push_back(
+      std::unique_ptr<QuicEncryptedPacket>(new QuicEncryptedPacket(
+          new char[kConnectionCloseLength], kConnectionCloseLength, true)));
+  termination_packets.push_back(
+      std::unique_ptr<QuicEncryptedPacket>(new QuicEncryptedPacket(
+          new char[kConnectionCloseLength], kConnectionCloseLength, true)));
   AddConnectionId(connection_id_, QuicVersionMax(),
                   /*connection_rejected_statelessly=*/false,
                   &termination_packets);
@@ -457,9 +462,10 @@
   AddConnectionId(connection_id_);
   EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_));
   const size_t kConnectionCloseLength = 100;
-  std::vector<QuicEncryptedPacket*> termination_packets;
-  termination_packets.push_back(new QuicEncryptedPacket(
-      new char[kConnectionCloseLength], kConnectionCloseLength, true));
+  std::vector<std::unique_ptr<QuicEncryptedPacket>> termination_packets;
+  termination_packets.push_back(
+      std::unique_ptr<QuicEncryptedPacket>(new QuicEncryptedPacket(
+          new char[kConnectionCloseLength], kConnectionCloseLength, true)));
   AddConnectionId(connection_id_, QuicVersionMax(),
                   /*connection_rejected_statelessly=*/false,
                   &termination_packets);
diff --git a/net/tools/quic/test_tools/mock_quic_time_wait_list_manager.h b/net/tools/quic/test_tools/mock_quic_time_wait_list_manager.h
index a0584e2..fab8c38 100644
--- a/net/tools/quic/test_tools/mock_quic_time_wait_list_manager.h
+++ b/net/tools/quic/test_tools/mock_quic_time_wait_list_manager.h
@@ -25,13 +25,14 @@
                void(QuicConnectionId connection_id,
                     QuicVersion version,
                     bool connection_rejected_statelessly,
-                    std::vector<QuicEncryptedPacket*>* termination_packets));
+                    std::vector<std::unique_ptr<QuicEncryptedPacket>>*
+                        termination_packets));
 
   void QuicTimeWaitListManager_AddConnectionIdToTimeWait(
       QuicConnectionId connection_id,
       QuicVersion version,
       bool connection_rejected_statelessly,
-      std::vector<QuicEncryptedPacket*>* termination_packets) {
+      std::vector<std::unique_ptr<QuicEncryptedPacket>>* termination_packets) {
     QuicTimeWaitListManager::AddConnectionIdToTimeWait(
         connection_id, version, connection_rejected_statelessly,
         termination_packets);
diff --git a/net/tools/quic/test_tools/quic_client_peer.cc b/net/tools/quic/test_tools/quic_client_peer.cc
index 71d3520f..961cc82 100644
--- a/net/tools/quic/test_tools/quic_client_peer.cc
+++ b/net/tools/quic/test_tools/quic_client_peer.cc
@@ -10,6 +10,11 @@
 namespace test {
 
 // static
+QuicCryptoClientConfig* QuicClientPeer::GetCryptoConfig(QuicClient* client) {
+  return client->crypto_config();
+}
+
+// static
 bool QuicClientPeer::CreateUDPSocketAndBind(QuicClient* client) {
   return client->CreateUDPSocketAndBind();
 }
@@ -25,5 +30,10 @@
       IPEndPoint(client->GetLatestClientAddress().address(), port);
 }
 
+// static
+void QuicClientPeer::SetWriter(QuicClient* client, QuicPacketWriter* writer) {
+  client->set_writer(writer);
+}
+
 }  // namespace test
 }  // namespace net
diff --git a/net/tools/quic/test_tools/quic_client_peer.h b/net/tools/quic/test_tools/quic_client_peer.h
index 4d249a30..711fb78c 100644
--- a/net/tools/quic/test_tools/quic_client_peer.h
+++ b/net/tools/quic/test_tools/quic_client_peer.h
@@ -19,9 +19,11 @@
 
 class QuicClientPeer {
  public:
+  static QuicCryptoClientConfig* GetCryptoConfig(QuicClient* client);
   static bool CreateUDPSocketAndBind(QuicClient* client);
   static void CleanUpUDPSocket(QuicClient* client, int fd);
   static void SetClientPort(QuicClient* client, int port);
+  static void SetWriter(QuicClient* client, QuicPacketWriter* writer);
 
  private:
   DISALLOW_COPY_AND_ASSIGN(QuicClientPeer);
diff --git a/net/tools/quic/test_tools/quic_test_server.cc b/net/tools/quic/test_tools/quic_test_server.cc
index 32e4117..f90eca75 100644
--- a/net/tools/quic/test_tools/quic_test_server.cc
+++ b/net/tools/quic/test_tools/quic_test_server.cc
@@ -188,8 +188,11 @@
                               connection,
                               visitor,
                               crypto_config,
-                              compressed_certs_cache) {
+                              compressed_certs_cache) {}
+
+void ImmediateGoAwaySession::OnStreamFrame(const QuicStreamFrame& frame) {
   SendGoAway(QUIC_PEER_GOING_AWAY, "");
+  QuicSimpleServerSession::OnStreamFrame(frame);
 }
 
 }  // namespace test
diff --git a/net/tools/quic/test_tools/quic_test_server.h b/net/tools/quic/test_tools/quic_test_server.h
index b4ddee0..0b96be2 100644
--- a/net/tools/quic/test_tools/quic_test_server.h
+++ b/net/tools/quic/test_tools/quic_test_server.h
@@ -92,6 +92,8 @@
                          QuicServerSessionVisitor* visitor,
                          const QuicCryptoServerConfig* crypto_config,
                          QuicCompressedCertsCache* compressed_certs_cache);
+  // Override to send GoAway.
+  void OnStreamFrame(const QuicStreamFrame& frame) override;
 };
 
 }  // namespace test
diff --git a/net/url_request/url_request_context.cc b/net/url_request/url_request_context.cc
index a5ca5f1..1e69edd1 100644
--- a/net/url_request/url_request_context.cc
+++ b/net/url_request/url_request_context.cc
@@ -35,7 +35,8 @@
       sdch_manager_(nullptr),
       network_quality_estimator_(nullptr),
       url_requests_(new std::set<const URLRequest*>),
-      has_known_mismatched_cookie_store_(false) {}
+      has_known_mismatched_cookie_store_(false),
+      enable_brotli_(false) {}
 
 URLRequestContext::~URLRequestContext() {
   AssertNoURLRequests();
@@ -62,6 +63,7 @@
   set_sdch_manager(other->sdch_manager_);
   set_http_user_agent_settings(other->http_user_agent_settings_);
   set_network_quality_estimator(other->network_quality_estimator_);
+  set_enable_brotli(other->enable_brotli_);
 }
 
 const HttpNetworkSession::Params* URLRequestContext::GetNetworkSessionParams(
diff --git a/net/url_request/url_request_context.h b/net/url_request/url_request_context.h
index 045905a..7aa3351 100644
--- a/net/url_request/url_request_context.h
+++ b/net/url_request/url_request_context.h
@@ -235,6 +235,10 @@
     has_known_mismatched_cookie_store_ = true;
   }
 
+  void set_enable_brotli(bool enable_brotli) { enable_brotli_ = enable_brotli; }
+
+  bool enable_brotli() const { return enable_brotli_; }
+
  private:
   // ---------------------------------------------------------------------------
   // Important: When adding any new members below, consider whether they need to
@@ -271,6 +275,9 @@
   std::unique_ptr<std::set<const URLRequest*>> url_requests_;
   bool has_known_mismatched_cookie_store_;
 
+  // Enables Brotli Content-Encoding support.
+  bool enable_brotli_;
+
   DISALLOW_COPY_AND_ASSIGN(URLRequestContext);
 };
 
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
index 974b795c..28f3665f 100644
--- a/net/url_request/url_request_http_job.cc
+++ b/net/url_request/url_request_http_job.cc
@@ -710,9 +710,7 @@
 
     // Advertise "br" encoding only if transferred data is opaque to proxy.
     bool advertise_brotli = false;
-    const HttpNetworkSession::Params* network_session_params =
-        request()->context()->GetNetworkSessionParams();
-    if (network_session_params && network_session_params->enable_brotli)
+    if (request()->context()->enable_brotli())
       advertise_brotli = request()->url().SchemeIsCryptographic();
 
     // Supply Accept-Encoding headers first so that it is more likely that they
diff --git a/net/url_request/url_request_http_job_unittest.cc b/net/url_request/url_request_http_job_unittest.cc
index 8a8cdfe..c12807f8 100644
--- a/net/url_request/url_request_http_job_unittest.cc
+++ b/net/url_request/url_request_http_job_unittest.cc
@@ -706,7 +706,7 @@
       : context_(new TestURLRequestContext(true)) {
     std::unique_ptr<HttpNetworkSession::Params> params(
         new HttpNetworkSession::Params);
-    params->enable_brotli = true;
+    context_->set_enable_brotli(true);
     context_->set_http_network_session_params(std::move(params));
     context_->set_client_socket_factory(&socket_factory_);
     context_->Init();
diff --git a/ppapi/proxy/ppapi_command_buffer_proxy.cc b/ppapi/proxy/ppapi_command_buffer_proxy.cc
index a75dbb7..77ef282 100644
--- a/ppapi/proxy/ppapi_command_buffer_proxy.cc
+++ b/ppapi/proxy/ppapi_command_buffer_proxy.cc
@@ -41,10 +41,6 @@
   // deleted, closing the handle in this process.
 }
 
-bool PpapiCommandBufferProxy::Initialize() {
-  return true;
-}
-
 gpu::CommandBuffer::State PpapiCommandBufferProxy::GetLastState() {
   ppapi::ProxyLock::AssertAcquiredDebugOnly();
   return last_state_;
diff --git a/ppapi/proxy/ppapi_command_buffer_proxy.h b/ppapi/proxy/ppapi_command_buffer_proxy.h
index 2d812b874..3cb7f4232 100644
--- a/ppapi/proxy/ppapi_command_buffer_proxy.h
+++ b/ppapi/proxy/ppapi_command_buffer_proxy.h
@@ -41,7 +41,6 @@
   ~PpapiCommandBufferProxy() override;
 
   // gpu::CommandBuffer implementation:
-  bool Initialize() override;
   State GetLastState() override;
   int32_t GetLastToken() override;
   void Flush(int32_t put_offset) override;
diff --git a/ppapi/proxy/ppapi_messages.h b/ppapi/proxy/ppapi_messages.h
index c0b3e75..33d182f 100644
--- a/ppapi/proxy/ppapi_messages.h
+++ b/ppapi/proxy/ppapi_messages.h
@@ -1043,13 +1043,6 @@
 IPC_SYNC_MESSAGE_ROUTED2_0(PpapiHostMsg_PPBGraphics3D_DestroyTransferBuffer,
                            ppapi::HostResource /* context */,
                            int32_t /* id */)
-// The receiver of this message takes ownership of the front buffer of the GL
-// context. Each call to PpapiHostMsg_PPBGraphics3D_SwapBuffers must be preceded
-// by exactly one call to PpapiHostMsg_PPBGraphics3D_TakeFrontBuffer. The
-// SyncToken passed to PpapiHostMsg_PPBGraphics3D_SwapBuffers must be generated
-// after this message is sent.
-IPC_MESSAGE_ROUTED1(PpapiHostMsg_PPBGraphics3D_TakeFrontBuffer,
-                    ppapi::HostResource /* graphics_3d */)
 IPC_MESSAGE_ROUTED2(PpapiHostMsg_PPBGraphics3D_SwapBuffers,
                     ppapi::HostResource /* graphics_3d */,
                     gpu::SyncToken /* sync_token */)
diff --git a/ppapi/proxy/ppb_graphics_3d_proxy.cc b/ppapi/proxy/ppb_graphics_3d_proxy.cc
index 0c21e37..ccb784b 100644
--- a/ppapi/proxy/ppb_graphics_3d_proxy.cc
+++ b/ppapi/proxy/ppb_graphics_3d_proxy.cc
@@ -105,10 +105,6 @@
   NOTREACHED();
 }
 
-void Graphics3D::TakeFrontBuffer() {
-  NOTREACHED();
-}
-
 gpu::CommandBuffer* Graphics3D::GetCommandBuffer() {
   return command_buffer_.get();
 }
@@ -123,11 +119,6 @@
 
   gpu::gles2::GLES2Implementation* gl = gles2_impl();
   gl->SwapBuffers();
-
-  PluginDispatcher::GetForResource(this)->Send(
-      new PpapiHostMsg_PPBGraphics3D_TakeFrontBuffer(API_ID_PPB_GRAPHICS_3D,
-                                                     host_resource()));
-
   const GLuint64 fence_sync = gl->InsertFenceSyncCHROMIUM();
   gl->ShallowFlushCHROMIUM();
 
@@ -221,8 +212,6 @@
                         OnMsgDestroyTransferBuffer)
     IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_SwapBuffers,
                         OnMsgSwapBuffers)
-    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_TakeFrontBuffer,
-                        OnMsgTakeFrontBuffer)
     IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBGraphics3D_EnsureWorkVisible,
                         OnMsgEnsureWorkVisible)
 #endif  // !defined(OS_NACL)
@@ -356,12 +345,6 @@
         enter.object()->SwapBuffersWithSyncToken(enter.callback(), sync_token));
 }
 
-void PPB_Graphics3D_Proxy::OnMsgTakeFrontBuffer(const HostResource& context) {
-  EnterHostFromHostResource<PPB_Graphics3D_API> enter(context);
-  if (enter.succeeded())
-    enter.object()->TakeFrontBuffer();
-}
-
 void PPB_Graphics3D_Proxy::OnMsgEnsureWorkVisible(const HostResource& context) {
   EnterHostFromHostResource<PPB_Graphics3D_API> enter(context);
   if (enter.succeeded())
diff --git a/ppapi/proxy/ppb_graphics_3d_proxy.h b/ppapi/proxy/ppb_graphics_3d_proxy.h
index 2a28fce..fab0122 100644
--- a/ppapi/proxy/ppb_graphics_3d_proxy.h
+++ b/ppapi/proxy/ppb_graphics_3d_proxy.h
@@ -55,7 +55,6 @@
   gpu::CommandBuffer::State WaitForGetOffsetInRange(int32_t start,
                                                     int32_t end) override;
   void EnsureWorkVisible() override;
-  void TakeFrontBuffer() override;
 
  private:
   // PPB_Graphics3D_Shared overrides.
@@ -111,7 +110,6 @@
   void OnMsgDestroyTransferBuffer(const HostResource& context, int32_t id);
   void OnMsgSwapBuffers(const HostResource& context,
                         const gpu::SyncToken& sync_token);
-  void OnMsgTakeFrontBuffer(const HostResource& context);
   void OnMsgEnsureWorkVisible(const HostResource& context);
   // Renderer->plugin message handlers.
   void OnMsgSwapBuffersACK(const HostResource& context,
diff --git a/ppapi/proxy/ppb_image_data_proxy.cc b/ppapi/proxy/ppb_image_data_proxy.cc
index 5e4ebe1..bde81b4 100644
--- a/ppapi/proxy/ppb_image_data_proxy.cc
+++ b/ppapi/proxy/ppb_image_data_proxy.cc
@@ -392,9 +392,9 @@
 
     const bool is_opaque = false;
     mapped_canvas_ =
-        skia::AdoptRef(transport_dib_->GetPlatformCanvas(desc_.size.width,
-                                                         desc_.size.height,
-                                                         is_opaque));
+        sk_sp<SkCanvas>(transport_dib_->GetPlatformCanvas(desc_.size.width,
+                                                          desc_.size.height,
+                                                          is_opaque));
     if (!mapped_canvas_.get())
       return NULL;
   }
diff --git a/ppapi/proxy/ppb_image_data_proxy.h b/ppapi/proxy/ppb_image_data_proxy.h
index 0e2edb4..2e5554d5 100644
--- a/ppapi/proxy/ppb_image_data_proxy.h
+++ b/ppapi/proxy/ppb_image_data_proxy.h
@@ -29,7 +29,7 @@
 #include "ppapi/thunk/ppb_image_data_api.h"
 
 #if !defined(OS_NACL)
-#include "skia/ext/refptr.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
 #endif  // !defined(OS_NACL)
 
 class TransportDIB;
@@ -104,7 +104,7 @@
   std::unique_ptr<TransportDIB> transport_dib_;
 
   // Null when the image isn't mapped.
-  skia::RefPtr<SkCanvas> mapped_canvas_;
+  sk_sp<SkCanvas> mapped_canvas_;
 
   DISALLOW_COPY_AND_ASSIGN(PlatformImageData);
 };
diff --git a/ppapi/thunk/ppb_graphics_3d_api.h b/ppapi/thunk/ppb_graphics_3d_api.h
index 845b35f5f..05a28c9 100644
--- a/ppapi/thunk/ppb_graphics_3d_api.h
+++ b/ppapi/thunk/ppb_graphics_3d_api.h
@@ -62,7 +62,6 @@
   virtual void UnmapTexSubImage2DCHROMIUM(const void* mem) = 0;
 
   virtual void EnsureWorkVisible() = 0;
-  virtual void TakeFrontBuffer() = 0;
 };
 
 }  // namespace thunk
diff --git a/remoting/android/host/res/layout/main.xml b/remoting/android/host/res/layout/main.xml
index 33669177..eb031bb 100644
--- a/remoting/android/host/res/layout/main.xml
+++ b/remoting/android/host/res/layout/main.xml
@@ -15,10 +15,33 @@
         android:layout_height="wrap_content"
         android:background="?attr/colorPrimary"
         android:elevation="4dp"/>
-    <Button
+    <LinearLayout
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center"
-        android:text="Share"
-        android:onClick="onShareClicked"/>
+        android:orientation="horizontal">
+        <Button
+            android:id="@+id/share_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Share"
+            android:onClick="onShareClicked"/>
+        <Button
+            android:id="@+id/disconnect_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Disconnect"
+            android:onClick="onDisconnectClicked"/>
+    </LinearLayout>
+    <TextView
+        android:id="@+id/status_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"/>
+    <TextView
+        android:id="@+id/access_code"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:textAppearance="@style/TextAppearance.AppCompat.Large"/>
 </LinearLayout>
diff --git a/remoting/android/host/src/org/chromium/chromoting/host/MainActivity.java b/remoting/android/host/src/org/chromium/chromoting/host/MainActivity.java
index 5d304d65..aae303f 100644
--- a/remoting/android/host/src/org/chromium/chromoting/host/MainActivity.java
+++ b/remoting/android/host/src/org/chromium/chromoting/host/MainActivity.java
@@ -10,6 +10,8 @@
 import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.Toolbar;
 import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
 
 import org.chromium.base.Log;
 import org.chromium.chromoting.base.OAuthTokenFetcher;
@@ -30,6 +32,11 @@
     private Host mHost;
     private String mAccountName;
 
+    private Button mShareButton;
+    private Button mDisconnectButton;
+    private TextView mStatusText;
+    private TextView mAccessCode;
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -39,6 +46,13 @@
         Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);
 
+        mShareButton = (Button) findViewById(R.id.share_button);
+        mDisconnectButton = (Button) findViewById(R.id.disconnect_button);
+        mDisconnectButton.setEnabled(false);
+
+        mStatusText = (TextView) findViewById(R.id.status_text);
+        mAccessCode = (TextView) findViewById(R.id.access_code);
+
         if (mHost == null) {
             mHost = new Host();
         }
@@ -51,6 +65,10 @@
         startActivityForResult(intent, REQUEST_CODE_CHOOSE_ACCOUNT);
     }
 
+    public void onDisconnectClicked(View view) {
+        mHost.disconnect();
+    }
+
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (resultCode != RESULT_OK) {
             return;
@@ -82,11 +100,16 @@
 
     @Override
     public void onAccessCodeReceived(String accessCode, int lifetimeSeconds) {
-        Log.e(TAG, "OnAccessCodeReceived: %s, %d", accessCode, lifetimeSeconds);
+        mAccessCode.setText(accessCode);
     }
 
     @Override
     public void onStateChanged(State state, String errorMessage) {
-        Log.e(TAG, "OnStateChanged: %s", state.name());
+        mStatusText.setText(state.name());
+        mShareButton.setEnabled(state == It2MeHostObserver.State.DISCONNECTED);
+        mDisconnectButton.setEnabled(state != It2MeHostObserver.State.DISCONNECTED);
+        if (state == It2MeHostObserver.State.DISCONNECTED) {
+            mAccessCode.setText("");
+        }
     }
 }
diff --git a/remoting/android/host/src/org/chromium/chromoting/host/jni/Host.java b/remoting/android/host/src/org/chromium/chromoting/host/jni/Host.java
index e5aff2375..04c3857e9 100644
--- a/remoting/android/host/src/org/chromium/chromoting/host/jni/Host.java
+++ b/remoting/android/host/src/org/chromium/chromoting/host/jni/Host.java
@@ -30,8 +30,9 @@
      * @param context The Application context.
      */
     public static void loadLibrary(Context context) {
+        ContextUtils.initApplicationContext(context.getApplicationContext());
         System.loadLibrary("remoting_host_jni");
-        ContextUtils.initApplicationContext(context);
+        ContextUtils.initApplicationContextForNative();
     }
 
     public Host() {
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 95b1671..47a8d2b 100644
--- a/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java
+++ b/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java
@@ -25,9 +25,9 @@
      * @param context The Application context.
      */
     public static void loadLibrary(Context context) {
+        ContextUtils.initApplicationContext(context.getApplicationContext());
         System.loadLibrary("remoting_client_jni");
-
-        ContextUtils.initApplicationContext(context);
+        ContextUtils.initApplicationContextForNative();
         nativeLoadNative();
     }
 
diff --git a/remoting/host/android/jni_host.cc b/remoting/host/android/jni_host.cc
index f6ae73cd..11b3bcc 100644
--- a/remoting/host/android/jni_host.cc
+++ b/remoting/host/android/jni_host.cc
@@ -92,7 +92,12 @@
 }
 
 void JniHost::Disconnect(JNIEnv* env,
-                         const base::android::JavaParamRef<jobject>& caller) {}
+                         const base::android::JavaParamRef<jobject>& caller) {
+  if (it2me_host_) {
+    it2me_host_->Disconnect();
+    it2me_host_ = nullptr;
+  }
+}
 
 void JniHost::OnClientAuthenticated(const std::string& client_username) {
   HOST_LOG << "OnClientAuthenticated: " << client_username;
@@ -112,6 +117,10 @@
 
 void JniHost::OnStateChanged(It2MeHostState state,
                              const std::string& error_message) {
+  if (state == kDisconnected) {
+    it2me_host_ = nullptr;
+  }
+
   JNIEnv* env = base::android::AttachCurrentThread();
   Java_Host_onStateChanged(env, java_host_.obj(), state,
                            ConvertUTF8ToJavaString(env, error_message).obj());
diff --git a/remoting/host/desktop_capturer_proxy.cc b/remoting/host/desktop_capturer_proxy.cc
index a9ffa9b..d00ca37 100644
--- a/remoting/host/desktop_capturer_proxy.cc
+++ b/remoting/host/desktop_capturer_proxy.cc
@@ -84,9 +84,7 @@
     std::unique_ptr<webrtc::SharedMemoryFactory> shared_memory_factory) {
   DCHECK(thread_checker_.CalledOnValidThread());
   if (capturer_) {
-    capturer_->SetSharedMemoryFactory(
-        rtc::scoped_ptr<webrtc::SharedMemoryFactory>(
-            shared_memory_factory.release()));
+    capturer_->SetSharedMemoryFactory(std::move(shared_memory_factory));
   }
 }
 
@@ -132,7 +130,7 @@
 }
 
 void DesktopCapturerProxy::SetSharedMemoryFactory(
-    rtc::scoped_ptr<webrtc::SharedMemoryFactory> shared_memory_factory) {
+    std::unique_ptr<webrtc::SharedMemoryFactory> shared_memory_factory) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
   capture_task_runner_->PostTask(
diff --git a/remoting/host/desktop_capturer_proxy.h b/remoting/host/desktop_capturer_proxy.h
index df06413..0f6c8a02 100644
--- a/remoting/host/desktop_capturer_proxy.h
+++ b/remoting/host/desktop_capturer_proxy.h
@@ -38,7 +38,7 @@
 
   // webrtc::DesktopCapturer interface.
   void Start(Callback* callback) override;
-  void SetSharedMemoryFactory(rtc::scoped_ptr<webrtc::SharedMemoryFactory>
+  void SetSharedMemoryFactory(std::unique_ptr<webrtc::SharedMemoryFactory>
                                   shared_memory_factory) override;
   void Capture(const webrtc::DesktopRegion& rect) override;
 
diff --git a/remoting/host/desktop_session_agent.cc b/remoting/host/desktop_session_agent.cc
index ef13bed9f..e7ab063 100644
--- a/remoting/host/desktop_session_agent.cc
+++ b/remoting/host/desktop_session_agent.cc
@@ -117,7 +117,7 @@
   SharedMemoryFactoryImpl(const SendMessageCallback& send_message_callback)
       : send_message_callback_(send_message_callback) {}
 
-  rtc::scoped_ptr<webrtc::SharedMemory> CreateSharedMemory(
+  std::unique_ptr<webrtc::SharedMemory> CreateSharedMemory(
       size_t size) override {
     base::Closure release_buffer_callback =
         base::Bind(send_message_callback_,
@@ -143,7 +143,7 @@
               buffer->size())));
     }
 
-    return rtc::scoped_ptr<webrtc::SharedMemory>(buffer.release());
+    return std::move(buffer);
   }
 
  private:
@@ -315,7 +315,7 @@
   video_capturer_ = desktop_environment_->CreateVideoCapturer();
   video_capturer_->Start(this);
   video_capturer_->SetSharedMemoryFactory(
-      rtc::scoped_ptr<webrtc::SharedMemoryFactory>(new SharedMemoryFactoryImpl(
+      std::unique_ptr<webrtc::SharedMemoryFactory>(new SharedMemoryFactoryImpl(
           base::Bind(&DesktopSessionAgent::SendToNetwork, this))));
   mouse_cursor_monitor_ = desktop_environment_->CreateMouseCursorMonitor();
   mouse_cursor_monitor_->Init(this, webrtc::MouseCursorMonitor::SHAPE_ONLY);
diff --git a/remoting/host/desktop_session_win.cc b/remoting/host/desktop_session_win.cc
index 413b179..d086fde 100644
--- a/remoting/host/desktop_session_win.cc
+++ b/remoting/host/desktop_session_win.cc
@@ -22,6 +22,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_checker.h"
 #include "base/timer/timer.h"
+#include "base/win/registry.h"
 #include "base/win/scoped_bstr.h"
 #include "base/win/scoped_comptr.h"
 #include "base/win/scoped_handle.h"
@@ -82,10 +83,28 @@
 // The session attach notification should arrive within 30 seconds.
 const int kSessionAttachTimeoutSeconds = 30;
 
+// The default port number used for establishing an RDP session.
+const int kDefaultRdpPort = 3389;
+
+// Used for validating the required RDP registry values.
+const int kRdpConnectionsDisabled = 1;
+const int kNetworkLevelAuthEnabled = 1;
+const int kSecurityLayerTlsRequired = 2;
+
+// The values used to establish RDP connections are stored in the registry.
+const wchar_t kRdpSettingsKeyName[] =
+    L"SYSTEM\\CurrentControlSet\\Control\\Terminal Server";
+const wchar_t kRdpTcpSettingsKeyName[] = L"SYSTEM\\CurrentControlSet\\"
+    L"Control\\Terminal Server\\WinStations\\RDP-Tcp";
+const wchar_t kRdpPortValueName[] = L"PortNumber";
+const wchar_t kDenyTsConnectionsValueName[] = L"fDenyTSConnections";
+const wchar_t kNetworkLevelAuthValueName[] = L"UserAuthentication";
+const wchar_t kSecurityLayerValueName[] = L"SecurityLayer";
+
 // DesktopSession implementation which attaches to the host's physical console.
 // Receives IPC messages from the desktop process, running in the console
 // session, via |WorkerProcessIpcDelegate|, and monitors console session
-// attach/detach events via |WtsConsoleObserer|.
+// attach/detach events via |WtsConsoleObserver|.
 class ConsoleSession : public DesktopSessionWin {
  public:
   // Same as DesktopSessionWin().
@@ -113,7 +132,7 @@
 // DesktopSession implementation which attaches to virtual RDP console.
 // Receives IPC messages from the desktop process, running in the console
 // session, via |WorkerProcessIpcDelegate|, and monitors console session
-// attach/detach events via |WtsConsoleObserer|.
+// attach/detach events via |WtsConsoleObserver|.
 class RdpSession : public DesktopSessionWin {
  public:
   // Same as DesktopSessionWin().
@@ -168,6 +187,16 @@
     DISALLOW_COPY_AND_ASSIGN(EventHandler);
   };
 
+  // Examines the system settings required to establish an RDP session.
+  // This method returns false if the values are retrieved and any of them would
+  // prevent us from creating an RDP connection.
+  bool VerifyRdpSettings();
+
+  // Retrieves a DWORD value from the registry.  Returns true on success.
+  bool RetrieveDwordRegistryValue(const wchar_t* key_name,
+                                  const wchar_t* value_name,
+                                  DWORD* value);
+
   // Used to create an RDP desktop session.
   base::win::ScopedComPtr<IRdpDesktopSession> rdp_desktop_session_;
 
@@ -225,6 +254,11 @@
 bool RdpSession::Initialize(const ScreenResolution& resolution) {
   DCHECK(caller_task_runner()->BelongsToCurrentThread());
 
+  if (!VerifyRdpSettings()) {
+    LOG(ERROR) << "Could not create an RDP session due to invalid settings.";
+    return false;
+  }
+
   // Create the RDP wrapper object.
   HRESULT result = rdp_desktop_session_.CreateInstance(
       __uuidof(RdpDesktopSession));
@@ -255,13 +289,23 @@
       std::min(kMaxRdpScreenHeight,
                std::max(kMinRdpScreenHeight, host_size.height())));
 
+  // Read the port number used by RDP.
+  DWORD server_port = kDefaultRdpPort;
+  if (RetrieveDwordRegistryValue(kRdpTcpSettingsKeyName, kRdpPortValueName,
+                                 &server_port) &&
+      server_port > 65535) {
+    LOG(ERROR) << "Invalid RDP port specified: " << server_port;
+    return false;
+  }
+
   // Create an RDP session.
   base::win::ScopedComPtr<IRdpDesktopSessionEventHandler> event_handler(
       new EventHandler(weak_factory_.GetWeakPtr()));
   terminal_id_ = base::GenerateGUID();
   base::win::ScopedBstr terminal_id(base::UTF8ToUTF16(terminal_id_).c_str());
   result = rdp_desktop_session_->Connect(host_size.width(), host_size.height(),
-                                         terminal_id, event_handler.get());
+                                         terminal_id, server_port,
+                                         event_handler.get());
   if (FAILED(result)) {
     LOG(ERROR) << "RdpSession::Create() failed, 0x"
                << std::hex << result << std::dec << ".";
@@ -298,6 +342,62 @@
   rdp_desktop_session_->InjectSas();
 }
 
+bool RdpSession::VerifyRdpSettings() {
+  // Verify RDP connections are enabled.
+  DWORD deny_ts_connections_flag = 0;
+  if (RetrieveDwordRegistryValue(kRdpSettingsKeyName,
+                                 kDenyTsConnectionsValueName,
+                                 &deny_ts_connections_flag) &&
+      deny_ts_connections_flag == kRdpConnectionsDisabled) {
+    LOG(ERROR) << "RDP Connections must be enabled.";
+    return false;
+  }
+
+  // Verify Network Level Authentication is disabled.
+  DWORD network_level_auth_flag = 0;
+  if (RetrieveDwordRegistryValue(kRdpTcpSettingsKeyName,
+                                 kNetworkLevelAuthValueName,
+                                 &network_level_auth_flag) &&
+      network_level_auth_flag == kNetworkLevelAuthEnabled) {
+    LOG(ERROR) << "Network Level Authentication for RDP must be disabled.";
+    return false;
+  }
+
+  // Verify Security Layer is not set to TLS.  It can be either of the other two
+  // values, but forcing TLS will prevent us from establishing a connection.
+  DWORD security_layer_flag = 0;
+  if (RetrieveDwordRegistryValue(kRdpTcpSettingsKeyName,
+                                 kSecurityLayerValueName,
+                                 &security_layer_flag) &&
+      security_layer_flag == kSecurityLayerTlsRequired) {
+    LOG(ERROR) << "RDP SecurityLayer must not be set to TLS.";
+    return false;
+  }
+
+  return true;
+}
+
+bool RdpSession::RetrieveDwordRegistryValue(const wchar_t* key_name,
+                                            const wchar_t* value_name,
+                                            DWORD* value) {
+  DCHECK(key_name);
+  DCHECK(value_name);
+  DCHECK(value);
+
+  base::win::RegKey key(HKEY_LOCAL_MACHINE, key_name, KEY_READ);
+  if (!key.Valid()) {
+    LOG(WARNING) << "Failed to open key: " << key_name;
+    return false;
+  }
+
+  if (key.ReadValueDW(value_name, value) != ERROR_SUCCESS) {
+    LOG(WARNING) << "Failed to read registry value: " << value_name;
+    return false;
+  }
+
+  return true;
+}
+
 RdpSession::EventHandler::EventHandler(
     base::WeakPtr<RdpSession> desktop_session)
     : ref_count_(0),
diff --git a/remoting/host/it2me/it2me_native_messaging_host.cc b/remoting/host/it2me/it2me_native_messaging_host.cc
index 4d41d6a..fc7190c 100644
--- a/remoting/host/it2me/it2me_native_messaging_host.cc
+++ b/remoting/host/it2me/it2me_native_messaging_host.cc
@@ -87,7 +87,7 @@
   // might be a string or a number, so cope with both.
   const base::Value* id;
   if (message_dict->Get("id", &id))
-    response->Set("id", id->DeepCopy());
+    response->Set("id", id->CreateDeepCopy());
 
   std::string type;
   if (!message_dict->GetString("type", &type)) {
diff --git a/remoting/host/policy_watcher.cc b/remoting/host/policy_watcher.cc
index 9672729..ce590480 100644
--- a/remoting/host/policy_watcher.cc
+++ b/remoting/host/policy_watcher.cc
@@ -52,7 +52,7 @@
 std::unique_ptr<base::DictionaryValue> CopyValuesAndAddDefaults(
     const base::DictionaryValue& from,
     const base::DictionaryValue& default_values) {
-  std::unique_ptr<base::DictionaryValue> to(default_values.DeepCopy());
+  std::unique_ptr<base::DictionaryValue> to(default_values.CreateDeepCopy());
   for (base::DictionaryValue::Iterator i(default_values); !i.IsAtEnd();
        i.Advance()) {
     const base::Value* value = nullptr;
@@ -63,7 +63,7 @@
     }
 
     CHECK(value->IsType(i.value().GetType()));
-    to->Set(i.key(), value->DeepCopy());
+    to->Set(i.key(), value->CreateDeepCopy());
   }
 
   return to;
@@ -99,7 +99,7 @@
     // TODO(lukasza): Removing this somewhat brittle filtering will be possible
     //                after having separate, Chromoting-specific schema.
     if (key.find(kPolicyNameSubstring) != std::string::npos) {
-      policy_dict->Set(key, value->DeepCopy());
+      policy_dict->Set(key, value->CreateDeepCopy());
     }
   }
 
@@ -243,7 +243,7 @@
                          std::string key) {
   const base::Value* value;
   if (from.Get(key, &value)) {
-    to.Set(key, value->DeepCopy());
+    to.Set(key, value->CreateDeepCopy());
   }
 }
 }  // namespace
@@ -259,7 +259,7 @@
     base::Value* old_policy;
     if (!(old_policies_->Get(iter.key(), &old_policy) &&
           old_policy->Equals(&iter.value()))) {
-      changed_policies->Set(iter.key(), iter.value().DeepCopy());
+      changed_policies->Set(iter.key(), iter.value().CreateDeepCopy());
     }
     iter.Advance();
   }
diff --git a/remoting/host/setup/me2me_native_messaging_host.cc b/remoting/host/setup/me2me_native_messaging_host.cc
index 7af0d13..2d9d8114 100644
--- a/remoting/host/setup/me2me_native_messaging_host.cc
+++ b/remoting/host/setup/me2me_native_messaging_host.cc
@@ -63,7 +63,7 @@
   std::unique_ptr<base::DictionaryValue> result;
   const base::DictionaryValue* config_dict;
   if (message->GetDictionary("config", &config_dict)) {
-    result.reset(config_dict->DeepCopy());
+    result = config_dict->CreateDeepCopy();
   } else {
     LOG(ERROR) << "'config' dictionary not found";
   }
@@ -127,7 +127,7 @@
   // might be a string or a number, so cope with both.
   const base::Value* id;
   if (message_dict->Get("id", &id))
-    response->Set("id", id->DeepCopy());
+    response->Set("id", id->CreateDeepCopy());
 
   std::string type;
   if (!message_dict->GetString("type", &type)) {
diff --git a/remoting/host/setup/me2me_native_messaging_host_unittest.cc b/remoting/host/setup/me2me_native_messaging_host_unittest.cc
index 09020da..f0317a16 100644
--- a/remoting/host/setup/me2me_native_messaging_host_unittest.cc
+++ b/remoting/host/setup/me2me_native_messaging_host_unittest.cc
@@ -498,14 +498,14 @@
   // Following messages require a "config" dictionary.
   base::DictionaryValue config;
   config.SetBoolean("update", true);
-  message.Set("config", config.DeepCopy());
+  message.Set("config", config.CreateDeepCopy());
   message.SetInteger("id", next_id++);
   message.SetString("type", "updateDaemonConfig");
   WriteMessageToInputPipe(message);
 
   config.Clear();
   config.SetBoolean("start", true);
-  message.Set("config", config.DeepCopy());
+  message.Set("config", config.CreateDeepCopy());
   message.SetBoolean("consent", true);
   message.SetInteger("id", next_id++);
   message.SetString("type", "startDaemon");
@@ -625,7 +625,7 @@
 TEST_F(Me2MeNativeMessagingHostTest, StartDaemonNoConsent) {
   base::DictionaryValue message;
   message.SetString("type", "startDaemon");
-  message.Set("config", base::DictionaryValue().DeepCopy());
+  message.Set("config", base::DictionaryValue().CreateDeepCopy());
   TestBadRequest(message);
 }
 
diff --git a/remoting/host/win/chromoting_lib_idl.templ b/remoting/host/win/chromoting_lib_idl.templ
index 6de574a..3dba78e 100644
--- a/remoting/host/win/chromoting_lib_idl.templ
+++ b/remoting/host/win/chromoting_lib_idl.templ
@@ -33,8 +33,10 @@
   [ id(1), helpstring("Initiates a loopback RDP connection to spawn a new "
                       "Windows session. |width| and |height| specify the "
                       "initial screen resolution. |terminal_id| specifies a "
-                      "unique value to be used to identify this connection.") ]
+                      "unique value to be used to identify this connection."
+                      "|port_number| specifies the RDP port number to use.") ]
   HRESULT Connect([in] long width, [in] long height, [in] BSTR terminal_id,
+                  [in] DWORD port_number,
                   [in] IRdpDesktopSessionEventHandler* event_handler);
 
   [ id(2), helpstring("Shuts down the connection created by Connect().") ]
diff --git a/remoting/host/win/rdp_client.cc b/remoting/host/win/rdp_client.cc
index 377049b..2402522e 100644
--- a/remoting/host/win/rdp_client.cc
+++ b/remoting/host/win/rdp_client.cc
@@ -13,7 +13,6 @@
 #include "base/macros.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/single_thread_task_runner.h"
-#include "base/win/registry.h"
 #include "net/base/ip_address.h"
 #include "net/base/ip_endpoint.h"
 #include "remoting/base/typed_buffer.h"
@@ -28,13 +27,6 @@
 // 127.0.0.2 instead.
 const unsigned char kRdpLoopbackAddress[] = { 127, 0, 0, 2 };
 
-const int kDefaultRdpPort = 3389;
-
-// The port number used by RDP is stored in the registry.
-const wchar_t kRdpPortKeyName[] = L"SYSTEM\\CurrentControlSet\\Control\\"
-    L"Terminal Server\\WinStations\\RDP-Tcp";
-const wchar_t kRdpPortValueName[] = L"PortNumber";
-
 }  // namespace
 
 // The core of RdpClient is ref-counted since it services calls and notifies
@@ -51,7 +43,8 @@
 
   // Initiates a loopback RDP connection.
   void Connect(const webrtc::DesktopSize& screen_size,
-               const std::string& terminal_id);
+               const std::string& terminal_id,
+               DWORD port_number);
 
   // Initiates a graceful shutdown of the RDP connection.
   void Disconnect();
@@ -96,11 +89,12 @@
     scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
     const webrtc::DesktopSize& screen_size,
     const std::string& terminal_id,
+    DWORD port_number,
     EventHandler* event_handler) {
   DCHECK(caller_task_runner->BelongsToCurrentThread());
 
   core_ = new Core(caller_task_runner, ui_task_runner, event_handler);
-  core_->Connect(screen_size, terminal_id);
+  core_->Connect(screen_size, terminal_id, port_number);
 }
 
 RdpClient::~RdpClient() {
@@ -125,10 +119,12 @@
 }
 
 void RdpClient::Core::Connect(const webrtc::DesktopSize& screen_size,
-                              const std::string& terminal_id) {
+                              const std::string& terminal_id,
+                              DWORD port_number) {
   if (!ui_task_runner_->BelongsToCurrentThread()) {
     ui_task_runner_->PostTask(
-        FROM_HERE, base::Bind(&Core::Connect, this, screen_size, terminal_id));
+        FROM_HERE, base::Bind(&Core::Connect, this, screen_size, terminal_id,
+                              port_number));
     return;
   }
 
@@ -136,17 +132,8 @@
   DCHECK(!rdp_client_window_);
   DCHECK(!self_.get());
 
-  // Read the port number used by RDP.
-  DWORD server_port;
-  base::win::RegKey key(HKEY_LOCAL_MACHINE, kRdpPortKeyName, KEY_READ);
-  if (!key.Valid() ||
-      (key.ReadValueDW(kRdpPortValueName, &server_port) != ERROR_SUCCESS) ||
-      server_port > 65535) {
-    server_port = kDefaultRdpPort;
-  }
-
   net::IPEndPoint server_endpoint(net::IPAddress(kRdpLoopbackAddress),
-                                  base::checked_cast<uint16_t>(server_port));
+                                  base::checked_cast<uint16_t>(port_number));
 
   // Create the ActiveX control window.
   rdp_client_window_.reset(new RdpClientWindow(server_endpoint, terminal_id,
diff --git a/remoting/host/win/rdp_client.h b/remoting/host/win/rdp_client.h
index 049cfdd..a0de33a9 100644
--- a/remoting/host/win/rdp_client.h
+++ b/remoting/host/win/rdp_client.h
@@ -37,12 +37,12 @@
     virtual void OnRdpClosed() = 0;
   };
 
-  RdpClient(
-      scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
-      scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
-      const webrtc::DesktopSize& screen_size,
-      const std::string& terminal_id,
-      EventHandler* event_handler);
+  RdpClient(scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
+            scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
+            const webrtc::DesktopSize& screen_size,
+            const std::string& terminal_id,
+            DWORD port_number,
+            EventHandler* event_handler);
   virtual ~RdpClient();
 
   // Sends Secure Attention Sequence to the session.
diff --git a/remoting/host/win/rdp_client_unittest.cc b/remoting/host/win/rdp_client_unittest.cc
index 01524be..1c51bca 100644
--- a/remoting/host/win/rdp_client_unittest.cc
+++ b/remoting/host/win/rdp_client_unittest.cc
@@ -35,6 +35,8 @@
 const long kDefaultWidth = 1024;
 const long kDefaultHeight = 768;
 
+const DWORD kDefaultRdpPort = 3389;
+
 class MockRdpClientEventHandler : public RdpClient::EventHandler {
  public:
   MockRdpClientEventHandler() {}
@@ -162,10 +164,10 @@
       .Times(AtMost(1))
       .WillOnce(InvokeWithoutArgs(this, &RdpClientTest::CloseRdpClient));
 
-  rdp_client_.reset(new RdpClient(
-      task_runner_, task_runner_,
-      webrtc::DesktopSize(kDefaultWidth, kDefaultHeight),
-      terminal_id_, &event_handler_));
+  rdp_client_.reset(
+      new RdpClient(task_runner_, task_runner_,
+                    webrtc::DesktopSize(kDefaultWidth, kDefaultHeight),
+                    terminal_id_, kDefaultRdpPort, &event_handler_));
   task_runner_ = nullptr;
 
   run_loop_.Run();
diff --git a/remoting/host/win/rdp_desktop_session.cc b/remoting/host/win/rdp_desktop_session.cc
index 788d06a..19980be 100644
--- a/remoting/host/win/rdp_desktop_session.cc
+++ b/remoting/host/win/rdp_desktop_session.cc
@@ -21,6 +21,7 @@
     long width,
     long height,
     BSTR terminal_id,
+    DWORD port_number,
     IRdpDesktopSessionEventHandler* event_handler) {
   event_handler_ = event_handler;
 
@@ -28,9 +29,9 @@
       ChromotingModule::task_runner();
   DCHECK(task_runner->BelongsToCurrentThread());
 
-  client_.reset(new RdpClient(task_runner, task_runner,
-                              webrtc::DesktopSize(width, height),
-                              base::UTF16ToUTF8(terminal_id), this));
+  client_.reset(new RdpClient(
+      task_runner, task_runner, webrtc::DesktopSize(width, height),
+      base::UTF16ToUTF8(terminal_id), port_number, this));
   return S_OK;
 }
 
diff --git a/remoting/host/win/rdp_desktop_session.h b/remoting/host/win/rdp_desktop_session.h
index 3b3f5dd..0bfd7ae 100644
--- a/remoting/host/win/rdp_desktop_session.h
+++ b/remoting/host/win/rdp_desktop_session.h
@@ -41,10 +41,12 @@
   ~RdpDesktopSession() override;
 
   // IRdpDesktopSession implementation.
-  STDMETHOD(Connect)(long width,
-                     long height,
-                     BSTR terminal_id,
-                     IRdpDesktopSessionEventHandler* event_handler) override;
+  STDMETHOD(Connect)
+  (long width,
+   long height,
+   BSTR terminal_id,
+   DWORD port_number,
+   IRdpDesktopSessionEventHandler* event_handler) override;
   STDMETHOD(Disconnect)() override;
   STDMETHOD(ChangeResolution)(long width, long height) override;
   STDMETHOD(InjectSas)() override;
diff --git a/remoting/protocol/channel_socket_adapter_unittest.cc b/remoting/protocol/channel_socket_adapter_unittest.cc
index 4e6aa55..45f3a3fa 100644
--- a/remoting/protocol/channel_socket_adapter_unittest.cc
+++ b/remoting/protocol/channel_socket_adapter_unittest.cc
@@ -57,7 +57,7 @@
 
   // This can't be a real mock method because gmock doesn't support move-only
   // return values.
-  rtc::scoped_ptr<rtc::SSLCertificate> GetRemoteSSLCertificate()
+  std::unique_ptr<rtc::SSLCertificate> GetRemoteSSLCertificate()
       const override {
     EXPECT_TRUE(false);  // Never called.
     return nullptr;
diff --git a/remoting/protocol/fake_desktop_capturer.cc b/remoting/protocol/fake_desktop_capturer.cc
index 5817715..9b15e9a 100644
--- a/remoting/protocol/fake_desktop_capturer.cc
+++ b/remoting/protocol/fake_desktop_capturer.cc
@@ -141,8 +141,8 @@
 }
 
 void FakeDesktopCapturer::SetSharedMemoryFactory(
-    rtc::scoped_ptr<webrtc::SharedMemoryFactory> shared_memory_factory) {
-  shared_memory_factory_.reset(shared_memory_factory.release());
+    std::unique_ptr<webrtc::SharedMemoryFactory> shared_memory_factory) {
+  shared_memory_factory_ = std::move(shared_memory_factory);
 }
 
 void FakeDesktopCapturer::Capture(const webrtc::DesktopRegion& region) {
diff --git a/remoting/protocol/fake_desktop_capturer.h b/remoting/protocol/fake_desktop_capturer.h
index 9b54fd6..84d3a019 100644
--- a/remoting/protocol/fake_desktop_capturer.h
+++ b/remoting/protocol/fake_desktop_capturer.h
@@ -38,7 +38,7 @@
 
   // webrtc::DesktopCapturer interface.
   void Start(Callback* callback) override;
-  void SetSharedMemoryFactory(rtc::scoped_ptr<webrtc::SharedMemoryFactory>
+  void SetSharedMemoryFactory(std::unique_ptr<webrtc::SharedMemoryFactory>
                                   shared_memory_factory) override;
   void Capture(const webrtc::DesktopRegion& rect) override;
 
diff --git a/remoting/protocol/negotiating_authenticator_base.cc b/remoting/protocol/negotiating_authenticator_base.cc
index d31ad57..296d5ac 100644
--- a/remoting/protocol/negotiating_authenticator_base.cc
+++ b/remoting/protocol/negotiating_authenticator_base.cc
@@ -24,6 +24,9 @@
 
 const NameMapElement<NegotiatingAuthenticatorBase::Method>
     kAuthenticationMethodStrings[] = {
+        {NegotiatingAuthenticatorBase::Method::SHARED_SECRET_PLAIN_SPAKE2_P224,
+         "spake2_plain"},
+
         {NegotiatingAuthenticatorBase::Method::SHARED_SECRET_SPAKE2_P224,
          "spake2_hmac"},
         {NegotiatingAuthenticatorBase::Method::SHARED_SECRET_SPAKE2_CURVE25519,
diff --git a/remoting/protocol/negotiating_authenticator_base.h b/remoting/protocol/negotiating_authenticator_base.h
index b5ff31cd..1f42cfa 100644
--- a/remoting/protocol/negotiating_authenticator_base.h
+++ b/remoting/protocol/negotiating_authenticator_base.h
@@ -67,6 +67,12 @@
   enum class Method {
     INVALID,
 
+    // SPAKE2 with P224 using access code in plain-text. Used for It2Me.
+    // TODO(sergeyu): Remove and use SHARED_SECRET_SPAKE2_CURVE25519 once
+    // the population of M50 hosts (which require this for IT2Me) is
+    // sufficiently low: crbug.com/607643.
+    SHARED_SECRET_PLAIN_SPAKE2_P224,
+
     // SPAKE2 PIN or access code hashed with host_id using HMAC-SHA256.
     SHARED_SECRET_SPAKE2_P224,
     SHARED_SECRET_SPAKE2_CURVE25519,
diff --git a/remoting/protocol/negotiating_client_authenticator.cc b/remoting/protocol/negotiating_client_authenticator.cc
index fc19c39..9906b941 100644
--- a/remoting/protocol/negotiating_client_authenticator.cc
+++ b/remoting/protocol/negotiating_client_authenticator.cc
@@ -42,6 +42,8 @@
 
   AddMethod(Method::SHARED_SECRET_SPAKE2_CURVE25519);
   AddMethod(Method::SHARED_SECRET_SPAKE2_P224);
+
+  AddMethod(Method::SHARED_SECRET_PLAIN_SPAKE2_P224);
 }
 
 NegotiatingClientAuthenticator::~NegotiatingClientAuthenticator() {}
@@ -164,6 +166,7 @@
       break;
     }
 
+    case Method::SHARED_SECRET_PLAIN_SPAKE2_P224:
     case Method::SHARED_SECRET_SPAKE2_P224:
     case Method::SHARED_SECRET_SPAKE2_CURVE25519:
       config_.fetch_secret_callback.Run(
@@ -194,7 +197,10 @@
     const base::Closure& resume_callback,
     const std::string& shared_secret) {
   std::string shared_secret_hash =
-      GetSharedSecretHash(config_.host_id, shared_secret);
+      (current_method_ == Method::SHARED_SECRET_PLAIN_SPAKE2_P224)
+          ? shared_secret
+          : GetSharedSecretHash(config_.host_id, shared_secret);
+
   if (current_method_ == Method::SHARED_SECRET_SPAKE2_CURVE25519) {
     current_authenticator_ = Spake2Authenticator::CreateForClient(
         local_id_, remote_id_, shared_secret_hash, initial_state);
diff --git a/remoting/protocol/negotiating_host_authenticator.cc b/remoting/protocol/negotiating_host_authenticator.cc
index fe81133..bd896f0 100644
--- a/remoting/protocol/negotiating_host_authenticator.cc
+++ b/remoting/protocol/negotiating_host_authenticator.cc
@@ -231,6 +231,7 @@
       resume_callback.Run();
       break;
 
+    case Method::SHARED_SECRET_PLAIN_SPAKE2_P224:
     case Method::SHARED_SECRET_SPAKE2_P224:
       current_authenticator_ = V2Authenticator::CreateForHost(
           local_cert_, local_key_pair_, shared_secret_hash_,
diff --git a/remoting/protocol/webrtc_transport.cc b/remoting/protocol/webrtc_transport.cc
index 08c366d7..f00e50c 100644
--- a/remoting/protocol/webrtc_transport.cc
+++ b/remoting/protocol/webrtc_transport.cc
@@ -196,9 +196,7 @@
       transport_context_->port_allocator_factory()->CreatePortAllocator(
           transport_context_);
   peer_connection_ = peer_connection_factory_->CreatePeerConnection(
-      rtc_config, &constraints,
-      rtc::scoped_ptr<cricket::PortAllocator>(port_allocator.release()),
-      nullptr, this);
+      rtc_config, &constraints, std::move(port_allocator), nullptr, this);
 
   outgoing_data_stream_adapter_.Initialize(peer_connection_);
   incoming_data_stream_adapter_.Initialize(peer_connection_);
diff --git a/remoting/remoting_locales.gni b/remoting/remoting_locales.gni
index a9702de6..2321d69 100644
--- a/remoting/remoting_locales.gni
+++ b/remoting/remoting_locales.gni
@@ -148,7 +148,7 @@
   "uk",
   "vi",
   "zh-rCN",
-  "zh-rTW",
+  "zh",
 ]
 
 # The list of .json files generated by remoting_strings.grd.
diff --git a/remoting/resources/remoting_strings.grd b/remoting/resources/remoting_strings.grd
index a385ec8..bdb1e3c 100644
--- a/remoting/resources/remoting_strings.grd
+++ b/remoting/resources/remoting_strings.grd
@@ -175,7 +175,7 @@
       <output filename="remoting/android/res/values-uk/remoting_strings.xml" lang="uk" type="android" context="android_java"/>
       <output filename="remoting/android/res/values-vi/remoting_strings.xml" lang="vi" type="android" context="android_java"/>
       <output filename="remoting/android/res/values-zh-rCN/remoting_strings.xml" lang="zh-CN" type="android" context="android_java"/>
-      <output filename="remoting/android/res/values-zh-rTW/remoting_strings.xml" lang="zh-TW" type="android" context="android_java"/>
+      <output filename="remoting/android/res/values-zh/remoting_strings.xml" lang="zh-TW" type="android" context="android_java"/>
     </if>
 
   </outputs>
diff --git a/remoting/resources/remoting_strings_am.xtb b/remoting/resources/remoting_strings_am.xtb
index 896f5cd5..a2365bd 100644
--- a/remoting/resources/remoting_strings_am.xtb
+++ b/remoting/resources/remoting_strings_am.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">ምንም የሚገናኙት ነገር የለም</translation>
 <translation id="5363265567587775042">«<ph name="SHARE" />» ጠቅ ለማድረግ ለመድረስ የሚፈልጉትን ኮምፒዩተር ተጠቃሚ ይጠይቁ እና የመድረሻ ኮድ ይሰጡዎታል።</translation>
 <translation id="5379087427956679853">Chrome የርቀት ዴስክቶፕ ኮምፒውተርዎን ደህንነቱ በተጠበቀ መልኩ ድሩ ላይ እንዲያጋሩት ያስችልዎታል። ሁለቱም ተጠቃሚዎች የChrome ርቀት ዴስክቶፕ መተግበሪያውን ማሄድ አለባቸው፣ እሱም <ph name="URL" /> ላይ ሊገኝ ይችላል።</translation>
-<translation id="5394895745784982830">ለMac (OS X 10.6 እና ከዚያ በላይ)</translation>
 <translation id="5397086374758643919">Chrome የርቀት ዴስክቶፕ አስተናጋጅ ማራገፊያ</translation>
 <translation id="5419185025274123272">መተግበሪያውን ዳግም ማስጀመር አልተቻለም። አሁንም የሳንካ ሪፖርት መላክ ይችላሉ።</translation>
 <translation id="544077782045763683">አስተናጋጅ ተዘግቷል።</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">ጊዜ</translation>
 <translation id="6939719207673461467">የቁልፍ ሰሌዳን አሳይ/ደብቅ።</translation>
 <translation id="6944854424004126054">መስኮት ወደነበረበት ይመልሱ</translation>
-<translation id="6962773374262604195">ለWindows (XP እና ከዚያ በላይ)</translation>
 <translation id="6965382102122355670">ይሁን</translation>
 <translation id="6985691951107243942">እርግጠኛ ነዎት ከ<ph name="HOSTNAME" /> ጋር ያሉትን የርቀት ግንኙነቶች ማሰናከል ይፈልጋሉ? ሐሳብዎን ከቀየሩ ግንኙነቶችን ዳግም ለማንቃት ያንን ኮምፒውተር መጎብኘት ይኖርብዎታል።</translation>
 <translation id="6998989275928107238">ለ</translation>
diff --git a/remoting/resources/remoting_strings_ar.xtb b/remoting/resources/remoting_strings_ar.xtb
index 1f18b33..0b915db 100644
--- a/remoting/resources/remoting_strings_ar.xtb
+++ b/remoting/resources/remoting_strings_ar.xtb
@@ -179,7 +179,6 @@
 <translation id="533625276787323658">لا يوجد أي جهاز كمبيوتر للاتصال به</translation>
 <translation id="5363265567587775042">اطلب من المستخدم الذي ترغب في الدخول إلى جهاز الكمبيوتر التابع له أن ينقر على "<ph name="SHARE" />" وأن يمنحك رمز الدخول.</translation>
 <translation id="5379087427956679853">‏يسمح لك سطح المكتب البعيد من Chrome بمشاركة جهاز الكمبيوتر التابع لك بشكل آمن عبر الويب. ويجب أن يشغّل كلا المستخدمَين تطبيق سطح المكتب البعيد من Chrome، والذي يمكن العثور عليه على <ph name="URL" />.</translation>
-<translation id="5394895745784982830">‏لأجهزة Mac (OS X 10.6 والإصدارات الأحدث)</translation>
 <translation id="5397086374758643919">‏أداة إزالة مضيف سطح المكتب البعيد من Chrome</translation>
 <translation id="5419185025274123272">تعذر إعادة ضبط التطبيق. لا يزال بإمكانك إرسال تقرير للإبلاغ عن خلل.</translation>
 <translation id="544077782045763683">تم إيقاف تشغيل المضيف.</translation>
@@ -233,7 +232,6 @@
 <translation id="6930242544192836755">المدة</translation>
 <translation id="6939719207673461467">عرض/إخفاء لوحة المفاتيح</translation>
 <translation id="6944854424004126054">استعادة النافذة</translation>
-<translation id="6962773374262604195">‏لنظام التشغيل Windows (XP والإصدارات الأحدث)</translation>
 <translation id="6965382102122355670">موافق</translation>
 <translation id="6985691951107243942">هل تريد بالتأكيد تعطيل الاتصالات عن بُعد بـ <ph name="HOSTNAME" />؟ إذا عدلت عن هذا القرار، فسيلزمك الانتقال إلى جهاز الكمبيوتر لإعادة تمكين الاتصالات.</translation>
 <translation id="6998989275928107238">إلى</translation>
diff --git a/remoting/resources/remoting_strings_bg.xtb b/remoting/resources/remoting_strings_bg.xtb
index 4ad6c48..98a5d5c 100644
--- a/remoting/resources/remoting_strings_bg.xtb
+++ b/remoting/resources/remoting_strings_bg.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Няма компютри, с които да се свържете</translation>
 <translation id="5363265567587775042">Помолете потребителя, до чийто компютър искате достъп, да кликне върху „<ph name="SHARE" />“ и да ви предостави съответния код.</translation>
 <translation id="5379087427956679853">Отдалеченият работен плот на Chrome ви позволява да споделяте надеждно компютъра си през мрежата. И двамата потребители трябва да изпълняват приложението, което може да бъде намерено на адрес <ph name="URL" />.</translation>
-<translation id="5394895745784982830">За Mac (OS X 10.6 и по-нови версии)</translation>
 <translation id="5397086374758643919">Деинсталираща програма за хоста на отдалечения работен плот на Chrome</translation>
 <translation id="5419185025274123272">Приложението не можа да се рестартира. Пак можете да изпратите сигнал за програмна грешка.</translation>
 <translation id="544077782045763683">Хостът се изключи.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Продължителност</translation>
 <translation id="6939719207673461467">Показване/скриване на клавиатурата.</translation>
 <translation id="6944854424004126054">Възстановяване на прозореца</translation>
-<translation id="6962773374262604195">За Windows (XP и по-нови версии)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Наистина ли искате да деактивирате отдалечените връзки с/ъс <ph name="HOSTNAME" />? Ако промените решението си, ще трябва да посетите този компютър, за да ги активирате отново.</translation>
 <translation id="6998989275928107238">До</translation>
diff --git a/remoting/resources/remoting_strings_bn.xtb b/remoting/resources/remoting_strings_bn.xtb
index 99ecd33..122ef3a 100644
--- a/remoting/resources/remoting_strings_bn.xtb
+++ b/remoting/resources/remoting_strings_bn.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">এমন কিছু নেই যাতে সংযোগ করা যায়</translation>
 <translation id="5363265567587775042">“<ph name="SHARE" />” এ ক্লিক করতে এবং আপনাকে অ্যাক্সেস কোড দিতে আপনি কার কম্পিউটার অ্যাক্সেস করতে চান তা ব্যবহারকারিকে জিজ্ঞেস করুন।</translation>
 <translation id="5379087427956679853">Chrome দূরবর্তী ডেস্কটপ আপনাকে ওয়েবে আপনার কম্পিউটার নিরাপদভাবে শেয়ার করার মঞ্জুরি দেয়৷ উভয় ব্যবহারকারীকেই Chrome দূরবর্তী ডেস্কটপ অ্যাপ্লিকেশন চালাতে হবে যা <ph name="URL" />এ পেতে পারেন৷</translation>
-<translation id="5394895745784982830">Mac এর জন্য (OS X 10.6 ও এর উর্ধ্বে)</translation>
 <translation id="5397086374758643919">Chrome দূরবর্তী ডেস্কটপ হোস্ট আনইনস্টলার</translation>
 <translation id="5419185025274123272">অ্যাপ্লিকেশান রিসেট করা গেল না। আপনি এখনও বাগ রিপোর্ট পাঠাতে পারবেন।</translation>
 <translation id="544077782045763683">হোস্ট বন্ধ হয়ে গেছে৷</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">সময়কাল</translation>
 <translation id="6939719207673461467">কীবোর্ড দেখান/লুকান৷</translation>
 <translation id="6944854424004126054">উইন্ডো পুনরুদ্ধার করুন</translation>
-<translation id="6962773374262604195">Windows এর জন্য (XP ও এর উর্ধ্বে)</translation>
 <translation id="6965382102122355670">ওকে</translation>
 <translation id="6985691951107243942"><ph name="HOSTNAME" />এ দূরবর্তী সংযোগগুলি অক্ষম করার ব্যাপারে আপনি কি নিশ্চিত? আপনি যদি মন বদলান, তাহলে সংযোগগুলি পুনঃসক্ষম করতে আপনাকে এই কম্পিউটারে যেতে হবে৷</translation>
 <translation id="6998989275928107238">প্রতি</translation>
diff --git a/remoting/resources/remoting_strings_ca.xtb b/remoting/resources/remoting_strings_ca.xtb
index 44eaa26..60d4609 100644
--- a/remoting/resources/remoting_strings_ca.xtb
+++ b/remoting/resources/remoting_strings_ca.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">No hi ha cap ordinador per connectar-s'hi</translation>
 <translation id="5363265567587775042">Demaneu a l'usuari de l'ordinador al qual voleu accedir que faci clic a <ph name="SHARE" /> i que us faciliti el codi d'accés.</translation>
 <translation id="5379087427956679853">L'escriptori remot de Chrome us permet compartir el vostre ordinador de manera segura al web. Els dos usuaris han d'executar l'aplicació d'escriptori remot de Chrome, que podeu trobar a la pàgina <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Per a Mac (OS X 10.6 i versions posteriors)</translation>
 <translation id="5397086374758643919">Programa de desinstal·lació de l'amfitrió de l'escriptori remot de Chrome</translation>
 <translation id="5419185025274123272">No es pot restablir l'aplicació. Podeu enviar un informe d'errors.</translation>
 <translation id="544077782045763683">L'amfitrió s'ha tancat.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Durada</translation>
 <translation id="6939719207673461467">Mostra o amaga el teclat</translation>
 <translation id="6944854424004126054">Restaura la finestra</translation>
-<translation id="6962773374262604195">Per a Windows (XP i versions posteriors)</translation>
 <translation id="6965382102122355670">D'acord</translation>
 <translation id="6985691951107243942">Esteu segur que voleu desactivar les connexions remotes a <ph name="HOSTNAME" />? Si canvieu de parer, haureu de visitar aquest ordinador per tornar-les a activar.</translation>
 <translation id="6998989275928107238">Per a</translation>
@@ -272,7 +270,7 @@
 <translation id="8187079423890319756">Copyright 2013 Els autors de Chromium. Tots els drets reservats.</translation>
 <translation id="8196755618196986400">La vostra adreça electrònica s'inclourà en tots els suggeriments que envieu perquè us puguem escriure i proporcionar-vos més informació.</translation>
 <translation id="8244400547700556338">Més informació</translation>
-<translation id="8261506727792406068">Elimina</translation>
+<translation id="8261506727792406068">Suprimeix</translation>
 <translation id="8355326866731426344">Aquest codi d'accés caducarà d'aquí a <ph name="TIMEOUT" /></translation>
 <translation id="8355485110405946777">Inclou registres de l'aplicació per ajudar-nos a resoldre el vostre problema (els registres poden incloure informació privada).</translation>
 <translation id="837021510621780684">Des d'aquest ordinador</translation>
diff --git a/remoting/resources/remoting_strings_cs.xtb b/remoting/resources/remoting_strings_cs.xtb
index 7dd4f8a..8cdc352 100644
--- a/remoting/resources/remoting_strings_cs.xtb
+++ b/remoting/resources/remoting_strings_cs.xtb
@@ -179,7 +179,6 @@
 <translation id="533625276787323658">Není k dispozici žádné zařízení, ke kterému by bylo možné se připojit.</translation>
 <translation id="5363265567587775042">Požádejte uživatele, k jehož počítači chcete získat přístup, aby kliknul na tlačítko <ph name="SHARE" /> a dal vám přístupový kód.</translation>
 <translation id="5379087427956679853">Vzdálená plocha Chrome vám umožňuje bezpečně sdílet svůj počítač přes internet. Oba uživatelé musí mít spuštěnou aplikaci Vzdálená plocha Chrome, kterou najdete na adrese <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Pro Mac (OS X 10.6 a novější)</translation>
 <translation id="5397086374758643919">Nástroj k odinstalaci hostitele Vzdálené plochy Chrome</translation>
 <translation id="5419185025274123272">Resetování aplikace se nezdařilo. Stále můžete odeslat zprávu o chybě.</translation>
 <translation id="544077782045763683">Hostitel byl vypnut.</translation>
@@ -233,7 +232,6 @@
 <translation id="6930242544192836755">Délka</translation>
 <translation id="6939719207673461467">Zobrazit či skrýt klávesnici</translation>
 <translation id="6944854424004126054">Obnovit okno</translation>
-<translation id="6962773374262604195">Pro Windows (XP a novější)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Opravdu chcete zakázat vzdálená připojení k počítači <ph name="HOSTNAME" />? Pokud později své rozhodnutí změníte, bude nutné připojení povolit přímo z uvedeného počítače.</translation>
 <translation id="6998989275928107238">Hostitel</translation>
diff --git a/remoting/resources/remoting_strings_da.xtb b/remoting/resources/remoting_strings_da.xtb
index 313d948..8e560f1d 100644
--- a/remoting/resources/remoting_strings_da.xtb
+++ b/remoting/resources/remoting_strings_da.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Der er intet at oprette forbindelse til</translation>
 <translation id="5363265567587775042">Bed den bruger, hvis computer du ønsker at få adgang til, om at klikke på "<ph name="SHARE" />" for at give dig adgangskoden.</translation>
 <translation id="5379087427956679853">Med Chrome Fjernskrivebord får du mulighed for sikkert at dele din computer via internettet. Begge brugere skal køre appen Chrome Fjernskrivebord, som kan findes på <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Til Mac (OS X 10.6 og nyere)</translation>
 <translation id="5397086374758643919">Afinstallationsprogram til host for Chrome Fjernskrivebord</translation>
 <translation id="5419185025274123272">Applikationen kunne ikke nulstilles. Du kan stadig sende en fejlrapport.</translation>
 <translation id="544077782045763683">Hosten har lukket ned.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Varighed</translation>
 <translation id="6939719207673461467">Vis/skjul tastatur.</translation>
 <translation id="6944854424004126054">Gendan vinduet</translation>
-<translation id="6962773374262604195">Til Windows (XP og nyere)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Er du sikker på, at du vil deaktivere fjernforbindelserne til <ph name="HOSTNAME" />? Hvis du ombestemmer dig, skal du genaktivere forbindelserne på den computer.</translation>
 <translation id="6998989275928107238">Til</translation>
diff --git a/remoting/resources/remoting_strings_de.xtb b/remoting/resources/remoting_strings_de.xtb
index 080b7c8..d6ac7293 100644
--- a/remoting/resources/remoting_strings_de.xtb
+++ b/remoting/resources/remoting_strings_de.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Es gibt keine Verbindungsziele</translation>
 <translation id="5363265567587775042">Bitten Sie den Nutzer, auf dessen Computer Sie zugreifen möchten, auf "<ph name="SHARE" />" zu klicken und Ihnen den Zugriffscode zu geben.</translation>
 <translation id="5379087427956679853">Chrome Remote Desktop ermöglicht die sichere Freigabe Ihres Computers über das Internet. Beide Nutzer müssen dazu die Chrome Remote Desktop App ausführen. Diese App finden Sie unter <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Für Mac OS X 10.6 und höher</translation>
 <translation id="5397086374758643919">Deinstallationsprogramm für Chrome Remote Desktop Host</translation>
 <translation id="5419185025274123272">Die App konnte nicht zurückgesetzt werden. Sie können einen Fehlerbericht senden.</translation>
 <translation id="544077782045763683">Der Host wurde heruntergefahren.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Dauer</translation>
 <translation id="6939719207673461467">Tastatur ein-/ausblenden</translation>
 <translation id="6944854424004126054">Fenster wiederherstellen</translation>
-<translation id="6962773374262604195">Für Windows XP und höher</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Möchten Sie die Remote-Verbindung zu <ph name="HOSTNAME" /> wirklich deaktivieren? Wenn Sie die Verbindung später erneut aktivieren möchten, müssen Sie dies von dem betreffenden Computer aus tun.</translation>
 <translation id="6998989275928107238">Zu</translation>
diff --git a/remoting/resources/remoting_strings_el.xtb b/remoting/resources/remoting_strings_el.xtb
index 9f4d0a1..fa053df 100644
--- a/remoting/resources/remoting_strings_el.xtb
+++ b/remoting/resources/remoting_strings_el.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Δεν υπάρχουν συσκευές για σύνδεση</translation>
 <translation id="5363265567587775042">Ζητήστε από το χρήστη στον υπολογιστή του οποίου, επιθυμείτε να αποκτήσετε πρόσβαση να κάνει κλικ στην επιλογή "<ph name="SHARE" />" και να σας δώσει τον κωδικό πρόσβασης.</translation>
 <translation id="5379087427956679853">Η Απομακρυσμένη επιφάνεια εργασίας Chrome σάς επιτρέπει να μοιράζεστε με ασφάλεια τον υπολογιστή σας μέσω Ιστού. Και οι δύο χρήστες θα πρέπει να εκτελούν την εφαρμογή Απομακρυσμένη επιφάνεια εργασίας Chrome, η οποία βρίσκεται στη διεύθυνση <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Για Mac (έκδοση OS X 10.6 και νεότερη)</translation>
 <translation id="5397086374758643919">Πρόγραμμα απεγκατάστασης κεντρικού υπολογιστή Απομακρυσμένης επιφάνειας εργασίας Chrome</translation>
 <translation id="5419185025274123272">Δεν ήταν δυνατή η επαναφορά της εφαρμογής. Εξακολουθείτε να μπορείτε να στείλετε μια αναφορά σφάλματος.</translation>
 <translation id="544077782045763683">Ο κεντρικός υπολογιστής τερματίστηκε.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Διάρκεια</translation>
 <translation id="6939719207673461467">Εμφάνιση/απόκρυψη πληκτρολογίου.</translation>
 <translation id="6944854424004126054">Επαναφορά παραθύρου</translation>
-<translation id="6962773374262604195">Για Windows (XP και νεότερη έκδοση)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Είστε βέβαιοι ότι θέλετε να απενεργοποιήσετε τις απομακρυσμένες συνδέσεις στον κεντρικό υπολογιστή <ph name="HOSTNAME" />; Εάν αλλάξετε γνώμη, θα πρέπει να επισκεφτείτε ξανά αυτόν τον υπολογιστή για να ενεργοποιήσετε εκ νέου τις συνδέσεις.</translation>
 <translation id="6998989275928107238">Προς</translation>
diff --git a/remoting/resources/remoting_strings_en-GB.xtb b/remoting/resources/remoting_strings_en-GB.xtb
index bc6edaa..7ecf26d1 100644
--- a/remoting/resources/remoting_strings_en-GB.xtb
+++ b/remoting/resources/remoting_strings_en-GB.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">There's nothing to connect to</translation>
 <translation id="5363265567587775042">Ask the user whose computer you wish to access to click “<ph name="SHARE" />” and give you the access code.</translation>
 <translation id="5379087427956679853">Chrome Remote Desktop allows you to securely share your computer over the Web. Both users must be running the Chrome Remote Desktop app, which can be found at <ph name="URL" />.</translation>
-<translation id="5394895745784982830">For Mac (OS X 10.6 and above)</translation>
 <translation id="5397086374758643919">Chrome Remote Desktop Host Uninstaller</translation>
 <translation id="5419185025274123272">Could not reset the application. You can still send a bug report.</translation>
 <translation id="544077782045763683">Host has shut down.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Duration</translation>
 <translation id="6939719207673461467">Show/hide keyboard.</translation>
 <translation id="6944854424004126054">Restore window</translation>
-<translation id="6962773374262604195">For Windows (XP and above)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Are you sure you want to disable remote connections to <ph name="HOSTNAME" />? If you change your mind, you'll need to visit that computer to re-enable connections.</translation>
 <translation id="6998989275928107238">To</translation>
diff --git a/remoting/resources/remoting_strings_es-419.xtb b/remoting/resources/remoting_strings_es-419.xtb
index 86c2f0e..13fc892 100644
--- a/remoting/resources/remoting_strings_es-419.xtb
+++ b/remoting/resources/remoting_strings_es-419.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">No hay ninguna computadora con la cual conectarse</translation>
 <translation id="5363265567587775042">Solicita al usuario a cuya computadora quieres tener acceso que haga clic en "<ph name="SHARE" />" y te envíe el código de acceso correspondiente.</translation>
 <translation id="5379087427956679853">Escritorio remoto de Chrome te permite compartir tu computadora con otro usuario de manera segura en la Web. Tanto tú como el otro usuario deben usar la aplicación Escritorio remoto de Chrome, que está disponible en <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Para Mac (SO X 10.6 y versiones posteriores)</translation>
 <translation id="5397086374758643919">Desinstalador del host del Escritorio remoto de Chrome</translation>
 <translation id="5419185025274123272">No se pudo restablecer la aplicación. Puedes enviar un informe de errores.</translation>
 <translation id="544077782045763683">El host se cerró.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Duración</translation>
 <translation id="6939719207673461467">Mostrar u ocultar teclado</translation>
 <translation id="6944854424004126054">Restaurar ventana</translation>
-<translation id="6962773374262604195">Para Windows (XP y versiones posteriores)</translation>
 <translation id="6965382102122355670">Aceptar</translation>
 <translation id="6985691951107243942">¿Realmente deseas inhabilitar las conexiones remotas con <ph name="HOSTNAME" />? Si te arrepientes, tendrás que ir a esa computadora para volver a habilitar las conexiones.</translation>
 <translation id="6998989275928107238">Para</translation>
diff --git a/remoting/resources/remoting_strings_es.xtb b/remoting/resources/remoting_strings_es.xtb
index 51a6a7a..ae4e539 100644
--- a/remoting/resources/remoting_strings_es.xtb
+++ b/remoting/resources/remoting_strings_es.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">No hay ningún ordenador al que conectarse</translation>
 <translation id="5363265567587775042">Pregunta al usuario el ordenador al que se quiere acceder para hacer clic en <ph name="SHARE" /> y proporcionar el código de acceso.</translation>
 <translation id="5379087427956679853">Escritorio remoto de Chrome permite compartir de forma segura tu ordenador a través de Internet. Ambos usuarios deben estar ejecutando la aplicación Escritorio remoto de Chrome, que está disponible en la página <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Para Mac (OS X 10.6 y versiones superiores)</translation>
 <translation id="5397086374758643919">Programa de desinstalación del host de Escritorio remoto de Chrome</translation>
 <translation id="5419185025274123272">No se ha podido restablecer la aplicación. Puedes seguir enviando un informe de errores.</translation>
 <translation id="544077782045763683">El host se ha desconectado.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Duración</translation>
 <translation id="6939719207673461467">Mostrar/ocultar teclado.</translation>
 <translation id="6944854424004126054">Restaura la ventana</translation>
-<translation id="6962773374262604195">Para Windows (XP y versiones superiores)</translation>
 <translation id="6965382102122355670">Aceptar</translation>
 <translation id="6985691951107243942">¿Seguro que quieres inhabilitar las conexiones remotas con <ph name="HOSTNAME" />? Si cambias de opinión, tendrás que volver a habilitar las conexiones desde ese ordenador.</translation>
 <translation id="6998989275928107238">Para</translation>
diff --git a/remoting/resources/remoting_strings_et.xtb b/remoting/resources/remoting_strings_et.xtb
index 443b975..5fd8d3e 100644
--- a/remoting/resources/remoting_strings_et.xtb
+++ b/remoting/resources/remoting_strings_et.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Ühegi seadmega ei saa ühendust luua</translation>
 <translation id="5363265567587775042">Paluge kasutajal, kelle arvutile soovite juurde pääseda, klõpsata nupul „<ph name="SHARE" />” ja anda teile juurdepääsukood.</translation>
 <translation id="5379087427956679853">Chrome Remote Desktop võimaldab arvutit turvaliselt veebi kaudu jagada. Mõlema kasutaja arvutis peab töötama rakendus Chrome Remote Desktop, mille leiate aadressilt <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Macile (OS X 10.6 ja uuemad versioonid)</translation>
 <translation id="5397086374758643919">Chrome Remote Desktopi hosti desinstaller</translation>
 <translation id="5419185025274123272">Rakendust ei saanud lähtestada. Saate siiski saata veaaruande.</translation>
 <translation id="544077782045763683">Host on välja lülitatud.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Kestus</translation>
 <translation id="6939719207673461467">Kuva/peida klaviatuur.</translation>
 <translation id="6944854424004126054">Akna taastamine</translation>
-<translation id="6962773374262604195">Windowsile (XP ja uuemad versioonid)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Kas olete kindel, et soovite keelata kaugühenduse hostiga <ph name="HOSTNAME" />? Kui mõtlete ümber, peate selles arvutis ühendused uuesti lubama.</translation>
 <translation id="6998989275928107238">Host</translation>
diff --git a/remoting/resources/remoting_strings_fa.xtb b/remoting/resources/remoting_strings_fa.xtb
index 4325393..5fe6e64 100644
--- a/remoting/resources/remoting_strings_fa.xtb
+++ b/remoting/resources/remoting_strings_fa.xtb
@@ -176,8 +176,7 @@
 <translation id="5308380583665731573">اتصال</translation>
 <translation id="533625276787323658">چیزی برای اتصال وجود ندارد</translation>
 <translation id="5363265567587775042">از کاربری که می‌خواهید به رایانه‌اش دسترسی داشته باشید بخواهید روی «<ph name="SHARE" />» کلیک کند و کد دسترسی را به شما بدهد.</translation>
-<translation id="5379087427956679853">‏کنترل دسک‌تاپ از راه دور Chrome به شما اجازه می‎دهد بطور امن رایانه خود را در وب به اشتراک بگذارید. هر دو کاربر باید برنامه کنترل دسک‌تاپ از راه دور Chrome را اجرا کنند، این برنامه در <ph name="URL" /> یافت می‎شود.</translation>
-<translation id="5394895745784982830">‏برای Mac‏ (OS X نسخه ۱۰٫۶ و بالاتر)</translation>
+<translation id="5379087427956679853">‏کنترل دسک‌تاپ از راه دور Chrome به شما اجازه می‎دهد به‌طور امن رایانه خود را در وب به اشتراک بگذارید. هر دو کاربر باید برنامه کنترل دسک‌تاپ از راه دور Chrome را اجرا کنند، این برنامه در <ph name="URL" /> یافت می‎شود.</translation>
 <translation id="5397086374758643919">‏حذف‌ نصب‌کننده میزبان کنترل دسک‌تاپ از راه دور Chrome</translation>
 <translation id="5419185025274123272">برنامه بازنشانی نمی‌شود. همچنان می‌توانید یک گزارش اشکال ارسال کنید.</translation>
 <translation id="544077782045763683">میزبان خاموش شد.</translation>
@@ -186,7 +185,7 @@
 <translation id="5593560073513909978">سرویس موقتاً در دسترس نیست. لطفاً بعداً دوباره امتحان کنید.</translation>
 <translation id="5601503069213153581">پین</translation>
 <translation id="5619148062500147964">به این رایانه</translation>
-<translation id="5625493749705183369">‏به رایانه‎‌های دیگر دسترسی داشته باشید یا به دیگر کاربران اجازه دهید تا بطور امن به رایانهٔ شما در اینترنت دسترسی داشته باشند.</translation>
+<translation id="5625493749705183369">‏به رایانه‎‌های دیگر دسترسی داشته باشید یا به دیگر کاربران اجازه دهید تا به‌طور امن به رایانهٔ شما در اینترنت دسترسی داشته باشند.</translation>
 <translation id="5702987232842159181">متصل شد:</translation>
 <translation id="5708869785009007625">دسک‌تاپ شما در حال حاضر با <ph name="USER" /> به‌ اشتراک گذاشته شده است.</translation>
 <translation id="5773590752998175013">تاریخ مرتبط‌سازی</translation>
@@ -231,7 +230,6 @@
 <translation id="6930242544192836755">مدت زمان</translation>
 <translation id="6939719207673461467">نمایش/پنهان کردن صفحه‌کلید</translation>
 <translation id="6944854424004126054">بازگرداندن پنجره</translation>
-<translation id="6962773374262604195">‏برای Windows‏ (XP و بالاتر)</translation>
 <translation id="6965382102122355670">تأیید</translation>
 <translation id="6985691951107243942">آیا مطمئنید که می‌خواهید اتصالات راه دور به <ph name="HOSTNAME" /> را غیرفعال کنید؟ اگر نظرتان عوض شود، باید از همان رایانه اتصالات را مجدداً فعال کنید.</translation>
 <translation id="6998989275928107238">به</translation>
diff --git a/remoting/resources/remoting_strings_fi.xtb b/remoting/resources/remoting_strings_fi.xtb
index 6a643268..06f45dc 100644
--- a/remoting/resources/remoting_strings_fi.xtb
+++ b/remoting/resources/remoting_strings_fi.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Et ole määrittänyt etätietokoneita.</translation>
 <translation id="5363265567587775042">Ota yhteyttä käyttäjään, jonka tietokonetta haluat käyttää. Pyydä häntä klikkaamaan <ph name="SHARE" /> ja antamaan käyttökoodi sinulle.</translation>
 <translation id="5379087427956679853">Chrome-etäkäyttösovelluksen avulla voit jakaa tietokoneesi suojatun verkkoyhteyden kautta. Molempien käyttäjien täytyy käyttää osoitteesta <ph name="URL" /> löytyvää Chrome-etäkäyttösovellusta.</translation>
-<translation id="5394895745784982830">Mac (OS X 10.6 ja uudemmat versiot)</translation>
 <translation id="5397086374758643919">Chrome-etäkäytön isännän asennuksen poisto</translation>
 <translation id="5419185025274123272">Sovelluksen nollaus epäonnistui. Voit silti lähettää vikailmoituksen.</translation>
 <translation id="544077782045763683">Isäntä on offline-tilassa.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Kesto</translation>
 <translation id="6939719207673461467">Näytä/piilota näppäimistö</translation>
 <translation id="6944854424004126054">Palauta ikkuna</translation>
-<translation id="6962773374262604195">Windows (XP ja uudemmat versiot)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Haluatko varmasti poistaa käytöstä etäyhteydet kohteeseen <ph name="HOSTNAME" />? Jos muutat mieltäsi, yhteydet täytyy palauttaa käyttöön kyseisellä tietokoneella.</translation>
 <translation id="6998989275928107238">Kohde</translation>
diff --git a/remoting/resources/remoting_strings_fil.xtb b/remoting/resources/remoting_strings_fil.xtb
index cb52c1f4..fa100f5 100644
--- a/remoting/resources/remoting_strings_fil.xtb
+++ b/remoting/resources/remoting_strings_fil.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Walang mapagkokonektahan</translation>
 <translation id="5363265567587775042">Hilingin sa user na may-ari ng computer na gusto mong i-access na i-click ang “<ph name="SHARE" />” at ibigay sa iyo ang access code.</translation>
 <translation id="5379087427956679853">Binibigyang-daan ka ng Remote na Desktop ng Chrome na ligtas na maibahagi ang iyong computer sa Web. Dapat na nagpapatakbo ang parehong user ng app ng Remote na Desktop ng Chrome, na matatagpuan sa <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Para sa Mac (OS X 10.6 at mas bago)</translation>
 <translation id="5397086374758643919">Uninstaller ng Host ng Remote na Desktop ng Chrome</translation>
 <translation id="5419185025274123272">Hindi ma-reset ang application. Maaari ka pa ring magpadala ng ulat sa bug.</translation>
 <translation id="544077782045763683">Nag-shut down ang host.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Tagal</translation>
 <translation id="6939719207673461467">Ipakita/itago ang keyboard.</translation>
 <translation id="6944854424004126054">Ibalik ang window</translation>
-<translation id="6962773374262604195">Para sa Windows (XP at mas bago)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Sigurado ka bang nais mong hindi paganahin ang mga malayuang koneksyon sa <ph name="HOSTNAME" />? Kung magbago ang iyong isip, kakailanganin mong bisitahin ang computer na iyon upang muling paganahin ang mga koneksyon.</translation>
 <translation id="6998989275928107238">Para kay</translation>
diff --git a/remoting/resources/remoting_strings_fr.xtb b/remoting/resources/remoting_strings_fr.xtb
index 226bcdf..69af193 100644
--- a/remoting/resources/remoting_strings_fr.xtb
+++ b/remoting/resources/remoting_strings_fr.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Aucun appareil auquel se connecter.</translation>
 <translation id="5363265567587775042">Demandez à l'utilisateur de l'ordinateur auquel vous souhaitez accéder de cliquer sur "<ph name="SHARE" />" et de vous donner le code d'accès.</translation>
 <translation id="5379087427956679853">L'application Bureau à distance Google Chrome vous permet de partager votre ordinateur sur le Web en toute sécurité. Pour ce faire, les deux utilisateurs en question doivent exécuter cette application, disponible à l'adresse <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Pour Mac (OS X 10.6 ou version ultérieure)</translation>
 <translation id="5397086374758643919">Programme de désinstallation de l'hôte Bureau à distance Google Chrome</translation>
 <translation id="5419185025274123272">Impossible de réinitialiser l'application. Vous pouvez toujours envoyer un rapport de bug.</translation>
 <translation id="544077782045763683">L'hôte a été arrêté.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Durée</translation>
 <translation id="6939719207673461467">Afficher/Masquer le clavier</translation>
 <translation id="6944854424004126054">Restaurer la fenêtre</translation>
-<translation id="6962773374262604195">Pour Windows (XP ou version ultérieure)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Voulez-vous vraiment désactiver les connexions à distance à <ph name="HOSTNAME" /> ? Si vous changez d'avis, vous devrez réactiver les connexions depuis cet ordinateur.</translation>
 <translation id="6998989275928107238">À</translation>
diff --git a/remoting/resources/remoting_strings_gu.xtb b/remoting/resources/remoting_strings_gu.xtb
index 2440f13..f8b4ca7 100644
--- a/remoting/resources/remoting_strings_gu.xtb
+++ b/remoting/resources/remoting_strings_gu.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">કનેક્ટ કરવા માટે કંઈ નથી</translation>
 <translation id="5363265567587775042">તમે જે વપરાશકર્તાનું કમ્પ્યુટર ઍક્સેસ કરવા માંગતા હોવ તેને “<ph name="SHARE" />” પર ક્લિક કરવાનું અને તમને ઍક્સેસ કોડ આપવાનું કહો.</translation>
 <translation id="5379087427956679853">Chrome રીમોટ ડેસ્કટૉપ તમને વેબ પર તમારા કમ્પ્યુટરને સુરક્ષિત રીતે શેર કરવાની મંજૂરી આપે છે. બંને વપરાશકર્તાઓ Chrome રીમોટ ડેસ્કટોપ એપ્લિકેશન ચલાવી શકે છે, જે <ph name="URL" /> પર મેળવી શકાય છે.</translation>
-<translation id="5394895745784982830">Mac (OS X 10.6 અને એ પછીના સંસ્કરણ) માટે</translation>
 <translation id="5397086374758643919">Chrome રીમોટ ડેસ્કટૉપ હોસ્ટ અનઇન્સ્ટોલર</translation>
 <translation id="5419185025274123272">એપ્લિકેશન ફરીથી સેટ કરી શકાઈ નથી. તમે હજી પણ બગ રિપોર્ટ મોકલી શકો છો.</translation>
 <translation id="544077782045763683">હોસ્ટ શટ ડાઉન થયું છે.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">અવધિ</translation>
 <translation id="6939719207673461467">કીબોર્ડ બતાવો/છુપાવો.</translation>
 <translation id="6944854424004126054">વિંડો પુનર્સ્થાપિત કરો</translation>
-<translation id="6962773374262604195">Windows (XP અને એ પછીના સંસ્કરણ) માટે</translation>
 <translation id="6965382102122355670">ઓકે</translation>
 <translation id="6985691951107243942">શું તમે ખરેખર <ph name="HOSTNAME" /> પર રીમોટ કનેક્શન્સ અક્ષમ કરવા માંગો છો? જો તમે તમારો વિચાર બદલો, તો તમને કનેક્શન્સને ફરીથી સક્ષમ કરવા માટે તે કમ્પ્યુટરની મુલાકાત લેવાની જરૂર પડશે.</translation>
 <translation id="6998989275928107238">થી</translation>
diff --git a/remoting/resources/remoting_strings_hi.xtb b/remoting/resources/remoting_strings_hi.xtb
index b93095f3..a25894a 100644
--- a/remoting/resources/remoting_strings_hi.xtb
+++ b/remoting/resources/remoting_strings_hi.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">कनेक्ट करने के लिए कुछ भी नहीं है</translation>
 <translation id="5363265567587775042">जिस उपयोगकर्ता का कंप्यूटर आप ऐक्सेस करना चाहते हैं, उसे “<ph name="SHARE" />” क्लिक करने और आपको ऐक्सेस कोड देने के लिए कहें.</translation>
 <translation id="5379087427956679853">Chrome दूरस्थ डेस्कटॉप आपको वेब पर आपका कंप्‍यूटर सुरक्षित रूप से साझा करने देता है. दोनों उपयोगकर्ताओं के पास Chrome दूरस्थ डेस्कटॉप ऐप्स अवश्‍य चलना चाहिए, जो कि <ph name="URL" /> पर मिल सकता है.</translation>
-<translation id="5394895745784982830">Mac के लिए (OS X 10.6 और बाद वाले वर्शन)</translation>
 <translation id="5397086374758643919">Chrome दूरस्थ डेस्कटॉप होस्ट अनइंस्टॉलर</translation>
 <translation id="5419185025274123272">ऐप्‍लिकेशन को रीसेट नहीं किया जा सका. फिर भी आप बग रिपोर्ट भेज सकते हैं.</translation>
 <translation id="544077782045763683">होस्‍ट बंद हो गया है.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">अवधि</translation>
 <translation id="6939719207673461467">कीबोर्ड दिखाएं/छिपाएं.</translation>
 <translation id="6944854424004126054">विंडो पुनर्स्थापित करें</translation>
-<translation id="6962773374262604195">Windows के लिए (XP और बाद वाले वर्शन)</translation>
 <translation id="6965382102122355670">ठीक</translation>
 <translation id="6985691951107243942">क्‍या आप वाकई <ph name="HOSTNAME" /> से दूरस्थ कनेक्‍शन अक्षम करना चाहते हैं? यदि आप अपना विचार बदलते हैं, तो आपको कनेक्‍शन को पुन: सक्षम करने के लिए उस कंप्‍यूटर पर जाना होगा.</translation>
 <translation id="6998989275928107238">प्रति</translation>
diff --git a/remoting/resources/remoting_strings_hr.xtb b/remoting/resources/remoting_strings_hr.xtb
index 741a87b1..f1148c842 100644
--- a/remoting/resources/remoting_strings_hr.xtb
+++ b/remoting/resources/remoting_strings_hr.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Nema dostupnih računala za povezivanje</translation>
 <translation id="5363265567587775042">Zamolite korisnika čijem računalu želite pristupiti da klikne "<ph name="SHARE" />" i da vam pristupni kôd.</translation>
 <translation id="5379087427956679853">Udaljena radna površina Chrome omogućuje vam da svoje računalo sigurno dijelite putem weba. Na računalima oba korisnika mora biti pokrenuta aplikacija Udaljena radna površina Chrome koju možete pronaći na web-lokaciji <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Za Mac (OS X 10.6 i novije verzije)</translation>
 <translation id="5397086374758643919">Program za deinstaliranje hosta Udaljene radne površine Chrome</translation>
 <translation id="5419185025274123272">Vraćanje aplikacije na zadano nije uspjelo. I dalje možete poslati izvješće o programskim pogreškama.</translation>
 <translation id="544077782045763683">Host je isključen.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Trajanje</translation>
 <translation id="6939719207673461467">Prikaži/sakrij tipkovnicu.</translation>
 <translation id="6944854424004126054">Vraćanje prozora</translation>
-<translation id="6962773374262604195">Za Windows (XP i novije verzije)</translation>
 <translation id="6965382102122355670">U redu</translation>
 <translation id="6985691951107243942">Jeste li sigurni da želite onemogućiti daljinske veze s hostom <ph name="HOSTNAME" />? Ako se predomislite, morat ćete se spojiti na to računalo da biste ponovo omogućili veze.</translation>
 <translation id="6998989275928107238">Prima</translation>
diff --git a/remoting/resources/remoting_strings_hu.xtb b/remoting/resources/remoting_strings_hu.xtb
index ddecec27..fc98fac 100644
--- a/remoting/resources/remoting_strings_hu.xtb
+++ b/remoting/resources/remoting_strings_hu.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Nincs mihez csatlakozni.</translation>
 <translation id="5363265567587775042">Kérje meg a felhasználót, akinek számítógépéhez megpróbál hozzáférni, hogy kattintson a „<ph name="SHARE" />” lehetőségre, és adja meg Önnek a hozzáférési kódot.</translation>
 <translation id="5379087427956679853">A Chrome távoliasztal-szolgáltatás lehetővé teszi a számítógép biztonságos megosztását az interneten keresztül. Mindkét felhasználónál futnia kell a Chrome távoliasztal-szolgáltatás alkalmazásnak, amely itt található: <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Mac típusú számítógépekhez (OS X 10.6 és újabb)</translation>
 <translation id="5397086374758643919">Chrome távoliasztal-szolgáltatási gazdagép eltávolítóprogramja</translation>
 <translation id="5419185025274123272">Nem sikerült az alkalmazás visszaállítása. Küldhet egy jelentést a programhibáról.</translation>
 <translation id="544077782045763683">A gazdagép leállt.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Időtartam</translation>
 <translation id="6939719207673461467">Billentyűzet megjelenítése/elrejtése.</translation>
 <translation id="6944854424004126054">Ablak visszaállítása</translation>
-<translation id="6962773374262604195">Windows rendszerhez (XP és újabb)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Biztosan le szeretné tiltani a távoli kapcsolatokat a(z) <ph name="HOSTNAME" /> gazdagéppel? Ha meggondolja magát, akkor azon a számítógépen kell majd újból engedélyeznie a kapcsolatokat.</translation>
 <translation id="6998989275928107238">Ide:</translation>
diff --git a/remoting/resources/remoting_strings_id.xtb b/remoting/resources/remoting_strings_id.xtb
index 0a7c2681..04010c3 100644
--- a/remoting/resources/remoting_strings_id.xtb
+++ b/remoting/resources/remoting_strings_id.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Perangkat sambungan belum disiapkan</translation>
 <translation id="5363265567587775042">Minta pengguna yang menggunakan komputer yang ingin Anda akses untuk mengeklik “<ph name="SHARE" />” dan memberikan kode akses kepada Anda.</translation>
 <translation id="5379087427956679853">Chrome Desktop Jarak Jauh memungkinkan Anda berbagi komputer melalui web dengan aman. Kedua pengguna harus menjalankan aplikasi Chrome Desktop Jarak Jauh yang dapat ditemukan di <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Untuk Mac (OS X 10.6 dan yang lebih tinggi)</translation>
 <translation id="5397086374758643919">Pencopot Pemasangan Host Chrome Desktop Jarak Jauh</translation>
 <translation id="5419185025274123272">Tidak dapat menyetel ulang aplikasi. Anda masih dapat mengirim laporan bug.</translation>
 <translation id="544077782045763683">Hosting telah dimatikan.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Durasi</translation>
 <translation id="6939719207673461467">Tunjukkan/sembunyikan keyboard.</translation>
 <translation id="6944854424004126054">Pulihkan jendela</translation>
-<translation id="6962773374262604195">Untuk Windows (XP dan yang lebih tinggi)</translation>
 <translation id="6965382102122355670">Oke</translation>
 <translation id="6985691951107243942">Yakin ingin menonaktifkan sambungan jarak jauh dengan <ph name="HOSTNAME" />? Jika Anda berubah pikiran, Anda harus mengunjungi komputer tersebut untuk mengaktifkan kembali sambungan.</translation>
 <translation id="6998989275928107238">Ke</translation>
diff --git a/remoting/resources/remoting_strings_it.xtb b/remoting/resources/remoting_strings_it.xtb
index 20f3627b..a8418f2 100644
--- a/remoting/resources/remoting_strings_it.xtb
+++ b/remoting/resources/remoting_strings_it.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Non ci sono computer a cui connettersi</translation>
 <translation id="5363265567587775042">Chiedi al proprietario del computer a cui vuoi accedere di fare clic su "<ph name="SHARE" />" e fornirti il codice di accesso.</translation>
 <translation id="5379087427956679853">Chrome Remote Desktop ti consente di condividere in modo sicuro il computer sul Web. Entrambi gli utenti devono eseguire l'app Chrome Remote Desktop, reperibile all'indirizzo <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Per Mac (OS X 10.6 e versioni successive)</translation>
 <translation id="5397086374758643919">Programma di disinstallazione host Chrome Remote Desktop</translation>
 <translation id="5419185025274123272">Impossibile ripristinare l'applicazione. Puoi comunque inviare una segnalazione di bug.</translation>
 <translation id="544077782045763683">L'host è stato chiuso.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Durata</translation>
 <translation id="6939719207673461467">Mostra/nascondi tastiera.</translation>
 <translation id="6944854424004126054">Ripristina finestra</translation>
-<translation id="6962773374262604195">Per Windows (XP e versioni successive)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Vuoi disattivare le connessioni remote a <ph name="HOSTNAME" />? Se cambi idea, dovrai utilizzare il computer in questione per riattivare le connessioni.</translation>
 <translation id="6998989275928107238">A</translation>
diff --git a/remoting/resources/remoting_strings_iw.xtb b/remoting/resources/remoting_strings_iw.xtb
index 80b3a5f..2a0b7aa 100644
--- a/remoting/resources/remoting_strings_iw.xtb
+++ b/remoting/resources/remoting_strings_iw.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">אין מחשבים שניתן להתחבר אליהם</translation>
 <translation id="5363265567587775042">בקש מבעל המחשב שאליו אתה רוצה לגשת שילחץ על “<ph name="SHARE" />” וייתן לך את קוד הגישה.</translation>
 <translation id="5379087427956679853">‏'שולחן עבודה מרוחק של Chrome' מאפשר לך לשתף את המחשב שלך דרך האינטרנט באופן מאובטח. על שני המשתמשים להפעיל את היישום 'שולחן עבודה מרוחק של Chrome', שניתן למצוא בכתובת <ph name="URL" />.</translation>
-<translation id="5394895745784982830">‏עבור Mac (OS X 10.6 ואילך)</translation>
 <translation id="5397086374758643919">‏מסיר ההתקנה של מארח שולחן העבודה המרוחק של Chrome‏</translation>
 <translation id="5419185025274123272">לא ניתן היה לאפס את היישום. תוכל עדיין לשלוח דוח באגים.</translation>
 <translation id="544077782045763683">המארח כבה.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">משך החיבור</translation>
 <translation id="6939719207673461467">הצג/הסתר מקלדת.</translation>
 <translation id="6944854424004126054">שחזר חלון</translation>
-<translation id="6962773374262604195">‏עבור Windows (XP ואילך)</translation>
 <translation id="6965382102122355670">אישור</translation>
 <translation id="6985691951107243942">האם אתה בטוח שברצונך להשבית את החיבורים המרוחקים אל <ph name="HOSTNAME" />? אם תשנה את דעתך, יהיה עליך להיכנס למחשב זה כדי להפעיל מחדש את החיבורים.</translation>
 <translation id="6998989275928107238">אל</translation>
diff --git a/remoting/resources/remoting_strings_ja.xtb b/remoting/resources/remoting_strings_ja.xtb
index d818f8b7..d1cdcf7 100644
--- a/remoting/resources/remoting_strings_ja.xtb
+++ b/remoting/resources/remoting_strings_ja.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">接続先がありません</translation>
 <translation id="5363265567587775042">接続先のパソコンのユーザーに、[<ph name="SHARE" />] をクリックしてアクセスコードを付与してもらってください。</translation>
 <translation id="5379087427956679853">Chrome リモート デスクトップを使用すると、パソコンをウェブ経由で安全に共有できます。共有するには両方のユーザーが Chrome リモート デスクトップ アプリを実行している必要があります。このアプリは <ph name="URL" /> から入手できます。</translation>
-<translation id="5394895745784982830">Mac 版(OS X 10.6 以上)</translation>
 <translation id="5397086374758643919">Chrome リモート デスクトップ ホストのアンインストーラ</translation>
 <translation id="5419185025274123272">アプリケーションをリセットできませんでした。バグレポートの送信は可能です。</translation>
 <translation id="544077782045763683">ホストはシャットダウンしました。</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">接続時間</translation>
 <translation id="6939719207673461467">キーボードを表示/非表示</translation>
 <translation id="6944854424004126054">ウィンドウを元のサイズに戻す</translation>
-<translation id="6962773374262604195">Windows 版(XP 以上)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942"><ph name="HOSTNAME" /> へのリモート接続を無効にしてもよろしいですか?元に戻す場合は、該当のパソコンにアクセスして接続を再び有効にする必要があります。</translation>
 <translation id="6998989275928107238">接続先</translation>
diff --git a/remoting/resources/remoting_strings_kn.xtb b/remoting/resources/remoting_strings_kn.xtb
index 8731367..c356cacb 100644
--- a/remoting/resources/remoting_strings_kn.xtb
+++ b/remoting/resources/remoting_strings_kn.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">ಸಂಪರ್ಕಿಸಲು ಏನೂ ಇಲ್ಲ</translation>
 <translation id="5363265567587775042">ನೀವು ಪ್ರವೇಶಿಸಬೇಕೆಂದಿರುವ ಕಂಪ್ಯೂಟರ್‌ನ ಬಳಕೆದಾರರನ್ನು “<ph name="SHARE" />” ಕ್ಲಿಕ್ ಮಾಡುವಂತೆ ಹಾಗೂ ನಿಮಗೆ ಪ್ರವೇಶ ನೀಡುವಂತೆ ಹೇಳಿ.</translation>
 <translation id="5379087427956679853">ವೆಬ್‌ನಲ್ಲಿ ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಅನ್ನು ಸುರಕ್ಷಿತವಾಗಿ ಹಂಚಿಕೊಳ್ಳಲು Chrome ರಿಮೋಟ್ ಡೆಸ್ಕ್‌ಟಾಪ್ ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. <ph name="URL" /> ರಲ್ಲಿ ಕಂಡುಬರುವ Chrome ರಿಮೋಟ್ ಡೆಸ್ಕ್‌ಟಾಪ್ ಅಪ್ಲೀಕೇಶನ್ ಅನ್ನು ಎರಡೂ ಬಳಕೆದಾರರೂ ಚಾಲನೆಯಲ್ಲಿಟ್ಟಿರಬೇಕು.</translation>
-<translation id="5394895745784982830">Mac (OS X 10.6 ಮತ್ತು ಮೇಲ್ಪಟ್ಟ) ಗೆ</translation>
 <translation id="5397086374758643919">Chrome ರಿಮೋಟ್ ಡೆಸ್ಕ್‌ಟಾಪ್ ಹೋಸ್ಟ್ ಅಸ್ಥಾಪಕ</translation>
 <translation id="5419185025274123272">ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಮರುಹೊಂದಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನೀವು ಈಗಲೂ ದೋಷ ವರದಿಯನ್ನು ಕಳುಹಿಸಬಹುದು.</translation>
 <translation id="544077782045763683">ಹೋಸ್ಟ್ ಆಫ್‌ಲೈನ್‌ ಆಗಿದ್ದಾರೆ</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">ಅವಧಿ</translation>
 <translation id="6939719207673461467">ಕೀಬೋರ್ಡ್ ತೋರಿಸು/ಮರೆಮಾಡು.</translation>
 <translation id="6944854424004126054">ವಿಂಡೋ ಮರುಸ್ಥಾಪಿಸಿ</translation>
-<translation id="6962773374262604195">Windows (XP ಮತ್ತು ಮೇಲ್ಪಟ್ಟ) ಗೆ</translation>
 <translation id="6965382102122355670">ಸರಿ</translation>
 <translation id="6985691951107243942"><ph name="HOSTNAME" /> ಗೆ ರಿಮೋಟ್ ಸಂಪರ್ಕಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ? ನಿಮ್ಮ ಆಲೋಚನೆಯನ್ನು ನೀವು ಬದಲಾಯಿಸಿಕೊಂಡಲ್ಲಿ, ಸಂಪರ್ಕಗಳನ್ನು ಮತ್ತೆ ಸಕ್ರಿಯಗೊಳಿಸಲು ನೀವು ಆ ಕಂಪ್ಯೂಟರ್‌ಗೆ ಭೇಟಿ ನೀಡುವ ಅವಶ್ಯಕತೆ ಇದೆ.</translation>
 <translation id="6998989275928107238">ಗೆ</translation>
diff --git a/remoting/resources/remoting_strings_ko.xtb b/remoting/resources/remoting_strings_ko.xtb
index 5ced878..0059dff 100644
--- a/remoting/resources/remoting_strings_ko.xtb
+++ b/remoting/resources/remoting_strings_ko.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">연결 대상이 없습니다.</translation>
 <translation id="5363265567587775042">액세스하려는 컴퓨터의 사용자에게 '<ph name="SHARE" />'를 클릭하여 액세스 코드를 달라고 요청하세요.</translation>
 <translation id="5379087427956679853">Chrome 원격 데스크톱을 사용하면 웹에서 내 컴퓨터를 안전하게 공유할 수 있습니다. 양쪽 사용자 모두 <ph name="URL" /> 페이지에 있는 Chrome 원격 데스크톱 앱을 실행해야 합니다.</translation>
-<translation id="5394895745784982830">Mac용(OS X 10.6 이상)</translation>
 <translation id="5397086374758643919">Chrome 원격 데스크톱 호스트 제거 프로그램</translation>
 <translation id="5419185025274123272">애플리케이션을 재설정할 수 없지만 버그 보고서를 보낼 수는 있습니다.</translation>
 <translation id="544077782045763683">호스트가 꺼져 있습니다.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">기간</translation>
 <translation id="6939719207673461467">키보드 표시/숨기기</translation>
 <translation id="6944854424004126054">복원 창</translation>
-<translation id="6962773374262604195">Windows용(XP 이상)</translation>
 <translation id="6965382102122355670">확인</translation>
 <translation id="6985691951107243942"><ph name="HOSTNAME" />와(과)의 원격 연결을 사용중지하시겠습니까? 생각이 바뀌면 해당 컴퓨터에서 연결을 다시 사용하도록 설정해야 합니다.</translation>
 <translation id="6998989275928107238">호스트</translation>
diff --git a/remoting/resources/remoting_strings_lt.xtb b/remoting/resources/remoting_strings_lt.xtb
index 35a5ea5..d830fff 100644
--- a/remoting/resources/remoting_strings_lt.xtb
+++ b/remoting/resources/remoting_strings_lt.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Nėra prie ko prisijungti</translation>
 <translation id="5363265567587775042">Paprašykite naudotojo, kurio kompiuterį norite pasiekti, spustelėti „<ph name="SHARE" />“ ir suteikti pasiekiamumo kodą.</translation>
 <translation id="5379087427956679853">Naudodami „Chrome“ nuotolinį kompiuterio valdymą, galite saugiai bendrinti kompiuterį žiniatinklyje. Abu naudotojai turi paleisti „Chrome“ nuotolinio kompiuterio valdymo programą, kurią galima rasti adresu <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Skirta „Mac“ (10.6 ir naujesnės versijos „OS X“)</translation>
 <translation id="5397086374758643919">„Chrome“ nuotolinio kompiuterio valdymo prieglobos pašalinimo priemonė</translation>
 <translation id="5419185025274123272">Nepavyko iš naujo nustatyti programos. Vis tiek galite išsiųsti rikto ataskaitą.</translation>
 <translation id="544077782045763683">Priegloba išjungta.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Trukmė</translation>
 <translation id="6939719207673461467">Rodyti / slėpti klaviatūrą.</translation>
 <translation id="6944854424004126054">Atkurti langą</translation>
-<translation id="6962773374262604195">Skirta „Windows“ (XP ir naujesnės versijos)</translation>
 <translation id="6965382102122355670">Gerai</translation>
 <translation id="6985691951107243942">Ar tikrai norite neleisti nuotolinio ryšio su „<ph name="HOSTNAME" />“? Jei apsigalvosite, turėsite iš naujo įgalinti ryšį tame kompiuteryje.</translation>
 <translation id="6998989275928107238">Ryšys užmezgamas su</translation>
diff --git a/remoting/resources/remoting_strings_lv.xtb b/remoting/resources/remoting_strings_lv.xtb
index 0fb29af..c136ce72 100644
--- a/remoting/resources/remoting_strings_lv.xtb
+++ b/remoting/resources/remoting_strings_lv.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Nav neviena datora, ar kuru izveidot savienojumu.</translation>
 <translation id="5363265567587775042">Palūdziet lietotājam, kura datoru vēlaties lietot, noklikšķināt uz “<ph name="SHARE" />” un piešķirt jums piekļuves kodu.</translation>
 <translation id="5379087427956679853">Izmantojot Chrome attālo darbvirsmu, varat droši koplietot savu datoru tīmeklī. Abiem lietotājiem ir jāizmanto lietotne Chrome attālā darbvirsma, kas ir pieejama vietnē <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Operētājsistēmai Mac (OS X 10.6 un jaunākas versijas)</translation>
 <translation id="5397086374758643919">Chrome attālās darbvirsmas saimniekdatora atinstalēšanas programma</translation>
 <translation id="5419185025274123272">Nevarēja atiestatīt lietojumprogrammu. Jūs joprojām varat nosūtīt kļūdu pārskatu.</translation>
 <translation id="544077782045763683">Saimniekdators tika izslēgts.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Ilgums</translation>
 <translation id="6939719207673461467">Rādīt/slēpt tastatūru</translation>
 <translation id="6944854424004126054">Atjaunot logu</translation>
-<translation id="6962773374262604195">Operētājsistēmai Windows (XP un jaunākas versijas)</translation>
 <translation id="6965382102122355670">Labi</translation>
 <translation id="6985691951107243942">Vai tiešām vēlaties atspējot attālos savienojumus ar saimniekdatoru <ph name="HOSTNAME" />? Ja pārdomāsiet, savienojumus ar šo datoru varēsiet iespējot tikai klātienē.</translation>
 <translation id="6998989275928107238">Ar</translation>
diff --git a/remoting/resources/remoting_strings_ml.xtb b/remoting/resources/remoting_strings_ml.xtb
index 9b893b2..0188ca20 100644
--- a/remoting/resources/remoting_strings_ml.xtb
+++ b/remoting/resources/remoting_strings_ml.xtb
@@ -177,7 +177,6 @@
 <translation id="533625276787323658">ഇതിലേക്ക് കണക്‌റ്റുചെയ്യാൻ ഒന്നുമില്ല</translation>
 <translation id="5363265567587775042">“<ph name="SHARE" />” ക്ലിക്കുചെയ്‌ത് ആക്‌സസ്സ് കോഡ് നൽകാൻ ആരുടെ കമ്പ്യൂട്ടറാണ് നിങ്ങൾ ആക്‌സസ്സുചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നതെന്ന് ഉപയോക്താവിനോട് ചോദിക്കുക.</translation>
 <translation id="5379087427956679853">Chrome വിദൂര ഡെസ്‌ക്‌ടോപ്പ് നിങ്ങളുടെ കമ്പ്യൂട്ടർ വെബിലുടനീളം സുരക്ഷിതമായി പങ്കിടാൻ നിങ്ങളെ അനുവദിക്കുന്നു. രണ്ട് ഉപയോക്താക്കളും <ph name="URL" /> എന്നതിൽ കണ്ടെത്താനാകുന്ന Chrome വിദൂര ഡെസ്‌ക്‌ടോപ്പ് അപ്ലിക്കേഷൻ പ്രവർത്തിപ്പിക്കേണ്ടതുണ്ട്.</translation>
-<translation id="5394895745784982830">Mac (OS X 10.6-ഉം അതിനുശേഷമുള്ളതും)</translation>
 <translation id="5397086374758643919">Chrome വിദൂര ഡെസ്‌ക്ടോപ്പ് ഹോസ്റ്റ് അൺഇൻസ്റ്റാളർ</translation>
 <translation id="5419185025274123272">അപ്ലിക്കേഷൻ റീസെറ്റുചെയ്യാനായില്ല. തുടർന്നും ഒരു ബഗ് റിപ്പോർട്ട് നിങ്ങൾക്ക് അയയ്‌ക്കാനാകും.</translation>
 <translation id="544077782045763683">ഹോസ്റ്റ് ഷട്ട്‌ ഡൗൺ ചെയ്‌തു.</translation>
@@ -231,7 +230,6 @@
 <translation id="6930242544192836755">സമയ ദൈർഘ്യം</translation>
 <translation id="6939719207673461467">കീബോർഡ് ദൃശ്യമാക്കുക/മറയ്‌ക്കുക.</translation>
 <translation id="6944854424004126054">വിൻഡോ പുനഃസ്ഥാപിക്കുക</translation>
-<translation id="6962773374262604195">Windows (XP-ഉം അതിനുശേഷമുള്ളതും)</translation>
 <translation id="6965382102122355670">ശരി</translation>
 <translation id="6985691951107243942"><ph name="HOSTNAME" /> എന്നതിലേക്കുള്ള വിദൂര കണക്ഷനുകൾ അപ്രാപ്‌തമാക്കാൻ നിങ്ങൾ താൽപ്പര്യപ്പെടുന്നുവെന്ന് തീർച്ചയാണോ? നിങ്ങൾ മനസ്സ് മാറ്റുകയാണെങ്കിൽ, കണക്ഷനുകൾ പുനഃപ്രാപ്‌തമാക്കുന്നതിന് ആ കമ്പ്യൂട്ടർ സന്ദർശിക്കേണ്ടതുണ്ട്.</translation>
 <translation id="6998989275928107238">സ്വീകർത്താവ്</translation>
diff --git a/remoting/resources/remoting_strings_mr.xtb b/remoting/resources/remoting_strings_mr.xtb
index 5052621..6a25f42 100644
--- a/remoting/resources/remoting_strings_mr.xtb
+++ b/remoting/resources/remoting_strings_mr.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">कनेक्ट करण्यासाठी काहीही नाही</translation>
 <translation id="5363265567587775042">आपण ज्या वापरकर्त्याच्या संगणकामध्‍ये प्रवेश करू इच्छिता त्यास “<ph name="SHARE" />” क्लिक करण्‍यास आणि आपल्‍याला प्रवेश कोड देण्‍यास सांगा.</translation>
 <translation id="5379087427956679853">Chrome दूरस्थ डेस्कटॉप आपल्याला वेबवर आपला संगणक सुरक्षितपणे सामायिक करण्‍याची अनुमती देतो. दोन्ही वापरकर्त्यांनी Chrome दूरस्थ डेस्कटॉप अ‍ॅप चालवत असणे आवश्‍यक आहे, जो <ph name="URL" /> येथे सापडू शकतो.</translation>
-<translation id="5394895745784982830">Mac (OS X 10.6 आणि त्यानंतरचे) साठी</translation>
 <translation id="5397086374758643919">Chrome दूरस्थ डेस्कटॉप होस्ट विस्थापनकर्ता</translation>
 <translation id="5419185025274123272">अनुप्रयोग रीसेट करणे शक्य झाले नाही. आपण तरीही एक दोष अहवाल पाठवू शकता.</translation>
 <translation id="544077782045763683">होस्टने बंद केले आहे.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">कालावधी</translation>
 <translation id="6939719207673461467">कीबोर्ड दर्शवा/लपवा.</translation>
 <translation id="6944854424004126054">विंडो पुनर्संचयित करा</translation>
-<translation id="6962773374262604195">Windows (XP आणि त्यानंतरचे) साठी</translation>
 <translation id="6965382102122355670">ठीक आहे</translation>
 <translation id="6985691951107243942">आपल्याला खात्री आहे की <ph name="HOSTNAME" /> ची दूरस्थ कनेक्शन आपण अक्षम करू इच्छिता? आपण आपला विचार बदलल्यास, आपल्याला कनेक्शन पुन्हा-सक्षम करण्‍यासाठी त्या संगणकाला भेट देणे आवश्यक असेल.</translation>
 <translation id="6998989275928107238">प्रति</translation>
diff --git a/remoting/resources/remoting_strings_ms.xtb b/remoting/resources/remoting_strings_ms.xtb
index 47c521b..a11080b 100644
--- a/remoting/resources/remoting_strings_ms.xtb
+++ b/remoting/resources/remoting_strings_ms.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Tiada peranti untuk disambungkan</translation>
 <translation id="5363265567587775042">Minta pemilik komputer yang ingin anda gunakan itu supaya mengklik “<ph name="SHARE" />” dan memberi anda kod aksesnya.</translation>
 <translation id="5379087427956679853">Desktop Jauh Chrome membolehkan anda berkongsi komputer anda dengan selamat melalui Web. Kedua-dua pengguna perlu menjalankan apl Desktop Jauh Chrome, yang boleh didapati di <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Untuk Mac (OS X 10.6 dan ke atas)</translation>
 <translation id="5397086374758643919">Penyahpasang Hos Desktop Jauh Chrome</translation>
 <translation id="5419185025274123272">Tidak dapat menetapkan semula aplikasi. Anda masih boleh menghantar laporan pepijat.</translation>
 <translation id="544077782045763683">Hos telah ditutup.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Tempoh</translation>
 <translation id="6939719207673461467">Paparkan/Sembunyikan papan kekunci.</translation>
 <translation id="6944854424004126054">Pulihkan tetingkap</translation>
-<translation id="6962773374262604195">Untuk Windows (XP dan ke atas)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Adakah anda pasti mahu melumpuhkan sambungan jauh ke <ph name="HOSTNAME" />? Jika anda berubah fikiran, anda perlu pergi ke komputer tersebut untuk mendayakan semula sambungan.</translation>
 <translation id="6998989275928107238">Kepada</translation>
diff --git a/remoting/resources/remoting_strings_nl.xtb b/remoting/resources/remoting_strings_nl.xtb
index ee916bb..f7d8e4ed 100644
--- a/remoting/resources/remoting_strings_nl.xtb
+++ b/remoting/resources/remoting_strings_nl.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Er is geen computer om verbinding mee te maken</translation>
 <translation id="5363265567587775042">Vraag de gebruiker tot wiens computer je toegang wilt hebben, op <ph name="SHARE" /> te klikken en je de toegangscode te geven.</translation>
 <translation id="5379087427956679853">Met Chrome Remote Desktop kun je je computer veilig delen via internet. Beide gebruikers moeten hiervoor de app Chrome Remote Desktop uitvoeren, die beschikbaar is op <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Voor Mac (OS X 10.6 en hoger)</translation>
 <translation id="5397086374758643919">Verwijderprogramma voor Chrome Remote Desktop-host</translation>
 <translation id="5419185025274123272">Kan de app niet opnieuw instellen. Je kunt nog steeds een foutmelding verzenden.</translation>
 <translation id="544077782045763683">Host is afgesloten.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Duur</translation>
 <translation id="6939719207673461467">Toetsenbord weergeven/verbergen.</translation>
 <translation id="6944854424004126054">Venster herstellen</translation>
-<translation id="6962773374262604195">Voor Windows (XP en hoger)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Weet je zeker dat je externe verbindingen met <ph name="HOSTNAME" /> wilt uitschakelen? Als je van gedachten verandert, moet je naar die computer gaan om de verbindingen weer in te schakelen.</translation>
 <translation id="6998989275928107238">Aan</translation>
diff --git a/remoting/resources/remoting_strings_no.xtb b/remoting/resources/remoting_strings_no.xtb
index 466dbb1..91021b3 100644
--- a/remoting/resources/remoting_strings_no.xtb
+++ b/remoting/resources/remoting_strings_no.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Det finnes ingenting å koble til</translation>
 <translation id="5363265567587775042">Be brukeren av datamaskinen du vil ha tilgang til, om å klikke på «<ph name="SHARE" />» og gi deg tilgangskoden.</translation>
 <translation id="5379087427956679853">Med Chrome Eksternt skrivebord kan du trygt dele datamaskinen din på nettet. Begge brukerne må installere Chrome Eksternt skrivebord-appen, som er å finne på <ph name="URL" /></translation>
-<translation id="5394895745784982830">For Mac (OS X 10.6 og høyere)</translation>
 <translation id="5397086374758643919">Avinstalleringsprogram for Chrome Eksternt skrivebord-vert</translation>
 <translation id="5419185025274123272">Programmet kunne ikke tilbakestilles. Du kan likevel sende inn en feilrapport.</translation>
 <translation id="544077782045763683">Verten har slått seg av.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Varighet</translation>
 <translation id="6939719207673461467">Vis/skjul tastaturet.</translation>
 <translation id="6944854424004126054">Gjenopprett vinduet</translation>
-<translation id="6962773374262604195">For Windows (XP og nyere)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Er du sikker på at du vil deaktivere eksterne tilkoblinger til <ph name="HOSTNAME" />? Hvis du ombestemmer deg, må du tilbake til datamaskinen for å gjenopprette tilkoblingene.</translation>
 <translation id="6998989275928107238">Til</translation>
diff --git a/remoting/resources/remoting_strings_pl.xtb b/remoting/resources/remoting_strings_pl.xtb
index d0cb8e52..37178f6 100644
--- a/remoting/resources/remoting_strings_pl.xtb
+++ b/remoting/resources/remoting_strings_pl.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Brak komputerów zdalnych</translation>
 <translation id="5363265567587775042">Poproś użytkownika, z którego komputera chcesz korzystać, by kliknął „<ph name="SHARE" />” i udostępnił Ci kod dostępu.</translation>
 <translation id="5379087427956679853">Pulpit zdalny Chrome pozwala na bezpieczne udostępnianie komputera przez internet. Obaj użytkownicy muszą mieć uruchomioną aplikację Pulpit zdalny Chrome, którą można znaleźć na <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Mac (OS X 10.6 lub nowszy)</translation>
 <translation id="5397086374758643919">Program do odinstalowywania hosta Pulpitu zdalnego Chrome</translation>
 <translation id="5419185025274123272">Nie można zresetować aplikacji. Wciąż możesz przesłać zgłoszenie błędu.</translation>
 <translation id="544077782045763683">Host został wyłączony.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Czas trwania</translation>
 <translation id="6939719207673461467">Pokaż/ukryj klawiaturę.</translation>
 <translation id="6944854424004126054">Przywróć okno</translation>
-<translation id="6962773374262604195">Windows (XP lub nowszy)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Na pewno chcesz wyłączyć połączenia zdalne z: <ph name="HOSTNAME" />? Jeśli zmienisz zdanie, połączenia będzie trzeba włączyć na tamtym komputerze.</translation>
 <translation id="6998989275928107238">Do</translation>
diff --git a/remoting/resources/remoting_strings_pt-BR.xtb b/remoting/resources/remoting_strings_pt-BR.xtb
index 7c1cb8f..1bfbbb2 100644
--- a/remoting/resources/remoting_strings_pt-BR.xtb
+++ b/remoting/resources/remoting_strings_pt-BR.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Não há nenhum computador para conexão</translation>
 <translation id="5363265567587775042">Peça ao usuário do computador que você deseja acessar que clique em "<ph name="SHARE" />" e forneça o código de acesso para você.</translation>
 <translation id="5379087427956679853">A Área de trabalho remota do Google Chrome permite que você compartilhe seu computador com segurança através da Web. Para isso, é preciso que os usuários executem simultaneamente o aplicativo da Área de trabalho remota do Google Chrome, disponível em <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Para Mac (OS X 10.6 e acima)</translation>
 <translation id="5397086374758643919">Desinstalador do host da Área de trabalho remota do Google Chrome</translation>
 <translation id="5419185025274123272">Não foi possível redefinir o aplicativo. Você ainda pode enviar um relatório de bug.</translation>
 <translation id="544077782045763683">O host foi encerrado.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Duração</translation>
 <translation id="6939719207673461467">Mostrar/ocultar teclado</translation>
 <translation id="6944854424004126054">Restaurar janela</translation>
-<translation id="6962773374262604195">Para Windows (XP e acima)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Tem certeza de que deseja desativar conexões remotas para <ph name="HOSTNAME" />? Se mudar de idéia, precisará visitar este computador para reativar as conexões.</translation>
 <translation id="6998989275928107238">Para</translation>
diff --git a/remoting/resources/remoting_strings_pt-PT.xtb b/remoting/resources/remoting_strings_pt-PT.xtb
index 23cee16..9ce97e31d 100644
--- a/remoting/resources/remoting_strings_pt-PT.xtb
+++ b/remoting/resources/remoting_strings_pt-PT.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Não há computadores aos quais estabelecer ligação</translation>
 <translation id="5363265567587775042">Solicite ao utilizador a cujo computador pretende aceder para clicar em "<ph name="SHARE" />" e dar-lhe o código de acesso.</translation>
 <translation id="5379087427956679853">O Ambiente de Trabalho Remoto do Chrome permite partilhar o computador de forma segura através da Web. Ambos os utilizadores devem ter em execução a aplicação Ambiente de Trabalho Remoto do Chrome, que pode ser encontrada em <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Para Mac (OS X 10.6 e superior)</translation>
 <translation id="5397086374758643919">Desinstalador do Anfitrião do Ambiente de Trabalho Remoto do Chrome</translation>
 <translation id="5419185025274123272">Não foi possível repor a aplicação. Ainda pode enviar um relatório de erros.</translation>
 <translation id="544077782045763683">O anfitrião foi desligado.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Duração</translation>
 <translation id="6939719207673461467">Mostrar/ocultar teclado.</translation>
 <translation id="6944854424004126054">Restaurar janela</translation>
-<translation id="6962773374262604195">Para Windows (XP e superior)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Tem a certeza de que pretende desativar as ligações remotas a <ph name="HOSTNAME" />? Se mudar de ideias, será necessário aceder a esse computador e voltar a ativar as ligações.</translation>
 <translation id="6998989275928107238">Para</translation>
diff --git a/remoting/resources/remoting_strings_ro.xtb b/remoting/resources/remoting_strings_ro.xtb
index 0df6914..bead7d8 100644
--- a/remoting/resources/remoting_strings_ro.xtb
+++ b/remoting/resources/remoting_strings_ro.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Niciun dispozitiv la care te poți conecta</translation>
 <translation id="5363265567587775042">Roagă utilizatorul al cărui computer dorești să îl accesezi să dea clic pe „<ph name="SHARE" />” și să îți trimită codul de acces.</translation>
 <translation id="5379087427956679853">Cu aplicația Desktop la distanță Chrome, puteți permite accesul în siguranță la computerul dvs. pe web. Ambii utilizatori trebuie să ruleze aplicația Desktop la distanță Chrome, care poate fi găsită la <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Pentru Mac (OS X 10.6 și versiuni ulterioare)</translation>
 <translation id="5397086374758643919">Program de dezinstalare a gazdei pentru Desktop la distanță Chrome</translation>
 <translation id="5419185025274123272">Aplicația nu a putut fi resetată. Poți totuși să trimiți un raport de eroare.</translation>
 <translation id="544077782045763683">Gazda a fost închisă.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Durată</translation>
 <translation id="6939719207673461467">Afișați/Ascundeți tastatura.</translation>
 <translation id="6944854424004126054">Restabiliți fereastra</translation>
-<translation id="6962773374262604195">Pentru Windows (XP și versiuni ulterioare)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Sigur doriți să dezactivați conexiunile la distanță la <ph name="HOSTNAME" />? Dacă vă răzgândiți, va trebui să accesați computerul respectiv pentru a reactiva conexiunile.</translation>
 <translation id="6998989275928107238">La</translation>
diff --git a/remoting/resources/remoting_strings_ru.xtb b/remoting/resources/remoting_strings_ru.xtb
index be94208..781d8516 100644
--- a/remoting/resources/remoting_strings_ru.xtb
+++ b/remoting/resources/remoting_strings_ru.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Устройств для подключения нет.</translation>
 <translation id="5363265567587775042">Владелец компьютера, к которому вы хотите подключиться, должен нажать "<ph name="SHARE" />" и предоставить вам код доступа.</translation>
 <translation id="5379087427956679853">Удаленный рабочий стол Chrome обеспечит безопасный доступ к компьютеру через Интернет. Приложение должно быть установлено на обоих компьютерах: вашем и удаленном. Загрузить его можно на странице <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Для Mac (OS X 10.6 и выше)</translation>
 <translation id="5397086374758643919">Приложение Chrome Remote Desktop Host Uninstaller</translation>
 <translation id="5419185025274123272">Не удалось сбросить настройки приложения. Вы можете отправить сообщение об ошибке.</translation>
 <translation id="544077782045763683">Хост отключен.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Продолжительность</translation>
 <translation id="6939719207673461467">Показать/скрыть клавиатуру</translation>
 <translation id="6944854424004126054">Восстановить окно</translation>
-<translation id="6962773374262604195">Для Windows (XP и выше)</translation>
 <translation id="6965382102122355670">ОК</translation>
 <translation id="6985691951107243942">Заблокировать подключения к <ph name="HOSTNAME" />? Восстановить их можно будет только на соответствующем компьютере.</translation>
 <translation id="6998989275928107238">Хост</translation>
diff --git a/remoting/resources/remoting_strings_sk.xtb b/remoting/resources/remoting_strings_sk.xtb
index b8decfb5..8317d46 100644
--- a/remoting/resources/remoting_strings_sk.xtb
+++ b/remoting/resources/remoting_strings_sk.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Na pripojenie nie sú k dispozícii žiadne zariadenia</translation>
 <translation id="5363265567587775042">Požiadajte používateľa s počítačom, do ktorého chcete získať prístup, aby klikol na tlačidlo <ph name="SHARE" /> a poskytol vám prístupový kód.</translation>
 <translation id="5379087427956679853">Vzdialená plocha Chrome vám umožňuje bezpečne zdieľať váš počítač cez internet. Obaja používatelia musia mať spustenú aplikáciu Vzdialená plocha Chrome, ktorú nájdete na adrese <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Pre počítače Mac (OS X 10.6 a novší)</translation>
 <translation id="5397086374758643919">Nástroj na odinštalovanie hostiteľa Vzdialenej plochy Chrome</translation>
 <translation id="5419185025274123272">Aplikáciu sa nepodarilo resetovať. Stále však môžete odoslať hlásenie o chybách.</translation>
 <translation id="544077782045763683">Hostiteľ je vypnutý</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Trvanie</translation>
 <translation id="6939719207673461467">Zobraziť/skryť klávesnicu</translation>
 <translation id="6944854424004126054">Obnovenie okna</translation>
-<translation id="6962773374262604195">Pre systém Windows (XP a novší)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Naozaj chcete zakázať vzdialené pripojenia k počítaču <ph name="HOSTNAME" />? Ak zmeníte názor, pripojenie budete musieť znova povoliť priamo z uvedeného počítača.</translation>
 <translation id="6998989275928107238">Komu</translation>
diff --git a/remoting/resources/remoting_strings_sl.xtb b/remoting/resources/remoting_strings_sl.xtb
index 55d9d39..617d19a 100644
--- a/remoting/resources/remoting_strings_sl.xtb
+++ b/remoting/resources/remoting_strings_sl.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Ni naprav za povezovanje</translation>
 <translation id="5363265567587775042">Uporabnika, do čigar računalnika želite dostopati, prosite, da klikne »<ph name="SHARE" />« in vam da kodo za dostop.</translation>
 <translation id="5379087427956679853">Oddaljeno namizje za Chrome omogoča varno skupno rabo računalnika v spletu. Oba uporabnika morata uporabljati aplikacijo Oddaljeno namizje za Chrome, ki je na voljo na <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Za Mac OS (OS X 10.6 in novejši)</translation>
 <translation id="5397086374758643919">Odstranitveni program gostitelja za Oddaljeno namizje za Chrome</translation>
 <translation id="5419185025274123272">Aplikacije ni bilo mogoče ponastaviti. Kljub temu lahko pošljete poročilo o napakah.</translation>
 <translation id="544077782045763683">Gostitelj se je zaustavil.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Trajanje</translation>
 <translation id="6939719207673461467">Pokaži/skrij tipkovnico.</translation>
 <translation id="6944854424004126054">Obnovi okno</translation>
-<translation id="6962773374262604195">Za sistem Windows (XP in novejše različice)</translation>
 <translation id="6965382102122355670">V redu</translation>
 <translation id="6985691951107243942">Ali ste prepričani, da želite onemogočiti oddaljene povezave z gostiteljem <ph name="HOSTNAME" />? Če si premislite, boste morali v tistem računalniku znova omogočiti povezave.</translation>
 <translation id="6998989275928107238">Za</translation>
diff --git a/remoting/resources/remoting_strings_sr.xtb b/remoting/resources/remoting_strings_sr.xtb
index 4d1e6644..eeead179 100644
--- a/remoting/resources/remoting_strings_sr.xtb
+++ b/remoting/resources/remoting_strings_sr.xtb
@@ -176,7 +176,6 @@
 <translation id="533625276787323658">Нема рачунара за повезивање</translation>
 <translation id="5363265567587775042">Затражите од корисника чијем рачунару желите да приступите да кликне на „<ph name="SHARE" />“ и да вам да приступни кôд.</translation>
 <translation id="5379087427956679853">Chrome удаљени рачунар вам омогућава да безбедно делите рачунар на вебу. Потребно је да оба корисника покрену апликацију Chrome удаљени рачунар, која може да се пронађе на <ph name="URL" />.</translation>
-<translation id="5394895745784982830">За Mac (OS X 10.6 и новији)</translation>
 <translation id="5397086374758643919">Алатка за деинсталацију хоста за Chrome удаљени рачунар</translation>
 <translation id="5419185025274123272">Ресетовање апликације није успело. И даље можете да пошаљете извештај о грешци.</translation>
 <translation id="544077782045763683">Хост се искључио.</translation>
@@ -230,7 +229,6 @@
 <translation id="6930242544192836755">Трајање</translation>
 <translation id="6939719207673461467">Прикажи/сакриј тастатуру.</translation>
 <translation id="6944854424004126054">Вратите прозор</translation>
-<translation id="6962773374262604195">За Windows (XP и новији)</translation>
 <translation id="6965382102122355670">Потврди</translation>
 <translation id="6985691951107243942">Желите ли стварно да онемогућите даљинско повезивање са хостом <ph name="HOSTNAME" />? Ако се предомислите, треба да посетите тај рачунар да бисте поново омогућили везе.</translation>
 <translation id="6998989275928107238">Коме</translation>
diff --git a/remoting/resources/remoting_strings_sv.xtb b/remoting/resources/remoting_strings_sv.xtb
index 7b45e44..76cd1c5 100644
--- a/remoting/resources/remoting_strings_sv.xtb
+++ b/remoting/resources/remoting_strings_sv.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Det finns inget att ansluta till</translation>
 <translation id="5363265567587775042">Be användaren vars dator du vill använda att klicka på <ph name="SHARE" /> och ge dig åtkomstkoden.</translation>
 <translation id="5379087427956679853">Med Chrome Remote Desktop kan du dela din dator via internet på ett säkert sätt. Båda användarna måste köra appen Chrome Remote Desktop som du hittar på <ph name="URL" />.</translation>
-<translation id="5394895745784982830">För Mac (OS X 10.6 eller senare)</translation>
 <translation id="5397086374758643919">Chrome Remote Desktop Host Uninstaller</translation>
 <translation id="5419185025274123272">Det gick inte att återställa programmet. Du kan fortfarande skicka en felrapport.</translation>
 <translation id="544077782045763683">Värdenheten har stängts av.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Varaktighet</translation>
 <translation id="6939719207673461467">Visa/dölj tangentbordet.</translation>
 <translation id="6944854424004126054">Återställ fönstret</translation>
-<translation id="6962773374262604195">För Windows (XP eller senare)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Är du säker på att du vill inaktivera fjärranslutningar till <ph name="HOSTNAME" />? Om du ångrar dig måste du besöka datorn för att kunna aktivera anslutningar igen.</translation>
 <translation id="6998989275928107238">Till</translation>
diff --git a/remoting/resources/remoting_strings_sw.xtb b/remoting/resources/remoting_strings_sw.xtb
index 3d6fd9d..7486b76 100644
--- a/remoting/resources/remoting_strings_sw.xtb
+++ b/remoting/resources/remoting_strings_sw.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Hakuna kompyuta ya kuunganishwa</translation>
 <translation id="5363265567587775042">Mwombe mtumiaji wa kompyuta unayotaka kufikia abofye “<ph name="SHARE" />” na akupe nambari ya kuthibitisha ya idhini ya kufikia.</translation>
 <translation id="5379087427956679853">Eneo-kazi la Mbali la Chrome hukuruhusu kushiriki kompyuta yako kwa usalama kwenye Wavuti. Watumiaji wote wawili lazima wawe na programu ya Eneo-kazi la Mbali la Chrome, inayoweza kupatikana katika <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Kwa Mac (OS X 10.6 na matoleo ya baadaye)</translation>
 <translation id="5397086374758643919">Kiondoa Seva Pangishi ya Kompyuta ya Mbali cha Chrome</translation>
 <translation id="5419185025274123272">Haikuweza kuweka upya programu. Bado unaweza kutuma ripoti ya hitilafu.</translation>
 <translation id="544077782045763683">Pangishi imezima.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Muda</translation>
 <translation id="6939719207673461467">Onyesha/ficha kibodi.</translation>
 <translation id="6944854424004126054">Rejesha dirisha</translation>
-<translation id="6962773374262604195">Kwa Windows (XP na matoleo ya baadaye)</translation>
 <translation id="6965382102122355670">Sawa</translation>
 <translation id="6985691951107243942">Una uhakika kuwa unataka kufunga miunganisho ya mbali kwa <ph name="HOSTNAME" />? Ukibadilisha nia, utahitajika kutembelea kompyuta hiyo ili uwashe miunganisho upya.</translation>
 <translation id="6998989275928107238">Kwa</translation>
diff --git a/remoting/resources/remoting_strings_ta.xtb b/remoting/resources/remoting_strings_ta.xtb
index 3ad8df6..2c7c6ef 100644
--- a/remoting/resources/remoting_strings_ta.xtb
+++ b/remoting/resources/remoting_strings_ta.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">இணைப்பதற்கு எதுவுமில்லை</translation>
 <translation id="5363265567587775042">நீங்கள் அணுக விரும்பும் கணினியின் பயனரிடம், “<ph name="SHARE" />”ஐக் கிளிக் செய்து அணுகல் குறியீட்டை அளிக்கும்படி கேட்கவும்.</translation>
 <translation id="5379087427956679853">இணையத்தில் உங்கள் கணினியைப் பாதுகாப்பாக பகிர Chrome தொலைநிலை டெஸ்க்டாப் அனுமதிக்கிறது. இரு பயனர்களும் Chrome தொலைநிலை டெஸ்க்டாப் பயன்பாட்டில் இயக்க வேண்டும், அதை <ph name="URL" /> இல் காணலாம்.</translation>
-<translation id="5394895745784982830">Mac (OS X 10.6 மற்றும் அதற்குப் பிந்தைய பதிப்பு) இல் நிறுவ</translation>
 <translation id="5397086374758643919">Chrome தொலைநிலை டெஸ்க்டாப் புரவன் நிறுவல் நீக்கி</translation>
 <translation id="5419185025274123272">பயன்பாட்டை மீட்டமைக்க முடியவில்லை. தொடர்ந்து நீங்கள் பிழைத் தொடர்பான புகாரை அனுப்பலாம்.</translation>
 <translation id="544077782045763683">ஹோஸ்ட் இயங்கவில்லை.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">மொத்த நேரம்</translation>
 <translation id="6939719207673461467">விசைப்பலகையைக் காட்டு/மறை.</translation>
 <translation id="6944854424004126054">சாளரத்தை மீட்டெடு</translation>
-<translation id="6962773374262604195">Windows (XP மற்றும் அதற்குப் பிந்தைய பதிப்பு) இல் நிறுவ</translation>
 <translation id="6965382102122355670">சரி</translation>
 <translation id="6985691951107243942"><ph name="HOSTNAME" /> க்கான தொலைநிலை இணைப்புகளை நிச்சயமாக முடக்க வேண்டுமா? மனம் மாறிவிட்டால், இணைப்புகளை மீண்டும் செயலாக்க, நீங்கள் அந்தக் கணினியை மீண்டும் பார்வையிட வேண்டியிருக்கும்.</translation>
 <translation id="6998989275928107238">பெறுநர்</translation>
diff --git a/remoting/resources/remoting_strings_te.xtb b/remoting/resources/remoting_strings_te.xtb
index e705612..ecc4643 100644
--- a/remoting/resources/remoting_strings_te.xtb
+++ b/remoting/resources/remoting_strings_te.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">కనెక్ట్ చేయడానికి ఏదీ లేదు</translation>
 <translation id="5363265567587775042">మీరు ప్రాప్యత చేయాలని కోరుకునే కంప్యూటర్‌లో “<ph name="SHARE" />” క్లిక్ చేసి, మీకు ప్రాప్యత కోడ్ ఇవ్వమని వినియోగదారును అడగండి.</translation>
 <translation id="5379087427956679853">Chrome రిమోట్ డెస్క్‌టాప్ వెబ్‌లో మీ కంప్యూటర్‌ను సురక్షితంగా భాగస్వామ్యం చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. వినియోగదారులు ఇద్దరూ తప్పనిసరిగా <ph name="URL" />లో కనుగొనబడే Chrome రిమోట్ డెస్క్‌టాప్ అనువర్తనాన్ని అమలు చేస్తుండాలి.</translation>
-<translation id="5394895745784982830">Mac కోసం (OS X 10.6 మరియు అంతకంటే అధిక సంస్కరణ)</translation>
 <translation id="5397086374758643919">Chrome రిమోట్ డెస్క్‌టాప్ హోస్ట్ అన్‌ఇన్‌స్టాలర్</translation>
 <translation id="5419185025274123272">అనువర్తనాన్ని రీసెట్ చేయలేకపోయింది. మీరు ఇప్పటికీ బగ్ నివేదికను పంపవచ్చు.</translation>
 <translation id="544077782045763683">హోస్ట్ షట్ డౌన్ అయ్యింది.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">వ్యవధి</translation>
 <translation id="6939719207673461467">కీబోర్డ్‌ని చూపు/దాచు.</translation>
 <translation id="6944854424004126054">పునరుద్ధరణ విండో</translation>
-<translation id="6962773374262604195">Windows కోసం (XP మరియు అంతకంటే అధిక సంస్కరణ)</translation>
 <translation id="6965382102122355670">సరే</translation>
 <translation id="6985691951107243942">మీరు <ph name="HOSTNAME" />కు రిమోట్ కనెక్షన్‌లను ఖచ్చితంగా నిలిపివేయాలనుకుంటున్నారా? మీరు మీ మనస్సు మార్చుకుంటే, కనెక్షన్‌లను పునఃప్రారంభించడానికి మీరు ఆ కంప్యూటర్‌ను సందర్శించాలి.</translation>
 <translation id="6998989275928107238">స్వీకర్త</translation>
diff --git a/remoting/resources/remoting_strings_th.xtb b/remoting/resources/remoting_strings_th.xtb
index 4d1339c4..ea45351 100644
--- a/remoting/resources/remoting_strings_th.xtb
+++ b/remoting/resources/remoting_strings_th.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">ไม่มีปลายทางให้เชื่อมต่อ</translation>
 <translation id="5363265567587775042">ขอให้ผู้ใช้ที่เป็นเจ้าของคอมพิวเตอร์ที่คุณต้องการใช้งานคลิก “<ph name="SHARE" />” และให้รหัสการเข้าถึงแก่คุณ</translation>
 <translation id="5379087427956679853">Chrome Remote Desktop อนุญาตให้คุณแชร์คอมพิวเตอร์ของคุณผ่านเว็บอย่างปลอดภัย ผู้ใช้ทั้งสองฝ่ายจะต้องเรียกใช้แอปพลิเคชัน Chrome Remote Desktop ซึ่งสามารถรับได้ที่ <ph name="URL" /></translation>
-<translation id="5394895745784982830">สำหรับ Mac (OS X 10.6 ขึ้นไป)</translation>
 <translation id="5397086374758643919">Chrome Remote Desktop Host Uninstaller</translation>
 <translation id="5419185025274123272">ไม่สามารถรีเซ็ตแอปพลิเคชันนี้ คุณยังคงสามารถส่งรายงานข้อบกพร่องได้</translation>
 <translation id="544077782045763683">โฮสต์ปิดตัวลงแล้ว</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">ระยะเวลา</translation>
 <translation id="6939719207673461467">แสดง/ซ่อนแป้นพิมพ์</translation>
 <translation id="6944854424004126054">กู้คืนหน้าต่าง</translation>
-<translation id="6962773374262604195">สำหรับ Windows (XP ขึ้นไป)</translation>
 <translation id="6965382102122355670">ตกลง</translation>
 <translation id="6985691951107243942">คุณแน่ใจหรือไม่ว่าต้องการปิดใช้งานการเชื่อมต่อระยะไกลกับ <ph name="HOSTNAME" /> หากคุณเปลี่ยนใจภายหลัง คุณจะต้องไปที่คอมพิวเตอร์เครื่องนั้นเพื่อเปิดใช้งานการเชื่อมต่ออีกครั้ง</translation>
 <translation id="6998989275928107238">ถึง</translation>
diff --git a/remoting/resources/remoting_strings_tr.xtb b/remoting/resources/remoting_strings_tr.xtb
index 12fcd100..151835c 100644
--- a/remoting/resources/remoting_strings_tr.xtb
+++ b/remoting/resources/remoting_strings_tr.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Bağlanacak herhangi bir bilgisayar yok</translation>
 <translation id="5363265567587775042">Bilgisayarına erişmek istediğiniz kullanıcıdan “<ph name="SHARE" />” öğesini tıklamasını ve size erişim kodunu vermesini isteyin.</translation>
 <translation id="5379087427956679853">Chrome Uzaktan Masaüstü, bilgisayarınızı Web üzerinden güvenli bir şekilde paylaşabilmenize olanak sağlar. Her iki kullanıcının da Chrome Uzaktan Masaüstü uygulamasını çalıştırıyor olması gerekir. Uygulamayı <ph name="URL" /> adresinde bulabilirsiniz.</translation>
-<translation id="5394895745784982830">Mac (OS X 10.6 ve sonraki sürümler) için</translation>
 <translation id="5397086374758643919">Chrome Uzaktan Masaüstü Ana Makine Yüklemesini Kaldırma Programı</translation>
 <translation id="5419185025274123272">Uygulama sıfırlanamadı. Hâlâ bir hata raporu gönderebilirsiniz.</translation>
 <translation id="544077782045763683">Ana makine kapatıldı.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Süre</translation>
 <translation id="6939719207673461467">Klavyeyi göster/gizle</translation>
 <translation id="6944854424004126054">Pencereyi geri yükle</translation>
-<translation id="6962773374262604195">Windows (XP ve sonraki sürümler) için</translation>
 <translation id="6965382102122355670">Tamam</translation>
 <translation id="6985691951107243942"><ph name="HOSTNAME" /> adlı ana bilgisayara uzaktan bağlantıları devre dışı bırakmak istediğinizden emin misiniz? Daha sonra fikrinizi değiştirirseniz, bağlantıları yeniden etkinleştirmek için söz konusu bilgisayarı ziyaret etmeniz gerekecektir.</translation>
 <translation id="6998989275928107238">Kime</translation>
diff --git a/remoting/resources/remoting_strings_uk.xtb b/remoting/resources/remoting_strings_uk.xtb
index c32844d..9aa67de 100644
--- a/remoting/resources/remoting_strings_uk.xtb
+++ b/remoting/resources/remoting_strings_uk.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Немає комп’ютерів для віддаленого доступу</translation>
 <translation id="5363265567587775042">Попросіть користувача комп’ютера, до якого ви хочете під’єднатися, натиснути "<ph name="SHARE" />" і надіслати вам код доступу.</translation>
 <translation id="5379087427956679853">Програма Віддалене керування Chrome дозволяє безпечно надавати доступ до свого комп’ютера через Інтернет. Обидва користувачі мають запустити програму Віддалене керування Chrome, яку можна знайти на сторінці <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Для Mac (OS X 10.6 і новіших версій)</translation>
 <translation id="5397086374758643919">Видалення хосту Віддаленого керування Chrome</translation>
 <translation id="5419185025274123272">Не вдалося скинути дані додатка. Ви можете надіслати звіт про помилку.</translation>
 <translation id="544077782045763683">Хост завершив роботу.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Тривалість</translation>
 <translation id="6939719207673461467">Показати/сховати клавіатуру.</translation>
 <translation id="6944854424004126054">Відновити вікно</translation>
-<translation id="6962773374262604195">Для Windows (XP та новіших версій)</translation>
 <translation id="6965382102122355670">ОК</translation>
 <translation id="6985691951107243942">Дійсно вимкнути віддалені з’єднання з хостом <ph name="HOSTNAME" />? Якщо ви передумаєте, потрібно буде знову ввімкнути з’єднання на відповідному комп’ютері.</translation>
 <translation id="6998989275928107238">Кому</translation>
diff --git a/remoting/resources/remoting_strings_vi.xtb b/remoting/resources/remoting_strings_vi.xtb
index a186c04..22f27c25 100644
--- a/remoting/resources/remoting_strings_vi.xtb
+++ b/remoting/resources/remoting_strings_vi.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">Không có máy tính nào để kết nối</translation>
 <translation id="5363265567587775042">Yêu cầu người dùng có máy tính bạn muốn truy cập nhấp vào “<ph name="SHARE" />” và cung cấp cho bạn mã truy cập.</translation>
 <translation id="5379087427956679853">Chrome Remote Desktop cho phép bạn chia sẻ máy tính của mình một cách an toàn qua Web. Cả hai người dùng đều phải chạy ứng dụng Chrome Remote Desktop mà bạn có thể tìm thấy tại <ph name="URL" />.</translation>
-<translation id="5394895745784982830">Dành cho máy Mac (OS X 10.6 trở lên)</translation>
 <translation id="5397086374758643919">Trình gỡ cài đặt máy chủ Chrome Remote Desktop</translation>
 <translation id="5419185025274123272">Không thể đặt lại ứng dụng. Bạn sẽ vẫn có thể gửi báo cáo lỗi.</translation>
 <translation id="544077782045763683">Máy chủ đã tắt.</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">Thời lượng</translation>
 <translation id="6939719207673461467">Hiển thị / ẩn bàn phím.</translation>
 <translation id="6944854424004126054">Khôi phục cửa sổ</translation>
-<translation id="6962773374262604195">Dành cho Windows (XP trở lên)</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6985691951107243942">Bạn có chắc chắn muốn tắt kết nối từ xa với <ph name="HOSTNAME" /> không? Nếu bạn thay đổi ý định, bạn cần truy cập vào máy tính đó để bật lại kết nối.</translation>
 <translation id="6998989275928107238">Đến</translation>
diff --git a/remoting/resources/remoting_strings_zh-CN.xtb b/remoting/resources/remoting_strings_zh-CN.xtb
index 380ed98..1aa96bc9 100644
--- a/remoting/resources/remoting_strings_zh-CN.xtb
+++ b/remoting/resources/remoting_strings_zh-CN.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">没有可连接到的计算机</translation>
 <translation id="5363265567587775042">请让您想访问其计算机的用户点击“<ph name="SHARE" />”,然后向您提供访问代码。</translation>
 <translation id="5379087427956679853">Chrome 远程桌面可让您通过网络安全地共享自己的计算机。双方用户必须同时运行 Chrome 远程桌面应用(下载地址为 <ph name="URL" />)。</translation>
-<translation id="5394895745784982830">适用于 Mac(OS X 10.6 及更高版本)</translation>
 <translation id="5397086374758643919">Chrome 远程桌面主机卸载程序</translation>
 <translation id="5419185025274123272">无法重置该应用。您仍可以发送错误报告。</translation>
 <translation id="544077782045763683">主机已关机。</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">持续时间</translation>
 <translation id="6939719207673461467">显示/隐藏键盘。</translation>
 <translation id="6944854424004126054">恢复窗口</translation>
-<translation id="6962773374262604195">适用于 Windows(XP 及更高版本)</translation>
 <translation id="6965382102122355670">确定</translation>
 <translation id="6985691951107243942">您确定要停用与“<ph name="HOSTNAME" />”的远程连接吗?如果您日后想要重新启用连接,需要访问该计算机。</translation>
 <translation id="6998989275928107238">指向</translation>
diff --git a/remoting/resources/remoting_strings_zh-TW.xtb b/remoting/resources/remoting_strings_zh-TW.xtb
index 8b5f2df..f1210449 100644
--- a/remoting/resources/remoting_strings_zh-TW.xtb
+++ b/remoting/resources/remoting_strings_zh-TW.xtb
@@ -178,7 +178,6 @@
 <translation id="533625276787323658">沒有可供連線的電腦</translation>
 <translation id="5363265567587775042">請您要存取的電腦的使用者點選 [<ph name="SHARE" />],並提供存取碼給您。</translation>
 <translation id="5379087427956679853">Chrome 遠端桌面提供了安全的連線機制,可讓您透過網路與他人共用自己的電腦。您和共用對象都必須執行 Chrome 遠端桌面應用程式,請前往 <ph name="URL" /> 安裝。</translation>
-<translation id="5394895745784982830">適用於 Mac (OS X 10.6 以上版本)</translation>
 <translation id="5397086374758643919">Chrome 遠端桌面主機端解除安裝程式</translation>
 <translation id="5419185025274123272">無法重設應用程式。您仍然可以傳送錯誤報告。</translation>
 <translation id="544077782045763683">主機已關閉。</translation>
@@ -232,7 +231,6 @@
 <translation id="6930242544192836755">持續時間</translation>
 <translation id="6939719207673461467">顯示/隱藏鍵盤。</translation>
 <translation id="6944854424004126054">還原視窗</translation>
-<translation id="6962773374262604195">適用於 Windows (XP 以上版本)</translation>
 <translation id="6965382102122355670">確定</translation>
 <translation id="6985691951107243942">您是否確定要停用與 <ph name="HOSTNAME" /> 之間的遠端連線?如果之後改變心意的話,您必須親身前往該電腦所在位置並修改設定後,才能重新啟用連線。</translation>
 <translation id="6998989275928107238">目標電腦</translation>
diff --git a/remoting/signaling/chromoting_event.cc b/remoting/signaling/chromoting_event.cc
index 7b52c9be..a284fa39 100644
--- a/remoting/signaling/chromoting_event.cc
+++ b/remoting/signaling/chromoting_event.cc
@@ -25,7 +25,7 @@
 
 ChromotingEvent::ChromotingEvent(const ChromotingEvent& other) {
   try_count_ = other.try_count_;
-  values_map_.reset(other.values_map_->DeepCopy());
+  values_map_ = other.values_map_->CreateDeepCopy();
 }
 
 ChromotingEvent::ChromotingEvent(ChromotingEvent&& other) {
@@ -38,7 +38,7 @@
 ChromotingEvent& ChromotingEvent::operator=(const ChromotingEvent& other) {
   if (this != &other) {
     try_count_ = other.try_count_;
-    values_map_.reset(other.values_map_->DeepCopy());
+    values_map_ = other.values_map_->CreateDeepCopy();
   }
   return *this;
 }
@@ -94,7 +94,7 @@
 
 std::unique_ptr<base::DictionaryValue> ChromotingEvent::CopyDictionaryValue()
     const {
-  return std::unique_ptr<base::DictionaryValue>(values_map_->DeepCopy());
+  return values_map_->CreateDeepCopy();
 }
 
 // static
diff --git a/remoting/webapp/base/js/connection_stats.js b/remoting/webapp/base/js/connection_stats.js
index 61d5680..9d163663 100644
--- a/remoting/webapp/base/js/connection_stats.js
+++ b/remoting/webapp/base/js/connection_stats.js
@@ -141,7 +141,8 @@
    * @return {string} "type: avg, max; " e.g. "RTT: 8.0, 13; "
    */
   function formatStat(type, avg, max) {
-    return type + ': ' + avg.toFixed(1) + ', ' + max + '; ';
+    var avgStr = (avg == undefined) ? 'n/a' : avg.toFixed(1);
+    return type + ': ' + avgStr + ', ' + max + '; ';
   }
 
   var statistics = document.getElementById('statistics');
diff --git a/sandbox/win/src/broker_services.cc b/sandbox/win/src/broker_services.cc
index 32b11f8..1339abf 100644
--- a/sandbox/win/src/broker_services.cc
+++ b/sandbox/win/src/broker_services.cc
@@ -51,7 +51,6 @@
 // executes TargetEventsThread().
 enum {
   THREAD_CTRL_NONE,
-  THREAD_CTRL_REMOVE_PEER,
   THREAD_CTRL_QUIT,
   THREAD_CTRL_LAST,
 };
@@ -89,27 +88,6 @@
   }
 }
 
-// Helper structure that allows the broker to track peer processes
-struct PeerTracker {
-  PeerTracker(DWORD process_id, HANDLE broker_job_port)
-      : wait_object(NULL), id(process_id), job_port(broker_job_port) {
-  }
-
-  HANDLE wait_object;
-  base::win::ScopedHandle process;
-  DWORD id;
-  HANDLE job_port;
-};
-
-void DeregisterPeerTracker(PeerTracker* peer) {
-  // Deregistration shouldn't fail, but we leak rather than crash if it does.
-  if (::UnregisterWaitEx(peer->wait_object, INVALID_HANDLE_VALUE)) {
-    delete peer;
-  } else {
-    NOTREACHED();
-  }
-}
-
 }  // namespace
 
 namespace sandbox {
@@ -165,12 +143,6 @@
   STLDeleteElements(&tracker_list_);
   delete thread_pool_;
 
-  // Cancel the wait events and delete remaining peer trackers.
-  for (PeerTrackerMap::iterator it = peer_map_.begin();
-       it != peer_map_.end(); ++it) {
-    DeregisterPeerTracker(it->second);
-  }
-
   ::DeleteCriticalSection(&lock_);
 }
 
@@ -283,13 +255,6 @@
           break;
         }
       }
-    } else if (THREAD_CTRL_REMOVE_PEER == key) {
-      // Remove a process from our list of peers.
-      AutoLock lock(&broker->lock_);
-      PeerTrackerMap::iterator it = broker->peer_map_.find(
-          static_cast<DWORD>(reinterpret_cast<uintptr_t>(ovl)));
-      DeregisterPeerTracker(it->second);
-      broker->peer_map_.erase(it);
     } else if (THREAD_CTRL_QUIT == key) {
       // The broker object is being destroyed so the thread needs to exit.
       return 0;
@@ -444,17 +409,21 @@
       new TargetProcess(std::move(initial_token), std::move(lockdown_token),
                         std::move(lowbox_token), job.Get(), thread_pool_);
 
-  DWORD win_result = target->Create(exe_path, command_line, inherit_handles,
-                                    startup_info, &process_info);
+  DWORD win_result;
+  result = target->Create(exe_path, command_line, inherit_handles, startup_info,
+                          &process_info, &win_result);
 
-  if (ERROR_SUCCESS != win_result) {
+  if (result != SBOX_ALL_OK) {
     SpawnCleanup(target, win_result);
-    return SBOX_ERROR_CREATE_PROCESS;
+    return result;
   }
 
   // Now the policy is the owner of the target.
-  if (!policy_base->AddTarget(target)) {
-    return SpawnCleanup(target, 0);
+  result = policy_base->AddTarget(target);
+
+  if (result != SBOX_ALL_OK) {
+    SpawnCleanup(target, 0);
+    return result;
   }
 
   // We are going to keep a pointer to the policy because we'll call it when
@@ -479,16 +448,10 @@
     // not block WaitForAllTargets until we have at least one target with job.
     if (child_process_ids_.empty())
       ::SetEvent(no_targets_.Get());
-    // We can not track the life time of such processes and it is responsibility
-    // of the host application to make sure that spawned targets without jobs
-    // are terminated when the main application don't need them anymore.
-    // Sandbox policy engine needs to know that these processes are valid
-    // targets for e.g. BrokerDuplicateHandle so track them as peer processes.
-    AddTargetPeer(process_info.process_handle());
   }
 
   *target_info = process_info.Take();
-  return SBOX_ALL_OK;
+  return result;
 }
 
 
@@ -499,46 +462,7 @@
 
 bool BrokerServicesBase::IsActiveTarget(DWORD process_id) {
   AutoLock lock(&lock_);
-  return child_process_ids_.find(process_id) != child_process_ids_.end() ||
-         peer_map_.find(process_id) != peer_map_.end();
-}
-
-VOID CALLBACK BrokerServicesBase::RemovePeer(PVOID parameter, BOOLEAN timeout) {
-  PeerTracker* peer = reinterpret_cast<PeerTracker*>(parameter);
-  // Don't check the return code because we this may fail (safely) at shutdown.
-  ::PostQueuedCompletionStatus(
-      peer->job_port, 0, THREAD_CTRL_REMOVE_PEER,
-      reinterpret_cast<LPOVERLAPPED>(static_cast<uintptr_t>(peer->id)));
-}
-
-ResultCode BrokerServicesBase::AddTargetPeer(HANDLE peer_process) {
-  std::unique_ptr<PeerTracker> peer(
-      new PeerTracker(::GetProcessId(peer_process), job_port_.Get()));
-  if (!peer->id)
-    return SBOX_ERROR_GENERIC;
-
-  HANDLE process_handle;
-  if (!::DuplicateHandle(::GetCurrentProcess(), peer_process,
-                         ::GetCurrentProcess(), &process_handle,
-                         SYNCHRONIZE, FALSE, 0)) {
-    return SBOX_ERROR_GENERIC;
-  }
-  peer->process.Set(process_handle);
-
-  AutoLock lock(&lock_);
-  if (!peer_map_.insert(std::make_pair(peer->id, peer.get())).second)
-    return SBOX_ERROR_BAD_PARAMS;
-
-  if (!::RegisterWaitForSingleObject(
-          &peer->wait_object, peer->process.Get(), RemovePeer, peer.get(),
-          INFINITE, WT_EXECUTEONLYONCE | WT_EXECUTEINWAITTHREAD)) {
-    peer_map_.erase(peer->id);
-    return SBOX_ERROR_GENERIC;
-  }
-
-  // Release the pointer since it will be cleaned up by the callback.
-  ignore_result(peer.release());
-  return SBOX_ALL_OK;
+  return child_process_ids_.find(process_id) != child_process_ids_.end();
 }
 
 }  // namespace sandbox
diff --git a/sandbox/win/src/broker_services.h b/sandbox/win/src/broker_services.h
index a102ce9..22e83b1 100644
--- a/sandbox/win/src/broker_services.h
+++ b/sandbox/win/src/broker_services.h
@@ -22,7 +22,6 @@
 namespace {
 
 struct JobTracker;
-struct PeerTracker;
 
 }  // namespace
 
@@ -52,7 +51,6 @@
                          TargetPolicy* policy,
                          PROCESS_INFORMATION* target) override;
   ResultCode WaitForAllTargets() override;
-  ResultCode AddTargetPeer(HANDLE peer_process) override;
 
   // Checks if the supplied process ID matches one of the broker's active
   // target processes
@@ -62,15 +60,11 @@
 
  private:
   typedef std::list<JobTracker*> JobTrackerList;
-  typedef std::map<DWORD, PeerTracker*> PeerTrackerMap;
 
   // The routine that the worker thread executes. It is in charge of
   // notifications and cleanup-related tasks.
   static DWORD WINAPI TargetEventsThread(PVOID param);
 
-  // Removes a target peer from the process list if it expires.
-  static VOID CALLBACK RemovePeer(PVOID parameter, BOOLEAN timeout);
-
   // The completion port used by the job objects to communicate events to
   // the worker thread.
   base::win::ScopedHandle job_port_;
@@ -92,10 +86,6 @@
   // List of the trackers for closing and cleanup purposes.
   JobTrackerList tracker_list_;
 
-  // Maps peer process IDs to the saved handle and wait event.
-  // Prevents peer callbacks from accessing the broker after destruction.
-  PeerTrackerMap peer_map_;
-
   // Provides a fast lookup to identify sandboxed processes that belong to a
   // job. Consult |jobless_process_handles_| for handles of pocess without job.
   std::set<DWORD> child_process_ids_;
diff --git a/sandbox/win/src/sandbox.h b/sandbox/win/src/sandbox.h
index 0012772..fd9cd66 100644
--- a/sandbox/win/src/sandbox.h
+++ b/sandbox/win/src/sandbox.h
@@ -83,14 +83,6 @@
   //   If the return is ERROR_GENERIC, you can call ::GetLastError() to get
   //   more information.
   virtual ResultCode WaitForAllTargets() = 0;
-
-  // Adds an unsandboxed process as a peer for policy decisions (e.g.
-  // HANDLES_DUP_ANY policy).
-  // Returns:
-  //   ALL_OK if successful. All other return values imply failure.
-  //   If the return is ERROR_GENERIC, you can call ::GetLastError() to get
-  //   more information.
-  virtual ResultCode AddTargetPeer(HANDLE peer_process) = 0;
 };
 
 // TargetServices models the current process from the perspective
diff --git a/sandbox/win/src/sandbox_policy_base.cc b/sandbox/win/src/sandbox_policy_base.cc
index adb9ad2..14070db0 100644
--- a/sandbox/win/src/sandbox_policy_base.cc
+++ b/sandbox/win/src/sandbox_policy_base.cc
@@ -503,51 +503,56 @@
   return lowbox_sid_;
 }
 
-bool PolicyBase::AddTarget(TargetProcess* target) {
+ResultCode PolicyBase::AddTarget(TargetProcess* target) {
   if (NULL != policy_)
     policy_maker_->Done();
 
   if (!ApplyProcessMitigationsToSuspendedProcess(target->Process(),
                                                  mitigations_)) {
-    return false;
+    return SBOX_ERROR_APPLY_ASLR_MITIGATIONS;
   }
 
-  if (!SetupAllInterceptions(target))
-    return false;
+  ResultCode ret = SetupAllInterceptions(target);
+
+  if (ret != SBOX_ALL_OK)
+    return ret;
 
   if (!SetupHandleCloser(target))
-    return false;
+    return SBOX_ERROR_SETUP_HANDLE_CLOSER;
 
+  DWORD win_error = ERROR_SUCCESS;
   // Initialize the sandbox infrastructure for the target.
-  if (ERROR_SUCCESS !=
-      target->Init(dispatcher_.get(), policy_, kIPCMemSize, kPolMemSize))
-    return false;
+  // TODO(wfh) do something with win_error code here.
+  ret = target->Init(dispatcher_.get(), policy_, kIPCMemSize, kPolMemSize,
+                     &win_error);
+
+  if (ret != SBOX_ALL_OK)
+    return ret;
 
   g_shared_delayed_integrity_level = delayed_integrity_level_;
-  ResultCode ret = target->TransferVariable(
-                       "g_shared_delayed_integrity_level",
-                       &g_shared_delayed_integrity_level,
-                       sizeof(g_shared_delayed_integrity_level));
+  ret = target->TransferVariable("g_shared_delayed_integrity_level",
+                                 &g_shared_delayed_integrity_level,
+                                 sizeof(g_shared_delayed_integrity_level));
   g_shared_delayed_integrity_level = INTEGRITY_LEVEL_LAST;
   if (SBOX_ALL_OK != ret)
-    return false;
+    return ret;
 
   // Add in delayed mitigations and pseudo-mitigations enforced at startup.
   g_shared_delayed_mitigations = delayed_mitigations_ |
       FilterPostStartupProcessMitigations(mitigations_);
   if (!CanSetProcessMitigationsPostStartup(g_shared_delayed_mitigations))
-    return false;
+    return SBOX_ERROR_BAD_PARAMS;
 
   ret = target->TransferVariable("g_shared_delayed_mitigations",
                                  &g_shared_delayed_mitigations,
                                  sizeof(g_shared_delayed_mitigations));
   g_shared_delayed_mitigations = 0;
   if (SBOX_ALL_OK != ret)
-    return false;
+    return ret;
 
   AutoLock lock(&lock_);
   targets_.push_back(target);
-  return true;
+  return SBOX_ALL_OK;
 }
 
 bool PolicyBase::OnJobEmpty(HANDLE job) {
@@ -616,13 +621,13 @@
   return enable_opm_redirection_;
 }
 
-bool PolicyBase::SetupAllInterceptions(TargetProcess* target) {
+ResultCode PolicyBase::SetupAllInterceptions(TargetProcess* target) {
   InterceptionManager manager(target, relaxed_interceptions_);
 
   if (policy_) {
     for (int i = 0; i < IPC_LAST_TAG; i++) {
       if (policy_->entry[i] && !dispatcher_->SetupService(&manager, i))
-        return false;
+        return SBOX_ERROR_SETUP_INTERCEPTION_SERVICE;
     }
   }
 
@@ -634,13 +639,16 @@
   }
 
   if (!SetupBasicInterceptions(&manager, is_csrss_connected_))
-    return false;
+    return SBOX_ERROR_SETUP_BASIC_INTERCEPTIONS;
 
   if (!manager.InitializeInterceptions())
-    return false;
+    return SBOX_ERROR_INITIALIZE_INTERCEPTIONS;
 
   // Finally, setup imports on the target so the interceptions can work.
-  return SetupNtdllImports(target);
+  if (!SetupNtdllImports(target))
+    return SBOX_ERROR_SETUP_NTDLL_IMPORTS;
+
+  return SBOX_ALL_OK;
 }
 
 bool PolicyBase::SetupHandleCloser(TargetProcess* target) {
diff --git a/sandbox/win/src/sandbox_policy_base.h b/sandbox/win/src/sandbox_policy_base.h
index b5a2a12d..5fc3f50 100644
--- a/sandbox/win/src/sandbox_policy_base.h
+++ b/sandbox/win/src/sandbox_policy_base.h
@@ -88,7 +88,7 @@
 
   // Adds a target process to the internal list of targets. Internally a
   // call to TargetProcess::Init() is issued.
-  bool AddTarget(TargetProcess* target);
+  ResultCode AddTarget(TargetProcess* target);
 
   // Called when there are no more active processes in a Job.
   // Removes a Job object associated with this policy and the target associated
@@ -107,7 +107,7 @@
   ~PolicyBase();
 
   // Sets up interceptions for a new target.
-  bool SetupAllInterceptions(TargetProcess* target);
+  ResultCode SetupAllInterceptions(TargetProcess* target);
 
   // Sets up the handle closer for a new target.
   bool SetupHandleCloser(TargetProcess* target);
diff --git a/sandbox/win/src/sandbox_types.h b/sandbox/win/src/sandbox_types.h
index b749b9c..2a95119 100644
--- a/sandbox/win/src/sandbox_types.h
+++ b/sandbox/win/src/sandbox_types.h
@@ -5,10 +5,16 @@
 #ifndef SANDBOX_WIN_SRC_SANDBOX_TYPES_H_
 #define SANDBOX_WIN_SRC_SANDBOX_TYPES_H_
 
+#include "base/process/launch.h"
+
 namespace sandbox {
 
 // Operation result codes returned by the sandbox API.
-enum ResultCode {
+//
+// Note: These codes are listed in a histogram and any new codes should be added
+// at the end.
+//
+enum ResultCode : int {
   SBOX_ALL_OK = 0,
   // Error is originating on the win32 layer. Call GetlastError() for more
   // information.
@@ -47,6 +53,38 @@
   SBOX_ERROR_PROC_THREAD_ATTRIBUTES = 17,
   // Error in creating process.
   SBOX_ERROR_CREATE_PROCESS = 18,
+  // Failure calling delegate PreSpawnTarget.
+  SBOX_ERROR_DELEGATE_PRE_SPAWN = 19,
+  // Could not assign process to job object.
+  SBOX_ERROR_ASSIGN_PROCESS_TO_JOB_OBJECT = 20,
+  // Could not assign process to job object.
+  SBOX_ERROR_SET_THREAD_TOKEN = 21,
+  // Could not get thread context of new process.
+  SBOX_ERROR_GET_THREAD_CONTEXT = 22,
+  // Could not duplicate target info of new process.
+  SBOX_ERROR_DUPLICATE_TARGET_INFO = 23,
+  // Could not set low box token.
+  SBOX_ERROR_SET_LOW_BOX_TOKEN = 24,
+  // Could not create file mapping for IPC dispatcher.
+  SBOX_ERROR_CREATE_FILE_MAPPING = 25,
+  // Could not duplicate shared section into target process for IPC dispatcher.
+  SBOX_ERROR_DUPLICATE_SHARED_SECTION = 26,
+  // Could not map view of shared memory in broker.
+  SBOX_ERROR_MAP_VIEW_OF_SHARED_SECTION = 27,
+  // Could not apply ASLR mitigations to target process.
+  SBOX_ERROR_APPLY_ASLR_MITIGATIONS = 28,
+  // Could not setup one of the required interception services.
+  SBOX_ERROR_SETUP_BASIC_INTERCEPTIONS = 29,
+  // Could not setup basic interceptions.
+  SBOX_ERROR_SETUP_INTERCEPTION_SERVICE = 30,
+  // Could not initialize interceptions. This usually means 3rd party software
+  // is stomping on our hooks, or can sometimes mean the syscall format has
+  // changed.
+  SBOX_ERROR_INITIALIZE_INTERCEPTIONS = 31,
+  // Could not setup the imports for ntdll in target process.
+  SBOX_ERROR_SETUP_NTDLL_IMPORTS = 32,
+  // Could not setup the handle closer in target process.
+  SBOX_ERROR_SETUP_HANDLE_CLOSER = 33,
   // Placeholder for last item of the enum.
   SBOX_ERROR_LAST
 };
diff --git a/sandbox/win/src/target_process.cc b/sandbox/win/src/target_process.cc
index 495d35c9d..ad0b7d3 100644
--- a/sandbox/win/src/target_process.cc
+++ b/sandbox/win/src/target_process.cc
@@ -119,15 +119,17 @@
 
 // Creates the target (child) process suspended and assigns it to the job
 // object.
-DWORD TargetProcess::Create(const wchar_t* exe_path,
-                            const wchar_t* command_line,
-                            bool inherit_handles,
-                            const base::win::StartupInformation& startup_info,
-                            base::win::ScopedProcessInformation* target_info) {
+ResultCode TargetProcess::Create(
+    const wchar_t* exe_path,
+    const wchar_t* command_line,
+    bool inherit_handles,
+    const base::win::StartupInformation& startup_info,
+    base::win::ScopedProcessInformation* target_info,
+    DWORD* win_error) {
   if (lowbox_token_.IsValid() &&
       base::win::GetVersion() < base::win::VERSION_WIN8) {
     // We don't allow lowbox_token below Windows 8.
-    return ERROR_INVALID_PARAMETER;
+    return SBOX_ERROR_BAD_PARAMS;
   }
 
   exe_name_.reset(_wcsdup(exe_path));
@@ -157,18 +159,17 @@
                               NULL,  // Use current directory of the caller.
                               startup_info.startup_info(),
                               &temp_process_info)) {
-    return ::GetLastError();
+    *win_error = ::GetLastError();
+    return SBOX_ERROR_CREATE_PROCESS;
   }
   base::win::ScopedProcessInformation process_info(temp_process_info);
 
-  DWORD win_result = ERROR_SUCCESS;
-
   if (job_) {
     // Assign the suspended target to the windows job object.
     if (!::AssignProcessToJobObject(job_, process_info.process_handle())) {
-      win_result = ::GetLastError();
+      *win_error = ::GetLastError();
       ::TerminateProcess(process_info.process_handle(), 0);
-      return win_result;
+      return SBOX_ERROR_ASSIGN_PROCESS_TO_JOB_OBJECT;
     }
   }
 
@@ -178,11 +179,11 @@
     // otherwise it will crash too early for us to help.
     HANDLE temp_thread = process_info.thread_handle();
     if (!::SetThreadToken(&temp_thread, initial_token_.Get())) {
-      win_result = ::GetLastError();
+      *win_error = ::GetLastError();
       // It might be a security breach if we let the target run outside the job
       // so kill it before it causes damage.
       ::TerminateProcess(process_info.process_handle(), 0);
-      return win_result;
+      return SBOX_ERROR_SET_THREAD_TOKEN;
     }
     initial_token_.Close();
   }
@@ -190,9 +191,9 @@
   CONTEXT context;
   context.ContextFlags = CONTEXT_ALL;
   if (!::GetThreadContext(process_info.thread_handle(), &context)) {
-    win_result = ::GetLastError();
+    *win_error = ::GetLastError();
     ::TerminateProcess(process_info.process_handle(), 0);
-    return win_result;
+    return SBOX_ERROR_GET_THREAD_CONTEXT;
   }
 
 #if defined(_WIN64)
@@ -206,9 +207,9 @@
 #endif  // _WIN64
 
   if (!target_info->DuplicateFrom(process_info)) {
-    win_result = ::GetLastError();  // This may or may not be correct.
+    *win_error = ::GetLastError();  // This may or may not be correct.
     ::TerminateProcess(process_info.process_handle(), 0);
-    return win_result;
+    return SBOX_ERROR_DUPLICATE_TARGET_INFO;
   }
 
   if (lowbox_token_.IsValid()) {
@@ -224,15 +225,15 @@
         static_cast<PROCESS_INFORMATION_CLASS>(NtProcessInformationAccessToken),
         &process_access_token, sizeof(process_access_token));
     if (!NT_SUCCESS(status)) {
-      win_result = ERROR_INVALID_TOKEN;
+      *win_error = ERROR_INVALID_TOKEN;
       ::TerminateProcess(process_info.process_handle(), 0);  // exit code
-      return win_result;
+      return SBOX_ERROR_SET_LOW_BOX_TOKEN;
     }
   }
 
   base_address_ = GetBaseAddress(exe_path, entry_point);
   sandbox_process_info_.Set(process_info.Take());
-  return win_result;
+  return SBOX_ALL_OK;
 }
 
 ResultCode TargetProcess::TransferVariable(const char* name, void* address,
@@ -271,10 +272,11 @@
 
 // Construct the IPC server and the IPC dispatcher. When the target does
 // an IPC it will eventually call the dispatcher.
-DWORD TargetProcess::Init(Dispatcher* ipc_dispatcher,
-                          void* policy,
-                          uint32_t shared_IPC_size,
-                          uint32_t shared_policy_size) {
+ResultCode TargetProcess::Init(Dispatcher* ipc_dispatcher,
+                               void* policy,
+                               uint32_t shared_IPC_size,
+                               uint32_t shared_policy_size,
+                               DWORD* win_error) {
   // We need to map the shared memory on the target. This is necessary for
   // any IPC that needs to take place, even if the target has not yet hit
   // the main( ) function or even has initialized the CRT. So here we set
@@ -288,7 +290,8 @@
                                            PAGE_READWRITE | SEC_COMMIT,
                                            0, shared_mem_size, NULL));
   if (!shared_section_.IsValid()) {
-    return ::GetLastError();
+    *win_error = ::GetLastError();
+    return SBOX_ERROR_CREATE_FILE_MAPPING;
   }
 
   DWORD access = FILE_MAP_READ | FILE_MAP_WRITE | SECTION_QUERY;
@@ -296,14 +299,16 @@
   if (!::DuplicateHandle(::GetCurrentProcess(), shared_section_.Get(),
                          sandbox_process_info_.process_handle(),
                          &target_shared_section, access, FALSE, 0)) {
-    return ::GetLastError();
+    *win_error = ::GetLastError();
+    return SBOX_ERROR_DUPLICATE_SHARED_SECTION;
   }
 
   void* shared_memory = ::MapViewOfFile(shared_section_.Get(),
                                         FILE_MAP_WRITE|FILE_MAP_READ,
                                         0, 0, 0);
   if (NULL == shared_memory) {
-    return ::GetLastError();
+    *win_error = ::GetLastError();
+    return SBOX_ERROR_MAP_VIEW_OF_SHARED_SECTION;
   }
 
   CopyPolicyToTarget(policy, shared_policy_size,
@@ -316,24 +321,24 @@
                          sizeof(g_shared_section));
   g_shared_section = NULL;
   if (SBOX_ALL_OK != ret) {
-    return (SBOX_ERROR_GENERIC == ret)?
-           ::GetLastError() : ERROR_INVALID_FUNCTION;
+    *win_error = ::GetLastError();
+    return ret;
   }
   g_shared_IPC_size = shared_IPC_size;
   ret = TransferVariable("g_shared_IPC_size", &g_shared_IPC_size,
                          sizeof(g_shared_IPC_size));
   g_shared_IPC_size = 0;
   if (SBOX_ALL_OK != ret) {
-    return (SBOX_ERROR_GENERIC == ret) ?
-           ::GetLastError() : ERROR_INVALID_FUNCTION;
+    *win_error = ::GetLastError();
+    return ret;
   }
   g_shared_policy_size = shared_policy_size;
   ret = TransferVariable("g_shared_policy_size", &g_shared_policy_size,
                          sizeof(g_shared_policy_size));
   g_shared_policy_size = 0;
   if (SBOX_ALL_OK != ret) {
-    return (SBOX_ERROR_GENERIC == ret) ?
-           ::GetLastError() : ERROR_INVALID_FUNCTION;
+    *win_error = ::GetLastError();
+    return ret;
   }
 
   ipc_server_.reset(
@@ -342,12 +347,12 @@
                              thread_pool_, ipc_dispatcher));
 
   if (!ipc_server_->Init(shared_memory, shared_IPC_size, kIPCChannelSize))
-    return ERROR_NOT_ENOUGH_MEMORY;
+    return SBOX_ERROR_NO_SPACE;
 
   // After this point we cannot use this handle anymore.
   ::CloseHandle(sandbox_process_info_.TakeThreadHandle());
 
-  return ERROR_SUCCESS;
+  return SBOX_ALL_OK;
 }
 
 void TargetProcess::Terminate() {
diff --git a/sandbox/win/src/target_process.h b/sandbox/win/src/target_process.h
index 90a4aa9e4..384f2c18 100644
--- a/sandbox/win/src/target_process.h
+++ b/sandbox/win/src/target_process.h
@@ -53,21 +53,23 @@
   void Release() {}
 
   // Creates the new target process. The process is created suspended.
-  DWORD Create(const wchar_t* exe_path,
-               const wchar_t* command_line,
-               bool inherit_handles,
-               const base::win::StartupInformation& startup_info,
-               base::win::ScopedProcessInformation* target_info);
+  ResultCode Create(const wchar_t* exe_path,
+                    const wchar_t* command_line,
+                    bool inherit_handles,
+                    const base::win::StartupInformation& startup_info,
+                    base::win::ScopedProcessInformation* target_info,
+                    DWORD* win_error);
 
   // Destroys the target process.
   void Terminate();
 
   // Creates the IPC objects such as the BrokerDispatcher and the
   // IPC server. The IPC server uses the services of the thread_pool.
-  DWORD Init(Dispatcher* ipc_dispatcher,
-             void* policy,
-             uint32_t shared_IPC_size,
-             uint32_t shared_policy_size);
+  ResultCode Init(Dispatcher* ipc_dispatcher,
+                  void* policy,
+                  uint32_t shared_IPC_size,
+                  uint32_t shared_policy_size,
+                  DWORD* win_error);
 
   // Returns the handle to the target process.
   HANDLE Process() const {
diff --git a/sandbox/win/tests/common/controller.cc b/sandbox/win/tests/common/controller.cc
index 3b710578..0bdb033 100644
--- a/sandbox/win/tests/common/controller.cc
+++ b/sandbox/win/tests/common/controller.cc
@@ -236,7 +236,6 @@
                           NULL, NULL, &startup_info, &target)) {
       return SBOX_ERROR_GENERIC;
     }
-    broker_->AddTargetPeer(target.hProcess);
   } else {
     result = broker_->SpawnTarget(prog_name, arguments.c_str(), policy_,
                                   &target);
diff --git a/services/shell/shell.cc b/services/shell/shell.cc
index 19dc061..116dfe0 100644
--- a/services/shell/shell.cc
+++ b/services/shell/shell.cc
@@ -172,7 +172,7 @@
     // classes instead of specifying a wild-card for interfaces.
     if (HasClass(capability_spec_, kCapabilityClass_ExplicitClass) &&
         (request.interfaces.count("*") != 0)) {
-      request.interfaces = Interfaces();
+      request.interfaces.erase("*");
     }
 
     shell_client_->AcceptConnection(
diff --git a/services/user/user_service.cc b/services/user/user_service.cc
index 36292d31..1c572a5 100644
--- a/services/user/user_service.cc
+++ b/services/user/user_service.cc
@@ -28,7 +28,7 @@
 void UserService::GetDirectory(filesystem::DirectoryRequest request,
                                const GetDirectoryCallback& callback) {
   new filesystem::DirectoryImpl(std::move(request), path_,
-                                std::unique_ptr<base::ScopedTempDir>(),
+                                scoped_refptr<filesystem::SharedTempDir>(),
                                 lock_table_);
   callback.Run();
 }
@@ -50,7 +50,7 @@
   }
 
   new filesystem::DirectoryImpl(std::move(request), subdir,
-                                std::unique_ptr<base::ScopedTempDir>(),
+                                scoped_refptr<filesystem::SharedTempDir>(),
                                 lock_table_);
   callback.Run(filesystem::FileError::OK);
 }
diff --git a/sync/engine/model_type_worker.cc b/sync/engine/model_type_worker.cc
index a34b94c..53aeba1 100644
--- a/sync/engine/model_type_worker.cc
+++ b/sync/engine/model_type_worker.cc
@@ -223,7 +223,6 @@
   DCHECK(pending_updates_.empty());
 
   size_t space_remaining = max_entries;
-  std::vector<int64_t> sequence_numbers;
   google::protobuf::RepeatedPtrField<sync_pb::SyncEntity> commit_entities;
 
   if (!CanCommitItems())
@@ -235,12 +234,8 @@
     WorkerEntityTracker* entity = it->second.get();
     if (entity->HasPendingCommit()) {
       sync_pb::SyncEntity* commit_entity = commit_entities.Add();
-      int64_t sequence_number = -1;
-
-      entity->PopulateCommitProto(commit_entity, &sequence_number);
+      entity->PopulateCommitProto(commit_entity);
       AdjustCommitProto(commit_entity);
-      sequence_numbers.push_back(sequence_number);
-
       space_remaining--;
     }
   }
@@ -250,13 +245,11 @@
 
   return std::unique_ptr<CommitContribution>(
       new NonBlockingTypeCommitContribution(data_type_state_.type_context(),
-                                            commit_entities, sequence_numbers,
-                                            this));
+                                            commit_entities, this));
 }
 
-void ModelTypeWorker::OnCommitResponse(
-    const CommitResponseDataList& response_list) {
-  for (const CommitResponseData& response : response_list) {
+void ModelTypeWorker::OnCommitResponse(CommitResponseDataList* response_list) {
+  for (CommitResponseData& response : *response_list) {
     WorkerEntityTracker* entity = GetEntityTracker(response.client_tag_hash);
 
     // There's no way we could have committed an entry we know nothing about.
@@ -267,14 +260,13 @@
       continue;
     }
 
-    entity->ReceiveCommitResponse(response.id, response.response_version,
-                                  response.sequence_number);
+    entity->ReceiveCommitResponse(&response);
   }
 
   // Send the responses back to the model thread.  It needs to know which
   // items have been successfully committed so it can save that information in
   // permanent storage.
-  model_type_processor_->OnCommitCompleted(data_type_state_, response_list);
+  model_type_processor_->OnCommitCompleted(data_type_state_, *response_list);
 }
 
 base::WeakPtr<ModelTypeWorker> ModelTypeWorker::AsWeakPtr() {
diff --git a/sync/engine/model_type_worker.h b/sync/engine/model_type_worker.h
index fae02f0..bd41538 100644
--- a/sync/engine/model_type_worker.h
+++ b/sync/engine/model_type_worker.h
@@ -93,7 +93,7 @@
       size_t max_entries) override;
 
   // Callback for when our contribution gets a response.
-  void OnCommitResponse(const CommitResponseDataList& response_list);
+  void OnCommitResponse(CommitResponseDataList* response_list);
 
   base::WeakPtr<ModelTypeWorker> AsWeakPtr();
 
diff --git a/sync/engine/model_type_worker_unittest.cc b/sync/engine/model_type_worker_unittest.cc
index edcc3af51..3670229 100644
--- a/sync/engine/model_type_worker_unittest.cc
+++ b/sync/engine/model_type_worker_unittest.cc
@@ -720,6 +720,8 @@
 
   EXPECT_EQ(client_tag_hash, commit_response.client_tag_hash);
   EXPECT_LT(0, commit_response.response_version);
+  EXPECT_LT(0, commit_response.sequence_number);
+  EXPECT_FALSE(commit_response.specifics_hash.empty());
 }
 
 TEST_F(ModelTypeWorkerTest, SimpleDelete) {
diff --git a/sync/engine/non_blocking_type_commit_contribution.cc b/sync/engine/non_blocking_type_commit_contribution.cc
index d4506b33..5e845c8 100644
--- a/sync/engine/non_blocking_type_commit_contribution.cc
+++ b/sync/engine/non_blocking_type_commit_contribution.cc
@@ -19,12 +19,10 @@
 NonBlockingTypeCommitContribution::NonBlockingTypeCommitContribution(
     const sync_pb::DataTypeContext& context,
     const google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>& entities,
-    const std::vector<int64_t>& sequence_numbers,
     ModelTypeWorker* worker)
     : worker_(worker),
       context_(context),
       entities_(entities),
-      sequence_numbers_(sequence_numbers),
       cleaned_up_(false) {}
 
 NonBlockingTypeCommitContribution::~NonBlockingTypeCommitContribution() {
@@ -54,7 +52,7 @@
 
   CommitResponseDataList response_list;
 
-  for (size_t i = 0; i < sequence_numbers_.size(); ++i) {
+  for (int i = 0; i < entities_.size(); ++i) {
     const sync_pb::CommitResponse_EntryResponse& entry_response =
         commit_response.entryresponse(entries_start_index_ + i);
 
@@ -76,7 +74,6 @@
         response_data.id = entry_response.id_string();
         response_data.client_tag_hash =
             entities_.Get(i).client_defined_unique_tag();
-        response_data.sequence_number = sequence_numbers_[i];
         response_data.response_version = entry_response.version();
         response_list.push_back(response_data);
         break;
@@ -95,7 +92,7 @@
 
   // Send whatever successful responses we did get back to our parent.
   // It's the schedulers job to handle the failures.
-  worker_->OnCommitResponse(response_list);
+  worker_->OnCommitResponse(&response_list);
 
   // Let the scheduler know about the failures.
   if (unknown_error) {
@@ -118,7 +115,7 @@
 }
 
 size_t NonBlockingTypeCommitContribution::GetNumEntries() const {
-  return sequence_numbers_.size();
+  return entities_.size();
 }
 
 }  // namespace syncer_v2
diff --git a/sync/engine/non_blocking_type_commit_contribution.h b/sync/engine/non_blocking_type_commit_contribution.h
index f0fddcf..df0fe282 100644
--- a/sync/engine/non_blocking_type_commit_contribution.h
+++ b/sync/engine/non_blocking_type_commit_contribution.h
@@ -27,7 +27,6 @@
   NonBlockingTypeCommitContribution(
       const sync_pb::DataTypeContext& context,
       const google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>& entities,
-      const std::vector<int64_t>& sequence_numbers,
       ModelTypeWorker* worker);
   ~NonBlockingTypeCommitContribution() override;
 
@@ -49,10 +48,6 @@
   // The set of entities to be committed, serialized as SyncEntities.
   const google::protobuf::RepeatedPtrField<sync_pb::SyncEntity> entities_;
 
-  // The sequence numbers associated with the pending commits.  These match up
-  // with the entities_ vector.
-  const std::vector<int64_t> sequence_numbers_;
-
   // The index in the commit message where this contribution's entities are
   // added.  Used to correlate per-item requests with per-item responses.
   size_t entries_start_index_;
diff --git a/sync/engine/worker_entity_tracker.cc b/sync/engine/worker_entity_tracker.cc
index 3bcf710..74a4bd1 100644
--- a/sync/engine/worker_entity_tracker.cc
+++ b/sync/engine/worker_entity_tracker.cc
@@ -32,8 +32,7 @@
 }
 
 void WorkerEntityTracker::PopulateCommitProto(
-    sync_pb::SyncEntity* commit_entity,
-    int64_t* sequence_number) const {
+    sync_pb::SyncEntity* commit_entity) const {
   DCHECK(HasPendingCommit());
   DCHECK(!client_tag_hash_.empty());
 
@@ -58,8 +57,6 @@
     commit_entity->set_mtime(syncer::TimeToProtoTime(entity.modification_time));
     commit_entity->mutable_specifics()->CopyFrom(entity.specifics);
   }
-
-  *sequence_number = sequence_number_;
 }
 
 void WorkerEntityTracker::RequestCommit(const CommitRequestData& data) {
@@ -72,6 +69,7 @@
   // Update our book-keeping counters.
   base_version_ = data.base_version;
   sequence_number_ = data.sequence_number;
+  pending_commit_specifics_hash_ = data.specifics_hash;
 
   // Don't commit deletions of server-unknown items.
   if (data.entity->is_deleted() && !IsServerKnown()) {
@@ -105,23 +103,20 @@
   // so it can be committed at the next possible opportunity.
 }
 
-void WorkerEntityTracker::ReceiveCommitResponse(const std::string& response_id,
-                                                int64_t response_version,
-                                                int64_t sequence_number) {
-  // Commit responses, especially after the first commit, can update our ID.
-  id_ = response_id;
-
-  DCHECK_GT(response_version, highest_commit_response_version_)
+void WorkerEntityTracker::ReceiveCommitResponse(CommitResponseData* ack) {
+  DCHECK_GT(ack->response_version, highest_commit_response_version_)
       << "Had expected higher response version."
       << " id: " << id_;
 
-  // Commits are synchronous, so there's no reason why the sequence numbers
-  // wouldn't match.
-  DCHECK_EQ(sequence_number_, sequence_number)
-      << "Unexpected sequence number mismatch."
-      << " id: " << id_;
+  // Commit responses, especially after the first commit, can update our ID.
+  id_ = ack->id;
+  highest_commit_response_version_ = ack->response_version;
 
-  highest_commit_response_version_ = response_version;
+  // Fill in some cached info for the response data. Since commits happen
+  // synchronously on the sync thread, our item's state is guaranteed to be
+  // the same at the end of the commit as it was at the start.
+  ack->sequence_number = sequence_number_;
+  ack->specifics_hash = pending_commit_specifics_hash_;
 
   // Because an in-progress commit blocks the sync thread, we can assume that
   // the item we just committed successfully is exactly the one we have now.
@@ -199,6 +194,7 @@
 
 void WorkerEntityTracker::ClearPendingCommit() {
   pending_commit_.reset();
+  pending_commit_specifics_hash_.clear();
 }
 
 }  // namespace syncer_v2
diff --git a/sync/engine/worker_entity_tracker.h b/sync/engine/worker_entity_tracker.h
index fd8645a7..3979bac5 100644
--- a/sync/engine/worker_entity_tracker.h
+++ b/sync/engine/worker_entity_tracker.h
@@ -17,6 +17,7 @@
 
 namespace syncer_v2 {
 struct CommitRequestData;
+struct CommitResponseData;
 struct UpdateResponseData;
 
 // Manages the pending commit and update state for an entity on the sync
@@ -43,24 +44,17 @@
   // Returns true if this entity should be commited to the server.
   bool HasPendingCommit() const;
 
-  // Populates a sync_pb::SyncEntity for a commit.  Also sets the
-  // |sequence_number|, so we can track it throughout the commit process.
-  void PopulateCommitProto(sync_pb::SyncEntity* commit_entity,
-                           int64_t* sequence_number) const;
+  // Populates a sync_pb::SyncEntity for a commit.
+  void PopulateCommitProto(sync_pb::SyncEntity* commit_entity) const;
 
   // Updates this entity with data from the latest version that the
   // model asked us to commit.  May clobber state related to the
   // model's previous commit attempt(s).
   void RequestCommit(const CommitRequestData& data);
 
-  // Handles the receipt of a commit response.
-  //
-  // Since commits happen entirely on the sync thread, we can safely assume
-  // that our item's state at the end of the commit is the same as it was at
-  // the start.
-  void ReceiveCommitResponse(const std::string& response_id,
-                             int64_t response_version,
-                             int64_t sequence_number);
+  // Tracks the receipt of a commit response and fills in some local-only data
+  // on it to be passed back to the processor.
+  void ReceiveCommitResponse(CommitResponseData* ack);
 
   // Handles receipt of an update from the server.
   void ReceiveUpdate(int64_t version);
@@ -115,6 +109,9 @@
   // A commit for this entity waiting for a sync cycle to be committed.
   std::unique_ptr<CommitRequestData> pending_commit_;
 
+  // The specifics hash for the pending commit if there is one, "" otherwise.
+  std::string pending_commit_specifics_hash_;
+
   // An update for this entity which can't be applied right now. The presence
   // of an pending update prevents commits.  As of this writing, the only
   // source of pending updates is updates that can't currently be decrypted.
diff --git a/sync/engine/worker_entity_tracker_unittest.cc b/sync/engine/worker_entity_tracker_unittest.cc
index 5bc4e00..7c91fee 100644
--- a/sync/engine/worker_entity_tracker_unittest.cc
+++ b/sync/engine/worker_entity_tracker_unittest.cc
@@ -34,6 +34,7 @@
         kClientTagHash(
             syncer::syncable::GenerateSyncableHash(syncer::PREFERENCES,
                                                    kClientTag)),
+        kSpecificsHash("somehash"),
         kCtime(base::Time::UnixEpoch() + base::TimeDelta::FromDays(10)),
         kMtime(base::Time::UnixEpoch() + base::TimeDelta::FromDays(20)),
         entity_(new WorkerEntityTracker(kServerId, kClientTagHash)) {
@@ -57,6 +58,7 @@
     request_data.entity = data.PassToPtr();
     request_data.sequence_number = sequence_number;
     request_data.base_version = base_version;
+    request_data.specifics_hash = kSpecificsHash;
     return request_data;
   }
 
@@ -74,6 +76,7 @@
   const std::string kServerId;
   const std::string kClientTag;
   const std::string kClientTagHash;
+  const std::string kSpecificsHash;
   const base::Time kCtime;
   const base::Time kMtime;
   sync_pb::EntitySpecifics specifics;
@@ -96,9 +99,7 @@
 
   ASSERT_TRUE(entity_->HasPendingCommit());
   sync_pb::SyncEntity pb_entity;
-  int64_t sequence_number = 0;
-  entity_->PopulateCommitProto(&pb_entity, &sequence_number);
-  EXPECT_EQ(kSequenceNumber, sequence_number);
+  entity_->PopulateCommitProto(&pb_entity);
   EXPECT_EQ(kServerId, pb_entity.id_string());
   EXPECT_EQ(kClientTagHash, pb_entity.client_defined_unique_tag());
   EXPECT_EQ(kBaseVersion, pb_entity.version());
@@ -109,6 +110,15 @@
             pb_entity.specifics().preference().name());
   EXPECT_EQ(specifics.preference().value(),
             pb_entity.specifics().preference().value());
+
+  CommitResponseData ack;
+  ack.response_version = kBaseVersion + 1;
+  ack.id = kServerId;
+  entity_->ReceiveCommitResponse(&ack);
+
+  EXPECT_EQ(kSequenceNumber, ack.sequence_number);
+  EXPECT_EQ(kSpecificsHash, ack.specifics_hash);
+  EXPECT_FALSE(entity_->HasPendingCommit());
 }
 
 // Start with a server initiated entity.  Commit over top of it.
diff --git a/sync/internal_api/base_node.cc b/sync/internal_api/base_node.cc
index 29d4574..d7c6380 100644
--- a/sync/internal_api/base_node.cc
+++ b/sync/internal_api/base_node.cc
@@ -163,8 +163,9 @@
 bool BaseNode::GetIsPermanentFolder() const {
   bool is_permanent_folder = !GetEntry()->GetUniqueServerTag().empty();
   if (is_permanent_folder) {
-    // If the node is a permanent folder it must also have IS_DIR bit set.
-    DCHECK(GetIsFolder());
+    // If the node is a permanent folder it must also have IS_DIR bit set,
+    // except some nigori nodes on old accounts.
+    DCHECK(GetIsFolder() || GetModelType() == NIGORI);
   }
   return is_permanent_folder;
 }
diff --git a/sync/internal_api/processor_entity_tracker.cc b/sync/internal_api/processor_entity_tracker.cc
index 6aa5677..8c37c02 100644
--- a/sync/internal_api/processor_entity_tracker.cc
+++ b/sync/internal_api/processor_entity_tracker.cc
@@ -118,6 +118,9 @@
 
 void ProcessorEntityTracker::RecordIgnoredUpdate(
     const UpdateResponseData& update) {
+  DCHECK(metadata_.server_id().empty() ||
+         metadata_.server_id() == update.entity->id);
+  metadata_.set_server_id(update.entity->id);
   metadata_.set_server_version(update.response_version);
   // Either these already matched, acked was just bumped to squash a pending
   // commit and this should follow, or the pending commit needs to be requeued.
@@ -166,6 +169,7 @@
 
 void ProcessorEntityTracker::Delete() {
   IncrementSequenceNumber();
+  metadata_.set_modification_time(syncer::TimeToProtoTime(base::Time::Now()));
   metadata_.set_is_deleted(true);
   metadata_.clear_specifics_hash();
   // Clear any cached pending commit data.
@@ -185,6 +189,8 @@
     data.client_tag_hash = metadata_.client_tag_hash();
     data.id = metadata_.server_id();
     data.creation_time = syncer::ProtoTimeToTime(metadata_.creation_time());
+    data.modification_time =
+        syncer::ProtoTimeToTime(metadata_.modification_time());
     request->entity = data.PassToPtr();
   }
 
diff --git a/sync/internal_api/processor_entity_tracker_unittest.cc b/sync/internal_api/processor_entity_tracker_unittest.cc
index 5265c90e..76b29f8 100644
--- a/sync/internal_api/processor_entity_tracker_unittest.cc
+++ b/sync/internal_api/processor_entity_tracker_unittest.cc
@@ -15,15 +15,15 @@
 #include "sync/internal_api/public/non_blocking_sync_common.h"
 #include "sync/protocol/sync.pb.h"
 #include "sync/syncable/syncable_util.h"
+#include "sync/util/time.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace syncer_v2 {
 
 namespace {
 
-const std::string kTag1 = "tag1";
-const std::string kTag2 = "tag2";
-const std::string kTag3 = "tag3";
+const std::string kTag = "tag";
+const std::string kId = "id";
 const std::string kValue1 = "value1";
 const std::string kValue2 = "value2";
 const std::string kValue3 = "value3";
@@ -40,6 +40,56 @@
   return specifics;
 }
 
+std::unique_ptr<EntityData> GenerateEntityData(const std::string& tag,
+                                               const std::string& value) {
+  std::unique_ptr<EntityData> entity_data(new EntityData());
+  entity_data->client_tag_hash = GenerateTagHash(tag);
+  entity_data->specifics = GenerateSpecifics(tag, value);
+  entity_data->non_unique_name = tag;
+  return entity_data;
+}
+
+UpdateResponseData GenerateUpdate(const ProcessorEntityTracker& entity,
+                                  const std::string& id,
+                                  const std::string& value,
+                                  const base::Time& mtime,
+                                  int64_t version) {
+  std::unique_ptr<EntityData> data =
+      GenerateEntityData(entity.client_tag(), value);
+  data->id = id;
+  data->modification_time = mtime;
+  UpdateResponseData update;
+  update.entity = data->PassToPtr();
+  update.response_version = version;
+  return update;
+}
+
+UpdateResponseData GenerateTombstone(const ProcessorEntityTracker& entity,
+                                     const std::string& id,
+                                     const base::Time& mtime,
+                                     int64_t version) {
+  std::unique_ptr<EntityData> data = base::WrapUnique(new EntityData());
+  data->client_tag_hash = GenerateTagHash(entity.client_tag());
+  data->non_unique_name = entity.client_tag();
+  data->id = id;
+  data->modification_time = mtime;
+  UpdateResponseData update;
+  update.entity = data->PassToPtr();
+  update.response_version = version;
+  return update;
+}
+
+CommitResponseData GenerateAckData(const CommitRequestData& request,
+                                   int64_t version) {
+  CommitResponseData response;
+  response.id = kId;
+  response.client_tag_hash = request.entity->client_tag_hash;
+  response.sequence_number = request.sequence_number;
+  response.response_version = version;
+  response.specifics_hash = request.specifics_hash;
+  return response;
+}
+
 }  // namespace
 
 // Some simple sanity tests for the ProcessorEntityTracker.
@@ -54,256 +104,382 @@
 class ProcessorEntityTrackerTest : public ::testing::Test {
  public:
   ProcessorEntityTrackerTest()
-      : kServerId("ServerID"),
-        kClientTag("sample.pref.name"),
-        kClientTagHash(GenerateTagHash(kClientTag)),
-        kCtime(base::Time::UnixEpoch() + base::TimeDelta::FromDays(10)),
-        kMtime(base::Time::UnixEpoch() + base::TimeDelta::FromDays(20)),
-        specifics(GenerateSpecifics(kClientTag, kValue1)) {}
+      : tag_hash_(GenerateTagHash(kTag)),
+        ctime_(base::Time::Now() - base::TimeDelta::FromSeconds(1)){};
 
-  std::unique_ptr<ProcessorEntityTracker> NewLocalItem(const std::string& tag) {
-    return std::unique_ptr<ProcessorEntityTracker>(
-        ProcessorEntityTracker::CreateNew(tag, GenerateTagHash(tag), "",
-                                          kCtime));
+  std::unique_ptr<ProcessorEntityTracker> CreateNew() {
+    return ProcessorEntityTracker::CreateNew(kTag, tag_hash_, "", ctime_);
   }
 
-  std::unique_ptr<ProcessorEntityTracker> NewLocalItem(
-      const std::string& tag,
-      const sync_pb::EntitySpecifics& specifics) {
-    std::unique_ptr<ProcessorEntityTracker> entity(NewLocalItem(tag));
-    MakeLocalChange(entity.get(), specifics);
+  std::unique_ptr<ProcessorEntityTracker> CreateSynced() {
+    std::unique_ptr<ProcessorEntityTracker> entity = CreateNew();
+    entity->RecordAcceptedUpdate(
+        GenerateUpdate(*entity, kId, kValue1, ctime_, 1));
+    DCHECK(!entity->IsUnsynced());
     return entity;
   }
 
-  void MakeLocalChange(ProcessorEntityTracker* entity,
-                       const sync_pb::EntitySpecifics& specifics) {
-    std::unique_ptr<EntityData> entity_data =
-        base::WrapUnique(new EntityData());
-    entity_data->client_tag_hash = entity->metadata().client_tag_hash();
-    entity_data->specifics = specifics;
-    entity_data->non_unique_name = "foo";
-    entity_data->modification_time = kMtime;
-    entity->MakeLocalChange(std::move(entity_data));
-  }
-
-  std::unique_ptr<ProcessorEntityTracker> NewServerItem() {
-    return std::unique_ptr<ProcessorEntityTracker>(
-        ProcessorEntityTracker::CreateNew(kClientTag, kClientTagHash, kServerId,
-                                          kCtime));
-  }
-
-  std::unique_ptr<ProcessorEntityTracker> NewServerItem(
-      int64_t version,
-      const sync_pb::EntitySpecifics& specifics) {
-    std::unique_ptr<ProcessorEntityTracker> entity(NewServerItem());
-    RecordAcceptedUpdate(entity.get(), version, specifics);
-    return entity;
-  }
-
-  void RecordAcceptedUpdate(ProcessorEntityTracker* entity,
-                            int64_t version,
-                            const sync_pb::EntitySpecifics& specifics) {
-    RecordAcceptedUpdate(entity, version, specifics, kMtime);
-  }
-
-  void RecordAcceptedUpdate(ProcessorEntityTracker* entity,
-                            int64_t version,
-                            const sync_pb::EntitySpecifics& specifics,
-                            base::Time mtime) {
-    EntityData data;
-    data.id = entity->metadata().server_id();
-    data.client_tag_hash = entity->metadata().client_tag_hash();
-    data.modification_time = mtime;
-    data.specifics = specifics;
-
-    UpdateResponseData response_data;
-    response_data.response_version = version;
-    response_data.entity = data.PassToPtr();
-
-    entity->RecordAcceptedUpdate(response_data);
-  }
-
-  bool HasSpecificsHash(
-      const std::unique_ptr<ProcessorEntityTracker>& entity) const {
-    return !entity->metadata().specifics_hash().empty();
-  }
-
-  const std::string kServerId;
-  const std::string kClientTag;
-  const std::string kClientTagHash;
-  const base::Time kCtime;
-  const base::Time kMtime;
-  sync_pb::EntitySpecifics specifics;
+  const std::string tag_hash_;
+  const base::Time ctime_;
 };
 
-TEST_F(ProcessorEntityTrackerTest, NewItem) {
-  std::unique_ptr<ProcessorEntityTracker> entity(NewLocalItem("asdf"));
+// Test the state of the default new tracker.
+TEST_F(ProcessorEntityTrackerTest, DefaultTracker) {
+  std::unique_ptr<ProcessorEntityTracker> entity = CreateNew();
 
-  EXPECT_EQ(entity->client_tag(), "asdf");
-  EXPECT_EQ(entity->metadata().client_tag_hash(), GenerateTagHash("asdf"));
-
-  EXPECT_FALSE(entity->HasCommitData());
-  EXPECT_FALSE(HasSpecificsHash(entity));
+  EXPECT_EQ(kTag, entity->client_tag());
+  EXPECT_EQ(tag_hash_, entity->metadata().client_tag_hash());
+  EXPECT_EQ("", entity->metadata().server_id());
+  EXPECT_FALSE(entity->metadata().is_deleted());
+  EXPECT_EQ(0, entity->metadata().sequence_number());
+  EXPECT_EQ(0, entity->metadata().acked_sequence_number());
+  EXPECT_EQ(kUncommittedVersion, entity->metadata().server_version());
+  EXPECT_EQ(syncer::TimeToProtoTime(ctime_),
+            entity->metadata().creation_time());
+  EXPECT_EQ(0, entity->metadata().modification_time());
+  EXPECT_TRUE(entity->metadata().specifics_hash().empty());
+  EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
 
   EXPECT_FALSE(entity->IsUnsynced());
+  EXPECT_FALSE(entity->RequiresCommitRequest());
+  EXPECT_FALSE(entity->RequiresCommitData());
+  EXPECT_FALSE(entity->CanClearMetadata());
   EXPECT_FALSE(entity->UpdateIsReflection(1));
+  EXPECT_FALSE(entity->HasCommitData());
 }
 
+// Test creating and commiting a new local item.
 TEST_F(ProcessorEntityTrackerTest, NewLocalItem) {
-  std::unique_ptr<ProcessorEntityTracker> entity(
-      NewLocalItem("asdf", specifics));
+  std::unique_ptr<ProcessorEntityTracker> entity = CreateNew();
+  entity->MakeLocalChange(GenerateEntityData(kTag, kValue1));
 
+  EXPECT_EQ("", entity->metadata().server_id());
+  EXPECT_FALSE(entity->metadata().is_deleted());
   EXPECT_EQ(1, entity->metadata().sequence_number());
   EXPECT_EQ(0, entity->metadata().acked_sequence_number());
   EXPECT_EQ(kUncommittedVersion, entity->metadata().server_version());
-  EXPECT_TRUE(entity->HasCommitData());
-  EXPECT_TRUE(HasSpecificsHash(entity));
+  EXPECT_NE(0, entity->metadata().modification_time());
+  EXPECT_FALSE(entity->metadata().specifics_hash().empty());
+  EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
+
   EXPECT_TRUE(entity->IsUnsynced());
+  EXPECT_TRUE(entity->RequiresCommitRequest());
+  EXPECT_FALSE(entity->RequiresCommitData());
+  EXPECT_FALSE(entity->CanClearMetadata());
   EXPECT_FALSE(entity->UpdateIsReflection(1));
+  EXPECT_TRUE(entity->HasCommitData());
 
-  CommitResponseData data;
-  data.id = "id";
-  data.client_tag_hash = entity->metadata().client_tag_hash();
-  data.sequence_number = 1;
-  data.response_version = 1;
-  data.specifics_hash = entity->metadata().specifics_hash();
-  entity->ReceiveCommitResponse(data);
+  EXPECT_EQ(kValue1, entity->commit_data()->specifics.preference().value());
 
+  // Generate a commit request. The metadata should not change.
+  const sync_pb::EntityMetadata metadata_v1 = entity->metadata();
+  CommitRequestData request;
+  entity->InitializeCommitRequestData(&request);
+  EXPECT_EQ(metadata_v1.SerializeAsString(),
+            entity->metadata().SerializeAsString());
+
+  EXPECT_TRUE(entity->IsUnsynced());
+  EXPECT_FALSE(entity->RequiresCommitRequest());
+  EXPECT_FALSE(entity->RequiresCommitData());
+  EXPECT_FALSE(entity->CanClearMetadata());
+  EXPECT_FALSE(entity->UpdateIsReflection(1));
+  EXPECT_TRUE(entity->HasCommitData());
+
+  const EntityData& data = request.entity.value();
+  EXPECT_EQ("", data.id);
+  EXPECT_EQ(tag_hash_, data.client_tag_hash);
+  EXPECT_EQ(kTag, data.non_unique_name);
+  EXPECT_EQ(kValue1, data.specifics.preference().value());
+  EXPECT_EQ(syncer::TimeToProtoTime(ctime_),
+            syncer::TimeToProtoTime(data.creation_time));
+  EXPECT_EQ(entity->metadata().modification_time(),
+            syncer::TimeToProtoTime(data.modification_time));
+  EXPECT_FALSE(data.is_deleted());
+  EXPECT_EQ(1, request.sequence_number);
+  EXPECT_EQ(kUncommittedVersion, request.base_version);
+  EXPECT_EQ(entity->metadata().specifics_hash(), request.specifics_hash);
+
+  // Ack the commit.
+  entity->ReceiveCommitResponse(GenerateAckData(request, 1));
+
+  EXPECT_EQ(kId, entity->metadata().server_id());
+  EXPECT_FALSE(entity->metadata().is_deleted());
   EXPECT_EQ(1, entity->metadata().sequence_number());
   EXPECT_EQ(1, entity->metadata().acked_sequence_number());
   EXPECT_EQ(1, entity->metadata().server_version());
-  EXPECT_FALSE(entity->HasCommitData());
-  EXPECT_TRUE(HasSpecificsHash(entity));
+  EXPECT_EQ(metadata_v1.creation_time(), entity->metadata().creation_time());
+  EXPECT_EQ(metadata_v1.modification_time(),
+            entity->metadata().modification_time());
+  EXPECT_FALSE(entity->metadata().specifics_hash().empty());
   EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
+
   EXPECT_FALSE(entity->IsUnsynced());
+  EXPECT_FALSE(entity->RequiresCommitRequest());
+  EXPECT_FALSE(entity->RequiresCommitData());
+  EXPECT_FALSE(entity->CanClearMetadata());
   EXPECT_TRUE(entity->UpdateIsReflection(1));
+  EXPECT_FALSE(entity->HasCommitData());
 }
 
-TEST_F(ProcessorEntityTrackerTest, FromServerUpdate) {
-  std::unique_ptr<ProcessorEntityTracker> entity(NewServerItem());
+// Test state for a newly synced server item.
+TEST_F(ProcessorEntityTrackerTest, NewServerItem) {
+  std::unique_ptr<ProcessorEntityTracker> entity = CreateNew();
 
-  EXPECT_EQ(entity->client_tag(), kClientTag);
-  EXPECT_EQ(entity->metadata().client_tag_hash(), kClientTagHash);
-  EXPECT_FALSE(HasSpecificsHash(entity));
+  const base::Time mtime = base::Time::Now();
+  entity->RecordAcceptedUpdate(
+      GenerateUpdate(*entity, kId, kValue1, mtime, 10));
 
-  RecordAcceptedUpdate(entity.get(), 10, specifics);
+  EXPECT_EQ(kId, entity->metadata().server_id());
+  EXPECT_FALSE(entity->metadata().is_deleted());
+  EXPECT_EQ(0, entity->metadata().sequence_number());
+  EXPECT_EQ(0, entity->metadata().acked_sequence_number());
+  EXPECT_EQ(10, entity->metadata().server_version());
+  EXPECT_EQ(syncer::TimeToProtoTime(mtime),
+            entity->metadata().modification_time());
+  EXPECT_FALSE(entity->metadata().specifics_hash().empty());
+  EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
 
-  // No data cached but the specifics hash should be updated.
-  EXPECT_FALSE(entity->HasCommitData());
-  EXPECT_TRUE(HasSpecificsHash(entity));
   EXPECT_FALSE(entity->IsUnsynced());
+  EXPECT_FALSE(entity->RequiresCommitRequest());
+  EXPECT_FALSE(entity->RequiresCommitData());
+  EXPECT_FALSE(entity->CanClearMetadata());
   EXPECT_TRUE(entity->UpdateIsReflection(9));
   EXPECT_TRUE(entity->UpdateIsReflection(10));
   EXPECT_FALSE(entity->UpdateIsReflection(11));
-}
-
-// Tombstones should behave just like regular updates.  Mostly.  The strangest
-// thing about them is that they don't have specifics, so it can be hard to
-// detect their type.  Fortunately, this class doesn't care about types in
-// received updates.
-TEST_F(ProcessorEntityTrackerTest, TombstoneUpdate) {
-  // Empty EntitySpecifics indicates tombstone update.
-  std::unique_ptr<ProcessorEntityTracker> entity(
-      NewServerItem(10, sync_pb::EntitySpecifics()));
-
-  EXPECT_EQ(kClientTagHash, entity->metadata().client_tag_hash());
   EXPECT_FALSE(entity->HasCommitData());
-  EXPECT_FALSE(HasSpecificsHash(entity));
-  EXPECT_FALSE(entity->IsUnsynced());
-  EXPECT_TRUE(entity->UpdateIsReflection(9));
-  EXPECT_TRUE(entity->UpdateIsReflection(10));
-  EXPECT_FALSE(entity->UpdateIsReflection(11));
 }
 
-// Apply a deletion update.
-TEST_F(ProcessorEntityTrackerTest, ApplyUpdate) {
-  // Start with a non-deleted state with version 10.
-  std::unique_ptr<ProcessorEntityTracker> entity(NewServerItem(10, specifics));
+// Test state for a tombstone received for a previously unknown item.
+TEST_F(ProcessorEntityTrackerTest, NewServerTombstone) {
+  std::unique_ptr<ProcessorEntityTracker> entity = CreateNew();
 
-  EXPECT_TRUE(HasSpecificsHash(entity));
+  const base::Time mtime = base::Time::Now();
+  entity->RecordAcceptedUpdate(GenerateTombstone(*entity, kId, mtime, 1));
 
+  EXPECT_EQ(kId, entity->metadata().server_id());
+  EXPECT_TRUE(entity->metadata().is_deleted());
+  EXPECT_EQ(0, entity->metadata().sequence_number());
+  EXPECT_EQ(0, entity->metadata().acked_sequence_number());
+  EXPECT_EQ(1, entity->metadata().server_version());
+  EXPECT_EQ(syncer::TimeToProtoTime(mtime),
+            entity->metadata().modification_time());
+  EXPECT_TRUE(entity->metadata().specifics_hash().empty());
+  EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
+
+  EXPECT_FALSE(entity->IsUnsynced());
+  EXPECT_FALSE(entity->RequiresCommitRequest());
+  EXPECT_FALSE(entity->RequiresCommitData());
+  EXPECT_TRUE(entity->CanClearMetadata());
+  EXPECT_TRUE(entity->UpdateIsReflection(1));
+  EXPECT_FALSE(entity->UpdateIsReflection(2));
+  EXPECT_FALSE(entity->HasCommitData());
+}
+
+// Apply a deletion update to a synced item.
+TEST_F(ProcessorEntityTrackerTest, ServerTombstone) {
+  // Start with a non-deleted state with version 1.
+  std::unique_ptr<ProcessorEntityTracker> entity = CreateSynced();
   // A deletion update one version later.
-  RecordAcceptedUpdate(entity.get(), 11, sync_pb::EntitySpecifics(),
-                       kMtime + base::TimeDelta::FromSeconds(10));
+  const base::Time mtime = base::Time::Now();
+  entity->RecordAcceptedUpdate(GenerateTombstone(*entity, kId, mtime, 2));
 
-  EXPECT_FALSE(HasSpecificsHash(entity));
+  EXPECT_TRUE(entity->metadata().is_deleted());
+  EXPECT_EQ(0, entity->metadata().sequence_number());
+  EXPECT_EQ(0, entity->metadata().acked_sequence_number());
+  EXPECT_EQ(2, entity->metadata().server_version());
+  EXPECT_EQ(syncer::TimeToProtoTime(mtime),
+            entity->metadata().modification_time());
+  EXPECT_TRUE(entity->metadata().specifics_hash().empty());
+  EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
+
   EXPECT_FALSE(entity->IsUnsynced());
-  EXPECT_TRUE(entity->UpdateIsReflection(11));
-  EXPECT_FALSE(entity->UpdateIsReflection(12));
+  EXPECT_FALSE(entity->RequiresCommitRequest());
+  EXPECT_FALSE(entity->RequiresCommitData());
+  EXPECT_TRUE(entity->CanClearMetadata());
+  EXPECT_TRUE(entity->UpdateIsReflection(2));
+  EXPECT_FALSE(entity->UpdateIsReflection(3));
+  EXPECT_FALSE(entity->HasCommitData());
 }
 
+// Test a local change of a synced item.
 TEST_F(ProcessorEntityTrackerTest, LocalChange) {
-  // Start with a non-deleted state with version 10.
-  std::unique_ptr<ProcessorEntityTracker> entity(NewServerItem(10, specifics));
-
-  std::string specifics_hash = entity->metadata().specifics_hash();
+  std::unique_ptr<ProcessorEntityTracker> entity = CreateSynced();
+  const int64_t mtime_v0 = entity->metadata().modification_time();
+  const std::string specifics_hash_v0 = entity->metadata().specifics_hash();
 
   // Make a local change with different specifics.
-  sync_pb::EntitySpecifics specifics2;
-  specifics2.CopyFrom(specifics);
-  specifics2.mutable_preference()->set_value("new.pref.value");
-  MakeLocalChange(entity.get(), specifics2);
+  entity->MakeLocalChange(GenerateEntityData(kTag, kValue2));
 
-  EXPECT_NE(entity->metadata().specifics_hash(), specifics_hash);
-  EXPECT_TRUE(entity->HasCommitData());
+  const int64_t mtime_v1 = entity->metadata().modification_time();
+  const std::string specifics_hash_v1 = entity->metadata().specifics_hash();
+
+  EXPECT_FALSE(entity->metadata().is_deleted());
+  EXPECT_EQ(1, entity->metadata().sequence_number());
+  EXPECT_EQ(0, entity->metadata().acked_sequence_number());
+  EXPECT_EQ(1, entity->metadata().server_version());
+  EXPECT_LT(mtime_v0, mtime_v1);
+  EXPECT_NE(specifics_hash_v0, specifics_hash_v1);
+  EXPECT_EQ(specifics_hash_v0, entity->metadata().base_specifics_hash());
+
   EXPECT_TRUE(entity->IsUnsynced());
-  EXPECT_TRUE(entity->UpdateIsReflection(10));
-  EXPECT_FALSE(entity->UpdateIsReflection(11));
+  EXPECT_TRUE(entity->RequiresCommitRequest());
+  EXPECT_FALSE(entity->RequiresCommitData());
+  EXPECT_FALSE(entity->CanClearMetadata());
+  EXPECT_TRUE(entity->HasCommitData());
+
+  // Make a commit.
+  CommitRequestData request;
+  entity->InitializeCommitRequestData(&request);
+
+  EXPECT_EQ(kId, request.entity->id);
+  EXPECT_FALSE(entity->RequiresCommitRequest());
+
+  // Ack the commit.
+  entity->ReceiveCommitResponse(GenerateAckData(request, 2));
+
+  EXPECT_EQ(1, entity->metadata().sequence_number());
+  EXPECT_EQ(1, entity->metadata().acked_sequence_number());
+  EXPECT_EQ(2, entity->metadata().server_version());
+  EXPECT_EQ(mtime_v1, entity->metadata().modification_time());
+  EXPECT_EQ(specifics_hash_v1, entity->metadata().specifics_hash());
+  EXPECT_EQ("", entity->metadata().base_specifics_hash());
+
+  EXPECT_FALSE(entity->IsUnsynced());
+  EXPECT_FALSE(entity->RequiresCommitRequest());
+  EXPECT_FALSE(entity->RequiresCommitData());
+  EXPECT_FALSE(entity->CanClearMetadata());
+  EXPECT_FALSE(entity->HasCommitData());
 }
 
+// Test a local deletion of a synced item.
 TEST_F(ProcessorEntityTrackerTest, LocalDeletion) {
-  // Start with a non-deleted state with version 10.
-  std::unique_ptr<ProcessorEntityTracker> entity(NewServerItem(10, specifics));
-  EXPECT_TRUE(HasSpecificsHash(entity));
+  std::unique_ptr<ProcessorEntityTracker> entity = CreateSynced();
+  const int64_t mtime = entity->metadata().modification_time();
+  const std::string specifics_hash = entity->metadata().specifics_hash();
 
   // Make a local delete.
   entity->Delete();
 
-  EXPECT_FALSE(HasSpecificsHash(entity));
-  EXPECT_FALSE(entity->HasCommitData());
-  EXPECT_FALSE(entity->RequiresCommitData());
+  EXPECT_TRUE(entity->metadata().is_deleted());
+  EXPECT_EQ(1, entity->metadata().sequence_number());
+  EXPECT_EQ(0, entity->metadata().acked_sequence_number());
+  EXPECT_EQ(1, entity->metadata().server_version());
+  EXPECT_LT(mtime, entity->metadata().modification_time());
+  EXPECT_TRUE(entity->metadata().specifics_hash().empty());
+  EXPECT_EQ(specifics_hash, entity->metadata().base_specifics_hash());
+
   EXPECT_TRUE(entity->IsUnsynced());
-  EXPECT_TRUE(entity->UpdateIsReflection(10));
-  EXPECT_FALSE(entity->UpdateIsReflection(11));
+  EXPECT_TRUE(entity->RequiresCommitRequest());
+  EXPECT_FALSE(entity->RequiresCommitData());
+  EXPECT_FALSE(entity->CanClearMetadata());
+  EXPECT_FALSE(entity->HasCommitData());
+
+  // Generate a commit request. The metadata should not change.
+  const sync_pb::EntityMetadata metadata_v1 = entity->metadata();
+  CommitRequestData request;
+  entity->InitializeCommitRequestData(&request);
+  EXPECT_EQ(metadata_v1.SerializeAsString(),
+            entity->metadata().SerializeAsString());
+
+  EXPECT_TRUE(entity->IsUnsynced());
+  EXPECT_FALSE(entity->RequiresCommitRequest());
+  EXPECT_FALSE(entity->RequiresCommitData());
+  EXPECT_FALSE(entity->CanClearMetadata());
+  EXPECT_FALSE(entity->HasCommitData());
+
+  const EntityData& data = request.entity.value();
+  EXPECT_EQ(kId, data.id);
+  EXPECT_EQ(tag_hash_, data.client_tag_hash);
+  EXPECT_EQ("", data.non_unique_name);
+  EXPECT_EQ(syncer::TimeToProtoTime(ctime_),
+            syncer::TimeToProtoTime(data.creation_time));
+  EXPECT_EQ(entity->metadata().modification_time(),
+            syncer::TimeToProtoTime(data.modification_time));
+  EXPECT_TRUE(data.is_deleted());
+  EXPECT_EQ(1, request.sequence_number);
+  EXPECT_EQ(1, request.base_version);
+  EXPECT_EQ(entity->metadata().specifics_hash(), request.specifics_hash);
+
+  // Ack the deletion.
+  entity->ReceiveCommitResponse(GenerateAckData(request, 2));
+
+  EXPECT_TRUE(entity->metadata().is_deleted());
+  EXPECT_EQ(1, entity->metadata().sequence_number());
+  EXPECT_EQ(1, entity->metadata().acked_sequence_number());
+  EXPECT_EQ(2, entity->metadata().server_version());
+  EXPECT_EQ(metadata_v1.modification_time(),
+            entity->metadata().modification_time());
+  EXPECT_TRUE(entity->metadata().specifics_hash().empty());
+  EXPECT_TRUE(entity->metadata().base_specifics_hash().empty());
+
+  EXPECT_FALSE(entity->IsUnsynced());
+  EXPECT_FALSE(entity->RequiresCommitRequest());
+  EXPECT_FALSE(entity->RequiresCommitData());
+  EXPECT_TRUE(entity->CanClearMetadata());
+  EXPECT_FALSE(entity->HasCommitData());
 }
 
-// Verify generation of CommitRequestData from ProcessorEntityTracker.
-// Verify that the sequence number increments on local changes.
-TEST_F(ProcessorEntityTrackerTest, InitializeCommitRequestData) {
-  std::unique_ptr<ProcessorEntityTracker> entity(NewLocalItem(kClientTag));
-  MakeLocalChange(entity.get(), specifics);
+// Test that hashes and sequence numbers are handled correctly for the "commit
+// commit, ack ack" case.
+TEST_F(ProcessorEntityTrackerTest, LocalChangesInterleaved) {
+  std::unique_ptr<ProcessorEntityTracker> entity = CreateSynced();
+  const std::string specifics_hash_v0 = entity->metadata().specifics_hash();
 
-  CommitRequestData commit_request;
-  entity->InitializeCommitRequestData(&commit_request);
+  // Make the first change.
+  entity->MakeLocalChange(GenerateEntityData(kTag, kValue2));
+  const std::string specifics_hash_v1 = entity->metadata().specifics_hash();
 
-  EXPECT_EQ(1, commit_request.sequence_number);
-  EXPECT_EQ(kUncommittedVersion, commit_request.base_version);
+  EXPECT_EQ(1, entity->metadata().sequence_number());
+  EXPECT_EQ(0, entity->metadata().acked_sequence_number());
+  EXPECT_NE(specifics_hash_v0, specifics_hash_v1);
+  EXPECT_EQ(specifics_hash_v0, entity->metadata().base_specifics_hash());
 
-  const EntityData& data = commit_request.entity.value();
-  EXPECT_EQ(entity->metadata().client_tag_hash(), data.client_tag_hash);
-  EXPECT_EQ(specifics.SerializeAsString(), data.specifics.SerializeAsString());
-  EXPECT_FALSE(data.is_deleted());
+  // Request the first commit.
+  CommitRequestData request_v1;
+  entity->InitializeCommitRequestData(&request_v1);
 
-  sync_pb::EntitySpecifics specifics2;
-  specifics2.CopyFrom(specifics);
-  specifics2.mutable_preference()->set_value("new.pref.value");
-  MakeLocalChange(entity.get(), specifics2);
+  // Make the second change.
+  entity->MakeLocalChange(GenerateEntityData(kTag, kValue3));
+  const std::string specifics_hash_v2 = entity->metadata().specifics_hash();
 
-  entity->InitializeCommitRequestData(&commit_request);
-  const EntityData& data2 = commit_request.entity.value();
+  EXPECT_EQ(2, entity->metadata().sequence_number());
+  EXPECT_EQ(0, entity->metadata().acked_sequence_number());
+  EXPECT_NE(specifics_hash_v1, specifics_hash_v2);
+  EXPECT_EQ(specifics_hash_v0, entity->metadata().base_specifics_hash());
 
-  EXPECT_EQ(2, commit_request.sequence_number);
-  EXPECT_EQ(specifics2.SerializeAsString(),
-            data2.specifics.SerializeAsString());
-  EXPECT_FALSE(data2.is_deleted());
+  // Request the second commit.
+  CommitRequestData request_v2;
+  entity->InitializeCommitRequestData(&request_v2);
 
-  entity->Delete();
+  EXPECT_TRUE(entity->IsUnsynced());
+  EXPECT_FALSE(entity->RequiresCommitRequest());
+  EXPECT_FALSE(entity->RequiresCommitData());
+  EXPECT_FALSE(entity->CanClearMetadata());
+  EXPECT_TRUE(entity->HasCommitData());
 
-  entity->InitializeCommitRequestData(&commit_request);
-  const EntityData& data3 = commit_request.entity.value();
+  // Ack the first commit.
+  entity->ReceiveCommitResponse(GenerateAckData(request_v1, 2));
 
-  EXPECT_EQ(3, commit_request.sequence_number);
-  EXPECT_TRUE(data3.is_deleted());
+  EXPECT_EQ(2, entity->metadata().sequence_number());
+  EXPECT_EQ(1, entity->metadata().acked_sequence_number());
+  EXPECT_EQ(2, entity->metadata().server_version());
+  EXPECT_EQ(specifics_hash_v2, entity->metadata().specifics_hash());
+  EXPECT_EQ(specifics_hash_v1, entity->metadata().base_specifics_hash());
+
+  // Ack the second commit.
+  entity->ReceiveCommitResponse(GenerateAckData(request_v2, 3));
+
+  EXPECT_EQ(2, entity->metadata().sequence_number());
+  EXPECT_EQ(2, entity->metadata().acked_sequence_number());
+  EXPECT_EQ(3, entity->metadata().server_version());
+  EXPECT_EQ(specifics_hash_v2, entity->metadata().specifics_hash());
+  EXPECT_EQ("", entity->metadata().base_specifics_hash());
+
+  EXPECT_FALSE(entity->IsUnsynced());
+  EXPECT_FALSE(entity->RequiresCommitRequest());
+  EXPECT_FALSE(entity->RequiresCommitData());
+  EXPECT_FALSE(entity->CanClearMetadata());
+  EXPECT_FALSE(entity->HasCommitData());
 }
 
 }  // namespace syncer_v2
diff --git a/sync/internal_api/sync_manager_impl_unittest.cc b/sync/internal_api/sync_manager_impl_unittest.cc
index 1b6b0af5..96ccfb20 100644
--- a/sync/internal_api/sync_manager_impl_unittest.cc
+++ b/sync/internal_api/sync_manager_impl_unittest.cc
@@ -828,6 +828,45 @@
   }
 }
 
+// Tests that undeleting deleted password doesn't trigger any issues.
+// See crbug/440430.
+TEST_F(SyncApiTest, WriteNode_PasswordUniqueByCreationAfterDelete) {
+  KeyParams params = {"localhost", "username", "passphrase"};
+  {
+    ReadTransaction trans(FROM_HERE, user_share());
+    trans.GetCryptographer()->AddKey(params);
+  }
+
+  WriteTransaction trans(FROM_HERE, user_share());
+  ReadNode root_node(&trans);
+  root_node.InitByRootLookup();
+  // Create new password.
+  {
+    WriteNode password_node(&trans);
+    WriteNode::InitUniqueByCreationResult result =
+        password_node.InitUniqueByCreation(PASSWORDS, root_node, "foo");
+    ASSERT_EQ(WriteNode::INIT_SUCCESS, result);
+    sync_pb::PasswordSpecificsData password_specifics;
+    password_specifics.set_password_value("secret");
+    password_node.SetPasswordSpecifics(password_specifics);
+  }
+  // Delete password.
+  {
+    WriteNode password_node(&trans);
+    BaseNode::InitByLookupResult result =
+        password_node.InitByClientTagLookup(PASSWORDS, "foo");
+    ASSERT_EQ(BaseNode::INIT_OK, result);
+    password_node.Tombstone();
+  }
+  // Create password again triggering undeletion.
+  {
+    WriteNode password_node(&trans);
+    WriteNode::InitUniqueByCreationResult result =
+        password_node.InitUniqueByCreation(PASSWORDS, root_node, "foo");
+    ASSERT_EQ(WriteNode::INIT_SUCCESS, result);
+  }
+}
+
 namespace {
 
 class TestHttpPostProviderInterface : public HttpPostProviderInterface {
diff --git a/sync/internal_api/write_node.cc b/sync/internal_api/write_node.cc
index 2a52963..da7afb6 100644
--- a/sync/internal_api/write_node.cc
+++ b/sync/internal_api/write_node.cc
@@ -336,6 +336,7 @@
                                  syncable::GET_BY_CLIENT_TAG, hash));
 
   if (existing_entry->good()) {
+    bool entry_undeleted = false;
     if (existing_entry->GetIsDel()) {
       // Rules for undelete:
       // BASE_VERSION: Must keep the same.
@@ -372,9 +373,14 @@
 
       existing_entry->PutNonUniqueName(dummy);
       existing_entry->PutParentId(parent_id);
+      entry_undeleted = true;
     }  // Else just reuse the existing entry.
     entry_ = existing_entry.release();
-    if (!DecryptIfNecessary())
+    // If entry is undeleted, its specifics are reset to default, unencrypted
+    // value, and therefore no decryption is necessary. Moreover trying to
+    // decrypt the password entry will fail because passwords are expected to be
+    // encrypted.
+    if (!entry_undeleted && !DecryptIfNecessary())
       return INIT_FAILED_DECRYPT_EXISTING_ENTRY;
   } else {
     entry_ = new syncable::MutableEntry(transaction_->GetWrappedWriteTrans(),
diff --git a/sync/test/engine/mock_model_type_processor.cc b/sync/test/engine/mock_model_type_processor.cc
index c4ecb3d3..e6d27015 100644
--- a/sync/test/engine/mock_model_type_processor.cc
+++ b/sync/test/engine/mock_model_type_processor.cc
@@ -7,7 +7,9 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include "base/base64.h"
 #include "base/bind.h"
+#include "base/sha1.h"
 #include "sync/engine/commit_queue.h"
 
 namespace syncer_v2 {
@@ -90,6 +92,8 @@
   request_data.entity = data.PassToPtr();
   request_data.sequence_number = GetNextSequenceNumber(tag_hash);
   request_data.base_version = base_version;
+  base::Base64Encode(base::SHA1HashString(specifics.SerializeAsString()),
+                     &request_data.specifics_hash);
 
   return request_data;
 }
diff --git a/testing/android/native_test/java/src/org/chromium/native_test/NativeUnitTestActivity.java b/testing/android/native_test/java/src/org/chromium/native_test/NativeUnitTestActivity.java
index c708549..8411583 100644
--- a/testing/android/native_test/java/src/org/chromium/native_test/NativeUnitTestActivity.java
+++ b/testing/android/native_test/java/src/org/chromium/native_test/NativeUnitTestActivity.java
@@ -6,6 +6,7 @@
 
 import android.os.Bundle;
 
+import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
 import org.chromium.base.PathUtils;
 import org.chromium.base.PowerMonitor;
@@ -29,6 +30,7 @@
         // Needed by system_monitor_unittest.cc
         PowerMonitor.createForTests(this);
 
+        ContextUtils.initApplicationContext(getApplicationContext());
         loadLibraries();
     }
 
@@ -38,5 +40,6 @@
             System.loadLibrary(library);
             Log.i(TAG, "loaded: %s", library);
         }
+        ContextUtils.initApplicationContextForNative();
     }
 }
diff --git a/testing/android/native_test/native_test_launcher.cc b/testing/android/native_test/native_test_launcher.cc
index eb652d99..0f880a74 100644
--- a/testing/android/native_test/native_test_launcher.cc
+++ b/testing/android/native_test/native_test_launcher.cc
@@ -75,10 +75,6 @@
   static const char* const kInitialArgv[] = { "ChromeTestActivity" };
   base::CommandLine::Init(arraysize(kInitialArgv), kInitialArgv);
 
-  // Set the application context in base.
-  base::android::RegisterJni(env);
-  base::android::InitApplicationContext(env, app_context);
-
   std::vector<std::string> args;
 
   const std::string command_line_file_path(
@@ -133,6 +129,9 @@
 }
 
 bool RegisterNativeTestJNI(JNIEnv* env) {
+  if (!base::android::RegisterJni(env)) {
+    return false;
+  }
   return RegisterNativesImpl(env);
 }
 
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 5c6fb46..636bff32 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -6828,6 +6828,759 @@
       }
     ]
   },
+  "CrWinClangLLD64 tester": {
+    "gtest_tests": [
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "angle_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "base_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "blink_heap_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "blink_platform_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "shards": 10
+        },
+        "test": "browser_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "cacheinvalidation_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "chrome_app_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "chrome_elf_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "components_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "content_browsertests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "content_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "courgette_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "crypto_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "device_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "extensions_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gcm_unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "google_apis_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gpu_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "installer_util_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ipc_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "jingle_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "media_blink_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "media_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "midi_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "net_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ppapi_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "printing_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "remoting_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sbox_integration_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sbox_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sbox_validation_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "setup_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "skia_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sql_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sync_unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ui_base_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "url_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "views_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "webkit_unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "wtf_unittests"
+      }
+    ]
+  },
+  "CrWinClangLLD64dbg tester": {
+    "gtest_tests": [
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "angle_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "base_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "blink_heap_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "blink_platform_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "shards": 10
+        },
+        "test": "browser_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "cacheinvalidation_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "chrome_app_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "chrome_elf_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "components_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "content_browsertests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "content_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "courgette_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "crypto_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "device_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "extensions_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gcm_unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "google_apis_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gpu_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "installer_util_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ipc_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "jingle_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "media_blink_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "media_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "midi_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "net_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ppapi_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "printing_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "remoting_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sbox_integration_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sbox_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sbox_validation_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "setup_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "skia_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sql_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sync_unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ui_base_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "url_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "views_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "webkit_unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "wtf_unittests"
+      }
+    ]
+  },
+  "CrWinClangLLDdbg tester": {
+    "gtest_tests": [
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "angle_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "base_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "blink_heap_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "blink_platform_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "shards": 10
+        },
+        "test": "browser_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "cacheinvalidation_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "chrome_app_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "chrome_elf_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "components_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "content_browsertests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "content_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "courgette_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "crypto_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "device_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "extensions_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gcm_unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "google_apis_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gpu_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "installer_util_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ipc_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "jingle_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "media_blink_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "media_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "midi_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "net_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ppapi_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "printing_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "remoting_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sbox_integration_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sbox_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sbox_validation_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "setup_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "skia_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sql_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sync_unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ui_base_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "url_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "views_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "webkit_unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "wtf_unittests"
+      }
+    ]
+  },
   "Headless Linux (dbg)": {
     "additional_compile_targets": [
       "headless_lib",
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index 6ea4df75..9f0b588 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -1,6 +1,37 @@
 {
   "AAAAA1 AUTOGENERATED FILE DO NOT EDIT": {},
   "AAAAA2 See generate_buildbot_json.py to make changes": {},
+  "Android Debug (Nexus 5X)": {
+    "gtest_tests": [
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "0000:0000",
+              "os": "Android"
+            }
+          ]
+        },
+        "test": "gl_tests",
+        "use_xvfb": false
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "0000:0000",
+              "os": "Android"
+            }
+          ]
+        },
+        "test": "gl_unittests",
+        "use_xvfb": false
+      }
+    ],
+    "isolated_scripts": []
+  },
   "Android Debug (Nexus 9)": {
     "gtest_tests": [
       {
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index e83c84c..a4d6a2c 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -214,7 +214,7 @@
               "device_type": "hammerhead"
             }
           ],
-          "hard_timeout": 960
+          "hard_timeout": 1200
         },
         "test": "content_browsertests"
       },
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index 2dbd81a..7bf9782e1 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -14,6 +14,18 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
+        "test": "content_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "content_browsertests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
         "test": "net_unittests"
       },
       {
@@ -64,6 +76,18 @@
         "swarming": {
           "can_use_on_swarming_builders": true
         },
+        "test": "content_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "content_browsertests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
         "test": "net_unittests"
       },
       {
diff --git a/testing/buildbot/filters/browser-side-navigation.linux.content_browsertests.filter b/testing/buildbot/filters/browser-side-navigation.linux.content_browsertests.filter
index f1a95b1..121c34e 100644
--- a/testing/buildbot/filters/browser-side-navigation.linux.content_browsertests.filter
+++ b/testing/buildbot/filters/browser-side-navigation.linux.content_browsertests.filter
@@ -1,3 +1,4 @@
+-IFrameZoomBrowserTest.SubframesDontZoomIndependently
 -RenderFrameHostManagerTest.RestoreSubframeFileAccessForHistoryNavigation
 -RenderViewImplTest.OnNavigationHttpPost
 -ServiceWorkerBrowserTest.FetchPageWithSaveData
diff --git a/testing/libfuzzer/fuzzers/BUILD.gn b/testing/libfuzzer/fuzzers/BUILD.gn
index 4da0901..2241629 100644
--- a/testing/libfuzzer/fuzzers/BUILD.gn
+++ b/testing/libfuzzer/fuzzers/BUILD.gn
@@ -284,4 +284,5 @@
     "//third_party/woff2:woff2_dec",
   ]
   seed_corpus = "//testing/libfuzzer/fuzzers/woff2_corpus"
+  libfuzzer_options = [ "max_len=803500" ]
 }
diff --git a/testing/test.gni b/testing/test.gni
index 650940e..c01306c 100644
--- a/testing/test.gni
+++ b/testing/test.gni
@@ -97,7 +97,6 @@
       _device_isolate_path = "$root_out_dir/gen.runtime/$_target_dir_name/$target_name.device.isolate"
       _gen_isolate_target_name = "${target_name}__isolate"
       _gen_isolate(_gen_isolate_target_name) {
-        data_deps = []
         forward_variables_from(invoker,
                                [
                                  "data",
diff --git a/testing/variations/fieldtrial_testing_config_chromeos.json b/testing/variations/fieldtrial_testing_config_chromeos.json
index 8b00a3ad..4f232654 100644
--- a/testing/variations/fieldtrial_testing_config_chromeos.json
+++ b/testing/variations/fieldtrial_testing_config_chromeos.json
@@ -61,6 +61,11 @@
             "group_name": "Enabled"
         }
     ],
+    "GoogleBrandedContextMenu": [
+        {
+            "group_name": "branded"
+        }
+    ],
     "LocalNTPSuggestionsService": [
         {
             "group_name": "Enabled"
@@ -81,6 +86,11 @@
             "group_name": "Enabled"
         }
     ],
+    "OutOfProcessPac": [
+        {
+            "group_name": "Enabled"
+        }
+    ],
     "PageRevisitInstrumentation": [
         {
             "group_name": "Enabled"
diff --git a/testing/variations/fieldtrial_testing_config_linux.json b/testing/variations/fieldtrial_testing_config_linux.json
index 5e869033..d6b66c6 100644
--- a/testing/variations/fieldtrial_testing_config_linux.json
+++ b/testing/variations/fieldtrial_testing_config_linux.json
@@ -79,6 +79,11 @@
             "group_name": "Enabled"
         }
     ],
+    "GoogleBrandedContextMenu": [
+        {
+            "group_name": "branded"
+        }
+    ],
     "InstanceID": [
         {
             "group_name": "Enabled"
@@ -104,6 +109,11 @@
             "group_name": "Enabled"
         }
     ],
+    "OutOfProcessPac": [
+        {
+            "group_name": "Enabled"
+        }
+    ],
     "PageRevisitInstrumentation": [
         {
             "group_name": "Enabled"
diff --git a/testing/variations/fieldtrial_testing_config_mac.json b/testing/variations/fieldtrial_testing_config_mac.json
index 783e1bc..cfc8cef 100644
--- a/testing/variations/fieldtrial_testing_config_mac.json
+++ b/testing/variations/fieldtrial_testing_config_mac.json
@@ -90,6 +90,11 @@
             "group_name": "Enforce"
         }
     ],
+    "GoogleBrandedContextMenu": [
+        {
+            "group_name": "branded"
+        }
+    ],
     "InstanceID": [
         {
             "group_name": "Enabled"
@@ -125,6 +130,11 @@
             "group_name": "Enabled"
         }
     ],
+    "OutOfProcessPac": [
+        {
+            "group_name": "Enabled"
+        }
+    ],
     "PageRevisitInstrumentation": [
         {
             "group_name": "Enabled"
diff --git a/testing/variations/fieldtrial_testing_config_win.json b/testing/variations/fieldtrial_testing_config_win.json
index 06e995291..681d86a9 100644
--- a/testing/variations/fieldtrial_testing_config_win.json
+++ b/testing/variations/fieldtrial_testing_config_win.json
@@ -107,6 +107,11 @@
             "group_name": "Enforce"
         }
     ],
+    "GoogleBrandedContextMenu": [
+        {
+            "group_name": "branded"
+        }
+    ],
     "GoogleNow": [
         {
             "group_name": "Enable"
@@ -176,6 +181,11 @@
             "group_name": "Enabled"
         }
     ],
+    "OutOfProcessPac": [
+        {
+            "group_name": "Enabled"
+        }
+    ],
     "PageRevisitInstrumentation": [
         {
             "group_name": "Enabled"
@@ -326,6 +336,11 @@
             }
         }
     ],
+    "SafeBrowsingV4LocalDatabaseManagerEnabled": [
+        {
+            "group_name": "Enabled"
+        }
+    ],
     "SchedulerExpensiveTaskBlocking": [
         {
             "group_name": "Enabled"
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-browser-side-navigation b/third_party/WebKit/LayoutTests/FlagExpectations/enable-browser-side-navigation
index 0c5ec38..fc8679e 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-browser-side-navigation
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-browser-side-navigation
@@ -1,83 +1,109 @@
-# Last updated: 2016-24-2 based on results from the trybot
-# linux_chromium_browser_side_navigation_rel
+# These tests currently fail when run with --enable-browser-side-navigation
+# See https://crbug.com/576261
 
-# Run 1
-# Expected to fail, but passed: (6)
-  editing/pasteboard/4944770-2.html
-  fast/css/absolute-inline-alignment.html
-  fast/dom/shadow/scoped-events-by-ua-stopped.html
-  fast/encoding/invalid-UTF-8.html
-  fast/forms/month/month-appearance-l10n.html
-  fast/inline/nested-text-descendants.html
-  fast/text/ellipsis-stroked.html
-  fast/text/emoticons.html
-  fast/text/international/bdi-dir-default-to-auto.html
-  fast/text/international/hindi-spacing.html
-  fast/text/international/inline-plaintext-is-isolated.html
-  fast/text/selection-multiple-runs.html
-  fast/text/unicode-variation-selector.html
-  http/tests/media/progress-events-generated-correctly.html
-  http/tests/security/contentTypeOptions/nosniff-script-without-content-type-blocked.html
-  http/tests/xmlviewer/dumpAsText/svg.xml
-  ietestcenter/css3/multicolumn/column-width-applies-to-007.htm
-  ietestcenter/css3/multicolumn/column-width-applies-to-009.htm
-  ietestcenter/css3/multicolumn/column-width-applies-to-012.htm
-  ietestcenter/css3/multicolumn/column-width-applies-to-015.htm
-  imported/csswg-test/vendor-imports/mozilla/mozilla-central-reftests/variables/variable-external-font-face-01.html
-  imported/csswg-test/vendor-imports/mozilla/mozilla-central-reftests/variables/variable-font-face-01.html
-  imported/web-platform-tests/mediacapture-streams/obtaining-local-multimedia-content/navigatorusermedia/getusermedia-optional-constraint.html
-  virtual/rootlayerscrolls/fast/scrolling/fractional-scroll-offset-fixed-position-non-composited.html
-  virtual/rootlayerscrolls/scrollbars/custom-scrollbar-changing-style.html
-
-# Expected to timeout, but passed: (4)
-  inspector/elements/edit/edit-dom-actions.html
-
-# Regressions: Unexpected crashes (53)
-  editing/execCommand/apply-style-command-crash.html [ Crash ]
+# https://crbug.com/608371: PlzNavigate: properly execute the BeforeUnload event
   editing/pasteboard/file-drag-to-editable.html [ Crash Failure ]
+  fast/events/before-unload-forbidden-navigation.html [ Crash ]
+  fast/events/before-unload-return-value-from-listener.html [ Crash Failure ]
+  fast/events/drop-handler-should-not-stop-navigate.html [ Crash Failure ]
+  fast/loader/recursive-before-unload-crash.html [ Crash Failure ]
+  http/tests/history/back-during-beforeunload.html [ Crash ]
+  virtual/pointerevent/fast/events/before-unload-forbidden-navigation.html [ Crash ]
+  virtual/pointerevent/fast/events/before-unload-return-value-from-listener.html [ Crash Failure ]
+  virtual/pointerevent/fast/events/drop-handler-should-not-stop-navigate.html [ Crash Failure ]
+  virtual/trustedeventsdefaultaction/fast/events/before-unload-forbidden-navigation.html [ Crash ]
+  virtual/trustedeventsdefaultaction/fast/events/before-unload-return-value-from-listener.html [ Crash Failure ]
+  virtual/trustedeventsdefaultaction/fast/events/drop-handler-should-not-stop-navigate.html [ Crash Failure ]
+
+# https://crbug.com/608372: PlzNavigate: support POST navigations
+  fast/forms/state-restore-skip-stateless.html [ Crash ]
+  fast/forms/submit-to-url-fragment.html [ Failure ]
+  fast/forms/xss-auditor-doesnt-crash-on-post-submit.html [ Timeout ]
+  fast/loader/form-state-restore-with-frames.html [ Failure ]
+  http/tests/cache/subresource-failover-to-network.html [ Crash ]
+  http/tests/history/back-to-post.html [ Timeout ]
+  http/tests/history/post-replace-state-reload.html [ Crash Failure ]
+  http/tests/navigation/location-reload-after-post.php [ Crash Failure ]
+  http/tests/navigation/post-frames-goback1.html [ Failure ]
+  http/tests/navigation/post-goback-same-url.html [ Failure ]
+  http/tests/navigation/post-goback1.html [ Crash Failure ]
+  http/tests/security/contentSecurityPolicy/1.1/form-action-src-redirect-blocked.html [ Failure ]
+  http/tests/security/xssAuditor/full-block-post-from-iframe.html [ Failure ]
+  http/tests/security/xssAuditor/post-from-iframe.html [ Failure ]
+  http/tests/security/xssAuditor/script-tag-post-control-char.html [ Failure ]
+  http/tests/security/xssAuditor/script-tag-post-null-char.html [ Failure ]
+  http/tests/security/xssAuditor/script-tag-post.html [ Failure ]
+
+# Failing due to error page supression in layout tests
+  fast/xmlhttprequest/null-document-xmlhttprequest-open.html [ Crash Timeout ]
+
+# Failing due to empty data url
+  editing/execCommand/apply-style-command-crash.html [ Crash ]
   editing/style/apply-style-crash.html [ Crash ]
-  fast/css/acid2-pixel.html [ Crash Timeout Failure ]
-  fast/css/acid2.html [ Crash Timeout Failure ]
-  fast/dom/location-new-window-no-crash.html [ Crash ]
+  fast/frames/iframe-plugin-load-remove-document-crash.html [ Crash ]
+  fast/loader/reload-zero-byte-plugin.html [ Crash ]
+  http/tests/security/contentSecurityPolicy/object-src-does-not-affect-child.html [ Crash ]
+  plugins/iframe-plugin-bgcolor.html [ Crash ]
+  plugins/plugin-document-back-forward.html [ Crash ]
+
+# https://crbug.com/608375: PlzNavigate: Appcache support
+  http/tests/appcache/fallback.html [ Timeout ]
   http/tests/appcache/main-resource-hash.html [ Crash Timeout ]
   http/tests/appcache/main-resource-redirect.html [ Crash Timeout ]
   http/tests/appcache/non-html.xhtml [ Crash Timeout ]
   http/tests/appcache/offline-access.html [ Crash Timeout ]
-  http/tests/cache/iframe-304-crash.html [ Crash Failure ]
-  http/tests/history/cross-origin-redirect-on-back.html [ Crash ]
-  http/tests/history/post-replace-state-reload.html [ Crash Failure ]
-  http/tests/navigation/location-reload-after-post.php [ Crash Failure ]
-  virtual/pointerevent/fast/events/before-unload-return-value-from-listener.html [ Crash Failure ]
-  virtual/pointerevent/fast/events/drop-handler-should-not-stop-navigate.html [ Crash Failure ]
-  virtual/trustedeventsdefaultaction/fast/events/before-unload-return-value-from-listener.html [ Crash Failure ]
-  virtual/trustedeventsdefaultaction/fast/events/drop-handler-should-not-stop-navigate.html [ Crash Failure ]
-
-# Regressions: Unexpected missing results (1)
-  http/tests/security/upgrade-insecure-requests/https-header-top-level.html [ Missing ]
-
-# Regressions: Unexpected text-only failures (69)
-  fast/dom/frame-loading-via-document-write.html [ Failure ]
   http/tests/appcache/remove-cache.html [ Failure Timeout ]
+  http/tests/appcache/top-frame-2.html [ Timeout ]
+
+# https://crbug.com/575210: PlzNavigate: history navigation support
+  fast/history/history-length-append-subframe-with-hash.html [ Failure ]
+  fast/history/same-document-iframes-changing-fragment.html [ Failure ]
+  fast/history/same-document-iframes-changing-pushstate.html [ Failure ]
+  http/tests/history/cross-origin-redirect-on-back.html [ Crash ]
+  http/tests/navigation/back-to-dynamic-iframe.html [ Failure ]
+  http/tests/navigation/history-back-across-form-submission-to-fragment.html [ Timeout ]
+  http/tests/navigation/redirect-on-reload-updates-history-item.html [ Failure ]
+  http/tests/navigation/same-and-different-back.html [ Crash ]
+  imported/web-platform-tests/html/browsers/browsing-the-web/history-traversal/popstate_event.html [ Crash Failure Timeout ]
+  imported/web-platform-tests/html/browsers/browsing-the-web/history-traversal/popstate_event.html [ Timeout ]
+  imported/web-platform-tests/html/browsers/history/the-history-interface/004.html [ Failure ]
+  imported/web-platform-tests/html/browsers/history/the-location-interface/security_location_0.sub.htm [ Failure ]
+
+# https://crbug.com/551000: PlzNavigate: DevTools support
   http/tests/inspector/console-resource-errors.html [ Failure ]
   http/tests/inspector/extensions-ignore-cache.html [ Failure ]
+  http/tests/inspector/extensions-network-redirect.html [ Timeout ]
   http/tests/inspector/network/network-document-initiator.html [ Failure ]
   http/tests/inspector/network/network-initiator.html [ Failure ]
   http/tests/inspector/resource-har-conversion.html [ Failure ]
   http/tests/inspector/resource-parameters.html [ Failure ]
-  http/tests/misc/policy-delegate-called-twice.html [ Failure ]
+  inspector-protocol/page/frameAttachedDetached.html [ Failure ]
+  inspector-protocol/page/frameStartedLoading.html [ Failure ]
+  inspector-protocol/runtime/runtime-execution-contexts-events.html [ Crash Timeout ]
+
+# https://crbug.com/576272: PlzNavigate: Navigation Timing API support
   http/tests/misc/resource-timing-iframe-restored-from-history.html [ Failure ]
+  http/tests/misc/timer-vs-loading.html [ Crash ]
   http/tests/misc/webtiming-cross-origin-and-back.html [ Failure ]
   http/tests/misc/webtiming-one-redirect.php [ Failure ]
   http/tests/misc/webtiming-two-redirects.php [ Failure ]
-  http/tests/misc/window-dot-stop.html [ Failure ]
-  http/tests/navigation/back-to-dynamic-iframe.html [ Failure ]
-  http/tests/navigation/back-to-redirect-with-frame.php [ Failure ]
-  http/tests/navigation/cross-origin-fragment-navigation-is-async.html [ Failure ]
-  http/tests/navigation/post-frames-goback1.html [ Failure ]
-  http/tests/navigation/post-goback-same-url.html [ Failure ]
-  http/tests/navigation/post-goback1.html [ Crash Failure ]
-  http/tests/navigation/redirect-on-reload-updates-history-item.html [ Failure ]
-  http/tests/navigation/same-origin-fragment-navigation-is-sync.html [ Failure ]
+  http/tests/w3c/webperf/approved/navigation-timing/html/test_navigation_type_reload.html [ Failure ]
+  http/tests/w3c/webperf/approved/navigation-timing/html/test_timing_attributes_order.html [ Failure ]
+  http/tests/w3c/webperf/approved/navigation-timing/html/test_timing_reload.html [ Failure ]
+  http/tests/w3c/webperf/approved/navigation-timing/html/test_timing_server_redirect.html [ Failure ]
+  http/tests/w3c/webperf/submission/Google/resource-timing/html/test_resource_redirects.html [ Failure ]
+  http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain_allow_timing.html [ Timeout ]
+  http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain.html [ Timeout ]
+  http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_with_timing_allow_origin.html [ Timeout ]
+  http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect.html [ Timeout ]
+  http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_same_origin_redirect.html [ Timeout ]
+  imported/web-platform-tests/web-animations/animation-timeline/document-timeline.html [ Failure ]
+
+# https://crbug.com/555418: Move `X-Frame-Options` and CSP's `frame-ancestor`
+# checks up out of the renderer.
+  http/tests/security/contentSecurityPolicy/1.1/child-src/frame-redirect-blocked.html [ Timeout ]
+  http/tests/security/contentSecurityPolicy/frame-src-redirect-blocked.html [ Timeout ]
+  http/tests/security/contentSecurityPolicy/redirect-does-not-match-paths.html [ Timeout ]
   http/tests/security/XFrameOptions/x-frame-options-allowall.html [ Failure ]
   http/tests/security/XFrameOptions/x-frame-options-deny-meta-tag-in-body.html [ Failure ]
   http/tests/security/XFrameOptions/x-frame-options-deny-meta-tag-parent-same-origin-allow.html [ Failure ]
@@ -89,177 +115,94 @@
   http/tests/security/XFrameOptions/x-frame-options-multiple-headers-sameorigin-allow.html [ Failure ]
   http/tests/security/XFrameOptions/x-frame-options-none.html [ Failure ]
   http/tests/security/XFrameOptions/x-frame-options-parent-same-origin-allow.html [ Failure ]
-  http/tests/security/contentSecurityPolicy/1.1/form-action-src-redirect-blocked.html [ Failure ]
-  http/tests/security/frame-loading-via-document-write.html [ Failure ]
-  http/tests/security/isolatedWorld/bypass-main-world-csp-iframes.html [ Failure ]
+
+# https://crbug.com/576270: Move mixed-content checks that happen during
+# navigation to the browser
   http/tests/security/mixedContent/insecure-iframe-in-main-frame.html [ Failure ]
+  http/tests/security/mixedContent/insecure-prefetch-in-main-frame.html [ Failure ]
+  http/tests/security/mixedContent/nonwebby-scheme-in-iframe-allowed.https.html [ Timeout Failure ]
   http/tests/security/mixedContent/redirect-http-to-https-iframe-in-main-frame.html [ Failure ]
   http/tests/security/mixedContent/redirect-https-to-http-iframe-in-main-frame.html [ Failure ]
+
+# https://crbug.com/576271: PlzNavigate: support insecure request upgrade
   http/tests/security/upgrade-insecure-requests/https-header-auxiliary.html [ Failure ]
   http/tests/security/upgrade-insecure-requests/https-header-nested.html [ Failure ]
+  http/tests/security/upgrade-insecure-requests/https-header-top-level.html [ Missing ]
   http/tests/security/w3c/cross-origin-objects.html [ Crash Timeout Failure ]
-  http/tests/security/xssAuditor/full-block-post-from-iframe.html [ Failure ]
-  http/tests/security/xssAuditor/post-from-iframe.html [ Failure ]
-  http/tests/security/xssAuditor/script-tag-post-control-char.html [ Failure ]
-  http/tests/security/xssAuditor/script-tag-post-null-char.html [ Failure ]
-  http/tests/security/xssAuditor/script-tag-post.html [ Failure ]
-  http/tests/security/xssAuditor/xss-filter-bypass-long-string.html [ Failure ]
-  http/tests/security/xssAuditor/xss-protection-parsing-01.html [ Failure ]
+
+# https://crbug.com/440463: Make ServiceWorker and PlzNavigate play well
+# together.
   http/tests/serviceworker/appcache-ordering-main.html [ Failure ]
-  virtual/pointerevent/fast/events/drag-file-crash.html [ Failure ]
-  virtual/pointerevent/fast/events/iframe-object-onload.html [ Failure ]
-  virtual/trustedeventsdefaultaction/fast/events/drag-file-crash.html [ Failure ]
-  virtual/trustedeventsdefaultaction/fast/events/iframe-object-onload.html [ Failure ]
+  http/tests/serviceworker/chromium/register-link-header.html [ Timeout ]
+  http/tests/serviceworker/chromium/sandboxed-iframe-navigator-serviceworker.html [ Failure ]
+  http/tests/serviceworker/fetch-request-fallback.html [ Failure ]
+  http/tests/serviceworker/request-end-to-end.html [ Failure ]
 
-# Regressions: Unexpected image-only failures (5)
-  editing/selection/iframe.html [ Failure ]
-
-# Regressions: Unexpected timeouts (47)
-  http/tests/appcache/fallback.html [ Timeout ]
-  http/tests/appcache/top-frame-2.html [ Timeout ]
-  http/tests/history/back-to-post.html [ Timeout ]
-  http/tests/inspector/extensions-network-redirect.html [ Timeout ]
-  http/tests/misc/window-open-then-write.html [ Timeout ]
+# Untriaged navigation
+  compositing/gestures/gesture-tapHighlight-simple-navigate.html [ Failure ]
+  fast/dom/location-new-window-no-crash.html [ Crash ]
+  fast/loader/document-destruction-within-unload.html [ Crash ]
+  fast/loader/main-document-url-for-non-http-loads.html [ Failure ]
+  fast/loader/scroll-position-restored-on-reload-at-load-event.html [ Failure ]
+  fast/loader/stateobjects/pushstate-with-fragment-urls-and-hashchange.html [ Crash Timeout ]
+  fast/loader/subframe-removes-itself.html [ Failure ]
+  http/tests/cache/iframe-304-crash.html [ Crash Failure ]
+  http/tests/cookies/same-site/popup-same-site-post.html [ Failure ]
+  http/tests/cookies/same-site/popup-same-site.html [ Failure ]
+  http/tests/loading/307-after-303-after-post.html [ Failure ]
+  http/tests/loading/bad-scheme-subframe.html [ Timeout ]
+  http/tests/loading/bad-server-subframe.html [ Failure ]
+  http/tests/loading/doc-write-sync-third-party-script-reload.html [ Failure ]
+  http/tests/loading/pdf-commit-load-callbacks.html [ Crash ]
+  http/tests/loading/promote-img-in-viewport-priority.html [ Failure ]
+  http/tests/loading/redirect-methods.html [ Crash Failure ]
+  http/tests/loading/redirect-with-no-location-crash.html [ Failure ]
+  http/tests/loading/slow-parsing-subframe.html [ Failure ]
+  http/tests/loading/text-content-type-with-binary-extension.html [ Timeout Failure ]
+  http/tests/navigation/back-to-redirect-with-frame.php [ Failure ]
+  http/tests/navigation/cross-origin-fragment-navigation-is-async.html [ Failure ]
   http/tests/navigation/forward-to-fragment-fires-onload.html [ Timeout ]
-  http/tests/navigation/history-back-across-form-submission-to-fragment.html [ Timeout ]
   http/tests/navigation/response204.html [ Timeout ]
+  http/tests/navigation/same-origin-fragment-navigation-is-sync.html [ Failure ]
   http/tests/navigation/scrollstate-after-http-equiv-refresh-fragment-identifier-2.html [ Timeout ]
   http/tests/navigation/scrollstate-after-http-equiv-refresh-fragment-identifier.html [ Timeout ]
   http/tests/navigation/scrollstate-after-http-equiv-refresh.html [ Timeout ]
   http/tests/navigation/scrollstate-after-location-reload.html [ Timeout ]
-  http/tests/security/contentSecurityPolicy/1.1/child-src/frame-redirect-blocked.html [ Timeout ]
-  http/tests/security/contentSecurityPolicy/frame-src-redirect-blocked.html [ Timeout ]
-  http/tests/security/contentSecurityPolicy/redirect-does-not-match-paths.html [ Timeout ]
-  http/tests/security/mixedContent/nonwebby-scheme-in-iframe-allowed.https.html [ Timeout Failure ]
 
-# Run 2
+# Untriaged security
+  http/tests/security/frame-loading-via-document-write.html [ Failure ]
+  http/tests/security/isolatedWorld/bypass-main-world-csp-iframes.html [ Failure ]
+  http/tests/security/xssAuditor/xss-filter-bypass-long-string.html [ Failure ]
+  http/tests/security/xssAuditor/xss-protection-parsing-01.html [ Failure ]
 
-# Regressions: Unexpected text-only failures (25)
-  fast/events/drag-file-crash.html [ Failure ]
-  fast/forms/submit-to-url-fragment.html [ Failure ]
-  fast/history/history-length-append-subframe-with-hash.html [ Failure ]
-  fast/history/same-document-iframes-changing-fragment.html [ Failure ]
-  fast/history/same-document-iframes-changing-pushstate.html [ Failure ]
-  fast/loader/form-state-restore-with-frames.html [ Failure ]
-  fast/loader/main-document-url-for-non-http-loads.html [ Failure ]
-  fast/loader/scroll-position-restored-on-reload-at-load-event.html [ Failure ]
-  fast/loader/subframe-removes-itself.html [ Failure ]
-  http/tests/loading/307-after-303-after-post.html [ Failure ]
-  http/tests/loading/promote-img-in-viewport-priority.html [ Failure ]
-  http/tests/loading/redirect-with-no-location-crash.html [ Failure ]
-  http/tests/loading/slow-parsing-subframe.html [ Failure ]
-  http/tests/serviceworker/fetch-request-fallback.html [ Failure ]
-  http/tests/serviceworker/request-end-to-end.html [ Failure ]
-  http/tests/w3c/webperf/approved/navigation-timing/html/test_navigation_type_reload.html [ Failure ]
-  http/tests/w3c/webperf/approved/navigation-timing/html/test_timing_attributes_order.html [ Failure ]
-  http/tests/w3c/webperf/approved/navigation-timing/html/test_timing_reload.html [ Failure ]
-  http/tests/w3c/webperf/approved/navigation-timing/html/test_timing_server_redirect.html [ Failure ]
-  http/tests/w3c/webperf/submission/Google/resource-timing/html/test_resource_redirects.html [ Failure ]
-  imported/web-platform-tests/html/browsers/history/the-history-interface/004.html [ Failure ]
-  imported/web-platform-tests/html/browsers/history/the-location-interface/security_location_0.sub.htm [ Failure ]
-  inspector-protocol/page/frameAttachedDetached.html [ Failure ]
-  inspector-protocol/page/frameStartedLoading.html [ Failure ]
-
-# Regressions: Unexpected image-only failures (1)
-  svg/custom/anchor-on-use.svg [ Failure ]
-
-# Regressions: Unexpected crashes (55)
-  fast/events/before-unload-return-value-from-listener.html [ Crash Failure ]
-  fast/events/drop-handler-should-not-stop-navigate.html [ Crash Failure ]
-  fast/frames/iframe-plugin-load-remove-document-crash.html [ Crash ]
-  fast/loader/recursive-before-unload-crash.html [ Crash Failure ]
-  fast/loader/reload-zero-byte-plugin.html [ Crash ]
-  fast/loader/stateobjects/pushstate-with-fragment-urls-and-hashchange.html [ Crash Timeout ]
-  fast/overflow/overflow-height-float-not-removed-crash.html [ Crash Timeout Failure ]
-  fast/overflow/overflow-height-float-not-removed-crash3.html [ Crash Timeout Failure ]
-  fast/table/giantCellspacing.html [ Crash Timeout Failure ]
-  fast/xmlhttprequest/null-document-xmlhttprequest-open.html [ Crash Timeout ]
-  http/tests/loading/bad-server-subframe.html [ Crash Timeout Failure ]
-  http/tests/loading/pdf-commit-load-callbacks.html [ Crash ]
-  http/tests/loading/redirect-methods.html [ Crash Failure ]
-  imported/web-platform-tests/html/browsers/browsing-the-web/history-traversal/popstate_event.html [ Crash Failure Timeout ]
-  imported/web-platform-tests/html/semantics/embedded-content/the-object-element/object-attributes.html [ Crash Timeout Failure ]
-
-# Regressions: Unexpected timeouts (21)
-  fast/forms/xss-auditor-doesnt-crash-on-post-submit.html [ Timeout ]
-  http/tests/loading/bad-scheme-subframe.html [ Timeout ]
-  http/tests/loading/text-content-type-with-binary-extension.html [ Timeout Failure ]
-  http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect.html [ Timeout ]
-  http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain.html [ Timeout ]
-  http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_chain_allow_timing.html [ Timeout ]
-  http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_with_timing_allow_origin.html [ Timeout ]
-  http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_same_origin_redirect.html [ Timeout ]
-  mhtml/multi_frames_contentid.mht [ Timeout Failure ]
-
-# Regressions: Unexpected image and text failures (6)
+# Untriaged other
+  css3/fonts/font-style-matching-7.html [ Failure ]
+  editing/selection/iframe.html [ Failure ]
+  fast/css/acid2-pixel.html [ Crash Timeout Failure ]
+  fast/css/acid2.html [ Crash Timeout Failure ]
   fast/css/preserve-user-specified-zoom-level-on-reload.html [ Failure ]
+  fast/dom/frame-loading-via-document-write.html [ Failure ]
+  fast/events/drag-file-crash.html [ Failure ]
+  fast/layout/scroll-anchoring/history-restore-anchors.html [ Failure ]
+  fast/overflow/overflow-height-float-not-removed-crash.html [ Failure ]
+  fast/overflow/overflow-height-float-not-removed-crash3.html [ Failure ]
+  fast/table/giantCellspacing.html [ Failure ]
+  http/tests/misc/policy-delegate-called-twice.html [ Failure ]
+  http/tests/misc/window-dot-stop.html [ Failure ]
+  http/tests/misc/window-open-then-write.html [ Timeout ]
+  imported/web-platform-tests/html/semantics/embedded-content/the-object-element/object-attributes.html [ Failure ]
+  imported/web-platform-tests/shadow-dom/untriaged/html-elements-in-shadow-trees/html-forms/test-003.html [ Failure ]
+  mhtml/multi_frames_contentid.mht [ Timeout Failure ]
+  plugins/object-onfocus-mutation-crash.html [ Timeout ]
+  svg/custom/anchor-on-use.svg [ Failure ]
   svg/dynamic-updates/SVGAElement-dom-href-attr.html [ Failure ]
   svg/dynamic-updates/SVGAElement-dom-target-attr.html [ Failure ]
   svg/dynamic-updates/SVGAElement-svgdom-href-prop.html [ Failure ]
   svg/dynamic-updates/SVGAElement-svgdom-target-prop.html [ Failure ]
-
-# Run 3
-
-# Regressions: Unexpected image-only failures (1)
-  compositing/gestures/gesture-tapHighlight-simple-navigate.html [ Failure ]
-
-# Update on 16-3-16
-
-# Regressions: Unexpected text-only failures (2)
-  http/tests/serviceworker/chromium/sandboxed-iframe-navigator-serviceworker.html [ Failure ]
-
-# Regressions: Unexpected crashes (2)
-  http/tests/cache/subresource-failover-to-network.html [ Crash ]
-
-# Regressions: Unexpected timeouts (5)
-  http/tests/serviceworker/chromium/register-link-header.html [ Timeout ]
-  inspector-protocol/runtime/runtime-execution-contexts-events.html [ Timeout ]
-  virtual/spv2/fast/overflow/overflow-height-float-not-removed-crash.html [ Timeout Failure ]
+  virtual/pointerevent/fast/events/drag-file-crash.html [ Failure ]
+  virtual/pointerevent/fast/events/iframe-object-onload.html [ Failure ]
+  virtual/spv2/fast/overflow/overflow-height-float-not-removed-crash.html [ Failure ]
   virtual/spv2/fast/overflow/overflow-height-float-not-removed-crash2.html [ Timeout ]
-  virtual/spv2/fast/overflow/overflow-height-float-not-removed-crash3.html [ Timeout Failure ]
-
-# Update on 16-3-17
-
-# Regressions: Unexpected timeouts (1)
-  imported/web-platform-tests/html/browsers/browsing-the-web/history-traversal/popstate_event.html [ Timeout ]
-
-# Update on 16-4-8
-
-# Regressions: Unexpected text-only failures (3)
-  http/tests/cookies/same-site/popup-same-site-post.html [ Failure ]
-  http/tests/cookies/same-site/popup-same-site.html [ Failure ]
-
-# Regressions: Unexpected crashes (3)
-  http/tests/security/contentSecurityPolicy/object-src-does-not-affect-child.html [ Crash ]
-  plugins/iframe-plugin-bgcolor.html [ Crash ]
-  plugins/plugin-document-back-forward.html [ Crash ]
-
-# Regressions: Unexpected timeouts (2)
-  plugins/object-onfocus-mutation-crash.html [ Timeout ]
-
-# Update on 16-4-14
-
-# Regressions: Unexpected text-only failures (2)
-  imported/web-platform-tests/web-animations/animation-timeline/document-timeline.html [ Failure ]
-
-# Update on 16-4-26
-
-# Regressions: Unexpected text-only failures (1)
-  http/tests/loading/doc-write-sync-third-party-script-reload.html [ Failure ]
-
-# Regressions: Unexpected crashes (6)
-  fast/events/before-unload-forbidden-navigation.html [ Crash ]
-  fast/forms/state-restore-skip-stateless.html [ Crash ]
-  fast/loader/document-destruction-within-unload.html [ Crash ]
-  http/tests/history/back-during-beforeunload.html [ Crash ]
-  http/tests/misc/timer-vs-loading.html [ Crash ]
-  virtual/trustedeventsdefaultaction/fast/events/before-unload-forbidden-navigation.html [ Crash ]
-
-# Update on 16-4-29
-
-# Regressions: Unexpected text-only failures (2)
-  fast/layout/scroll-anchoring/history-restore-anchors.html [ Failure ]
-  imported/web-platform-tests/shadow-dom/untriaged/html-elements-in-shadow-trees/html-forms/test-003.html [ Failure ]
-
-# Regressions: Unexpected crashes (1)
-  virtual/pointerevent/fast/events/before-unload-forbidden-navigation.html [ Crash ]
+  virtual/spv2/fast/overflow/overflow-height-float-not-removed-crash3.html [ Failure ]
+  virtual/trustedeventsdefaultaction/fast/events/drag-file-crash.html [ Failure ]
+  virtual/trustedeventsdefaultaction/fast/events/iframe-object-onload.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/site-per-process b/third_party/WebKit/LayoutTests/FlagExpectations/site-per-process
index 7f3c78f..53b5b2fb 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/site-per-process
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/site-per-process
@@ -24,14 +24,25 @@
 http/tests/security/xssAuditor/block-does-not-leak-referrer.html [ Failure ]
 http/tests/security/xssAuditor/full-block-script-tag-cross-domain.html [ Failure ]
 
-# https://crbug.com/582211 - sometimes XSS is not blocked
+# https://crbug.com/582211 - body of POST request is not delivered to XSSAuditor.
 http/tests/security/xssAuditor/full-block-post-from-iframe.html [ Failure ]
 http/tests/security/xssAuditor/xss-protection-parsing-01.html [ Failure ]
+http/tests/security/xssAuditor/post-from-iframe.html [ Failure ]
+http/tests/security/xssAuditor/script-tag-post.html [ Failure ]
+http/tests/security/xssAuditor/xss-filter-bypass-long-string.html [ Failure ]
+http/tests/security/xssAuditor/script-tag-post-control-char.html [ Failure ]
+http/tests/security/xssAuditor/script-tag-post-null-char.html [ Failure ]
 
 # https://crbug.com/582176 - InspectorTest.changeExecutionContext doesn't like OOPIFs.
 http/tests/inspector/console-cd-completions.html [ Failure ]
 http/tests/inspector/console-cd.html [ Failure ]
 
+# https://crbug.com/608015 - node.contentDocument is undefined.
+http/tests/inspector-protocol/access-inspected-object.html [ Failure Timeout ]
+
+# https://crbug.com/608023 - does injecting injections work with OOPIFs?
+http/tests/inspector/injected-script-for-origin.html [ Failure ]
+
 # https://crbug.com/554119 - Popup menu is in the wrong location.
 http/tests/webfont/popup-menu-load-webfont-after-open.html [ Failure ]
 
@@ -62,35 +73,29 @@
 #                            cross-origin-iframe.html layout test failure
 http/tests/bluetooth/https/requestDevice/cross-origin-iframe.html [ Failure ]
 
+# https://crbug.com/606594 - UaF of delegate_ in WebFrameTestClient::willSendRequest
+http/tests/local/serviceworker/fetch-request-body-file.html [ Failure Crash ]
+
+# https://crbug.com/607991 - MockWebClipboardImpl not replicated across OOPIFs.
+http/tests/misc/copy-resolves-urls.html [ Failure ]
+
+# https://crbug.com/607981 - trouble with application/x-blink-deprecated-test-plugin
+http/tests/plugins/cross-frame-object-access.html [ Failure ]
+
+# https://crbug.com/608780 - window.performance doesn't work with OOPIFs
+http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect.html [ Timeout ]
+http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_with_timing_allow_origin.html [ Timeout ]
+http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_resource_request.html [ Timeout ]
+http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_timing_allow_cross_origin_resource_request.html [ Timeout ]
+
 # TODO(alexmos,lukasza): Triage these failures and assign more specific bugs.
-
-# No repro (maybe flaky? maybe really fixed? maybe repros only in debug build?):
-http/tests/security/mixedContent/insecure-eventsource-in-main-frame.html [ Failure ]
-
 # Uninvestigated failures under http/tests/security:
-http/tests/security/cross-frame-access-enumeration.html [ Timeout ]
-http/tests/security/cross-frame-access-get-custom-property-cached.html [ Timeout ]
-http/tests/security/cross-frame-access-get.html [ Timeout ]
-http/tests/security/cross-frame-access-get-override.html [ Timeout ]
-http/tests/security/cross-frame-access-getOwnPropertyDescriptor.html [ Timeout ]
-http/tests/security/cross-frame-access-location-get.html [ Timeout ]
-http/tests/security/cross-frame-access-location-get-override.html [ Timeout ]
 http/tests/security/cross-origin-shared-worker-allowed.html [ Failure Timeout ]
 http/tests/security/cross-origin-worker-indexeddb-allowed.html [ Failure Timeout ]
 http/tests/security/frameNavigation/not-opener.html [ Timeout ]
 http/tests/security/frameNavigation/xss-DENIED-targeted-link-navigation.html [ Timeout ]
 http/tests/security/referrer-policy-redirect-link.html [ Timeout ]
-http/tests/security/xssAuditor/post-from-iframe.html [ Failure ]
-http/tests/security/xssAuditor/script-tag-post-control-char.html [ Failure ]
-http/tests/security/xssAuditor/script-tag-post.html [ Failure ]
-http/tests/security/xssAuditor/script-tag-post-null-char.html [ Failure ]
-http/tests/security/xssAuditor/xss-filter-bypass-long-string.html [ Failure ]
-
 # Uninvestigated failures under http/tests (but outside of http/tests/security):
-http/tests/appcache/remove-cache.html [ Failure ]
-http/tests/inspector-protocol/access-inspected-object.html [ Failure ]
-http/tests/inspector/injected-script-for-origin.html [ Failure ]
-http/tests/local/serviceworker/fetch-request-body-file.html [ Failure Crash ]
 http/tests/inspector-protocol/request-mixed-content-status-blockable.html [ Timeout ]
 http/tests/inspector-protocol/request-mixed-content-status-none.html [ Timeout ]
 http/tests/inspector-protocol/request-mixed-content-status-optionally-blockable.html [ Timeout ]
@@ -104,12 +109,6 @@
 http/tests/inspector/inspect-iframe-from-different-domain.html [ Timeout ]
 http/tests/intersection-observer/iframe-cross-origin.html [ Timeout ]
 http/tests/local/drag-over-remote-content.html [ Crash Timeout ]
-http/tests/misc/copy-resolves-urls.html [ Failure ]
 http/tests/navigation/redirect-on-back-updates-history-item.html [ Timeout ]
 http/tests/navigation/redirect-on-reload-updates-history-item.html [ Timeout ]
-http/tests/plugins/cross-frame-object-access.html [ Failure ]
 http/tests/serviceworker/http-to-https-redirect-and-register.html [ Timeout ]
-http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect.html [ Timeout ]
-http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_redirect_with_timing_allow_origin.html [ Timeout ]
-http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_cross_origin_resource_request.html [ Timeout ]
-http/tests/w3c/webperf/submission/Intel/resource-timing/test_resource_timing_timing_allow_cross_origin_resource_request.html [ Timeout ]
diff --git a/third_party/WebKit/LayoutTests/LeakExpectations b/third_party/WebKit/LayoutTests/LeakExpectations
index 18369c8a..944da77 100644
--- a/third_party/WebKit/LayoutTests/LeakExpectations
+++ b/third_party/WebKit/LayoutTests/LeakExpectations
@@ -166,3 +166,5 @@
 crbug.com/595155 intersection-observer/same-document-zero-size-target.html [ Leak ]
 crbug.com/595155 intersection-observer/timestamp.html [ Leak ]
 crbug.com/595155 intersection-observer/unclipped-root.html [ Leak ]
+
+crbug.com/608577 http/tests/security/link-crossorigin-stylesheet-no-cors.html [ Pass Text ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index e0669ad..0f13a8d 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -99,6 +99,7 @@
 crbug.com/593514 virtual/gpu/fast/canvas/OffscreenCanvas-transform-shadow-in-worker.html [ Failure ]
 crbug.com/593514 virtual/gpu/fast/canvas/OffscreenCanvas-2d-pattern-in-worker.html [ Failure ]
 crbug.com/593514 virtual/gpu/fast/canvas/OffscreenCanvas-2d-gradients-in-worker.html [ Failure ]
+crbug.com/593514 virtual/gpu/fast/canvas/OffscreenCanvas-2d-drawImage-in-worker.html [ Failure ]
 
 crbug.com/417782 [ Linux Win ] virtual/rootlayerscrolls/fast/scrolling/fractional-scroll-offset-fixed-position-non-composited.html [ Failure ]
 crbug.com/492664 [ Linux ] imported/csswg-test/css-writing-modes-3/box-offsets-rel-pos-vlr-005.xht [ Failure ]
@@ -184,7 +185,6 @@
 crbug.com/518987 http/tests/xmlhttprequest/navigation-abort-detaches-frame.html [ Pass Timeout ]
 crbug.com/518988 [ Win7 ] http/tests/xmlhttprequest/xmlhttprequest-50ms-download-dispatch.html [ Failure Pass ]
 crbug.com/518989 [ Mac ] imported/csswg-test/css-writing-modes-3/writing-mode-vertical-rl-002.xht [ Failure Pass Timeout ]
-crbug.com/518995 media/track/media-element-move-to-new-document-assert.html [ Failure Pass ]
 crbug.com/518998 media/video-poster-after-loadedmetadata.html [ Failure Pass ]
 
 # These performance-sensitive user-timing tests are flaky in debug on all platforms, and flaky on all configurations of windows.
@@ -419,7 +419,6 @@
 crbug.com/600618 virtual/spv2/svg/custom/object-sizing-no-width-height-change-content-box-size.xhtml [ Pass ]
 crbug.com/600618 virtual/spv2/svg/custom/svg-root-padding-left.html [ Pass ]
 crbug.com/600618 virtual/spv2/svg/custom/svg-root-padding-top.html [ Pass ]
-crbug.com/600618 virtual/spv2/svg/css/border-image-zoomed.html [ Pass ]
 crbug.com/600618 virtual/spv2/svg/css/max-height.html [ Pass ]
 crbug.com/600618 virtual/spv2/svg/css/max-width.html [ Pass ]
 
@@ -913,17 +912,14 @@
 crbug.com/574283 [ Mac ] virtual/threaded/fast/scroll-behavior/smooth-scroll/main-thread-scrolling-reason-added.html [ Skip ]
 crbug.com/574283 [ Mac ] virtual/threaded/fast/scroll-behavior/smooth-scroll/main-thread-scrolling-reason-correctness.html [ Skip ]
 crbug.com/574283 [ Mac ] virtual/threaded/fast/scroll-behavior/first-scroll-runs-on-compositor.html [ Skip ]
+crbug.com/574283 [ Mac ] virtual/threaded/fast/scroll-behavior/smooth-scroll/ongoing-smooth-scroll-anchors.html [ Skip ]
+crbug.com/574283 [ Mac ] virtual/scroll_customization/fast/scroll-behavior/smooth-scroll/ongoing-smooth-scroll-anchors.html [ Skip ]
+crbug.com/574283 [ Mac ] fast/scroll-behavior/smooth-scroll/ongoing-smooth-scroll-anchors.html [ Skip ]
 
 crbug.com/552556 [ Win Linux ] virtual/threaded/fast/scroll-behavior/overflow-scroll-root-frame-animates.html [ Pass Timeout ]
 crbug.com/552556 [ Win Linux ] virtual/threaded/fast/scroll-behavior/overflow-scroll-animates.html [ Pass Timeout ]
 crbug.com/552556 virtual/threaded/fast/scroll-behavior/smooth-scroll/mousewheel-scroll.html [ Pass Failure ]
 
-crbug.com/524596 paint/invalidation/composited-non-stacking-context-descendant-change-color.html [ Failure ]
-crbug.com/524596 paint/invalidation/composited-non-stacking-context-descendant-move.html [ Failure ]
-crbug.com/524596 paint/invalidation/fixed-position-descendant-paint-offset-indirect.html [ Failure ]
-crbug.com/524596 virtual/spv2/paint/invalidation/composited-non-stacking-context-descendant-move.html [ Skip ]
-crbug.com/524596 virtual/spv2/paint/invalidation/fixed-position-descendant-paint-offset-indirect.html [ Skip ]
-
 crbug.com/425113 svg/clip-path/clip-path-multiple-children.svg [ Failure ]
 
 crbug.com/480769 http/tests/inspector/service-workers/service-workers-redundant.html [ Crash Pass Failure ]
@@ -1309,7 +1305,7 @@
 crbug.com/602933 virtual/gpu/fast/canvas/canvas-incremental-repaint.html [ NeedsManualRebaseline ]
 crbug.com/602933 virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint.html [ NeedsManualRebaseline ]
 
-crbug.com/599975 [ Android ] media/video-autoplay.html [ Timeout ]
+crbug.com/599975 [ Android ] media/video-autoplay.html [ Crash Timeout ]
 
 # DocumentWriteEvaluator is still experimental
 crbug.com/599115 http/tests/preload/document-write [ Failure ]
@@ -1317,202 +1313,6 @@
 
 crbug.com/601669 [ Win ] svg/as-image/svg-nested.html [ Crash ]
 
-crbug.com/601166 [ Mac10.9 ]  fast/text-autosizing/tables/css-table-lots-of-text-many-cells.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text-autosizing/tables/css-table-single-cell-lots-of-text.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text-autosizing/tables/fixed-table-lots-of-text-many-cells.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text-autosizing/tables/fixed-table-single-cell-lots-of-text.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text-autosizing/tables/lots-of-text-many-cells.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text-autosizing/tables/narrow-percentage-width.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text-autosizing/tables/narrow-specified-width.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text-autosizing/tables/nested-table-wrapping.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text-autosizing/tables/nested-tables.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text-autosizing/tables/single-cell-lots-of-text.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text-autosizing/tables/single-percent-width-cell-lots-of-text.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text-autosizing/tables/table-cell-inflation.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text-autosizing/tables/table-for-layout.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text-autosizing/tables/wide-percentage-width.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text-autosizing/tables/wide-specified-width.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/aat-morx.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/atsui-kerning-and-ligatures.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/atsui-multiple-renderers.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/atsui-partial-selection.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/atsui-pointtooffset-calls-cg.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/atsui-rtl-override-selection.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/atsui-small-caps-punctuation-size.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/atsui-spacing-features.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/basic/002.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/basic/003.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/basic/004.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/basic/005.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/basic/006.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/basic/007.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/basic/008.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/basic/011.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/basic/012.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/basic/013.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/basic/014.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/basic/015.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/basic/generic-family-changes.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/bidi-embedding-pop-and-push-same.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/bidi-img-alt-text.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/break-word.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/capitalize-boundaries.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/capitalize-empty-generated-string.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/capitalize-preserve-nbsp.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/caps-lock-indicator-disabled.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/caps-lock-indicator-enabled.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/cg-fallback-bolding.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/complex-path-with-no-subpixel-fonts.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/complex-preferred-logical-widths.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/complex-synthetic-bold-space-width.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/complex-text-rtl-selection-repaint.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/delete-hard-break-character.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/drawBidiText.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/embed-at-end-of-pre-wrap-line.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/emoji-web-font.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/emoticons.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/emphasis-complex.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/emphasis.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/fake-italic.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/fallback-for-custom-font.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/firstline/001.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/firstline/002.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/firstline/003.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/font-ascent-mac.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/font-fallback.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/font-initial.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/font-smallcaps-layout.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/font-stretch-variant.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/font-stretch.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/font-weight-variant.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/font-weight.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/format-control.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/in-rendered-text-rtl.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/001.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/alef-connected.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-AN-after-L.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-AN-after-empty-run.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-CS-after-AN.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-L2-run-reordering.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-LDB-2-CSS.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-LDB-2-HTML.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-LDB-2-formatting-characters.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-control-chars-treated-as-ZWS.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-european-terminators.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-explicit-embedding.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-ignored-for-first-child-inline.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-innertext.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-layout-across-linebreak.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-linebreak-001.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-linebreak-002.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-linebreak-003.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-listbox-atsui.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-listbox.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-menulist.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-mirror-he-ar.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-neutral-directionality-paragraph-start.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-neutral-run.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bidi-override.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/bold-bengali.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/complex-character-based-fallback.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/danda-space.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/hebrew-vowels.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/hindi-spacing.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/hindi-whitespace.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/khmer-selection.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/lang-glyph-cache-separation.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/menulist-width-rtl.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/mixed-directionality-selection.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/plane2.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/pop-up-button-text-alignment-and-direction.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/rtl-caret.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/rtl-negative-letter-spacing.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/rtl-white-space-pre-wrap.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/text-spliced-font.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/thai-baht-space.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/thai-line-breaks.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/unicode-bidi-plaintext-in-textarea.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/unicode-bidi-plaintext.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/international/wrap-CJK-001.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/justified-selection-at-edge.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/justified-selection.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/justify-ideograph-complex.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/justify-ideograph-simple.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/justify-ideograph-vertical.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/large-text-composed-char.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/line-breaks-after-white-space.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/line-breaks.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/line-initial-and-final-swashes.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/midword-break-before-surrogate-pair.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/midword-break-hang.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/monospace-width-cache.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/reset-emptyRun.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/selection-hard-linebreak.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/selection-painting-hidpi.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/selection-rect-line-height-too-big.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/selection-rect-line-height-too-small.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/shadow-translucent-fill.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/shaping/same-script-different-lang.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/shaping/shaping-script-order.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/shaping/shaping-selection-rect.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/should-use-atsui.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/small-caps-turkish.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/softHyphen.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/text-letter-spacing.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/text-shadow-no-default-color.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/text-stroke-with-border.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/textIteratorNilRenderer.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/unicode-fallback-font.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/vertical-rl-rtl-linebreak.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/vertical-surrogate-pair.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/wbr-in-pre-crash.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/wbr-pre.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/wbr-styled.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/wbr.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/001.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/002.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/003.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/004.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/005.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/006.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/007.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/008.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/009.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/010.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/011.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/012.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/015.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/016.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/018.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/019.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/020.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/021.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/023.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/024.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/025.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/026.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/027.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/028.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/029.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/030.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/normal-after-nowrap-breaking.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/nowrap-clear-float.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/pre-newline-box-test.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/pre-wrap-last-char.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/pre-wrap-line-test.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/pre-wrap-overflow-selection.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/pre-wrap-spaces-after-newline.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/select-new-line-with-line-break-normal.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/whitespace/span-in-word-space-causes-overflow.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/wide-zero-width-space.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/word-break-run-rounding.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/word-break-soft-hyphen.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/word-break.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/word-space.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  fast/text/zero-font-size.html [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  ietestcenter/css3/text/textshadow-003.htm [ Failure ]
-crbug.com/601166 [ Mac10.9 ]  ietestcenter/css3/text/textshadow-004.htm [ Failure ]
-
 crbug.com/603507 [ Mac Win ] fast/table/split-table-section-before-anonymous-block-2.html [ NeedsManualRebaseline ]
 crbug.com/603507 [ Mac Win ] fast/table/split-table-section-before-anonymous-block-4.html [ NeedsManualRebaseline ]
 
@@ -1542,3 +1342,5 @@
 crbug.com/606302 [ Win7 ] transforms/3d/point-mapping/3d-point-mapping-preserve-3d.html [ Failure Pass ]
 
 crbug.com/606649 fast/dom/gc-dom-tree-lifetime.html [ Pass Timeout ]
+
+crbug.com/588705 inspector/console/console-proxy.html [ NeedsManualRebaseline ]
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService.html b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService.html
deleted file mode 100644
index 71a91d5..0000000
--- a/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService.html
+++ /dev/null
@@ -1,172 +0,0 @@
-<!DOCTYPE html>
-<script src="../resources/testharness.js"></script>
-<script src="../resources/testharnessreport.js"></script>
-<script src="../resources/bluetooth/bluetooth-helpers.js"></script>
-<script>
-'use strict'
-
-test(t => { assert_true(window.testRunner instanceof Object); t.done(); },
-     'window.testRunner is required for the following tests.');
-
-promise_test(() => {
-  return setBluetoothFakeAdapter('HeartRateAdapter')
-    .then(() => requestDeviceWithKeyDown({
-      filters: [{services: ['heart_rate']}],
-      optionalServices: ['generic_access']}))
-    .then(device => device.gatt.connect())
-    .then(gattServer => {
-      return setBluetoothFakeAdapter('EmptyAdapter')
-        .then(() => assert_promise_rejects_with_message(
-          gattServer.getPrimaryService('generic_access'),
-          new DOMException('Bluetooth Device is no longer in range.',
-                           'NetworkError'),
-          'Device went out of range.'));
-    });
-}, 'Device goes out of range. Reject with NetworkError.');
-
-promise_test(() => {
-  let expected = new DOMException('Service not found in device.',
-                                  'NotFoundError');
-  return setBluetoothFakeAdapter('HeartRateAdapter')
-    .then(() => requestDeviceWithKeyDown({
-      filters: [{services: ['heart_rate']}],
-      optionalServices: ['glucose']}))
-    .then(device => device.gatt.connect())
-    .then(gattServer => Promise.all(
-      [assert_promise_rejects_with_message(
-        gattServer.getPrimaryService(glucose.alias), expected),
-       assert_promise_rejects_with_message(
-         gattServer.getPrimaryService(glucose.name), expected),
-       assert_promise_rejects_with_message(
-         gattServer.getPrimaryService(glucose.uuid), expected)]));
-}, 'Request for wrong service. Reject with NotFoundError.');
-
-promise_test(() => {
-  return setBluetoothFakeAdapter('DelayedServicesDiscoveryAdapter')
-    .then(() => requestDeviceWithKeyDown({
-      filters: [{services: ['heart_rate']}]}))
-    .then(device => device.gatt.connect())
-    .then(gattServer => gattServer.getPrimaryService('heart_rate'))
-    .then(service => {
-      assert_equals(service.uuid, heart_rate.uuid);
-    });
-}, 'Request for service. Must return even when the services are not immediately discovered');
-
-promise_test(() => {
-  return setBluetoothFakeAdapter('DelayedServicesDiscoveryAdapter')
-    .then(() => requestDeviceWithKeyDown({
-      filters: [{services: ['heart_rate']}],
-      optionalServices: ['battery_service']}))
-    .then(device => device.gatt.connect())
-    .then(gattServer => {
-      return assert_promise_rejects_with_message(
-        gattServer.getPrimaryService('battery_service'),
-        new DOMException('Service not found in device.', 'NotFoundError'));
-    });
-}, 'Request for wrong service. Must reject with NotFoundError even when the services' +
-   ' are not immediately discovered');
-
-promise_test(() => {
-  let expected = new DOMException('Origin is not allowed to access the ' +
-                                  'service. Remember to add the service to a ' +
-                                  'filter or to optionalServices in ' +
-                                  'requestDevice().',
-                                  'SecurityError');
-  return setBluetoothFakeAdapter('HeartRateAdapter')
-    .then(() => requestDeviceWithKeyDown({
-      filters: [{services: ['heart_rate']}]}))
-    .then(device => device.gatt.connect())
-    .then(gattServer => Promise.all(
-      [assert_promise_rejects_with_message(
-        gattServer.getPrimaryService(glucose.alias), expected),
-       assert_promise_rejects_with_message(
-         gattServer.getPrimaryService(glucose.name), expected),
-       assert_promise_rejects_with_message(
-         gattServer.getPrimaryService(glucose.uuid), expected)]));
-}, 'Request for absent service without permission. Reject with SecurityError.');
-
-promise_test(() => {
-  let expected = new DOMException('Origin is not allowed to access the ' +
-                                  'service. Remember to add the service to a ' +
-                                  'filter or to optionalServices in ' +
-                                  'requestDevice().',
-                                  'SecurityError');
-  return setBluetoothFakeAdapter('HeartRateAdapter')
-    .then(() => requestDeviceWithKeyDown({
-      filters: [{services: ['heart_rate']}]}))
-    .then(device => device.gatt.connect())
-    .then(gattServer => Promise.all(
-      [assert_promise_rejects_with_message(
-        gattServer.getPrimaryService(generic_access.alias), expected),
-       assert_promise_rejects_with_message(
-         gattServer.getPrimaryService(generic_access.name), expected),
-       assert_promise_rejects_with_message(
-         gattServer.getPrimaryService(generic_access.uuid), expected)]));
-}, 'Request for present service without permission. Reject with SecurityError.');
-
-promise_test(function() {
-  return setBluetoothFakeAdapter('HeartRateAdapter')
-    .then(() => requestDeviceWithKeyDown({
-      filters: [{services: ['heart_rate']}],
-      optionalServices: ['generic_access']}))
-    .then(device => device.gatt.connect())
-    .then(gattServer => Promise.all(
-      [gattServer.getPrimaryService(generic_access.alias),
-       gattServer.getPrimaryService(generic_access.name),
-       gattServer.getPrimaryService(generic_access.uuid)]))
-    .then(services => {
-      services.forEach(service => {
-        assert_equals(service.uuid, generic_access.uuid,
-                      'Service UUID should be the same as requested UUID.');
-        assert_true(service.isPrimary,
-                    'getPrimaryService should return a primary service.');
-      });
-    });
-}, 'Request for service. Should return right service');
-
-promise_test(() => {
-  return setBluetoothFakeAdapter('HeartRateAdapter')
-    .then(() => requestDeviceWithKeyDown({
-      filters: [{services: ['heart_rate']}],
-      optionalServices: ['generic_access']}))
-    .then(device => device.gatt.connect())
-    .then(gattServer => Promise.all(
-      [gattServer.getPrimaryService(generic_access.alias),
-       gattServer.getPrimaryService(generic_access.alias),
-       gattServer.getPrimaryService(generic_access.name),
-       gattServer.getPrimaryService(generic_access.name),
-       gattServer.getPrimaryService(generic_access.uuid),
-       gattServer.getPrimaryService(generic_access.uuid)]))
-    .then(services => {
-      // getPrimaryService should return the same object if it was created
-      // earlier. https://crbug.com/495270
-      // TODO(ortuno): Change to assert_equals.
-      for (let i = 1; i < services.length; i++) {
-        assert_not_equals(services[0], services[i],
-                          'Should return the same service as the first call.');
-      }
-    });
-}, 'Calls to get the same service should return the same object.');
-
-promise_test(() => {
-  return setBluetoothFakeAdapter('HeartRateAdapter')
-    .then(() => requestDeviceWithKeyDown({
-      filters: [{services: ['heart_rate']}]}))
-    .then(device => device.gatt.connect())
-    .then(gattServer => {
-      return assert_promise_rejects_with_message(
-        gattServer.getPrimaryService('wrong_name'), new DOMException(
-          'Failed to execute \'getPrimaryService\' on ' +
-          '\'BluetoothRemoteGATTServer\': Invalid Service name: ' +
-          '\'wrong_name\'. ' +
-          'It must be a valid UUID alias (e.g. 0x1234), ' +
-          'UUID (lowercase hex characters e.g. ' +
-          '\'00001234-0000-1000-8000-00805f9b34fb\'), ' +
-          'or recognized standard name from ' +
-          'https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx' +
-          ' e.g. \'alert_notification\'.',
-          'SyntaxError'),
-        'Wrong Service name passed.');
-    });
-}, 'Wrong Service name. Reject with SyntaxError.');
-</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/delayed-discovery-no-permission-absent-service.html b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/delayed-discovery-no-permission-absent-service.html
new file mode 100644
index 0000000..a7fd196
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/delayed-discovery-no-permission-absent-service.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+promise_test(() => {
+  let expected = new DOMException('Origin is not allowed to access the ' +
+                                  'service. Remember to add the service to a ' +
+                                  'filter or to optionalServices in ' +
+                                  'requestDevice().',
+                                  'SecurityError');
+  return setBluetoothFakeAdapter('DelayedServicesDiscoveryAdapter')
+    .then(() => requestDeviceWithKeyDown({
+      filters: [{services: ['heart_rate']}]}))
+    .then(device => device.gatt.connect())
+    .then(gattServer => Promise.all([
+      assert_promise_rejects_with_message(
+        gattServer.getPrimaryService(glucose.alias), expected),
+      assert_promise_rejects_with_message(
+        gattServer.getPrimaryService(glucose.name), expected),
+      assert_promise_rejects_with_message(
+        gattServer.getPrimaryService(glucose.uuid), expected)]));
+}, 'Delayed services discovered, request for absent service without ' +
+   'permission. Reject with SecurityError.');
+</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/delayed-discovery-no-permission-present-service.html b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/delayed-discovery-no-permission-present-service.html
new file mode 100644
index 0000000..26b6fdd4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/delayed-discovery-no-permission-present-service.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+promise_test(() => {
+  let expected = new DOMException('Origin is not allowed to access the ' +
+                                  'service. Remember to add the service to a ' +
+                                  'filter or to optionalServices in ' +
+                                  'requestDevice().',
+                                  'SecurityError');
+  return setBluetoothFakeAdapter('DelayedServicesDiscoveryAdapter')
+    .then(() => requestDeviceWithKeyDown({
+      filters: [{services: ['heart_rate']}]}))
+    .then(device => device.gatt.connect())
+    .then(gattServer => Promise.all([
+      assert_promise_rejects_with_message(
+        gattServer.getPrimaryService(generic_access.alias), expected),
+      assert_promise_rejects_with_message(
+        gattServer.getPrimaryService(generic_access.name), expected),
+      assert_promise_rejects_with_message(
+        gattServer.getPrimaryService(generic_access.uuid), expected)]));
+}, 'Delayed service discovery, request for present service without ' +
+   'permission. Reject with SecurityError.');
+</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/delayed-discovery-service-found.html b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/delayed-discovery-service-found.html
new file mode 100644
index 0000000..e9bc6dc18
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/delayed-discovery-service-found.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+promise_test(() => {
+  return setBluetoothFakeAdapter('DelayedServicesDiscoveryAdapter')
+    .then(() => requestDeviceWithKeyDown({
+      filters: [{services: ['heart_rate']}]}))
+    .then(device => device.gatt.connect())
+    .then(gattServer => gattServer.getPrimaryService('heart_rate'))
+    .then(service => {
+      assert_equals(service.uuid, heart_rate.uuid);
+    });
+}, 'Request for service. Must return even when the services are not ' +
+   'immediately discovered');
+</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/delayed-discovery-service-not-found.html b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/delayed-discovery-service-not-found.html
new file mode 100644
index 0000000..26d8d4e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/delayed-discovery-service-not-found.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+promise_test(() => {
+  return setBluetoothFakeAdapter('DelayedServicesDiscoveryAdapter')
+    .then(() => requestDeviceWithKeyDown({
+      filters: [{services: ['heart_rate']}],
+      optionalServices: ['battery_service']}))
+    .then(device => device.gatt.connect())
+    .then(gattServer => {
+      return assert_promise_rejects_with_message(
+        gattServer.getPrimaryService('battery_service'),
+        new DOMException('Service not found in device.', 'NotFoundError'));
+    });
+}, 'Request for absent service. Must reject with NotFoundError even when the ' +
+   'services are not immediately discovered');
+</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/device-goes-out-of-range.html b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/device-goes-out-of-range.html
new file mode 100644
index 0000000..96d99cb
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/device-goes-out-of-range.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+promise_test(() => {
+  return setBluetoothFakeAdapter('HeartRateAdapter')
+    .then(() => requestDeviceWithKeyDown({
+      filters: [{services: ['heart_rate']}],
+      optionalServices: ['generic_access']}))
+    .then(device => device.gatt.connect())
+    .then(gattServer => {
+      return setBluetoothFakeAdapter('EmptyAdapter')
+        .then(() => assert_promise_rejects_with_message(
+          gattServer.getPrimaryService('generic_access'),
+          new DOMException('Bluetooth Device is no longer in range.',
+                           'NetworkError'),
+          'Device went out of range.'));
+    });
+}, 'Device goes out of range. Reject with NetworkError.');
+</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/get-same-service.html b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/get-same-service.html
new file mode 100644
index 0000000..9546182
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/get-same-service.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+promise_test(() => {
+  return setBluetoothFakeAdapter('HeartRateAdapter')
+    .then(() => requestDeviceWithKeyDown({
+      filters: [{services: ['heart_rate']}],
+      optionalServices: ['generic_access']}))
+    .then(device => device.gatt.connect())
+    .then(gattServer => Promise.all([
+      gattServer.getPrimaryService('generic_access'),
+      gattServer.getPrimaryService('generic_access')]))
+    .then(services => {
+      // getPrimaryService should return the same object if it was created
+      // earlier. https://crbug.com/495270
+      // TODO(ortuno): Change to assert_equals.
+      for (let i = 1; i < services.length; i++) {
+        assert_not_equals(services[0], services[i],
+                          'Should return the same service as the first call.');
+      }
+    });
+}, 'Calls to get the same service should return the same object.');
+</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/invalid-service-name.html b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/invalid-service-name.html
new file mode 100644
index 0000000..53f9cc2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/invalid-service-name.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+promise_test(() => {
+  return setBluetoothFakeAdapter('HeartRateAdapter')
+    .then(() => requestDeviceWithKeyDown({
+      filters: [{services: ['heart_rate']}]}))
+    .then(device => device.gatt.connect())
+    .then(gattServer => {
+      return assert_promise_rejects_with_message(
+        gattServer.getPrimaryService('wrong_name'), new DOMException(
+          'Failed to execute \'getPrimaryService\' on ' +
+          '\'BluetoothRemoteGATTServer\': Invalid Service name: ' +
+          '\'wrong_name\'. ' +
+          'It must be a valid UUID alias (e.g. 0x1234), ' +
+          'UUID (lowercase hex characters e.g. ' +
+          '\'00001234-0000-1000-8000-00805f9b34fb\'), ' +
+          'or recognized standard name from ' +
+          'https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx' +
+          ' e.g. \'alert_notification\'.',
+          'SyntaxError'),
+        'Wrong Service name passed.');
+    });
+}, 'Wrong Service name. Reject with SyntaxError.');
+</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/no-permission-absent-service.html b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/no-permission-absent-service.html
new file mode 100644
index 0000000..7eb214e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/no-permission-absent-service.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+promise_test(() => {
+  let expected = new DOMException('Origin is not allowed to access the ' +
+                                  'service. Remember to add the service to a ' +
+                                  'filter or to optionalServices in ' +
+                                  'requestDevice().',
+                                  'SecurityError');
+  return setBluetoothFakeAdapter('HeartRateAdapter')
+    .then(() => requestDeviceWithKeyDown({
+      filters: [{services: ['heart_rate']}]}))
+    .then(device => device.gatt.connect())
+    .then(gattServer => Promise.all([
+      assert_promise_rejects_with_message(
+        gattServer.getPrimaryService(glucose.alias), expected),
+      assert_promise_rejects_with_message(
+        gattServer.getPrimaryService(glucose.name), expected),
+      assert_promise_rejects_with_message(
+        gattServer.getPrimaryService(glucose.uuid), expected)]));
+}, 'Request for absent service without permission. Reject with SecurityError.');
+</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/no-permission-present-service.html b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/no-permission-present-service.html
new file mode 100644
index 0000000..eef2c1b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/no-permission-present-service.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+promise_test(() => {
+  let expected = new DOMException('Origin is not allowed to access the ' +
+                                  'service. Remember to add the service to a ' +
+                                  'filter or to optionalServices in ' +
+                                  'requestDevice().',
+                                  'SecurityError');
+  return setBluetoothFakeAdapter('HeartRateAdapter')
+    .then(() => requestDeviceWithKeyDown({
+      filters: [{services: ['heart_rate']}]}))
+    .then(device => device.gatt.connect())
+    .then(gattServer => Promise.all([
+      assert_promise_rejects_with_message(
+        gattServer.getPrimaryService(generic_access.alias), expected),
+      assert_promise_rejects_with_message(
+        gattServer.getPrimaryService(generic_access.name), expected),
+      assert_promise_rejects_with_message(
+        gattServer.getPrimaryService(generic_access.uuid), expected)]));
+}, 'Request for present service without permission. Reject with SecurityError.');
+</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/service-found.html b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/service-found.html
new file mode 100644
index 0000000..5cc2483569
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/service-found.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+promise_test(function() {
+  return setBluetoothFakeAdapter('HeartRateAdapter')
+    .then(() => requestDeviceWithKeyDown({
+      filters: [{services: ['heart_rate']}],
+      optionalServices: ['generic_access']}))
+    .then(device => device.gatt.connect())
+    .then(gattServer => Promise.all([
+      gattServer.getPrimaryService(generic_access.alias),
+      gattServer.getPrimaryService(generic_access.name),
+      gattServer.getPrimaryService(generic_access.uuid)]))
+    .then(services => {
+      services.forEach(service => {
+        assert_equals(service.uuid, generic_access.uuid,
+                      'Service UUID should be the same as requested UUID.');
+        assert_true(service.isPrimary,
+                    'getPrimaryService should return a primary service.');
+      });
+    });
+}, 'Request for service. Should return right service');
+</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/service-not-found.html b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/service-not-found.html
new file mode 100644
index 0000000..f9b9fb2f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/bluetooth/getPrimaryService/service-not-found.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/bluetooth/bluetooth-helpers.js"></script>
+<script>
+'use strict';
+promise_test(() => {
+  return setBluetoothFakeAdapter('HeartRateAdapter')
+    .then(() => requestDeviceWithKeyDown({
+      filters: [{services: ['heart_rate']}],
+      optionalServices: ['glucose']}))
+    .then(device => device.gatt.connect())
+    .then(gattServer => assert_promise_rejects_with_message(
+      gattServer.getPrimaryService('glucose'),
+      new DOMException('Service not found in device.',
+                       'NotFoundError')));
+}, 'Request for absent service. Reject with NotFoundError.');
+</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/idl-BluetoothDevice.html b/third_party/WebKit/LayoutTests/bluetooth/idl-BluetoothDevice.html
index a5af53c..c16752b 100644
--- a/third_party/WebKit/LayoutTests/bluetooth/idl-BluetoothDevice.html
+++ b/third_party/WebKit/LayoutTests/bluetooth/idl-BluetoothDevice.html
@@ -25,19 +25,9 @@
       var old_device_id = device.id;
       device.id = 'overwritten';
       device.name = 'overwritten';
-      device.deviceClass = 'overwritten';
-      device.vendorIDSource = 'overwritten';
-      device.vendorID = 'overwritten';
-      device.productID = 'overwritten';
-      device.productVersion = 'overwritten';
       device.uuids = 'overwritten';
       assert_equals(device.id, old_device_id);
       assert_equals(device.name, 'Heart Rate Device');
-      assert_equals(device.deviceClass, 0x1F00);
-      assert_equals(device.vendorIDSource, 'bluetooth');
-      assert_equals(device.vendorID, 0xFFFF);
-      assert_equals(device.productID, 1);
-      assert_equals(device.productVersion, 2);
       assert_equals(device.uuids.length, 1);
       assert_equals(device.uuids[0], heart_rate.uuid);
     });
diff --git a/third_party/WebKit/LayoutTests/css3/flexbox/bug605682.html b/third_party/WebKit/LayoutTests/css3/flexbox/bug605682.html
new file mode 100644
index 0000000..e6b6be1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/css3/flexbox/bug605682.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/check-layout-th.js"></script>
+
+<style>
+html, body {
+  margin: 0;
+  padding: 0;
+}
+
+.flexbox {
+  display: flex;
+  background: papayawhip;
+  width: 800px;
+}
+
+.flexbox > div {
+  width: 300px;
+  height: 300px;
+  margin: 0 auto;
+  background: olive;
+}
+
+.flexbox > div > div {
+  overflow-y: auto;
+  height: 50px;
+  visibility: hidden;
+}
+
+.elm {
+  height: 10px;
+}
+
+</style>
+<div id=log></div>
+
+<p>Below there should be a olive square <em>centered</em> inside a papayawhip box.</p>
+<div class="flexbox">
+    <div data-offset-x="250">
+        <div>
+            <div id="elm"></div>
+        </div>
+    </div>
+</div>
+<script>
+    document.body.offsetTop;
+    document.getElementById("elm").style.height = "800px";
+    checkLayout('.flexbox');
+</script>
diff --git a/third_party/WebKit/LayoutTests/cssom/cssvalue-comparison-expected.txt b/third_party/WebKit/LayoutTests/cssom/cssvalue-comparison-expected.txt
index cb81c29..96c8b29 100644
--- a/third_party/WebKit/LayoutTests/cssom/cssvalue-comparison-expected.txt
+++ b/third_party/WebKit/LayoutTests/cssom/cssvalue-comparison-expected.txt
@@ -61,9 +61,12 @@
 PASS Two CSSValues "italic" for property "font-style" are equal. 
 PASS Two CSSValues "oblique" for property "font-style" are equal. 
 PASS Two CSSValues "italic" and "oblique" for property "font-style" are not equal. 
-PASS Two CSSValues "small-caps" for property "font-variant" are equal. 
-PASS Two CSSValues "normal" for property "font-variant" are equal. 
-PASS Two CSSValues "small-caps" and "normal" for property "font-variant" are not equal. 
+PASS Two CSSValues "normal" for property "font-variant-ligatures" are equal. 
+PASS Two CSSValues "discretionary-ligatures" for property "font-variant-ligatures" are equal. 
+PASS Two CSSValues "normal" and "discretionary-ligatures" for property "font-variant-ligatures" are not equal. 
+PASS Two CSSValues "normal" for property "font-variant-caps" are equal. 
+PASS Two CSSValues "small-caps" for property "font-variant-caps" are equal. 
+PASS Two CSSValues "normal" and "small-caps" for property "font-variant-caps" are not equal. 
 PASS Two CSSValues "bold" for property "font-weight" are equal. 
 PASS Two CSSValues "bolder" for property "font-weight" are equal. 
 PASS Two CSSValues "bold" and "bolder" for property "font-weight" are not equal. 
diff --git a/third_party/WebKit/LayoutTests/cssom/cssvalue-comparison.html b/third_party/WebKit/LayoutTests/cssom/cssvalue-comparison.html
index e1516b25..5e0feb9e 100644
--- a/third_party/WebKit/LayoutTests/cssom/cssvalue-comparison.html
+++ b/third_party/WebKit/LayoutTests/cssom/cssvalue-comparison.html
@@ -48,7 +48,8 @@
                   {"border-image-slice" : ["1 2 3 4", "2 3 4 5"]}, // border image slice
                   {"cursor" : ["url(resources/greenbox.png) 0 0, pointer", "url(resources/cursor.png) 1 1, wait"]}, // cursor
                   {"font-style" : ["italic", "oblique"]}, // font
-                  {"font-variant" : ["small-caps", "normal"]}, // font
+                  {"font-variant-ligatures" : ["normal", "discretionary-ligatures"]}, // font
+                  {"font-variant-caps" : ["normal", "small-caps"]}, // font
                   {"font-weight" : ["bold", "bolder"]}, // font
                   {"font-stretch" : ["semi-condensed", "expanded"]}, // font
                   {"font-size" : ["12px", "8px"]}, // font
diff --git a/third_party/WebKit/LayoutTests/editing/pasteboard/data-transfer-items-expected.txt b/third_party/WebKit/LayoutTests/editing/pasteboard/data-transfer-items-expected.txt
index c31191d..d730dcb 100644
--- a/third_party/WebKit/LayoutTests/editing/pasteboard/data-transfer-items-expected.txt
+++ b/third_party/WebKit/LayoutTests/editing/pasteboard/data-transfer-items-expected.txt
@@ -21,5 +21,5 @@
 copy: items[0] value: Hello World!
 copy: items[1] value: <b>Hello World!
 paste: items[0] value: This file tests the basic functionality and properties of DataTransferItems. This test requires DRT.
-paste: items[1] value: <span style="color: rgb(0, 0, 0); font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">This file tests the basic functionality and properties of DataTransferItems. This test requires DRT.</span>
+paste: items[1] value: <span style="color: rgb(0, 0, 0); font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">This file tests the basic functionality and properties of DataTransferItems. This test requires DRT.</span>
 
diff --git a/third_party/WebKit/LayoutTests/editing/pasteboard/dragstart-contains-default-content-expected.txt b/third_party/WebKit/LayoutTests/editing/pasteboard/dragstart-contains-default-content-expected.txt
index 47ac196..c8e1a1e 100644
--- a/third_party/WebKit/LayoutTests/editing/pasteboard/dragstart-contains-default-content-expected.txt
+++ b/third_party/WebKit/LayoutTests/editing/pasteboard/dragstart-contains-default-content-expected.txt
@@ -9,7 +9,7 @@
 Test ID: selectionTest
 text/plain: Select some text in this box and drag it.
 text/url: 
-text/html: <span style="color: rgb(0, 0, 0); font-family: serif; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">Select some text in this box and drag it.</span>
+text/html: <span style="color: rgb(0, 0, 0); font-family: serif; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">Select some text in this box and drag it.</span>
 Test ID: imageTest
 text/plain: 
 text/url: 
diff --git a/third_party/WebKit/LayoutTests/editing/pasteboard/onpaste-text-html-expected.txt b/third_party/WebKit/LayoutTests/editing/pasteboard/onpaste-text-html-expected.txt
index 41fde09..54808cb 100644
--- a/third_party/WebKit/LayoutTests/editing/pasteboard/onpaste-text-html-expected.txt
+++ b/third_party/WebKit/LayoutTests/editing/pasteboard/onpaste-text-html-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE MESSAGE: line 21: text/plain: This test verifies that we can get text/html from the clipboard during an onpaste event. 
-CONSOLE MESSAGE: line 23: text/html: <span style="color: rgb(0, 0, 0); font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">This test verifies that we can get text/html from the clipboard during an onpaste event.<span class="Apple-converted-space"> </span></span>
+CONSOLE MESSAGE: line 23: text/html: <span style="color: rgb(0, 0, 0); font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">This test verifies that we can get text/html from the clipboard during an onpaste event.<span class="Apple-converted-space"> </span></span>
 This test verifies that we can get text/html from the clipboard during an onpaste event. This test requires DRT.
 Paste content in this div.This test verifies that we can get text/html from the clipboard during an onpaste event. 
 PASS
diff --git a/third_party/WebKit/LayoutTests/fast/backgrounds/mask-box-image-zoomed-expected.html b/third_party/WebKit/LayoutTests/fast/backgrounds/mask-box-image-zoomed-expected.html
new file mode 100644
index 0000000..2ab2bf4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/backgrounds/mask-box-image-zoomed-expected.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<style>
+body {
+    zoom: 2;
+    margin: 0;
+}
+div {
+    position: absolute;
+    top: 0;
+    left: 10px;
+    width: 80px;
+    height: 100px;
+    background-color: green;
+}
+</style>
+<div></div>
diff --git a/third_party/WebKit/LayoutTests/fast/backgrounds/mask-box-image-zoomed.html b/third_party/WebKit/LayoutTests/fast/backgrounds/mask-box-image-zoomed.html
new file mode 100644
index 0000000..2c6d36f7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/backgrounds/mask-box-image-zoomed.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<style>
+body {
+    zoom: 2;
+    margin: 0;
+}
+div {
+    -webkit-mask-box-image: -webkit-linear-gradient(left,
+        transparent, transparent 10px, black 10px,
+        black 90px, transparent 90px, transparent);
+    background: linear-gradient(0deg, green, green);
+    width: 100px;
+    height: 100px;
+}
+</style>
+<div></div>
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-2d-drawImage-in-worker-expected.html b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-2d-drawImage-in-worker-expected.html
new file mode 100644
index 0000000..23b776d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-2d-drawImage-in-worker-expected.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<body>
+<canvas id ='output' width='150' height='150'></canvas>
+<script>
+var aCanvas = document.getElementById('output');
+var ctx = aCanvas.getContext('2d');
+
+var patternCanvas = document.createElement('canvas');
+patternCanvas.width = 30;
+patternCanvas.height = 30;
+var patternCtx = patternCanvas.getContext('2d');        
+patternCtx.fillStyle = '#f00';                                                     
+patternCtx.fillRect(0, 0, 15, 15);                                              
+patternCtx.fillStyle = '#0f0';                                                     
+patternCtx.fillRect(15, 0, 15, 15);                                             
+patternCtx.fillStyle = '#00f';
+patternCtx.fillRect(0, 15, 15, 15);
+patternCtx.fillStyle = "#ff0";
+patternCtx.fillRect(15, 15, 15, 15);
+
+ctx.drawImage(patternCanvas, 0, 0);
+ctx.drawImage(patternCanvas, 30, 30);
+// stretch the image
+ctx.drawImage(patternCanvas, 8, 8, 15, 15, 60, 60, 60, 60);
+// reduce the image
+ctx.drawImage(patternCanvas, 8, 8, 15, 15, 120, 120, 15, 15);
+</script>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-2d-drawImage-in-worker.html b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-2d-drawImage-in-worker.html
new file mode 100644
index 0000000..c91c4e9e5
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/canvas/OffscreenCanvas-2d-drawImage-in-worker.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html>
+<body>
+<canvas id='output' width='150' height='150'></canvas>
+<script id='myWorker' type='text/worker'>
+self.onmessage = function(e) {
+    var aCanvas = new OffscreenCanvas(150, 150);
+    var ctx = aCanvas.getContext('2d');
+   
+    ctx.drawImage(e.data, 0, 0);
+    ctx.drawImage(e.data, 30, 30);
+    // stretch the image
+    ctx.drawImage(e.data, 8, 8, 15, 15, 60, 60, 60, 60);
+    // reduce the image
+    ctx.drawImage(e.data, 8, 8, 15, 15, 120, 120, 15, 15);
+
+    var image = aCanvas.transferToImageBitmap();
+    self.postMessage(image, [image]);
+};
+</script>
+<script>
+if (window.testRunner) {
+  testRunner.waitUntilDone();
+}
+
+var patternCanvas = document.createElement('canvas');
+patternCanvas.width = 30;
+patternCanvas.height = 30;
+var patternCtx = patternCanvas.getContext('2d');        
+patternCtx.fillStyle = '#f00';                                                     
+patternCtx.fillRect(0, 0, 15, 15);                                              
+patternCtx.fillStyle = '#0f0';                                                     
+patternCtx.fillRect(15, 0, 15, 15);                                             
+patternCtx.fillStyle = '#00f';
+patternCtx.fillRect(0, 15, 15, 15);
+patternCtx.fillStyle = "#ff0";
+patternCtx.fillRect(15, 15, 15, 15);
+createImageBitmap(patternCanvas).then(consumeImageBitmap);
+
+function consumeImageBitmap(patternImage) {
+    var blob = new Blob([document.getElementById('myWorker').textContent]);
+    var worker = new Worker(URL.createObjectURL(blob));
+    worker.addEventListener('message', msg => {
+      var outputCtx = document.getElementById('output').getContext('bitmaprenderer');
+      outputCtx.transferFromImageBitmap(msg.data);
+      if (window.testRunner) {
+        testRunner.notifyDone();
+      }
+    });
+    worker.postMessage(patternImage, [patternImage]);
+}
+</script>
+</body>
+
diff --git a/third_party/WebKit/LayoutTests/fast/css/font-property-priority-expected.txt b/third_party/WebKit/LayoutTests/fast/css/font-property-priority-expected.txt
index 2f5b1b4..5f81302 100644
--- a/third_party/WebKit/LayoutTests/fast/css/font-property-priority-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css/font-property-priority-expected.txt
@@ -1,6 +1,7 @@
 Test for rdar://problem/6065547 REGRESSION (r34879): "Subject" in unread emails in Yahoo mail is not shown in bold.
 
 Property 'font-weight' has priority 'important'.
-Property 'font-variant' has priority 'important'.
+Property 'font-variant-ligatures' has priority 'important'.
+Property 'font-variant-caps' has priority 'important'.
 Property 'font-style' has priority 'important'.
 
diff --git a/third_party/WebKit/LayoutTests/fast/css/font-shorthand-expected.txt b/third_party/WebKit/LayoutTests/fast/css/font-shorthand-expected.txt
index b6579704..8080552 100644
--- a/third_party/WebKit/LayoutTests/fast/css/font-shorthand-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css/font-shorthand-expected.txt
@@ -1,6 +1,7 @@
 Longhands for font: 12px monospace
 font-style: normal
-font-variant: normal
+font-variant-caps: normal
+font-variant-ligatures: normal
 font-weight: normal
 font-stretch: normal
 font-size: 12px
@@ -9,7 +10,8 @@
 
 Longhands for font: 12px/24px serif
 font-style: normal
-font-variant: normal
+font-variant-caps: normal
+font-variant-ligatures: normal
 font-weight: normal
 font-stretch: normal
 font-size: 12px
@@ -18,7 +20,8 @@
 
 Longhands for font: normal 12px serif
 font-style: normal
-font-variant: normal
+font-variant-caps: normal
+font-variant-ligatures: normal
 font-weight: normal
 font-stretch: normal
 font-size: 12px
@@ -27,7 +30,8 @@
 
 Longhands for font: normal normal 12px serif
 font-style: normal
-font-variant: normal
+font-variant-caps: normal
+font-variant-ligatures: normal
 font-weight: normal
 font-stretch: normal
 font-size: 12px
@@ -36,7 +40,8 @@
 
 Longhands for font: normal normal normal 12px serif
 font-style: normal
-font-variant: normal
+font-variant-caps: normal
+font-variant-ligatures: normal
 font-weight: normal
 font-stretch: normal
 font-size: 12px
@@ -45,7 +50,8 @@
 
 Longhands for font: italic small-caps 12px/24px serif
 font-style: italic
-font-variant: small-caps
+font-variant-caps: small-caps
+font-variant-ligatures: normal
 font-weight: normal
 font-stretch: normal
 font-size: 12px
@@ -54,7 +60,8 @@
 
 Longhands for font: italic bold 12px/24px serif
 font-style: italic
-font-variant: normal
+font-variant-caps: normal
+font-variant-ligatures: normal
 font-weight: bold
 font-stretch: normal
 font-size: 12px
@@ -63,7 +70,8 @@
 
 Longhands for font: small-caps bold 14px/28px Arial, sans-serif
 font-style: normal
-font-variant: small-caps
+font-variant-caps: small-caps
+font-variant-ligatures: normal
 font-weight: bold
 font-stretch: normal
 font-size: 14px
@@ -72,7 +80,8 @@
 
 Longhands for font: italic small-caps bold 14px/28px Arial, sans-serif
 font-style: italic
-font-variant: small-caps
+font-variant-caps: small-caps
+font-variant-ligatures: normal
 font-weight: bold
 font-stretch: normal
 font-size: 14px
@@ -85,7 +94,8 @@
 font-size
 font-family
 font-stretch
-font-variant
+font-variant-caps
+font-variant-ligatures
 line-height
 
 Longhands for font: icon
@@ -94,7 +104,8 @@
 font-size
 font-family
 font-stretch
-font-variant
+font-variant-caps
+font-variant-ligatures
 line-height
 
 Longhands for font: menu
@@ -103,7 +114,8 @@
 font-size
 font-family
 font-stretch
-font-variant
+font-variant-caps
+font-variant-ligatures
 line-height
 
 Longhands for font: message-box
@@ -112,7 +124,8 @@
 font-size
 font-family
 font-stretch
-font-variant
+font-variant-caps
+font-variant-ligatures
 line-height
 
 Longhands for font: small-caption
@@ -121,7 +134,8 @@
 font-size
 font-family
 font-stretch
-font-variant
+font-variant-caps
+font-variant-ligatures
 line-height
 
 Longhands for font: status-bar
@@ -130,7 +144,8 @@
 font-size
 font-family
 font-stretch
-font-variant
+font-variant-caps
+font-variant-ligatures
 line-height
 
 Longhands for font: -webkit-mini-control
@@ -139,7 +154,8 @@
 font-size
 font-family
 font-stretch
-font-variant
+font-variant-caps
+font-variant-ligatures
 line-height
 
 Longhands for font: -webkit-small-control
@@ -148,7 +164,8 @@
 font-size
 font-family
 font-stretch
-font-variant
+font-variant-caps
+font-variant-ligatures
 line-height
 
 Longhands for font: -webkit-control
@@ -157,7 +174,8 @@
 font-size
 font-family
 font-stretch
-font-variant
+font-variant-caps
+font-variant-ligatures
 line-height
 
 Longhands for font: italic small-caps bold 12px/24px
diff --git a/third_party/WebKit/LayoutTests/fast/css/font-shorthand-from-longhands-expected.txt b/third_party/WebKit/LayoutTests/fast/css/font-shorthand-from-longhands-expected.txt
index 5a5f293..9dbe5f5 100644
--- a/third_party/WebKit/LayoutTests/fast/css/font-shorthand-from-longhands-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css/font-shorthand-from-longhands-expected.txt
@@ -26,8 +26,15 @@
 PASS computedStyle.font is 'italic small-caps bold ultra-expanded 20px / 40px sans-serif'
 PASS checkFontStyleValue() is true
 PASS style.font is ''
+PASS computedStyle.font is ''
+PASS style.font is 'italic small-caps bold ultra-expanded 20px/40px sans-serif'
+PASS computedStyle.font is 'italic small-caps bold ultra-expanded 20px / 40px sans-serif'
+PASS style.font is ''
 PASS computedStyle.font is 'normal normal normal normal 16px / normal foobar'
 PASS checkFontStyleValue() is true
+PASS style.fontVariantCaps is 'all-small-caps'
+PASS computedStyle.font is ''
+PASS style.font is ''
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/fast/css/font-shorthand-from-longhands.html b/third_party/WebKit/LayoutTests/fast/css/font-shorthand-from-longhands.html
index 92c584d..eada5ce3 100644
--- a/third_party/WebKit/LayoutTests/fast/css/font-shorthand-from-longhands.html
+++ b/third_party/WebKit/LayoutTests/fast/css/font-shorthand-from-longhands.html
@@ -72,11 +72,26 @@
 shouldBe("computedStyle.font", "'italic small-caps bold ultra-expanded 20px / 40px sans-serif'");
 shouldBe("checkFontStyleValue()", "true");
 
+style.fontVariantLigatures = "discretionary-ligatures";
+// Shorthand cannot be built because of non-normal ligatures value.
+shouldBe("style.font", "''");
+shouldBe("computedStyle.font", "''");
+// Reset for next test.
+style.fontVariantLigatures = "normal";
+shouldBe("style.font", "'italic small-caps bold ultra-expanded 20px/40px sans-serif'");
+shouldBe("computedStyle.font", "'italic small-caps bold ultra-expanded 20px / 40px sans-serif'");
+
 style.font = "";
 shouldBe("style.font", "''");
 shouldBe("computedStyle.font", "'normal normal normal normal 16px / normal foobar'");
 shouldBe("checkFontStyleValue()", "true");
 
+style.fontVariantCaps = "all-small-caps";
+shouldBe("style.fontVariantCaps", "'all-small-caps'");
+// Font shorthand is reset to empty string since all-small-caps cannot be represented.
+shouldBe("computedStyle.font", "''");
+shouldBe("style.font", "''");
+
 document.body.removeChild(testContainer);
 </script>
 </body>
diff --git a/third_party/WebKit/LayoutTests/fast/css/font-variant-shorthand-from-longhands-expected.txt b/third_party/WebKit/LayoutTests/fast/css/font-variant-shorthand-from-longhands-expected.txt
new file mode 100644
index 0000000..24e588e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/css/font-variant-shorthand-from-longhands-expected.txt
@@ -0,0 +1,22 @@
+Test the return values for the font variant properties on the style object.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS style.fontVariant is ""
+PASS computedStyle.fontVariant is "normal"
+PASS style.fontVariant is ""
+PASS computedStyle.fontVariant is "small-caps"
+PASS style.fontVariant is "discretionary-ligatures small-caps"
+PASS computedStyle.fontVariant is "discretionary-ligatures small-caps"
+PASS style.fontVariant is "discretionary-ligatures"
+PASS computedStyle.fontVariant is "discretionary-ligatures"
+PASS style.fontVariant is "small-caps"
+PASS computedStyle.fontVariant is "small-caps"
+PASS style.fontVariant is "no-common-ligatures no-discretionary-ligatures no-historical-ligatures no-contextual small-caps"
+PASS computedStyle.fontVariant is "no-common-ligatures no-discretionary-ligatures no-historical-ligatures no-contextual small-caps"
+PASS style.fontVariant is "initial"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/third_party/WebKit/LayoutTests/fast/css/font-variant-shorthand-from-longhands.html b/third_party/WebKit/LayoutTests/fast/css/font-variant-shorthand-from-longhands.html
new file mode 100644
index 0000000..842a79a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/css/font-variant-shorthand-from-longhands.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<body>
+<script src="../../resources/js-test.js"></script>
+<script>
+description("Test the return values for the font variant properties on the style object.")
+
+var testContainer = document.createElement("div");
+document.body.appendChild(testContainer);
+
+testContainer.innerHTML = '<div id="testElement">hello</div>';
+var style = testElement.style;
+var computedStyle = getComputedStyle(testElement);
+
+// We need all font longhands to build the shorthand.
+shouldBeEqualToString("style.fontVariant", "");
+shouldBeEqualToString("computedStyle.fontVariant", "normal");
+
+style.fontVariantCaps = "small-caps";
+shouldBeEqualToString("style.fontVariant", "");
+shouldBeEqualToString("computedStyle.fontVariant", "small-caps");
+
+style.fontVariantLigatures = "discretionary-ligatures";
+// All currently supported sub-properties are set.
+shouldBeEqualToString("style.fontVariant", "discretionary-ligatures small-caps");
+shouldBeEqualToString("computedStyle.fontVariant", "discretionary-ligatures small-caps");
+
+style.fontVariantCaps = "normal";
+shouldBeEqualToString("style.fontVariant", "discretionary-ligatures");
+shouldBeEqualToString("computedStyle.fontVariant", "discretionary-ligatures");
+
+style.fontVariantCaps = "small-caps";
+style.fontVariantLigatures = "normal";
+shouldBeEqualToString("style.fontVariant", "small-caps");
+shouldBeEqualToString("computedStyle.fontVariant", "small-caps");
+
+style.fontVariantLigatures = "none";
+shouldBeEqualToString("style.fontVariant", "no-common-ligatures no-discretionary-ligatures no-historical-ligatures no-contextual small-caps");
+shouldBeEqualToString("computedStyle.fontVariant", "no-common-ligatures no-discretionary-ligatures no-historical-ligatures no-contextual small-caps");
+
+style.fontVariantCaps = "initial";
+style.fontVariantLigatures = "initial";
+shouldBeEqualToString("style.fontVariant", "initial");
+
+document.body.removeChild(testContainer);
+</script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/fast/css/fontfaceset-download-error.html b/third_party/WebKit/LayoutTests/fast/css/fontfaceset-download-error.html
index 5a87246..d27d0f4 100644
--- a/third_party/WebKit/LayoutTests/fast/css/fontfaceset-download-error.html
+++ b/third_party/WebKit/LayoutTests/fast/css/fontfaceset-download-error.html
@@ -5,7 +5,7 @@
 /* Test 1: Invalid font data */
 @font-face {
     font-family: myfont1;
-    src: url('resources/invalidfont.png') format(opentype);
+    src: url('resources/invalidfont.png') format("opentype");
 }
 
 /* Test 2: Download error */
@@ -17,7 +17,7 @@
 /* Test 3: Empty data url */
 @font-face {
     font-family: myfont3;
-    src: url(data:application/x-truetype-font,) format(truetype);
+    src: url(data:application/x-truetype-font,) format("truetype");
 }
 
 /* Test 4: Download error followed by existing local font */
@@ -29,7 +29,7 @@
 /* Test 5: Multiple errors */
 @font-face {
     font-family: myfont5;
-    src: url('resources/DownLoadErrorAhem.otf'), url(data:application/x-truetype-font,) format(truetype);
+    src: url('resources/DownLoadErrorAhem.otf'), url(data:application/x-truetype-font,) format("truetype");
 }
 </style>
 <script>
diff --git a/third_party/WebKit/LayoutTests/fast/css/fontfaceset-multiple-families.html b/third_party/WebKit/LayoutTests/fast/css/fontfaceset-multiple-families.html
index bd4358f..671e3105 100644
--- a/third_party/WebKit/LayoutTests/fast/css/fontfaceset-multiple-families.html
+++ b/third_party/WebKit/LayoutTests/fast/css/fontfaceset-multiple-families.html
@@ -15,12 +15,12 @@
 
 @font-face {
     font-family: TestFont3;
-    src: url(data:application/x-truetype-font,) format(truetype);
+    src: url(data:application/x-truetype-font,) format("truetype");
 }
 
 @font-face {
     font-family: TestFont4;
-    src: url(data:application/xml,) format(svg);
+    src: url(data:application/xml,) format("svg");
 }
 </style>
 <script>
diff --git a/third_party/WebKit/LayoutTests/fast/css/variables/computed-style.html b/third_party/WebKit/LayoutTests/fast/css/variables/computed-style.html
index 661ecdf..da64b01 100644
--- a/third_party/WebKit/LayoutTests/fast/css/variables/computed-style.html
+++ b/third_party/WebKit/LayoutTests/fast/css/variables/computed-style.html
@@ -22,6 +22,10 @@
   --percentage-value: 75%;
   width: var(--percentage-value);
 }
+
+#dynamic.dynamic {
+  --custom-value:pass;
+}
 </style>
 
 <body>
@@ -29,6 +33,7 @@
   <div id="float_pixel"></div>
   <div id="em"></div>
   <div id="percentage"></div>
+  <div id="dynamic"></div>
 </body>
 
 <script>
@@ -53,4 +58,10 @@
   assert_equals(
     getComputedStyle(percentage).width, parseInt(getComputedStyle(document.body).width) * 0.75 + 'px');
 }, 'width property, percentage value');
+
+test(function() {
+  assert_equals(getComputedStyle(dynamic).getPropertyValue("--custom-value"), "");
+  dynamic.className = "dynamic";
+  assert_equals(getComputedStyle(dynamic).getPropertyValue("--custom-value"), "pass");
+}, 'custom property, forced style recalc');
 </script>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/ChildNode/after.html b/third_party/WebKit/LayoutTests/fast/dom/ChildNode/after.html
new file mode 100644
index 0000000..77750e51
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/dom/ChildNode/after.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<script>
+
+test(function () {
+    var child = document.createElement('p');
+    assert_true('after' in child);
+    var after = 'mine';
+    var getAttribute = 'mine';
+    with (child) {
+        assert_true(after === 'mine');
+        assert_false(getAttribute === 'mine');
+    }
+    assert_true('Symbol' in window);
+    var unscopables = Object.getPrototypeOf(child)[Symbol.unscopables];
+    assert_true(unscopables.after);
+}, 'ChildNode.after() unscopeable');
+
+function test_after(nodeName) {
+    var child;
+    var innerHTML;
+    if (nodeName == 'Comment') {
+        child = document.createComment('test');
+        innerHTML = '<!--test-->';
+    } else if (nodeName == 'Element') {
+        child = document.createElement('test');
+        innerHTML = '<test></test>';
+    } else {
+        child = document.createTextNode('test');
+        innerHTML = 'test';
+    }
+
+    test(function() {
+        var parent = document.createElement('div');
+        parent.appendChild(child);
+        child.after();
+        assert_equals(parent.innerHTML, innerHTML);
+    }, nodeName + '.after() without any argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        parent.appendChild(child);
+        child.after(null);
+        var expected = innerHTML + 'null';
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.after() with null as an argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        parent.appendChild(child);
+        child.after(undefined);
+        var expected = innerHTML + 'undefined';
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.after() with undefined as an argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        parent.appendChild(child);
+        child.after('');
+        assert_equals(parent.lastChild.data, '');
+    }, nodeName + '.after() with the empty string as an argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        parent.appendChild(child);
+        child.after('text');
+        var expected = innerHTML + 'text';
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.after() with only text as an argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        var x = document.createElement('x');
+        parent.appendChild(child);
+        child.after(x);
+        var expected = innerHTML + '<x></x>';
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.after() with only one element as an argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        var x = document.createElement('x');
+        parent.appendChild(child);
+        child.after(x, 'text');
+        var expected = innerHTML + '<x></x>text';
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.after() with one element and text as arguments.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        parent.appendChild(child);
+        child.after('text', child);
+        var expected = 'text' + innerHTML;
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.after() with context object itself as the argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        var x = document.createElement('x');
+        var y = document.createElement('y');
+        var z = document.createElement('z');
+        parent.appendChild(y);
+        parent.appendChild(child);
+        parent.appendChild(x);
+        child.after(x, y, z);
+        var expected = innerHTML + '<x></x><y></y><z></z>';
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.after() with all siblings of child as arguments.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        var x = document.createElement('x');
+        var y = document.createElement('y');
+        parent.appendChild(child);
+        parent.appendChild(x);
+        parent.appendChild(y);
+        child.after(y, x);
+        var expected = innerHTML + '<y></y><x></x>';
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.after() when pre-insert behaves like append.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        var x = document.createElement('x');
+        var y = document.createElement('y');
+        parent.appendChild(child);
+        parent.appendChild(x);
+        parent.appendChild(document.createTextNode('1'));
+        parent.appendChild(y);
+        child.after(x, '2');
+        var expected = innerHTML + '<x></x>21<y></y>';
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.after() with one sibling of child and text as arguments.');
+
+    test(function() {
+        var x = document.createElement('x');
+        var y = document.createElement('y');
+        x.after(y);
+        assert_equals(x.nextSibling, null);
+    }, nodeName + '.after() on a child without any parent.');
+}
+
+test_after('Comment');
+test_after('Element');
+test_after('Text');
+
+</script>
+</html>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/ChildNode/before.html b/third_party/WebKit/LayoutTests/fast/dom/ChildNode/before.html
new file mode 100644
index 0000000..ea4b827
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/dom/ChildNode/before.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<script>
+
+test(function () {
+    var child = document.createElement('p');
+    assert_true('before' in child);
+    var before = 'mine';
+    var getAttribute = 'mine';
+    with (child) {
+        assert_true(before === 'mine');
+        assert_false(getAttribute === 'mine');
+    }
+    assert_true('Symbol' in window);
+    var unscopables = Object.getPrototypeOf(child)[Symbol.unscopables];
+    assert_true(unscopables.before);
+}, 'ChildNode.before() unscopeable');
+
+function test_before(nodeName) {
+    var child;
+    var innerHTML;
+    if (nodeName == 'Comment') {
+        child = document.createComment('test');
+        innerHTML = '<!--test-->';
+    } else if (nodeName == 'Element') {
+        child = document.createElement('test');
+        innerHTML = '<test></test>';
+    } else {
+        child = document.createTextNode('test');
+        innerHTML = 'test';
+    }
+
+    test(function() {
+        var parent = document.createElement('div');
+        parent.appendChild(child);
+        child.before();
+        assert_equals(parent.innerHTML, innerHTML);
+    }, nodeName + '.before() without any argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        parent.appendChild(child);
+        child.before(null);
+        var expected = 'null' + innerHTML;
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.before() with null as an argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        parent.appendChild(child);
+        child.before(undefined);
+        var expected = 'undefined' + innerHTML;
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.before() with undefined as an argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        parent.appendChild(child);
+        child.before('');
+        assert_equals(parent.firstChild.data, '');
+    }, nodeName + '.before() with the empty string as an argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        parent.appendChild(child);
+        child.before('text');
+        var expected = 'text' + innerHTML;
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.before() with only text as an argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        var x = document.createElement('x');
+        parent.appendChild(child);
+        child.before(x);
+        var expected = '<x></x>' + innerHTML;
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.before() with only one element as an argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        var x = document.createElement('x');
+        parent.appendChild(child);
+        child.before(x, 'text');
+        var expected = '<x></x>text' + innerHTML;
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.before() with one element and text as arguments.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        parent.appendChild(child);
+        child.before('text', child);
+        var expected = 'text' + innerHTML;
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.before() with context object itself as the argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        var x = document.createElement('x');
+        var y = document.createElement('y');
+        var z = document.createElement('z');
+        parent.appendChild(y);
+        parent.appendChild(child);
+        parent.appendChild(x);
+        child.before(x, y, z);
+        var expected = '<x></x><y></y><z></z>' + innerHTML;
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.before() with all siblings of child as arguments.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        var x = document.createElement('x');
+        var y = document.createElement('y');
+        parent.appendChild(x);
+        parent.appendChild(y);
+        parent.appendChild(child);
+        child.before(y, x);
+        var expected = '<y></y><x></x>' + innerHTML;
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.before() when pre-insert behaves like prepend.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        var x = document.createElement('x');
+        parent.appendChild(x);
+        parent.appendChild(document.createTextNode('1'));
+        var y = document.createElement('y');
+        parent.appendChild(y);
+        parent.appendChild(child);
+        child.before(x, '2');
+        var expected = '1<y></y><x></x>2' + innerHTML;
+        assert_equals(parent.innerHTML, expected);
+    }, nodeName + '.before() with one sibling of child and text as arguments.');
+
+    test(function() {
+        var x = document.createElement('x');
+        var y = document.createElement('y');
+        x.before(y);
+        assert_equals(x.previousSibling, null);
+    }, nodeName + '.before() on a child without any parent.');
+}
+
+test_before('Comment');
+test_before('Element');
+test_before('Text');
+
+</script>
+</html>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/ChildNode/replace-with.html b/third_party/WebKit/LayoutTests/fast/dom/ChildNode/replace-with.html
new file mode 100644
index 0000000..87adf57
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/dom/ChildNode/replace-with.html
@@ -0,0 +1,134 @@
+<!DOCTYPE html>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<script>
+
+test(function () {
+    var child = document.createElement('p');
+    assert_true('replaceWith' in child);
+    var replaceWith = 'mine';
+    var getAttribute = 'mine';
+    with (child) {
+        assert_true(replaceWith === 'mine');
+        assert_false(getAttribute === 'mine');
+    }
+    assert_true('Symbol' in window);
+    var unscopables = Object.getPrototypeOf(child)[Symbol.unscopables];
+    assert_true(unscopables.replaceWith);
+}, 'ChildNode.replaceWith() unscopeable');
+
+function test_replaceWith(nodeName) {
+    var child;
+    var innerHTML;
+    if (nodeName == 'Comment') {
+        child = document.createComment('test');
+        innerHTML = '<!--test-->';
+    } else if (nodeName == 'Element') {
+        child = document.createElement('test');
+        innerHTML = '<test></test>';
+    } else {
+        child = document.createTextNode('test');
+        innerHTML = 'test';
+    }
+
+    test(function() {
+        var parent = document.createElement('div');
+        parent.appendChild(child);
+        child.replaceWith();
+        assert_equals(parent.innerHTML, '');
+    }, nodeName + '.replaceWith() without any argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        parent.appendChild(child);
+        child.replaceWith(null);
+        assert_equals(parent.innerHTML, 'null');
+    }, nodeName + '.replaceWith() with null as an argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        parent.appendChild(child);
+        child.replaceWith(undefined);
+        assert_equals(parent.innerHTML, 'undefined');
+    }, nodeName + '.replaceWith() with undefined as an argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        parent.appendChild(child);
+        child.replaceWith('');
+        assert_equals(parent.innerHTML, '');
+    }, nodeName + '.replaceWith() with an empty string as an argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        parent.appendChild(child);
+        child.replaceWith('text');
+        assert_equals(parent.innerHTML, 'text');
+    }, nodeName + '.replaceWith() with only text as an argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        var x = document.createElement('x');
+        parent.appendChild(child);
+        child.replaceWith(x);
+        assert_equals(parent.innerHTML, '<x></x>');
+    }, nodeName + '.replaceWith() with only one element as an argument.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        var x = document.createElement('x');
+        var y = document.createElement('y');
+        var z = document.createElement('z');
+        parent.appendChild(y);
+        parent.appendChild(child);
+        parent.appendChild(x);
+        child.replaceWith(x, y, z);
+        assert_equals(parent.innerHTML, '<x></x><y></y><z></z>');
+    }, nodeName + '.replaceWith() with sibling of child as arguments.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        var x = document.createElement('x');
+        parent.appendChild(child);
+        parent.appendChild(x);
+        parent.appendChild(document.createTextNode('1'));
+        child.replaceWith(x, '2');
+        assert_equals(parent.innerHTML,'<x></x>21');
+    }, nodeName + '.replaceWith() with one sibling of child and text as arguments.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        var x = document.createElement('x');
+        parent.appendChild(child);
+        var innerHTML = parent.innerHTML;
+        parent.appendChild(x);
+        parent.appendChild(document.createTextNode('text'));
+        child.replaceWith(x, child);
+        assert_equals(parent.innerHTML,'<x></x>' + innerHTML + 'text');
+    }, nodeName + '.replaceWith() with one sibling of child and child itself as arguments.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        var x = document.createElement('x');
+        parent.appendChild(child);
+        child.replaceWith(x, 'text');
+        assert_equals(parent.innerHTML, '<x></x>text');
+    }, nodeName + '.replaceWith() with one element and text as arguments.');
+
+    test(function() {
+        var parent = document.createElement('div');
+        var x = document.createElement('x');
+        var y = document.createElement('y');
+        parent.appendChild(x);
+        parent.appendChild(y);
+        child.replaceWith(x, y);
+        assert_equals(parent.innerHTML, '<x></x><y></y>');
+    }, nodeName + '.replaceWith() on a parenless child with two elements as arguments.');
+}
+
+test_replaceWith('Comment');
+test_replaceWith('Element');
+test_replaceWith('Text');
+
+</script>
+</html>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/ParentNode/append-on-document.html b/third_party/WebKit/LayoutTests/fast/dom/ParentNode/append-on-document.html
new file mode 100644
index 0000000..3431f6e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/dom/ParentNode/append-on-document.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<script>
+
+function test_append_on_Document() {
+
+    var node = document.implementation.createDocument(null, null);
+    test(function() {
+        var parent = node.cloneNode();
+        parent.append();
+        assert_array_equals(parent.childNodes, []);
+    }, 'Document.append() without any argument, on a Document having no child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        var x = document.createElement('x');
+        parent.append(x);
+        assert_array_equals(parent.childNodes, [x]);
+    }, 'Document.append() with only one element as an argument, on a Document having no child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        var x = document.createElement('x');
+        var y = document.createElement('y');
+        parent.appendChild(x);
+        assert_throws('HierarchyRequestError', function() { parent.append(y); });
+        assert_array_equals(parent.childNodes, [x]);
+    }, 'Document.append() with only one element as an argument, on a Document having one child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        assert_throws('HierarchyRequestError', function() { parent.append('text'); });
+        assert_array_equals(parent.childNodes, []);
+    }, 'Document.append() with text as an argument, on a Document having no child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        var x = document.createElement('x');
+        var y = document.createElement('y');
+        assert_throws('HierarchyRequestError', function() { parent.append(x, y); });
+        assert_array_equals(parent.childNodes, []);
+    }, 'Document.append() with two elements as the argument, on a Document having no child.');
+
+}
+
+test_append_on_Document();
+
+</script>
+</html>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/ParentNode/append.html b/third_party/WebKit/LayoutTests/fast/dom/ParentNode/append.html
new file mode 100644
index 0000000..ad894c0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/dom/ParentNode/append.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<script>
+
+test(function () {
+    var node = document.createElement('div');
+    assert_true('append' in node);
+    var append = 'mine';
+    var getAttribute = 'mine';
+    with (node) {
+        assert_true(append === 'mine');
+        assert_false(getAttribute === 'mine');
+    }
+    assert_true('Symbol' in window);
+    var unscopables = Object.getPrototypeOf(node)[Symbol.unscopables];
+    assert_true(unscopables.append);
+}, 'ChildNode.append() unscopeable');
+
+function test_append(node, nodeName) {
+
+    test(function() {
+        var parent = node.cloneNode();
+        parent.append();
+        assert_array_equals(parent.childNodes, []);
+    }, nodeName + '.append() without any argument, on a parent having no child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        parent.append(null);
+        assert_equals(parent.childNodes[0].textContent, 'null');
+    }, nodeName + '.append() with null as an argument, on a parent having no child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        parent.append(undefined);
+        assert_equals(parent.childNodes[0].textContent, 'undefined');
+    }, nodeName + '.append() with undefined as an argument, on a parent having no child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        parent.append('text');
+        assert_equals(parent.childNodes[0].textContent, 'text');
+    }, nodeName + '.append() with only text as an argument, on a parent having no child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        var x = document.createElement('x');
+        parent.append(x);
+        assert_array_equals(parent.childNodes, [x]);
+    }, nodeName + '.append() with only one element as an argument, on a parent having no child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        var child = document.createElement('test');
+        parent.appendChild(child);
+        parent.append(null);
+        assert_equals(parent.childNodes[0], child);
+        assert_equals(parent.childNodes[1].textContent, 'null');
+    }, nodeName + '.append() with null as an argument, on a parent having a child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        var x = document.createElement('x');
+        var child = document.createElement('test');
+        parent.appendChild(x);
+        parent.appendChild(child);
+        parent.append(child, x);
+        assert_array_equals(parent.childNodes, [child, x]);
+    }, nodeName + '.append() with all children as arguments, on a parent having two children.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        var x = document.createElement('x');
+        var child = document.createElement('test');
+        parent.appendChild(child);
+        parent.append(x, 'text');
+        assert_equals(parent.childNodes[0], child);
+        assert_equals(parent.childNodes[1], x);
+        assert_equals(parent.childNodes[2].textContent, 'text');
+    }, nodeName + '.append() with one element and text as argument, on a parent having a child.');
+}
+
+test_append(document.createElement('div'), 'Element');
+test_append(document.createDocumentFragment(), 'DocumentFrgment');
+</script>
+</html>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/ParentNode/prepend-on-document.html b/third_party/WebKit/LayoutTests/fast/dom/ParentNode/prepend-on-document.html
new file mode 100644
index 0000000..def59d84
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/dom/ParentNode/prepend-on-document.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<script>
+
+function test_prepend_on_Document() {
+
+    var node = document.implementation.createDocument(null, null);
+    test(function() {
+        var parent = node.cloneNode();
+        parent.prepend();
+        assert_array_equals(parent.childNodes, []);
+    }, 'Document.prepend() without any argument, on a Document having no child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        var x = document.createElement('x');
+        parent.prepend(x);
+        assert_array_equals(parent.childNodes, [x]);
+    }, 'Document.prepend() with only one element as an argument, on a Document having no child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        var x = document.createElement('x');
+        var y = document.createElement('y');
+        parent.appendChild(x);
+        assert_throws('HierarchyRequestError', function() { parent.prepend(y); });
+        assert_array_equals(parent.childNodes, [x]);
+    }, 'Document.append() with only one element as an argument, on a Document having one child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        assert_throws('HierarchyRequestError', function() { parent.prepend('text'); });
+        assert_array_equals(parent.childNodes, []);
+    }, 'Document.prepend() with text as an argument, on a Document having no child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        var x = document.createElement('x');
+        var y = document.createElement('y');
+        assert_throws('HierarchyRequestError', function() { parent.prepend(x, y); });
+        assert_array_equals(parent.childNodes, []);
+    }, 'Document.prepend() with two elements as the argument, on a Document having no child.');
+
+}
+
+test_prepend_on_Document();
+
+</script>
+</html>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/ParentNode/prepend.html b/third_party/WebKit/LayoutTests/fast/dom/ParentNode/prepend.html
new file mode 100644
index 0000000..17dd962
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/dom/ParentNode/prepend.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<script>
+
+test(function () {
+    var node = document.createElement('div');
+    assert_true('prepend' in node);
+    var prepend = 'mine';
+    var getAttribute = 'mine';
+    with (node) {
+        assert_true(prepend === 'mine');
+        assert_false(getAttribute === 'mine');
+    }
+    assert_true('Symbol' in window);
+    var unscopables = Object.getPrototypeOf(node)[Symbol.unscopables];
+    assert_true(unscopables.prepend);
+}, 'ChildNode.prepend() unscopeable');
+
+function test_prepend(node, nodeName) {
+
+    test(function() {
+        var parent = node.cloneNode();
+        parent.prepend();
+        assert_array_equals(parent.childNodes, []);
+    }, nodeName + '.prepend() without any argument, on a parent having no child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        parent.prepend(null);
+        assert_equals(parent.childNodes[0].textContent, 'null');
+    }, nodeName + '.prepend() with null as an argument, on a parent having no child.');
+
+    test(function() {
+	var parent = node.cloneNode();
+	parent.prepend(undefined);
+	assert_equals(parent.childNodes[0].textContent, 'undefined');
+    }, nodeName + '.prepend() with undefined as an argument, on a parent having no child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        parent.prepend('text');
+        assert_equals(parent.childNodes[0].textContent, 'text');
+    }, nodeName + '.prepend() with only text as an argument, on a parent having no child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        var x = document.createElement('x');
+        parent.prepend(x);
+        assert_array_equals(parent.childNodes, [x]);
+    }, nodeName + '.prepend() with only one element as an argument, on a parent having no child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        var child = document.createElement('test');
+        parent.appendChild(child);
+        parent.prepend(null);
+        assert_equals(parent.childNodes[0].textContent, 'null');
+        assert_equals(parent.childNodes[1], child);
+    }, nodeName + '.prepend() with null as an argument, on a parent having a child.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        var x = document.createElement('x');
+        var child = document.createElement('test');
+        parent.appendChild(x);
+        parent.appendChild(child);
+        parent.prepend(child, x);
+        assert_array_equals(parent.childNodes, [child, x]);
+    }, nodeName + '.prepend() with all children as arguments, on a parent having two children.');
+
+    test(function() {
+        var parent = node.cloneNode();
+        var x = document.createElement('x');
+        var child = document.createElement('test');
+        parent.appendChild(child);
+        parent.prepend(x, 'text');
+        assert_equals(parent.childNodes[0], x);
+        assert_equals(parent.childNodes[1].textContent, 'text');
+        assert_equals(parent.childNodes[2], child);
+    }, nodeName + '.prepend() with one element and text as argument, on a parent having a child.');
+}
+
+test_prepend(document.createElement('div'), 'Element');
+test_prepend(document.createDocumentFragment(), 'DocumentFrgment');
+</script>
+</html>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/body-quirk-client-size-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/body-quirk-client-size-expected.txt
new file mode 100644
index 0000000..c520c9c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/dom/body-quirk-client-size-expected.txt
@@ -0,0 +1,22 @@
+Style recalc when reading clientWidth/clientHeight of body in quirks mode.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS [object Internals] is defined.
+PASS internals.updateStyleAndReturnAffectedElementCount() is 1
+PASS 800 is 800
+PASS 600 is 600
+PASS internals.updateStyleAndReturnAffectedElementCount() is 1
+PASS 800 is 800
+PASS 600 is 600
+PASS internals.updateStyleAndReturnAffectedElementCount() is 0
+PASS 800 is 800
+PASS 600 is > 585
+PASS internals.updateStyleAndReturnAffectedElementCount() is 0
+PASS 800 is > 785
+PASS 600 is 600
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/third_party/WebKit/LayoutTests/fast/dom/body-quirk-client-size.html b/third_party/WebKit/LayoutTests/fast/dom/body-quirk-client-size.html
new file mode 100644
index 0000000..3b990145
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/dom/body-quirk-client-size.html
@@ -0,0 +1,53 @@
+<!-- quirks mode -->
+<script src="../../resources/js-test.js"></script>
+<style>
+    :root, body { width: 100%; height: 100%; margin: 0 }
+    #container.wide { width: 5000px; height: 10px; }
+    #container.tall { height: 5000px; width: 10px; }
+</style>
+<div id="container"></div>
+<script>
+    description("Style recalc when reading clientWidth/clientHeight of body in quirks mode.");
+
+    shouldBeDefined(window.internals);
+
+    function runClientSizeTest(testClass, expectWidthChange, expectHeightChange, expectedRecalcCount) {
+
+        var origWidth = document.body.clientWidth;
+        var origHeight = document.body.clientHeight;
+        internals.updateStyleAndReturnAffectedElementCount();
+
+        container.classList.add(testClass)
+
+        var afterWidth = document.body.clientWidth;
+        var afterHeight = document.body.clientHeight;
+
+        shouldBe("internals.updateStyleAndReturnAffectedElementCount()", ""+expectedRecalcCount);
+
+        if (expectWidthChange)
+            shouldBeGreaterThan(""+origWidth, ""+afterWidth);
+        else
+            shouldBe(""+origWidth, ""+afterWidth);
+
+        if (expectHeightChange)
+            shouldBeGreaterThan(""+origHeight, ""+afterHeight);
+        else
+            shouldBe(""+origHeight, ""+afterHeight);
+
+        container.classList.remove(testClass)
+    }
+
+    var originalOverlayScrollbars = internals.runtimeFlags.overlayScrollbarsEnabled;
+
+    internals.settings.setOverlayScrollbarsEnabled(true);
+
+    runClientSizeTest("wide", false, false, 1);
+    runClientSizeTest("tall", false, false, 1);
+
+    internals.settings.setOverlayScrollbarsEnabled(false);
+
+    runClientSizeTest("wide", false, true, 0);
+    runClientSizeTest("tall", true, false, 0);
+
+    internals.settings.setOverlayScrollbarsEnabled(originalOverlayScrollbars);
+</script>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/root-client-size-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/root-client-size-expected.txt
new file mode 100644
index 0000000..6d78313
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/dom/root-client-size-expected.txt
@@ -0,0 +1,22 @@
+Style recalc when reading clientWidth/clientHeight of documentElement in strict mode.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS [object Internals] is defined.
+PASS internals.updateStyleAndReturnAffectedElementCount() is 1
+PASS 800 is 800
+PASS 600 is 600
+PASS internals.updateStyleAndReturnAffectedElementCount() is 1
+PASS 800 is 800
+PASS 600 is 600
+PASS internals.updateStyleAndReturnAffectedElementCount() is 0
+PASS 800 is 800
+PASS 600 is > 585
+PASS internals.updateStyleAndReturnAffectedElementCount() is 0
+PASS 800 is > 785
+PASS 600 is 600
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/third_party/WebKit/LayoutTests/fast/dom/root-client-size-iframe-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/root-client-size-iframe-expected.txt
new file mode 100644
index 0000000..a21f36b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/dom/root-client-size-iframe-expected.txt
@@ -0,0 +1,13 @@
+Style recalc/layout when reading clientWidth of documentElement in iframe.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS [object Internals] is defined.
+PASS internals.updateStyleAndReturnAffectedElementCount() is 0
+PASS clientWidthBefore is 100
+PASS clientWidthAfter is 200
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/third_party/WebKit/LayoutTests/fast/dom/root-client-size-iframe.html b/third_party/WebKit/LayoutTests/fast/dom/root-client-size-iframe.html
new file mode 100644
index 0000000..acca1981
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/dom/root-client-size-iframe.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<script src="../../resources/js-test.js"></script>
+<style>
+    iframe { width: 100px; height: 100px; }
+    iframe.wider { width: 200px; }
+</style>
+<iframe id="frame" src="data:text/html,<!DOCTYPE html>iframe" onload="runTests()"></iframe>
+<script>
+    description("Style recalc/layout when reading clientWidth of documentElement in iframe.");
+
+    var jsTestIsAsync = true;
+
+    shouldBeDefined(window.internals);
+
+    var originalOverlayScrollbars = internals.runtimeFlags.overlayScrollbarsEnabled;
+    internals.settings.setOverlayScrollbarsEnabled(true);
+
+    function runTests() {
+        clientWidthBefore = frame.contentDocument.documentElement.clientWidth;
+        frame.className = "wider";
+        clientWidthAfter = frame.contentDocument.documentElement.clientWidth;
+
+        shouldBe("internals.updateStyleAndReturnAffectedElementCount()", "0");
+        shouldBe("clientWidthBefore", "100");
+        shouldBe("clientWidthAfter", "200");
+
+        internals.settings.setOverlayScrollbarsEnabled(originalOverlayScrollbars);
+        finishJSTest();
+    }
+</script>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/root-client-size.html b/third_party/WebKit/LayoutTests/fast/dom/root-client-size.html
new file mode 100644
index 0000000..9efabc5
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/dom/root-client-size.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<script src="../../resources/js-test.js"></script>
+<style>
+    :root { width: 100%; height: 100% }
+    #container.wide { width: 5000px; height: 10px; }
+    #container.tall { height: 5000px; width: 10px; }
+</style>
+<div id="container"></div>
+<script>
+    description("Style recalc when reading clientWidth/clientHeight of documentElement in strict mode.");
+
+    shouldBeDefined(window.internals);
+
+    function runClientSizeTest(testClass, expectWidthChange, expectHeightChange, expectedRecalcCount) {
+
+        var origWidth = document.documentElement.clientWidth;
+        var origHeight = document.documentElement.clientHeight;
+        internals.updateStyleAndReturnAffectedElementCount();
+
+        container.classList.add(testClass)
+
+        var afterWidth = document.documentElement.clientWidth;
+        var afterHeight = document.documentElement.clientHeight;
+
+        shouldBe("internals.updateStyleAndReturnAffectedElementCount()", ""+expectedRecalcCount);
+
+        if (expectWidthChange)
+            shouldBeGreaterThan(""+origWidth, ""+afterWidth);
+        else
+            shouldBe(""+origWidth, ""+afterWidth);
+
+        if (expectHeightChange)
+            shouldBeGreaterThan(""+origHeight, ""+afterHeight);
+        else
+            shouldBe(""+origHeight, ""+afterHeight);
+
+        container.classList.remove(testClass)
+    }
+
+    var originalOverlayScrollbars = internals.runtimeFlags.overlayScrollbarsEnabled;
+
+    internals.settings.setOverlayScrollbarsEnabled(true);
+
+    runClientSizeTest("wide", false, false, 1);
+    runClientSizeTest("tall", false, false, 1);
+
+    internals.settings.setOverlayScrollbarsEnabled(false);
+
+    runClientSizeTest("wide", false, true, 0);
+    runClientSizeTest("tall", true, false, 0);
+
+    internals.settings.setOverlayScrollbarsEnabled(originalOverlayScrollbars);
+</script>
diff --git a/third_party/WebKit/LayoutTests/fast/events/arrow-keys-on-body-expected.txt b/third_party/WebKit/LayoutTests/fast/events/arrow-keys-on-body-expected.txt
index dd03dd6f..94228b68 100644
--- a/third_party/WebKit/LayoutTests/fast/events/arrow-keys-on-body-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/events/arrow-keys-on-body-expected.txt
@@ -1,3 +1,4 @@
+CONSOLE WARNING: 'KeyboardEvent.keyIdentifier' is deprecated and will be removed in M53, around September 2016. See https://www.chromestatus.com/features/5316065118650368 for more details.
 Test that arrow keys do not dispatch keypress events even if there is no default handler.
 
 To test manually, press arrow keys and verify that no keypress events are logged.
diff --git a/third_party/WebKit/LayoutTests/fast/events/constructors/keyboard-event-constructor-expected.txt b/third_party/WebKit/LayoutTests/fast/events/constructors/keyboard-event-constructor-expected.txt
index 9bcf47ce..ac8a2660 100644
--- a/third_party/WebKit/LayoutTests/fast/events/constructors/keyboard-event-constructor-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/events/constructors/keyboard-event-constructor-expected.txt
@@ -1,3 +1,4 @@
+CONSOLE WARNING: 'KeyboardEvent.keyIdentifier' is deprecated and will be removed in M53, around September 2016. See https://www.chromestatus.com/features/5316065118650368 for more details.
 This tests the constructor for the KeyboardEvent DOM class.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/events/events-in-isolated-world-expected.txt b/third_party/WebKit/LayoutTests/fast/events/events-in-isolated-world-expected.txt
new file mode 100644
index 0000000..a3cf925
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/events/events-in-isolated-world-expected.txt
@@ -0,0 +1,2 @@
+CONSOLE MESSAGE: line 1: keydown event in isolated world
+
diff --git a/third_party/WebKit/LayoutTests/fast/events/events-in-isolated-world.html b/third_party/WebKit/LayoutTests/fast/events/events-in-isolated-world.html
new file mode 100644
index 0000000..6325f368
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/events/events-in-isolated-world.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<button id="button"></button>
+<script>
+
+if (window.testRunner) {
+    testRunner.dumpAsText();
+    testRunner.setScriptsAllowed(false);
+
+    document.getElementById('button').addEventListener('keydown', function() { console.log('keydown event in main world') });
+    testRunner.evaluateScriptInIsolatedWorld(1, "document.getElementById('button').addEventListener('keydown', function() { console.log('keydown event in isolated world') });");
+
+    document.getElementById("button").focus();
+    eventSender.keyDown('e', []);
+} else {
+    console.log("This test reuqires testRunner.setScriptsAllowed, so it can't run in a browser.");
+}
+</script>
+
diff --git a/third_party/WebKit/LayoutTests/fast/events/image-adoption-events-expected.txt b/third_party/WebKit/LayoutTests/fast/events/image-adoption-events-expected.txt
index 31f86e98..9178d7b 100644
--- a/third_party/WebKit/LayoutTests/fast/events/image-adoption-events-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/events/image-adoption-events-expected.txt
@@ -1,5 +1,5 @@
 
-FAIL readystatechange event was dispatched but the handler was suppressed
+PASS readystatechange event handler was executed when complete
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/fast/events/image-adoption-events.html b/third_party/WebKit/LayoutTests/fast/events/image-adoption-events.html
index 682cc5777..d776ce3 100644
--- a/third_party/WebKit/LayoutTests/fast/events/image-adoption-events.html
+++ b/third_party/WebKit/LayoutTests/fast/events/image-adoption-events.html
@@ -35,9 +35,7 @@
     document.adoptNode(img);
     adopting = false;
     if (doc.readyState == "complete" && !readyStateChangeEventHandlerTriggeredWhenComplete) {
-        // TODO: This can be replaced with testFailed once https://crbug.com/606651 is fixed.
-        debug("FAIL readystatechange event was dispatched but the handler was suppressed");
-        finishJSTest();
+        testFailed("readystatechange event was dispatched but the handler was suppressed");
     }
 }
 x.open("get", "data:text/html,");
diff --git a/third_party/WebKit/LayoutTests/fast/events/init-events-expected.txt b/third_party/WebKit/LayoutTests/fast/events/init-events-expected.txt
index 0073e73..bc2ea81 100644
--- a/third_party/WebKit/LayoutTests/fast/events/init-events-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/events/init-events-expected.txt
@@ -1,3 +1,4 @@
+CONSOLE WARNING: 'KeyboardEvent.keyIdentifier' is deprecated and will be removed in M53, around September 2016. See https://www.chromestatus.com/features/5316065118650368 for more details.
 This tests the init functions for all the event DOM classes that have them.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/events/js-keyboard-event-creation-expected.txt b/third_party/WebKit/LayoutTests/fast/events/js-keyboard-event-creation-expected.txt
index 9368eca..2bbc75e 100644
--- a/third_party/WebKit/LayoutTests/fast/events/js-keyboard-event-creation-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/events/js-keyboard-event-creation-expected.txt
@@ -1,3 +1,4 @@
+CONSOLE WARNING: 'KeyboardEvent.keyIdentifier' is deprecated and will be removed in M53, around September 2016. See https://www.chromestatus.com/features/5316065118650368 for more details.
   
 This tests that DOMKeyboardEvents are created correctly in the JavaScript API.
 
diff --git a/third_party/WebKit/LayoutTests/fast/events/key-events-in-input-button-expected.txt b/third_party/WebKit/LayoutTests/fast/events/key-events-in-input-button-expected.txt
index 18a20017..87d0f11 100644
--- a/third_party/WebKit/LayoutTests/fast/events/key-events-in-input-button-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/events/key-events-in-input-button-expected.txt
@@ -1,3 +1,4 @@
+CONSOLE WARNING: 'KeyboardEvent.keyIdentifier' is deprecated and will be removed in M53, around September 2016. See https://www.chromestatus.com/features/5316065118650368 for more details.
 To test manually, press keys and compare results to other browsers.
 
 
diff --git a/third_party/WebKit/LayoutTests/fast/events/key-events-in-input-text-expected.txt b/third_party/WebKit/LayoutTests/fast/events/key-events-in-input-text-expected.txt
index 44faa9b..d7c40ceb 100644
--- a/third_party/WebKit/LayoutTests/fast/events/key-events-in-input-text-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/events/key-events-in-input-text-expected.txt
@@ -1,3 +1,4 @@
+CONSOLE WARNING: 'KeyboardEvent.keyIdentifier' is deprecated and will be removed in M53, around September 2016. See https://www.chromestatus.com/features/5316065118650368 for more details.
 To test manually, press keys and compare results to other browsers.
 
   
diff --git a/third_party/WebKit/LayoutTests/fast/events/ondrop-text-html-expected.txt b/third_party/WebKit/LayoutTests/fast/events/ondrop-text-html-expected.txt
index de5e09d..d83b68d 100644
--- a/third_party/WebKit/LayoutTests/fast/events/ondrop-text-html-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/events/ondrop-text-html-expected.txt
@@ -1,4 +1,4 @@
 CONSOLE MESSAGE: line 21: text/plain: This test verifies that we can get text/html from the drag object during an ondrop event. 
-CONSOLE MESSAGE: line 23: text/html: <span style="color: rgb(0, 0, 0); font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">This test verifies that we can get text/html from the drag object during an ondrop event.<span class="Apple-converted-space"> </span></span>
+CONSOLE MESSAGE: line 23: text/html: <span style="color: rgb(0, 0, 0); font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">This test verifies that we can get text/html from the drag object during an ondrop event.<span class="Apple-converted-space"> </span></span>
 This test verifies that we can get text/html from the drag object during an ondrop event. This test requires DRT.
 PASS
diff --git a/third_party/WebKit/LayoutTests/fast/events/special-key-events-in-input-text-expected.txt b/third_party/WebKit/LayoutTests/fast/events/special-key-events-in-input-text-expected.txt
index dae6709..fac214a 100644
--- a/third_party/WebKit/LayoutTests/fast/events/special-key-events-in-input-text-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/events/special-key-events-in-input-text-expected.txt
@@ -1,3 +1,4 @@
+CONSOLE WARNING: 'KeyboardEvent.keyIdentifier' is deprecated and will be removed in M53, around September 2016. See https://www.chromestatus.com/features/5316065118650368 for more details.
 This test verifies that the correct sequence of keyboard events is generated for a keypress for certain special keys. To test manually, press keys and compare results to other browsers.
 
 
diff --git a/third_party/WebKit/LayoutTests/fast/imagecapture/ImageCapture-takePhoto.html b/third_party/WebKit/LayoutTests/fast/imagecapture/ImageCapture-takePhoto.html
new file mode 100644
index 0000000..b8d4000
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/imagecapture/ImageCapture-takePhoto.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<script src=../../resources/testharness.js></script>
+<script src=../../resources/testharnessreport.js></script>
+<body>
+<canvas id='canvas0' width=10 height=10/>
+</body>
+<script>
+
+// This test verifies ImageCapture's takePhoto().
+
+var test = async_test(function() {
+  var canvas0 = document.getElementById('canvas0');
+  var context0 = canvas0.getContext("2d");
+  context0.fillStyle = "red";
+  context0.fillRect(0, 0, 10, 10);
+
+  var stream = canvas0.captureStream();
+
+  var capturer = new ImageCapture(stream.getVideoTracks()[0]);
+
+  capturer.takePhoto()
+    .then(blob => {
+      assert_true(blob.type.length > 0);
+      assert_true(blob.size > 0);
+      this.done();
+    })
+    .catch(error => {
+      assert_unreached('Error during takePhoto(): '+ error);
+    });
+}, 'exercises the ImageCapture API takePhoto().');
+
+</script>
diff --git a/third_party/WebKit/LayoutTests/fast/inspector-support/style-expected.txt b/third_party/WebKit/LayoutTests/fast/inspector-support/style-expected.txt
index d453b22..640ad4c9 100644
--- a/third_party/WebKit/LayoutTests/fast/inspector-support/style-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/inspector-support/style-expected.txt
@@ -17,7 +17,8 @@
 margin-left: 1em
 color: white
 font-style: normal
-font-variant: normal
+font-variant-caps: normal
+font-variant-ligatures: normal
 font-weight: normal
 font-stretch: normal
 font-size: 24px
diff --git a/third_party/WebKit/LayoutTests/fast/loader/font-face-empty.html b/third_party/WebKit/LayoutTests/fast/loader/font-face-empty.html
index 0ab5b5fc..8eb983c 100644
--- a/third_party/WebKit/LayoutTests/fast/loader/font-face-empty.html
+++ b/third_party/WebKit/LayoutTests/fast/loader/font-face-empty.html
@@ -1,7 +1,7 @@
 <style>
     @font-face {
         font-family: TestFont;
-        src: url(data:application/x-truetype-font,) format(truetype);
+        src: url(data:application/x-truetype-font,) format("truetype");
     }
 </style>
 <script>
diff --git a/third_party/WebKit/LayoutTests/fast/scroll-behavior/smooth-scroll/ongoing-smooth-scroll-anchors.html b/third_party/WebKit/LayoutTests/fast/scroll-behavior/smooth-scroll/ongoing-smooth-scroll-anchors.html
new file mode 100644
index 0000000..c69822f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/scroll-behavior/smooth-scroll/ongoing-smooth-scroll-anchors.html
@@ -0,0 +1,70 @@
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<style>
+  body {
+    margin: 0px;
+    height: 2000px;
+    width: 2000px;
+  }
+  #changer {
+    background-color: #FF7F7F;
+    height: 10px;
+  }
+  #anchor {
+    height: 1500px;
+    background-color: #84BE6A;
+  }
+</style>
+
+<div id="changer"></div>
+<div id="anchor"></div>
+
+<script>
+  var asyncTest = async_test("Verify smooth scroll interaction with scroll anchroing");
+
+  // The element that will change in height.
+  var ch;
+
+  // Initital scroll position.
+  var initialX = 0;
+  var initialY = 10;
+  // Amount to smooth scroll by.
+  var userScrollX = 51;
+  var userScrollY = 205;
+  // Amount to change the height of the element above the viewport.
+  var changerY =  100;
+  // End position: height of ch + userScroll.
+  var endX = 51;
+  var endY = 305;
+
+  function scrollListener() {
+    if (window.scrollX == endX && window.scrollY == endY) {
+      asyncTest.done();
+      return;
+    }
+
+    if (ch.style.height != "100")
+      ch.style.height = changerY;
+  }
+
+  window.onload = function() {
+    assert_false(!window.internals, 'This test requires internals');
+    internals.runtimeFlags.scrollAnchoringEnabled = true;
+    // Turn on smooth scrolling.
+    internals.settings.setScrollAnimatorEnabled(true);
+
+    ch = document.getElementById("changer");
+    document.getElementById('anchor').scrollIntoView();
+
+    // Smooth scroll.
+    eventSender.mouseMoveTo(100, 100);
+    eventSender.continuousMouseScrollBy(-userScrollX, -userScrollY);
+
+    asyncTest.step(function() {
+      assert_equals(window.scrollX, initialX);
+      assert_equals(window.scrollY, initialY);
+    });
+
+    document.addEventListener("scroll", scrollListener);
+  }
+</script>
diff --git a/third_party/WebKit/LayoutTests/fast/text/font-features/font-variant-shorthand.html b/third_party/WebKit/LayoutTests/fast/text/font-features/font-variant-shorthand.html
new file mode 100644
index 0000000..e99e7c1f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/text/font-features/font-variant-shorthand.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<title>Font Variant Shorthand Parsing</title>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<script>
+    var shorthandWriteExpectations = [
+        { writeFontVariant : "normal", readCaps : "normal", readLigatures : "normal" },
+        { writeFontVariant : "none", readCaps : "normal", readLigatures : "none" },
+        { writeFontVariant : "all-small-caps", readCaps : "all-small-caps", readLigatures : "normal" },
+        { writeFontVariant : "historical-ligatures", readCaps : "normal", readLigatures : "historical-ligatures" },
+        { writeFontVariant : "historical-ligatures discretionary-ligatures", readCaps : "normal", readLigatures : "discretionary-ligatures historical-ligatures" },
+        { writeFontVariant : "historical-ligatures petite-caps", readCaps : "petite-caps", readLigatures : "historical-ligatures" },
+        { writeFontVariant : "", readCaps : "normal", readLigatures : "normal" },
+    ];
+
+    var shorthandReadExpectations = [
+        { writeCaps : "", writeLigatures: "", readFontVariant: "normal" },
+        { writeCaps : "normal", writeLigatures: "normal", readFontVariant: "normal" },
+        { writeCaps : "normal", writeLigatures: "none", readFontVariant: "none" },
+        { writeCaps : "all-small-caps", writeLigatures: "none", readFontVariant: "no-common-ligatures no-discretionary-ligatures no-historical-ligatures no-contextual all-small-caps" },
+        { writeCaps : "all-small-caps", writeLigatures: "normal", readFontVariant: "all-small-caps" },
+        { writeCaps : "normal", writeLigatures: "discretionary-ligatures historical-ligatures", readFontVariant: "discretionary-ligatures historical-ligatures" },
+        { writeCaps : "petite-caps", writeLigatures: "discretionary-ligatures", readFontVariant: "discretionary-ligatures petite-caps" },
+    ];
+
+    var writeInvalidExpectations = {
+        "font-variant" : [ "historical-ligaturesTYPO",
+                        "historical-ligaturesTYPO small-caps",
+                        "discretionary-ligatures no-discretionary-ligatures",
+                        "discretionary-ligatures small-caps no-historical-ligatures all-small-caps",
+                        "discretionary-ligatures small-caps all-petite-caps",
+                        "small-caps unicase"],
+        "font-variant-caps" : [ "typotypotypo", "all-small-caps all-petite-caps" ],
+        "font-variant-ligatures" : [ "discretionary-ligatures no-discretionary-ligatures", "typotypotypo", "none discretionary-ligatures" ]
+    };
+</script>
+<div id="testElement"></div>
+
+<div id="log"></div>
+<script>
+    setup({ explicit_done: true });
+
+  function writeFontVariantTests() {
+      for (testParameters of shorthandWriteExpectations) {
+          testElement.style.fontVariant = testParameters.writeFontVariant;
+          test(function(){
+              assert_equals(getComputedStyle(testElement).fontVariantCaps, testParameters.readCaps);
+              assert_equals(getComputedStyle(testElement).fontVariantLigatures, testParameters.readLigatures);
+          }, "Sub properties set from longhand value: " + testParameters.writeFontVariant);
+      }
+  }
+
+  function readFontVariantTests() {
+      for (testParameters of shorthandReadExpectations) {
+          testElement.style.fontVariantCaps = testParameters.writeCaps;
+          testElement.style.fontVariantLigatures = testParameters.writeLigatures;
+          test(function(){
+              assert_equals(getComputedStyle(testElement).fontVariant, testParameters.readFontVariant);
+          }, "Shorthand from written subproperties: " + getComputedStyle(testElement).fontVariant);
+      }
+  }
+
+  function invalidWriteTests() {
+      for (key in writeInvalidExpectations) {
+          for (value of writeInvalidExpectations[key]) {
+              test(function(){
+                  assert_false(CSS.supports(key, value));
+              }, "Value " + value + " invalid for property " + key + ".");
+          }
+      }
+  }
+
+  window.addEventListener("load", function() {
+      writeFontVariantTests();
+      readFontVariantTests();
+      invalidWriteTests();
+      done();
+  });
+</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/background_sync/oneshot.html b/third_party/WebKit/LayoutTests/http/tests/background_sync/oneshot.html
index 9a44734..24ae30ed 100644
--- a/third_party/WebKit/LayoutTests/http/tests/background_sync/oneshot.html
+++ b/third_party/WebKit/LayoutTests/http/tests/background_sync/oneshot.html
@@ -4,7 +4,6 @@
     correctly.</title>
 <script src="../resources/permissions-helper.js"></script>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="../serviceworker/resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/background_sync/permission_denied.html b/third_party/WebKit/LayoutTests/http/tests/background_sync/permission_denied.html
index b3b8cf0..e8046fe 100644
--- a/third_party/WebKit/LayoutTests/http/tests/background_sync/permission_denied.html
+++ b/third_party/WebKit/LayoutTests/http/tests/background_sync/permission_denied.html
@@ -4,7 +4,6 @@
     permission is denied.</title>
 <script src="../resources/permissions-helper.js"></script>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="../serviceworker/resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/background_sync/resources/interfaces-worker.js b/third_party/WebKit/LayoutTests/http/tests/background_sync/resources/interfaces-worker.js
index 0df2dca6..679cf3d 100644
--- a/third_party/WebKit/LayoutTests/http/tests/background_sync/resources/interfaces-worker.js
+++ b/third_party/WebKit/LayoutTests/http/tests/background_sync/resources/interfaces-worker.js
@@ -1,5 +1,4 @@
 importScripts('/resources/testharness.js');
-importScripts('/resources/testharness-helpers.js');
 
 test(function() {
     assert_own_property(self, 'SyncManager', 'SyncManager needs to be exposed as a global.');
@@ -13,10 +12,11 @@
 test(function() {
     assert_own_property(self, 'SyncEvent');
 
-    assert_will_be_idl_attribute(SyncEvent.prototype, 'tag');
+    var instance = new SyncEvent('dummy', {tag: ''});
+    assert_idl_attribute(instance, 'tag');
+    assert_idl_attribute(instance, 'lastChance');
 
     // SyncEvent should be extending ExtendableEvent.
     assert_inherits(SyncEvent.prototype, 'waitUntil');
 
 }, 'SyncEvent should be exposed and have the expected interface.');
-
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/chromium/error-messages.html b/third_party/WebKit/LayoutTests/http/tests/fetch/chromium/error-messages.html
index c153cef..8be3a36c 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/chromium/error-messages.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/chromium/error-messages.html
@@ -1,7 +1,6 @@
 <!doctype html>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testharness-helpers.js"></script>
 <script src="../resources/fetch-test-helpers.js"></script>
 <script>
 promise_test(function(t) {
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/no-referrer-document.html b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/no-referrer-document.html
index 36ef47c..561843e8 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/no-referrer-document.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/no-referrer-document.html
@@ -4,7 +4,6 @@
 <title>Fetch in a document with &quot;referrer no-referrer&quot; policy</title>
 <body>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "/fetch/resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/origin-only-document.html b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/origin-only-document.html
index 3b4394a..ac5627a 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/origin-only-document.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/origin-only-document.html
@@ -4,7 +4,6 @@
 <title>Fetch in a document with &quot;referrer origin&quot; policy</title>
 <body>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "/fetch/resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/origin-when-cross-origin-document.html b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/origin-when-cross-origin-document.html
index 1a1c564..48dce3a 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/origin-when-cross-origin-document.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/origin-when-cross-origin-document.html
@@ -4,7 +4,6 @@
 <title>Fetch in a document with &quot;referrer origin-when-cross-origin&quot; policy</title>
 <body>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "/fetch/resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/origin-when-cross-origin-serviceworker-from-document.html b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/origin-when-cross-origin-serviceworker-from-document.html
index 5a6e306..4a8b9d36 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/origin-when-cross-origin-serviceworker-from-document.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/origin-when-cross-origin-serviceworker-from-document.html
@@ -2,7 +2,6 @@
 <html>
 <title>Fetch in a document controlled by a ServiceWorker with &quot;referrer origin-when-cross-origin&quot; policy</title>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script>
 location = '/fetch/referrer/resources/origin-when-cross-origin-serviceworker-from-document.html';
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/resources/origin-when-cross-origin-serviceworker-from-document.html b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/resources/origin-when-cross-origin-serviceworker-from-document.html
index 118db74..1372c08 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/resources/origin-when-cross-origin-serviceworker-from-document.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/resources/origin-when-cross-origin-serviceworker-from-document.html
@@ -2,7 +2,6 @@
 <html>
 <body>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "/fetch/resources/fetch-test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/resources/serviceworker-echo-referrer-from-default-document.html b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/resources/serviceworker-echo-referrer-from-default-document.html
index 5f143aa7..ab9fc95 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/resources/serviceworker-echo-referrer-from-default-document.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/resources/serviceworker-echo-referrer-from-default-document.html
@@ -2,7 +2,6 @@
 <html>
 <body>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "/fetch/resources/fetch-test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/resources/serviceworker-from-origin-only-document.html b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/resources/serviceworker-from-origin-only-document.html
index ca13ed55..6508199c 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/resources/serviceworker-from-origin-only-document.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/resources/serviceworker-from-origin-only-document.html
@@ -3,7 +3,6 @@
 <meta http-equiv = "Content-Security-Policy" content = "referrer origin">
 <body>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "/fetch/resources/fetch-test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/serviceworker-echo-referrer-from-default-document.html b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/serviceworker-echo-referrer-from-default-document.html
index 87a5a55..2e97464 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/serviceworker-echo-referrer-from-default-document.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/serviceworker-echo-referrer-from-default-document.html
@@ -2,11 +2,9 @@
 <html>
 <title>Echo referrer in ServiceWorker: from a document with the default referrer policy</title>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script>
 location =
   '/fetch/referrer/resources/serviceworker-echo-referrer-from-default-document.html';
 </script>
 </html>
-
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/serviceworker-from-origin-only-document.html b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/serviceworker-from-origin-only-document.html
index 2eb9873..4472765a 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/serviceworker-from-origin-only-document.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/referrer/serviceworker-from-origin-only-document.html
@@ -2,7 +2,6 @@
 <html>
 <title>Fetch in a document with &quot;referrer origin&quot; policy and controlled by a ServiceWorker</title>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script>
 location =
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/resources/fetch-test-helpers.js b/third_party/WebKit/LayoutTests/http/tests/fetch/resources/fetch-test-helpers.js
index bdc2a046..0fb8dd7 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/resources/fetch-test-helpers.js
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/resources/fetch-test-helpers.js
@@ -1,6 +1,5 @@
 if (self.importScripts) {
   importScripts('/resources/testharness.js');
-  importScripts('/resources/testharness-helpers.js');
   importScripts('/serviceworker/resources/test-helpers.js');
   importScripts('/fetch/resources/fetch-test-options.js');
 }
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/TEMPLATE-window.html b/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/TEMPLATE-window.html
index b003df5..e39ad0f 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/TEMPLATE-window.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/TEMPLATE-window.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/thorough/TEMPLATE-window.html b/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/thorough/TEMPLATE-window.html
index d4af6a1..0033d879 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/thorough/TEMPLATE-window.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/thorough/TEMPLATE-window.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/block-mixed-content-base-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/block-mixed-content-base-https.html
index 05a0e4f..9e2a9533 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/block-mixed-content-base-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/block-mixed-content-base-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/block-mixed-content-nocors-base-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/block-mixed-content-nocors-base-https.html
index 99ee6014d..07ca59d9 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/block-mixed-content-nocors-base-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/block-mixed-content-nocors-base-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/body-mixin-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/body-mixin-base-https-other-https.html
index b03e0a0..f0f1c44 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/body-mixin-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/body-mixin-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/body-mixin.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/body-mixin.html
index 379469b2..eed7b42 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/body-mixin.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/body-mixin.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/cache-override-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/cache-override-base-https-other-https.html
index dbabea9..c00879d1 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/cache-override-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/cache-override-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/cache-override.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/cache-override.html
index a79e5b4..dd1d7f4 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/cache-override.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/cache-override.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/fetch-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/fetch-base-https-other-https.html
index 1d77fe2f..f3f8c7e 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/fetch-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/fetch-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/fetch.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/fetch.html
index 8acea7b..350af518 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/fetch.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/fetch.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response-base-https-other-https.html
index 0cfe944..8d4bf5a6 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response-other-https.html
index 65b4f742..da4dda2 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response.html
index a5c70d8..023c08f 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-base-https-other-https.html
index a8032d7..458ccc94 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-guard-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-guard-base-https-other-https.html
index 38d4d39..efb29fb 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-guard-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-guard-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-guard.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-guard.html
index 657261f..997fdee 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-guard.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-guard.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers.html
index 8dfc3adf..027f0ab5 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/referrer-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/referrer-base-https-other-https.html
index 7d2cbaa..a7a3ab28 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/referrer-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/referrer-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/referrer.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/referrer.html
index 1c92caf..7d4ea4b6 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/referrer.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/referrer.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/request-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/request-base-https-other-https.html
index 6276b9c..69e83bb 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/request-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/request-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/request.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/request.html
index 1740e4ba..10ac508 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/request.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/request.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-base-https-other-https.html
index 4847485..143eb70 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-content-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-content-base-https-other-https.html
index f02a630..467412f 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-content-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-content-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-content.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-content.html
index 28aa5f3..fffbe2c 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-content.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-content.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-stream-construction-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-stream-construction-base-https-other-https.html
index 793e160..0aa258e 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-stream-construction-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-stream-construction-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-stream-construction.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-stream-construction.html
index 9cf6bbb..31e3713 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-stream-construction.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-stream-construction.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response.html
index 69d6b371..99a79e71 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/stream-reader-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/stream-reader-base-https-other-https.html
index 234590ca..bcd151e7 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/stream-reader-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/stream-reader-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/stream-reader.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/stream-reader.html
index 2dd90c1..5f46322c 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/stream-reader.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/stream-reader.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
 <script src = "../resources/fetch-test-options.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/access-control-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/access-control-base-https-other-https.html
index 899debab..ef99e50 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/access-control-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/access-control-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/access-control.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/access-control.html
index b855644..39d6568c 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/access-control.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/access-control.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-base-https-other-https.html
index 00a704c..8f2a082d 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-nocors-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-nocors-base-https-other-https.html
index 1124ee4..7f0d507 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-nocors-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-nocors-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-nocors-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-nocors-other-https.html
index 2f35d5a..700dbda 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-nocors-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-nocors-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-nocors.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-nocors.html
index 579eca2..fe840c0 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-nocors.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-nocors.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-other-https.html
index d81540b..26c2a656 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth.html
index 92bd802..72b84ce 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/auth.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-base-https-other-https.html
index e2607f5..88b153a2 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-nocors-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-nocors-base-https-other-https.html
index 42915658..78b0769 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-nocors-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-nocors-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-nocors-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-nocors-other-https.html
index 236d14e..bd0c46b0 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-nocors-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-nocors-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-nocors.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-nocors.html
index 54eeecd4..3f426ca 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-nocors.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-nocors.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-other-https.html
index af17b773..cb5f297 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie.html
index 9e321e8..38ebd34 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cookie.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-base-https-other-https.html
index d344e7a..6d13b8a 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-other-https.html
index ac24aca..90e7114 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight-base-https-other-https.html
index 94cee92..6499cca 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight-other-https.html
index 5989232..cacfede 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight.html
index c3020c4..e7fcde4 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight2-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight2-base-https-other-https.html
index 7a63dcb..b743579b 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight2-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight2-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight2-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight2-other-https.html
index dbca0fe..6cac3284 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight2-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight2-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight2.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight2.html
index f87ec1c..1bca9f15 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight2.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors-preflight2.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors.html
index b82b5e5..a5a8bc21 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/cors.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/nocors-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/nocors-base-https-other-https.html
index 59abeb28..cf68091 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/nocors-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/nocors-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/nocors-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/nocors-other-https.html
index 41246d9..d7cadc2 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/nocors-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/nocors-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/nocors.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/nocors.html
index 9e2f71c..b134819 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/nocors.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/nocors.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-base-https-other-https.html
index 35ceebe..6919d1a 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-credentials-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-credentials-base-https-other-https.html
index fe265f1..2e8da74763 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-credentials-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-credentials-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-credentials-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-credentials-other-https.html
index f5d5916..a655d28 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-credentials-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-credentials-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-credentials.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-credentials.html
index aafa421..4d35b76 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-credentials.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-credentials.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-loop-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-loop-base-https-other-https.html
index 8aff3325..8cd8a6f 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-loop-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-loop-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-loop-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-loop-other-https.html
index efa4e752..23794ad8 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-loop-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-loop-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-loop.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-loop.html
index 89855da2..1526a9ff 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-loop.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-loop.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-nocors-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-nocors-base-https-other-https.html
index b8b7185..a00a3cb 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-nocors-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-nocors-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-nocors-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-nocors-other-https.html
index 77b3927a..da5166d0 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-nocors-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-nocors-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-nocors.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-nocors.html
index 420cbed..a64703a 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-nocors.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-nocors.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-other-https.html
index 229b2bc..22d036e4 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-password-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-password-base-https-other-https.html
index c0a5fbe8..4b158d42 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-password-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-password-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-password-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-password-other-https.html
index 9d2ad672..10c745e 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-password-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-password-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-password.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-password.html
index c9200bd1..02661c0 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-password.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect-password.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect.html
index 453f044..1d65e51 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/redirect.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-blob-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-blob-base-https-other-https.html
index a42bd98..3759698 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-blob-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-blob-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-blob-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-blob-other-https.html
index 4eb3a0a..c26f484 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-blob-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-blob-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-blob.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-blob.html
index 574e6d1..0f56eee 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-blob.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-blob.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-data-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-data-base-https-other-https.html
index 4f0469a..954a0b9 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-data-base-https-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-data-base-https-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-data-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-data-other-https.html
index d25b1f6..433dc8a 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-data-other-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-data-other-https.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-data.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-data.html
index ff6de65..80b3a1f02 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-data.html
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/thorough/scheme-data.html
@@ -2,7 +2,6 @@
 <head>
 <meta name="timeout" content="long"></meta>
 <script src = "/resources/testharness.js"></script>
-<script src = "/resources/testharness-helpers.js"></script>
 <script src = "/resources/testharnessreport.js"></script>
 <script src = "/resources/get-host-info.js?pipe=sub"></script>
 <script src = "/serviceworker/resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-choose-preview-view-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-choose-preview-view-expected.txt
new file mode 100644
index 0000000..a5df3826
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-choose-preview-view-expected.txt
@@ -0,0 +1,39 @@
+Tests to make sure the proper view is used for the data that is received in network panel.
+
+
+Running: testSimpleJSON
+Creating a NetworkRequest with mimeType: application/json
+Its previewer type: widget vbox json-view
+
+Running: testMimeJSON
+Creating a NetworkRequest with mimeType: application/vnd.document+json
+Its previewer type: widget vbox json-view
+
+Running: testSimpleXML
+Creating a NetworkRequest with mimeType: text/xml
+Its previewer type: widget shadow-xml-view source-code
+
+Running: testXMLMimeButJSON
+Creating a NetworkRequest with mimeType: text/xml
+Its previewer type: widget vbox json-view
+
+Running: testXMLWithUnknownMime
+Creating a NetworkRequest with mimeType: text/foobar
+Its previewer type: SearchableView > widget vbox
+
+Running: testXMLWithError500
+Creating a NetworkRequest with mimeType: text/xml
+Its previewer type: widget shadow-xml-view source-code
+
+Running: testUnknownMimeTextWithError500
+Creating a NetworkRequest with mimeType: text/foobar
+Its previewer type: SearchableView > widget vbox
+
+Running: testBinaryImageFile
+Creating a NetworkRequest with mimeType: image/png
+Its previewer type: SearchableView > widget vbox
+
+Running: testBinaryBlankImageFile
+Creating a NetworkRequest with mimeType: image/png
+Its previewer type: widget vbox empty-view
+
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-choose-preview-view.html b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-choose-preview-view.html
new file mode 100644
index 0000000..907186d6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-choose-preview-view.html
@@ -0,0 +1,87 @@
+<html>
+<head>
+<script src="../inspector-test.js"></script>
+<script src="../network-test.js"></script>
+<script>
+function test()
+{
+    function createNetworkRequest(mimeType, content, statusCode)
+    {
+        InspectorTest.addResult("Creating a NetworkRequest with mimeType: " + mimeType);
+        var request = new WebInspector.NetworkRequest(WebInspector.mainTarget, 0, 'http://localhost');
+        request.mimeType = mimeType;
+        request._content = content;
+        if (statusCode !== undefined)
+            request.statusCode = statusCode;
+        return request;
+    }
+
+    function getViewName(previewer)
+    {
+        if (!previewer)
+            return "** NONE **";
+        if (previewer instanceof WebInspector.SearchableView)
+            return "SearchableView > " + getViewName(previewer._searchProvider);
+        return previewer.contentElement.className;
+    }
+
+    function testPreviewer(request, callback)
+    {
+        var previewView = new WebInspector.RequestPreviewView(request, new WebInspector.RequestResponseView(request));
+
+        previewView._createPreviewView(function(previewer) {
+            InspectorTest.addResult("Its previewer type: " + getViewName(previewer));
+            callback();
+        });
+    }
+
+    function testType(contentType, content, statusCode, callback)
+    {
+        var request = createNetworkRequest(contentType, content, statusCode);
+        testPreviewer(request, callback);
+    }
+    InspectorTest.runTestSuite([
+        function testSimpleJSON(next)
+        {
+            testType("application/json", "[533,3223]", 200, next);
+        },
+        function testMimeJSON(next)
+        {
+            testType("application/vnd.document+json", "{foo0foo: 123}", 200, next);
+        },
+        function testSimpleXML(next)
+        {
+            testType("text/xml", "<bar><foo/></bar>", 200, next);
+        },
+        function testXMLMimeButJSON(next)
+        {
+            testType("text/xml", "{foo0: 'barr', 'barr': 'fooo'}", 200, next);
+        },
+        function testXMLWithUnknownMime(next)
+        {
+            testType("text/foobar", "<bar><foo/></bar>", 200, next);
+        },
+        function testXMLWithError500(next)
+        {
+            testType("text/xml", "<bar><foo/></bar>", 500, next);
+        },
+        function testUnknownMimeTextWithError500(next)
+        {
+            testType("text/foobar", "Foo Bar", 500, next);
+        },
+        function testBinaryImageFile(next)
+        {
+            testType("image/png", "Bin\0ary\1 File\0\0", 200, next);
+        },
+        function testBinaryBlankImageFile(next)
+        {
+            testType("image/png", "", 200, next);
+        },
+    ]);
+}
+</script>
+</head>
+<body onload="runTest()">
+<p>Tests to make sure the proper view is used for the data that is received in network panel.</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/http/tests/notifications/instrumentation-service-worker.js b/third_party/WebKit/LayoutTests/http/tests/notifications/instrumentation-service-worker.js
index 16c6b82..fcda391a 100644
--- a/third_party/WebKit/LayoutTests/http/tests/notifications/instrumentation-service-worker.js
+++ b/third_party/WebKit/LayoutTests/http/tests/notifications/instrumentation-service-worker.js
@@ -1,25 +1,21 @@
-importScripts('/resources/testharness-helpers.js');
-
-// For copying Notification.data. Currently a deep copy algorithm is used. Note
-// that the robustness of this function (and also |assert_object_equals| in
+// Deep-copies the attributes of |notification|. Note that the
+// robustness of this function (and also |assert_object_equals| in
 // testharness.js) affects the types of possible testing can be done.
 // TODO(peter): change this to a structured clone algorithm.
-function cloneObject(src) {
-    if (typeof src != 'object' || src === null)
-        return src;
-    var dst = Array.isArray(src) ? [] : {};
-    for (var property in src) {
-        if (src.hasOwnProperty(property))
-            dst[property] = cloneObject(src[property]);
-    }
-    return dst;
-}
-
-// Copies the serializable attributes of |notification|.
 function cloneNotification(notification) {
-    var copiedNotification = JSON.parse(stringifyDOMObject(notification));
-    copiedNotification.data = cloneObject(notification.data);
-    return copiedNotification;
+    function deepCopy(src) {
+        if (typeof src !== 'object' || src === null)
+            return src;
+        var dst = Array.isArray(src) ? [] : {};
+        for (var property in src) {
+            if (typeof src[property] === 'function')
+                continue;
+            dst[property] = deepCopy(src[property]);
+        }
+        return dst;
+    }
+
+    return deepCopy(notification);
 }
 
 // Allows a document to exercise the Notifications API within a service worker by sending commands.
diff --git a/third_party/WebKit/LayoutTests/http/tests/notifications/resources/request-permission-worker.js b/third_party/WebKit/LayoutTests/http/tests/notifications/resources/request-permission-worker.js
index 3203493..82220cd 100644
--- a/third_party/WebKit/LayoutTests/http/tests/notifications/resources/request-permission-worker.js
+++ b/third_party/WebKit/LayoutTests/http/tests/notifications/resources/request-permission-worker.js
@@ -1,5 +1,4 @@
 importScripts('../../serviceworker/resources/worker-testharness.js');
-importScripts('/resources/testharness-helpers.js');
 
 // TODO(peter): Have a more generic exposed-interface-test, also pulling in
 // the serviceworker-notification-event.js test.
diff --git a/third_party/WebKit/LayoutTests/http/tests/notifications/resources/serviceworker-notification-constructor.js b/third_party/WebKit/LayoutTests/http/tests/notifications/resources/serviceworker-notification-constructor.js
index 7294592..b61e709 100644
--- a/third_party/WebKit/LayoutTests/http/tests/notifications/resources/serviceworker-notification-constructor.js
+++ b/third_party/WebKit/LayoutTests/http/tests/notifications/resources/serviceworker-notification-constructor.js
@@ -1,5 +1,4 @@
 importScripts('../../serviceworker/resources/worker-testharness.js');
-importScripts('../../resources/testharness-helpers.js');
 
 test(function() {
     assert_true('Notification' in self);
diff --git a/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-broken.html b/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-broken.html
index e9da562..de8fde3 100644
--- a/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-broken.html
+++ b/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-broken.html
@@ -3,7 +3,6 @@
 <meta http-equiv="origin-trial" content="I am a website so Frobulate is yes" />
 <title>Test Sample API when trial is disabled (invalid token)</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/origin_trials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-disabled.html b/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-disabled.html
index c35173d..2db0b175 100644
--- a/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-disabled.html
+++ b/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-disabled.html
@@ -2,7 +2,6 @@
 <meta charset="utf-8">
 <title>Test Sample API when trial is disabled (no token)</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/origin_trials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-enabled-header.php b/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-enabled-header.php
index 1a82703..115608c2 100644
--- a/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-enabled-header.php
+++ b/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-enabled-header.php
@@ -10,7 +10,6 @@
 <meta charset="utf-8">
 <title>Test Sample API when trial is enabled</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/origin_trials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-enabled.html b/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-enabled.html
index 6b9ed43..43e0418 100644
--- a/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-enabled.html
+++ b/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-enabled.html
@@ -8,7 +8,6 @@
 -->
 <meta http-equiv="origin-trial" content="AlCoOPbezqtrGMzSzbLQC4c+oPqO6yuioemcBPjgcXajF8jtmZr4B8tJRPAARPbsX6hDeVyXCKHzEJfpBXvZgQEAAABReyJvcmlnaW4iOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAwIiwgImZlYXR1cmUiOiAiRnJvYnVsYXRlIiwgImV4cGlyeSI6IDIwMDAwMDAwMDB9" />
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/origin_trials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-expired.html b/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-expired.html
index acdae4d..e5f8b9f 100644
--- a/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-expired.html
+++ b/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-expired.html
@@ -10,7 +10,6 @@
 <meta http-equiv="origin-trial" content="AtA29m1y4Qfx7TACfDcePevArXCxKUObQS+TTb2bOi5YumkWgcWB5O0MasQU4cY4qZXXAQmbMBf7OtBh6qI2qA4AAABReyJvcmlnaW4iOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAwIiwgImZlYXR1cmUiOiAiRnJvYnVsYXRlIiwgImV4cGlyeSI6IDEwMDAwMDAwMDB9" />
 <title>Test Sample API when trial has expired</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/origin_trials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-multiple-tokens-header.php b/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-multiple-tokens-header.php
index 4b03d0f..21034e4 100644
--- a/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-multiple-tokens-header.php
+++ b/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-multiple-tokens-header.php
@@ -13,7 +13,6 @@
 <meta charset="utf-8">
 <title>Test Sample API when trial is enabled</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/origin_trials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-multiple-tokens.html b/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-multiple-tokens.html
index cc8a98b9..6fa124c 100644
--- a/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-multiple-tokens.html
+++ b/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-multiple-tokens.html
@@ -13,7 +13,6 @@
 <meta http-equiv="origin-trial" content="Avs0tgQGv771bXLAScGOi5VpjYdIW/nbb00qk3rH8T6/+7NVTlBosCz05fCg9Yb3N3P9h2IuadgfNtPTMMpirQwAAABYeyJvcmlnaW4iOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAwIiwgImZlYXR1cmUiOiAiRW5hYmxlTWFycXVlZVRhZyIsICJleHBpcnkiOiAyMDAwMDAwMDAwfQ==" />
 <title>Test Sample API when trial is enabled and multiple tokens are present</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/origin_trials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-stolen.html b/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-stolen.html
index 44a4af7..d59e895 100644
--- a/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-stolen.html
+++ b/third_party/WebKit/LayoutTests/http/tests/origin_trials/sample-api-stolen.html
@@ -9,7 +9,6 @@
 <meta http-equiv="origin-trial" content="AqIqd5EqkNMJncc7Klowr3EI/hk7Aw8VecWqlGxZN145I+d1A4nUu7QeN8bj0zjpMhTbNHoESXE4Ec+pTECLQgUAAABbeyJvcmlnaW4iOiAiaHR0cHM6Ly9pbnZhbGlkLmV4YW1wbGUuY29tOjQ0MyIsICJmZWF0dXJlIjogIkZyb2J1bGF0ZSIsICJleHBpcnkiOiAyMDAwMDAwMDAwfQ==" />
 <title>Test Sample API when token is present for a different origin</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/origin_trials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/permissions/resources/test-api-surface.js b/third_party/WebKit/LayoutTests/http/tests/permissions/resources/test-api-surface.js
index b1f66df..3aefbd69 100644
--- a/third_party/WebKit/LayoutTests/http/tests/permissions/resources/test-api-surface.js
+++ b/third_party/WebKit/LayoutTests/http/tests/permissions/resources/test-api-surface.js
@@ -5,13 +5,11 @@
         importScripts('../../serviceworker/resources/worker-testharness.js');
     else
         importScripts('../../resources/testharness.js');
-
-    importScripts('../../resources/testharness-helpers.js');
 }
 
 test(function() {
     assert_own_property(self, 'Permissions');
-    assert_will_be_idl_attribute(navigator, 'permissions', 'navigator.permissions exists');
+    assert_idl_attribute(navigator, 'permissions', 'navigator.permissions exists');
 
     assert_inherits(navigator.permissions, 'query');
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/interfaces-worker.js b/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/interfaces-worker.js
index a28338a..f91a8ed 100644
--- a/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/interfaces-worker.js
+++ b/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/interfaces-worker.js
@@ -1,11 +1,10 @@
 importScripts('/resources/testharness.js');
-importScripts('/resources/testharness-helpers.js');
 
 test(function() {
     assert_own_property(self, 'PushEvent');
 
     var event = new PushEvent('PushEvent');
-    assert_will_be_idl_attribute(event, 'data');
+    assert_idl_attribute(event, 'data');
     assert_equals(event.type, 'PushEvent');
 
     // PushEvent should be extending ExtendableEvent.
@@ -15,7 +14,7 @@
 
 test(function() {
     assert_own_property(self, 'PushManager', 'PushManager needs to be exposed as a global.');
-    assert_will_be_idl_attribute(registration, 'pushManager', 'PushManager needs to be exposed on the registration.');
+    assert_idl_attribute(registration, 'pushManager', 'PushManager needs to be exposed on the registration.');
 
     assert_inherits(registration.pushManager, 'subscribe');
     assert_inherits(registration.pushManager, 'getSubscription');
diff --git a/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/pushevent-extendable-event.js b/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/pushevent-extendable-event.js
index ca87e14a..9dfa490 100644
--- a/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/pushevent-extendable-event.js
+++ b/third_party/WebKit/LayoutTests/http/tests/push_messaging/resources/pushevent-extendable-event.js
@@ -1,12 +1,11 @@
 importScripts('../../serviceworker/resources/worker-testharness.js');
-importScripts('/resources/testharness-helpers.js');
 
 test(function() {
     assert_true('PushEvent' in self);
 
     var event = new PushEvent('PushEvent');
     assert_equals(event.type, 'PushEvent');
-    assert_will_be_idl_attribute(event, 'data');
+    assert_idl_attribute(event, 'data');
     assert_equals(event.cancelable, false);
     assert_equals(event.bubbles, false);
     assert_inherits(event, 'waitUntil');
diff --git a/third_party/WebKit/LayoutTests/http/tests/push_messaging/subscribe-success-in-document.html b/third_party/WebKit/LayoutTests/http/tests/push_messaging/subscribe-success-in-document.html
index 29684f0..c6fe0240 100644
--- a/third_party/WebKit/LayoutTests/http/tests/push_messaging/subscribe-success-in-document.html
+++ b/third_party/WebKit/LayoutTests/http/tests/push_messaging/subscribe-success-in-document.html
@@ -5,7 +5,6 @@
 <link rel="manifest" href="resources/push_manifest.json">
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../serviceworker/resources/test-helpers.js"></script>
 </head>
 <body>
@@ -26,7 +25,7 @@
             return swRegistration.pushManager.subscribe();
         })
         .then(function(pushSubscription) {
-            assert_will_be_idl_attribute(pushSubscription, 'endpoint');
+            assert_idl_attribute(pushSubscription, 'endpoint');
             assert_equals(typeof pushSubscription.endpoint, 'string');
 
             try {
diff --git a/third_party/WebKit/LayoutTests/http/tests/resources/testharness-helpers.js b/third_party/WebKit/LayoutTests/http/tests/resources/testharness-helpers.js
index 12960e3..e4885727 100644
--- a/third_party/WebKit/LayoutTests/http/tests/resources/testharness-helpers.js
+++ b/third_party/WebKit/LayoutTests/http/tests/resources/testharness-helpers.js
@@ -31,42 +31,3 @@
       }
     });
 }
-
-// Asserts that |object| that is an instance of some interface has the attribute
-// |attribute_name| following the conditions specified by WebIDL, but it's
-// acceptable that the attribute |attribute_name| is an own property of the
-// object because we're in the middle of moving the attribute to a prototype
-// chain.  Once we complete the transition to prototype chains,
-// assert_will_be_idl_attribute must be replaced with assert_idl_attribute
-// defined in testharness.js.
-//
-// FIXME: Remove assert_will_be_idl_attribute once we complete the transition
-// of moving the DOM attributes to prototype chains.  (http://crbug.com/43394)
-function assert_will_be_idl_attribute(object, attribute_name, description) {
-  assert_true(typeof object === "object", description);
-
-  assert_true("hasOwnProperty" in object, description);
-
-  // Do not test if |attribute_name| is not an own property because
-  // |attribute_name| is in the middle of the transition to a prototype
-  // chain.  (http://crbug.com/43394)
-
-  assert_true(attribute_name in object, description);
-}
-
-// Stringifies a DOM object.  This function stringifies not only own properties
-// but also DOM attributes which are on a prototype chain.  Note that
-// JSON.stringify only stringifies own properties.
-function stringifyDOMObject(object)
-{
-    function deepCopy(src) {
-        if (typeof src != "object")
-            return src;
-        var dst = Array.isArray(src) ? [] : {};
-        for (var property in src) {
-            dst[property] = deepCopy(src[property]);
-        }
-        return dst;
-    }
-    return JSON.stringify(deepCopy(object));
-}
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-deny-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-deny-expected.txt
index 1901d2d9..fd2d60f 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-deny-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-deny-expected.txt
@@ -1,5 +1,6 @@
 http://127.0.0.1:8000/security/XFrameOptions/resources/x-frame-options-deny.cgi - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/security/XFrameOptions/resources/x-frame-options-deny.cgi, main document URL http://127.0.0.1:8000/security/XFrameOptions/x-frame-options-deny.html, http method GET> redirectResponse (null)
 CONSOLE ERROR: Refused to display 'http://127.0.0.1:8000/security/XFrameOptions/resources/x-frame-options-deny.cgi' in a frame because it set 'X-Frame-Options' to 'deny'.
+http://127.0.0.1:8000/security/XFrameOptions/resources/x-frame-options-deny.cgi - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/security/XFrameOptions/resources/x-frame-options-deny.cgi, http status code 200>
 http://127.0.0.1:8000/security/XFrameOptions/resources/x-frame-options-deny.cgi - didFinishLoading
 CONSOLE MESSAGE: line 14: PASS: Access to contentWindow.location.href threw an exception.
 There should be no content in the iframe below
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-multiple-headers-conflict-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-multiple-headers-conflict-expected.txt
index 454a586..e5d8b29 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-multiple-headers-conflict-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/security/XFrameOptions/x-frame-options-multiple-headers-conflict-expected.txt
@@ -1,6 +1,7 @@
 http://127.0.0.1:8000/security/XFrameOptions/resources/x-frame-options-multiple-headers-conflict.cgi - willSendRequest <NSURLRequest URL http://127.0.0.1:8000/security/XFrameOptions/resources/x-frame-options-multiple-headers-conflict.cgi, main document URL http://127.0.0.1:8000/security/XFrameOptions/x-frame-options-multiple-headers-conflict.html, http method GET> redirectResponse (null)
 CONSOLE ERROR: Multiple 'X-Frame-Options' headers with conflicting values ('ALLOWALL, DENY') encountered when loading 'http://127.0.0.1:8000/security/XFrameOptions/resources/x-frame-options-multiple-headers-conflict.cgi'. Falling back to 'DENY'.
 CONSOLE ERROR: Refused to display 'http://127.0.0.1:8000/security/XFrameOptions/resources/x-frame-options-multiple-headers-conflict.cgi' in a frame because it set 'X-Frame-Options' to 'ALLOWALL, DENY'.
+http://127.0.0.1:8000/security/XFrameOptions/resources/x-frame-options-multiple-headers-conflict.cgi - didReceiveResponse <NSURLResponse http://127.0.0.1:8000/security/XFrameOptions/resources/x-frame-options-multiple-headers-conflict.cgi, http status code 200>
 http://127.0.0.1:8000/security/XFrameOptions/resources/x-frame-options-multiple-headers-conflict.cgi - didFinishLoading
 The frame below should not load, and a console message should be generated that notes the invalid header.
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/img-blocked-no-gc-crash-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/img-blocked-no-gc-crash-expected.txt
index deb8fb7a..1fce13f 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/img-blocked-no-gc-crash-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/img-blocked-no-gc-crash-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE ERROR: line 265: Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'unsafe-inline'".
+CONSOLE ERROR: line 248: Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'unsafe-inline'".
 
 CONSOLE ERROR: Refused to load the image 'http://127.0.0.1:8000/security/resources/abe.png' because it violates the following Content Security Policy directive: "img-src 'none'".
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/invalid-meta-directives-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/invalid-meta-directives-expected.txt
index 6696886..3a80d06 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/invalid-meta-directives-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/invalid-meta-directives-expected.txt
@@ -1,6 +1,6 @@
-CONSOLE ERROR: line 8: Content Security Policies delivered via a <meta> element may not contain the sandbox directive.
-CONSOLE ERROR: line 8: Content Security Policies delivered via a <meta> element may not contain the frame-ancestors directive.
-CONSOLE ERROR: line 8: Content Security Policies delivered via a <meta> element may not contain the report-uri directive.
+CONSOLE ERROR: line 7: Content Security Policies delivered via a <meta> element may not contain the sandbox directive.
+CONSOLE ERROR: line 7: Content Security Policies delivered via a <meta> element may not contain the frame-ancestors directive.
+CONSOLE ERROR: line 7: Content Security Policies delivered via a <meta> element may not contain the report-uri directive.
 This is a testharness.js-based test.
 PASS Invalid directives in meta-delivered CSP 
 Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/invalid-meta-directives.html b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/invalid-meta-directives.html
index 5810894d..e7f72d9d 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/invalid-meta-directives.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/invalid-meta-directives.html
@@ -3,7 +3,6 @@
 <head>
     <title>Invalid directives in meta-delivered CSP</title>
     <script src="/resources/testharness.js"></script>
-    <script src="/resources/testharness-helpers.js"></script>
     <script src="/resources/testharnessreport.js"></script>
 	<meta http-equiv="Content-Security-Policy" content="sandbox allow-scripts; frame-ancestors 'none'; report-uri http://foo.test">
 </head>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/cors-rfc1918/addressspace-serviceworker-basic.html b/third_party/WebKit/LayoutTests/http/tests/security/cors-rfc1918/addressspace-serviceworker-basic.html
new file mode 100644
index 0000000..a61bc2b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/security/cors-rfc1918/addressspace-serviceworker-basic.html
@@ -0,0 +1,11 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/addressspace-test.js"></script>
+<script>
+    window.onload = function () {
+        addressSpaceTest("http://localhost:8000", "serviceworker", "local");
+        addressSpaceTest("http://127.0.0.1:8000", "serviceworker", "local");
+        addressSpaceTest("https://example.test:8443", "serviceworker", "private");
+    };
+</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/cors-rfc1918/resources/addressspace-test.js b/third_party/WebKit/LayoutTests/http/tests/security/cors-rfc1918/resources/addressspace-test.js
index c7738bbf..1f03547 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/cors-rfc1918/resources/addressspace-test.js
+++ b/third_party/WebKit/LayoutTests/http/tests/security/cors-rfc1918/resources/addressspace-test.js
@@ -12,6 +12,8 @@
         file = "post-addressspace-from-worker.html";
     } else if (type == "sharedworker") {
         file = "post-addressspace-from-sharedworker.html";
+    } else if (type == "serviceworker") {
+        file = "post-addressspace-from-serviceworker.html";
     }
 
     var i = document.createElement('iframe');
@@ -24,8 +26,8 @@
         var i = createIFrame(origin, type);
         window.addEventListener("message", t.step_func(function (e) {
             if (e.source == i.contentWindow) {
-                assert_equals(e.data.origin, origin);
-                assert_equals(e.data.addressSpace, expected);
+                assert_equals(e.data.origin, origin, 'origin');
+                assert_equals(e.data.addressSpace, expected, 'addressSpace');
                 if (callback)
                     callback();
                 t.done();
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/cors-rfc1918/resources/post-addressspace-from-serviceworker.html b/third_party/WebKit/LayoutTests/http/tests/security/cors-rfc1918/resources/post-addressspace-from-serviceworker.html
new file mode 100644
index 0000000..771e616
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/security/cors-rfc1918/resources/post-addressspace-from-serviceworker.html
@@ -0,0 +1,32 @@
+<script src='/serviceworker/resources/test-helpers.js'></script>
+<script>
+    function postDataToParent(e) {
+        window.parent.postMessage(e.data, "*");
+    }
+
+    var script = "/security/cors-rfc1918/resources/post-addressspace-to-owner-serviceworker.js";
+    var scope = "/security/cors-rfc1918/resources/post-addressspace-from-serviceworker.html";
+    var registration;
+
+    var t = { step_func: f => f};
+    service_worker_unregister_and_register(t, script, scope)
+        .then(r => {
+          if (!r) {
+              throw({ name: "WTF" });
+          }
+          registration = r;
+          return wait_for_state(t, registration.installing, 'activated');
+        })
+        .then(_ => {
+            return new Promise(resolve => {
+                var ports = new MessageChannel();
+                ports.port1.onmessage = e => {
+                    postDataToParent(e);
+                    resolve();
+                };
+                registration.active.postMessage("go", [ports.port2]);
+            });
+        })
+        .then(_ => service_worker_unregister(t, scope))
+        .catch(e => window.parent.postMessage({ "origin": e.name }, "*"));
+</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/cors-rfc1918/resources/post-addressspace-to-owner-serviceworker.js b/third_party/WebKit/LayoutTests/http/tests/security/cors-rfc1918/resources/post-addressspace-to-owner-serviceworker.js
new file mode 100644
index 0000000..0cc9ded
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/security/cors-rfc1918/resources/post-addressspace-to-owner-serviceworker.js
@@ -0,0 +1,10 @@
+self.addEventListener('message', e => {
+    e.ports[0].postMessage({
+        "origin": self.location.origin,
+        "addressSpace": self.addressSpace
+    });
+    self.registration.active.postMessage({
+        "origin": self.location.origin,
+        "addressSpace": self.addressSpace
+    });
+});
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-enumeration.html b/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-enumeration.html
index b387fdc..22466f3 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-enumeration.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-enumeration.html
@@ -9,16 +9,6 @@
                 testRunner.waitUntilDone();
             }
 
-            window.addEventListener('message', function ()
-            {
-                runTest();
-                if (window.testRunner)
-                    testRunner.notifyDone();
-            });
-        }
-    
-        runTest = function()
-        {
             // Test enumerating the Window object
             var b_win = document.getElementsByTagName("iframe")[0].contentWindow;
             try {
@@ -34,7 +24,7 @@
 
             try {
                 var b_winKeys = Object.keys(b_win);
-                if (b_winKeys.indexOf("customWindowProperty") != -1) { 
+                if (b_winKeys.indexOf("customWindowProperty") != -1) {
                     log("FAIL: Cross frame access by getting the keys of the window object was allowed.");
                     return;
                 }
@@ -80,6 +70,9 @@
                 return;
             }
             log("PASS: Cross frame access by getting the property names of the Location object revealed no custom properties.");
+
+            if (window.testRunner)
+                testRunner.notifyDone();
         }
     </script>
 </head>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-get-custom-property-cached.html b/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-get-custom-property-cached.html
index 85b95ac..18b4dda 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-get-custom-property-cached.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-get-custom-property-cached.html
@@ -9,12 +9,14 @@
                 testRunner.waitUntilDone();
             }
 
-            window.addEventListener('message', function ()
-            {
-                runTest();
-                if (window.testRunner)
-                    testRunner.notifyDone();
-            });
+            window.targetWindow = frames[0];
+
+            shouldBeTrue("customPropertyAccessThrowsException(targetWindow)");
+            shouldBeTrue("customPropertyAccessThrowsException(targetWindow)");
+            shouldBeTrue("customPropertyAccessThrowsException(targetWindow)");
+
+            if (window.testRunner)
+                testRunner.notifyDone();
         }
 
         function customPropertyAccessThrowsException(o)
@@ -26,15 +28,6 @@
                 return true;
             }
         }
-
-        runTest = function()
-        {
-            window.targetWindow = frames[0];
-
-            shouldBeTrue("customPropertyAccessThrowsException(targetWindow)");
-            shouldBeTrue("customPropertyAccessThrowsException(targetWindow)");
-            shouldBeTrue("customPropertyAccessThrowsException(targetWindow)");
-        }
     </script>
 </head>
 <body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-get-override.html b/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-get-override.html
index b69d89a..75d7963 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-get-override.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-get-override.html
@@ -9,18 +9,9 @@
                 testRunner.waitUntilDone();
             }
 
-            window.addEventListener('message', function () {
-                runTest();
-                if (window.testRunner)
-                    testRunner.notifyDone();
-            });
-        }
-
-        runTest = function()
-        {
             window.targetWindow = frames[0];
 
-            log("----- tests for getting a targetWindow's functions which have custom overrides.  The desired " + 
+            log("----- tests for getting a targetWindow's functions which have custom overrides.  The desired " +
                 " behavior is for the targetWindow to return the built-in function, not the override -----\n");
 
             // Overriden using window.focus = function() { return "new focus" }
@@ -34,6 +25,9 @@
             // Overriden using window.history.close = "new close"
             shouldBeTrue("canGet('targetWindow.close')");
             shouldBe("toString('targetWindow.close')", "toString('window.close')");
+
+            if (window.testRunner)
+                testRunner.notifyDone();
         }
     </script>
 </head>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-get.html b/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-get.html
index 4213cd7..f29a4e1 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-get.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-get.html
@@ -218,16 +218,6 @@
                 testRunner.waitUntilDone();
             }
 
-            window.addEventListener('message', function()
-            {
-                runTest();
-                if (window.testRunner)
-                    testRunner.notifyDone();
-            });
-        }
-
-        runTest = function()
-        {
             window.targetWindow = frames[0];
 
             log("\n----- tests for getting of allowed properties -----\n");
@@ -265,6 +255,9 @@
                     log("Firefox allows access to 'document' but throws an exception when you access its properties.");
                 shouldBeFalse("canGet('targetWindow." + property + "')");
             }
+
+            if (window.testRunner)
+                testRunner.notifyDone();
         }
     </script>
 </head>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-getOwnPropertyDescriptor.html b/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-getOwnPropertyDescriptor.html
index b5d8e5d..cd2cc70 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-getOwnPropertyDescriptor.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-getOwnPropertyDescriptor.html
@@ -219,16 +219,6 @@
                 testRunner.waitUntilDone();
             }
 
-            window.addEventListener('message', function()
-            {
-                runTest();
-                if (window.testRunner)
-                    testRunner.notifyDone();
-            });
-        }
-
-        runTest = function()
-        {
             window.targetWindow = frames[0];
 
             log("\n----- tests for getting of not allowed properties -----\n");
@@ -275,6 +265,9 @@
 
             log("----- tests access to cross domain history object -----");
             shouldThrowException("targetWindow.history");
+
+            if (window.testRunner)
+                testRunner.notifyDone();
         }
     </script>
 </head>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-location-get-override.html b/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-location-get-override.html
index 943eb9b..de4c657 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-location-get-override.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-location-get-override.html
@@ -9,19 +9,9 @@
                 testRunner.waitUntilDone();
             }
 
-            window.addEventListener('message', function ()
-            {
-                runTest();
-                if (window.testRunner)
-                    testRunner.notifyDone();
-            });
-        }
-
-        runTest = function()
-        {
             window.targetWindow = frames[0];
 
-            log("----- tests for getting a targetWindow's location object's functions which have custom overrides.  The" + 
+            log("----- tests for getting a targetWindow's location object's functions which have custom overrides.  The" +
                 " desired behavior is for the targetWindow to return the builtin function, not the override -----\n");
 
             // We should test overriding using window.location.__proto__ once the Location object has a proper prototype.
@@ -36,6 +26,9 @@
             // Overriden using window.location.reload = "new replace"
             shouldBeTrue("canGet('targetWindow.location.replace')");
             shouldBe("toString('targetWindow.location.replace')", "toString('window.location.replace')");
+
+            if (window.testRunner)
+                testRunner.notifyDone();
         }
     </script>
 </head>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-location-get.html b/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-location-get.html
index 9f17799..a174277 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-location-get.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/cross-frame-access-location-get.html
@@ -9,16 +9,6 @@
                 testRunner.waitUntilDone();
             }
 
-            window.addEventListener('message', function ()
-            {
-                runTest();
-                if (window.testRunner)
-                    testRunner.notifyDone();
-            });
-        }
-
-        runTest = function()
-        {
             window.targetWindow = frames[0];
 
             log("\n----- tests for getting window.location's properties -----\n");
@@ -56,6 +46,8 @@
             shouldBeTrue("canGet('targetWindow.location.assign')");
             shouldBeTrue("canGet('targetWindow.location.replace')");
 
+            if (window.testRunner)
+                testRunner.notifyDone();
         }
     </script>
 </head>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/cross-origin-OffscreenCanvas2D-transferToImageBitmap-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/cross-origin-OffscreenCanvas2D-transferToImageBitmap-expected.txt
new file mode 100644
index 0000000..3df44e17
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/security/cross-origin-OffscreenCanvas2D-transferToImageBitmap-expected.txt
@@ -0,0 +1,10 @@
+The taintedness of the imagebitmap drawn to OffscrenCanvas must be transfered
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS ImageBitmap is tainted. Threw error: SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/cross-origin-OffscreenCanvas2D-transferToImageBitmap.html b/third_party/WebKit/LayoutTests/http/tests/security/cross-origin-OffscreenCanvas2D-transferToImageBitmap.html
new file mode 100644
index 0000000..d99965f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/security/cross-origin-OffscreenCanvas2D-transferToImageBitmap.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<body>
+<canvas id='output' width='200' height='400'></canvas>
+<script src="/js-test-resources/js-test.js"></script>
+<script id='myWorker' type='text/worker'>
+self.onmessage = function(e) {
+    var aCanvas = new OffscreenCanvas(200, 400);
+    var ctx = aCanvas.getContext('2d');
+
+    // Draw a tainted imagebitmap into OffscreenCanvas 2d
+    ctx.drawImage(e.data, 0, 0, 10, 10);
+
+    var image = aCanvas.transferToImageBitmap();
+    self.postMessage(image, [image]);
+};
+</script>
+<script>
+description("The taintedness of the imagebitmap drawn to OffscrenCanvas must be transfered");
+
+window.jsTestIsAsync = true;
+
+function shouldBeTainted(imageBitmap) {
+    var canvas = document.createElement("canvas");
+    canvas.width = 10;
+    canvas.height = 10;
+    var context = canvas.getContext("2d");
+    context.drawImage(imageBitmap, 0, 0, 10, 10);
+    try {
+        var imageData = context.getImageData(0, 0, 10, 10);
+        testFailed("ImageBitmap is not tainted.");
+    } catch (e) {
+        testPassed("ImageBitmap is tainted. Threw error: " + e);
+    }
+}
+
+var blob = new Blob([document.getElementById('myWorker').textContent]);
+var worker = new Worker(URL.createObjectURL(blob));
+worker.addEventListener('message', msg => {
+    shouldBeTainted(msg.data);
+    finishJSTest();
+});
+
+var image = document.createElement('img');
+image.src = 'http://localhost:8080/security/resources/abe.png';
+image.addEventListener('load', function() {
+    createImageBitmap(image, 0, 0, 10, 10).then(
+        function(imagebitmap) {
+            // Post the tainted imagebitmap to worker
+            worker.postMessage(imagebitmap, [imagebitmap]);
+        },
+        function(e) {
+            testFailed("Image rejected unexpectedly. ");
+            debug(e);
+        }
+    );
+});
+
+</script>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-eventsource-in-main-frame-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-eventsource-in-main-frame-expected.txt
index 57db5fa5..4807960 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-eventsource-in-main-frame-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/insecure-eventsource-in-main-frame-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: Mixed Content: The page at 'https://127.0.0.1:8443/security/mixedContent/resources/frame-with-insecure-eventsource.html' was loaded over HTTPS, but requested an insecure EventSource endpoint 'http://127.0.0.1:8000/eventsource/resources/simple-event-stream.asis'. This content should also be served over HTTPS.
+CONSOLE WARNING: Mixed Content: The page at 'https://127.0.0.1:8443/security/mixedContent/resources/frame-with-insecure-eventsource.html' was loaded over HTTPS, but requested an insecure EventSource endpoint 'http://127.0.0.1:8000/security/mixedContent/resources/simple-event-stream.pl'. This content should also be served over HTTPS.
 This test opens a HTTPS window that loads insecure data via EventSource. We should trigger a mixed content callback because the main frame in the window is HTTPS but now has insecure data.
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/resources/frame-with-insecure-eventsource.html b/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/resources/frame-with-insecure-eventsource.html
index b71065c3..58bb46b 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/resources/frame-with-insecure-eventsource.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/resources/frame-with-insecure-eventsource.html
@@ -1,8 +1,7 @@
 <script>
-var es = new EventSource("http://127.0.0.1:8000/eventsource/resources/simple-event-stream.asis");
-
-window.onload = function() {
+var es = new EventSource("http://127.0.0.1:8000/security/mixedContent/resources/simple-event-stream.pl");
+es.addEventListener("error", function() {
     if (window.opener)
         window.opener.postMessage('done', '*');
-};
+});
 </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/resources/simple-event-stream.pl b/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/resources/simple-event-stream.pl
new file mode 100755
index 0000000..c931691
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/security/mixedContent/resources/simple-event-stream.pl
@@ -0,0 +1,6 @@
+#!/usr/bin/perl
+print "Content-type: text/event-stream\r\n";
+print "Access-Control-Allow-Origin: *\r\n";
+print "\r\n";
+print "data: hello\r\n";
+print "\r\n";
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/powerfulFeatureRestrictions/durable-storage-on-insecure-origin.html b/third_party/WebKit/LayoutTests/http/tests/security/powerfulFeatureRestrictions/durable-storage-on-insecure-origin.html
index 895eaaa..5498c84b 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/powerfulFeatureRestrictions/durable-storage-on-insecure-origin.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/powerfulFeatureRestrictions/durable-storage-on-insecure-origin.html
@@ -9,7 +9,7 @@
     window.location = get_host_info().UNAUTHENTICATED_ORIGIN + window.location.pathname;
 } else {
     promise_test(function() {
-        return assert_promise_rejects(navigator.storage.requestPersistent(), 'SecurityError');
+        return assert_promise_rejects(navigator.storage.persist(), 'SecurityError');
     }, "Requires secure context");
 }
 </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-access-get-custom-property-cached-iframe.html b/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-access-get-custom-property-cached-iframe.html
index ae6e8e2..0d4e4dc 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-access-get-custom-property-cached-iframe.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-access-get-custom-property-cached-iframe.html
@@ -1,12 +1,7 @@
 <html>
 <head>
     <script>
-        window.customProperty = 1; 
-
-        window.onload = function()
-        {
-            window.parent.postMessage('ready', '*');
-        }
+        window.customProperty = 1;
     </script>
 </head>
 <body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-enumeration-test.html b/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-enumeration-test.html
index 3703f67..b565c6a 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-enumeration-test.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-enumeration-test.html
@@ -2,9 +2,4 @@
     window.customWindowProperty = 1;
     window.history.customHistoryProperty = 1;
     window.location.customLocationProperty = 1;
-
-    window.onload = function()
-    {
-        window.parent.postMessage('ready', '*');
-    }
 </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-get-override-test.html b/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-get-override-test.html
index 1fac1354..8f03d3a0 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-get-override-test.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-get-override-test.html
@@ -5,11 +5,6 @@
         window.focus = function() { return "new focus"; }
         window.__proto__.blur = function() { return "new blur"; }
         window.history.close = "new close";
-
-        window.onload = function()
-        {
-            window.parent.postMessage('ready', '*');
-        }
     </script>
 </head>
 <body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-get-test.html b/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-get-test.html
index 2031e08a..2cc9db46 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-get-test.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-get-test.html
@@ -6,11 +6,6 @@
         window.Object.prototype.objectPrototypeCustomProperty = 1;
         window.location.customProperty = 1;
         window.history.customProperty = 1;
-
-        window.onload = function()
-        {
-            window.parent.postMessage('start', '*');
-        }
     </script>
 </head>
 <body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-location-get-override-test.html b/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-location-get-override-test.html
index e513981f..adc1690 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-location-get-override-test.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-location-get-override-test.html
@@ -4,11 +4,6 @@
         window.location.assign = function() { return "new assign"; }
         window.location.reload = "new reload";
         window.location.replace = "new replace";
-
-        window.onload = function()
-        {
-            window.parent.postMessage('ready', '*');
-        }
     </script>
 </head>
 <body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-location-get-test.html b/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-location-get-test.html
index f232307..9fd1cde 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-location-get-test.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-location-get-test.html
@@ -3,11 +3,6 @@
     <script>
         window.location.existingCustomProperty = 1;
         window.location[1] = 1;
-
-        window.onload = function()
-        {
-            window.parent.postMessage('ready', '*');
-        }
     </script>
 </head>
 <body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/127.0.0.1.html b/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/127.0.0.1.html
index bd9f8517..d175b55 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/127.0.0.1.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/127.0.0.1.html
@@ -3,7 +3,6 @@
 <head>
     <title>127.0.0.1 is secure</title>
     <script src="/resources/testharness.js"></script>
-    <script src="/resources/testharness-helpers.js"></script>
     <script src="/resources/testharnessreport.js"></script>
     <script src="/resources/get-host-info.js"></script>
 </head>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/authenticated_sandbox.html b/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/authenticated_sandbox.html
index f8904616..ffd704a 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/authenticated_sandbox.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/authenticated_sandbox.html
@@ -3,7 +3,6 @@
 <head>
     <title>Authenticated origin with sandbox iframe is secure</title>
     <script src="/resources/testharness.js"></script>
-    <script src="/resources/testharness-helpers.js"></script>
     <script src="/resources/testharnessreport.js"></script>
     <script src="/resources/get-host-info.js"></script>
 </head>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/authenticated_srcdoc.html b/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/authenticated_srcdoc.html
index bc34fd8..62a2905 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/authenticated_srcdoc.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/authenticated_srcdoc.html
@@ -3,7 +3,6 @@
 <head>
     <title>Authenticated origin with srcdoc iframe is secure</title>
     <script src="/resources/testharness.js"></script>
-    <script src="/resources/testharness-helpers.js"></script>
     <script src="/resources/testharnessreport.js"></script>
     <script src="/resources/get-host-info.js"></script>
 </head>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/localhost.html b/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/localhost.html
index c49a9ab..d53fd639 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/localhost.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/localhost.html
@@ -3,7 +3,6 @@
 <head>
     <title>Locahost is secure</title>
     <script src="/resources/testharness.js"></script>
-    <script src="/resources/testharness-helpers.js"></script>
     <script src="/resources/testharnessreport.js"></script>
     <script src="/resources/get-host-info.js"></script>
 </head>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/resources/dynamically-sandbox-and-iframe-https.html b/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/resources/dynamically-sandbox-and-iframe-https.html
index a982914..59b6baf4 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/resources/dynamically-sandbox-and-iframe-https.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/resources/dynamically-sandbox-and-iframe-https.html
@@ -3,7 +3,6 @@
 <head>
     <title>Dynamically apply sandbox and include HTTPS iframe</title>
     <script src="/resources/testharness.js"></script>
-    <script src="/resources/testharness-helpers.js"></script>
     <script src="/resources/testharnessreport.js"></script>
     <script src="/resources/get-host-info.js"></script>
 </head>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/unauthenticated.html b/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/unauthenticated.html
index 7881099..e8f644c 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/unauthenticated.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/unauthenticated.html
@@ -3,7 +3,6 @@
 <head>
     <title>Unauthenticated origin is insecure</title>
     <script src="/resources/testharness.js"></script>
-    <script src="/resources/testharness-helpers.js"></script>
     <script src="/resources/testharnessreport.js"></script>
     <script src="/resources/get-host-info.js"></script>
 </head>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/unauthenticated_sandbox.html b/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/unauthenticated_sandbox.html
index ac3aa132..f34c64c 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/unauthenticated_sandbox.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/unauthenticated_sandbox.html
@@ -3,7 +3,6 @@
 <head>
     <title>Unauthenticated origin with sandbox iframe is insecure</title>
     <script src="/resources/testharness.js"></script>
-    <script src="/resources/testharness-helpers.js"></script>
     <script src="/resources/testharnessreport.js"></script>
     <script src="/resources/get-host-info.js"></script>
 </head>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/unauthenticated_srcdoc.html b/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/unauthenticated_srcdoc.html
index 094728f..56efdd82 100644
--- a/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/unauthenticated_srcdoc.html
+++ b/third_party/WebKit/LayoutTests/http/tests/security/secureContexts/unauthenticated_srcdoc.html
@@ -3,7 +3,6 @@
 <head>
     <title>Unauthenticated origin with srcdoc iframe is insecure</title>
     <script src="/resources/testharness.js"></script>
-    <script src="/resources/testharness-helpers.js"></script>
     <script src="/resources/testharnessreport.js"></script>
     <script src="/resources/get-host-info.js"></script>
 </head>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/chromium/fetch-event-synthetic-respond-with.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/chromium/fetch-event-synthetic-respond-with.html
index e5c65dff..12e8a7d2 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/chromium/fetch-event-synthetic-respond-with.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/chromium/fetch-event-synthetic-respond-with.html
@@ -1,6 +1,5 @@
 <!DOCTYPE html>
 <script src="/resources/testharness.js"></script>
-<script src="/resources/testharness-helpers.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="../resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/chromium/force-refresh-ready.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/chromium/force-refresh-ready.html
index f825b9b..de543652 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/chromium/force-refresh-ready.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/chromium/force-refresh-ready.html
@@ -3,12 +3,11 @@
 is not defined by spec. -->
 <title>Service Worker: force-refresh ready test</title>
 <script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharness-helpers.js"></script>
 <script src="../../resources/testharnessreport.js"></script>
 <script src="../resources/test-helpers.js"></script>
 <body>
 <script>
-  
+
 promise_test(function(t) {
     var scope = '../resources/blank.html';
     var script_url = '../resources/empty-worker.js';
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/chromium/postmessage-after-terminate.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/chromium/postmessage-after-terminate.html
index 60b65c5..a5dc034 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/chromium/postmessage-after-terminate.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/chromium/postmessage-after-terminate.html
@@ -2,7 +2,6 @@
 <title>Tests that postMessage works during and after terminating a service worker</title>
 <script src="../../resources/testharness.js"></script>
 <script src="../../resources/testharnessreport.js"></script>
-<script src="../../resources/testharness-helpers.js"></script>
 <script src="../resources/test-helpers.js"></script>
 <script>
 function send_ping(worker) {
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/chromium/unregister-on-detached-iframe.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/chromium/unregister-on-detached-iframe.html
index 408037e..b983801 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/chromium/unregister-on-detached-iframe.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/chromium/unregister-on-detached-iframe.html
@@ -3,7 +3,6 @@
 <title>Service Worker: Unregistration on detached iframe context</title>
 <script src="../../resources/testharness.js"></script>
 <script src="../../resources/testharnessreport.js"></script>
-<script src="../../resources/testharness-helpers.js"></script>
 <script src="../resources/test-helpers.js"></script>
 <script>
 promise_test(function(t) {
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/claim-not-using-registration.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/claim-not-using-registration.html
index 135d73ae..a30a629 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/claim-not-using-registration.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/claim-not-using-registration.html
@@ -1,7 +1,6 @@
 <!DOCTYPE html>
 <title>Service Worker: claim client not using registration</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/claim-using-registration.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/claim-using-registration.html
index f1f9ed09..35c6050 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/claim-using-registration.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/claim-using-registration.html
@@ -1,7 +1,6 @@
 <!DOCTYPE html>
 <title>Service Worker: claim client using registration</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/extendable-event-async-waituntil.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/extendable-event-async-waituntil.html
index 9e12cb6..5a7b1c3 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/extendable-event-async-waituntil.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/extendable-event-async-waituntil.html
@@ -1,6 +1,5 @@
 <!DOCTYPE html>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
@@ -11,7 +10,7 @@
 
     return service_worker_unregister_and_register(t, script, scope)
       .then(function(registration) {
-          worker = registration.installing; 
+          worker = registration.installing;
           return wait_for_state(t, worker, 'activated');
         })
       .then(function() {
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/fetch-event-async-respond-with.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/fetch-event-async-respond-with.html
index f911041..bb2bb8f 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/fetch-event-async-respond-with.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/fetch-event-async-respond-with.html
@@ -1,6 +1,5 @@
 <!DOCTYPE html>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/fetch-event-network-error.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/fetch-event-network-error.html
index 567ffc1..0775f7f 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/fetch-event-network-error.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/fetch-event-network-error.html
@@ -1,7 +1,6 @@
 <!DOCTYPE html>
 <title>Service Worker: Fetch event network error</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/fetch-event-respond-with-argument.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/fetch-event-respond-with-argument.html
index ba69cc7..de61d9f 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/fetch-event-respond-with-argument.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/fetch-event-respond-with-argument.html
@@ -1,7 +1,6 @@
 <!DOCTYPE html>
 <title>Service Worker: FetchEvent.respondWith() argument type test.</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/fetch-event-respond-with-stops-propagation.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/fetch-event-respond-with-stops-propagation.html
index d49ceed9..c6e179e 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/fetch-event-respond-with-stops-propagation.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/fetch-event-respond-with-stops-propagation.html
@@ -1,6 +1,5 @@
 <!DOCTYPE html>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/getregistrations.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/getregistrations.html
index 42b9a95..2f51475 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/getregistrations.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/getregistrations.html
@@ -2,7 +2,6 @@
 <title>Service Worker: getRegistrations()</title>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script src="../resources/get-host-info.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/http-to-https-redirect-and-register.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/http-to-https-redirect-and-register.html
index 5a498c95..cce684a 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/http-to-https-redirect-and-register.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/http-to-https-redirect-and-register.html
@@ -1,7 +1,6 @@
 <!DOCTYPE html>
 <title>register on a secure page after redirect from an non-secure url</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="../resources/get-host-info.js?pipe=sub"></script>
 <script src="resources/test-helpers.js"></script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/install-event-type.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/install-event-type.html
index e6b865c6..4b6d9b0 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/install-event-type.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/install-event-type.html
@@ -1,6 +1,5 @@
 <!DOCTYPE html>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/onactivate-script-error.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/onactivate-script-error.html
index fd946e1c..bbe028e8 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/onactivate-script-error.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/onactivate-script-error.html
@@ -1,6 +1,5 @@
 <!DOCTYPE html>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/oninstall-script-error.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/oninstall-script-error.html
index 55fad3b..bd5a0610 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/oninstall-script-error.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/oninstall-script-error.html
@@ -1,6 +1,5 @@
 <!DOCTYPE html>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/register-default-scope.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/register-default-scope.html
index 619ce06..575632b 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/register-default-scope.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/register-default-scope.html
@@ -1,7 +1,6 @@
 <!DOCTYPE html>
 <title>register() and scope</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/register-foreign-fetch-errors.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/register-foreign-fetch-errors.html
index c150380b..b16797f5 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/register-foreign-fetch-errors.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/register-foreign-fetch-errors.html
@@ -1,6 +1,5 @@
 <!DOCTYPE html>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/register-wait-forever-in-install-worker.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/register-wait-forever-in-install-worker.html
index b98b62e9..07a85d5 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/register-wait-forever-in-install-worker.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/register-wait-forever-in-install-worker.html
@@ -1,7 +1,6 @@
 <!DOCTYPE html>
 <title>Service Worker: Register wait-forever-in-install-worker</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/interfaces-worker.js b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/interfaces-worker.js
index f74f7d9..a72adbd 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/interfaces-worker.js
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/interfaces-worker.js
@@ -1,6 +1,5 @@
 importScripts('interfaces.js');
 importScripts('worker-testharness.js');
-importScripts('/resources/testharness-helpers.js');
 
 var EVENT_HANDLER = 'object';
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/serviceworker-message-event.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/serviceworker-message-event.html
index e393f53..66e29612 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/serviceworker-message-event.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/serviceworker-message-event.html
@@ -1,7 +1,6 @@
 <!DOCTYPE html>
 <title>Service Worker: ServiceWorkerMessageEvent</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting-installed.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting-installed.html
index f497ee5..e7b1a1924 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting-installed.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting-installed.html
@@ -1,7 +1,6 @@
 <!DOCTYPE html>
 <title>Service Worker: Skip waiting installed worker</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting-using-registration.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting-using-registration.html
index dbc550bd..5056ee7 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting-using-registration.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting-using-registration.html
@@ -1,7 +1,6 @@
 <!DOCTYPE html>
 <title>Service Worker: Skip waiting using registration</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting-without-client.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting-without-client.html
index 785bb0c..44d357c1 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting-without-client.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting-without-client.html
@@ -1,7 +1,6 @@
 <!DOCTYPE html>
 <title>Service Worker: Skip waiting without client</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting-without-using-registration.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting-without-using-registration.html
index eb0419f..c3902aea 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting-without-using-registration.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting-without-using-registration.html
@@ -1,7 +1,6 @@
 <!DOCTYPE html>
 <title>Service Worker: Skip waiting without using registration</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting.html
index 1bc34f5..04e2bec0 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting.html
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/skip-waiting.html
@@ -1,7 +1,6 @@
 <!DOCTYPE html>
 <title>Service Worker: Skip waiting</title>
 <script src="../resources/testharness.js"></script>
-<script src="../resources/testharness-helpers.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index e3b12b9a..9e3258d 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -510,6 +510,7 @@
     method createLinearGradient
     method createPattern
     method createRadialGradient
+    method drawImage
     method ellipse
     method fill
     method fillRect
@@ -653,7 +654,7 @@
 interface StorageManager
     method constructor
     method estimate
-    method persistentPermission
+    method persisted
 interface SubtleCrypto
     method constructor
     method decrypt
diff --git a/third_party/WebKit/LayoutTests/http/tests/storage/durability-basics.html b/third_party/WebKit/LayoutTests/http/tests/storage/durability-basics.html
index dc47682..00fd1270 100644
--- a/third_party/WebKit/LayoutTests/http/tests/storage/durability-basics.html
+++ b/third_party/WebKit/LayoutTests/http/tests/storage/durability-basics.html
@@ -8,26 +8,25 @@
     "These tests requires navigator.storage");
 
 promise_test(function() {
-    var promise = navigator.storage.requestPersistent();
+    var promise = navigator.storage.persist();
     assert_true(promise instanceof Promise,
-        "navigator.storage.requestPersistent() returned a Promise.")
+        "navigator.storage.persist() returned a Promise.");
     return promise.then(function (result) {
         // Layout tests get canned results, not the value per spec. So testing
         // their values here would only be testing our test plumbing. But we can
         // test that the type of the returned value is correct.
         assert_equals(typeof result, "boolean", result + " should be boolean");
     });
-}, "navigator.storage.requestPersistent returns a promise that resolves.");
+}, "navigator.storage.persist returns a promise that resolves.");
 
 promise_test(function() {
-    var promise = navigator.storage.persistentPermission();
+    var promise = navigator.storage.persisted();
     assert_true(promise instanceof Promise,
-        "navigator.storage.persistentPermission() returned a Promise.")
+        "navigator.storage.persisted() returned a Promise.");
     return promise.then(function (result) {
         // See comment above about why the result value isn't being tested here.
-        assert_equals(typeof result, "string", result + " should be a string");
-        assert_greater_than(result.length, 0, "result should have length >0");
+        assert_equals(typeof result, "boolean", result + " should be boolean");
     });
-}, "navigator.storage.persistentPermission returns a promise that resolves.");
+}, "navigator.storage.persisted returns a promise that resolves.");
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/storage/resources/durability-worker.js b/third_party/WebKit/LayoutTests/http/tests/storage/resources/durability-worker.js
index a3f03acb1..79224a31 100644
--- a/third_party/WebKit/LayoutTests/http/tests/storage/resources/durability-worker.js
+++ b/third_party/WebKit/LayoutTests/http/tests/storage/resources/durability-worker.js
@@ -3,20 +3,19 @@
 test(function() { assert_true("storage" in navigator); },
     "These worker tests require navigator.storage");
 
-test(function() { assert_false("requestPersistent" in navigator.storage); },
-    "navigator.storage.requestPersistent should not exist in workers");
+test(function() { assert_false("persist" in navigator.storage); },
+    "navigator.storage.persist should not exist in workers");
 
 promise_test(function() {
-    var promise = navigator.storage.persistentPermission();
+    var promise = navigator.storage.persisted();
     assert_true(promise instanceof Promise,
-        "navigator.storage.persistentPermission() returned a Promise.")
+        "navigator.storage.persisted() returned a Promise.");
     return promise.then(function (result) {
         // Layout tests get canned results, not the value per spec. So testing
         // their values here would only be testing our test plumbing. But we can
         // test that the type of the returned value is correct.
-        assert_equals(typeof result, "string", result + " should be a string");
-        assert_greater_than(result.length, 0, "result should have length >0");
+        assert_equals(typeof result, "boolean", result + " should be a boolean");
     });
-}, "navigator.storage.persistentPermission returns a promise that resolves.");
+}, "navigator.storage.persisted returns a promise that resolves.");
 
 done();
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/interfaces-expected.txt
index 78038725..bce9d42 100644
--- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/interfaces-expected.txt
@@ -270,8 +270,8 @@
 PASS Document interface: attribute firstElementChild 
 PASS Document interface: attribute lastElementChild 
 PASS Document interface: attribute childElementCount 
-FAIL Document interface: operation prepend([object Object],[object Object]) assert_own_property: interface prototype object missing non-static operation expected property "prepend" missing
-FAIL Document interface: operation append([object Object],[object Object]) assert_own_property: interface prototype object missing non-static operation expected property "append" missing
+PASS Document interface: operation prepend([object Object],[object Object]) 
+PASS Document interface: operation append([object Object],[object Object]) 
 PASS Document interface: operation querySelector(DOMString) 
 PASS Document interface: operation querySelectorAll(DOMString) 
 FAIL Document must be primary interface of new Document() assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Illegal constructor"
@@ -454,10 +454,10 @@
 PASS Document interface: xmlDoc must inherit property "firstElementChild" with the proper type (30) 
 PASS Document interface: xmlDoc must inherit property "lastElementChild" with the proper type (31) 
 PASS Document interface: xmlDoc must inherit property "childElementCount" with the proper type (32) 
-FAIL Document interface: xmlDoc must inherit property "prepend" with the proper type (33) assert_inherits: property "prepend" not found in prototype chain
-FAIL Document interface: calling prepend([object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError assert_inherits: property "prepend" not found in prototype chain
-FAIL Document interface: xmlDoc must inherit property "append" with the proper type (34) assert_inherits: property "append" not found in prototype chain
-FAIL Document interface: calling append([object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError assert_inherits: property "append" not found in prototype chain
+PASS Document interface: xmlDoc must inherit property "prepend" with the proper type (33) 
+PASS Document interface: calling prepend([object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
+PASS Document interface: xmlDoc must inherit property "append" with the proper type (34) 
+PASS Document interface: calling append([object Object],[object Object]) on xmlDoc with too few arguments must throw TypeError 
 PASS Document interface: xmlDoc must inherit property "querySelector" with the proper type (35) 
 PASS Document interface: calling querySelector(DOMString) on xmlDoc with too few arguments must throw TypeError 
 PASS Document interface: xmlDoc must inherit property "querySelectorAll" with the proper type (36) 
@@ -553,21 +553,21 @@
 PASS DocumentType interface: attribute name 
 PASS DocumentType interface: attribute publicId 
 PASS DocumentType interface: attribute systemId 
-FAIL DocumentType interface: operation before([object Object],[object Object]) assert_own_property: interface prototype object missing non-static operation expected property "before" missing
-FAIL DocumentType interface: operation after([object Object],[object Object]) assert_own_property: interface prototype object missing non-static operation expected property "after" missing
-FAIL DocumentType interface: operation replaceWith([object Object],[object Object]) assert_own_property: interface prototype object missing non-static operation expected property "replaceWith" missing
+PASS DocumentType interface: operation before([object Object],[object Object]) 
+PASS DocumentType interface: operation after([object Object],[object Object]) 
+PASS DocumentType interface: operation replaceWith([object Object],[object Object]) 
 PASS DocumentType interface: operation remove() 
 PASS DocumentType must be primary interface of document.doctype 
 PASS Stringification of document.doctype 
 PASS DocumentType interface: document.doctype must inherit property "name" with the proper type (0) 
 PASS DocumentType interface: document.doctype must inherit property "publicId" with the proper type (1) 
 PASS DocumentType interface: document.doctype must inherit property "systemId" with the proper type (2) 
-FAIL DocumentType interface: document.doctype must inherit property "before" with the proper type (3) assert_inherits: property "before" not found in prototype chain
-FAIL DocumentType interface: calling before([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError assert_inherits: property "before" not found in prototype chain
-FAIL DocumentType interface: document.doctype must inherit property "after" with the proper type (4) assert_inherits: property "after" not found in prototype chain
-FAIL DocumentType interface: calling after([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError assert_inherits: property "after" not found in prototype chain
-FAIL DocumentType interface: document.doctype must inherit property "replaceWith" with the proper type (5) assert_inherits: property "replaceWith" not found in prototype chain
-FAIL DocumentType interface: calling replaceWith([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError assert_inherits: property "replaceWith" not found in prototype chain
+PASS DocumentType interface: document.doctype must inherit property "before" with the proper type (3) 
+PASS DocumentType interface: calling before([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
+PASS DocumentType interface: document.doctype must inherit property "after" with the proper type (4) 
+PASS DocumentType interface: calling after([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
+PASS DocumentType interface: document.doctype must inherit property "replaceWith" with the proper type (5) 
+PASS DocumentType interface: calling replaceWith([object Object],[object Object]) on document.doctype with too few arguments must throw TypeError 
 PASS DocumentType interface: document.doctype must inherit property "remove" with the proper type (6) 
 PASS Node interface: document.doctype must inherit property "ELEMENT_NODE" with the proper type (0) 
 PASS Node interface: document.doctype must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
@@ -644,8 +644,8 @@
 PASS DocumentFragment interface: attribute firstElementChild 
 PASS DocumentFragment interface: attribute lastElementChild 
 PASS DocumentFragment interface: attribute childElementCount 
-FAIL DocumentFragment interface: operation prepend([object Object],[object Object]) assert_own_property: interface prototype object missing non-static operation expected property "prepend" missing
-FAIL DocumentFragment interface: operation append([object Object],[object Object]) assert_own_property: interface prototype object missing non-static operation expected property "append" missing
+PASS DocumentFragment interface: operation prepend([object Object],[object Object]) 
+PASS DocumentFragment interface: operation append([object Object],[object Object]) 
 PASS DocumentFragment interface: operation querySelector(DOMString) 
 PASS DocumentFragment interface: operation querySelectorAll(DOMString) 
 PASS DocumentFragment must be primary interface of document.createDocumentFragment() 
@@ -656,10 +656,10 @@
 PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "firstElementChild" with the proper type (2) 
 PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "lastElementChild" with the proper type (3) 
 PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "childElementCount" with the proper type (4) 
-FAIL DocumentFragment interface: document.createDocumentFragment() must inherit property "prepend" with the proper type (5) assert_inherits: property "prepend" not found in prototype chain
-FAIL DocumentFragment interface: calling prepend([object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError assert_inherits: property "prepend" not found in prototype chain
-FAIL DocumentFragment interface: document.createDocumentFragment() must inherit property "append" with the proper type (6) assert_inherits: property "append" not found in prototype chain
-FAIL DocumentFragment interface: calling append([object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError assert_inherits: property "append" not found in prototype chain
+PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "prepend" with the proper type (5) 
+PASS DocumentFragment interface: calling prepend([object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
+PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "append" with the proper type (6) 
+PASS DocumentFragment interface: calling append([object Object],[object Object]) on document.createDocumentFragment() with too few arguments must throw TypeError 
 PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "querySelector" with the proper type (7) 
 PASS DocumentFragment interface: calling querySelector(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError 
 PASS DocumentFragment interface: document.createDocumentFragment() must inherit property "querySelectorAll" with the proper type (8) 
@@ -779,15 +779,15 @@
 PASS Element interface: attribute firstElementChild 
 PASS Element interface: attribute lastElementChild 
 PASS Element interface: attribute childElementCount 
-FAIL Element interface: operation prepend([object Object],[object Object]) assert_own_property: interface prototype object missing non-static operation expected property "prepend" missing
-FAIL Element interface: operation append([object Object],[object Object]) assert_own_property: interface prototype object missing non-static operation expected property "append" missing
+PASS Element interface: operation prepend([object Object],[object Object]) 
+PASS Element interface: operation append([object Object],[object Object]) 
 PASS Element interface: operation querySelector(DOMString) 
 PASS Element interface: operation querySelectorAll(DOMString) 
 PASS Element interface: attribute previousElementSibling 
 PASS Element interface: attribute nextElementSibling 
-FAIL Element interface: operation before([object Object],[object Object]) assert_own_property: interface prototype object missing non-static operation expected property "before" missing
-FAIL Element interface: operation after([object Object],[object Object]) assert_own_property: interface prototype object missing non-static operation expected property "after" missing
-FAIL Element interface: operation replaceWith([object Object],[object Object]) assert_own_property: interface prototype object missing non-static operation expected property "replaceWith" missing
+PASS Element interface: operation before([object Object],[object Object]) 
+PASS Element interface: operation after([object Object],[object Object]) 
+PASS Element interface: operation replaceWith([object Object],[object Object]) 
 PASS Element interface: operation remove() 
 PASS Element interface: attribute assignedSlot 
 PASS Element must be primary interface of element 
@@ -852,22 +852,22 @@
 PASS Element interface: element must inherit property "firstElementChild" with the proper type (35) 
 PASS Element interface: element must inherit property "lastElementChild" with the proper type (36) 
 PASS Element interface: element must inherit property "childElementCount" with the proper type (37) 
-FAIL Element interface: element must inherit property "prepend" with the proper type (38) assert_inherits: property "prepend" not found in prototype chain
-FAIL Element interface: calling prepend([object Object],[object Object]) on element with too few arguments must throw TypeError assert_inherits: property "prepend" not found in prototype chain
-FAIL Element interface: element must inherit property "append" with the proper type (39) assert_inherits: property "append" not found in prototype chain
-FAIL Element interface: calling append([object Object],[object Object]) on element with too few arguments must throw TypeError assert_inherits: property "append" not found in prototype chain
+PASS Element interface: element must inherit property "prepend" with the proper type (38) 
+PASS Element interface: calling prepend([object Object],[object Object]) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "append" with the proper type (39) 
+PASS Element interface: calling append([object Object],[object Object]) on element with too few arguments must throw TypeError 
 PASS Element interface: element must inherit property "querySelector" with the proper type (40) 
 PASS Element interface: calling querySelector(DOMString) on element with too few arguments must throw TypeError 
 PASS Element interface: element must inherit property "querySelectorAll" with the proper type (41) 
 PASS Element interface: calling querySelectorAll(DOMString) on element with too few arguments must throw TypeError 
 PASS Element interface: element must inherit property "previousElementSibling" with the proper type (42) 
 PASS Element interface: element must inherit property "nextElementSibling" with the proper type (43) 
-FAIL Element interface: element must inherit property "before" with the proper type (44) assert_inherits: property "before" not found in prototype chain
-FAIL Element interface: calling before([object Object],[object Object]) on element with too few arguments must throw TypeError assert_inherits: property "before" not found in prototype chain
-FAIL Element interface: element must inherit property "after" with the proper type (45) assert_inherits: property "after" not found in prototype chain
-FAIL Element interface: calling after([object Object],[object Object]) on element with too few arguments must throw TypeError assert_inherits: property "after" not found in prototype chain
-FAIL Element interface: element must inherit property "replaceWith" with the proper type (46) assert_inherits: property "replaceWith" not found in prototype chain
-FAIL Element interface: calling replaceWith([object Object],[object Object]) on element with too few arguments must throw TypeError assert_inherits: property "replaceWith" not found in prototype chain
+PASS Element interface: element must inherit property "before" with the proper type (44) 
+PASS Element interface: calling before([object Object],[object Object]) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "after" with the proper type (45) 
+PASS Element interface: calling after([object Object],[object Object]) on element with too few arguments must throw TypeError 
+PASS Element interface: element must inherit property "replaceWith" with the proper type (46) 
+PASS Element interface: calling replaceWith([object Object],[object Object]) on element with too few arguments must throw TypeError 
 PASS Element interface: element must inherit property "remove" with the proper type (47) 
 PASS Element interface: element must inherit property "assignedSlot" with the proper type (48) 
 PASS Node interface: element must inherit property "ELEMENT_NODE" with the proper type (0) 
@@ -989,9 +989,9 @@
 PASS CharacterData interface: operation replaceData(unsigned long,unsigned long,DOMString) 
 PASS CharacterData interface: attribute previousElementSibling 
 PASS CharacterData interface: attribute nextElementSibling 
-FAIL CharacterData interface: operation before([object Object],[object Object]) assert_own_property: interface prototype object missing non-static operation expected property "before" missing
-FAIL CharacterData interface: operation after([object Object],[object Object]) assert_own_property: interface prototype object missing non-static operation expected property "after" missing
-FAIL CharacterData interface: operation replaceWith([object Object],[object Object]) assert_own_property: interface prototype object missing non-static operation expected property "replaceWith" missing
+PASS CharacterData interface: operation before([object Object],[object Object]) 
+PASS CharacterData interface: operation after([object Object],[object Object]) 
+PASS CharacterData interface: operation replaceWith([object Object],[object Object]) 
 PASS CharacterData interface: operation remove() 
 PASS Text interface: existence and properties of interface object 
 PASS Text interface object length 
@@ -1021,12 +1021,12 @@
 PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on document.createTextNode("abc") with too few arguments must throw TypeError 
 PASS CharacterData interface: document.createTextNode("abc") must inherit property "previousElementSibling" with the proper type (7) 
 PASS CharacterData interface: document.createTextNode("abc") must inherit property "nextElementSibling" with the proper type (8) 
-FAIL CharacterData interface: document.createTextNode("abc") must inherit property "before" with the proper type (9) assert_inherits: property "before" not found in prototype chain
-FAIL CharacterData interface: calling before([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError assert_inherits: property "before" not found in prototype chain
-FAIL CharacterData interface: document.createTextNode("abc") must inherit property "after" with the proper type (10) assert_inherits: property "after" not found in prototype chain
-FAIL CharacterData interface: calling after([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError assert_inherits: property "after" not found in prototype chain
-FAIL CharacterData interface: document.createTextNode("abc") must inherit property "replaceWith" with the proper type (11) assert_inherits: property "replaceWith" not found in prototype chain
-FAIL CharacterData interface: calling replaceWith([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError assert_inherits: property "replaceWith" not found in prototype chain
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "before" with the proper type (9) 
+PASS CharacterData interface: calling before([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "after" with the proper type (10) 
+PASS CharacterData interface: calling after([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createTextNode("abc") must inherit property "replaceWith" with the proper type (11) 
+PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on document.createTextNode("abc") with too few arguments must throw TypeError 
 PASS CharacterData interface: document.createTextNode("abc") must inherit property "remove" with the proper type (12) 
 PASS Node interface: document.createTextNode("abc") must inherit property "ELEMENT_NODE" with the proper type (0) 
 PASS Node interface: document.createTextNode("abc") must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
@@ -1116,12 +1116,12 @@
 PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
 PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "previousElementSibling" with the proper type (7) 
 PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "nextElementSibling" with the proper type (8) 
-FAIL CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "before" with the proper type (9) assert_inherits: property "before" not found in prototype chain
-FAIL CharacterData interface: calling before([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError assert_inherits: property "before" not found in prototype chain
-FAIL CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "after" with the proper type (10) assert_inherits: property "after" not found in prototype chain
-FAIL CharacterData interface: calling after([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError assert_inherits: property "after" not found in prototype chain
-FAIL CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceWith" with the proper type (11) assert_inherits: property "replaceWith" not found in prototype chain
-FAIL CharacterData interface: calling replaceWith([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError assert_inherits: property "replaceWith" not found in prototype chain
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "before" with the proper type (9) 
+PASS CharacterData interface: calling before([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "after" with the proper type (10) 
+PASS CharacterData interface: calling after([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
+PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "replaceWith" with the proper type (11) 
+PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError 
 PASS CharacterData interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "remove" with the proper type (12) 
 PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ELEMENT_NODE" with the proper type (0) 
 PASS Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
@@ -1209,12 +1209,12 @@
 PASS CharacterData interface: calling replaceData(unsigned long,unsigned long,DOMString) on document.createComment("abc") with too few arguments must throw TypeError 
 PASS CharacterData interface: document.createComment("abc") must inherit property "previousElementSibling" with the proper type (7) 
 PASS CharacterData interface: document.createComment("abc") must inherit property "nextElementSibling" with the proper type (8) 
-FAIL CharacterData interface: document.createComment("abc") must inherit property "before" with the proper type (9) assert_inherits: property "before" not found in prototype chain
-FAIL CharacterData interface: calling before([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError assert_inherits: property "before" not found in prototype chain
-FAIL CharacterData interface: document.createComment("abc") must inherit property "after" with the proper type (10) assert_inherits: property "after" not found in prototype chain
-FAIL CharacterData interface: calling after([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError assert_inherits: property "after" not found in prototype chain
-FAIL CharacterData interface: document.createComment("abc") must inherit property "replaceWith" with the proper type (11) assert_inherits: property "replaceWith" not found in prototype chain
-FAIL CharacterData interface: calling replaceWith([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError assert_inherits: property "replaceWith" not found in prototype chain
+PASS CharacterData interface: document.createComment("abc") must inherit property "before" with the proper type (9) 
+PASS CharacterData interface: calling before([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createComment("abc") must inherit property "after" with the proper type (10) 
+PASS CharacterData interface: calling after([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
+PASS CharacterData interface: document.createComment("abc") must inherit property "replaceWith" with the proper type (11) 
+PASS CharacterData interface: calling replaceWith([object Object],[object Object]) on document.createComment("abc") with too few arguments must throw TypeError 
 PASS CharacterData interface: document.createComment("abc") must inherit property "remove" with the proper type (12) 
 PASS Node interface: document.createComment("abc") must inherit property "ELEMENT_NODE" with the proper type (0) 
 PASS Node interface: document.createComment("abc") must inherit property "ATTRIBUTE_NODE" with the proper type (1) 
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/ChildNode-after-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/ChildNode-after-expected.txt
deleted file mode 100644
index 7920cd8..0000000
--- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/ChildNode-after-expected.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-This is a testharness.js-based test.
-FAIL Comment.after() without any argument. child.after is not a function
-FAIL Comment.after() with null as an argument. child.after is not a function
-FAIL Comment.after() with undefined as an argument. child.after is not a function
-FAIL Comment.after() with the empty string as an argument. child.after is not a function
-FAIL Comment.after() with only text as an argument. child.after is not a function
-FAIL Comment.after() with only one element as an argument. child.after is not a function
-FAIL Comment.after() with one element and text as arguments. child.after is not a function
-FAIL Comment.after() with context object itself as the argument. child.after is not a function
-FAIL Comment.after() with context object itself and node as the arguments, switching positions. child.after is not a function
-FAIL Comment.after() with all siblings of child as arguments. child.after is not a function
-FAIL Comment.before() with some siblings of child as arguments; no changes in tree; viable sibling is first child. child.after is not a function
-FAIL Comment.after() with some siblings of child as arguments; no changes in tree. child.after is not a function
-FAIL Comment.after() when pre-insert behaves like append. child.after is not a function
-FAIL Comment.after() with one sibling of child and text as arguments. child.after is not a function
-FAIL Comment.after() on a child without any parent. x.after is not a function
-FAIL Element.after() without any argument. child.after is not a function
-FAIL Element.after() with null as an argument. child.after is not a function
-FAIL Element.after() with undefined as an argument. child.after is not a function
-FAIL Element.after() with the empty string as an argument. child.after is not a function
-FAIL Element.after() with only text as an argument. child.after is not a function
-FAIL Element.after() with only one element as an argument. child.after is not a function
-FAIL Element.after() with one element and text as arguments. child.after is not a function
-FAIL Element.after() with context object itself as the argument. child.after is not a function
-FAIL Element.after() with context object itself and node as the arguments, switching positions. child.after is not a function
-FAIL Element.after() with all siblings of child as arguments. child.after is not a function
-FAIL Element.before() with some siblings of child as arguments; no changes in tree; viable sibling is first child. child.after is not a function
-FAIL Element.after() with some siblings of child as arguments; no changes in tree. child.after is not a function
-FAIL Element.after() when pre-insert behaves like append. child.after is not a function
-FAIL Element.after() with one sibling of child and text as arguments. child.after is not a function
-FAIL Element.after() on a child without any parent. x.after is not a function
-FAIL Text.after() without any argument. child.after is not a function
-FAIL Text.after() with null as an argument. child.after is not a function
-FAIL Text.after() with undefined as an argument. child.after is not a function
-FAIL Text.after() with the empty string as an argument. child.after is not a function
-FAIL Text.after() with only text as an argument. child.after is not a function
-FAIL Text.after() with only one element as an argument. child.after is not a function
-FAIL Text.after() with one element and text as arguments. child.after is not a function
-FAIL Text.after() with context object itself as the argument. child.after is not a function
-FAIL Text.after() with context object itself and node as the arguments, switching positions. child.after is not a function
-FAIL Text.after() with all siblings of child as arguments. child.after is not a function
-FAIL Text.before() with some siblings of child as arguments; no changes in tree; viable sibling is first child. child.after is not a function
-FAIL Text.after() with some siblings of child as arguments; no changes in tree. child.after is not a function
-FAIL Text.after() when pre-insert behaves like append. child.after is not a function
-FAIL Text.after() with one sibling of child and text as arguments. child.after is not a function
-FAIL Text.after() on a child without any parent. x.after is not a function
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/ChildNode-before-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/ChildNode-before-expected.txt
deleted file mode 100644
index b806250..0000000
--- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/ChildNode-before-expected.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-This is a testharness.js-based test.
-FAIL Comment.before() without any argument. child.before is not a function
-FAIL Comment.before() with null as an argument. child.before is not a function
-FAIL Comment.before() with undefined as an argument. child.before is not a function
-FAIL Comment.before() with the empty string as an argument. child.before is not a function
-FAIL Comment.before() with only text as an argument. child.before is not a function
-FAIL Comment.before() with only one element as an argument. child.before is not a function
-FAIL Comment.before() with one element and text as arguments. child.before is not a function
-FAIL Comment.before() with context object itself as the argument. child.before is not a function
-FAIL Comment.before() with context object itself and node as the arguments, switching positions. child.before is not a function
-FAIL Comment.before() with all siblings of child as arguments. child.before is not a function
-FAIL Comment.before() with some siblings of child as arguments; no changes in tree; viable sibling is first child. child.before is not a function
-FAIL Comment.before() with some siblings of child as arguments; no changes in tree. child.before is not a function
-FAIL Comment.before() when pre-insert behaves like prepend. child.before is not a function
-FAIL Comment.before() with one sibling of child and text as arguments. child.before is not a function
-FAIL Comment.before() on a child without any parent. x.before is not a function
-FAIL Element.before() without any argument. child.before is not a function
-FAIL Element.before() with null as an argument. child.before is not a function
-FAIL Element.before() with undefined as an argument. child.before is not a function
-FAIL Element.before() with the empty string as an argument. child.before is not a function
-FAIL Element.before() with only text as an argument. child.before is not a function
-FAIL Element.before() with only one element as an argument. child.before is not a function
-FAIL Element.before() with one element and text as arguments. child.before is not a function
-FAIL Element.before() with context object itself as the argument. child.before is not a function
-FAIL Element.before() with context object itself and node as the arguments, switching positions. child.before is not a function
-FAIL Element.before() with all siblings of child as arguments. child.before is not a function
-FAIL Element.before() with some siblings of child as arguments; no changes in tree; viable sibling is first child. child.before is not a function
-FAIL Element.before() with some siblings of child as arguments; no changes in tree. child.before is not a function
-FAIL Element.before() when pre-insert behaves like prepend. child.before is not a function
-FAIL Element.before() with one sibling of child and text as arguments. child.before is not a function
-FAIL Element.before() on a child without any parent. x.before is not a function
-FAIL Text.before() without any argument. child.before is not a function
-FAIL Text.before() with null as an argument. child.before is not a function
-FAIL Text.before() with undefined as an argument. child.before is not a function
-FAIL Text.before() with the empty string as an argument. child.before is not a function
-FAIL Text.before() with only text as an argument. child.before is not a function
-FAIL Text.before() with only one element as an argument. child.before is not a function
-FAIL Text.before() with one element and text as arguments. child.before is not a function
-FAIL Text.before() with context object itself as the argument. child.before is not a function
-FAIL Text.before() with context object itself and node as the arguments, switching positions. child.before is not a function
-FAIL Text.before() with all siblings of child as arguments. child.before is not a function
-FAIL Text.before() with some siblings of child as arguments; no changes in tree; viable sibling is first child. child.before is not a function
-FAIL Text.before() with some siblings of child as arguments; no changes in tree. child.before is not a function
-FAIL Text.before() when pre-insert behaves like prepend. child.before is not a function
-FAIL Text.before() with one sibling of child and text as arguments. child.before is not a function
-FAIL Text.before() on a child without any parent. x.before is not a function
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/ChildNode-replaceWith-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/ChildNode-replaceWith-expected.txt
deleted file mode 100644
index 47ec75e..0000000
--- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/ChildNode-replaceWith-expected.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-This is a testharness.js-based test.
-FAIL Comment.replaceWith() without any argument. child.replaceWith is not a function
-FAIL Comment.replaceWith() with null as an argument. child.replaceWith is not a function
-FAIL Comment.replaceWith() with undefined as an argument. child.replaceWith is not a function
-FAIL Comment.replaceWith() with empty string as an argument. child.replaceWith is not a function
-FAIL Comment.replaceWith() with only text as an argument. child.replaceWith is not a function
-FAIL Comment.replaceWith() with only one element as an argument. child.replaceWith is not a function
-FAIL Comment.replaceWith() with sibling of child as arguments. child.replaceWith is not a function
-FAIL Comment.replaceWith() with one sibling of child and text as arguments. child.replaceWith is not a function
-FAIL Comment.replaceWith() with one sibling of child and child itself as arguments. child.replaceWith is not a function
-FAIL Comment.replaceWith() with one element and text as arguments. child.replaceWith is not a function
-FAIL Comment.replaceWith() on a parentless child with two elements as arguments. child.replaceWith is not a function
-FAIL Element.replaceWith() without any argument. child.replaceWith is not a function
-FAIL Element.replaceWith() with null as an argument. child.replaceWith is not a function
-FAIL Element.replaceWith() with undefined as an argument. child.replaceWith is not a function
-FAIL Element.replaceWith() with empty string as an argument. child.replaceWith is not a function
-FAIL Element.replaceWith() with only text as an argument. child.replaceWith is not a function
-FAIL Element.replaceWith() with only one element as an argument. child.replaceWith is not a function
-FAIL Element.replaceWith() with sibling of child as arguments. child.replaceWith is not a function
-FAIL Element.replaceWith() with one sibling of child and text as arguments. child.replaceWith is not a function
-FAIL Element.replaceWith() with one sibling of child and child itself as arguments. child.replaceWith is not a function
-FAIL Element.replaceWith() with one element and text as arguments. child.replaceWith is not a function
-FAIL Element.replaceWith() on a parentless child with two elements as arguments. child.replaceWith is not a function
-FAIL Text.replaceWith() without any argument. child.replaceWith is not a function
-FAIL Text.replaceWith() with null as an argument. child.replaceWith is not a function
-FAIL Text.replaceWith() with undefined as an argument. child.replaceWith is not a function
-FAIL Text.replaceWith() with empty string as an argument. child.replaceWith is not a function
-FAIL Text.replaceWith() with only text as an argument. child.replaceWith is not a function
-FAIL Text.replaceWith() with only one element as an argument. child.replaceWith is not a function
-FAIL Text.replaceWith() with sibling of child as arguments. child.replaceWith is not a function
-FAIL Text.replaceWith() with one sibling of child and text as arguments. child.replaceWith is not a function
-FAIL Text.replaceWith() with one sibling of child and child itself as arguments. child.replaceWith is not a function
-FAIL Text.replaceWith() with one element and text as arguments. child.replaceWith is not a function
-FAIL Text.replaceWith() on a parentless child with two elements as arguments. child.replaceWith is not a function
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/ParentNode-append-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/ParentNode-append-expected.txt
deleted file mode 100644
index 673d6b3c1..0000000
--- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/ParentNode-append-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-This is a testharness.js-based test.
-FAIL Element.append() without any argument, on a parent having no child. parent.append is not a function
-FAIL Element.append() with null as an argument, on a parent having no child. parent.append is not a function
-FAIL Element.append() with undefined as an argument, on a parent having no child. parent.append is not a function
-FAIL Element.append() with only text as an argument, on a parent having no child. parent.append is not a function
-FAIL Element.append() with only one element as an argument, on a parent having no child. parent.append is not a function
-FAIL Element.append() with null as an argument, on a parent having a child. parent.append is not a function
-FAIL Element.append() with one element and text as argument, on a parent having a child. parent.append is not a function
-FAIL DocumentFrgment.append() without any argument, on a parent having no child. parent.append is not a function
-FAIL DocumentFrgment.append() with null as an argument, on a parent having no child. parent.append is not a function
-FAIL DocumentFrgment.append() with undefined as an argument, on a parent having no child. parent.append is not a function
-FAIL DocumentFrgment.append() with only text as an argument, on a parent having no child. parent.append is not a function
-FAIL DocumentFrgment.append() with only one element as an argument, on a parent having no child. parent.append is not a function
-FAIL DocumentFrgment.append() with null as an argument, on a parent having a child. parent.append is not a function
-FAIL DocumentFrgment.append() with one element and text as argument, on a parent having a child. parent.append is not a function
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/ParentNode-prepend-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/ParentNode-prepend-expected.txt
deleted file mode 100644
index 483d7f0..0000000
--- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/ParentNode-prepend-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-This is a testharness.js-based test.
-FAIL Element.prepend() without any argument, on a parent having no child. parent.prepend is not a function
-FAIL Element.prepend() with null as an argument, on a parent having no child. parent.prepend is not a function
-FAIL Element.prepend() with undefined as an argument, on a parent having no child. parent.prepend is not a function
-FAIL Element.prepend() with only text as an argument, on a parent having no child. parent.prepend is not a function
-FAIL Element.prepend() with only one element as an argument, on a parent having no child. parent.prepend is not a function
-FAIL Element.prepend() with null as an argument, on a parent having a child. parent.prepend is not a function
-FAIL Element.prepend() with one element and text as argument, on a parent having a child. parent.prepend is not a function
-FAIL DocumentFrgment.prepend() without any argument, on a parent having no child. parent.prepend is not a function
-FAIL DocumentFrgment.prepend() with null as an argument, on a parent having no child. parent.prepend is not a function
-FAIL DocumentFrgment.prepend() with undefined as an argument, on a parent having no child. parent.prepend is not a function
-FAIL DocumentFrgment.prepend() with only text as an argument, on a parent having no child. parent.prepend is not a function
-FAIL DocumentFrgment.prepend() with only one element as an argument, on a parent having no child. parent.prepend is not a function
-FAIL DocumentFrgment.prepend() with null as an argument, on a parent having a child. parent.prepend is not a function
-FAIL DocumentFrgment.prepend() with one element and text as argument, on a parent having a child. parent.prepend is not a function
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/append-on-Document-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/append-on-Document-expected.txt
deleted file mode 100644
index 83dd93c..0000000
--- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/append-on-Document-expected.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-This is a testharness.js-based test.
-FAIL Document.append() without any argument, on a Document having no child. parent.append is not a function
-FAIL Document.append() with only one element as an argument, on a Document having no child. parent.append is not a function
-FAIL Document.append() with only one element as an argument, on a Document having one child. assert_throws: function "function () { parent.append(y); }" threw object "TypeError: parent.append is not a function" that is not a DOMException HierarchyRequestError: property "code" is equal to undefined, expected 3
-FAIL Document.append() with text as an argument, on a Document having no child. assert_throws: function "function () { parent.append('text'); }" threw object "TypeError: parent.append is not a function" that is not a DOMException HierarchyRequestError: property "code" is equal to undefined, expected 3
-FAIL Document.append() with two elements as the argument, on a Document having no child. assert_throws: function "function () { parent.append(x, y); }" threw object "TypeError: parent.append is not a function" that is not a DOMException HierarchyRequestError: property "code" is equal to undefined, expected 3
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/prepend-on-Document-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/prepend-on-Document-expected.txt
deleted file mode 100644
index 39e18e34..0000000
--- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/prepend-on-Document-expected.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-This is a testharness.js-based test.
-FAIL Document.prepend() without any argument, on a Document having no child. parent.prepend is not a function
-FAIL Document.prepend() with only one element as an argument, on a Document having no child. parent.prepend is not a function
-FAIL Document.append() with only one element as an argument, on a Document having one child. assert_throws: function "function () { parent.prepend(y); }" threw object "TypeError: parent.prepend is not a function" that is not a DOMException HierarchyRequestError: property "code" is equal to undefined, expected 3
-FAIL Document.prepend() with text as an argument, on a Document having no child. assert_throws: function "function () { parent.prepend('text'); }" threw object "TypeError: parent.prepend is not a function" that is not a DOMException HierarchyRequestError: property "code" is equal to undefined, expected 3
-FAIL Document.prepend() with two elements as the argument, on a Document having no child. assert_throws: function "function () { parent.prepend(x, y); }" threw object "TypeError: parent.prepend is not a function" that is not a DOMException HierarchyRequestError: property "code" is equal to undefined, expected 3
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/remove-unscopable-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/remove-unscopable-expected.txt
deleted file mode 100644
index 61329d4..0000000
--- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/remove-unscopable-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL remove() should be unscopable Cannot read property 'remove' of undefined
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/web-animations/animatable/animate-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/web-animations/animatable/animate-expected.txt
index e3f62088..d5b5f82c 100644
--- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/web-animations/animatable/animate-expected.txt
+++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/web-animations/animatable/animate-expected.txt
@@ -9,8 +9,8 @@
 PASS Element.animate() accepts an absent options argument 
 PASS Element.animate() correctly sets the id attribute when no id is specified 
 PASS Element.animate() correctly sets the id attribute 
-PASS Element.animate() correctly sets the Animation's timeline 
-PASS Element.animate() correctly sets the Animation's timeline when triggered on an element in a different document 
+FAIL Element.animate() correctly sets the Animation's timeline assert_equals: expected (object) object "[object AnimationTimeline]" but got (undefined) undefined
+FAIL Element.animate() correctly sets the Animation's timeline when triggered on an element in a different document assert_equals: expected (object) object "[object AnimationTimeline]" but got (undefined) undefined
 PASS Element.animate() calls play on the Animation 
 FAIL CSSPseudoElement.animate() creates an Animation object document.getAnimations is not a function
 FAIL CSSPseudoElement.animate() creates an Animation object targeting to the correct CSSPseudoElement object document.getAnimations is not a function
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/web-animations/animation/finish-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/web-animations/animation/finish-expected.txt
index 46c5c8e9..1bd47f70 100644
--- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/web-animations/animation/finish-expected.txt
+++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/web-animations/animation/finish-expected.txt
@@ -5,10 +5,10 @@
 FAIL Test finishing of animation with a current time past the effect end animation.effect.getComputedTiming is not a function
 PASS Test finishing of reversed animation 
 PASS Test finishing of reversed animation with a current time less than zero 
-PASS Test finish() while paused 
-PASS Test finish() while pause-pending with positive playbackRate 
-PASS Test finish() while pause-pending with negative playbackRate 
-PASS Test finish() while play-pending 
+FAIL Test finish() while paused promise_test: Unhandled rejection with value: object "TypeError: Cannot read property 'currentTime' of undefined"
+FAIL Test finish() while pause-pending with positive playbackRate Cannot read property 'currentTime' of undefined
+FAIL Test finish() while pause-pending with negative playbackRate Cannot read property 'currentTime' of undefined
+FAIL Test finish() while play-pending Cannot read property 'currentTime' of undefined
 PASS Test finish() during aborted pause 
 PASS Test resetting of computed style 
 PASS Test finish() resolves finished promise synchronously 
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/web-animations/animation/playbackRate-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/web-animations/animation/playbackRate-expected.txt
new file mode 100644
index 0000000..e742b269
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/web-animations/animation/playbackRate-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+PASS Test the initial effect of setting playbackRate on currentTime 
+FAIL Test the effect of setting playbackRate on currentTime promise_test: Unhandled rejection with value: object "TypeError: Cannot read property 'currentTime' of undefined"
+FAIL Test the effect of setting playbackRate while playing animation promise_test: Unhandled rejection with value: object "TypeError: Cannot read property 'currentTime' of undefined"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/input/dispatchKeyEvent-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/input/dispatchKeyEvent-expected.txt
index a622483..4140185 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/input/dispatchKeyEvent-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/input/dispatchKeyEvent-expected.txt
@@ -1,3 +1,4 @@
+CONSOLE WARNING: 'KeyboardEvent.keyIdentifier' is deprecated and will be removed in M53, around September 2016. See https://www.chromestatus.com/features/5316065118650368 for more details.
 -----Event-----
 type: keydown
 keyCode: 65
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-dir-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/console-dir-expected.txt
index 269be6c..e149f61 100644
--- a/third_party/WebKit/LayoutTests/inspector/console/console-dir-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/console/console-dir-expected.txt
@@ -8,6 +8,7 @@
 CONSOLE MESSAGE: line 32: [object Object]
 CONSOLE MESSAGE: line 34: function get __proto__() { [native code] }
 CONSOLE MESSAGE: line 39: [object Uint8Array]
+CONSOLE MESSAGE: line 44: [object Event]
 Tests that console logging dumps proper messages.
 
 console-dir.html:4 Array[2]
@@ -63,4 +64,21 @@
     [200000000 … 299999999]
     [300000000 … 399999999]
     __proto__: TypedArray
+console-dir.html:39 Event
+    bubbles: false
+    cancelBubble: false
+    cancelable: false
+    currentTarget: null
+    defaultPrevented: false
+    eventPhase: 0
+    isTrusted: false
+    path: Array[0]
+    relatedTargetScoped: false
+    returnValue: true
+    scoped: false
+    srcElement: null
+    target: null
+    timeStamp: 0
+    type: ""
+    __proto__: Event
 
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-dir.html b/third_party/WebKit/LayoutTests/inspector/console/console-dir.html
index b6d0746..219ae2f 100644
--- a/third_party/WebKit/LayoutTests/inspector/console/console-dir.html
+++ b/third_party/WebKit/LayoutTests/inspector/console/console-dir.html
@@ -38,6 +38,11 @@
     bigTypedArray["FAIL"] = "FAIL: Object.getOwnPropertyNames() should not have been run";
     console.dir(bigTypedArray);
 
+    // document.createEvent("Event") has a special property "isTrusted" flagged "Unforgeable".
+    var event = document.createEvent("Event");
+    Object.defineProperty(event, "timeStamp", {value: 0})
+    console.dir(event);
+
     runTest();
 }
 //# sourceURL=console-dir.html
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-format-style-whitelist-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/console-format-style-whitelist-expected.txt
index f9d75a61..3394256 100644
--- a/third_party/WebKit/LayoutTests/inspector/console/console-format-style-whitelist-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/console/console-format-style-whitelist-expected.txt
@@ -10,7 +10,7 @@
 console-format-style-whitelist.html:4 Colors are awesome.
 Styled text #0: color: blue;
 console-format-style-whitelist.html:5 So are fonts!
-Styled text #0: font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 1em; line-height: normal; font-family: Helvetica;
+Styled text #0: font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; font-stretch: normal; font-size: 1em; line-height: normal; font-family: Helvetica;
 console-format-style-whitelist.html:6 And borders and margins and paddings!
 Styled text #0: border: 1px solid red; border-image-source: initial; border-image-slice: initial; border-image-width: initial; border-image-outset: initial; border-image-repeat: initial; margin: 20px; padding: 10px;
 console-format-style-whitelist.html:7 text-* is fine by us!
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-proxy-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/console-proxy-expected.txt
index b306800..51d4eaf 100644
--- a/third_party/WebKit/LayoutTests/inspector/console/console-proxy-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/console/console-proxy-expected.txt
@@ -1,12 +1,15 @@
-CONSOLE MESSAGE: line 20: [object Proxy]
+CONSOLE MESSAGE: line 21: [object Proxy]
+CONSOLE MESSAGE: line 23: [object Proxy]
 Tests that console logging dumps proxy properly.
 
 warning-note display: inline-block
 info-note display: none
-console-proxy.html:20 Proxy console-message-text source-code > console-message-url webkit-html-resource-link > object-value-proxy source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > object-state-note warning-note > object-state-note info-note > children
+console-proxy.html:21 Proxy {boo: 42, foo: 43} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-proxy source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-number > name > object-value-number > object-state-note warning-note > object-state-note info-note > children
+console-proxy.html:23 Proxy {boo: 42, foo: 43} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-proxy source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-number > name > object-value-number > object-state-note warning-note > object-state-note info-note > children
 window.accessedGet = false
 warning-note display: none
 info-note display: inline-block
-console-proxy.html:20 Proxy__proto__: Object console-message-text source-code > console-message-url webkit-html-resource-link > object-value-proxy source-code > console-view-object-properties-section expanded > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element expanded > selection fill > object-state-note warning-note > object-state-note info-note > children expanded > parent > selection fill > name object-properties-section-dimmed > object-properties-section-separator > value object-value-object > children
+console-proxy.html:21 Proxy {boo: 42, foo: 43}boo: 42foo: 43__proto__: Object console-message-text source-code > console-message-url webkit-html-resource-link > object-value-proxy source-code > console-view-object-properties-section expanded > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element expanded > selection fill > console-object-preview > name > object-value-number > name > object-value-number > object-state-note warning-note > object-state-note info-note > children expanded > selection fill > name > object-properties-section-separator > value object-value-number > children > selection fill > name > object-properties-section-separator > value object-value-number > children > parent > selection fill > name object-properties-section-dimmed > object-properties-section-separator > value object-value-object > children
+console-proxy.html:23 Proxy {boo: 42, foo: 43}boo: 42foo: 43__proto__: Object console-message-text source-code > console-message-url webkit-html-resource-link > object-value-proxy source-code > console-view-object-properties-section expanded > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element expanded > selection fill > console-object-preview > name > object-value-number > name > object-value-number > object-state-note warning-note > object-state-note info-note > children expanded > selection fill > name > object-properties-section-separator > value object-value-number > children > selection fill > name > object-properties-section-separator > value object-value-number > children > parent > selection fill > name object-properties-section-dimmed > object-properties-section-separator > value object-value-object > children
 window.accessedGet = true
 
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-proxy.html b/third_party/WebKit/LayoutTests/inspector/console/console-proxy.html
index f72667a3..3a91b11 100644
--- a/third_party/WebKit/LayoutTests/inspector/console/console-proxy.html
+++ b/third_party/WebKit/LayoutTests/inspector/console/console-proxy.html
@@ -7,7 +7,7 @@
 window.accessedGet = false;
 function testFunction()
 {
-    let proxied = new Proxy({}, {
+    let proxied = new Proxy({ boo: 42 }, {
         get: function (target, name, receiver) {
             window.accessedGet = true;
             return target[name];
@@ -17,12 +17,15 @@
             return value;
         }
     });
+    proxied.foo = 43;
     console.log(proxied);
+    let proxied2 = new Proxy(proxied, {});
+    console.log(proxied2);
 }
 
 function test()
 {
-    InspectorTest.waitUntilMessageReceived(dumpMessages);
+    InspectorTest.waitUntilNthMessageReceived(2, dumpMessages);
     InspectorTest.evaluateInPage("testFunction()");
 
     function dumpMessages()
diff --git a/third_party/WebKit/LayoutTests/inspector/elements/styles-4/styles-properties-overload-expected.txt b/third_party/WebKit/LayoutTests/inspector/elements/styles-4/styles-properties-overload-expected.txt
index f3e01aa6..ea6a648 100644
--- a/third_party/WebKit/LayoutTests/inspector/elements/styles-4/styles-properties-overload-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/elements/styles-4/styles-properties-overload-expected.txt
@@ -12,7 +12,8 @@
     margin-bottom: 1px;
     font: 10px Arial;
         font-style: normal;
-        font-variant: normal;
+        font-variant-caps: normal;
+        font-variant-ligatures: normal;
         font-weight: normal;
         font-stretch: normal;
         font-size: 10px;
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-1-expected.txt b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-1-expected.txt
index bd9524e..db714e0 100644
--- a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-1-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-1-expected.txt
@@ -19,8 +19,7 @@
     }
 }
 === AST === 
-rule 0: "variables"
-rule 1: "properties"
+rule 0: "div"
     property 0
         name: "display"
             range: {"startLine":1,"startColumn":7,"endLine":1,"endColumn":14}
@@ -49,49 +48,50 @@
             range: {"startLine":4,"startColumn":16,"endLine":4,"endColumn":25}
         range: {"startLine":4,"startColumn":4,"endLine":4,"endColumn":29}
         disabled: true
-    property 4
+rule 1: ".className"
+    property 0
         name: "padding"
             range: {"startLine":7,"startColumn":8,"endLine":7,"endColumn":15}
         value: " 10px 0 0 10px"
             range: {"startLine":7,"startColumn":16,"endLine":7,"endColumn":30}
         range: {"startLine":7,"startColumn":8,"endLine":7,"endColumn":31}
         disabled: false
-    property 5
+    property 1
         name: "font-family"
             range: {"startLine":8,"startColumn":11,"endLine":8,"endColumn":22}
         value: " "Times New Roman""
             range: {"startLine":8,"startColumn":23,"endLine":8,"endColumn":41}
         range: {"startLine":8,"startColumn":8,"endLine":8,"endColumn":45}
         disabled: true
-    property 6
+    property 2
         name: "background-image"
             range: {"startLine":9,"startColumn":8,"endLine":9,"endColumn":24}
         value: " url(assets/no-image-set.png)"
             range: {"startLine":9,"startColumn":25,"endLine":9,"endColumn":54}
         range: {"startLine":9,"startColumn":8,"endLine":9,"endColumn":55}
         disabled: false
-    property 7
+rule 2: "#test::before"
+    property 0
         name: "margin"
             range: {"startLine":12,"startColumn":12,"endLine":12,"endColumn":18}
         value: " 10px 10px"
             range: {"startLine":12,"startColumn":19,"endLine":12,"endColumn":29}
         range: {"startLine":12,"startColumn":12,"endLine":12,"endColumn":30}
         disabled: false
-    property 8
+    property 1
         name: "content"
             range: {"startLine":13,"startColumn":12,"endLine":13,"endColumn":19}
         value: " "test me""
             range: {"startLine":13,"startColumn":20,"endLine":13,"endColumn":30}
         range: {"startLine":13,"startColumn":12,"endLine":13,"endColumn":31}
         disabled: false
-    property 9
+    property 2
         name: "border"
             range: {"startLine":14,"startColumn":15,"endLine":14,"endColumn":21}
         value: " 1px solid black"
             range: {"startLine":14,"startColumn":22,"endLine":14,"endColumn":38}
         range: {"startLine":14,"startColumn":12,"endLine":14,"endColumn":42}
         disabled: true
-rule 2: "mixins"
 ======
 Ranges OK.
 
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-2-expected.txt b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-2-expected.txt
index 230b867..4eaa5ca 100644
--- a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-2-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-2-expected.txt
@@ -13,7 +13,7 @@
 }
 
 === AST === 
-rule 0: "variables"
+rule 0: ""
     property 0
         name: "$my-color"
             range: {"startLine":0,"startColumn":0,"endLine":0,"endColumn":9}
@@ -35,7 +35,7 @@
             range: {"startLine":2,"startColumn":12,"endLine":2,"endColumn":16}
         range: {"startLine":2,"startColumn":0,"endLine":2,"endColumn":17}
         disabled: false
-rule 1: "properties"
+rule 1: ".#{$class-slug}#{$i}"
     property 0
         name: "background-color"
             range: {"startLine":6,"startColumn":8,"endLine":6,"endColumn":24}
@@ -57,7 +57,6 @@
             range: {"startLine":8,"startColumn":17,"endLine":8,"endColumn":27}
         range: {"startLine":8,"startColumn":8,"endLine":8,"endColumn":31}
         disabled: true
-rule 2: "mixins"
 ======
 Ranges OK.
 
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-3-expected.txt b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-3-expected.txt
index 9f64431..bf9a25e 100644
--- a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-3-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-3-expected.txt
@@ -18,8 +18,7 @@
 }
 
 === AST === 
-rule 0: "variables"
-rule 1: "properties"
+rule 0: ""
     property 0
         name: "width"
             range: {"startLine":1,"startColumn":4,"endLine":1,"endColumn":9}
@@ -34,35 +33,36 @@
             range: {"startLine":2,"startColumn":11,"endLine":2,"endColumn":16}
         range: {"startLine":2,"startColumn":4,"endLine":2,"endColumn":17}
         disabled: false
-    property 2
+rule 1: ""
+    property 0
         name: "-webkit-border-radius"
             range: {"startLine":6,"startColumn":2,"endLine":6,"endColumn":23}
         value: " $radius"
             range: {"startLine":6,"startColumn":24,"endLine":6,"endColumn":32}
         range: {"startLine":6,"startColumn":2,"endLine":6,"endColumn":33}
         disabled: false
-    property 3
+    property 1
         name: "-moz-border-radius"
             range: {"startLine":7,"startColumn":5,"endLine":7,"endColumn":23}
         value: " $radius"
             range: {"startLine":7,"startColumn":24,"endLine":7,"endColumn":32}
         range: {"startLine":7,"startColumn":5,"endLine":7,"endColumn":33}
         disabled: false
-    property 4
+    property 2
         name: "-ms-border-radius"
             range: {"startLine":8,"startColumn":6,"endLine":8,"endColumn":23}
         value: " $radius"
             range: {"startLine":8,"startColumn":24,"endLine":8,"endColumn":32}
         range: {"startLine":8,"startColumn":6,"endLine":8,"endColumn":33}
         disabled: false
-    property 5
+    property 3
         name: "border-radius"
             range: {"startLine":9,"startColumn":10,"endLine":9,"endColumn":23}
         value: " $radius"
             range: {"startLine":9,"startColumn":24,"endLine":9,"endColumn":32}
         range: {"startLine":9,"startColumn":10,"endLine":9,"endColumn":33}
         disabled: false
-rule 2: "mixins"
+rule 2: "div"
     property 0
         name: "border-radius"
             range: {"startLine":13,"startColumn":13,"endLine":13,"endColumn":26}
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-4-expected.txt b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-4-expected.txt
index 17051b5..844d3a2 100644
--- a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-4-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-4-expected.txt
@@ -10,8 +10,7 @@
 }
 
 === AST === 
-rule 0: "variables"
-rule 1: "properties"
+rule 0: "body"
     property 0
         name: "width"
             range: {"startLine":2,"startColumn":8,"endLine":2,"endColumn":13}
@@ -40,7 +39,6 @@
             range: {"startLine":5,"startColumn":15,"endLine":5,"endColumn":22}
         range: {"startLine":5,"startColumn":8,"endLine":5,"endColumn":23}
         disabled: false
-rule 2: "mixins"
 ======
 Ranges OK.
 
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-5-expected.txt b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-5-expected.txt
index 95de7346..fe47d66 100644
--- a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-5-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-5-expected.txt
@@ -11,8 +11,7 @@
 }
 
 === AST === 
-rule 0: "variables"
-rule 1: "properties"
+rule 0: "body"
     property 0
         name: "padding-top"
             range: {"startLine":1,"startColumn":7,"endLine":1,"endColumn":18}
@@ -27,21 +26,21 @@
             range: {"startLine":2,"startColumn":11,"endLine":2,"endColumn":18}
         range: {"startLine":2,"startColumn":4,"endLine":3,"endColumn":0}
         disabled: false
-    property 2
+rule 1: "body"
+    property 0
         name: "color"
             range: {"startLine":6,"startColumn":4,"endLine":6,"endColumn":9}
         value: " red"
             range: {"startLine":6,"startColumn":10,"endLine":6,"endColumn":14}
         range: {"startLine":6,"startColumn":4,"endLine":6,"endColumn":15}
         disabled: false
-    property 3
+    property 1
         name: "margin"
             range: {"startLine":7,"startColumn":7,"endLine":7,"endColumn":13}
         value: " 0 auto"
             range: {"startLine":7,"startColumn":14,"endLine":7,"endColumn":21}
         range: {"startLine":7,"startColumn":4,"endLine":7,"endColumn":24}
         disabled: true
-rule 2: "mixins"
 ======
 Ranges OK.
 
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-6-expected.txt b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-6-expected.txt
index 55b8741..300b958 100644
--- a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-6-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-6-expected.txt
@@ -7,8 +7,7 @@
     }
 }
 === AST === 
-rule 0: "variables"
-rule 1: "properties"
+rule 0: ".box#{$i}"
     property 0
         name: "color"
             range: {"startLine":2,"startColumn":8,"endLine":2,"endColumn":13}
@@ -23,7 +22,6 @@
             range: {"startLine":3,"startColumn":15,"endLine":3,"endColumn":20}
         range: {"startLine":3,"startColumn":8,"endLine":3,"endColumn":21}
         disabled: false
-rule 2: "mixins"
 ======
 Ranges OK.
 
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-7-expected.txt b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-7-expected.txt
index 3f8f5eb1..9b189f6 100644
--- a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-7-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-scss-7-expected.txt
@@ -9,8 +9,8 @@
   padding: 0;
 }
 === AST === 
-rule 0: "variables"
-rule 1: "properties"
+rule 0: "button::-moz-focus-inner,
+input::-moz-focus-inner"
     property 0
         name: "border"
             range: {"startLine":5,"startColumn":2,"endLine":5,"endColumn":8}
@@ -25,7 +25,6 @@
             range: {"startLine":6,"startColumn":10,"endLine":6,"endColumn":12}
         range: {"startLine":6,"startColumn":2,"endLine":6,"endColumn":13}
         disabled: false
-rule 2: "mixins"
 ======
 Ranges OK.
 
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger-frameworks/frameworks-dom-xhr-event-breakpoints.html b/third_party/WebKit/LayoutTests/inspector/sources/debugger-frameworks/frameworks-dom-xhr-event-breakpoints.html
index 704455c..2727749 100644
--- a/third_party/WebKit/LayoutTests/inspector/sources/debugger-frameworks/frameworks-dom-xhr-event-breakpoints.html
+++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger-frameworks/frameworks-dom-xhr-event-breakpoints.html
@@ -67,8 +67,7 @@
         remover3();
         remover4();
     }
-    var result = inner();
-    return result;
+    return inner();
 }
 
 function test()
diff --git a/third_party/WebKit/LayoutTests/media/audio-autoplay-experiment-modes-expected.txt b/third_party/WebKit/LayoutTests/media/audio-autoplay-experiment-modes-expected.txt
new file mode 100644
index 0000000..db6a013
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/media/audio-autoplay-experiment-modes-expected.txt
@@ -0,0 +1,29 @@
+CONSOLE WARNING: Failed to execute 'play' on 'HTMLMediaElement': API can only be initiated by a user gesture.
+CONSOLE ERROR: line 71: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
+CONSOLE WARNING: Failed to execute 'play' on 'HTMLMediaElement': API can only be initiated by a user gesture.
+CONSOLE ERROR: line 71: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
+END OF TEST
+  Check if the autoplay gesture override experiment works.  There are a lot
+  of config options, so this test just runs all of them.
+
+  The "results" table contains one row per config tested.
+  == Test Inputs ==
+  #      - config number, in case you'd like to run just one.
+  Flags  - autoplay experiment setting being tested.
+               a      - "foraudio"
+               v      - "forvideo"
+               V      - "ifviewport"
+               P      - "ifpagevisible"
+               M      - "ifmuted"
+               p      - "playmuted"
+               m      - "ifmobile"
+               For example, vM means '-forvideo-ifmuted".
+  Type   - audio or video element?
+               audio  - 
+#	Flags	Type	Play w/	Mute	Mobile	View	Setting	Early?	Played?	Muted?
+28		audio	attr	no	no	scroll	enabled	no	no	-
+30	a	audio	attr	no	no	scroll	enabled	yes	played	unmuted
+31	aV	audio	attr	no	no	scroll	enabled	no	played	unmuted
+32		audio	play()	no	no	scroll	enabled	no	no	-
+34	a	audio	play()	no	no	scroll	enabled	yes	played	unmuted
+35	aV	audio	play()	no	no	scroll	enabled	no	played	unmuted
diff --git a/third_party/WebKit/LayoutTests/media/audio-autoplay-experiment-modes.html b/third_party/WebKit/LayoutTests/media/audio-autoplay-experiment-modes.html
new file mode 100644
index 0000000..d79ae418
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/media/audio-autoplay-experiment-modes.html
@@ -0,0 +1,81 @@
+<html>
+<video autoplay controls></video>
+<script src=media-file.js></script>
+<!-- TODO(philipj): Convert test to testharness.js. crbug.com/588956
+     (Please avoid writing new tests using video-test.js) -->
+<script src=video-test.js></script>
+<script src=autoplay-experiment-helper.js></script>
+<body>
+<pre>
+  Check if the autoplay gesture override experiment works.  There are a lot
+  of config options, so this test just runs all of them.
+
+  The "results" table contains one row per config tested.
+  == Test Inputs ==
+  #      - config number, in case you'd like to run just one.
+  Flags  - autoplay experiment setting being tested.
+               a      - "foraudio"
+               v      - "forvideo"
+               V      - "ifviewport"
+               P      - "ifpagevisible"
+               M      - "ifmuted"
+               p      - "playmuted"
+               m      - "ifmobile"
+               For example, vM means '-forvideo-ifmuted".
+  Type   - audio or video element?
+               audio  - <audio>
+               video  - <video>
+  Play w/- how is play requested?
+               none   - play is not requested.
+               attr   - autoplay attribute is set on the element.
+               play() - play() called after media is ready to play.
+  Mute   - how is media muted?
+               no   - media is not muted.
+               yes  - muted attribute is set on the element.
+  Mobile - is page optimized for mobile?
+               no   - page is not optimized for mobile.
+               yes  - page is optimized for mobile.
+  View   - is media in viewport?
+               onscreen  - element starts out onscreen.
+               scroll    - element starts offscreen, scrolled into view once
+                           it is ready to play.
+               offscreen - element starts out offscreen and stays offscreen.
+               obscured  - onscreen but page is not visible.
+  Setting - autoplay settings value
+               enabled  - content settings enables autoplay
+               disabled - content settings disables autoplay
+
+  == Test Outputs ==
+  Early?  - did playback start before element was scrolled onscreen?  For
+            tests in which View!=scroll, this is reported as "-".
+  Played? - did playback start by the conclusion of the test?
+  Muted?  - was the media muted?  If the media didn't play, then this is
+            reported as "-".
+
+</pre>
+<table id="results">
+<tr>
+<td>#</td>
+<td>Flags</td>
+<td>Type</td>
+<td>Play w/</td>
+<td>Mute</td>
+<td>Mobile</td>
+<td>View</td>
+<td>Setting</td>
+<td>Early?</td>
+<td>Played?</td>
+<td>Muted?</td>
+</tr>
+</table>
+</body>
+
+<script>
+
+start('audio', [ 'none',
+                 'enabled-forvideo',
+                 'enabled-foraudio',
+                 'enabled-foraudio-ifviewport']);
+
+</script>
+</html>
diff --git a/third_party/WebKit/LayoutTests/media/autoplay-experiment-helper.js b/third_party/WebKit/LayoutTests/media/autoplay-experiment-helper.js
new file mode 100644
index 0000000..183e2f1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/media/autoplay-experiment-helper.js
@@ -0,0 +1,271 @@
+// Starting configuration number.  This should be zero normally.
+var configNumber = 0;
+
+var mediaFile = findMediaFile("video", "content/test");
+var onscreenParent = document.createElement("div");
+// The onscreen parent's height is also used to make sure that the off-screen
+// parent is, in fact, off-screen.
+onscreenParent.style.height = "1000px";
+document.body.insertBefore(onscreenParent, document.body.firstChild);
+// Is the page optimized for mobile?  We can't un-optimize it.
+var isOptimizedForMobile = false;
+// Also create another root that's off the bottom of the window.
+var offscreenParent = document.createElement("div");
+document.body.appendChild(offscreenParent);
+
+function didPlaybackStart(element)
+{
+    return !element.paused || element.ended;
+}
+
+function becomeOptimizedForMobile(enable)
+{
+    // If we're in the right state already, then return;
+    if (enable == isOptimizedForMobile)
+        return;
+
+    if (!enable) {
+        // We can't transition out of optimized for mobile.
+        endTest();
+    } else {
+        // This only works once.
+        mobileMetaTag = document.createElement('meta');
+        mobileMetaTag.name = "viewport";
+        mobileMetaTag.content = "width=device-width";
+        document.head.appendChild(mobileMetaTag);
+        isOptimizedForMobile = true;
+    }
+}
+
+function addResultsRow(spec)
+{
+    // Add a row to the results table.
+    var row = document.getElementById("results").insertRow();
+    var td = row.insertCell();
+
+    // Add experiment number
+    row.insertCell().innerText = (""+spec.experimentNumber);
+
+    // Process experiment type specially.
+    var type = spec.experimentType;
+    var smallType = "";
+    smallType += type.includes("-forvideo")?"v":"";
+    smallType += type.includes("-foraudio")?"a":"";
+    smallType += type.includes("-ifviewport")?"V":"";
+    smallType += type.includes("-ifpagevisible")?"P":"";
+    smallType += type.includes("-ifmuted")?"M":"";
+    smallType += type.includes("-playmuted")?"p":"";
+    smallType += type.includes("-ifmobile")?"m":"";
+    row.insertCell().innerText = smallType;
+
+    // Add remaining fields.
+    var fields = [ "elementType", "autoplayType", "mutedType", "mobileType",
+        "visType", "settingValue", "playedEarly", "played", "muted"];
+    for(idx in fields)
+        row.insertCell().innerText = spec[fields[idx]].substring(0,7);
+}
+
+function configureElementViaScript(element, spec)
+{
+    if(spec.autoplayType == "play()")
+        element.play();
+}
+
+function queueNextExperiment()
+{
+    // Start the next config, but let the event queue drain.
+    setTimeout(runNextConfig, 0);
+}
+
+function checkElementStatus(element)
+{
+    // Update the spec with the results.
+    var didStart = didPlaybackStart(element);
+    element.spec.played = didStart ? "played" : "no";
+    element.spec.muted = didStart ? (element.muted ? "muted" : "unmuted") : "-";
+
+    addResultsRow(element.spec);
+    element.remove();
+
+    // Scroll back to the top, in case this was a scrolling test.
+    onscreenParent.scrollIntoView();
+
+    // Also make sure that the page is visible again.  Hidden pages cause the
+    // test to proceed very slowly.
+    testRunner.setPageVisibility("visible");
+
+    queueNextExperiment();
+}
+
+function runOneConfig(spec)
+{
+    internals.settings.setAutoplayExperimentMode(spec.experimentType);
+    internals.settings.setViewportMetaEnabled(true);
+    testRunner.setAutoplayAllowed(spec.settingValue == "enabled");
+
+    // Create, configure, and attach a media element.
+    var element = document.createElement(spec.elementType);
+    element.controls = true;
+
+    // Hide or show the page.
+    if (spec.visType == "obscured")
+        testRunner.setPageVisibility("hidden");
+
+    // Pick whether the element will be visible when canPlayThrough.
+    if (spec.visType == "offscreen" || spec.visType == "scroll")
+        offscreenParent.appendChild(element);
+    else
+        onscreenParent.appendChild(element);
+
+    // Set any attributes before canPlayThrough.
+    if (spec.mutedType == "yes")
+        element.muted = true;
+    if (spec.autoplayType == "attr")
+        element.autoplay = true;
+
+    becomeOptimizedForMobile(spec.mobileType == "yes");
+
+    spec.playedEarly = "-";
+
+    // Record the spec in the element, so that we can display the
+    // results later.
+    element.spec = spec;
+    window.internals.triggerAutoplayViewportCheck(element);
+
+    // Wait for canplaythrough before continuing, so that the media
+    // might actually be playing.
+    element.addEventListener("canplaythrough", function()
+    {
+        // Now that we can play, if we're supposed to play / mute via js do so.
+        configureElementViaScript(element, spec);
+
+        // If we're supposed to scroll the item onscreen after it is ready to
+        // play, then do so now.
+        if(spec.visType == "scroll") {
+            // Record the play state here, too, before we scroll.
+            spec.playedEarly = didPlaybackStart(element) ? "yes" : "no";
+
+            // We are supposed to scroll the player into view.
+            element.scrollIntoView(true);
+            // TODO(liberato): remove once autoplay gesture override experiment concludes.
+            window.internals.triggerAutoplayViewportCheck(element);
+            // Once these two methods return, changes to the element state due
+            // to the autoplay experiment should be observable synchronously.
+            checkElementStatus(element, spec);
+        } else {
+            // Record the results immediately.
+            checkElementStatus(element, spec);
+        }
+    });
+
+    // Set the source, which will eventually lead to canPlayThrough.
+    element.src = mediaFile;
+}
+
+var experimentTypes = []; // set in start().
+var elementTypes = []; // set in start().
+var autoplayTypes = ["none", "attr", "play()"];
+var mutedTypes = ["no", "yes"];
+var visTypes = ["onscreen", "scroll", "offscreen", "obscured"];
+// mobileTypes must always start with no, since we cannot un-optimize the page.
+var mobileTypes = ["no", "yes"];
+var autoplaySettings = ["enabled", "disabled"];
+
+function runNextConfig()
+{
+    // Convert configNumber into a spec, and run it.
+    var exp = configNumber;
+
+    // Convert this experiment number into settings.
+    var spec = {};
+    spec.elementType = elementTypes[exp % elementTypes.length];
+    exp = Math.floor(exp / elementTypes.length);
+    spec.experimentType = experimentTypes[exp % experimentTypes.length];
+    exp = Math.floor(exp / experimentTypes.length);
+    spec.autoplayType = autoplayTypes[exp % autoplayTypes.length];
+    exp = Math.floor(exp / autoplayTypes.length);
+    spec.mutedType = mutedTypes[exp % mutedTypes.length];
+    exp = Math.floor(exp / mutedTypes.length);
+    spec.visType = visTypes[exp % visTypes.length];
+    exp = Math.floor(exp / visTypes.length);
+    spec.settingValue = autoplaySettings[exp % autoplaySettings.length];
+    exp = Math.floor(exp / autoplaySettings.length);
+    // Mobile must always change last, so that all the "no" cases precede
+    // all the "yes" cases, since we can't switch the doc back to "not
+    // optimized for mobile".
+    spec.mobileType = mobileTypes[exp % mobileTypes.length];
+    exp = Math.floor(exp / mobileTypes.length);
+
+    spec.experimentNumber = configNumber;
+
+    // Return null if configNumber was larger than the highest experiment.
+    if (exp > 0)
+        endTest();
+
+    configNumber++;
+
+    // To keep the test fast, skip a few combinations.
+    var skip = false;
+    if (!spec.experimentType.includes("-ifmuted") && spec.mutedType != "no")
+        skip = true;
+
+    // Only allow basic combinations for the mobile case.  We just want to
+    // test video with autoplay, no mute options when testing -ifmobile.
+    // Similarly, if we're setting the page to be optimied for mobile, then
+    // require that we're one of those tests.
+    if ((spec.mobileType == "yes" || spec.experimentType.includes("-ifmobile"))
+        && (spec.elementType != "video" || spec.autoplayType != "attr"
+            || spec.mutedType != "no"
+            || spec.visType != "onscreen"
+            || (spec.experimentType != "enabled-forvideo"
+                && spec.experimentType != "enabled-forvideo-ifmobile")))
+        skip = true;
+
+    var mismatched =(spec.elementType == "video"
+        && spec.experimentType.includes("-foraudio"))
+        || (spec.elementType == "audio"
+        && spec.experimentType.includes("-forvideo"));
+
+    if (spec.autoplayType == "none" && spec.visType != 'onscreen')
+        skip = true;
+    else if (spec.experimentType.includes("-ifmuted")
+        && spec.visType != "onscreen")
+        skip = true;
+    else if (spec.visType == "offscreen"
+        && spec.autoplayType != "attr")
+        skip = true;
+    else if (!spec.experimentType.includes("-ifmuted")
+        && spec.mutedType == "yes")
+        skip = true;
+    else if (spec.elementType == "audio" && spec.mutedType == "yes")
+        skip = true;
+    else if (spec.elementType == "audio" && spec.visType != "scroll")
+        skip = true;
+    else if (mismatched && spec.visType !="onscreen")
+        skip = true;
+    else if (mismatched && spec.autoplayType != "attr")
+        skip = true;
+    else if (spec.visType == "obscured"
+        && !spec.experimentType.includes("-ifpagevisible"))
+        skip = true;
+    else if ((spec.visType == "offscreen" || spec.visType == "scroll"
+        || spec.autoplayType != "attr" || spec.elementType != "video")
+        && spec.experimentType.includes("-ifpagevisible"))
+        skip = true;
+    else if (spec.settingValue == "disabled"
+        && ((spec.visType != "onscreen") || (spec.autoplayType != "play()")))
+        skip = true;
+
+    if (skip)
+        queueNextExperiment();
+    else
+        runOneConfig(spec);
+}
+
+function start(mediaType, experiments) {
+  elementTypes = [ mediaType ];
+  experimentTypes = experiments;
+
+  window.internals.settings.setMediaPlaybackRequiresUserGesture(true);
+  runNextConfig();
+}
diff --git a/third_party/WebKit/LayoutTests/media/track/media-element-move-to-new-document-assert-expected.txt b/third_party/WebKit/LayoutTests/media/track/media-element-move-to-new-document-assert-expected.txt
index b98b997..d1a80c5 100644
--- a/third_party/WebKit/LayoutTests/media/track/media-element-move-to-new-document-assert-expected.txt
+++ b/third_party/WebKit/LayoutTests/media/track/media-element-move-to-new-document-assert-expected.txt
@@ -1,3 +1,3 @@
 Test for failing EventDispatchForbiddenScope assert when moving a video with text track between documents.
 
-
+ 
diff --git a/third_party/WebKit/LayoutTests/media/track/media-element-move-to-new-document-assert.html b/third_party/WebKit/LayoutTests/media/track/media-element-move-to-new-document-assert.html
index ccaa218..13c2f6e 100644
--- a/third_party/WebKit/LayoutTests/media/track/media-element-move-to-new-document-assert.html
+++ b/third_party/WebKit/LayoutTests/media/track/media-element-move-to-new-document-assert.html
@@ -4,19 +4,25 @@
 <video></video>
 <iframe></iframe>
 <script>
-if (window.testRunner)
+if (window.testRunner) {
   testRunner.dumpAsText();
+  testRunner.waitUntilDone();
+}
 
-var video = document.querySelector("video");
-var track = document.createElement("track");
+window.onload = function () {
+    var video = document.querySelector("video");
+    var track = document.createElement("track");
 
-// Note: The order of setting the text track mode and appending the
-// track element is important, in terms of implementation and spec:
-// https://www.w3.org/Bugs/Public/show_bug.cgi?id=28973
-track.track.mode = "showing";
-video.appendChild(track);
+    // Note: The order of setting the text track mode and appending the
+    // track element is important, in terms of implementation and spec:
+    // https://www.w3.org/Bugs/Public/show_bug.cgi?id=28973
+    track.track.mode = "showing";
+    video.appendChild(track);
 
-// Move the video element to another document.
-var iframe = document.querySelector("iframe");
-iframe.contentDocument.body.appendChild(video);
+    // Move the video element to another document.
+    var iframe = document.querySelector("iframe");
+    iframe.contentDocument.body.appendChild(video);
+    if (window.testRunner)
+        testRunner.notifyDone();
+};
 </script>
diff --git a/third_party/WebKit/LayoutTests/media/video-autoplay-experiment-modes-expected.txt b/third_party/WebKit/LayoutTests/media/video-autoplay-experiment-modes-expected.txt
index 50001c2..df564e7 100644
--- a/third_party/WebKit/LayoutTests/media/video-autoplay-experiment-modes-expected.txt
+++ b/third_party/WebKit/LayoutTests/media/video-autoplay-experiment-modes-expected.txt
@@ -1,17 +1,21 @@
 CONSOLE WARNING: Failed to execute 'play' on 'HTMLMediaElement': API can only be initiated by a user gesture.
-CONSOLE ERROR: line 141: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
+CONSOLE ERROR: line 71: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
 CONSOLE WARNING: Failed to execute 'play' on 'HTMLMediaElement': API can only be initiated by a user gesture.
-CONSOLE ERROR: line 141: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
+CONSOLE ERROR: line 71: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
 CONSOLE WARNING: Failed to execute 'play' on 'HTMLMediaElement': API can only be initiated by a user gesture.
-CONSOLE ERROR: line 141: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
+CONSOLE ERROR: line 71: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
 CONSOLE WARNING: Failed to execute 'play' on 'HTMLMediaElement': API can only be initiated by a user gesture.
-CONSOLE ERROR: line 141: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
+CONSOLE ERROR: line 71: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
 CONSOLE WARNING: Failed to execute 'play' on 'HTMLMediaElement': API can only be initiated by a user gesture.
-CONSOLE ERROR: line 141: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
+CONSOLE ERROR: line 71: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
 CONSOLE WARNING: Failed to execute 'play' on 'HTMLMediaElement': API can only be initiated by a user gesture.
-CONSOLE ERROR: line 141: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
+CONSOLE ERROR: line 71: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
 CONSOLE WARNING: Failed to execute 'play' on 'HTMLMediaElement': API can only be initiated by a user gesture.
-CONSOLE ERROR: line 141: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
+CONSOLE ERROR: line 71: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
+CONSOLE WARNING: Failed to execute 'play' on 'HTMLMediaElement': API can only be initiated by a user gesture.
+CONSOLE ERROR: line 71: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
+CONSOLE WARNING: Failed to execute 'play' on 'HTMLMediaElement': API can only be initiated by a user gesture.
+CONSOLE ERROR: line 71: Uncaught (in promise) NotAllowedError: play() can only be initiated by a user gesture.
 END OF TEST
   Check if the autoplay gesture override experiment works.  There are a lot
   of config options, so this test just runs all of them.
@@ -30,48 +34,39 @@
                For example, vM means '-forvideo-ifmuted".
   Type   - audio or video element?
                audio  - 
-#	Flags	Type	Play w/	Mute	Mobile	View	Early?	Played?	Muted?
-0		video	none	no	no	onscree	-	no	-
-2	v	video	none	no	no	onscree	-	no	-
-6	vV	video	none	no	no	onscree	-	no	-
-8	vVM	video	none	no	no	onscree	-	no	-
-10	vVp	video	none	no	no	onscree	-	no	-
-18		video	attr	no	no	onscree	-	no	-
-20	v	video	attr	no	no	onscree	-	played	unmuted
-22	vP	video	attr	no	no	onscree	-	played	unmuted
-24	vV	video	attr	no	no	onscree	-	played	unmuted
-26	vVM	video	attr	no	no	onscree	-	no	-
-28	vVp	video	attr	no	no	onscree	-	played	muted
-30	a	video	attr	no	no	onscree	-	no	-
-32	vm	video	attr	no	no	onscree	-	no	-
-34	aV	video	attr	no	no	onscree	-	no	-
-36		video	play()	no	no	onscree	-	no	-
-38	v	video	play()	no	no	onscree	-	played	unmuted
-42	vV	video	play()	no	no	onscree	-	played	unmuted
-44	vVM	video	play()	no	no	onscree	-	no	-
-46	vVp	video	play()	no	no	onscree	-	played	muted
-62	vVM	video	none	yes	no	onscree	-	no	-
-80	vVM	video	attr	yes	no	onscree	-	played	muted
-98	vVM	video	play()	yes	no	onscree	-	played	muted
-126		video	attr	no	no	scroll	no	no	-
-127		audio	attr	no	no	scroll	no	no	-
-128	v	video	attr	no	no	scroll	yes	played	unmuted
-132	vV	video	attr	no	no	scroll	no	played	unmuted
-136	vVp	video	attr	no	no	scroll	no	played	muted
-139	a	audio	attr	no	no	scroll	yes	played	unmuted
-143	aV	audio	attr	no	no	scroll	no	played	unmuted
-144		video	play()	no	no	scroll	no	no	-
-145		audio	play()	no	no	scroll	no	no	-
-146	v	video	play()	no	no	scroll	yes	played	unmuted
-150	vV	video	play()	no	no	scroll	no	played	unmuted
-154	vVp	video	play()	no	no	scroll	no	played	muted
-157	a	audio	play()	no	no	scroll	yes	played	unmuted
-161	aV	audio	play()	no	no	scroll	no	played	unmuted
-234		video	attr	no	no	offscre	-	no	-
-236	v	video	attr	no	no	offscre	-	played	unmuted
-240	vV	video	attr	no	no	offscre	-	no	-
-244	vVp	video	attr	no	no	offscre	-	no	-
-346	vP	video	attr	no	no	obscure	-	no	-
-452	v	video	attr	no	yes	onscree	-	played	unmuted
-464	vm	video	attr	no	yes	onscree	-	played	unmuted
-
+#	Flags	Type	Play w/	Mute	Mobile	View	Setting	Early?	Played?	Muted?
+0		video	none	no	no	onscree	enabled	-	no	-
+1	v	video	none	no	no	onscree	enabled	-	no	-
+3	vVM	video	none	no	no	onscree	enabled	-	no	-
+4	vVp	video	none	no	no	onscree	enabled	-	no	-
+7		video	attr	no	no	onscree	enabled	-	no	-
+8	v	video	attr	no	no	onscree	enabled	-	played	unmuted
+9	vP	video	attr	no	no	onscree	enabled	-	played	unmuted
+10	vVM	video	attr	no	no	onscree	enabled	-	no	-
+11	vVp	video	attr	no	no	onscree	enabled	-	played	muted
+12	vm	video	attr	no	no	onscree	enabled	-	no	-
+13	a	video	attr	no	no	onscree	enabled	-	no	-
+14		video	play()	no	no	onscree	enabled	-	no	-
+15	v	video	play()	no	no	onscree	enabled	-	played	unmuted
+17	vVM	video	play()	no	no	onscree	enabled	-	no	-
+18	vVp	video	play()	no	no	onscree	enabled	-	played	muted
+24	vVM	video	none	yes	no	onscree	enabled	-	no	-
+31	vVM	video	attr	yes	no	onscree	enabled	-	played	muted
+38	vVM	video	play()	yes	no	onscree	enabled	-	played	muted
+49		video	attr	no	no	scroll	enabled	no	no	-
+50	v	video	attr	no	no	scroll	enabled	yes	played	unmuted
+53	vVp	video	attr	no	no	scroll	enabled	no	played	muted
+56		video	play()	no	no	scroll	enabled	no	no	-
+57	v	video	play()	no	no	scroll	enabled	yes	played	unmuted
+60	vVp	video	play()	no	no	scroll	enabled	no	played	muted
+91		video	attr	no	no	offscre	enabled	-	no	-
+92	v	video	attr	no	no	offscre	enabled	-	played	unmuted
+95	vVp	video	attr	no	no	offscre	enabled	-	no	-
+135	vP	video	attr	no	no	obscure	enabled	-	no	-
+182		video	play()	no	no	onscree	disable	-	no	-
+183	v	video	play()	no	no	onscree	disable	-	no	-
+185	vVM	video	play()	no	no	onscree	disable	-	no	-
+186	vVp	video	play()	no	no	onscree	disable	-	no	-
+206	vVM	video	play()	yes	no	onscree	disable	-	no	-
+344	v	video	attr	no	yes	onscree	enabled	-	played	unmuted
+348	vm	video	attr	no	yes	onscree	enabled	-	played	unmuted
diff --git a/third_party/WebKit/LayoutTests/media/video-autoplay-experiment-modes.html b/third_party/WebKit/LayoutTests/media/video-autoplay-experiment-modes.html
index edf742f1..a1f930e54 100644
--- a/third_party/WebKit/LayoutTests/media/video-autoplay-experiment-modes.html
+++ b/third_party/WebKit/LayoutTests/media/video-autoplay-experiment-modes.html
@@ -4,6 +4,7 @@
 <!-- TODO(philipj): Convert test to testharness.js. crbug.com/588956
      (Please avoid writing new tests using video-test.js) -->
 <script src=video-test.js></script>
+<script src=autoplay-experiment-helper.js></script>
 <body>
 <pre>
   Check if the autoplay gesture override experiment works.  There are a lot
@@ -40,6 +41,9 @@
                            it is ready to play.
                offscreen - element starts out offscreen and stays offscreen.
                obscured  - onscreen but page is not visible.
+  Setting - autoplay settings value
+               enabled  - content settings enables autoplay
+               disabled - content settings disables autoplay
 
   == Test Outputs ==
   Early?  - did playback start before element was scrolled onscreen?  For
@@ -58,6 +62,7 @@
 <td>Mute</td>
 <td>Mobile</td>
 <td>View</td>
+<td>Setting</td>
 <td>Early?</td>
 <td>Played?</td>
 <td>Muted?</td>
@@ -67,275 +72,13 @@
 
 <script>
 
-// Starting configuration number.  This should be zero normally.
-var configNumber = 0;
-
-var mediaFile = findMediaFile("video", "content/test");
-var onscreenParent = document.createElement("div");
-// The onscreen parent's height is also used to make sure that the off-screen
-// parent is, in fact, off-screen.
-onscreenParent.style.height = "1000px";
-document.body.insertBefore(onscreenParent, document.body.firstChild);
-// Is the page optimized for mobile?  We can't un-optimize it.
-var isOptimizedForMobile = false;
-// Also create another root that's off the bottom of the window.
-var offscreenParent = document.createElement("div");
-document.body.appendChild(offscreenParent);
-
-function didPlaybackStart(element)
-{
-    return !element.paused || element.ended;
-}
-
-function becomeOptimizedForMobile(enable)
-{
-    // If we're in the right state already, then return;
-    if (enable == isOptimizedForMobile)
-        return;
-
-    if (!enable) {
-        // We can't transition out of optimized for mobile.
-        console.log("becomeOptimizedForMobile: test is broken -- cannot un-enable mobile");
-        endTest();
-    } else {
-        // This only works once.
-        mobileMetaTag = document.createElement('meta');
-        mobileMetaTag.name = "viewport";
-        mobileMetaTag.content = "width=device-width";
-        document.head.appendChild(mobileMetaTag);
-        isOptimizedForMobile = true;
-    }
-}
-
-function addResultsRow(spec)
-{
-    // Add a row to the results table.
-    var row = document.getElementById("results").insertRow();
-    var td = row.insertCell();
-
-    // Add experiment number
-    row.insertCell().innerText = (""+spec.experimentNumber);
-
-    // Process experiment type specially.
-    var type = spec.experimentType;
-    var smallType = "";
-    smallType += type.includes("-forvideo")?"v":"";
-    smallType += type.includes("-foraudio")?"a":"";
-    smallType += type.includes("-ifviewport")?"V":"";
-    smallType += type.includes("-ifpagevisible")?"P":"";
-    smallType += type.includes("-ifmuted")?"M":"";
-    smallType += type.includes("-playmuted")?"p":"";
-    smallType += type.includes("-ifmobile")?"m":"";
-    row.insertCell().innerText = smallType;
-
-    // Add remaining fields.
-    var fields = [ "elementType", "autoplayType", "mutedType", "mobileType",
-        "visType", "playedEarly", "played", "muted"];
-    for(idx in fields)
-        row.insertCell().innerText = spec[fields[idx]].substring(0,7);
-}
-
-function configureElementViaScript(element, spec)
-{
-    if(spec.autoplayType == "play()")
-        element.play();
-}
-
-function queueNextExperiment()
-{
-    // Start the next config, but let the event queue drain.
-    setTimeout(runNextConfig, 0);
-}
-
-function checkElementStatus(element)
-{
-    // Update the spec with the results.
-    var didStart = didPlaybackStart(element);
-    element.spec.played = didStart ? "played" : "no";
-    element.spec.muted = didStart ? (element.muted ? "muted" : "unmuted") : "-";
-
-    addResultsRow(element.spec);
-    element.remove();
-
-    // Scroll back to the top, in case this was a scrolling test.
-    onscreenParent.scrollIntoView();
-
-    // Also make sure that the page is visible again.  Hidden pages cause the
-    // test to proceed very slowly.
-    testRunner.setPageVisibility("visible");
-
-    queueNextExperiment();
-}
-
-function runOneConfig(spec)
-{
-    internals.settings.setAutoplayExperimentMode(spec.experimentType);
-    internals.settings.setViewportMetaEnabled(true);
-
-    // Create, configure, and attach a media element.
-    var element = document.createElement(spec.elementType);
-    element.controls = true;
-
-    // Hide or show the page.
-    if (spec.visType == "obscured")
-        testRunner.setPageVisibility("hidden");
-
-    // Pick whether the element will be visible when canPlayThrough.
-    if (spec.visType == "offscreen" || spec.visType == "scroll")
-        offscreenParent.appendChild(element);
-    else
-        onscreenParent.appendChild(element);
-
-    // Set any attributes before canPlayThrough.
-    if (spec.mutedType == "yes")
-        element.muted = true;
-    if (spec.autoplayType == "attr")
-        element.autoplay = true;
-
-    becomeOptimizedForMobile(spec.mobileType == "yes");
-
-    spec.playedEarly = "-";
-
-    // Record the spec in the element, so that we can display the
-    // results later.
-    element.spec = spec;
-    window.internals.triggerAutoplayViewportCheck(element);
-
-    // Wait for canplaythrough before continuing, so that the media
-    // might actually be playing.
-    element.addEventListener("canplaythrough", function()
-    {
-        // Now that we can play, if we're supposed to play / mute via js do so.
-        configureElementViaScript(element, spec);
-
-        // If we're supposed to scroll the item onscreen after it is ready to
-        // play, then do so now.
-        if(spec.visType == "scroll") {
-            // Record the play state here, too, before we scroll.
-            spec.playedEarly = didPlaybackStart(element) ? "yes" : "no";
-
-            // We are supposed to scroll the player into view.
-            element.scrollIntoView(true);
-            // TODO(liberato): remove once autoplay gesture override experiment concludes.
-            window.internals.triggerAutoplayViewportCheck(element);
-            // Once these two methods return, changes to the element state due
-            // to the autoplay experiment should be observable synchronously.
-            checkElementStatus(element, spec);
-        } else {
-            // Record the results immediately.
-            checkElementStatus(element, spec);
-        }
-    });
-
-    // Set the source, which will eventually lead to canPlayThrough.
-    element.src = mediaFile;
-}
-
-var experimentTypes = [
-    "none",
-    "enabled-forvideo",
-    "enabled-forvideo-ifpagevisible",
-    "enabled-forvideo-ifviewport",
-    "enabled-forvideo-ifviewport-ifmuted",
-    "enabled-forvideo-ifviewport-playmuted",
-    "enabled-foraudio",
-    "enabled-forvideo-ifmobile",
-    "enabled-foraudio-ifviewport",
-];
-var elementTypes = ["video", "audio"];
-var autoplayTypes = ["none", "attr", "play()"];
-var mutedTypes = ["no", "yes"];
-var visTypes = ["onscreen", "scroll", "offscreen", "obscured"];
-// mobileTypes must always start with no, since we cannot un-optimize the page.
-var mobileTypes = ["no", "yes"];
-
-function runNextConfig()
-{
-    // Convert configNumber into a spec, and run it.
-    var exp = configNumber;
-
-    // Convert this experiment number into settings.
-    var spec = {};
-    spec.elementType = elementTypes[exp % elementTypes.length];
-    exp = Math.floor(exp / elementTypes.length);
-    spec.experimentType = experimentTypes[exp % experimentTypes.length];
-    exp = Math.floor(exp / experimentTypes.length);
-    spec.autoplayType = autoplayTypes[exp % autoplayTypes.length];
-    exp = Math.floor(exp / autoplayTypes.length);
-    spec.mutedType = mutedTypes[exp % mutedTypes.length];
-    exp = Math.floor(exp / mutedTypes.length);
-    spec.visType = visTypes[exp % visTypes.length];
-    exp = Math.floor(exp / visTypes.length);
-    // Mobile must always change last, so that all the "no" cases precede
-    // all the "yes" cases, since we can't switch the doc back to "not
-    // optimized for mobile".
-    spec.mobileType = mobileTypes[exp % mobileTypes.length];
-    exp = Math.floor(exp / mobileTypes.length);
-    spec.experimentNumber = configNumber;
-
-    // Return null if configNumber was larger than the highest experiment.
-    if (exp > 0)
-        endTest();
-
-    configNumber++;
-
-    // To keep the test fast, skip a few combinations.
-    var skip = false;
-    if (!spec.experimentType.includes("-ifmuted") && spec.mutedType != "no")
-        skip = true;
-
-    // Only allow basic combinations for the mobile case.  We just want to
-    // test video with autoplay, no mute options when testing -ifmobile.
-    // Similarly, if we're setting the page to be optimied for mobile, then
-    // require that we're one of those tests.
-    if ((spec.mobileType == "yes" || spec.experimentType.includes("-ifmobile"))
-        && (spec.elementType != "video" || spec.autoplayType != "attr"
-            || spec.mutedType != "no"
-            || spec.visType != "onscreen"
-            || (spec.experimentType != "enabled-forvideo"
-                && spec.experimentType != "enabled-forvideo-ifmobile")))
-        skip = true;
-
-    var mismatched =(spec.elementType == "video"
-        && spec.experimentType.includes("-foraudio"))
-        || (spec.elementType == "audio"
-        && spec.experimentType.includes("-forvideo"));
-
-    if (spec.autoplayType == "none" && spec.visType != 'onscreen')
-        skip = true;
-    else if (spec.experimentType.includes("-ifmuted")
-        && spec.visType != "onscreen")
-        skip = true;
-    else if (spec.visType == "offscreen"
-        && spec.autoplayType != "attr")
-        skip = true;
-    else if (!spec.experimentType.includes("-ifmuted")
-        && spec.mutedType == "yes")
-        skip = true;
-    else if (spec.elementType == "audio" && spec.mutedType == "yes")
-        skip = true;
-    else if (spec.elementType == "audio" && spec.visType != "scroll")
-        skip = true;
-    else if (mismatched && spec.visType !="onscreen")
-        skip = true;
-    else if (mismatched && spec.autoplayType != "attr")
-        skip = true;
-    else if (spec.visType == "obscured"
-        && !spec.experimentType.includes("-ifpagevisible"))
-        skip = true;
-    else if ((spec.visType == "offscreen" || spec.visType == "scroll"
-        || spec.autoplayType != "attr" || spec.elementType != "video")
-        && spec.experimentType.includes("-ifpagevisible"))
-        skip = true;
-
-    if (skip)
-        queueNextExperiment();
-    else
-        runOneConfig(spec);
-}
-
-window.internals.settings.setMediaPlaybackRequiresUserGesture(true);
-runNextConfig();
+start('video', [ 'none',
+                 'enabled-forvideo',
+                 'enabled-forvideo-ifpagevisible',
+                 'enabled-forvideo-ifviewport-ifmuted',
+                 'enabled-forvideo-ifviewport-playmuted',
+                 'enabled-forvideo-ifmobile',
+                 'enabled-foraudio']);
 
 </script>
 </html>
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/composited-non-stacking-context-descendant-move-expected.html b/third_party/WebKit/LayoutTests/paint/invalidation/composited-non-stacking-context-descendant-move-expected.html
index 523215333..5c91543 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/composited-non-stacking-context-descendant-move-expected.html
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/composited-non-stacking-context-descendant-move-expected.html
@@ -11,5 +11,4 @@
     background-color: green;
 }
 </style>
-<div id="block"></div>
-This test passes if there is a green square without red.
+<div id="block">The test passes if there is no red.</div>
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/composited-non-stacking-context-descendant-move.html b/third_party/WebKit/LayoutTests/paint/invalidation/composited-non-stacking-context-descendant-move.html
index a464f5c..509c1e1 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/composited-non-stacking-context-descendant-move.html
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/composited-non-stacking-context-descendant-move.html
@@ -27,11 +27,10 @@
     backface-visibility: hidden;
 }
 </style>
-<div id="indicator"></div>
+<div id="indicator">The test fails if you see this.</div>
 <div id="composited-non-stacking-context">
-    <div id="block"></div>
+    <div id="block">The test passes if there is no red.</div>
 </div>
-This test passes if there is a green square without red.
 <script src="../../resources/run-after-layout-and-paint.js"></script>
 <script>
 runAfterLayoutAndPaint(function() {
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/fixed-position-descendant-paint-offset-indirect.html b/third_party/WebKit/LayoutTests/paint/invalidation/fixed-position-descendant-paint-offset-indirect.html
index 5a81fea..a566612 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/fixed-position-descendant-paint-offset-indirect.html
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/fixed-position-descendant-paint-offset-indirect.html
@@ -31,6 +31,6 @@
 <script>
 runAfterLayoutAndPaint(function() {
     document.getElementById("container").style.top = "100px";
-    document.getElementById("block").style.top = "100px";
+    document.getElementById("block").style.top = "150px";
 }, true);
 </script>
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/invalidate-caret-before-text-node-update.html b/third_party/WebKit/LayoutTests/paint/invalidation/invalidate-caret-before-text-node-update.html
new file mode 100644
index 0000000..3c902064
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/invalidate-caret-before-text-node-update.html
@@ -0,0 +1,33 @@
+<!doctype HTML>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<div contenteditable id="root" class="editing"></div>
+<style>
+* {
+	font-family: Courier New;
+}
+</style>
+<script>
+test(function() {
+	// The innerText must be set explicitly, and not with an editing command.
+	root.innerText = "1";
+	window.getSelection().collapse(root.firstChild, 1);
+
+	if (window.internals)
+  	    window.internals.startTrackingRepaints(document);
+
+  	debugger;
+  	document.execCommand('delete');
+
+ 	if (window.internals) {
+	 	var layers = JSON.parse(window.internals.layerTreeAsText(document, internals.LAYER_TREE_INCLUDES_PAINT_INVALIDATIONS));
+	    assert_equals(layers.children[0].paintInvalidations[2].reason, "invalidate paint rectangle");
+		var previousOffset = layers.children[0].paintInvalidations[2].rect[0];
+		assert_equals(layers.children[0].paintInvalidations[2].rect[3], 20, "Old caret rect location");
+
+	    assert_equals(layers.children[0].paintInvalidations[3].reason, "invalidate paint rectangle");
+	    // Check that thet x offset is previousOffset - 1. This for the caret rect after delete.
+		assert_not_equals(layers.children[0].paintInvalidations[3].rect[0], previousOffset, "New caret rect location");
+	 }
+});
+</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/relative-position-under-composited-scroll-expected.html b/third_party/WebKit/LayoutTests/paint/invalidation/relative-position-under-composited-scroll-expected.html
new file mode 100644
index 0000000..5061db3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/relative-position-under-composited-scroll-expected.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+Tests paint invalidation when an object under composited scrolled container is
+set 'display: relative'. Passes if no red residue. 
+<div style="overflow: scroll; width: 200px; height: 200px">
+  <div style="width: 600px; height: 600px; padding: 100px">
+    <div id="item" style="background-color: green; width: 50px; height: 50px"></div>
+  </div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/relative-position-under-composited-scroll.html b/third_party/WebKit/LayoutTests/paint/invalidation/relative-position-under-composited-scroll.html
new file mode 100644
index 0000000..954bb591
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/relative-position-under-composited-scroll.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+Tests paint invalidation when an object under composited scrolled container is
+set 'display: relative'. Passes if no red residue. 
+<div style="overflow: scroll; width: 200px; height: 200px">
+  <div style="width: 800px; height: 800px">
+    <div id="item" style="background-color: red; width: 50px; height: 50px"></div>
+  </div>
+</div>
+<script src="../../resources/run-after-layout-and-paint.js"></script>
+<script>
+if (window.internal)
+  internals.settings.setPreferCompositingToLCDTextEnabled(true);
+runAfterLayoutAndPaint(function() {
+  item.style.position = 'relative';
+  item.style.left = '100px';
+  item.style.top = '100px';
+  item.style.backgroundColor = 'green';
+}, true);
+</script>
diff --git a/third_party/WebKit/LayoutTests/payments/payment-request-interface.html b/third_party/WebKit/LayoutTests/payments/payment-request-interface.html
index 67516f2..c64c202 100644
--- a/third_party/WebKit/LayoutTests/payments/payment-request-interface.html
+++ b/third_party/WebKit/LayoutTests/payments/payment-request-interface.html
@@ -90,16 +90,26 @@
 
 test(function() {
     var request = new PaymentRequest(['foo'], buildDetails('shippingOptions', {'id': 'standard'}));
+    assert_equals(null, request.shippingOption);
+}, 'Shipping option identifier should be null if shipping request is omitted.');
+
+test(function() {
+    var request = new PaymentRequest(['foo'], buildDetails('shippingOptions', {'id': 'standard'}), {'requestShipping': false});
+    assert_equals(null, request.shippingOption);
+}, 'Shipping option identifier should be null if shipping is explicitly not requested.');
+
+test(function() {
+    var request = new PaymentRequest(['foo'], buildDetails('shippingOptions', {'id': 'standard'}), {'requestShipping': true});
     assert_equals('standard', request.shippingOption);
 }, 'Shipping option identifier should default to the single provided option.');
 
 test(function() {
-    var request = new PaymentRequest(['foo'], {"items": [buildItem()]});
+    var request = new PaymentRequest(['foo'], {"items": [buildItem()]}, {'requestShipping': true});
     assert_equals(null, request.shippingOption);
 }, 'Shipping option identifier should be null when no shipping options are provided.');
 
 test(function() {
-    var request = new PaymentRequest(['foo'], {'items': [buildItem()], 'shippingOptions': [buildItem({'id': 'standard'}), buildItem({'id': 'express'})]});
+    var request = new PaymentRequest(['foo'], {'items': [buildItem()], 'shippingOptions': [buildItem({'id': 'standard'}), buildItem({'id': 'express'})]}, {'requestShipping': true});
     assert_equals(null, request.shippingOption);
 }, 'Shipping option identifier should be null at first when multiple shipping options are provided.');
 
diff --git a/third_party/WebKit/LayoutTests/permissionclient/script-permissions-expected.txt b/third_party/WebKit/LayoutTests/permissionclient/script-permissions-expected.txt
index a5a60721..8b13789 100644
--- a/third_party/WebKit/LayoutTests/permissionclient/script-permissions-expected.txt
+++ b/third_party/WebKit/LayoutTests/permissionclient/script-permissions-expected.txt
@@ -1,2 +1 @@
-MockContentSettingsClient: allowScriptFromSource((file test):permissionclient/resources/script.js): false
 
diff --git a/third_party/WebKit/LayoutTests/resources/js-test.js b/third_party/WebKit/LayoutTests/resources/js-test.js
index 0419bca..77b85c36 100644
--- a/third_party/WebKit/LayoutTests/resources/js-test.js
+++ b/third_party/WebKit/LayoutTests/resources/js-test.js
@@ -216,23 +216,6 @@
     else return "" + v;
 }
 
-// Stringifies a DOM object.  This function stringifies not only own properties
-// but also DOM attributes which are on a prototype chain.  Note that
-// JSON.stringify only stringifies own properties.
-function stringifyDOMObject(object)
-{
-    function deepCopy(src) {
-        if (typeof src != "object")
-            return src;
-        var dst = Array.isArray(src) ? [] : {};
-        for (var property in src) {
-            dst[property] = deepCopy(src[property]);
-        }
-        return dst;
-    }
-    return JSON.stringify(deepCopy(object));
-}
-
 function evalAndLog(_a, _quiet)
 {
   if (typeof _a != "string")
diff --git a/third_party/WebKit/LayoutTests/resources/testharness-helpers.js b/third_party/WebKit/LayoutTests/resources/testharness-helpers.js
index 12960e3..e4885727 100644
--- a/third_party/WebKit/LayoutTests/resources/testharness-helpers.js
+++ b/third_party/WebKit/LayoutTests/resources/testharness-helpers.js
@@ -31,42 +31,3 @@
       }
     });
 }
-
-// Asserts that |object| that is an instance of some interface has the attribute
-// |attribute_name| following the conditions specified by WebIDL, but it's
-// acceptable that the attribute |attribute_name| is an own property of the
-// object because we're in the middle of moving the attribute to a prototype
-// chain.  Once we complete the transition to prototype chains,
-// assert_will_be_idl_attribute must be replaced with assert_idl_attribute
-// defined in testharness.js.
-//
-// FIXME: Remove assert_will_be_idl_attribute once we complete the transition
-// of moving the DOM attributes to prototype chains.  (http://crbug.com/43394)
-function assert_will_be_idl_attribute(object, attribute_name, description) {
-  assert_true(typeof object === "object", description);
-
-  assert_true("hasOwnProperty" in object, description);
-
-  // Do not test if |attribute_name| is not an own property because
-  // |attribute_name| is in the middle of the transition to a prototype
-  // chain.  (http://crbug.com/43394)
-
-  assert_true(attribute_name in object, description);
-}
-
-// Stringifies a DOM object.  This function stringifies not only own properties
-// but also DOM attributes which are on a prototype chain.  Note that
-// JSON.stringify only stringifies own properties.
-function stringifyDOMObject(object)
-{
-    function deepCopy(src) {
-        if (typeof src != "object")
-            return src;
-        var dst = Array.isArray(src) ? [] : {};
-        for (var property in src) {
-            dst[property] = deepCopy(src[property]);
-        }
-        return dst;
-    }
-    return JSON.stringify(deepCopy(object));
-}
diff --git a/third_party/WebKit/LayoutTests/svg/css/border-image-zoomed-expected.html b/third_party/WebKit/LayoutTests/svg/css/border-image-zoomed-expected.html
deleted file mode 100644
index e54e505..0000000
--- a/third_party/WebKit/LayoutTests/svg/css/border-image-zoomed-expected.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<style>
-body { margin: 0 }
-.ref {
-    width: 80px;
-    height: 80px;
-    background-color: green
-}
-.spacer {
-    height: 80px
-}
-svg {
-    display: block
-}
-</style>
-<svg xmlns="http://www.w3.org/2000/svg" width="160" viewBox="0 0 2 2">
-    <polygon points="0,1 1,0 2,1 1,2" fill="green"/>
-</svg>
-<div class="ref"></div>
-<div class="spacer"></div>
-<div class="ref"></div>
diff --git a/third_party/WebKit/LayoutTests/svg/css/border-image-zoomed.html b/third_party/WebKit/LayoutTests/svg/css/border-image-zoomed.html
deleted file mode 100644
index 5ce86202..0000000
--- a/third_party/WebKit/LayoutTests/svg/css/border-image-zoomed.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<style>
-body {
-    margin: 0;
-    zoom: 4
-}
-div {
-    border-style: solid;
-    border-width: 20px;
-    width: 0
-}
-.t1 {
-    /* SVG paints a beveled rectangle. */
-    border-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="3" height="3"><polygon points="0,1 1,0 2,0 3,1, 3,2 2,3 1,3 0,2" fill="green"/></svg>') 1
-}
-.t2 {
-    /* SVG fills top left corner of nine piece image given a 40x40 default object size. */
-    border-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="40"><rect width="20" height="20" fill="green"/></svg>') 20;
-}
-.t3 {
-    /* SVG fills top left corner of nine piece image. */
-    border-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3 3" width="30" height="30"><rect x="0" y="0" width="1" height="1" fill="green"/></svg>') 10;
-    width: 40px;
-    height: 40px;
-    border-bottom-width: 0;
-    border-right-width: 0
-}
-</style>
-<div class="t1"></div>
-<div class="t2"></div>
-<div class="t3"></div>
diff --git a/third_party/WebKit/LayoutTests/virtual/android/media/mediadocument/resources/standalone-audio.html b/third_party/WebKit/LayoutTests/virtual/android/media/mediadocument/resources/standalone-audio.html
index 13c8802a..ca0c66ed 100644
--- a/third_party/WebKit/LayoutTests/virtual/android/media/mediadocument/resources/standalone-audio.html
+++ b/third_party/WebKit/LayoutTests/virtual/android/media/mediadocument/resources/standalone-audio.html
@@ -10,14 +10,13 @@
   margin-top: 32px;
   padding: 0 16px 0 16px;
   height: 36px;
-  background: #4285F4;
+  background: #000000;
   font-family: Roboto;
   font-size: 14px;
   border-radius: 5px;
   color: white;
-  font-weight: bold;
+  font-weight: 500;
   text-decoration:none;
-  min-width: 300px;
   line-height: 36px;
 }
 
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
index 54e8402..5abf2a6 100644
--- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -8,7 +8,6 @@
 CONSOLE WARNING: 'webkitIDBFactory' is deprecated. Please use 'IDBFactory' instead.
 CONSOLE WARNING: 'webkitIDBDatabase' is deprecated. Please use 'IDBDatabase' instead.
 CONSOLE WARNING: 'webkitIDBCursor' is deprecated. Please use 'IDBCursor' instead.
-CONSOLE ERROR: The 'WebUSB' feature is currently enabled in limited trials. Please see https://bit.ly/OriginTrials for information on enabling a trial for your site.
 CONSOLE WARNING: 'webkitURL' is deprecated. Please use 'URL' instead.
 This test documents all interface attributes and methods on the global window object and element instances.
 
@@ -413,6 +412,7 @@
     attribute @@toStringTag
     getter canvas
     getter fillStyle
+    getter filter
     getter font
     getter globalAlpha
     getter globalCompositeOperation
@@ -472,6 +472,7 @@
     method transform
     method translate
     setter fillStyle
+    setter filter
     setter font
     setter globalAlpha
     setter globalCompositeOperation
@@ -497,6 +498,7 @@
     method constructor
 interface CharacterData : Node
     attribute @@toStringTag
+    attribute @@unscopables
     getter data
     getter length
     getter nextElementSibling
@@ -727,6 +729,7 @@
     method initDeviceOrientationEvent
 interface Document : Node
     attribute @@toStringTag
+    attribute @@unscopables
     getter URL
     getter activeElement
     getter anchors
@@ -995,6 +998,7 @@
     setter xmlVersion
 interface DocumentFragment : Node
     attribute @@toStringTag
+    attribute @@unscopables
     getter childElementCount
     getter children
     getter firstElementChild
@@ -1005,6 +1009,7 @@
     method querySelectorAll
 interface DocumentType : Node
     attribute @@toStringTag
+    attribute @@unscopables
     getter name
     getter publicId
     getter systemId
@@ -1025,6 +1030,7 @@
     method constructor
 interface Element : Node
     attribute @@toStringTag
+    attribute @@unscopables
     getter attributes
     getter childElementCount
     getter children
@@ -3350,7 +3356,6 @@
     getter product
     getter productSub
     getter serviceWorker
-    getter usb
     getter userAgent
     getter vendor
     getter vendorSub
@@ -6428,18 +6433,6 @@
     setter username
 [GLOBAL OBJECT]
     attribute GCController
-    attribute USBAlternateInterface
-    attribute USBConfiguration
-    attribute USBConnectionEvent
-    attribute USBDevice
-    attribute USBEndpoint
-    attribute USBInTransferResult
-    attribute USBInterface
-    attribute USBIsochronousInTransferPacket
-    attribute USBIsochronousInTransferResult
-    attribute USBIsochronousOutTransferPacket
-    attribute USBIsochronousOutTransferResult
-    attribute USBOutTransferResult
     attribute accessibilityController
     attribute closed
     attribute console
diff --git a/third_party/WebKit/LayoutTests/webexposed/element-instance-property-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/element-instance-property-listing-expected.txt
index 5d0de9e0..d5a92af 100644
--- a/third_party/WebKit/LayoutTests/webexposed/element-instance-property-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/element-instance-property-listing-expected.txt
@@ -27,12 +27,15 @@
     property TEXT_NODE
     property accessKey
     property addEventListener
+    property after
     property animate
+    property append
     property appendChild
     property assignedSlot
     property attachShadow
     property attributes
     property baseURI
+    property before
     property blur
     property childElementCount
     property childNodes
@@ -189,6 +192,7 @@
     property parentElement
     property parentNode
     property prefix
+    property prepend
     property previousElementSibling
     property previousSibling
     property querySelector
@@ -200,6 +204,7 @@
     property removeChild
     property removeEventListener
     property replaceChild
+    property replaceWith
     property requestFullscreen
     property requestPointerLock
     property rootNode
@@ -1117,12 +1122,15 @@
     property TEXT_NODE
     property accessKey
     property addEventListener
+    property after
     property animate
+    property append
     property appendChild
     property assignedSlot
     property attachShadow
     property attributes
     property baseURI
+    property before
     property blur
     property childElementCount
     property childNodes
@@ -1279,6 +1287,7 @@
     property parentElement
     property parentNode
     property prefix
+    property prepend
     property previousElementSibling
     property previousSibling
     property querySelector
@@ -1290,6 +1299,7 @@
     property removeChild
     property removeEventListener
     property replaceChild
+    property replaceWith
     property requestFullscreen
     property requestPointerLock
     property rootNode
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt
index 275f98e6..68d5c050 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -532,6 +532,7 @@
 [Worker]     method createLinearGradient
 [Worker]     method createPattern
 [Worker]     method createRadialGradient
+[Worker]     method drawImage
 [Worker]     method ellipse
 [Worker]     method fill
 [Worker]     method fillRect
@@ -669,7 +670,7 @@
 [Worker]     attribute @@toStringTag
 [Worker]     method constructor
 [Worker]     method estimate
-[Worker]     method persistentPermission
+[Worker]     method persisted
 [Worker] interface SubtleCrypto
 [Worker]     attribute @@toStringTag
 [Worker]     method constructor
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
index 56811251..c9e8cff 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -339,17 +339,12 @@
 interface BluetoothDevice : EventTarget
     attribute @@toStringTag
     getter adData
-    getter deviceClass
     getter gatt
     getter id
     getter instanceID
     getter name
     getter ongattserverdisconnected
-    getter productID
-    getter productVersion
     getter uuids
-    getter vendorID
-    getter vendorIDSource
     method connectGATT
     method constructor
     setter ongattserverdisconnected
@@ -664,16 +659,20 @@
     method constructor
 interface CharacterData : Node
     attribute @@toStringTag
+    attribute @@unscopables
     getter data
     getter length
     getter nextElementSibling
     getter previousElementSibling
+    method after
     method appendData
+    method before
     method constructor
     method deleteData
     method insertData
     method remove
     method replaceData
+    method replaceWith
     method substringData
     setter data
 interface CircularGeofencingRegion : GeofencingRegion
@@ -1062,6 +1061,7 @@
     method initDeviceOrientationEvent
 interface Document : Node
     attribute @@toStringTag
+    attribute @@unscopables
     getter URL
     getter activeElement
     getter addressSpace
@@ -1207,6 +1207,7 @@
     getter xmlStandalone
     getter xmlVersion
     method adoptNode
+    method append
     method caretRangeFromPoint
     method close
     method constructor
@@ -1242,6 +1243,7 @@
     method hasFocus
     method importNode
     method open
+    method prepend
     method queryCommandEnabled
     method queryCommandIndeterm
     method queryCommandState
@@ -1349,21 +1351,28 @@
     setter xmlVersion
 interface DocumentFragment : Node
     attribute @@toStringTag
+    attribute @@unscopables
     getter childElementCount
     getter children
     getter firstElementChild
     getter lastElementChild
+    method append
     method constructor
     method getElementById
+    method prepend
     method querySelector
     method querySelectorAll
 interface DocumentType : Node
     attribute @@toStringTag
+    attribute @@unscopables
     getter name
     getter publicId
     getter systemId
+    method after
+    method before
     method constructor
     method remove
+    method replaceWith
 interface DragEvent : MouseEvent
     attribute @@toStringTag
     getter dataTransfer
@@ -1379,6 +1388,7 @@
     method constructor
 interface Element : Node
     attribute @@toStringTag
+    attribute @@unscopables
     getter assignedSlot
     getter attributes
     getter childElementCount
@@ -1419,8 +1429,11 @@
     getter shadowRoot
     getter slot
     getter tagName
+    method after
     method animate
+    method append
     method attachShadow
+    method before
     method closest
     method constructor
     method createShadowRoot
@@ -1442,12 +1455,14 @@
     method insertAdjacentHTML
     method insertAdjacentText
     method matches
+    method prepend
     method querySelector
     method querySelectorAll
     method remove
     method removeAttribute
     method removeAttributeNS
     method removeAttributeNode
+    method replaceWith
     method requestFullscreen
     method requestPointerLock
     method scroll
@@ -3384,6 +3399,7 @@
     getter videoStreamTrack
     method constructor
     method grabFrame
+    method takePhoto
 interface ImageData
     attribute @@toStringTag
     getter height
@@ -5877,8 +5893,8 @@
     attribute @@toStringTag
     method constructor
     method estimate
-    method persistentPermission
-    method requestPersistent
+    method persist
+    method persisted
 interface Stream
     attribute @@toStringTag
     getter type
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt
index 4154fc2..c3baeac7 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -519,6 +519,7 @@
 [Worker]     method createLinearGradient
 [Worker]     method createPattern
 [Worker]     method createRadialGradient
+[Worker]     method drawImage
 [Worker]     method ellipse
 [Worker]     method fill
 [Worker]     method fillRect
@@ -661,7 +662,7 @@
 [Worker]     attribute @@toStringTag
 [Worker]     method constructor
 [Worker]     method estimate
-[Worker]     method persistentPermission
+[Worker]     method persisted
 [Worker] interface SubtleCrypto
 [Worker]     attribute @@toStringTag
 [Worker]     method constructor
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptController.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptController.cpp
index 7470f70..c70d1df 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptController.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptController.cpp
@@ -421,7 +421,7 @@
         v8::Local<v8::Value> evaluationResult = executeScriptAndReturnValue(scriptState->context(), sources[i]);
         if (evaluationResult.IsEmpty())
             evaluationResult = v8::Local<v8::Value>::New(isolate(), v8::Undefined(isolate()));
-        if (!v8CallBoolean(resultArray->Set(scriptState->context(), v8::Integer::New(scriptState->isolate(), i), evaluationResult)))
+        if (!v8CallBoolean(resultArray->CreateDataProperty(scriptState->context(), i, evaluationResult)))
             return;
     }
 
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptPromise.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptPromise.cpp
index cbfff36..35322d3e 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptPromise.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptPromise.cpp
@@ -127,8 +127,10 @@
             return;
 
         v8::Local<v8::Array> values = v8::Array::New(value.isolate(), m_values.size());
-        for (size_t i = 0; i < m_values.size(); ++i)
-            values->Set(i, m_values[i].v8Value());
+        for (size_t i = 0; i < m_values.size(); ++i) {
+            if (!v8CallBoolean(values->CreateDataProperty(value.context(), i, m_values[i].v8Value())))
+                return;
+        }
 
         markPromiseSettled();
         m_resolver.resolve(values);
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8Binding.cpp b/third_party/WebKit/Source/bindings/core/v8/V8Binding.cpp
index a2a5278..44f8a1e7 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8Binding.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/V8Binding.cpp
@@ -862,7 +862,7 @@
     }
 
     v8::Local<v8::Array> array = v8::Local<v8::Array>::Cast(arrayValue);
-    return v8CallBoolean(array->Set(isolate->GetCurrentContext(), v8::Integer::New(isolate, array->Length()), value));
+    return v8CallBoolean(array->CreateDataProperty(isolate->GetCurrentContext(), array->Length(), value));
 }
 
 void removeHiddenValueFromArray(v8::Isolate* isolate, v8::Local<v8::Object> object, v8::Local<v8::Value> value, int arrayIndex)
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8Binding.h b/third_party/WebKit/Source/bindings/core/v8/V8Binding.h
index 5076928c..599bc73 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8Binding.h
+++ b/third_party/WebKit/Source/bindings/core/v8/V8Binding.h
@@ -884,9 +884,10 @@
     Collection* collection = toScriptWrappable(info.Holder())->toImpl<Collection>();
     int length = collection->length();
     v8::Local<v8::Array> properties = v8::Array::New(info.GetIsolate(), length);
+    v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext();
     for (int i = 0; i < length; ++i) {
         v8::Local<v8::Integer> integer = v8::Integer::New(info.GetIsolate(), i);
-        if (!v8CallBoolean(properties->Set(info.GetIsolate()->GetCurrentContext(), integer, integer)))
+        if (!v8CallBoolean(properties->CreateDataProperty(context, i, integer)))
             return;
     }
     v8SetReturnValue(info, properties);
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8EventListener.cpp b/third_party/WebKit/Source/bindings/core/v8/V8EventListener.cpp
index 95c22fbd..0178608 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8EventListener.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/V8EventListener.cpp
@@ -86,7 +86,8 @@
     if (!frame)
         return v8::Local<v8::Value>();
 
-    if (!frame->script().canExecuteScripts(AboutToExecuteScript))
+    // TODO(jochen): Consider moving this check into canExecuteScripts. http://crbug.com/608641
+    if (scriptState->world().isMainWorld() && !frame->script().canExecuteScripts(AboutToExecuteScript))
         return v8::Local<v8::Value>();
 
     v8::Local<v8::Value> parameters[1] = { jsEvent };
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8IteratorResultValue.cpp b/third_party/WebKit/Source/bindings/core/v8/V8IteratorResultValue.cpp
index 9cd4063..8ac33c2 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8IteratorResultValue.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/V8IteratorResultValue.cpp
@@ -11,8 +11,8 @@
     v8::Local<v8::Object> result = v8::Object::New(isolate);
     if (value.IsEmpty())
         value = v8::Undefined(isolate);
-    if (!v8CallBoolean(result->Set(isolate->GetCurrentContext(), v8String(isolate, "done"), v8Boolean(done, isolate)))
-        || !v8CallBoolean(result->Set(isolate->GetCurrentContext(), v8String(isolate, "value"), value)))
+    if (!v8CallBoolean(result->CreateDataProperty(isolate->GetCurrentContext(), v8String(isolate, "done"), v8Boolean(done, isolate)))
+        || !v8CallBoolean(result->CreateDataProperty(isolate->GetCurrentContext(), v8String(isolate, "value"), value)))
         return v8::Local<v8::Object>();
     return result;
 }
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8LazyEventListener.cpp b/third_party/WebKit/Source/bindings/core/v8/V8LazyEventListener.cpp
index 967857f..19c775d92 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8LazyEventListener.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/V8LazyEventListener.cpp
@@ -188,7 +188,7 @@
         return;
     String toStringString = "function " + m_functionName + "(" + m_eventParameterName + ") {\n  " + m_code + "\n}";
     V8HiddenValue::setHiddenValue(scriptState, wrappedFunction, V8HiddenValue::toStringString(isolate()), v8String(isolate(), toStringString));
-    if (!v8CallBoolean(wrappedFunction->Set(scriptState->context(), v8AtomicString(isolate(), "toString"), toStringFunction)))
+    if (!v8CallBoolean(wrappedFunction->CreateDataProperty(scriptState->context(), v8AtomicString(isolate(), "toString"), toStringFunction)))
         return;
     wrappedFunction->SetName(v8String(isolate(), m_functionName));
 
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8PerIsolateData.cpp b/third_party/WebKit/Source/bindings/core/v8/V8PerIsolateData.cpp
index ba7f6884..39e86ef 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8PerIsolateData.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/V8PerIsolateData.cpp
@@ -76,7 +76,6 @@
 
 v8::Isolate* V8PerIsolateData::mainThreadIsolate()
 {
-    ASSERT(isMainThread());
     ASSERT(mainThreadPerIsolateData);
     return mainThreadPerIsolateData->isolate();
 }
diff --git a/third_party/WebKit/Source/bindings/core/v8/custom/V8CSSStyleDeclarationCustom.cpp b/third_party/WebKit/Source/bindings/core/v8/custom/V8CSSStyleDeclarationCustom.cpp
index 1d4feea..a7d34989 100644
--- a/third_party/WebKit/Source/bindings/core/v8/custom/V8CSSStyleDeclarationCustom.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/custom/V8CSSStyleDeclarationCustom.cpp
@@ -166,8 +166,7 @@
     for (unsigned i = 0; i < propertyNamesLength; ++i) {
         String key = propertyNames.at(i);
         ASSERT(!key.isNull());
-        v8::Local<v8::Integer> index = v8::Integer::New(info.GetIsolate(), i);
-        if (!v8CallBoolean(properties->Set(context, index, v8String(info.GetIsolate(), key))))
+        if (!v8CallBoolean(properties->CreateDataProperty(context, i, v8String(info.GetIsolate(), key))))
             return;
     }
 
diff --git a/third_party/WebKit/Source/bindings/modules/v8/WebGLAny.cpp b/third_party/WebKit/Source/bindings/modules/v8/WebGLAny.cpp
index c6f7b147..1ff2ed0 100644
--- a/third_party/WebKit/Source/bindings/modules/v8/WebGLAny.cpp
+++ b/third_party/WebKit/Source/bindings/modules/v8/WebGLAny.cpp
@@ -18,7 +18,7 @@
 {
     v8::Local<v8::Array> array = v8::Array::New(scriptState->isolate(), size);
     for (size_t i = 0; i < size; ++i) {
-        if (!v8CallBoolean(array->Set(scriptState->context(), v8::Integer::New(scriptState->isolate(), i), v8Boolean(value[i], scriptState->isolate()))))
+        if (!v8CallBoolean(array->CreateDataProperty(scriptState->context(), i, v8Boolean(value[i], scriptState->isolate()))))
             return ScriptValue();
     }
     return ScriptValue(scriptState, array);
@@ -29,7 +29,7 @@
     size_t size = value.size();
     v8::Local<v8::Array> array = v8::Array::New(scriptState->isolate(), size);
     for (size_t i = 0; i < size; ++i) {
-        if (!v8CallBoolean(array->Set(scriptState->context(), v8::Integer::New(scriptState->isolate(), i), v8Boolean(value[i], scriptState->isolate()))))
+        if (!v8CallBoolean(array->CreateDataProperty(scriptState->context(), i, v8Boolean(value[i], scriptState->isolate()))))
             return ScriptValue();
     }
     return ScriptValue(scriptState, array);
diff --git a/third_party/WebKit/Source/bindings/templates/interface.cpp b/third_party/WebKit/Source/bindings/templates/interface.cpp
index cf9e196..ad9255a8 100644
--- a/third_party/WebKit/Source/bindings/templates/interface.cpp
+++ b/third_party/WebKit/Source/bindings/templates/interface.cpp
@@ -396,7 +396,7 @@
         return;
     v8::Local<v8::Array> v8names = v8::Array::New(info.GetIsolate(), names.size());
     for (size_t i = 0; i < names.size(); ++i) {
-        if (!v8CallBoolean(v8names->Set(info.GetIsolate()->GetCurrentContext(), v8::Integer::New(info.GetIsolate(), i), v8String(info.GetIsolate(), names[i]))))
+        if (!v8CallBoolean(v8names->CreateDataProperty(info.GetIsolate()->GetCurrentContext(), i, v8String(info.GetIsolate(), names[i]))))
             return;
     }
     v8SetReturnValue(info, v8names);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp
index 70693ce..84e8dfd 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp
@@ -1954,7 +1954,7 @@
         return;
     v8::Local<v8::Array> v8names = v8::Array::New(info.GetIsolate(), names.size());
     for (size_t i = 0; i < names.size(); ++i) {
-        if (!v8CallBoolean(v8names->Set(info.GetIsolate()->GetCurrentContext(), v8::Integer::New(info.GetIsolate(), i), v8String(info.GetIsolate(), names[i]))))
+        if (!v8CallBoolean(v8names->CreateDataProperty(info.GetIsolate()->GetCurrentContext(), i, v8String(info.GetIsolate(), names[i]))))
             return;
     }
     v8SetReturnValue(info, v8names);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface2.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface2.cpp
index 31915452..5f4f3e4 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface2.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface2.cpp
@@ -541,7 +541,7 @@
         return;
     v8::Local<v8::Array> v8names = v8::Array::New(info.GetIsolate(), names.size());
     for (size_t i = 0; i < names.size(); ++i) {
-        if (!v8CallBoolean(v8names->Set(info.GetIsolate()->GetCurrentContext(), v8::Integer::New(info.GetIsolate(), i), v8String(info.GetIsolate(), names[i]))))
+        if (!v8CallBoolean(v8names->CreateDataProperty(info.GetIsolate()->GetCurrentContext(), i, v8String(info.GetIsolate(), names[i]))))
             return;
     }
     v8SetReturnValue(info, v8names);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp
index 4ed419b8..77d03b01 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp
@@ -11443,7 +11443,7 @@
         return;
     v8::Local<v8::Array> v8names = v8::Array::New(info.GetIsolate(), names.size());
     for (size_t i = 0; i < names.size(); ++i) {
-        if (!v8CallBoolean(v8names->Set(info.GetIsolate()->GetCurrentContext(), v8::Integer::New(info.GetIsolate(), i), v8String(info.GetIsolate(), names[i]))))
+        if (!v8CallBoolean(v8names->CreateDataProperty(info.GetIsolate()->GetCurrentContext(), i, v8String(info.GetIsolate(), names[i]))))
             return;
     }
     v8SetReturnValue(info, v8names);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperations.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperations.cpp
index 4b7ec2a..e9f59b5 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperations.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperations.cpp
@@ -133,7 +133,7 @@
         return;
     v8::Local<v8::Array> v8names = v8::Array::New(info.GetIsolate(), names.size());
     for (size_t i = 0; i < names.size(); ++i) {
-        if (!v8CallBoolean(v8names->Set(info.GetIsolate()->GetCurrentContext(), v8::Integer::New(info.GetIsolate(), i), v8String(info.GetIsolate(), names[i]))))
+        if (!v8CallBoolean(v8names->CreateDataProperty(info.GetIsolate()->GetCurrentContext(), i, v8String(info.GetIsolate(), names[i]))))
             return;
     }
     v8SetReturnValue(info, v8names);
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp
index 58cd1b9..908e53f 100644
--- a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp
@@ -758,7 +758,7 @@
         return;
     v8::Local<v8::Array> v8names = v8::Array::New(info.GetIsolate(), names.size());
     for (size_t i = 0; i < names.size(); ++i) {
-        if (!v8CallBoolean(v8names->Set(info.GetIsolate()->GetCurrentContext(), v8::Integer::New(info.GetIsolate(), i), v8String(info.GetIsolate(), names[i]))))
+        if (!v8CallBoolean(v8names->CreateDataProperty(info.GetIsolate()->GetCurrentContext(), i, v8String(info.GetIsolate(), names[i]))))
             return;
     }
     v8SetReturnValue(info, v8names);
diff --git a/third_party/WebKit/Source/core/animation/Animation.idl b/third_party/WebKit/Source/core/animation/Animation.idl
index 00515cce..d5faea48 100644
--- a/third_party/WebKit/Source/core/animation/Animation.idl
+++ b/third_party/WebKit/Source/core/animation/Animation.idl
@@ -37,8 +37,7 @@
     DependentLifetime,
     NoInterfaceObject,
 ] interface Animation : EventTarget {
-    // TODO(alancutter): Make the timeline attribute mutable.
-    [RuntimeEnabled=WebAnimationsAPI] readonly attribute AnimationTimeline? timeline;
+    // TODO(dstockwell): Add timeline property.
     [RuntimeEnabled=WebAnimationsAPI] attribute AnimationEffectReadOnly? effect;
     [Measure] attribute double?    startTime;
     [Measure] attribute double?    currentTime;
diff --git a/third_party/WebKit/Source/core/core.gypi b/third_party/WebKit/Source/core/core.gypi
index 5f3cd06..5e623efe 100644
--- a/third_party/WebKit/Source/core/core.gypi
+++ b/third_party/WebKit/Source/core/core.gypi
@@ -2796,6 +2796,8 @@
             'input/PointerEventManager.h',
             'input/TouchActionUtil.cpp',
             'input/TouchActionUtil.h',
+            'input/TouchEventManager.cpp',
+            'input/TouchEventManager.h',
         ],
         'webcore_html_files': [
             'html/AutoplayExperimentHelper.cpp',
@@ -3204,6 +3206,8 @@
             'html/parser/XSSAuditor.h',
             'html/parser/XSSAuditorDelegate.cpp',
             'html/parser/XSSAuditorDelegate.h',
+            'html/shadow/AppearanceSwitchElement.cpp',
+            'html/shadow/AppearanceSwitchElement.h',
             'html/shadow/ClearButtonElement.cpp',
             'html/shadow/ClearButtonElement.h',
             'html/shadow/DateTimeEditElement.cpp',
@@ -3348,6 +3352,7 @@
             'layout/svg/LayoutSVGTSpan.h',
             'layout/svg/LayoutSVGViewportContainer.cpp',
             'layout/svg/LayoutSVGViewportContainer.h',
+            'layout/svg/SVGCharacterData.h',
             'layout/svg/SVGLayoutSupport.cpp',
             'layout/svg/SVGLayoutSupport.h',
             'layout/svg/SVGLayoutTreeAsText.cpp',
@@ -3361,8 +3366,6 @@
             'layout/svg/SVGTextChunkBuilder.cpp',
             'layout/svg/SVGTextChunkBuilder.h',
             'layout/svg/SVGTextFragment.h',
-            'layout/svg/SVGTextLayoutAttributes.cpp',
-            'layout/svg/SVGTextLayoutAttributes.h',
             'layout/svg/SVGTextLayoutAttributesBuilder.cpp',
             'layout/svg/SVGTextLayoutAttributesBuilder.h',
             'layout/svg/SVGTextLayoutEngine.cpp',
@@ -4039,6 +4042,7 @@
             'html/HTMLVideoElementTest.cpp',
             'html/LinkRelAttributeTest.cpp',
             'html/TimeRangesTest.cpp',
+            'html/canvas/CanvasAsyncBlobCreatorTest.cpp',
             'html/canvas/CanvasFontCacheTest.cpp',
             'html/forms/EmailInputTypeTest.cpp',
             'html/forms/FileInputTypeTest.cpp',
diff --git a/third_party/WebKit/Source/core/css/CSSComputedStyleDeclaration.cpp b/third_party/WebKit/Source/core/css/CSSComputedStyleDeclaration.cpp
index f45c33f..bc79235b 100644
--- a/third_party/WebKit/Source/core/css/CSSComputedStyleDeclaration.cpp
+++ b/third_party/WebKit/Source/core/css/CSSComputedStyleDeclaration.cpp
@@ -514,6 +514,12 @@
 
 CSSValue* CSSComputedStyleDeclaration::getPropertyCSSValue(AtomicString customPropertyName) const
 {
+    Node* styledNode = this->styledNode();
+    if (!styledNode)
+        return nullptr;
+
+    styledNode->document().updateLayoutTreeForNode(styledNode);
+
     const ComputedStyle* style = computeComputedStyle();
     if (!style)
         return nullptr;
@@ -533,19 +539,16 @@
     Node* styledNode = this->styledNode();
     if (!styledNode)
         return nullptr;
-    LayoutObject* layoutObject = styledNode->layoutObject();
-    const ComputedStyle* style;
 
     Document& document = styledNode->document();
-
     document.updateLayoutTreeForNode(styledNode);
 
     // The style recalc could have caused the styled node to be discarded or replaced
     // if it was a PseudoElement so we need to update it.
     styledNode = this->styledNode();
-    layoutObject = styledNode->layoutObject();
+    LayoutObject* layoutObject = styledNode->layoutObject();
 
-    style = computeComputedStyle();
+    const ComputedStyle* style = computeComputedStyle();
 
     bool forceFullLayout = isLayoutDependent(propertyID, style, layoutObject)
         || styledNode->isInShadowTree()
diff --git a/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h b/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
index 1bf59111..cfe438c 100644
--- a/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
+++ b/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
@@ -3372,38 +3372,6 @@
     return FontStretchNormal;
 }
 
-template<> inline CSSPrimitiveValue::CSSPrimitiveValue(FontVariant smallCaps)
-    : CSSValue(PrimitiveClass)
-{
-    init(UnitType::ValueID);
-    switch (smallCaps) {
-    case FontVariantNormal:
-        m_value.valueID = CSSValueNormal;
-        return;
-    case FontVariantSmallCaps:
-        m_value.valueID = CSSValueSmallCaps;
-        return;
-    }
-
-    ASSERT_NOT_REACHED();
-    m_value.valueID = CSSValueNormal;
-}
-
-template<> inline FontVariant CSSPrimitiveValue::convertTo() const
-{
-    ASSERT(isValueID());
-    switch (m_value.valueID) {
-    case CSSValueSmallCaps:
-        return FontVariantSmallCaps;
-    case CSSValueNormal:
-        return FontVariantNormal;
-    default:
-        break;
-    }
-    ASSERT_NOT_REACHED();
-    return FontVariantNormal;
-}
-
 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextRenderingMode e)
     : CSSValue(PrimitiveClass)
 {
diff --git a/third_party/WebKit/Source/core/css/CSSProperties.in b/third_party/WebKit/Source/core/css/CSSProperties.in
index 650e214..a2fc94b 100644
--- a/third_party/WebKit/Source/core/css/CSSProperties.in
+++ b/third_party/WebKit/Source/core/css/CSSProperties.in
@@ -101,7 +101,6 @@
 font-size-adjust runtime_flag=CSSFontSizeAdjust, interpolable, inherited, font, name_for_methods=SizeAdjust, converter=convertFontSizeAdjust
 font-stretch inherited, font, type_name=FontStretch, name_for_methods=Stretch
 font-style inherited, font, type_name=FontStyle, name_for_methods=Style
-font-variant inherited, font, type_name=FontVariant, name_for_methods=Variant
 font-variant-ligatures inherited, font, type_name=VariantLigatures, name_for_methods=VariantLigatures, converter=convertFontVariantLigatures
 font-variant-caps inherited, font, name_for_methods=VariantCaps, converter=convertFontVariantCaps
 font-weight interpolable, inherited, font, type_name=FontWeight, name_for_methods=Weight, converter=convertFontWeight
@@ -473,7 +472,8 @@
 border-width longhands=border-top-width;border-right-width;border-bottom-width;border-left-width
 flex longhands=flex-grow;flex-shrink;flex-basis
 flex-flow longhands=flex-direction;flex-wrap
-font longhands=font-style;font-variant;font-weight;font-stretch;font-size;line-height;font-family
+font longhands=font-style;font-variant-caps;font-variant-ligatures;font-weight;font-stretch;font-size;line-height;font-family
+font-variant longhands=font-variant-ligatures;font-variant-caps
 grid runtime_flag=CSSGridLayout, longhands=grid-template-rows;grid-template-columns;grid-template-areas;grid-auto-flow;grid-auto-rows;grid-auto-columns;grid-column-gap;grid-row-gap
 grid-area runtime_flag=CSSGridLayout, longhands=grid-row-start;grid-column-start;grid-row-end;grid-column-end
 grid-column runtime_flag=CSSGridLayout, longhands=grid-column-start;grid-column-end
diff --git a/third_party/WebKit/Source/core/css/CSSStyleSheetResourceTest.cpp b/third_party/WebKit/Source/core/css/CSSStyleSheetResourceTest.cpp
index 8ee2ea5..439cf17 100644
--- a/third_party/WebKit/Source/core/css/CSSStyleSheetResourceTest.cpp
+++ b/third_party/WebKit/Source/core/css/CSSStyleSheetResourceTest.cpp
@@ -134,7 +134,8 @@
     cssResource->responseReceived(ResourceResponse(cssURL, "style/css", 0, nullAtom, String()), nullptr);
     cssResource->finish();
 
-    StyleSheetContents* contents = StyleSheetContents::create(CSSParserContext(HTMLStandardMode, nullptr));
+    CSSParserContext parserContext(HTMLStandardMode, nullptr);
+    StyleSheetContents* contents = StyleSheetContents::create(parserContext);
     CSSStyleSheet* sheet = CSSStyleSheet::create(contents, document());
     EXPECT_TRUE(sheet);
 
@@ -144,9 +145,10 @@
     // Verify that the cache will have a mapping for |imageResource| at |url|.
     // The underlying |contents| for the stylesheet resource must have a
     // matching cache status.
-    ASSERT_TRUE(memoryCache()->contains(imageResource));
-    ASSERT_FALSE(memoryCache()->contains(cssResource));
-    ASSERT_FALSE(contents->isInMemoryCache());
+    EXPECT_TRUE(memoryCache()->contains(imageResource));
+    EXPECT_FALSE(memoryCache()->contains(cssResource));
+    EXPECT_FALSE(contents->isInMemoryCache());
+    EXPECT_FALSE(cssResource->restoreParsedStyleSheet(parserContext));
 }
 
 } // namespace
diff --git a/third_party/WebKit/Source/core/css/CSSValueKeywords.in b/third_party/WebKit/Source/core/css/CSSValueKeywords.in
index 9e7e9bd8..99bb7416 100644
--- a/third_party/WebKit/Source/core/css/CSSValueKeywords.in
+++ b/third_party/WebKit/Source/core/css/CSSValueKeywords.in
@@ -48,12 +48,6 @@
 // The following is only allowed in @font-face:
 all
 
-//
-// font-variant
-//
-//normal
-small-caps
-
 // font-variant-ligatures:
 //
 // normal
diff --git a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
index 3fa99f4..88e679a 100644
--- a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
+++ b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
@@ -472,6 +472,59 @@
     return list;
 }
 
+static CSSValue* expandNoneLigaturesValue()
+{
+    CSSValueList* list = CSSValueList::createSpaceSeparated();
+    list->append(cssValuePool().createIdentifierValue(CSSValueNoCommonLigatures));
+    list->append(cssValuePool().createIdentifierValue(CSSValueNoDiscretionaryLigatures));
+    list->append(cssValuePool().createIdentifierValue(CSSValueNoHistoricalLigatures));
+    list->append(cssValuePool().createIdentifierValue(CSSValueNoContextual));
+    return list;
+}
+
+static CSSValue* valuesForFontVariantProperty(const ComputedStyle& style, const LayoutObject* layoutObject, Node* styledNode, bool allowVisitedStyle)
+{
+    enum VariantShorthandCases { AllNormal, NoneLigatures, ConcatenateNonNormal };
+    VariantShorthandCases shorthandCase = AllNormal;
+    for (size_t i = 0; i < fontVariantShorthand().length(); ++i) {
+        CSSValue* value = ComputedStyleCSSValueMapping::get(fontVariantShorthand().properties()[i], style, layoutObject, styledNode, allowVisitedStyle);
+
+        if (shorthandCase == AllNormal
+            && value->isPrimitiveValue()
+            && toCSSPrimitiveValue(value)->getValueID() == CSSValueNone
+            && fontVariantShorthand().properties()[i] == CSSPropertyFontVariantLigatures) {
+            shorthandCase = NoneLigatures;
+        } else if (!(value->isPrimitiveValue() && toCSSPrimitiveValue(value)->getValueID() == CSSValueNormal)) {
+            shorthandCase = ConcatenateNonNormal;
+            break;
+        }
+    }
+
+    switch (shorthandCase) {
+    case AllNormal:
+        return cssValuePool().createIdentifierValue(CSSValueNormal);
+    case NoneLigatures:
+        return cssValuePool().createIdentifierValue(CSSValueNone);
+    case ConcatenateNonNormal:
+        {
+        CSSValueList* list = CSSValueList::createSpaceSeparated();
+        for (size_t i = 0; i < fontVariantShorthand().length(); ++i) {
+            CSSValue* value = ComputedStyleCSSValueMapping::get(fontVariantShorthand().properties()[i], style, layoutObject, styledNode, allowVisitedStyle);
+            ASSERT(value);
+            if (value->isPrimitiveValue() && toCSSPrimitiveValue(value)->getValueID() == CSSValueNone) {
+                list->append(expandNoneLigaturesValue());
+            } else if (!(value->isPrimitiveValue() && toCSSPrimitiveValue(value)->getValueID() == CSSValueNormal)) {
+                list->append(value);
+            }
+        }
+        return list;
+        }
+    default:
+        NOTREACHED();
+        return nullptr;
+    }
+}
+
 static CSSValueList* valuesForBackgroundShorthand(const ComputedStyle& style, const LayoutObject* layoutObject, Node* styledNode, bool allowVisitedStyle)
 {
     CSSValueList* ret = CSSValueList::createCommaSeparated();
@@ -570,16 +623,61 @@
     return cssValuePool().createValue(style.getFontDescription().style());
 }
 
-static CSSPrimitiveValue* valueForFontVariant(const ComputedStyle& style)
-{
-    return cssValuePool().createValue(style.getFontDescription().variant());
-}
-
 static CSSPrimitiveValue* valueForFontWeight(const ComputedStyle& style)
 {
     return cssValuePool().createValue(style.getFontDescription().weight());
 }
 
+static CSSPrimitiveValue* valueForFontVariantCaps(const ComputedStyle& style)
+{
+    FontDescription::FontVariantCaps variantCaps = style.getFontDescription().variantCaps();
+    switch (variantCaps) {
+    case FontDescription::CapsNormal:
+        return cssValuePool().createIdentifierValue(CSSValueNormal);
+    case FontDescription::SmallCaps:
+        return cssValuePool().createIdentifierValue(CSSValueSmallCaps);
+    case FontDescription::AllSmallCaps:
+        return cssValuePool().createIdentifierValue(CSSValueAllSmallCaps);
+    case FontDescription::PetiteCaps:
+        return cssValuePool().createIdentifierValue(CSSValuePetiteCaps);
+    case FontDescription::AllPetiteCaps:
+        return cssValuePool().createIdentifierValue(CSSValueAllPetiteCaps);
+    case FontDescription::Unicase:
+        return cssValuePool().createIdentifierValue(CSSValueUnicase);
+    case FontDescription::TitlingCaps:
+        return cssValuePool().createIdentifierValue(CSSValueTitlingCaps);
+    default:
+        NOTREACHED();
+        return nullptr;
+    }
+}
+
+static CSSValue* valueForFontVariantLigatures(const ComputedStyle& style)
+{
+    FontDescription::LigaturesState commonLigaturesState = style.getFontDescription().commonLigaturesState();
+    FontDescription::LigaturesState discretionaryLigaturesState = style.getFontDescription().discretionaryLigaturesState();
+    FontDescription::LigaturesState historicalLigaturesState = style.getFontDescription().historicalLigaturesState();
+    FontDescription::LigaturesState contextualLigaturesState = style.getFontDescription().contextualLigaturesState();
+    if (commonLigaturesState == FontDescription::NormalLigaturesState && discretionaryLigaturesState == FontDescription::NormalLigaturesState
+        && historicalLigaturesState == FontDescription::NormalLigaturesState && contextualLigaturesState == FontDescription::NormalLigaturesState)
+        return cssValuePool().createIdentifierValue(CSSValueNormal);
+
+    if (commonLigaturesState == FontDescription::DisabledLigaturesState && discretionaryLigaturesState == FontDescription::DisabledLigaturesState
+        && historicalLigaturesState == FontDescription::DisabledLigaturesState && contextualLigaturesState == FontDescription::DisabledLigaturesState)
+        return cssValuePool().createIdentifierValue(CSSValueNone);
+
+    CSSValueList* valueList = CSSValueList::createSpaceSeparated();
+    if (commonLigaturesState != FontDescription::NormalLigaturesState)
+        valueList->append(cssValuePool().createIdentifierValue(commonLigaturesState == FontDescription::DisabledLigaturesState ? CSSValueNoCommonLigatures : CSSValueCommonLigatures));
+    if (discretionaryLigaturesState != FontDescription::NormalLigaturesState)
+        valueList->append(cssValuePool().createIdentifierValue(discretionaryLigaturesState == FontDescription::DisabledLigaturesState ? CSSValueNoDiscretionaryLigatures : CSSValueDiscretionaryLigatures));
+    if (historicalLigaturesState != FontDescription::NormalLigaturesState)
+        valueList->append(cssValuePool().createIdentifierValue(historicalLigaturesState == FontDescription::DisabledLigaturesState ? CSSValueNoHistoricalLigatures : CSSValueHistoricalLigatures));
+    if (contextualLigaturesState != FontDescription::NormalLigaturesState)
+        valueList->append(cssValuePool().createIdentifierValue(contextualLigaturesState == FontDescription::DisabledLigaturesState ? CSSValueNoContextual : CSSValueContextual));
+    return valueList;
+}
+
 static CSSValue* specifiedValueForGridTrackBreadth(const GridLength& trackBreadth, const ComputedStyle& style)
 {
     if (!trackBreadth.isLength())
@@ -1337,7 +1435,18 @@
 
     CSSValueList* list = CSSValueList::createSpaceSeparated();
     list->append(valueForFontStyle(style));
-    list->append(valueForFontVariant(style));
+
+    // Check that non-initial font-variant subproperties are not conflicting with this serialization.
+    CSSValue* ligaturesValue = valueForFontVariantLigatures(style);
+    if (!ligaturesValue->equals(*cssValuePool().createIdentifierValue(CSSValueNormal)))
+        return nullptr;
+
+    CSSPrimitiveValue* capsValue = valueForFontVariantCaps(style);
+    if (!capsValue->equals(*cssValuePool().createIdentifierValue(CSSValueNormal))
+        && !capsValue->equals(*cssValuePool().createIdentifierValue(CSSValueSmallCaps)))
+        return nullptr;
+    list->append(capsValue);
+
     list->append(valueForFontWeight(style));
     list->append(valueForFontStretch(style));
     list->append(sizeAndLineHeight);
@@ -1716,7 +1825,7 @@
     case CSSPropertyFontStyle:
         return valueForFontStyle(style);
     case CSSPropertyFontVariant:
-        return valueForFontVariant(style);
+        return valuesForFontVariantProperty(style, layoutObject, styledNode, allowVisitedStyle);
     case CSSPropertyFontWeight:
         return valueForFontWeight(style);
     case CSSPropertyFontFeatureSettings: {
@@ -2149,45 +2258,10 @@
         return cssValuePool().createValue(style.getFontDescription().getKerning());
     case CSSPropertyWebkitFontSmoothing:
         return cssValuePool().createValue(style.getFontDescription().fontSmoothing());
-    case CSSPropertyFontVariantLigatures: {
-        FontDescription::LigaturesState commonLigaturesState = style.getFontDescription().commonLigaturesState();
-        FontDescription::LigaturesState discretionaryLigaturesState = style.getFontDescription().discretionaryLigaturesState();
-        FontDescription::LigaturesState historicalLigaturesState = style.getFontDescription().historicalLigaturesState();
-        FontDescription::LigaturesState contextualLigaturesState = style.getFontDescription().contextualLigaturesState();
-        if (commonLigaturesState == FontDescription::NormalLigaturesState && discretionaryLigaturesState == FontDescription::NormalLigaturesState
-            && historicalLigaturesState == FontDescription::NormalLigaturesState && contextualLigaturesState == FontDescription::NormalLigaturesState)
-            return cssValuePool().createIdentifierValue(CSSValueNormal);
-
-        CSSValueList* valueList = CSSValueList::createSpaceSeparated();
-        if (commonLigaturesState != FontDescription::NormalLigaturesState)
-            valueList->append(cssValuePool().createIdentifierValue(commonLigaturesState == FontDescription::DisabledLigaturesState ? CSSValueNoCommonLigatures : CSSValueCommonLigatures));
-        if (discretionaryLigaturesState != FontDescription::NormalLigaturesState)
-            valueList->append(cssValuePool().createIdentifierValue(discretionaryLigaturesState == FontDescription::DisabledLigaturesState ? CSSValueNoDiscretionaryLigatures : CSSValueDiscretionaryLigatures));
-        if (historicalLigaturesState != FontDescription::NormalLigaturesState)
-            valueList->append(cssValuePool().createIdentifierValue(historicalLigaturesState == FontDescription::DisabledLigaturesState ? CSSValueNoHistoricalLigatures : CSSValueHistoricalLigatures));
-        if (contextualLigaturesState != FontDescription::NormalLigaturesState)
-            valueList->append(cssValuePool().createIdentifierValue(contextualLigaturesState == FontDescription::DisabledLigaturesState ? CSSValueNoContextual : CSSValueContextual));
-        return valueList;
-    }
-    case CSSPropertyFontVariantCaps: {
-        FontDescription::FontVariantCaps variantCaps = style.getFontDescription().variantCaps();
-        switch (variantCaps) {
-        case FontDescription::CapsNormal:
-            return cssValuePool().createIdentifierValue(CSSValueNormal);
-        case FontDescription::SmallCaps:
-            return cssValuePool().createIdentifierValue(CSSValueSmallCaps);
-        case FontDescription::AllSmallCaps:
-            return cssValuePool().createIdentifierValue(CSSValueAllSmallCaps);
-        case FontDescription::PetiteCaps:
-            return cssValuePool().createIdentifierValue(CSSValuePetiteCaps);
-        case FontDescription::AllPetiteCaps:
-            return cssValuePool().createIdentifierValue(CSSValueAllPetiteCaps);
-        case FontDescription::Unicase:
-            return cssValuePool().createIdentifierValue(CSSValueUnicase);
-        case FontDescription::TitlingCaps:
-            return cssValuePool().createIdentifierValue(CSSValueTitlingCaps);
-        }
-    }
+    case CSSPropertyFontVariantLigatures:
+        return valueForFontVariantLigatures(style);
+    case CSSPropertyFontVariantCaps:
+        return valueForFontVariantCaps(style);
     case CSSPropertyZIndex:
         if (style.hasAutoZIndex())
             return cssValuePool().createIdentifierValue(CSSValueAuto);
diff --git a/third_party/WebKit/Source/core/css/FontFace.cpp b/third_party/WebKit/Source/core/css/FontFace.cpp
index 59b526b..c0c68fb 100644
--- a/third_party/WebKit/Source/core/css/FontFace.cpp
+++ b/third_party/WebKit/Source/core/css/FontFace.cpp
@@ -500,37 +500,7 @@
         }
     }
 
-    FontVariant variant = FontVariantNormal;
-    if (CSSValue* fontVariant = m_variant) {
-        // font-variant descriptor can be a value list.
-        if (fontVariant->isPrimitiveValue()) {
-            CSSValueList* list = CSSValueList::createCommaSeparated();
-            list->append(fontVariant);
-            fontVariant = list;
-        } else if (!fontVariant->isValueList()) {
-            return 0;
-        }
-
-        CSSValueList* variantList = toCSSValueList(fontVariant);
-        unsigned numVariants = variantList->length();
-        if (!numVariants)
-            return 0;
-
-        for (unsigned i = 0; i < numVariants; ++i) {
-            switch (toCSSPrimitiveValue(variantList->item(i))->getValueID()) {
-            case CSSValueNormal:
-                variant = FontVariantNormal;
-                break;
-            case CSSValueSmallCaps:
-                variant = FontVariantSmallCaps;
-                break;
-            default:
-                break;
-            }
-        }
-    }
-
-    return FontTraits(style, variant, weight, stretch);
+    return FontTraits(style, weight, stretch);
 }
 
 static FontDisplay CSSValueToFontDisplay(CSSValue* value)
diff --git a/third_party/WebKit/Source/core/css/StylePropertySerializer.cpp b/third_party/WebKit/Source/core/css/StylePropertySerializer.cpp
index 5988e8e..a76a155 100644
--- a/third_party/WebKit/Source/core/css/StylePropertySerializer.cpp
+++ b/third_party/WebKit/Source/core/css/StylePropertySerializer.cpp
@@ -470,6 +470,8 @@
         return getShorthandValue(gridGapShorthand());
     case CSSPropertyFont:
         return fontValue();
+    case CSSPropertyFontVariant:
+        return fontVariantValue();
     case CSSPropertyMargin:
         return get4Values(marginShorthand());
     case CSSPropertyMotion:
@@ -541,7 +543,8 @@
         break; // No prefix.
     case CSSPropertyFontFamily:
     case CSSPropertyFontStretch:
-    case CSSPropertyFontVariant:
+    case CSSPropertyFontVariantCaps:
+    case CSSPropertyFontVariantLigatures:
     case CSSPropertyFontWeight:
         prefix = ' ';
         break;
@@ -554,7 +557,17 @@
 
     if (prefix && !result.isEmpty())
         result.append(prefix);
-    String value = m_propertySet.propertyAt(foundPropertyIndex).value()->cssText();
+
+    String value;
+    // In the font-variant shorthand a "none" ligatures value needs to be expanded.
+    if (propertyID == CSSPropertyFontVariantLigatures
+        && val->isPrimitiveValue()
+        && toCSSPrimitiveValue(val)->getValueID() == CSSValueNone) {
+        value = "no-common-ligatures no-discretionary-ligatures no-historical-ligatures no-contextual";
+    } else {
+        value = m_propertySet.propertyAt(foundPropertyIndex).value()->cssText();
+    }
+
     result.append(value);
     if (!commonValue.isNull() && commonValue != value)
         commonValue = String();
@@ -567,15 +580,36 @@
 
     int fontSizePropertyIndex = m_propertySet.findPropertyIndex(CSSPropertyFontSize);
     int fontFamilyPropertyIndex = m_propertySet.findPropertyIndex(CSSPropertyFontFamily);
-    ASSERT(fontSizePropertyIndex != -1 && fontFamilyPropertyIndex != -1);
+    int fontVariantCapsPropertyIndex = m_propertySet.findPropertyIndex(CSSPropertyFontVariantCaps);
+    int fontVariantLigaturesPropertyIndex = m_propertySet.findPropertyIndex(CSSPropertyFontVariantLigatures);
+    DCHECK_NE(fontSizePropertyIndex, -1);
+    DCHECK_NE(fontFamilyPropertyIndex, -1);
+    DCHECK_NE(fontVariantCapsPropertyIndex, -1);
+    DCHECK_NE(fontVariantLigaturesPropertyIndex, -1);
 
     PropertyValueForSerializer fontSizeProperty = m_propertySet.propertyAt(fontSizePropertyIndex);
     PropertyValueForSerializer fontFamilyProperty = m_propertySet.propertyAt(fontFamilyPropertyIndex);
+    PropertyValueForSerializer fontVariantCapsProperty = m_propertySet.propertyAt(fontVariantCapsPropertyIndex);
+    PropertyValueForSerializer fontVariantLigaturesProperty = m_propertySet.propertyAt(fontVariantLigaturesPropertyIndex);
+
+    // Check that non-initial font-variant subproperties are not conflicting with this serialization.
+    const CSSValue* ligaturesValue = fontVariantLigaturesProperty.value();
+    if ((ligaturesValue->isPrimitiveValue()
+        && toCSSPrimitiveValue(ligaturesValue)->getValueID() != CSSValueNormal)
+        || ligaturesValue->isValueList())
+        return emptyString();
 
     String commonValue = fontSizeProperty.value()->cssText();
     StringBuilder result;
     appendFontLonghandValueIfNotNormal(CSSPropertyFontStyle, result, commonValue);
-    appendFontLonghandValueIfNotNormal(CSSPropertyFontVariant, result, commonValue);
+
+    const CSSValue* val = fontVariantCapsProperty.value();
+    if (val->isPrimitiveValue()
+        && (toCSSPrimitiveValue(val)->getValueID() != CSSValueSmallCaps
+        && toCSSPrimitiveValue(val)->getValueID() != CSSValueNormal))
+        return emptyString();
+    appendFontLonghandValueIfNotNormal(CSSPropertyFontVariantCaps, result, commonValue);
+
     appendFontLonghandValueIfNotNormal(CSSPropertyFontWeight, result, commonValue);
     appendFontLonghandValueIfNotNormal(CSSPropertyFontStretch, result, commonValue);
     if (!result.isEmpty())
@@ -590,6 +624,30 @@
     return result.toString();
 }
 
+String StylePropertySerializer::fontVariantValue() const
+{
+    if (!isPropertyShorthandAvailable(fontVariantShorthand())) {
+        if (!shorthandHasOnlyInitialOrInheritedValue(fontVariantShorthand()))
+            return String();
+        return m_propertySet.getPropertyValue(CSSPropertyFontVariantLigatures);
+    }
+
+    StringBuilder result;
+
+    // TODO(drott): Decide how we want to return ligature values in shorthands, reduced to "none" or
+    // spelled out, filed as W3C bug:
+    // https://www.w3.org/Bugs/Public/show_bug.cgi?id=29594
+    String dummyCommonValue;
+    appendFontLonghandValueIfNotNormal(CSSPropertyFontVariantLigatures, result, dummyCommonValue);
+    appendFontLonghandValueIfNotNormal(CSSPropertyFontVariantCaps, result, dummyCommonValue);
+
+    if (result.isEmpty()) {
+        return "normal";
+    }
+
+    return result.toString();
+}
+
 String StylePropertySerializer::get4Values(const StylePropertyShorthand& shorthand) const
 {
     // Assume the properties are in the usual order top, right, bottom, left.
diff --git a/third_party/WebKit/Source/core/css/StylePropertySerializer.h b/third_party/WebKit/Source/core/css/StylePropertySerializer.h
index 24f4c20..42bb7fd4 100644
--- a/third_party/WebKit/Source/core/css/StylePropertySerializer.h
+++ b/third_party/WebKit/Source/core/css/StylePropertySerializer.h
@@ -48,6 +48,7 @@
     String borderSpacingValue(const StylePropertyShorthand&) const;
     String getShorthandValue(const StylePropertyShorthand&, String separator = " ") const;
     String fontValue() const;
+    String fontVariantValue() const;
     void appendFontLonghandValueIfNotNormal(CSSPropertyID, StringBuilder& result, String& value) const;
     String backgroundRepeatPropertyValue() const;
     String getPropertyText(CSSPropertyID, const String& value, bool isImportant, bool isNotFirstDecl) const;
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
index f22d087..981a1f1 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -454,59 +454,98 @@
     return consumeString(range);
 }
 
-static CSSValue* consumeFontVariantLigatures(CSSParserTokenRange& range)
-{
-    if (range.peek().id() == CSSValueNormal)
-        return consumeIdent(range);
-    CSSValueList* ligatureValues = CSSValueList::createSpaceSeparated();
-    bool sawCommonLigaturesValue = false;
-    bool sawDiscretionaryLigaturesValue = false;
-    bool sawHistoricalLigaturesValue = false;
-    bool sawContextualLigaturesValue = false;
-    do {
-        CSSValueID id = range.peek().id();
-        switch (id) {
+class FontVariantLigaturesParser {
+    STACK_ALLOCATED();
+
+public:
+    FontVariantLigaturesParser()
+        : m_sawCommonLigaturesValue(false)
+        , m_sawDiscretionaryLigaturesValue(false)
+        , m_sawHistoricalLigaturesValue(false)
+        , m_sawContextualLigaturesValue(false)
+        , m_result(CSSValueList::createSpaceSeparated())
+    {
+    }
+
+    enum class ParseResult {
+        ConsumedValue,
+        DisallowedValue,
+        UnknownValue
+    };
+
+    ParseResult consumeLigature(CSSParserTokenRange& range)
+    {
+        CSSValueID valueID = range.peek().id();
+        switch (valueID) {
         case CSSValueNoCommonLigatures:
         case CSSValueCommonLigatures:
-            if (sawCommonLigaturesValue)
-                return nullptr;
-            sawCommonLigaturesValue = true;
+            if (m_sawCommonLigaturesValue)
+                return ParseResult::DisallowedValue;
+            m_sawCommonLigaturesValue = true;
             break;
         case CSSValueNoDiscretionaryLigatures:
         case CSSValueDiscretionaryLigatures:
-            if (sawDiscretionaryLigaturesValue)
-                return nullptr;
-            sawDiscretionaryLigaturesValue = true;
+            if (m_sawDiscretionaryLigaturesValue)
+                return ParseResult::DisallowedValue;
+            m_sawDiscretionaryLigaturesValue = true;
             break;
         case CSSValueNoHistoricalLigatures:
         case CSSValueHistoricalLigatures:
-            if (sawHistoricalLigaturesValue)
-                return nullptr;
-            sawHistoricalLigaturesValue = true;
+            if (m_sawHistoricalLigaturesValue)
+                return ParseResult::DisallowedValue;
+            m_sawHistoricalLigaturesValue = true;
             break;
         case CSSValueNoContextual:
         case CSSValueContextual:
-            if (sawContextualLigaturesValue)
-                return nullptr;
-            sawContextualLigaturesValue = true;
+            if (m_sawContextualLigaturesValue)
+                return ParseResult::DisallowedValue;
+            m_sawContextualLigaturesValue = true;
             break;
         default:
-            return nullptr;
+            return ParseResult::UnknownValue;
         }
-        ligatureValues->append(consumeIdent(range));
+        m_result->append(consumeIdent(range));
+        return ParseResult::ConsumedValue;
+    }
+
+    CSSValue* finalizeValue()
+    {
+        if (!m_result->length())
+            return cssValuePool().createIdentifierValue(CSSValueNormal);
+        return m_result.release();
+    }
+
+private:
+    bool m_sawCommonLigaturesValue;
+    bool m_sawDiscretionaryLigaturesValue;
+    bool m_sawHistoricalLigaturesValue;
+    bool m_sawContextualLigaturesValue;
+    Member<CSSValueList> m_result;
+};
+
+static CSSValue* consumeFontVariantLigatures(CSSParserTokenRange& range)
+{
+    if (range.peek().id() == CSSValueNormal || range.peek().id() == CSSValueNone)
+        return consumeIdent(range);
+
+    FontVariantLigaturesParser ligaturesParser;
+    do {
+        if (ligaturesParser.consumeLigature(range) !=
+            FontVariantLigaturesParser::ParseResult::ConsumedValue)
+            return nullptr;
     } while (!range.atEnd());
 
-    return ligatureValues;
+    return ligaturesParser.finalizeValue();
 }
 
-static CSSValue* consumeFontVariantCaps(CSSParserTokenRange& range)
+static CSSPrimitiveValue* consumeFontVariantCaps(CSSParserTokenRange& range)
 {
     return consumeIdent<CSSValueNormal, CSSValueSmallCaps, CSSValueAllSmallCaps,
         CSSValuePetiteCaps, CSSValueAllPetiteCaps,
         CSSValueUnicase, CSSValueTitlingCaps>(range);
 }
 
-static CSSPrimitiveValue* consumeFontVariant(CSSParserTokenRange& range)
+static CSSPrimitiveValue* consumeFontVariantCSS21(CSSParserTokenRange& range)
 {
     return consumeIdent<CSSValueNormal, CSSValueSmallCaps>(range);
 }
@@ -524,7 +563,7 @@
                 return nullptr;
             return consumeIdent(range);
         }
-        CSSPrimitiveValue* fontVariant = consumeFontVariant(range);
+        CSSPrimitiveValue* fontVariant = consumeFontVariantCSS21(range);
         if (fontVariant)
             values->append(fontVariant);
     } while (consumeCommaIncludingWhitespace(range));
@@ -3446,8 +3485,6 @@
         return consumeFontVariantLigatures(m_range);
     case CSSPropertyFontFeatureSettings:
         return consumeFontFeatureSettings(m_range);
-    case CSSPropertyFontVariant:
-        return consumeFontVariant(m_range);
     case CSSPropertyFontFamily:
         return consumeFontFamily(m_range);
     case CSSPropertyFontWeight:
@@ -3843,10 +3880,9 @@
 
     // FIXME: https://drafts.csswg.org/css-fonts says that format() contains a comma-separated list of strings,
     // but CSSFontFaceSrcValue stores only one format. Allowing one format for now.
-    // FIXME: IdentToken should not be supported here.
     CSSParserTokenRange args = consumeFunction(range);
     const CSSParserToken& arg = args.consumeIncludingWhitespace();
-    if ((arg.type() != StringToken && arg.type() != IdentToken) || !args.atEnd())
+    if ((arg.type() != StringToken) || !args.atEnd())
         return nullptr;
     uriValue->setFormat(arg.value());
     return uriValue;
@@ -3954,7 +3990,8 @@
     addProperty(CSSPropertyFontFamily, CSSPropertyFont, fontFamilyList, important);
 
     addProperty(CSSPropertyFontStretch, CSSPropertyFont, cssValuePool().createIdentifierValue(CSSValueNormal), important);
-    addProperty(CSSPropertyFontVariant, CSSPropertyFont, cssValuePool().createIdentifierValue(CSSValueNormal), important);
+    addProperty(CSSPropertyFontVariantCaps, CSSPropertyFont, cssValuePool().createIdentifierValue(CSSValueNormal), important);
+    addProperty(CSSPropertyFontVariantLigatures, CSSPropertyFont, cssValuePool().createIdentifierValue(CSSValueNormal), important);
     addProperty(CSSPropertyLineHeight, CSSPropertyFont, cssValuePool().createIdentifierValue(CSSValueNormal), important);
     return true;
 }
@@ -3970,7 +4007,7 @@
     }
     // Optional font-style, font-variant, font-stretch and font-weight.
     CSSPrimitiveValue* fontStyle = nullptr;
-    CSSPrimitiveValue* fontVariant = nullptr;
+    CSSPrimitiveValue* fontVariantCaps = nullptr;
     CSSPrimitiveValue* fontWeight = nullptr;
     CSSPrimitiveValue* fontStretch = nullptr;
     while (!m_range.atEnd()) {
@@ -3979,11 +4016,11 @@
             fontStyle = consumeIdent(m_range);
             continue;
         }
-        if (!fontVariant) {
+        if (!fontVariantCaps && (id == CSSValueNormal || id == CSSValueSmallCaps)) {
             // Font variant in the shorthand is particular, it only accepts normal or small-caps.
-            // TODO: Make consumeFontVariant only accept the css21 values.
-            fontVariant = consumeFontVariant(m_range);
-            if (fontVariant)
+            // See https://drafts.csswg.org/css-fonts/#propdef-font
+            fontVariantCaps = consumeFontVariantCSS21(m_range);
+            if (fontVariantCaps)
                 continue;
         }
         if (!fontWeight) {
@@ -4001,7 +4038,9 @@
         return false;
 
     addProperty(CSSPropertyFontStyle, CSSPropertyFont, fontStyle ? fontStyle : cssValuePool().createIdentifierValue(CSSValueNormal), important);
-    addProperty(CSSPropertyFontVariant, CSSPropertyFont, fontVariant ? fontVariant : cssValuePool().createIdentifierValue(CSSValueNormal), important);
+    addProperty(CSSPropertyFontVariantCaps, CSSPropertyFont, fontVariantCaps ? fontVariantCaps : cssValuePool().createIdentifierValue(CSSValueNormal), important);
+    addProperty(CSSPropertyFontVariantLigatures, CSSPropertyFont, cssValuePool().createIdentifierValue(CSSValueNormal), important);
+
     addProperty(CSSPropertyFontWeight, CSSPropertyFont, fontWeight ? fontWeight : cssValuePool().createIdentifierValue(CSSValueNormal), important);
     addProperty(CSSPropertyFontStretch, CSSPropertyFont, fontStretch ? fontStretch : cssValuePool().createIdentifierValue(CSSValueNormal), important);
 
@@ -4034,6 +4073,46 @@
     return m_range.atEnd();
 }
 
+bool CSSPropertyParser::consumeFontVariantShorthand(bool important)
+{
+    if (identMatches<CSSValueNormal, CSSValueNone>(m_range.peek().id())) {
+        addProperty(CSSPropertyFontVariantLigatures, CSSPropertyFontVariant, consumeIdent(m_range), important);
+        addProperty(CSSPropertyFontVariantCaps, CSSPropertyFontVariant, cssValuePool().createIdentifierValue(CSSValueNormal), important);
+        return m_range.atEnd();
+    }
+
+    CSSPrimitiveValue* capsValue = nullptr;
+    FontVariantLigaturesParser ligaturesParser;
+    do {
+        FontVariantLigaturesParser::ParseResult parseResult = ligaturesParser.consumeLigature(m_range);
+        if (parseResult == FontVariantLigaturesParser::ParseResult::ConsumedValue)
+            continue;
+        if (parseResult == FontVariantLigaturesParser::ParseResult::DisallowedValue)
+            return false;
+
+        CSSValueID id = m_range.peek().id();
+        switch (id) {
+        case CSSValueSmallCaps:
+        case CSSValueAllSmallCaps:
+        case CSSValuePetiteCaps:
+        case CSSValueAllPetiteCaps:
+        case CSSValueUnicase:
+        case CSSValueTitlingCaps:
+            // Only one caps value permitted in font-variant grammar.
+            if (capsValue)
+                return false;
+            capsValue = consumeIdent(m_range);
+            break;
+        default:
+            return false;
+        }
+    } while (!m_range.atEnd());
+
+    addProperty(CSSPropertyFontVariantLigatures, CSSPropertyFontVariant, ligaturesParser.finalizeValue(), important);
+    addProperty(CSSPropertyFontVariantCaps, CSSPropertyFontVariant, capsValue ? capsValue : cssValuePool().createIdentifierValue(CSSValueNormal), important);
+    return true;
+}
+
 bool CSSPropertyParser::consumeBorderSpacing(bool important)
 {
     CSSValue* horizontalSpacing = consumeLength(m_range, m_context.mode(), ValueRangeNonNegative, UnitlessQuirk::Allow);
@@ -4827,6 +4906,8 @@
             return consumeSystemFont(important);
         return consumeFont(important);
     }
+    case CSSPropertyFontVariant:
+        return consumeFontVariantShorthand(important);
     case CSSPropertyBorderSpacing:
         return consumeBorderSpacing(important);
     case CSSPropertyColumns:
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h
index 604cfd72..4a5a451e 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h
@@ -87,6 +87,7 @@
     bool consumeGridAreaShorthand(bool important);
 
     bool consumeFont(bool important);
+    bool consumeFontVariantShorthand(bool important);
     bool consumeSystemFont(bool important);
 
     bool consumeBorderSpacing(bool important);
diff --git a/third_party/WebKit/Source/core/css/resolver/CSSPropertyPriority.h b/third_party/WebKit/Source/core/css/resolver/CSSPropertyPriority.h
index 7a0c08e..1b2ec8e 100644
--- a/third_party/WebKit/Source/core/css/resolver/CSSPropertyPriority.h
+++ b/third_party/WebKit/Source/core/css/resolver/CSSPropertyPriority.h
@@ -55,7 +55,7 @@
 template<>
 inline CSSPropertyID CSSPropertyPriorityData<HighPropertyPriority>::last()
 {
-    static_assert(CSSPropertyZoom == CSSPropertyColor + 20, "CSSPropertyZoom should be the end of the high priority property range");
+    static_assert(CSSPropertyZoom == CSSPropertyColor + 19, "CSSPropertyZoom should be the end of the high priority property range");
     static_assert(CSSPropertyTextRendering == CSSPropertyZoom - 1, "CSSPropertyTextRendering should be immediately before CSSPropertyZoom");
     return CSSPropertyZoom;
 }
diff --git a/third_party/WebKit/Source/core/css/resolver/FontBuilder.cpp b/third_party/WebKit/Source/core/css/resolver/FontBuilder.cpp
index e10f73b..44cee0b0 100644
--- a/third_party/WebKit/Source/core/css/resolver/FontBuilder.cpp
+++ b/third_party/WebKit/Source/core/css/resolver/FontBuilder.cpp
@@ -155,13 +155,6 @@
     m_fontDescription.setStyle(italic);
 }
 
-void FontBuilder::setVariant(FontVariant smallCaps)
-{
-    set(PropertySetFlag::Variant);
-
-    m_fontDescription.setVariant(smallCaps);
-}
-
 void FontBuilder::setVariantCaps(FontDescription::FontVariantCaps caps)
 {
     set(PropertySetFlag::VariantCaps);
@@ -374,8 +367,6 @@
         description.setLocale(m_fontDescription.locale(false));
     if (isSet(PropertySetFlag::Style))
         description.setStyle(m_fontDescription.style());
-    if (isSet(PropertySetFlag::Variant))
-        description.setVariant(m_fontDescription.variant());
     if (isSet(PropertySetFlag::VariantCaps))
         description.setVariantCaps(m_fontDescription.variantCaps());
     if (isSet(PropertySetFlag::VariantLigatures))
diff --git a/third_party/WebKit/Source/core/css/resolver/FontBuilder.h b/third_party/WebKit/Source/core/css/resolver/FontBuilder.h
index ee5c4f2f..05ac7ca 100644
--- a/third_party/WebKit/Source/core/css/resolver/FontBuilder.h
+++ b/third_party/WebKit/Source/core/css/resolver/FontBuilder.h
@@ -62,7 +62,6 @@
     void setFeatureSettings(PassRefPtr<FontFeatureSettings>);
     void setLocale(const AtomicString&);
     void setStyle(FontStyle);
-    void setVariant(FontVariant);
     void setVariantCaps(FontDescription::FontVariantCaps);
     void setVariantLigatures(const FontDescription::VariantLigatures&);
     void setTextRendering(TextRenderingMode);
@@ -82,7 +81,6 @@
     static FontDescription::Size initialSize() { return FontDescription::Size(FontSize::initialKeywordSize(), 0.0f, false); }
     static float initialSizeAdjust() { return FontSizeAdjustNone; }
     static TextRenderingMode initialTextRendering() { return AutoTextRendering; }
-    static FontVariant initialVariant() { return FontVariantNormal; }
     static FontDescription::FontVariantCaps initialVariantCaps() { return FontDescription::CapsNormal; }
     static FontDescription::VariantLigatures initialVariantLigatures() { return FontDescription::VariantLigatures(); }
     static const AtomicString& initialLocale() { return nullAtom; }
@@ -117,7 +115,6 @@
         Locale,
         Style,
         SizeAdjust,
-        Variant,
         VariantCaps,
         VariantLigatures,
         TextRendering,
diff --git a/third_party/WebKit/Source/core/css/resolver/FontBuilderTest.cpp b/third_party/WebKit/Source/core/css/resolver/FontBuilderTest.cpp
index e4c72e1c8..64e924d 100644
--- a/third_party/WebKit/Source/core/css/resolver/FontBuilderTest.cpp
+++ b/third_party/WebKit/Source/core/css/resolver/FontBuilderTest.cpp
@@ -109,9 +109,6 @@
 static void fontStyleBase(FontDescription& d) { d.setStyle(FontStyleItalic); }
 static void fontStyleValue(FontBuilder& b) { b.setStyle(FontStyleNormal); }
 
-static void fontVariantBase(FontDescription& d) { d.setVariant(FontVariantSmallCaps); }
-static void fontVariantValue(FontBuilder& b) { b.setVariant(FontVariantNormal); }
-
 static void fontVariantCapsBase(FontDescription& d) { d.setVariantCaps(FontDescription::SmallCaps); }
 static void fontVariantCapsValue(FontBuilder& b) { b.setVariantCaps(FontDescription::CapsNormal); }
 
@@ -154,7 +151,6 @@
     FunctionPair(fontFamilyBase, fontFamilyValue),
     FunctionPair(fontFeatureSettingsBase, fontFeatureSettingsValue),
     FunctionPair(fontStyleBase, fontStyleValue),
-    FunctionPair(fontVariantBase, fontVariantValue),
     FunctionPair(fontVariantCapsBase, fontVariantCapsValue),
     FunctionPair(fontVariantLigaturesBase, fontVariantLigaturesValue),
     FunctionPair(fontTextRenderingBase, fontTextRenderingValue),
diff --git a/third_party/WebKit/Source/core/css/resolver/StyleBuilderConverter.cpp b/third_party/WebKit/Source/core/css/resolver/StyleBuilderConverter.cpp
index 364dc72..0d78318 100644
--- a/third_party/WebKit/Source/core/css/resolver/StyleBuilderConverter.cpp
+++ b/third_party/WebKit/Source/core/css/resolver/StyleBuilderConverter.cpp
@@ -329,6 +329,11 @@
     }
 
     ASSERT_WITH_SECURITY_IMPLICATION(value.isPrimitiveValue());
+
+    if (toCSSPrimitiveValue(value).getValueID() == CSSValueNone) {
+        return FontDescription::VariantLigatures(FontDescription::DisabledLigaturesState);
+    }
+
     ASSERT(toCSSPrimitiveValue(value).getValueID() == CSSValueNormal);
     return FontDescription::VariantLigatures();
 }
diff --git a/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp b/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp
index 44e1ea7..346846a 100644
--- a/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp
+++ b/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp
@@ -1676,7 +1676,7 @@
         CSSPropertyFontFamily,
         CSSPropertyFontStretch,
         CSSPropertyFontStyle,
-        CSSPropertyFontVariant,
+        CSSPropertyFontVariantCaps,
         CSSPropertyFontWeight,
         CSSPropertyLineHeight,
     };
diff --git a/third_party/WebKit/Source/core/dom/CharacterData.cpp b/third_party/WebKit/Source/core/dom/CharacterData.cpp
index a9ab5e3..28890a0 100644
--- a/third_party/WebKit/Source/core/dom/CharacterData.cpp
+++ b/third_party/WebKit/Source/core/dom/CharacterData.cpp
@@ -46,6 +46,8 @@
     if (m_data == nonNullData)
         return;
 
+    document().dataWillChange(*this);
+
     unsigned oldLength = length();
 
     setDataAndUpdate(nonNullData, 0, oldLength, nonNullData.length(), UpdateFromNonParser);
@@ -159,6 +161,9 @@
 
 void CharacterData::setDataAndUpdate(const String& newData, unsigned offsetOfReplacedData, unsigned oldLength, unsigned newLength, UpdateSource source, RecalcStyleBehavior recalcStyleBehavior)
 {
+    if (source != UpdateFromParser)
+        document().dataWillChange(*this);
+
     String oldData = m_data;
     m_data = newData;
 
diff --git a/third_party/WebKit/Source/core/dom/ChildNode.h b/third_party/WebKit/Source/core/dom/ChildNode.h
index 3c3b1f5..6dd625cf 100644
--- a/third_party/WebKit/Source/core/dom/ChildNode.h
+++ b/third_party/WebKit/Source/core/dom/ChildNode.h
@@ -11,6 +11,21 @@
 
 class ChildNode {
 public:
+    static void before(Node& node, const HeapVector<NodeOrString>& nodes, ExceptionState& exceptionState)
+    {
+        return node.before(nodes, exceptionState);
+    }
+
+    static void after(Node& node, const HeapVector<NodeOrString>& nodes, ExceptionState& exceptionState)
+    {
+        return node.after(nodes, exceptionState);
+    }
+
+    static void replaceWith(Node& node, const HeapVector<NodeOrString>& nodes, ExceptionState& exceptionState)
+    {
+        return node.replaceWith(nodes, exceptionState);
+    }
+
     static void remove(Node& node, ExceptionState& exceptionState)
     {
         return node.remove(exceptionState);
diff --git a/third_party/WebKit/Source/core/dom/ChildNode.idl b/third_party/WebKit/Source/core/dom/ChildNode.idl
index 8c2f9f3a..0b0168e 100644
--- a/third_party/WebKit/Source/core/dom/ChildNode.idl
+++ b/third_party/WebKit/Source/core/dom/ChildNode.idl
@@ -26,9 +26,8 @@
     LegacyTreatAsPartialInterface,
     NoInterfaceObject, // Always used on target of 'implements'
 ] interface ChildNode {
-    // [Unscopeable] void before((Node or DOMString)... nodes);
-    // [Unscopeable] void after((Node or DOMString)... nodes);
-    // [Unscopeable] void replaceWith((Node or DOMString)... nodes);
-    // TODO(philipj): remove() should be [Unscopeable]. crbug.com/462916
-    [RaisesException, CustomElementCallbacks] void remove();
+    [Unscopeable, RaisesException, CustomElementCallbacks, RuntimeEnabled=DOMConvenienceAPI] void before((Node or DOMString) ... nodes);
+    [Unscopeable, RaisesException, CustomElementCallbacks, RuntimeEnabled=DOMConvenienceAPI] void after((Node or DOMString)... nodes);
+    [Unscopeable, RaisesException, CustomElementCallbacks, RuntimeEnabled=DOMConvenienceAPI] void replaceWith((Node or DOMString)... nodes);
+    [Unscopeable, RaisesException, CustomElementCallbacks] void remove();
 };
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index 91633b3..c8e19ff 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -3862,6 +3862,12 @@
     }
 }
 
+void Document::dataWillChange(const CharacterData& characterData)
+{
+    if (LocalFrame* frame = this->frame())
+        frame->selection().dataWillChange(characterData);
+}
+
 void Document::didInsertText(Node* text, unsigned offset, unsigned length)
 {
     for (Range* range : m_ranges)
diff --git a/third_party/WebKit/Source/core/dom/Document.h b/third_party/WebKit/Source/core/dom/Document.h
index e102c0b0..dd523df 100644
--- a/third_party/WebKit/Source/core/dom/Document.h
+++ b/third_party/WebKit/Source/core/dom/Document.h
@@ -77,6 +77,7 @@
 class CanvasFontCache;
 class CanvasRenderingContext2D;
 class CanvasRenderingContext2DOrWebGLRenderingContext;
+class CharacterData;
 class ChromeClient;
 class CompositorPendingAnimations;
 class Comment;
@@ -640,6 +641,8 @@
     void nodeChildrenWillBeRemoved(ContainerNode&);
     // nodeWillBeRemoved is only safe when removing one node at a time.
     void nodeWillBeRemoved(Node&);
+    // Called just before a destructive update to some CharacterData.
+    void dataWillChange(const CharacterData&);
     bool canAcceptChild(const Node& newChild, const Node* oldChild, ExceptionState&) const;
 
     void didInsertText(Node*, unsigned offset, unsigned length);
diff --git a/third_party/WebKit/Source/core/dom/Element.cpp b/third_party/WebKit/Source/core/dom/Element.cpp
index ba359ce..116b3ef 100644
--- a/third_party/WebKit/Source/core/dom/Element.cpp
+++ b/third_party/WebKit/Source/core/dom/Element.cpp
@@ -670,20 +670,22 @@
 
 int Element::clientWidth()
 {
-    document().updateLayoutIgnorePendingStylesheetsForNode(this);
-
     // When in strict mode, clientWidth for the document element should return the width of the containing frame.
     // When in quirks mode, clientWidth for the body element should return the width of the containing frame.
     bool inQuirksMode = document().inQuirksMode();
     if ((!inQuirksMode && document().documentElement() == this)
         || (inQuirksMode && isHTMLElement() && document().body() == this)) {
         if (LayoutViewItem layoutView = LayoutViewItem(document().layoutView())) {
+            if (!RuntimeEnabledFeatures::overlayScrollbarsEnabled() || !document().frame()->isLocalRoot())
+                document().updateLayoutIgnorePendingStylesheetsForNode(this);
             if (document().page()->settings().forceZeroLayoutHeight())
                 return adjustLayoutUnitForAbsoluteZoom(layoutView.overflowClipRect(LayoutPoint()).width(), layoutView.styleRef()).round();
             return adjustLayoutUnitForAbsoluteZoom(LayoutUnit(layoutView.layoutSize().width()), layoutView.styleRef()).round();
         }
     }
 
+    document().updateLayoutIgnorePendingStylesheetsForNode(this);
+
     if (LayoutBox* layoutObject = layoutBox())
         return adjustLayoutUnitForAbsoluteZoom(LayoutUnit(layoutObject->pixelSnappedClientWidth()), layoutObject->styleRef()).round();
     return 0;
@@ -691,8 +693,6 @@
 
 int Element::clientHeight()
 {
-    document().updateLayoutIgnorePendingStylesheetsForNode(this);
-
     // When in strict mode, clientHeight for the document element should return the height of the containing frame.
     // When in quirks mode, clientHeight for the body element should return the height of the containing frame.
     bool inQuirksMode = document().inQuirksMode();
@@ -700,12 +700,16 @@
     if ((!inQuirksMode && document().documentElement() == this)
         || (inQuirksMode && isHTMLElement() && document().body() == this)) {
         if (LayoutViewItem layoutView = LayoutViewItem(document().layoutView())) {
+            if (!RuntimeEnabledFeatures::overlayScrollbarsEnabled() || !document().frame()->isLocalRoot())
+                document().updateLayoutIgnorePendingStylesheetsForNode(this);
             if (document().page()->settings().forceZeroLayoutHeight())
                 return adjustLayoutUnitForAbsoluteZoom(layoutView.overflowClipRect(LayoutPoint()).height(), layoutView.styleRef()).round();
             return adjustLayoutUnitForAbsoluteZoom(LayoutUnit(layoutView.layoutSize().height()), layoutView.styleRef()).round();
         }
     }
 
+    document().updateLayoutIgnorePendingStylesheetsForNode(this);
+
     if (LayoutBox* layoutObject = layoutBox())
         return adjustLayoutUnitForAbsoluteZoom(LayoutUnit(layoutObject->pixelSnappedClientHeight()), layoutObject->styleRef()).round();
     return 0;
diff --git a/third_party/WebKit/Source/core/dom/Node.cpp b/third_party/WebKit/Source/core/dom/Node.cpp
index a57826c5..745f6e93 100644
--- a/third_party/WebKit/Source/core/dom/Node.cpp
+++ b/third_party/WebKit/Source/core/dom/Node.cpp
@@ -416,6 +416,96 @@
     return nullptr;
 }
 
+static bool isNodeInNodes(const Node* const node, const HeapVector<NodeOrString>& nodes)
+{
+    for (const NodeOrString& nodeOrString : nodes) {
+        if (nodeOrString.isNode() && nodeOrString.getAsNode() == node)
+            return true;
+    }
+    return false;
+}
+
+static Node* findViablePreviousSibling(const Node& node, const HeapVector<NodeOrString>& nodes)
+{
+    for (Node* sibling = node.previousSibling(); sibling; sibling = sibling->previousSibling()) {
+        if (!isNodeInNodes(sibling, nodes))
+            return sibling;
+    }
+    return nullptr;
+}
+
+static Node* findViableNextSibling(const Node& node, const HeapVector<NodeOrString>& nodes)
+{
+    for (Node* sibling = node.nextSibling(); sibling; sibling = sibling->nextSibling()) {
+        if (!isNodeInNodes(sibling, nodes))
+            return sibling;
+    }
+    return nullptr;
+}
+
+static Node* nodeOrStringToNode(const NodeOrString& nodeOrString, Document& document)
+{
+    if (nodeOrString.isNode())
+        return nodeOrString.getAsNode();
+    return Text::create(document, nodeOrString.getAsString());
+}
+
+static Node* convertNodesIntoNode(const HeapVector<NodeOrString>& nodes, Document& document)
+{
+    if (nodes.size() == 1)
+        return nodeOrStringToNode(nodes[0], document);
+
+    Node* fragment = DocumentFragment::create(document);
+    for (const NodeOrString& nodeOrString : nodes)
+        fragment->appendChild(nodeOrStringToNode(nodeOrString, document), ASSERT_NO_EXCEPTION);
+    return fragment;
+}
+
+void Node::prepend(const HeapVector<NodeOrString>& nodes, ExceptionState& exceptionState)
+{
+    Node* node = convertNodesIntoNode(nodes, document());
+    insertBefore(node, firstChild(), exceptionState);
+}
+
+void Node::append(const HeapVector<NodeOrString>& nodes, ExceptionState& exceptionState)
+{
+    Node* node = convertNodesIntoNode(nodes, document());
+    appendChild(node, exceptionState);
+}
+
+void Node::before(const HeapVector<NodeOrString>& nodes, ExceptionState& exceptionState)
+{
+    Node* parent = parentNode();
+    if (!parent)
+        return;
+    Node* viablePreviousSibling = findViablePreviousSibling(*this, nodes);
+    Node* node = convertNodesIntoNode(nodes, document());
+    parent->insertBefore(node, viablePreviousSibling ? viablePreviousSibling->nextSibling() : parent->firstChild(), exceptionState);
+}
+
+void Node::after(const HeapVector<NodeOrString>& nodes, ExceptionState& exceptionState)
+{
+    Node* parent = parentNode();
+    if (!parent)
+        return;
+    Node* viableNextSibling = findViableNextSibling(*this, nodes);
+    Node* node = convertNodesIntoNode(nodes, document());
+    parent->insertBefore(node, viableNextSibling, exceptionState);
+}
+
+void Node::replaceWith(const HeapVector<NodeOrString>& nodes, ExceptionState& exceptionState)
+{
+    Node* parent = parentNode();
+    if (!parent)
+        return;
+    Node* viableNextSibling = findViableNextSibling(*this, nodes);
+    Node* node = convertNodesIntoNode(nodes, document());
+    if (parent == parentNode())
+        parent->replaceChild(node, this, exceptionState);
+    else
+        parent->insertBefore(node, viableNextSibling, exceptionState);
+}
+
 void Node::remove(ExceptionState& exceptionState)
 {
     if (ContainerNode* parent = parentNode())
diff --git a/third_party/WebKit/Source/core/dom/Node.h b/third_party/WebKit/Source/core/dom/Node.h
index 0105f11..98a7fe8 100644
--- a/third_party/WebKit/Source/core/dom/Node.h
+++ b/third_party/WebKit/Source/core/dom/Node.h
@@ -26,6 +26,7 @@
 #define Node_h
 
 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
+#include "bindings/core/v8/UnionTypesCore.h"
 #include "core/CoreExport.h"
 #include "core/dom/MutationObserver.h"
 #include "core/dom/SimulatedClickOptions.h"
@@ -195,6 +196,11 @@
     Node& treeRoot() const;
     Node& shadowIncludingRoot() const;
 
+    void prepend(const HeapVector<NodeOrString>&, ExceptionState&);
+    void append(const HeapVector<NodeOrString>&, ExceptionState&);
+    void before(const HeapVector<NodeOrString>&, ExceptionState&);
+    void after(const HeapVector<NodeOrString>&, ExceptionState&);
+    void replaceWith(const HeapVector<NodeOrString>&, ExceptionState&);
     void remove(ExceptionState& = ASSERT_NO_EXCEPTION);
 
     Node* pseudoAwareNextSibling() const;
diff --git a/third_party/WebKit/Source/core/dom/ParentNode.h b/third_party/WebKit/Source/core/dom/ParentNode.h
index 92bce333..5530c58e 100644
--- a/third_party/WebKit/Source/core/dom/ParentNode.h
+++ b/third_party/WebKit/Source/core/dom/ParentNode.h
@@ -63,6 +63,16 @@
         return count;
     }
 
+    static void prepend(Node& node, const HeapVector<NodeOrString>& nodes, ExceptionState& exceptionState)
+    {
+        return node.prepend(nodes, exceptionState);
+    }
+
+    static void append(Node& node, const HeapVector<NodeOrString>& nodes, ExceptionState& exceptionState)
+    {
+        return node.append(nodes, exceptionState);
+    }
+
     static Element* querySelector(ContainerNode& node, const AtomicString& selectors, ExceptionState& exceptionState)
     {
         return node.querySelector(selectors, exceptionState);
diff --git a/third_party/WebKit/Source/core/dom/ParentNode.idl b/third_party/WebKit/Source/core/dom/ParentNode.idl
index e660f6c..0f722e8 100644
--- a/third_party/WebKit/Source/core/dom/ParentNode.idl
+++ b/third_party/WebKit/Source/core/dom/ParentNode.idl
@@ -39,8 +39,8 @@
     [PerWorldBindings] readonly attribute Element? lastElementChild;
     readonly attribute unsigned long childElementCount;
 
-    // [Unscopeable] void prepend((Node or DOMString)... nodes);
-    // [Unscopeable] void append((Node or DOMString)... nodes);
+    [Unscopeable, RaisesException, CustomElementCallbacks, RuntimeEnabled=DOMConvenienceAPI] void prepend((Node or DOMString)... nodes);
+    [Unscopeable, RaisesException, CustomElementCallbacks, RuntimeEnabled=DOMConvenienceAPI] void append((Node or DOMString)... nodes);
 
     // [Unscopeable] Element? query(DOMString relativeSelectors);
     // [NewObject, Unscopeable] Elements queryAll(DOMString relativeSelectors);
diff --git a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
index 2b19ef878..d3926f00 100644
--- a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
+++ b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
@@ -464,8 +464,7 @@
 {
     DCHECK(!m_willBeParserExecuted);
 
-    Document* elementDocument = &(m_element->document());
-    Document* contextDocument = elementDocument->contextDocument();
+    Document* contextDocument = m_element->document().contextDocument();
     if (!contextDocument)
         return;
 
@@ -474,8 +473,8 @@
     ScriptRunner::ExecutionType runOrder = m_willExecuteInOrder ? ScriptRunner::IN_ORDER_EXECUTION : ScriptRunner::ASYNC_EXECUTION;
     if (m_resource->errorOccurred()) {
         contextDocument->scriptRunner()->notifyScriptLoadError(this, runOrder);
-        dispatchErrorEvent();
         detach();
+        dispatchErrorEvent();
         return;
     }
     contextDocument->scriptRunner()->notifyScriptReady(this, runOrder);
diff --git a/third_party/WebKit/Source/core/editing/EditingStyle.cpp b/third_party/WebKit/Source/core/editing/EditingStyle.cpp
index fa51d94..7c62fca5 100644
--- a/third_party/WebKit/Source/core/editing/EditingStyle.cpp
+++ b/third_party/WebKit/Source/core/editing/EditingStyle.cpp
@@ -77,7 +77,8 @@
     CSSPropertyFontFamily,
     CSSPropertyFontSize,
     CSSPropertyFontStyle,
-    CSSPropertyFontVariant,
+    CSSPropertyFontVariantLigatures,
+    CSSPropertyFontVariantCaps,
     CSSPropertyFontWeight,
     CSSPropertyLetterSpacing,
     CSSPropertyLineHeight,
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.cpp b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
index 02fd9921..e19f7cf 100644
--- a/third_party/WebKit/Source/core/editing/FrameSelection.cpp
+++ b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
@@ -731,6 +731,15 @@
     m_previousCaretVisibility = m_caretBase->getCaretVisibility();
 }
 
+void FrameSelection::dataWillChange(const CharacterData& node)
+{
+    if (node == m_previousCaretNode) {
+        // This invalidation is eager, and intentionally uses stale state.
+        DisableCompositingQueryAsserts disabler;
+        m_caretBase->invalidateLocalCaretRect(m_previousCaretNode.get(), m_previousCaretRect);
+    }
+}
+
 void FrameSelection::paintCaret(GraphicsContext& context, const LayoutPoint& paintOffset)
 {
     if (selection().isCaret() && m_shouldPaintCaret) {
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.h b/third_party/WebKit/Source/core/editing/FrameSelection.h
index ba2c2f4..d35aaa1 100644
--- a/third_party/WebKit/Source/core/editing/FrameSelection.h
+++ b/third_party/WebKit/Source/core/editing/FrameSelection.h
@@ -177,6 +177,7 @@
     Range* firstRange() const;
 
     void nodeWillBeRemoved(Node&);
+    void dataWillChange(const CharacterData& node);
     void didUpdateCharacterData(CharacterData*, unsigned offset, unsigned oldLength, unsigned newLength);
     void didMergeTextNodes(const Text& oldNode, unsigned offset);
     void didSplitTextNode(const Text& oldNode);
diff --git a/third_party/WebKit/Source/core/events/KeyboardEvent.idl b/third_party/WebKit/Source/core/events/KeyboardEvent.idl
index 15990ac1..92af5476 100644
--- a/third_party/WebKit/Source/core/events/KeyboardEvent.idl
+++ b/third_party/WebKit/Source/core/events/KeyboardEvent.idl
@@ -59,5 +59,5 @@
     readonly attribute long which;
 
     // Non-standard APIs
-    [Measure] readonly attribute DOMString keyIdentifier;
+    [DeprecateAs=V8KeyboardEvent_KeyIdentifier_AttributeGetter] readonly attribute DOMString keyIdentifier;
 };
diff --git a/third_party/WebKit/Source/core/events/PointerEventFactory.cpp b/third_party/WebKit/Source/core/events/PointerEventFactory.cpp
index e742328..c787106 100644
--- a/third_party/WebKit/Source/core/events/PointerEventFactory.cpp
+++ b/third_party/WebKit/Source/core/events/PointerEventFactory.cpp
@@ -4,6 +4,8 @@
 
 #include "core/events/PointerEventFactory.h"
 
+#include "platform/geometry/FloatSize.h"
+
 namespace blink {
 
 namespace {
@@ -130,8 +132,8 @@
 
 PointerEvent* PointerEventFactory::create(const AtomicString& type,
     const PlatformTouchPoint& touchPoint, PlatformEvent::Modifiers modifiers,
-    const double width, const double height,
-    const double clientX, const double clientY)
+    const FloatSize& pointRadius,
+    const FloatPoint& pagePoint)
 {
     const PlatformTouchPoint::TouchState pointState = touchPoint.state();
 
@@ -149,14 +151,14 @@
     setIdTypeButtons(pointerEventInit, touchPoint.pointerProperties(),
         pointerReleasedOrCancelled ? 0 : 1);
 
-    pointerEventInit.setWidth(width);
-    pointerEventInit.setHeight(height);
+    pointerEventInit.setWidth(pointRadius.width());
+    pointerEventInit.setHeight(pointRadius.height());
     pointerEventInit.setTiltX(touchPoint.pointerProperties().tiltX);
     pointerEventInit.setTiltY(touchPoint.pointerProperties().tiltY);
     pointerEventInit.setScreenX(touchPoint.screenPos().x());
     pointerEventInit.setScreenY(touchPoint.screenPos().y());
-    pointerEventInit.setClientX(clientX);
-    pointerEventInit.setClientY(clientY);
+    pointerEventInit.setClientX(pagePoint.x());
+    pointerEventInit.setClientY(pagePoint.y());
     pointerEventInit.setButton(pointerPressedOrReleased ? LeftButton: NoButton);
     pointerEventInit.setPressure(getPointerEventPressure(
         touchPoint.force(), pointerEventInit.buttons()));
@@ -309,7 +311,8 @@
     return true;
 }
 
-Vector<int> PointerEventFactory::getPointerIdsOfType(WebPointerProperties::PointerType pointerType)
+Vector<int> PointerEventFactory::getPointerIdsOfType(
+    WebPointerProperties::PointerType pointerType) const
 {
     Vector<int> mappedIds;
 
@@ -334,7 +337,7 @@
 }
 
 WebPointerProperties::PointerType PointerEventFactory::getPointerType(
-    const int pointerId)
+    const int pointerId) const
 {
     if (m_pointerIdMapping.contains(pointerId)) {
         return static_cast<WebPointerProperties::PointerType>(
@@ -343,15 +346,27 @@
     return WebPointerProperties::PointerType::Unknown;
 }
 
-bool PointerEventFactory::isActive(const int pointerId)
+bool PointerEventFactory::isActive(const int pointerId) const
 {
     return m_pointerIdMapping.contains(pointerId);
 }
 
-bool PointerEventFactory::isActiveButtonsState(const int pointerId)
+bool PointerEventFactory::isActiveButtonsState(const int pointerId) const
 {
     return m_pointerIdMapping.contains(pointerId)
         && m_pointerIdMapping.get(pointerId).isActiveButtons;
 }
 
+int PointerEventFactory::getPointerEventId(
+    const WebPointerProperties& properties) const
+{
+    if (properties.pointerType
+        == WebPointerProperties::PointerType::Mouse)
+        return PointerEventFactory::s_mouseId;
+    IncomingId id(properties.pointerType, properties.id);
+    if (m_pointerIncomingIdMapping.contains(id))
+        return m_pointerIncomingIdMapping.get(id);
+    return PointerEventFactory::s_invalidId;
+}
+
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/events/PointerEventFactory.h b/third_party/WebKit/Source/core/events/PointerEventFactory.h
index aa155ce5..7c96f41c 100644
--- a/third_party/WebKit/Source/core/events/PointerEventFactory.h
+++ b/third_party/WebKit/Source/core/events/PointerEventFactory.h
@@ -36,8 +36,8 @@
 
     PointerEvent* create(const AtomicString& type,
         const PlatformTouchPoint&, PlatformEvent::Modifiers,
-        const double width, const double height,
-        const double clientX, const double clientY);
+        const FloatSize& pointRadius,
+        const FloatPoint& pagePoint);
 
     PointerEvent* createPointerCancelEvent(
         const int pointerId, const WebPointerProperties::PointerType);
@@ -62,16 +62,20 @@
     bool remove(const int);
 
     // Returns all ids of the given pointerType.
-    Vector<int> getPointerIdsOfType(WebPointerProperties::PointerType);
+    Vector<int> getPointerIdsOfType(WebPointerProperties::PointerType) const;
 
-    // Returns whether a pointer id exists and active
-    bool isActive(const int);
+    // Returns whether a pointer id exists and active.
+    bool isActive(const int) const;
 
-    // Returns type of pointer id if exists, otherwise Unknown
-    WebPointerProperties::PointerType getPointerType(const int);
+    // Returns type of pointer id if exists, otherwise Unknown.
+    WebPointerProperties::PointerType getPointerType(const int) const;
 
-    // Returns whether a pointer id exists and has at least one pressed button
-    bool isActiveButtonsState(const int);
+    // Returns whether a pointer id exists and has at least one pressed button.
+    bool isActiveButtonsState(const int) const;
+
+    // Returns the id of the pointer event corresponding to the given pointer
+    // properties if exists otherwise s_invalidId.
+    int getPointerEventId(const WebPointerProperties&) const;
 
 private:
     typedef WTF::UnsignedWithZeroKeyHashTraits<int> UnsignedHash;
diff --git a/third_party/WebKit/Source/core/events/PointerEventFactoryTest.cpp b/third_party/WebKit/Source/core/events/PointerEventFactoryTest.cpp
index b0ed7c91..359f2733 100644
--- a/third_party/WebKit/Source/core/events/PointerEventFactoryTest.cpp
+++ b/third_party/WebKit/Source/core/events/PointerEventFactoryTest.cpp
@@ -101,7 +101,7 @@
     PlatformTouchPoint::TouchState state)
 {
     PointerEvent* pointerEvent = m_pointerEventFactory.create(
-        EventTypeNames::pointerdown, PointerEventFactoryTest::PlatformTouchPointBuilder(pointerType, rawId, state), PlatformEvent::NoModifiers, 0, 0, 0, 0);
+        EventTypeNames::pointerdown, PointerEventFactoryTest::PlatformTouchPointBuilder(pointerType, rawId, state), PlatformEvent::NoModifiers, FloatSize(), FloatPoint());
     EXPECT_EQ(uniqueId, pointerEvent->pointerId());
     EXPECT_EQ(isPrimary, pointerEvent->isPrimary());
     return pointerEvent;
diff --git a/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp b/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp
index 78ebcd9..c69e188 100644
--- a/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp
+++ b/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp
@@ -185,14 +185,17 @@
 
     if (m_parsedStyleSheetCache)
         m_parsedStyleSheetCache->removedFromMemoryCache();
+
+    if (!memoryCache()->contains(this)) {
+        // This stylesheet resource did conflict with another resource and was
+        // not added to the cache.
+        m_parsedStyleSheetCache = nullptr;
+        return;
+    }
     m_parsedStyleSheetCache = sheet;
+    m_parsedStyleSheetCache->addedToMemoryCache();
 
     setDecodedSize(m_parsedStyleSheetCache->estimatedSizeInBytes());
-
-    // Check if this stylesheet resource didn't conflict with
-    // another resource and has indeed been added to the cache.
-    if (memoryCache()->contains(this))
-        m_parsedStyleSheetCache->addedToMemoryCache();
 }
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/fetch/Resource.cpp b/third_party/WebKit/Source/core/fetch/Resource.cpp
index cf9ef1e..6c234087 100644
--- a/third_party/WebKit/Source/core/fetch/Resource.cpp
+++ b/third_party/WebKit/Source/core/fetch/Resource.cpp
@@ -702,7 +702,7 @@
 {
     if (!m_loader)
         return;
-    if (m_type == MainResource || m_type == Raw || !memoryCache()->contains(this))
+    if (m_type == Raw)
         cancelTimerFired(&m_cancelTimer);
     else if (!m_cancelTimer.isActive())
         m_cancelTimer.startOneShot(0, BLINK_FROM_HERE);
diff --git a/third_party/WebKit/Source/core/frame/Deprecation.cpp b/third_party/WebKit/Source/core/frame/Deprecation.cpp
index 639633f..8bb12b52 100644
--- a/third_party/WebKit/Source/core/frame/Deprecation.cpp
+++ b/third_party/WebKit/Source/core/frame/Deprecation.cpp
@@ -370,6 +370,9 @@
     case UseCounter::EncryptedMediaAllSelectedContentTypesMissingCodecs:
         return "contentType strings without codecs will not be supported by requestMediaKeySystemAccess() in the future. Please specify the desired codec(s) as part of the contentType.";
 
+    case UseCounter::V8KeyboardEvent_KeyIdentifier_AttributeGetter:
+        return willBeRemoved("'KeyboardEvent.keyIdentifier'", 53, "5316065118650368");
+
     // Features that aren't deprecated don't have a deprecation message.
     default:
         return String();
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.cpp b/third_party/WebKit/Source/core/frame/UseCounter.cpp
index e01e14f..10f1fc7 100644
--- a/third_party/WebKit/Source/core/frame/UseCounter.cpp
+++ b/third_party/WebKit/Source/core/frame/UseCounter.cpp
@@ -43,11 +43,6 @@
 
 int UseCounter::m_muteCount = 0;
 
-// FIXME : This mapping should be autogenerated. This function should
-//         be moved to a separate file and a script run at build time
-//         to detect new values in CSSPropertyID and add them to the
-//         end of this function. This file would be checked in.
-//         https://code.google.com/p/chromium/issues/detail?id=234940
 int UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(int id)
 {
     CSSPropertyID cssPropertyID = static_cast<CSSPropertyID>(id);
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.h b/third_party/WebKit/Source/core/frame/UseCounter.h
index 5b2de29..041542f 100644
--- a/third_party/WebKit/Source/core/frame/UseCounter.h
+++ b/third_party/WebKit/Source/core/frame/UseCounter.h
@@ -1140,6 +1140,15 @@
         CompositedReplication = 1322,
         EncryptedMediaAllSelectedContentTypesHaveCodecs = 1323,
         EncryptedMediaAllSelectedContentTypesMissingCodecs = 1324,
+        V8DataTransferItem_WebkitGetAsEntry_Method = 1325,
+        V8HTMLInputElement_WebkitEntries_AttributeGetter = 1326,
+        Entry_Filesystem_AttributeGetter_IsolatedFileSystem = 1327,
+        Entry_GetMetadata_Method_IsolatedFileSystem = 1328,
+        Entry_MoveTo_Method_IsolatedFileSystem = 1329,
+        Entry_CopyTo_Method_IsolatedFileSystem = 1330,
+        Entry_Remove_Method_IsolatedFileSystem = 1331,
+        Entry_GetParent_Method_IsolatedFileSystem = 1332,
+        Entry_ToURL_Method_IsolatedFileSystem = 1333,
 
         // Add new features immediately above this line. Don't change assigned
         // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/WebKit/Source/core/html/AutoplayExperimentHelper.cpp b/third_party/WebKit/Source/core/html/AutoplayExperimentHelper.cpp
index 80ead25..8c54ab1 100644
--- a/third_party/WebKit/Source/core/html/AutoplayExperimentHelper.cpp
+++ b/third_party/WebKit/Source/core/html/AutoplayExperimentHelper.cpp
@@ -39,7 +39,7 @@
 {
     m_mode = fromString(this->client().autoplayExperimentMode());
 
-    if (m_mode != Mode::ExperimentOff) {
+    if (isExperimentEnabled()) {
         WTF_LOG(Media, "HTMLMediaElement: autoplay experiment set to %d",
             m_mode);
     }
@@ -301,6 +301,10 @@
     if (m_mode == Mode::ExperimentOff)
         return false;
 
+    // If autoplay is disabled, no one is eligible.
+    if (!client().isAutoplayAllowedPerSettings())
+        return false;
+
     // If no user gesture is required, then the experiment doesn't apply.
     // This is what prevents us from starting playback more than once.
     // Since this flag is never set to true once it's cleared, it will block
@@ -496,4 +500,9 @@
     return enabled(IfViewport) || enabled(IfPartialViewport);
 }
 
+bool AutoplayExperimentHelper::isExperimentEnabled()
+{
+    return m_mode != Mode::ExperimentOff;
+}
+
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/html/AutoplayExperimentHelper.h b/third_party/WebKit/Source/core/html/AutoplayExperimentHelper.h
index ea7a3ed9..381083a 100644
--- a/third_party/WebKit/Source/core/html/AutoplayExperimentHelper.h
+++ b/third_party/WebKit/Source/core/html/AutoplayExperimentHelper.h
@@ -126,6 +126,7 @@
 
         // Frame
         virtual bool isCrossOrigin() const = 0;
+        virtual bool isAutoplayAllowedPerSettings() const = 0;
 
         // LayoutObject
         virtual void setRequestPositionUpdates(bool) = 0;
@@ -154,6 +155,10 @@
     void playbackStopped();
     void initialPlayWithUserGesture();
 
+    // Returns true if and only if any experiment is enabled (i.e., |m_mode|
+    // is not ExperimentOff).
+    bool isExperimentEnabled();
+
     // Clean up.  For Oilpan, this means "early in HTMLMediaElement's dispose".
     // For non-Oilpan, just delete the object.
     void dispose();
diff --git a/third_party/WebKit/Source/core/html/AutoplayExperimentTest.cpp b/third_party/WebKit/Source/core/html/AutoplayExperimentTest.cpp
index 57394e5..9a8705a 100644
--- a/third_party/WebKit/Source/core/html/AutoplayExperimentTest.cpp
+++ b/third_party/WebKit/Source/core/html/AutoplayExperimentTest.cpp
@@ -54,6 +54,8 @@
             .WillByDefault(Return(PageVisibilityStateVisible));
         ON_CALL(*this, isCrossOrigin())
             .WillByDefault(Return(false));
+        ON_CALL(*this, isAutoplayAllowedPerSettings())
+            .WillByDefault(Return(true));
         ON_CALL(*this, absoluteBoundingBoxRect())
             .WillByDefault(Return(
                 IntRect(10, 10, 100, 100)));
@@ -88,6 +90,7 @@
     MOCK_CONST_METHOD0(pageVisibilityState, PageVisibilityState());
     MOCK_CONST_METHOD0(autoplayExperimentMode, String());
     MOCK_CONST_METHOD0(isCrossOrigin, bool());
+    MOCK_CONST_METHOD0(isAutoplayAllowedPerSettings, bool());
     MOCK_METHOD1(setRequestPositionUpdates, void(bool));
     MOCK_CONST_METHOD0(absoluteBoundingBoxRect, IntRect());
 
diff --git a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
index 0957206..9ae9d1d0 100644
--- a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
@@ -324,6 +324,8 @@
         return frame && frame->isCrossOrigin();
     }
 
+    bool isAutoplayAllowedPerSettings() const override;
+
     // LayoutObject
     void setRequestPositionUpdates(bool) override;
     IntRect absoluteBoundingBoxRect() const override;
@@ -441,8 +443,12 @@
 
     WTF_LOG(Media, "HTMLMediaElement::HTMLMediaElement(%p)", this);
 
-    if (document.settings() && document.settings()->mediaPlaybackRequiresUserGesture())
+    // If any experiment is enabled, then we want to enable a user gesture by
+    // default, otherwise the experiment does nothing.
+    if ((document.settings() && document.settings()->mediaPlaybackRequiresUserGesture())
+        || m_autoplayHelper->isExperimentEnabled()) {
         m_userGestureRequiredForPlay = true;
+    }
 
     setHasCustomStyleCallbacks();
     addElementToDocumentMap(this, &document);
@@ -3751,8 +3757,10 @@
 
 void HTMLMediaElement::clearWeakMembers(Visitor* visitor)
 {
-    if (!ThreadHeap::isHeapObjectAlive(m_audioSourceNode))
+    if (!ThreadHeap::isHeapObjectAlive(m_audioSourceNode)) {
         getAudioSourceProvider().setClient(nullptr);
+        m_audioSourceNode = nullptr;
+    }
 }
 
 void HTMLMediaElement::AudioSourceProviderImpl::wrap(WebAudioSourceProvider* provider)
@@ -3838,6 +3846,15 @@
     return mode;
 }
 
+bool HTMLMediaElement::AutoplayHelperClientImpl::isAutoplayAllowedPerSettings() const
+{
+    LocalFrame* frame = m_element->document().frame();
+    if (!frame)
+        return false;
+    FrameLoaderClient* frameLoaderClient = frame->loader().client();
+    return frameLoaderClient && frameLoaderClient->allowAutoplay(false);
+}
+
 void HTMLMediaElement::AutoplayHelperClientImpl::setRequestPositionUpdates(bool request)
 {
     if (LayoutObject* layoutObject = m_element->layoutObject()) {
diff --git a/third_party/WebKit/Source/core/html/HTMLMeterElement.cpp b/third_party/WebKit/Source/core/html/HTMLMeterElement.cpp
index ad35299..a1f927f 100644
--- a/third_party/WebKit/Source/core/html/HTMLMeterElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLMeterElement.cpp
@@ -30,6 +30,7 @@
 #include "core/html/HTMLContentElement.h"
 #include "core/html/HTMLDivElement.h"
 #include "core/html/parser/HTMLParserIdioms.h"
+#include "core/html/shadow/AppearanceSwitchElement.h"
 #include "core/layout/LayoutObject.h"
 #include "core/style/ComputedStyle.h"
 
@@ -37,70 +38,6 @@
 
 using namespace HTMLNames;
 
-// ----------------------------------------------------------------
-
-class MeterFallbackElement final : public HTMLDivElement {
-public:
-    DECLARE_NODE_FACTORY(MeterFallbackElement);
-
-private:
-    explicit MeterFallbackElement(Document& doc)
-        : HTMLDivElement(doc)
-    {
-        setHasCustomStyleCallbacks();
-    }
-
-    PassRefPtr<ComputedStyle> customStyleForLayoutObject() override
-    {
-        // We can't use setInlineStyleProperty() because it updates the DOM
-        // tree.  We shouldn't do it during style calculation.
-        // TODO(tkent): Injecting a CSS variable by host is a better approach?
-        Element* host = shadowHost();
-        RefPtr<ComputedStyle> style = originalStyleForLayoutObject();
-        if (!host || !host->computedStyle() || host->computedStyle()->appearance() != MeterPart || style->display() == NONE)
-            return style.release();
-        RefPtr<ComputedStyle> newStyle = ComputedStyle::clone(*style);
-        newStyle->setDisplay(NONE);
-        newStyle->setUnique();
-        return newStyle.release();
-    }
-};
-
-DEFINE_NODE_FACTORY(MeterFallbackElement)
-
-// ----------------------------------------------------------------
-
-class MeterInnerElement final : public HTMLDivElement {
-public:
-    DECLARE_NODE_FACTORY(MeterInnerElement);
-
-private:
-    explicit MeterInnerElement(Document& doc)
-        : HTMLDivElement(doc)
-    {
-        setHasCustomStyleCallbacks();
-    }
-
-    PassRefPtr<ComputedStyle> customStyleForLayoutObject() override
-    {
-        // We can't use setInlineStyleProperty() because it updates the DOM
-        // tree.  We shouldn't do it during style calculation.
-        // TODO(tkent): Injecting a CSS variable by host is a better approach?
-        Element* host = shadowHost();
-        RefPtr<ComputedStyle> style = originalStyleForLayoutObject();
-        if (!host || !host->computedStyle() || host->computedStyle()->appearance() == MeterPart || style->display() == NONE)
-            return style.release();
-        RefPtr<ComputedStyle> newStyle = ComputedStyle::clone(*style);
-        newStyle->setDisplay(NONE);
-        newStyle->setUnique();
-        return newStyle.release();
-    }
-};
-
-DEFINE_NODE_FACTORY(MeterInnerElement)
-
-// ----------------------------------------------------------------
-
 HTMLMeterElement::HTMLMeterElement(Document& document)
     : LabelableElement(meterTag, document)
 {
@@ -258,7 +195,7 @@
 {
     ASSERT(!m_value);
 
-    MeterInnerElement* inner = MeterInnerElement::create(document());
+    AppearanceSwitchElement* inner = AppearanceSwitchElement::create(document(), AppearanceSwitchElement::ShowIfHostHasAppearance);
     inner->setShadowPseudoId(AtomicString("-webkit-meter-inner-element"));
     root.appendChild(inner);
 
@@ -271,7 +208,7 @@
 
     inner->appendChild(bar);
 
-    MeterFallbackElement* fallback = MeterFallbackElement::create(document());
+    AppearanceSwitchElement* fallback = AppearanceSwitchElement::create(document(), AppearanceSwitchElement::ShowIfHostHasNoAppearance);
     fallback->appendChild(HTMLContentElement::create(document()));
     root.appendChild(fallback);
 }
diff --git a/third_party/WebKit/Source/core/html/MediaDocument.cpp b/third_party/WebKit/Source/core/html/MediaDocument.cpp
index 8636dfa..2d1b5d7 100644
--- a/third_party/WebKit/Source/core/html/MediaDocument.cpp
+++ b/third_party/WebKit/Source/core/html/MediaDocument.cpp
@@ -183,14 +183,14 @@
             "margin-top: 32px;"
             "padding: 0 16px 0 16px;"
             "height: 36px;"
-            "background: #4285F4;"
+            "background: #000000;"
+            "-webkit-tap-highlight-color: rgb(12%, 12%, 12%);"
             "font-family: Roboto;"
             "font-size: 14px;"
             "border-radius: 5px;"
             "color: white;"
-            "font-weight: bold;"
+            "font-weight: 500;"
             "text-decoration: none;"
-            "min-width: 300px;"
             "line-height: 36px;");
         EventListener* listener = MediaDownloadEventListener::create();
         anchor->addEventListener(EventTypeNames::click, listener, false);
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp
index 6d7c97bc..86acd77 100644
--- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp
+++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp
@@ -26,6 +26,22 @@
 const int NumChannelsPng = 4;
 const int LongTaskImageSizeThreshold = 1000 * 1000; // The max image size we expect to encode in 14ms on Linux in PNG format
 
+// The encoding task is highly likely to switch from idle task to alternative
+// code path when the startTimeoutDelay is set to be below 150ms. As we want the
+// majority of encoding tasks to take the usual async idle task, we set a
+// lenient limit -- 200ms here. This limit still needs to be short enough for
+// the latency to be negligible to the user.
+const double IdleTaskStartTimeoutDelay = 200.0;
+// We should be more lenient on completion timeout delay to ensure that the
+// switch from idle to main thread only happens to a minority of toBlob calls
+#if !OS(ANDROID)
+// Png image encoding on 4k by 4k canvas on Mac HDD takes 5.7+ seconds
+const double IdleTaskCompleteTimeoutDelay = 6700.0;
+#else
+// Png image encoding on 4k by 4k canvas on Android One takes 9.0+ seconds
+const double IdleTaskCompleteTimeoutDelay = 10000.0;
+#endif
+
 bool isDeadlineNearOrPassed(double deadlineSeconds)
 {
     return (deadlineSeconds - SlackBeforeDeadline - monotonicallyIncreasingTime() <= 0);
@@ -47,6 +63,7 @@
     ASSERT(m_data->length() == (unsigned) (size.height() * size.width() * 4));
     m_encodedImage = adoptPtr(new Vector<unsigned char>());
     m_pixelRowStride = size.width() * NumChannelsPng;
+    m_idleTaskStatus = IdleTaskNotSupported;
     m_numRowsCompleted = 0;
 }
 
@@ -56,15 +73,19 @@
 
 void CanvasAsyncBlobCreator::scheduleAsyncBlobCreation(bool canUseIdlePeriodScheduling, double quality)
 {
-    // TODO: async blob creation should be supported in worker_pool threads as well. but right now blink does not have that
     ASSERT(isMainThread());
 
-    // At the time being, progressive encoding is only applicable to png image format,
-    // and thus idle tasks scheduling can only be applied to png image format.
-    // TODO(xlai): Progressive encoding on jpeg and webp image formats (crbug.com/571398, crbug.com/571399)
     if (canUseIdlePeriodScheduling) {
+        // At the time being, progressive encoding is only applicable to png image format,
+        // and thus idle tasks scheduling can only be applied to png image format.
+        // TODO(xlai): Progressive encoding on jpeg and webp image formats (crbug.com/571398, crbug.com/571399)
         ASSERT(m_mimeType == "image/png");
-        Platform::current()->mainThread()->scheduler()->postIdleTask(BLINK_FROM_HERE, bind<double>(&CanvasAsyncBlobCreator::initiatePngEncoding, this));
+        m_idleTaskStatus = IdleTaskNotStarted;
+
+        this->scheduleInitiatePngEncoding();
+        // We post the below task to check if the above idle task isn't late.
+        // There's no risk of concurrency as both tasks are on main thread.
+        this->postDelayedTaskToMainThread(BLINK_FROM_HERE, new SameThreadTask(bind(&CanvasAsyncBlobCreator::idleTaskStartTimeoutEvent, this, quality)), IdleTaskStartTimeoutDelay);
     } else if (m_mimeType == "image/jpeg") {
         Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::initiateJpegEncoding, this, quality));
     } else {
@@ -77,39 +98,47 @@
 {
     m_jpegEncoderState = JPEGImageEncoderState::create(m_size, quality, m_encodedImage.get());
     if (!m_jpegEncoderState) {
-        Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&BlobCallback::handleEvent, m_callback, nullptr));
+        this->createNullAndInvokeCallback();
         return;
     }
     BackgroundTaskRunner::TaskSize taskSize = (m_size.height() * m_size.width() >= LongTaskImageSizeThreshold) ? BackgroundTaskRunner::TaskSizeLongRunningTask : BackgroundTaskRunner::TaskSizeShortRunningTask;
     BackgroundTaskRunner::postOnBackgroundThread(BLINK_FROM_HERE, threadSafeBind(&CanvasAsyncBlobCreator::encodeImageOnEncoderThread, AllowCrossThreadAccess(this), quality), taskSize);
 }
 
+void CanvasAsyncBlobCreator::scheduleInitiatePngEncoding()
+{
+    Platform::current()->mainThread()->scheduler()->postIdleTask(BLINK_FROM_HERE, bind<double>(&CanvasAsyncBlobCreator::initiatePngEncoding, this));
+}
+
 void CanvasAsyncBlobCreator::initiatePngEncoding(double deadlineSeconds)
 {
     ASSERT(isMainThread());
-    m_pngEncoderState = PNGImageEncoderState::create(m_size, m_encodedImage.get());
-    if (!m_pngEncoderState) {
-        Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&BlobCallback::handleEvent, m_callback, nullptr));
+    if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) {
         return;
     }
 
-    CanvasAsyncBlobCreator::idleEncodeRowsPng(deadlineSeconds);
-}
+    ASSERT(m_idleTaskStatus == IdleTaskNotStarted);
+    m_idleTaskStatus = IdleTaskStarted;
 
-void CanvasAsyncBlobCreator::scheduleIdleEncodeRowsPng()
-{
-    ASSERT(isMainThread());
-    Platform::current()->currentThread()->scheduler()->postIdleTask(BLINK_FROM_HERE, WTF::bind<double>(&CanvasAsyncBlobCreator::idleEncodeRowsPng, this));
+    if (!initializePngStruct()) {
+        m_idleTaskStatus = IdleTaskFailed;
+        return;
+    }
+    this->idleEncodeRowsPng(deadlineSeconds);
 }
 
 void CanvasAsyncBlobCreator::idleEncodeRowsPng(double deadlineSeconds)
 {
     ASSERT(isMainThread());
+    if (m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask) {
+        return;
+    }
+
     unsigned char* inputPixels = m_data->data() + m_pixelRowStride * m_numRowsCompleted;
     for (int y = m_numRowsCompleted; y < m_size.height(); ++y) {
         if (isDeadlineNearOrPassed(deadlineSeconds)) {
             m_numRowsCompleted = y;
-            CanvasAsyncBlobCreator::scheduleIdleEncodeRowsPng();
+            Platform::current()->currentThread()->scheduler()->postIdleTask(BLINK_FROM_HERE, bind<double>(&CanvasAsyncBlobCreator::idleEncodeRowsPng, this));
             return;
         }
         PNGImageEncoder::writeOneRowToPng(inputPixels, m_pngEncoderState.get());
@@ -118,17 +147,50 @@
     m_numRowsCompleted = m_size.height();
     PNGImageEncoder::finalizePng(m_pngEncoderState.get());
 
-    if (isDeadlineNearOrPassed(deadlineSeconds))
-        Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::createBlobAndCall, this));
-    else
-        this->createBlobAndCall();
+    m_idleTaskStatus = IdleTaskCompleted;
+
+    if (isDeadlineNearOrPassed(deadlineSeconds)) {
+        Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::createBlobAndInvokeCallback, this));
+    } else {
+        this->createBlobAndInvokeCallback();
+    }
 }
 
-void CanvasAsyncBlobCreator::createBlobAndCall()
+void CanvasAsyncBlobCreator::encodeRowsPngOnMainThread()
+{
+    ASSERT(m_idleTaskStatus == IdleTaskSwitchedToMainThreadTask);
+
+    // Continue encoding from the last completed row
+    unsigned char* inputPixels = m_data->data() + m_pixelRowStride * m_numRowsCompleted;
+    for (int y = m_numRowsCompleted; y < m_size.height(); ++y) {
+        PNGImageEncoder::writeOneRowToPng(inputPixels, m_pngEncoderState.get());
+        inputPixels += m_pixelRowStride;
+    }
+    PNGImageEncoder::finalizePng(m_pngEncoderState.get());
+    this->createBlobAndInvokeCallback();
+
+    this->signalAlternativeCodePathFinishedForTesting();
+}
+
+void CanvasAsyncBlobCreator::createBlobAndInvokeCallback()
 {
     ASSERT(isMainThread());
     Blob* resultBlob = Blob::create(m_encodedImage->data(), m_encodedImage->size(), m_mimeType);
     Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&BlobCallback::handleEvent, m_callback, resultBlob));
+    // Since toBlob is done, timeout events are no longer needed. So we clear
+    // non-GC members to allow teardown of CanvasAsyncBlobCreator.
+    m_data.clear();
+    m_callback.clear();
+}
+
+void CanvasAsyncBlobCreator::createNullAndInvokeCallback()
+{
+    ASSERT(isMainThread());
+    Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&BlobCallback::handleEvent, m_callback, nullptr));
+    // Since toBlob is done (failed), timeout events are no longer needed. So we
+    // clear non-GC members to allow teardown of CanvasAsyncBlobCreator.
+    m_data.clear();
+    m_callback.clear();
 }
 
 void CanvasAsyncBlobCreator::encodeImageOnEncoderThread(double quality)
@@ -146,7 +208,62 @@
         return;
     }
 
-    Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&CanvasAsyncBlobCreator::createBlobAndCall, AllowCrossThreadAccess(this)));
+    Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&CanvasAsyncBlobCreator::createBlobAndInvokeCallback, AllowCrossThreadAccess(this)));
+}
+
+bool CanvasAsyncBlobCreator::initializePngStruct()
+{
+    m_pngEncoderState = PNGImageEncoderState::create(m_size, m_encodedImage.get());
+    if (!m_pngEncoderState) {
+        this->createNullAndInvokeCallback();
+        return false;
+    }
+    return true;
+}
+
+
+void CanvasAsyncBlobCreator::idleTaskStartTimeoutEvent(double quality)
+{
+    if (m_idleTaskStatus == IdleTaskStarted) {
+        // Even if the task started quickly, we still want to ensure completion
+        this->postDelayedTaskToMainThread(BLINK_FROM_HERE, new SameThreadTask(bind(&CanvasAsyncBlobCreator::idleTaskCompleteTimeoutEvent, this)), IdleTaskCompleteTimeoutDelay);
+    } else if (m_idleTaskStatus == IdleTaskNotStarted) {
+        // If the idle task does not start after a delay threshold, we will
+        // force it to happen on main thread (even though it may cause more
+        // janks) to prevent toBlob being postponed forever in extreme cases.
+        m_idleTaskStatus = IdleTaskSwitchedToMainThreadTask;
+        signalTaskSwitchInStartTimeoutEventForTesting();
+        if (initializePngStruct()) {
+            Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::encodeRowsPngOnMainThread, this));
+        } else {
+            // Failing in initialization of png struct
+            this->signalAlternativeCodePathFinishedForTesting();
+        }
+    } else {
+        ASSERT(m_idleTaskStatus == IdleTaskFailed || m_idleTaskStatus == IdleTaskCompleted);
+        this->signalAlternativeCodePathFinishedForTesting();
+    }
+
+}
+
+void CanvasAsyncBlobCreator::idleTaskCompleteTimeoutEvent()
+{
+    ASSERT(m_idleTaskStatus != IdleTaskNotStarted);
+
+    if (m_idleTaskStatus == IdleTaskStarted) {
+        // It has taken too long to complete for the idle task.
+        m_idleTaskStatus = IdleTaskSwitchedToMainThreadTask;
+        signalTaskSwitchInCompleteTimeoutEventForTesting();
+        Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::encodeRowsPngOnMainThread, this));
+    } else {
+        ASSERT(m_idleTaskStatus == IdleTaskFailed || m_idleTaskStatus == IdleTaskCompleted);
+        this->signalAlternativeCodePathFinishedForTesting();
+    }
+}
+
+void CanvasAsyncBlobCreator::postDelayedTaskToMainThread(const WebTraceLocation& location, SameThreadTask* task, double delayMs)
+{
+    Platform::current()->mainThread()->getWebTaskRunner()->postDelayedTask(location, task, delayMs);
 }
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h
index 24c682a9..3f038c276a 100644
--- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h
+++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h
@@ -5,6 +5,7 @@
 #include "core/CoreExport.h"
 #include "core/dom/DOMTypedArray.h"
 #include "core/fileapi/BlobCallback.h"
+#include "platform/Task.h"
 #include "platform/geometry/IntSize.h"
 #include "platform/heap/Handle.h"
 #include "wtf/OwnPtr.h"
@@ -21,14 +22,38 @@
     static CanvasAsyncBlobCreator* create(DOMUint8ClampedArray* unpremultipliedRGBAImageData, const String& mimeType, const IntSize&, BlobCallback*);
     void scheduleAsyncBlobCreation(bool canUseIdlePeriodScheduling, double quality = 0.0);
     virtual ~CanvasAsyncBlobCreator();
+    enum IdleTaskStatus {
+        IdleTaskNotStarted,
+        IdleTaskStarted,
+        IdleTaskCompleted,
+        IdleTaskFailed,
+        IdleTaskSwitchedToMainThreadTask,
+        IdleTaskNotSupported // Idle tasks are not implemented for some image types
+    };
+    // Methods are virtual for mocking in unit tests
+    virtual void signalTaskSwitchInStartTimeoutEventForTesting() { }
+    virtual void signalTaskSwitchInCompleteTimeoutEventForTesting() { }
 
     DEFINE_INLINE_VIRTUAL_TRACE()
     {
         visitor->trace(m_data);
     }
 
-private:
+protected:
     CanvasAsyncBlobCreator(DOMUint8ClampedArray* data, const String& mimeType, const IntSize&, BlobCallback*);
+    // Methods are virtual for unit testing
+    virtual void scheduleInitiatePngEncoding();
+    virtual void idleEncodeRowsPng(double deadlineSeconds);
+    virtual void postDelayedTaskToMainThread(const WebTraceLocation&, SameThreadTask*, double delayMs);
+    virtual void signalAlternativeCodePathFinishedForTesting() { }
+    virtual void createBlobAndInvokeCallback();
+    virtual void createNullAndInvokeCallback();
+
+    void initiatePngEncoding(double deadlineSeconds);
+    IdleTaskStatus m_idleTaskStatus;
+
+private:
+    friend class CanvasAsyncBlobCreatorTest;
 
     OwnPtr<PNGImageEncoderState> m_pngEncoderState;
     OwnPtr<JPEGImageEncoderState> m_jpegEncoderState;
@@ -41,15 +66,16 @@
     const String m_mimeType;
     CrossThreadPersistent<BlobCallback> m_callback;
 
-    void initiatePngEncoding(double deadlineSeconds);
     void scheduleIdleEncodeRowsPng();
-    void idleEncodeRowsPng(double deadlineSeconds);
+
+    bool initializePngStruct();
+    void encodeRowsPngOnMainThread(); // Similar to idleEncodeRowsPng without deadline
+    void encodeImageOnEncoderThread(double quality);
 
     void initiateJpegEncoding(const double& quality);
 
-    void createBlobAndCall();
-
-    void encodeImageOnEncoderThread(double quality);
+    void idleTaskStartTimeoutEvent(double quality);
+    void idleTaskCompleteTimeoutEvent();
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreatorTest.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreatorTest.cpp
new file mode 100644
index 0000000..7ac15c7
--- /dev/null
+++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreatorTest.cpp
@@ -0,0 +1,188 @@
+// Copyright 2016 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 "core/html/canvas/CanvasAsyncBlobCreator.h"
+
+#include "core/html/ImageData.h"
+#include "platform/Task.h"
+#include "platform/testing/UnitTestHelpers.h"
+#include "public/platform/Platform.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "wtf/Functional.h"
+
+namespace blink {
+
+typedef CanvasAsyncBlobCreator::IdleTaskStatus IdleTaskStatus;
+
+class MockCanvasAsyncBlobCreator : public CanvasAsyncBlobCreator {
+public:
+    MockCanvasAsyncBlobCreator(DOMUint8ClampedArray* data, const IntSize& size)
+        : CanvasAsyncBlobCreator(data, "image/png", size, nullptr)
+    {
+    }
+
+    CanvasAsyncBlobCreator::IdleTaskStatus idleTaskStatus()
+    {
+        return m_idleTaskStatus;
+    }
+
+    MOCK_METHOD0(signalTaskSwitchInStartTimeoutEventForTesting, void());
+    MOCK_METHOD0(signalTaskSwitchInCompleteTimeoutEventForTesting, void());
+
+protected:
+    void createBlobAndInvokeCallback() override { };
+    void createNullAndInvokeCallback() override { };
+    void signalAlternativeCodePathFinishedForTesting() override;
+    void postDelayedTaskToMainThread(const WebTraceLocation&, SameThreadTask*, double delayMs) override;
+};
+
+void MockCanvasAsyncBlobCreator::signalAlternativeCodePathFinishedForTesting()
+{
+    testing::exitRunLoop();
+}
+
+void MockCanvasAsyncBlobCreator::postDelayedTaskToMainThread(const WebTraceLocation& location, SameThreadTask* task, double delayMs)
+{
+    Platform::current()->mainThread()->getWebTaskRunner()->postTask(location, task);
+}
+
+//==============================================================================
+
+class MockCanvasAsyncBlobCreatorWithoutStart : public MockCanvasAsyncBlobCreator {
+public:
+    MockCanvasAsyncBlobCreatorWithoutStart(DOMUint8ClampedArray* data, const IntSize& size)
+        : MockCanvasAsyncBlobCreator(data, size)
+    {
+    }
+
+protected:
+    void scheduleInitiatePngEncoding() override
+    {
+        // Deliberately make scheduleInitiatePngEncoding do nothing so that idle task never starts
+    }
+};
+
+//==============================================================================
+
+class MockCanvasAsyncBlobCreatorWithoutComplete : public MockCanvasAsyncBlobCreator {
+public:
+    MockCanvasAsyncBlobCreatorWithoutComplete(DOMUint8ClampedArray* data, const IntSize& size)
+        : MockCanvasAsyncBlobCreator(data, size)
+    {
+    }
+
+protected:
+    void scheduleInitiatePngEncoding() override
+    {
+        Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE,
+        bind(&MockCanvasAsyncBlobCreatorWithoutComplete::initiatePngEncoding, this, std::numeric_limits<double>::max()));
+    }
+
+    void idleEncodeRowsPng(double deadlineSeconds) override
+    {
+        // Deliberately make idleEncodeRowsPng do nothing so that idle task never completes
+    }
+};
+
+//==============================================================================
+
+class CanvasAsyncBlobCreatorTest : public ::testing::Test {
+public:
+    void prepareMockCanvasAsyncBlobCreatorWithoutStart();
+    void prepareMockCanvasAsyncBlobCreatorWithoutComplete();
+    void prepareMockCanvasAsyncBlobCreatorFail();
+
+protected:
+    CanvasAsyncBlobCreatorTest();
+    MockCanvasAsyncBlobCreator* asyncBlobCreator() { return m_asyncBlobCreator.get(); }
+    void TearDown() override;
+
+private:
+    Persistent<MockCanvasAsyncBlobCreator> m_asyncBlobCreator;
+};
+
+CanvasAsyncBlobCreatorTest::CanvasAsyncBlobCreatorTest()
+{
+}
+
+void CanvasAsyncBlobCreatorTest::prepareMockCanvasAsyncBlobCreatorWithoutStart()
+{
+    IntSize testSize(20, 20);
+    ImageData* imageData = ImageData::create(testSize);
+
+    m_asyncBlobCreator = new MockCanvasAsyncBlobCreatorWithoutStart(imageData->data(), testSize);
+}
+
+void CanvasAsyncBlobCreatorTest::prepareMockCanvasAsyncBlobCreatorWithoutComplete()
+{
+    IntSize testSize(20, 20);
+    ImageData* imageData = ImageData::create(testSize);
+
+    m_asyncBlobCreator = new MockCanvasAsyncBlobCreatorWithoutComplete(imageData->data(), testSize);
+}
+
+void CanvasAsyncBlobCreatorTest::prepareMockCanvasAsyncBlobCreatorFail()
+{
+    IntSize testSize(0, 0);
+    ImageData* imageData = ImageData::create(testSize);
+
+    // We reuse the class MockCanvasAsyncBlobCreatorWithoutComplete because this
+    // test case is expected to fail at initialization step before completion.
+    m_asyncBlobCreator = new MockCanvasAsyncBlobCreatorWithoutComplete(imageData->data(), testSize);
+}
+
+void CanvasAsyncBlobCreatorTest::TearDown()
+{
+    m_asyncBlobCreator = nullptr;
+}
+
+//==============================================================================
+
+TEST_F(CanvasAsyncBlobCreatorTest, IdleTaskNotStartedWhenStartTimeoutEventHappens)
+{
+    // This test mocks the scenario when idle task is not started when the
+    // StartTimeoutEvent is inspecting the idle task status.
+    // The whole image encoding process (including initialization)  will then
+    // become carried out in the alternative code path instead.
+    this->prepareMockCanvasAsyncBlobCreatorWithoutStart();
+    EXPECT_CALL(*(asyncBlobCreator()), signalTaskSwitchInStartTimeoutEventForTesting());
+
+    this->asyncBlobCreator()->scheduleAsyncBlobCreation(true);
+    testing::enterRunLoop();
+
+    ::testing::Mock::VerifyAndClearExpectations(asyncBlobCreator());
+    EXPECT_EQ(IdleTaskStatus::IdleTaskSwitchedToMainThreadTask, this->asyncBlobCreator()->idleTaskStatus());
+}
+
+TEST_F(CanvasAsyncBlobCreatorTest, IdleTaskNotCompletedWhenCompleteTimeoutEventHappens)
+{
+    // This test mocks the scenario when idle task is not completed when the
+    // CompleteTimeoutEvent is inspecting the idle task status.
+    // The remaining image encoding process (excluding initialization)  will
+    // then become carried out in the alternative code path instead.
+    this->prepareMockCanvasAsyncBlobCreatorWithoutComplete();
+    EXPECT_CALL(*(asyncBlobCreator()), signalTaskSwitchInCompleteTimeoutEventForTesting());
+
+    this->asyncBlobCreator()->scheduleAsyncBlobCreation(true);
+    testing::enterRunLoop();
+
+    ::testing::Mock::VerifyAndClearExpectations(asyncBlobCreator());
+    EXPECT_EQ(IdleTaskStatus::IdleTaskSwitchedToMainThreadTask, this->asyncBlobCreator()->idleTaskStatus());
+}
+
+TEST_F(CanvasAsyncBlobCreatorTest, IdleTaskFailedWhenStartTimeoutEventHappens)
+{
+    // This test mocks the scenario when idle task is not failed during when
+    // either the StartTimeoutEvent or the CompleteTimeoutEvent is inspecting
+    // the idle task status.
+    this->prepareMockCanvasAsyncBlobCreatorFail();
+
+    this->asyncBlobCreator()->scheduleAsyncBlobCreation(true);
+    testing::enterRunLoop();
+
+    EXPECT_EQ(IdleTaskStatus::IdleTaskFailed, this->asyncBlobCreator()->idleTaskStatus());
+}
+
+}
diff --git a/third_party/WebKit/Source/core/html/shadow/AppearanceSwitchElement.cpp b/third_party/WebKit/Source/core/html/shadow/AppearanceSwitchElement.cpp
new file mode 100644
index 0000000..2ab753d
--- /dev/null
+++ b/third_party/WebKit/Source/core/html/shadow/AppearanceSwitchElement.cpp
@@ -0,0 +1,47 @@
+// Copyright 2016 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 "core/html/shadow/AppearanceSwitchElement.h"
+
+#include "core/dom/NodeComputedStyle.h"
+
+namespace blink {
+
+inline AppearanceSwitchElement::AppearanceSwitchElement(Document& doc, Mode mode)
+    : HTMLDivElement(doc)
+    , m_mode(mode)
+{
+    setHasCustomStyleCallbacks();
+}
+
+AppearanceSwitchElement* AppearanceSwitchElement::create(Document& doc, Mode mode)
+{
+    return new AppearanceSwitchElement(doc, mode);
+}
+
+PassRefPtr<ComputedStyle> AppearanceSwitchElement::customStyleForLayoutObject()
+{
+    // We can't use setInlineStyleProperty() because it updates the DOM tree.
+    // We shouldn't do it during style calculation.
+    // TODO(tkent): Injecting a CSS variable by host is a better approach?
+    Element* host = shadowHost();
+    RefPtr<ComputedStyle> style = originalStyleForLayoutObject();
+    if (!host || !host->computedStyle())
+        return style.release();
+    if (m_mode == ShowIfHostHasAppearance) {
+        if (host->computedStyle()->hasAppearance())
+            return style.release();
+    } else {
+        if (!host->computedStyle()->hasAppearance())
+            return style.release();
+    }
+    if (style->display() == NONE)
+        return style.release();
+    RefPtr<ComputedStyle> newStyle = ComputedStyle::clone(*style);
+    newStyle->setDisplay(NONE);
+    newStyle->setUnique();
+    return newStyle.release();
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/core/html/shadow/AppearanceSwitchElement.h b/third_party/WebKit/Source/core/html/shadow/AppearanceSwitchElement.h
new file mode 100644
index 0000000..a1781b4
--- /dev/null
+++ b/third_party/WebKit/Source/core/html/shadow/AppearanceSwitchElement.h
@@ -0,0 +1,28 @@
+// Copyright 2016 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 AppearanceSwitchElement_h
+#define AppearanceSwitchElement_h
+
+#include "core/html/HTMLDivElement.h"
+
+namespace blink {
+
+class AppearanceSwitchElement final : public HTMLDivElement {
+public:
+    enum Mode {
+        ShowIfHostHasAppearance,
+        ShowIfHostHasNoAppearance,
+    };
+    static AppearanceSwitchElement* create(Document&, Mode);
+
+private:
+    AppearanceSwitchElement(Document&, Mode);
+    PassRefPtr<ComputedStyle> customStyleForLayoutObject() override;
+
+    const Mode m_mode;
+};
+
+} // namespace blink
+#endif // AppearanceSwitchElement_h
diff --git a/third_party/WebKit/Source/core/input/EventHandler.cpp b/third_party/WebKit/Source/core/input/EventHandler.cpp
index 5f643cf8..dbc20349 100644
--- a/third_party/WebKit/Source/core/input/EventHandler.cpp
+++ b/third_party/WebKit/Source/core/input/EventHandler.cpp
@@ -59,7 +59,6 @@
 #include "core/frame/TopControls.h"
 #include "core/frame/UseCounter.h"
 #include "core/frame/VisualViewport.h"
-#include "core/html/HTMLCanvasElement.h"
 #include "core/html/HTMLDialogElement.h"
 #include "core/html/HTMLFrameElementBase.h"
 #include "core/html/HTMLFrameSetElement.h"
@@ -89,7 +88,6 @@
 #include "core/paint/PaintLayer.h"
 #include "core/style/ComputedStyle.h"
 #include "core/svg/SVGDocumentExtensions.h"
-#include "platform/Histogram.h"
 #include "platform/PlatformGestureEvent.h"
 #include "platform/PlatformKeyboardEvent.h"
 #include "platform/PlatformTouchEvent.h"
@@ -111,33 +109,6 @@
 
 namespace {
 
-bool hasTouchHandlers(const EventHandlerRegistry& registry)
-{
-    return registry.hasEventHandlers(EventHandlerRegistry::TouchStartOrMoveEventBlocking)
-        || registry.hasEventHandlers(EventHandlerRegistry::TouchStartOrMoveEventPassive)
-        || registry.hasEventHandlers(EventHandlerRegistry::TouchEndOrCancelEventBlocking)
-        || registry.hasEventHandlers(EventHandlerRegistry::TouchEndOrCancelEventPassive);
-}
-
-const AtomicString& touchEventNameForTouchPointState(PlatformTouchPoint::TouchState state)
-{
-    switch (state) {
-    case PlatformTouchPoint::TouchReleased:
-        return EventTypeNames::touchend;
-    case PlatformTouchPoint::TouchCancelled:
-        return EventTypeNames::touchcancel;
-    case PlatformTouchPoint::TouchPressed:
-        return EventTypeNames::touchstart;
-    case PlatformTouchPoint::TouchMoved:
-        return EventTypeNames::touchmove;
-    case PlatformTouchPoint::TouchStationary:
-        // Fall through to default
-    default:
-        ASSERT_NOT_REACHED();
-        return emptyAtom;
-    }
-}
-
 // Convert |event->deltaMode()| to scroll granularity and output as |granularity|.
 bool wheelGranularityToScrollGranularity(const WheelEvent* event, ScrollGranularity* granularity)
 {
@@ -211,59 +182,6 @@
     scrollChain.push_front(DOMNodeIds::idForNode(frame.document()->scrollingElement()));
 }
 
-// These offsets change indicies into the ListenerHistogram
-// enumeration. The addition of a series of offsets then
-// produces the resulting ListenerHistogram value.
-const size_t kTouchTargetHistogramRootScrollerOffset = 4;
-const size_t kTouchTargetHistogramScrollableDocumentOffset = 2;
-const size_t kTouchTargetHistogramHandledOffset = 1;
-
-enum TouchTargetAndDispatchResultType {
-    NonRootScrollerNonScrollableNotHandled, // Non-root-scroller, non-scrollable document, not handled.
-    NonRootScrollerNonScrollableHandled, // Non-root-scroller, non-scrollable document, handled application.
-    NonRootScrollerScrollableDocumentNotHandled, // Non-root-scroller, scrollable document, not handled.
-    NonRootScrollerScrollableDocumentHandled, // Non-root-scroller, scrollable document, handled application.
-    RootScrollerNonScrollableNotHandled, // Root-scroller, non-scrollable document, not handled.
-    RootScrollerNonScrollableHandled, // Root-scroller, non-scrollable document, handled.
-    RootScrollerScrollableDocumentNotHandled, // Root-scroller, scrollable document, not handled.
-    RootScrollerScrollableDocumentHandled, // Root-scroller, scrollable document, handled.
-    TouchTargetAndDispatchResultTypeMax,
-};
-
-TouchTargetAndDispatchResultType toTouchTargetHistogramValue(EventTarget* eventTarget, DispatchEventResult dispatchResult)
-{
-    int result = 0;
-    Document* document = nullptr;
-
-    if (const LocalDOMWindow* domWindow = eventTarget->toLocalDOMWindow()) {
-        // Treat the window as a root scroller as well.
-        document = domWindow->document();
-        result += kTouchTargetHistogramRootScrollerOffset;
-    } else if (Node* node = eventTarget->toNode()) {
-        // Report if the target node is the document or body.
-        if (node->isDocumentNode() || static_cast<Node*>(node->document().documentElement()) == node || static_cast<Node*>(node->document().body()) == node) {
-            result += kTouchTargetHistogramRootScrollerOffset;
-        }
-        document = &node->document();
-    }
-
-    if (document) {
-        FrameView* view = document->view();
-        if (view && view->isScrollable())
-            result += kTouchTargetHistogramScrollableDocumentOffset;
-    }
-
-    if (dispatchResult != DispatchEventResult::NotCanceled)
-        result += kTouchTargetHistogramHandledOffset;
-    return static_cast<TouchTargetAndDispatchResultType>(result);
-}
-
-enum TouchEventDispatchResultType {
-    UnhandledTouches, // Unhandled touch events.
-    HandledTouches, // Handled touch events.
-    TouchEventDispatchResultTypeMax,
-};
-
 } // namespace
 
 using namespace HTMLNames;
@@ -335,14 +253,13 @@
     , m_shouldOnlyFireDragOverEvent(false)
     , m_mousePositionIsUnknown(true)
     , m_mouseDownTimestamp(0)
-    , m_touchPressed(false)
+    , m_pointerEventManager(frame)
     , m_scrollGestureHandlingNode(nullptr)
     , m_lastGestureScrollOverWidget(false)
     , m_longTapShouldInvokeContextMenu(false)
     , m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired)
     , m_lastShowPressTimestamp(0)
     , m_deltaConsumedForScrollSequence(false)
-    , m_waitingForFirstTouchMove(false)
 {
 }
 
@@ -364,8 +281,6 @@
     visitor->trace(m_dragTarget);
     visitor->trace(m_frameSetBeingResized);
     visitor->trace(m_scrollbarHandlingScrollGesture);
-    visitor->trace(m_targetForTouchID);
-    visitor->trace(m_touchSequenceDocument);
     visitor->trace(m_scrollGestureHandlingNode);
     visitor->trace(m_previousGestureScrolledNode);
     visitor->trace(m_lastDeferredTapElement);
@@ -402,13 +317,9 @@
     m_mousePressed = false;
     m_capturesDragging = false;
     m_capturingMouseEventsNode = nullptr;
-    m_targetForTouchID.clear();
-    m_touchSequenceDocument.clear();
-    m_touchSequenceUserGestureToken.clear();
     clearGestureScrollState();
     m_lastGestureScrollOverWidget = false;
     m_scrollbarHandlingScrollGesture = nullptr;
-    m_touchPressed = false;
     m_pointerEventManager.clear();
     m_mouseDownMayStartDrag = false;
     m_lastShowPressTimestamp = 0;
@@ -1362,7 +1273,7 @@
     }
 
     // Treat any mouse move events as readonly if the user is currently touching the screen.
-    if (m_touchPressed)
+    if (m_pointerEventManager.isAnyTouchActive())
         hitType |= HitTestRequest::Active | HitTestRequest::ReadOnly;
     HitTestRequest request(hitType);
     MouseEventWithHitTestResults mev = MouseEventWithHitTestResults(mouseEvent, HitTestResult(request, LayoutPoint()));
@@ -3724,384 +3635,11 @@
     return result;
 }
 
-void EventHandler::dispatchPointerEvents(const PlatformTouchEvent& event,
-    HeapVector<TouchInfo>& touchInfos)
-{
-    if (!RuntimeEnabledFeatures::pointerEventEnabled())
-        return;
-
-    // Iterate through the touch points, sending PointerEvents to the targets as required.
-    for (unsigned i = 0; i < touchInfos.size(); ++i) {
-        TouchInfo& touchInfo = touchInfos[i];
-        const PlatformTouchPoint& touchPoint = touchInfo.point;
-
-
-        if (touchPoint.state() == PlatformTouchPoint::TouchStationary
-            || !touchInfo.knownTarget)
-            continue;
-
-        WebInputEventResult result =
-            m_pointerEventManager.sendTouchPointerEvent(
-            touchInfo.touchTarget, touchPoint, event.getModifiers(),
-            touchInfo.adjustedRadius.width(), touchInfo.adjustedRadius.height(),
-            touchInfo.adjustedPagePoint.x(), touchInfo.adjustedPagePoint.y());
-        touchInfo.consumed = result != WebInputEventResult::NotHandled;
-    }
-}
-
-namespace {
-
-// Defining this class type local to dispatchTouchEvents() and annotating
-// it with STACK_ALLOCATED(), runs into MSVC(VS 2013)'s C4822 warning
-// that the local class doesn't provide a local definition for 'operator new'.
-// Which it intentionally doesn't and shouldn't.
-//
-// Work around such toolchain bugginess by lifting out the type, thereby
-// taking it out of C4822's reach.
-class ChangedTouches final {
-    STACK_ALLOCATED();
-public:
-    // The touches corresponding to the particular change state this struct
-    // instance represents.
-    Member<TouchList> m_touches;
-
-    using EventTargetSet = HeapHashSet<Member<EventTarget>>;
-    // Set of targets involved in m_touches.
-    EventTargetSet m_targets;
-};
-
-} // namespace
-
-WebInputEventResult EventHandler::dispatchTouchEvents(const PlatformTouchEvent& event,
-    HeapVector<TouchInfo>& touchInfos, bool allTouchReleased)
-{
-    bool touchStartOrFirstTouchMove = false;
-    if (event.type() == PlatformEvent::TouchStart) {
-        m_waitingForFirstTouchMove = true;
-        touchStartOrFirstTouchMove = true;
-    } else if (event.type() == PlatformEvent::TouchMove) {
-        touchStartOrFirstTouchMove = m_waitingForFirstTouchMove;
-        m_waitingForFirstTouchMove = false;
-    }
-
-    // Build up the lists to use for the 'touches', 'targetTouches' and
-    // 'changedTouches' attributes in the JS event. See
-    // http://www.w3.org/TR/touch-events/#touchevent-interface for how these
-    // lists fit together.
-
-    // Holds the complete set of touches on the screen.
-    TouchList* touches = TouchList::create();
-
-    // A different view on the 'touches' list above, filtered and grouped by
-    // event target. Used for the 'targetTouches' list in the JS event.
-    using TargetTouchesHeapMap = HeapHashMap<EventTarget*, Member<TouchList>>;
-    TargetTouchesHeapMap touchesByTarget;
-
-    // Array of touches per state, used to assemble the 'changedTouches' list.
-    ChangedTouches changedTouches[PlatformTouchPoint::TouchStateEnd];
-
-    for (unsigned i = 0; i < touchInfos.size(); ++i) {
-        const TouchInfo& touchInfo = touchInfos[i];
-        const PlatformTouchPoint& point = touchInfo.point;
-        PlatformTouchPoint::TouchState pointState = point.state();
-
-        if (touchInfo.consumed)
-            continue;
-
-        Touch* touch = Touch::create(
-            touchInfo.targetFrame.get(),
-            touchInfo.touchTarget.get(),
-            point.id(),
-            point.screenPos(),
-            touchInfo.adjustedPagePoint,
-            touchInfo.adjustedRadius,
-            point.rotationAngle(),
-            point.force(),
-            touchInfo.region);
-
-        // Ensure this target's touch list exists, even if it ends up empty, so
-        // it can always be passed to TouchEvent::Create below.
-        TargetTouchesHeapMap::iterator targetTouchesIterator = touchesByTarget.find(touchInfo.touchTarget.get());
-        if (targetTouchesIterator == touchesByTarget.end()) {
-            touchesByTarget.set(touchInfo.touchTarget.get(), TouchList::create());
-            targetTouchesIterator = touchesByTarget.find(touchInfo.touchTarget.get());
-        }
-
-        // touches and targetTouches should only contain information about
-        // touches still on the screen, so if this point is released or
-        // cancelled it will only appear in the changedTouches list.
-        if (pointState != PlatformTouchPoint::TouchReleased && pointState != PlatformTouchPoint::TouchCancelled) {
-            touches->append(touch);
-            targetTouchesIterator->value->append(touch);
-        }
-
-        // Now build up the correct list for changedTouches.
-        // Note that  any touches that are in the TouchStationary state (e.g. if
-        // the user had several points touched but did not move them all) should
-        // never be in the changedTouches list so we do not handle them
-        // explicitly here. See https://bugs.webkit.org/show_bug.cgi?id=37609
-        // for further discussion about the TouchStationary state.
-        if (pointState != PlatformTouchPoint::TouchStationary && touchInfo.knownTarget) {
-            ASSERT(pointState < PlatformTouchPoint::TouchStateEnd);
-            if (!changedTouches[pointState].m_touches)
-                changedTouches[pointState].m_touches = TouchList::create();
-            changedTouches[pointState].m_touches->append(touch);
-            changedTouches[pointState].m_targets.add(touchInfo.touchTarget);
-        }
-    }
-    if (allTouchReleased) {
-        m_touchSequenceDocument.clear();
-        m_touchSequenceUserGestureToken.clear();
-    }
-
-    WebInputEventResult eventResult = WebInputEventResult::NotHandled;
-
-    // Now iterate through the changedTouches list and m_targets within it, sending
-    // TouchEvents to the targets as required.
-    for (unsigned state = 0; state != PlatformTouchPoint::TouchStateEnd; ++state) {
-        if (!changedTouches[state].m_touches)
-            continue;
-
-        const AtomicString& eventName(touchEventNameForTouchPointState(static_cast<PlatformTouchPoint::TouchState>(state)));
-        for (const auto& eventTarget : changedTouches[state].m_targets) {
-            EventTarget* touchEventTarget = eventTarget;
-            TouchEvent* touchEvent = TouchEvent::create(
-                touches, touchesByTarget.get(touchEventTarget), changedTouches[state].m_touches.get(),
-                eventName, touchEventTarget->toNode()->document().domWindow(),
-                event.getModifiers(), event.cancelable(), event.causesScrollingIfUncanceled(), event.timestamp());
-
-            DispatchEventResult domDispatchResult = touchEventTarget->dispatchEvent(touchEvent);
-
-            // Only report for top level documents with a single touch on
-            // touch-start or the first touch-move.
-            if (touchStartOrFirstTouchMove && touchInfos.size() == 1 && event.cancelable() && !m_frame->document()->ownerElement()) {
-                DEFINE_STATIC_LOCAL(EnumerationHistogram, rootDocumentListenerHistogram, ("Event.Touch.TargetAndDispatchResult", TouchTargetAndDispatchResultTypeMax));
-                rootDocumentListenerHistogram.count(toTouchTargetHistogramValue(eventTarget, domDispatchResult));
-
-                // Count the handled touch starts and first touch moves before and after the page is fully loaded respectively.
-                if (m_frame->document()->isLoadCompleted()) {
-                    DEFINE_STATIC_LOCAL(EnumerationHistogram, touchDispositionsAfterPageLoadHistogram, ("Event.Touch.TouchDispositionsAfterPageLoad", TouchEventDispatchResultTypeMax));
-                    touchDispositionsAfterPageLoadHistogram.count((domDispatchResult != DispatchEventResult::NotCanceled) ? HandledTouches : UnhandledTouches);
-                } else {
-                    DEFINE_STATIC_LOCAL(EnumerationHistogram, touchDispositionsBeforePageLoadHistogram, ("Event.Touch.TouchDispositionsBeforePageLoad", TouchEventDispatchResultTypeMax));
-                    touchDispositionsBeforePageLoadHistogram.count((domDispatchResult != DispatchEventResult::NotCanceled) ? HandledTouches : UnhandledTouches);
-                }
-            }
-            eventResult = mergeEventResult(eventResult, toWebInputEventResult(domDispatchResult));
-        }
-    }
-    return eventResult;
-}
-
 WebInputEventResult EventHandler::handleTouchEvent(const PlatformTouchEvent& event)
 {
     TRACE_EVENT0("blink", "EventHandler::handleTouchEvent");
 
-    if (event.type() == PlatformEvent::TouchScrollStarted) {
-        m_pointerEventManager.blockTouchPointers();
-        return WebInputEventResult::HandledSystem;
-    }
-
-    const Vector<PlatformTouchPoint>& points = event.touchPoints();
-
-    bool newTouchSequence = true;
-    bool allTouchReleased = true;
-    for (unsigned i = 0; i < points.size(); ++i) {
-        const PlatformTouchPoint& point = points[i];
-
-        if (point.state() != PlatformTouchPoint::TouchPressed)
-            newTouchSequence = false;
-        if (point.state() != PlatformTouchPoint::TouchReleased && point.state() != PlatformTouchPoint::TouchCancelled)
-            allTouchReleased = false;
-    }
-
-    if (newTouchSequence) {
-        // Ideally we'd ASSERT !m_touchSequenceDocument here since we should
-        // have cleared the active document when we saw the last release. But we
-        // have some tests that violate this, ClusterFuzz could trigger it, and
-        // there may be cases where the browser doesn't reliably release all
-        // touches. http://crbug.com/345372 tracks this.
-        m_touchSequenceDocument.clear();
-        m_touchSequenceUserGestureToken.clear();
-        m_pointerEventManager.unblockTouchPointers();
-    }
-
-    ASSERT(m_frame->view());
-    if (m_touchSequenceDocument && (!m_touchSequenceDocument->frame() || !m_touchSequenceDocument->frame()->view())) {
-        // If the active touch document has no frame or view, it's probably being destroyed
-        // so we can't dispatch events.
-        return WebInputEventResult::NotHandled;
-    }
-
-    // First do hit tests for any new touch points.
-    for (unsigned i = 0; i < points.size(); ++i) {
-        const PlatformTouchPoint& point = points[i];
-
-        // Touch events implicitly capture to the touched node, and don't change
-        // active/hover states themselves (Gesture events do). So we only need
-        // to hit-test on touchstart, and it can be read-only.
-        if (point.state() == PlatformTouchPoint::TouchPressed) {
-            HitTestRequest::HitTestRequestType hitType = HitTestRequest::TouchEvent | HitTestRequest::ReadOnly | HitTestRequest::Active;
-            LayoutPoint pagePoint = roundedLayoutPoint(m_frame->view()->rootFrameToContents(point.pos()));
-            HitTestResult result;
-            if (!m_touchSequenceDocument) {
-                result = hitTestResultAtPoint(pagePoint, hitType);
-            } else if (m_touchSequenceDocument->frame()) {
-                LayoutPoint framePoint = roundedLayoutPoint(m_touchSequenceDocument->frame()->view()->rootFrameToContents(point.pos()));
-                result = hitTestResultInFrame(m_touchSequenceDocument->frame(), framePoint, hitType);
-            } else {
-                continue;
-            }
-
-            Node* node = result.innerNode();
-            if (!node)
-                continue;
-
-            if (isHTMLCanvasElement(node)) {
-                std::pair<Element*, String> regionInfo = toHTMLCanvasElement(node)->getControlAndIdIfHitRegionExists(result.pointInInnerNodeFrame());
-                if (regionInfo.first)
-                    node = regionInfo.first;
-                m_regionForTouchID.set(point.id(), regionInfo.second);
-            }
-
-            // Touch events should not go to text nodes
-            if (node->isTextNode())
-                node = FlatTreeTraversal::parent(*node);
-
-            if (!m_touchSequenceDocument) {
-                // Keep track of which document should receive all touch events
-                // in the active sequence. This must be a single document to
-                // ensure we don't leak Nodes between documents.
-                m_touchSequenceDocument = &(result.innerNode()->document());
-                ASSERT(m_touchSequenceDocument->frame()->view());
-            }
-
-            // Ideally we'd ASSERT(!m_targetForTouchID.contains(point.id())
-            // since we shouldn't get a touchstart for a touch that's already
-            // down. However EventSender allows this to be violated and there's
-            // some tests that take advantage of it. There may also be edge
-            // cases in the browser where this happens.
-            // See http://crbug.com/345372.
-            m_targetForTouchID.set(point.id(), node);
-
-            TouchAction effectiveTouchAction = TouchActionUtil::computeEffectiveTouchAction(*node);
-            if (effectiveTouchAction != TouchActionAuto)
-                m_frame->page()->chromeClient().setTouchAction(effectiveTouchAction);
-        }
-    }
-
-    m_touchPressed = !allTouchReleased;
-
-    // If there's no document receiving touch events, or no handlers on the
-    // document set to receive the events, then we can skip all the rest of
-    // this work.
-    if (!m_touchSequenceDocument || !m_touchSequenceDocument->frameHost() || !hasTouchHandlers(m_touchSequenceDocument->frameHost()->eventHandlerRegistry()) || !m_touchSequenceDocument->frame()) {
-        if (allTouchReleased) {
-            m_touchSequenceDocument.clear();
-            m_touchSequenceUserGestureToken.clear();
-        }
-        return WebInputEventResult::NotHandled;
-    }
-
-    // Whether a touch should be considered a "user gesture" or not is a tricky question.
-    // https://docs.google.com/document/d/1oF1T3O7_E4t1PYHV6gyCwHxOi3ystm0eSL5xZu7nvOg/edit#
-    // TODO(rbyers): Disable user gesture in some cases but retain logging for now (crbug.com/582140).
-    OwnPtr<UserGestureIndicator> gestureIndicator;
-    if (event.touchPoints().size() == 1
-        && event.touchPoints()[0].state() == PlatformTouchPoint::TouchReleased
-        && !event.causesScrollingIfUncanceled()) {
-        // This is a touchend corresponding to a tap, definitely a user gesture.  So don't supply
-        // a UserGestureUtilizedCallback.
-        gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessingUserGesture));
-    } else {
-        // This is some other touch event that perhaps shouldn't be considered a user gesture.  So
-        // use a UserGestureUtilizedCallback to get metrics / deprecation warnings.
-        if (m_touchSequenceUserGestureToken)
-            gestureIndicator = adoptPtr(new UserGestureIndicator(m_touchSequenceUserGestureToken.release(), &m_touchSequenceDocument->frame()->eventHandler()));
-        else
-            gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessingUserGesture, &m_touchSequenceDocument->frame()->eventHandler()));
-        m_touchSequenceUserGestureToken = UserGestureIndicator::currentToken();
-    }
-
-    // Compute and store the common info used by both PointerEvent and TouchEvent.
-    HeapVector<TouchInfo> touchInfos(points.size());
-
-    for (unsigned i = 0; i < points.size(); ++i) {
-        const PlatformTouchPoint& point = points[i];
-        PlatformTouchPoint::TouchState pointState = point.state();
-        EventTarget* touchTarget = nullptr;
-        String regionID;
-
-        if (pointState == PlatformTouchPoint::TouchReleased || pointState == PlatformTouchPoint::TouchCancelled) {
-            // The target should be the original target for this touch, so get
-            // it from the hashmap. As it's a release or cancel we also remove
-            // it from the map.
-            touchTarget = m_targetForTouchID.take(point.id());
-            regionID = m_regionForTouchID.take(point.id());
-        } else {
-            // No hittest is performed on move or stationary, since the target
-            // is not allowed to change anyway.
-            touchTarget = m_targetForTouchID.get(point.id());
-            regionID = m_regionForTouchID.get(point.id());
-        }
-
-        LocalFrame* targetFrame = nullptr;
-        bool knownTarget = false;
-        if (touchTarget) {
-            Document& doc = touchTarget->toNode()->document();
-            // If the target node has moved to a new document while it was being touched,
-            // we can't send events to the new document because that could leak nodes
-            // from one document to another. See http://crbug.com/394339.
-            if (&doc == m_touchSequenceDocument.get()) {
-                targetFrame = doc.frame();
-                knownTarget = true;
-            }
-        }
-        if (!knownTarget) {
-            // If we don't have a target registered for the point it means we've
-            // missed our opportunity to do a hit test for it (due to some
-            // optimization that prevented blink from ever seeing the
-            // touchstart), or that the touch started outside the active touch
-            // sequence document. We should still include the touch in the
-            // Touches list reported to the application (eg. so it can
-            // differentiate between a one and two finger gesture), but we won't
-            // actually dispatch any events for it. Set the target to the
-            // Document so that there's some valid node here. Perhaps this
-            // should really be LocalDOMWindow, but in all other cases the target of
-            // a Touch is a Node so using the window could be a breaking change.
-            // Since we know there was no handler invoked, the specific target
-            // should be completely irrelevant to the application.
-            touchTarget = m_touchSequenceDocument;
-            targetFrame = m_touchSequenceDocument->frame();
-        }
-        ASSERT(targetFrame);
-
-        // pagePoint should always be in the target element's document coordinates.
-        FloatPoint pagePoint = targetFrame->view()->rootFrameToContents(point.pos());
-        float scaleFactor = 1.0f / targetFrame->pageZoomFactor();
-
-        TouchInfo& touchInfo = touchInfos[i];
-        touchInfo.point = point;
-        touchInfo.touchTarget = touchTarget;
-        touchInfo.targetFrame = targetFrame;
-        touchInfo.adjustedPagePoint = pagePoint.scaledBy(scaleFactor);
-        touchInfo.adjustedRadius = point.radius().scaledBy(scaleFactor);
-        touchInfo.knownTarget = knownTarget;
-        touchInfo.consumed = false;
-        touchInfo.region = regionID;
-    }
-
-    dispatchPointerEvents(event, touchInfos);
-    // Note that the disposition of any pointer events affects only the generation of touch
-    // events. If all pointer events were handled (and hence no touch events were fired), that
-    // is still equivalent to the touch events going unhandled because pointer event handler
-    // don't block scroll gesture generation.
-
-    // TODO(crbug.com/507408): If PE handlers always call preventDefault, we won't see TEs until after
-    // scrolling starts because the scrolling would suppress upcoming PEs. This sudden "break" in TE
-    // suppression can make the visible TEs inconsistent (e.g. touchmove without a touchstart).
-
-    return dispatchTouchEvents(event, touchInfos, allTouchReleased);
+    return m_pointerEventManager.handleTouchEvents(event);
 }
 
 void EventHandler::userGestureUtilized()
diff --git a/third_party/WebKit/Source/core/input/EventHandler.h b/third_party/WebKit/Source/core/input/EventHandler.h
index 06ca34d..f34db34 100644
--- a/third_party/WebKit/Source/core/input/EventHandler.h
+++ b/third_party/WebKit/Source/core/input/EventHandler.h
@@ -110,6 +110,8 @@
     void dispatchFakeMouseMoveEventSoon();
     void dispatchFakeMouseMoveEventSoonInQuad(const FloatQuad&);
 
+    static HitTestResult hitTestResultInFrame(LocalFrame*, const LayoutPoint&, HitTestRequest::HitTestRequestType hitType = HitTestRequest::ReadOnly | HitTestRequest::Active);
+
     HitTestResult hitTestResultAtPoint(const LayoutPoint&,
         HitTestRequest::HitTestRequestType hitType = HitTestRequest::ReadOnly | HitTestRequest::Active,
         const LayoutSize& padding = LayoutSize());
@@ -327,8 +329,6 @@
     bool isRootScroller(const Node&) const;
     void customizedScroll(const Node& startNode, ScrollState&);
 
-    HitTestResult hitTestResultInFrame(LocalFrame*, const LayoutPoint&, HitTestRequest::HitTestRequestType hitType = HitTestRequest::ReadOnly | HitTestRequest::Active);
-
     void invalidateClick();
 
     Node* updateMouseEventTargetNode(Node*, const PlatformMouseEvent&);
@@ -394,10 +394,6 @@
     // the given element.
     bool slideFocusOnShadowHostIfNecessary(const Element&);
 
-    void dispatchPointerEvents(const PlatformTouchEvent&, HeapVector<TouchInfo>&);
-
-    WebInputEventResult dispatchTouchEvents(const PlatformTouchEvent&, HeapVector<TouchInfo>&, bool);
-
     FrameHost* frameHost();
 
     // NOTE: If adding a new field to this class please ensure that it is
@@ -459,18 +455,6 @@
     PlatformMouseEvent m_mouseDown;
     RefPtr<UserGestureToken> m_lastMouseDownUserGestureToken;
 
-    // The target of each active touch point indexed by the touch ID.
-    using TouchTargetMap = HeapHashMap<unsigned, Member<EventTarget>, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZeroKeyHashTraits<unsigned>>;
-    TouchTargetMap m_targetForTouchID;
-    using TouchRegionMap = HashMap<unsigned, String, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZeroKeyHashTraits<unsigned>>;
-    TouchRegionMap m_regionForTouchID;
-
-    // If set, the document of the active touch sequence. Unset if no touch sequence active.
-    Member<Document> m_touchSequenceDocument;
-    RefPtr<UserGestureToken> m_touchSequenceUserGestureToken;
-
-    bool m_touchPressed;
-
     PointerEventManager m_pointerEventManager;
 
     Member<Node> m_scrollGestureHandlingNode;
@@ -498,9 +482,6 @@
     // scroll which shouldn't propagate can't cause any element to
     // scroll other than the |m_previousGestureScrolledNode|.
     bool m_deltaConsumedForScrollSequence;
-
-    // True if waiting on first touch move after a touch start.
-    bool m_waitingForFirstTouchMove;
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/input/PointerEventManager.cpp b/third_party/WebKit/Source/core/input/PointerEventManager.cpp
index a085c8b..1528d20 100644
--- a/third_party/WebKit/Source/core/input/PointerEventManager.cpp
+++ b/third_party/WebKit/Source/core/input/PointerEventManager.cpp
@@ -7,8 +7,10 @@
 #include "core/dom/ElementTraversal.h"
 #include "core/dom/shadow/FlatTreeTraversal.h"
 #include "core/events/MouseEvent.h"
+#include "core/frame/FrameView.h"
 #include "core/html/HTMLCanvasElement.h"
 #include "core/input/EventHandler.h"
+#include "platform/PlatformTouchEvent.h"
 
 namespace blink {
 
@@ -375,20 +377,74 @@
     m_inCanceledStateForPointerTypeTouch = false;
 }
 
+WebInputEventResult PointerEventManager::handleTouchEvents(
+    const PlatformTouchEvent& event)
+{
+
+    if (event.type() == PlatformEvent::TouchScrollStarted) {
+        blockTouchPointers();
+        return WebInputEventResult::HandledSystem;
+    }
+
+    bool newTouchSequence = true;
+    for (const auto &touchPoint : event.touchPoints()) {
+        if (touchPoint.state() != PlatformTouchPoint::TouchPressed) {
+            newTouchSequence = false;
+            break;
+        }
+    }
+    if (newTouchSequence)
+        unblockTouchPointers();
+    HeapVector<TouchEventManager::TouchInfo> touchInfos;
+
+    // TODO(crbug.com/606822): This will be moved after pointer events so
+    // pointer event operations will get the first shot to fill up this array.
+    if (!m_touchEventManager.generateTouchInfosAfterHittest(event, touchInfos))
+        return WebInputEventResult::NotHandled;
+
+    dispatchTouchPointerEvents(event, touchInfos);
+
+    return m_touchEventManager.handleTouchEvent(event, touchInfos);
+}
+
+void PointerEventManager::dispatchTouchPointerEvents(
+    const PlatformTouchEvent& event,
+    HeapVector<TouchEventManager::TouchInfo>& touchInfos)
+{
+    if (!RuntimeEnabledFeatures::pointerEventEnabled())
+        return;
+
+    if (m_inCanceledStateForPointerTypeTouch)
+        return;
+
+    // Iterate through the touch points, sending PointerEvents to the targets as required.
+    for (auto& touchInfo: touchInfos) {
+        const PlatformTouchPoint &touchPoint = touchInfo.point;
+        WebInputEventResult result = WebInputEventResult::NotHandled;
+        // Do not send pointer events for stationary touches.
+        if (touchPoint.state() != PlatformTouchPoint::TouchStationary) {
+            // TODO(crbug.com/608394): The adjustedPagePoint should be converted
+            // to client coordinates.
+            PointerEvent* pointerEvent = m_pointerEventFactory.create(
+                pointerEventNameForTouchPointState(touchPoint.state()),
+                touchPoint, event.getModifiers(),
+                touchInfo.adjustedRadius,
+                touchInfo.adjustedPagePoint);
+
+            // Consume the touch point if its pointer event is anything but NotHandled
+            // (e.g. preventDefault is called in the listener for the pointer event).
+            result = sendTouchPointerEvent(touchInfo.touchNode, pointerEvent);
+            touchInfo.consumed = result != WebInputEventResult::NotHandled;
+        }
+    }
+}
+
 WebInputEventResult PointerEventManager::sendTouchPointerEvent(
-    EventTarget* target,
-    const PlatformTouchPoint& touchPoint, PlatformEvent::Modifiers modifiers,
-    const double width, const double height,
-    const double clientX, const double clientY)
+    EventTarget* target, PointerEvent* pointerEvent)
 {
     if (m_inCanceledStateForPointerTypeTouch)
         return WebInputEventResult::NotHandled;
 
-    PointerEvent* pointerEvent =
-        m_pointerEventFactory.create(
-        pointerEventNameForTouchPointState(touchPoint.state()),
-        touchPoint, modifiers, width, height, clientX, clientY);
-
     processCaptureAndPositionOfPointerEvent(pointerEvent, target);
 
     // TODO(nzolghadr): crbug.com/579553 dealing with implicit touch capturing vs pointer event capturing
@@ -397,11 +453,11 @@
         pointerEvent);
 
     // Setting the implicit capture for touch
-    if (touchPoint.state() == PlatformTouchPoint::TouchPressed)
+    if (pointerEvent->type() == EventTypeNames::pointerdown)
         setPointerCapture(pointerEvent->pointerId(), target);
 
-    if (touchPoint.state() == PlatformTouchPoint::TouchReleased
-        || touchPoint.state() == PlatformTouchPoint::TouchCancelled) {
+    if (pointerEvent->type() == EventTypeNames::pointerup
+        || pointerEvent->type() == EventTypeNames::pointercancel) {
         releasePointerCapture(pointerEvent->pointerId());
 
         // Sending the leave/out events and lostpointercapture
@@ -468,7 +524,9 @@
     return result;
 }
 
-PointerEventManager::PointerEventManager()
+PointerEventManager::PointerEventManager(LocalFrame* frame)
+: m_frame(frame)
+, m_touchEventManager(frame)
 {
     clear();
 }
@@ -481,6 +539,7 @@
 {
     for (auto& entry : m_preventMouseEventForPointerType)
         entry = false;
+    m_touchEventManager.clear();
     m_inCanceledStateForPointerTypeTouch = false;
     m_pointerEventFactory.clear();
     m_nodeUnderPointer.clear();
@@ -641,22 +700,29 @@
     m_pendingPointerCaptureTarget.remove(pointerId);
 }
 
-bool PointerEventManager::isActive(const int pointerId)
+bool PointerEventManager::isActive(const int pointerId) const
 {
     return m_pointerEventFactory.isActive(pointerId);
 }
 
 WebPointerProperties::PointerType PointerEventManager::getPointerEventType(
-    const int pointerId)
+    const int pointerId) const
 {
     return m_pointerEventFactory.getPointerType(pointerId);
 }
 
+bool PointerEventManager::isAnyTouchActive() const
+{
+    return m_touchEventManager.isAnyTouchActive();
+}
+
 DEFINE_TRACE(PointerEventManager)
 {
+    visitor->trace(m_frame);
     visitor->trace(m_nodeUnderPointer);
     visitor->trace(m_pointerCaptureTarget);
     visitor->trace(m_pendingPointerCaptureTarget);
+    visitor->trace(m_touchEventManager);
 }
 
 
diff --git a/third_party/WebKit/Source/core/input/PointerEventManager.h b/third_party/WebKit/Source/core/input/PointerEventManager.h
index b158c868..873c637b 100644
--- a/third_party/WebKit/Source/core/input/PointerEventManager.h
+++ b/third_party/WebKit/Source/core/input/PointerEventManager.h
@@ -8,6 +8,7 @@
 #include "core/CoreExport.h"
 #include "core/events/PointerEvent.h"
 #include "core/events/PointerEventFactory.h"
+#include "core/input/TouchEventManager.h"
 #include "public/platform/WebInputEventResult.h"
 #include "public/platform/WebPointerProperties.h"
 #include "wtf/Allocator.h"
@@ -15,13 +16,14 @@
 
 namespace blink {
 
+class LocalFrame;
 
 // This class takes care of dispatching all pointer events and keeps track of
 // properties of active pointer events.
 class CORE_EXPORT PointerEventManager {
     DISALLOW_NEW();
 public:
-    PointerEventManager();
+    explicit PointerEventManager(LocalFrame*);
     ~PointerEventManager();
     DECLARE_TRACE();
 
@@ -32,20 +34,8 @@
         AbstractView*,
         Node* lastNodeUnderMouse);
 
-    // Returns whether the event is consumed or not
-    WebInputEventResult sendTouchPointerEvent(
-        EventTarget*,
-        const PlatformTouchPoint&, PlatformEvent::Modifiers,
-        const double width, const double height,
-        const double clientX, const double clientY);
-
-    // Inhibits firing of touch-type PointerEvents until unblocked by unblockTouchPointers(). Also
-    // sends pointercancels for existing touch-type PointerEvents.
-    // See: www.w3.org/TR/pointerevents/#declaring-candidate-regions-for-default-touch-behaviors
-    void blockTouchPointers();
-
-    // Enables firing of touch-type PointerEvents after they were inhibited by blockTouchPointers().
-    void unblockTouchPointers();
+    WebInputEventResult handleTouchEvents(
+        const PlatformTouchEvent&);
 
     // Sends node transition events mouseout/leave/over/enter to the
     // corresponding targets. This function sends pointerout/leave/over/enter
@@ -64,17 +54,21 @@
         const PlatformMouseEvent&,
         AbstractView*, bool isFrameBoundaryTransition);
 
-    // Clear all the existing ids.
+    // Resets the internal state of this object.
     void clear();
 
     void elementRemoved(EventTarget*);
     void setPointerCapture(int, EventTarget*);
     void releasePointerCapture(int, EventTarget*);
-    bool isActive(const int);
-    WebPointerProperties::PointerType getPointerEventType(const int);
+    bool isActive(const int) const;
+    WebPointerProperties::PointerType getPointerEventType(const int) const;
+
+    // Returns whether there is any touch on the screen.
+    bool isAnyTouchActive() const;
 
 private:
-    typedef HeapHashMap<int, Member<EventTarget>> PointerCapturingMap;
+    typedef HeapHashMap<int, Member<EventTarget>, WTF::IntHash<int>,
+        WTF::UnsignedWithZeroKeyHashTraits<int>> PointerCapturingMap;
     class EventTargetAttributes {
         DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
     public:
@@ -93,6 +87,23 @@
         , hasRecievedOverEvent(hasRecievedOverEvent) {}
     };
 
+    // Inhibits firing of touch-type PointerEvents until unblocked by unblockTouchPointers(). Also
+    // sends pointercancels for existing touch-type PointerEvents.
+    // See: www.w3.org/TR/pointerevents/#declaring-candidate-regions-for-default-touch-behaviors
+    void blockTouchPointers();
+
+    // Enables firing of touch-type PointerEvents after they were inhibited by blockTouchPointers().
+    void unblockTouchPointers();
+
+    // Sends touch pointer events and sets consumed bits in TouchInfo array
+    // based on the return value of pointer event handlers.
+    void dispatchTouchPointerEvents(
+        const PlatformTouchEvent&,
+        HeapVector<TouchEventManager::TouchInfo>&);
+
+    // Returns whether the event is consumed or not.
+    WebInputEventResult sendTouchPointerEvent(EventTarget*, PointerEvent*);
+
     void sendNodeTransitionEvents(
         EventTarget* exitedTarget,
         EventTarget* enteredTarget,
@@ -135,6 +146,11 @@
         bool checkForListener = false);
     void releasePointerCapture(int);
 
+    // NOTE: If adding a new field to this class please ensure that it is
+    // cleared in |PointerEventManager::clear()|.
+
+    const Member<LocalFrame> m_frame;
+
     // Prevents firing mousedown, mousemove & mouseup in-between a canceled pointerdown and next pointerup/pointercancel.
     // See "PREVENT MOUSE EVENT flag" in the spec:
     //   https://w3c.github.io/pointerevents/#compatibility-mapping-with-mouse-events
@@ -148,11 +164,15 @@
     // which might be different than m_nodeUnderMouse in EventHandler. That one
     // keeps track of any compatibility mouse event positions but this map for
     // the pointer with id=1 is only taking care of true mouse related events.
-    HeapHashMap<int, EventTargetAttributes> m_nodeUnderPointer;
+    using NodeUnderPointerMap = HeapHashMap<int, EventTargetAttributes,
+        WTF::IntHash<int>, WTF::UnsignedWithZeroKeyHashTraits<int>>;
+    NodeUnderPointerMap m_nodeUnderPointer;
 
     PointerCapturingMap m_pointerCaptureTarget;
     PointerCapturingMap m_pendingPointerCaptureTarget;
     PointerEventFactory m_pointerEventFactory;
+    TouchEventManager m_touchEventManager;
+
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/input/TouchEventManager.cpp b/third_party/WebKit/Source/core/input/TouchEventManager.cpp
new file mode 100644
index 0000000..5fbb113
--- /dev/null
+++ b/third_party/WebKit/Source/core/input/TouchEventManager.cpp
@@ -0,0 +1,513 @@
+// Copyright 2016 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 "core/input/TouchEventManager.h"
+
+#include "core/dom/Document.h"
+#include "core/events/TouchEvent.h"
+#include "core/frame/EventHandlerRegistry.h"
+#include "core/frame/FrameHost.h"
+#include "core/frame/FrameView.h"
+#include "core/html/HTMLCanvasElement.h"
+#include "core/input/EventHandler.h"
+#include "core/input/TouchActionUtil.h"
+#include "core/page/ChromeClient.h"
+#include "core/page/Page.h"
+#include "platform/Histogram.h"
+#include "platform/PlatformTouchEvent.h"
+
+
+
+namespace blink {
+
+namespace {
+
+bool hasTouchHandlers(const EventHandlerRegistry& registry)
+{
+    return registry.hasEventHandlers(EventHandlerRegistry::TouchStartOrMoveEventBlocking)
+        || registry.hasEventHandlers(EventHandlerRegistry::TouchStartOrMoveEventPassive)
+        || registry.hasEventHandlers(EventHandlerRegistry::TouchEndOrCancelEventBlocking)
+        || registry.hasEventHandlers(EventHandlerRegistry::TouchEndOrCancelEventPassive);
+}
+
+const AtomicString& touchEventNameForTouchPointState(PlatformTouchPoint::TouchState state)
+{
+    switch (state) {
+    case PlatformTouchPoint::TouchReleased:
+        return EventTypeNames::touchend;
+    case PlatformTouchPoint::TouchCancelled:
+        return EventTypeNames::touchcancel;
+    case PlatformTouchPoint::TouchPressed:
+        return EventTypeNames::touchstart;
+    case PlatformTouchPoint::TouchMoved:
+        return EventTypeNames::touchmove;
+    case PlatformTouchPoint::TouchStationary:
+        // Fall through to default
+    default:
+        ASSERT_NOT_REACHED();
+        return emptyAtom;
+    }
+}
+
+// These offsets change indicies into the ListenerHistogram
+// enumeration. The addition of a series of offsets then
+// produces the resulting ListenerHistogram value.
+const size_t kTouchTargetHistogramRootScrollerOffset = 4;
+const size_t kTouchTargetHistogramScrollableDocumentOffset = 2;
+const size_t kTouchTargetHistogramHandledOffset = 1;
+
+enum TouchTargetAndDispatchResultType {
+    NonRootScrollerNonScrollableNotHandled, // Non-root-scroller, non-scrollable document, not handled.
+    NonRootScrollerNonScrollableHandled, // Non-root-scroller, non-scrollable document, handled application.
+    NonRootScrollerScrollableDocumentNotHandled, // Non-root-scroller, scrollable document, not handled.
+    NonRootScrollerScrollableDocumentHandled, // Non-root-scroller, scrollable document, handled application.
+    RootScrollerNonScrollableNotHandled, // Root-scroller, non-scrollable document, not handled.
+    RootScrollerNonScrollableHandled, // Root-scroller, non-scrollable document, handled.
+    RootScrollerScrollableDocumentNotHandled, // Root-scroller, scrollable document, not handled.
+    RootScrollerScrollableDocumentHandled, // Root-scroller, scrollable document, handled.
+    TouchTargetAndDispatchResultTypeMax,
+};
+
+TouchTargetAndDispatchResultType toTouchTargetHistogramValue(EventTarget* eventTarget, DispatchEventResult dispatchResult)
+{
+    int result = 0;
+    Document* document = nullptr;
+
+    if (const LocalDOMWindow* domWindow = eventTarget->toLocalDOMWindow()) {
+        // Treat the window as a root scroller as well.
+        document = domWindow->document();
+        result += kTouchTargetHistogramRootScrollerOffset;
+    } else if (Node* node = eventTarget->toNode()) {
+        // Report if the target node is the document or body.
+        if (node->isDocumentNode() || static_cast<Node*>(node->document().documentElement()) == node || static_cast<Node*>(node->document().body()) == node) {
+            result += kTouchTargetHistogramRootScrollerOffset;
+        }
+        document = &node->document();
+    }
+
+    if (document) {
+        FrameView* view = document->view();
+        if (view && view->isScrollable())
+            result += kTouchTargetHistogramScrollableDocumentOffset;
+    }
+
+    if (dispatchResult != DispatchEventResult::NotCanceled)
+        result += kTouchTargetHistogramHandledOffset;
+    return static_cast<TouchTargetAndDispatchResultType>(result);
+}
+
+enum TouchEventDispatchResultType {
+    UnhandledTouches, // Unhandled touch events.
+    HandledTouches, // Handled touch events.
+    TouchEventDispatchResultTypeMax,
+};
+
+// Defining this class type local to dispatchTouchEvents() and annotating
+// it with STACK_ALLOCATED(), runs into MSVC(VS 2013)'s C4822 warning
+// that the local class doesn't provide a local definition for 'operator new'.
+// Which it intentionally doesn't and shouldn't.
+//
+// Work around such toolchain bugginess by lifting out the type, thereby
+// taking it out of C4822's reach.
+class ChangedTouches final {
+    STACK_ALLOCATED();
+public:
+    // The touches corresponding to the particular change state this struct
+    // instance represents.
+    Member<TouchList> m_touches;
+
+    using EventTargetSet = HeapHashSet<Member<EventTarget>>;
+    // Set of targets involved in m_touches.
+    EventTargetSet m_targets;
+};
+
+} // namespace
+
+TouchEventManager::TouchEventManager(LocalFrame* frame)
+: m_frame(frame)
+{
+    clear();
+}
+
+TouchEventManager::~TouchEventManager()
+{
+}
+
+WebInputEventResult TouchEventManager::dispatchTouchEvents(
+    const PlatformTouchEvent& event,
+    const HeapVector<TouchInfo>& touchInfos,
+    bool allTouchesReleased)
+{
+    bool touchStartOrFirstTouchMove = false;
+    if (event.type() == PlatformEvent::TouchStart) {
+        m_waitingForFirstTouchMove = true;
+        touchStartOrFirstTouchMove = true;
+    } else if (event.type() == PlatformEvent::TouchMove) {
+        touchStartOrFirstTouchMove = m_waitingForFirstTouchMove;
+        m_waitingForFirstTouchMove = false;
+    }
+
+    // Build up the lists to use for the |touches|, |targetTouches| and
+    // |changedTouches| attributes in the JS event. See
+    // http://www.w3.org/TR/touch-events/#touchevent-interface for how these
+    // lists fit together.
+
+    // Holds the complete set of touches on the screen.
+    TouchList* touches = TouchList::create();
+
+    // A different view on the 'touches' list above, filtered and grouped by
+    // event target. Used for the |targetTouches| list in the JS event.
+    using TargetTouchesHeapMap = HeapHashMap<EventTarget*, Member<TouchList>>;
+    TargetTouchesHeapMap touchesByTarget;
+
+    // Array of touches per state, used to assemble the |changedTouches| list.
+    ChangedTouches changedTouches[PlatformTouchPoint::TouchStateEnd];
+
+    for (unsigned i = 0; i < touchInfos.size(); ++i) {
+        const TouchInfo& touchInfo = touchInfos[i];
+        const PlatformTouchPoint& point = touchInfo.point;
+        PlatformTouchPoint::TouchState pointState = point.state();
+
+        if (touchInfo.consumed)
+            continue;
+
+        Touch* touch = Touch::create(
+            touchInfo.targetFrame.get(),
+            touchInfo.touchNode.get(),
+            point.id(),
+            point.screenPos(),
+            touchInfo.adjustedPagePoint,
+            touchInfo.adjustedRadius,
+            point.rotationAngle(),
+            point.force(),
+            touchInfo.region);
+
+        // Ensure this target's touch list exists, even if it ends up empty, so
+        // it can always be passed to TouchEvent::Create below.
+        TargetTouchesHeapMap::iterator targetTouchesIterator = touchesByTarget.find(touchInfo.touchNode.get());
+        if (targetTouchesIterator == touchesByTarget.end()) {
+            touchesByTarget.set(touchInfo.touchNode.get(), TouchList::create());
+            targetTouchesIterator = touchesByTarget.find(touchInfo.touchNode.get());
+        }
+
+        // |touches| and |targetTouches| should only contain information about
+        // touches still on the screen, so if this point is released or
+        // cancelled it will only appear in the |changedTouches| list.
+        if (pointState != PlatformTouchPoint::TouchReleased && pointState != PlatformTouchPoint::TouchCancelled) {
+            touches->append(touch);
+            targetTouchesIterator->value->append(touch);
+        }
+
+        // Now build up the correct list for |changedTouches|.
+        // Note that  any touches that are in the TouchStationary state (e.g. if
+        // the user had several points touched but did not move them all) should
+        // never be in the |changedTouches| list so we do not handle them
+        // explicitly here. See https://bugs.webkit.org/show_bug.cgi?id=37609
+        // for further discussion about the TouchStationary state.
+        if (pointState != PlatformTouchPoint::TouchStationary && touchInfo.knownTarget) {
+            ASSERT(pointState < PlatformTouchPoint::TouchStateEnd);
+            if (!changedTouches[pointState].m_touches)
+                changedTouches[pointState].m_touches = TouchList::create();
+            changedTouches[pointState].m_touches->append(touch);
+            changedTouches[pointState].m_targets.add(touchInfo.touchNode);
+        }
+    }
+
+    if (allTouchesReleased) {
+        m_touchSequenceDocument.clear();
+        m_touchSequenceUserGestureToken.clear();
+    }
+
+    WebInputEventResult eventResult = WebInputEventResult::NotHandled;
+
+    // Now iterate through the |changedTouches| list and |m_targets| within it,
+    // sending TouchEvents to the targets as required.
+    for (unsigned state = 0; state != PlatformTouchPoint::TouchStateEnd; ++state) {
+        if (!changedTouches[state].m_touches)
+            continue;
+
+        const AtomicString& eventName(touchEventNameForTouchPointState(static_cast<PlatformTouchPoint::TouchState>(state)));
+        for (const auto& eventTarget : changedTouches[state].m_targets) {
+            EventTarget* touchEventTarget = eventTarget;
+            TouchEvent* touchEvent = TouchEvent::create(
+                touches, touchesByTarget.get(touchEventTarget), changedTouches[state].m_touches.get(),
+                eventName, touchEventTarget->toNode()->document().domWindow(),
+                event.getModifiers(), event.cancelable(), event.causesScrollingIfUncanceled(), event.timestamp());
+
+            DispatchEventResult domDispatchResult = touchEventTarget->dispatchEvent(touchEvent);
+
+            // Only report for top level documents with a single touch on
+            // touch-start or the first touch-move.
+            if (touchStartOrFirstTouchMove && touchInfos.size() == 1 && event.cancelable() && !m_frame->document()->ownerElement()) {
+                DEFINE_STATIC_LOCAL(EnumerationHistogram, rootDocumentListenerHistogram, ("Event.Touch.TargetAndDispatchResult", TouchTargetAndDispatchResultTypeMax));
+                rootDocumentListenerHistogram.count(toTouchTargetHistogramValue(eventTarget, domDispatchResult));
+
+                // Count the handled touch starts and first touch moves before and after the page is fully loaded respectively.
+                if (m_frame->document()->isLoadCompleted()) {
+                    DEFINE_STATIC_LOCAL(EnumerationHistogram, touchDispositionsAfterPageLoadHistogram, ("Event.Touch.TouchDispositionsAfterPageLoad", TouchEventDispatchResultTypeMax));
+                    touchDispositionsAfterPageLoadHistogram.count((domDispatchResult != DispatchEventResult::NotCanceled) ? HandledTouches : UnhandledTouches);
+                } else {
+                    DEFINE_STATIC_LOCAL(EnumerationHistogram, touchDispositionsBeforePageLoadHistogram, ("Event.Touch.TouchDispositionsBeforePageLoad", TouchEventDispatchResultTypeMax));
+                    touchDispositionsBeforePageLoadHistogram.count((domDispatchResult != DispatchEventResult::NotCanceled) ? HandledTouches : UnhandledTouches);
+                }
+            }
+            eventResult = EventHandler::mergeEventResult(eventResult,
+                EventHandler::toWebInputEventResult(domDispatchResult));
+        }
+    }
+    return eventResult;
+}
+
+void TouchEventManager::updateTargetAndRegionMapsForTouchStarts(
+    HeapVector<TouchInfo>& touchInfos)
+{
+    for (auto& touchInfo : touchInfos) {
+        // Touch events implicitly capture to the touched node, and don't change
+        // active/hover states themselves (Gesture events do). So we only need
+        // to hit-test on touchstart and when the target could be different than
+        // the corresponding pointer event target.
+        if (touchInfo.point.state() == PlatformTouchPoint::TouchPressed) {
+            HitTestRequest::HitTestRequestType hitType = HitTestRequest::TouchEvent | HitTestRequest::ReadOnly | HitTestRequest::Active;
+            LayoutPoint pagePoint = roundedLayoutPoint(m_frame->view()->rootFrameToContents(touchInfo.point.pos()));
+            HitTestResult result;
+            if (!m_touchSequenceDocument) {
+                result = m_frame->eventHandler().hitTestResultAtPoint(pagePoint, hitType);
+            } else if (m_touchSequenceDocument->frame()) {
+                LayoutPoint framePoint = roundedLayoutPoint(m_touchSequenceDocument->frame()->view()->rootFrameToContents(touchInfo.point.pos()));
+                result = EventHandler::hitTestResultInFrame(m_touchSequenceDocument->frame(), framePoint, hitType);
+            } else {
+                continue;
+            }
+
+            Node* node = result.innerNode();
+            if (!node)
+                continue;
+            if (isHTMLCanvasElement(node)) {
+                std::pair<Element*, String> regionInfo = toHTMLCanvasElement(node)->getControlAndIdIfHitRegionExists(result.pointInInnerNodeFrame());
+                if (regionInfo.first)
+                    node = regionInfo.first;
+                touchInfo.region = regionInfo.second;
+            }
+            // Touch events should not go to text nodes.
+            if (node->isTextNode())
+                node = FlatTreeTraversal::parent(*node);
+            touchInfo.touchNode = node;
+
+            if (!m_touchSequenceDocument) {
+                // Keep track of which document should receive all touch events
+                // in the active sequence. This must be a single document to
+                // ensure we don't leak Nodes between documents.
+                m_touchSequenceDocument = &(touchInfo.touchNode->document());
+                ASSERT(m_touchSequenceDocument->frame()->view());
+            }
+
+            // Ideally we'd ASSERT(!m_targetForTouchID.contains(point.id())
+            // since we shouldn't get a touchstart for a touch that's already
+            // down. However EventSender allows this to be violated and there's
+            // some tests that take advantage of it. There may also be edge
+            // cases in the browser where this happens.
+            // See http://crbug.com/345372.
+            m_targetForTouchID.set(touchInfo.point.id(), touchInfo.touchNode);
+
+            m_regionForTouchID.set(touchInfo.point.id(), touchInfo.region);
+
+            TouchAction effectiveTouchAction =
+                TouchActionUtil::computeEffectiveTouchAction(
+                    *touchInfo.touchNode);
+            if (effectiveTouchAction != TouchActionAuto)
+                m_frame->page()->chromeClient().setTouchAction(effectiveTouchAction);
+        }
+    }
+}
+
+void TouchEventManager::setAllPropertiesOfTouchInfos(
+    HeapVector<TouchInfo>& touchInfos)
+{
+    for (auto& touchInfo : touchInfos) {
+        PlatformTouchPoint::TouchState pointState = touchInfo.point.state();
+        Node* touchNode = nullptr;
+        String regionID;
+
+        if (pointState == PlatformTouchPoint::TouchReleased
+            || pointState == PlatformTouchPoint::TouchCancelled) {
+            // The target should be the original target for this touch, so get
+            // it from the hashmap. As it's a release or cancel we also remove
+            // it from the map.
+            touchNode = m_targetForTouchID.take(touchInfo.point.id());
+            regionID = m_regionForTouchID.take(touchInfo.point.id());
+        } else {
+            // No hittest is performed on move or stationary, since the target
+            // is not allowed to change anyway.
+            touchNode = m_targetForTouchID.get(touchInfo.point.id());
+            regionID = m_regionForTouchID.get(touchInfo.point.id());
+        }
+
+        LocalFrame* targetFrame = nullptr;
+        bool knownTarget = false;
+        if (touchNode) {
+            Document& doc = touchNode->document();
+            // If the target node has moved to a new document while it was being touched,
+            // we can't send events to the new document because that could leak nodes
+            // from one document to another. See http://crbug.com/394339.
+            if (&doc == m_touchSequenceDocument.get()) {
+                targetFrame = doc.frame();
+                knownTarget = true;
+            }
+        }
+        if (!knownTarget) {
+            // If we don't have a target registered for the point it means we've
+            // missed our opportunity to do a hit test for it (due to some
+            // optimization that prevented blink from ever seeing the
+            // touchstart), or that the touch started outside the active touch
+            // sequence document. We should still include the touch in the
+            // Touches list reported to the application (eg. so it can
+            // differentiate between a one and two finger gesture), but we won't
+            // actually dispatch any events for it. Set the target to the
+            // Document so that there's some valid node here. Perhaps this
+            // should really be LocalDOMWindow, but in all other cases the target of
+            // a Touch is a Node so using the window could be a breaking change.
+            // Since we know there was no handler invoked, the specific target
+            // should be completely irrelevant to the application.
+            touchNode = m_touchSequenceDocument;
+            targetFrame = m_touchSequenceDocument->frame();
+        }
+        ASSERT(targetFrame);
+
+        // pagePoint should always be in the target element's document coordinates.
+        FloatPoint pagePoint = targetFrame->view()->rootFrameToContents(
+            touchInfo.point.pos());
+        float scaleFactor = 1.0f / targetFrame->pageZoomFactor();
+
+        touchInfo.touchNode = touchNode;
+        touchInfo.targetFrame = targetFrame;
+        touchInfo.adjustedPagePoint = pagePoint.scaledBy(scaleFactor);
+        touchInfo.adjustedRadius = touchInfo.point.radius().scaledBy(scaleFactor);
+        touchInfo.knownTarget = knownTarget;
+        touchInfo.consumed = false;
+        touchInfo.region = regionID;
+    }
+}
+
+bool TouchEventManager::generateTouchInfosAfterHittest(
+    const PlatformTouchEvent& event,
+    HeapVector<TouchInfo>& touchInfos)
+{
+    bool newTouchSequence = true;
+    bool allTouchesReleased = true;
+
+    for (const auto& point : event.touchPoints()) {
+        if (point.state() != PlatformTouchPoint::TouchPressed)
+            newTouchSequence = false;
+        if (point.state() != PlatformTouchPoint::TouchReleased && point.state() != PlatformTouchPoint::TouchCancelled)
+            allTouchesReleased = false;
+    }
+    if (newTouchSequence) {
+        // Ideally we'd ASSERT(!m_touchSequenceDocument) here since we should
+        // have cleared the active document when we saw the last release. But we
+        // have some tests that violate this, ClusterFuzz could trigger it, and
+        // there may be cases where the browser doesn't reliably release all
+        // touches. http://crbug.com/345372 tracks this.
+        m_touchSequenceDocument.clear();
+        m_touchSequenceUserGestureToken.clear();
+    }
+
+    ASSERT(m_frame->view());
+    if (m_touchSequenceDocument && (!m_touchSequenceDocument->frame() || !m_touchSequenceDocument->frame()->view())) {
+        // If the active touch document has no frame or view, it's probably being destroyed
+        // so we can't dispatch events.
+        return false;
+    }
+
+    for (const auto& point : event.touchPoints()) {
+        TouchEventManager::TouchInfo touchInfo;
+        touchInfo.point = point;
+        touchInfos.append(touchInfo);
+    }
+
+    updateTargetAndRegionMapsForTouchStarts(touchInfos);
+
+    m_touchPressed = !allTouchesReleased;
+
+    // If there's no document receiving touch events, or no handlers on the
+    // document set to receive the events, then we can skip all the rest of
+    // this work.
+    if (!m_touchSequenceDocument || !m_touchSequenceDocument->frameHost() || !hasTouchHandlers(m_touchSequenceDocument->frameHost()->eventHandlerRegistry()) || !m_touchSequenceDocument->frame()) {
+        if (allTouchesReleased) {
+            m_touchSequenceDocument.clear();
+            m_touchSequenceUserGestureToken.clear();
+        }
+        return false;
+    }
+
+    setAllPropertiesOfTouchInfos(touchInfos);
+
+    return true;
+}
+
+WebInputEventResult TouchEventManager::handleTouchEvent(
+    const PlatformTouchEvent& event,
+    const HeapVector<TouchInfo>& touchInfos)
+{
+    // Note that the disposition of any pointer events affects only the generation of touch
+    // events. If all pointer events were handled (and hence no touch events were fired), that
+    // is still equivalent to the touch events going unhandled because pointer event handler
+    // don't block scroll gesture generation.
+
+    // TODO(crbug.com/507408): If PE handlers always call preventDefault, we won't see TEs until after
+    // scrolling starts because the scrolling would suppress upcoming PEs. This sudden "break" in TE
+    // suppression can make the visible TEs inconsistent (e.g. touchmove without a touchstart).
+
+    bool allTouchesReleased = true;
+    for (const auto& point : event.touchPoints()) {
+        if (point.state() != PlatformTouchPoint::TouchReleased
+            && point.state() != PlatformTouchPoint::TouchCancelled)
+            allTouchesReleased = false;
+    }
+
+    // Whether a touch should be considered a "user gesture" or not is a tricky question.
+    // https://docs.google.com/document/d/1oF1T3O7_E4t1PYHV6gyCwHxOi3ystm0eSL5xZu7nvOg/edit#
+    // TODO(rbyers): Disable user gesture in some cases but retain logging for now (crbug.com/582140).
+    OwnPtr<UserGestureIndicator> gestureIndicator;
+    if (event.touchPoints().size() == 1
+        && event.touchPoints()[0].state() == PlatformTouchPoint::TouchReleased
+        && !event.causesScrollingIfUncanceled()) {
+        // This is a touchend corresponding to a tap, definitely a user gesture.  So don't supply
+        // a UserGestureUtilizedCallback.
+        gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessingUserGesture));
+    } else {
+        // This is some other touch event that perhaps shouldn't be considered a user gesture.  So
+        // use a UserGestureUtilizedCallback to get metrics / deprecation warnings.
+        if (m_touchSequenceUserGestureToken)
+            gestureIndicator = adoptPtr(new UserGestureIndicator(m_touchSequenceUserGestureToken.release(), &m_touchSequenceDocument->frame()->eventHandler()));
+        else
+            gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessingUserGesture, &m_touchSequenceDocument->frame()->eventHandler()));
+        m_touchSequenceUserGestureToken = UserGestureIndicator::currentToken();
+    }
+
+    return dispatchTouchEvents(event, touchInfos, allTouchesReleased);
+}
+
+void TouchEventManager::clear()
+{
+    m_touchSequenceDocument.clear();
+    m_touchSequenceUserGestureToken.clear();
+    m_targetForTouchID.clear();
+    m_regionForTouchID.clear();
+    m_touchPressed = false;
+    m_waitingForFirstTouchMove = false;
+}
+
+bool TouchEventManager::isAnyTouchActive() const
+{
+    return m_touchPressed;
+}
+
+DEFINE_TRACE(TouchEventManager)
+{
+    visitor->trace(m_frame);
+    visitor->trace(m_touchSequenceDocument);
+    visitor->trace(m_targetForTouchID);
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/core/input/TouchEventManager.h b/third_party/WebKit/Source/core/input/TouchEventManager.h
new file mode 100644
index 0000000..6de6c56
--- /dev/null
+++ b/third_party/WebKit/Source/core/input/TouchEventManager.h
@@ -0,0 +1,102 @@
+// Copyright 2016 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 TouchEventManager_h
+#define TouchEventManager_h
+
+#include "core/CoreExport.h"
+#include "core/events/PointerEventFactory.h"
+#include "platform/UserGestureIndicator.h"
+#include "public/platform/WebInputEventResult.h"
+#include "wtf/Allocator.h"
+#include "wtf/HashMap.h"
+
+
+namespace blink {
+
+class LocalFrame;
+class Document;
+class PlatformTouchEvent;
+class PointerEventWithTarget;
+
+// This class takes care of dispatching all touch events and
+// maintaining related states.
+class CORE_EXPORT TouchEventManager {
+    DISALLOW_NEW();
+public:
+    class TouchInfo {
+        DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
+    public:
+        DEFINE_INLINE_TRACE()
+        {
+            visitor->trace(touchNode);
+            visitor->trace(targetFrame);
+        }
+
+        PlatformTouchPoint point;
+        Member<Node> touchNode;
+        Member<LocalFrame> targetFrame;
+        FloatPoint adjustedPagePoint;
+        FloatSize adjustedRadius;
+        bool knownTarget;
+        bool consumed;
+        String region;
+    };
+
+    explicit TouchEventManager(LocalFrame*);
+    ~TouchEventManager();
+    DECLARE_TRACE();
+
+    // Returns true if it succesfully generates touchInfos.
+    bool generateTouchInfosAfterHittest(
+        const PlatformTouchEvent&,
+        HeapVector<TouchInfo>&);
+
+    WebInputEventResult handleTouchEvent(
+        const PlatformTouchEvent&,
+        const HeapVector<TouchInfo>&);
+
+    // Resets the internal state of this object.
+    void clear();
+
+    // Returns whether there is any touch on the screen.
+    bool isAnyTouchActive() const;
+
+private:
+
+    void updateTargetAndRegionMapsForTouchStarts(HeapVector<TouchInfo>&);
+    void setAllPropertiesOfTouchInfos(HeapVector<TouchInfo>&);
+
+    WebInputEventResult dispatchTouchEvents(
+        const PlatformTouchEvent&,
+        const HeapVector<TouchInfo>&,
+        bool allTouchesReleased);
+
+
+    // NOTE: If adding a new field to this class please ensure that it is
+    // cleared in |TouchEventManager::clear()|.
+
+    const Member<LocalFrame> m_frame;
+
+    // The target of each active touch point indexed by the touch ID.
+    using TouchTargetMap = HeapHashMap<unsigned, Member<Node>, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZeroKeyHashTraits<unsigned>>;
+    TouchTargetMap m_targetForTouchID;
+    using TouchRegionMap = HashMap<unsigned, String, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZeroKeyHashTraits<unsigned>>;
+    TouchRegionMap m_regionForTouchID;
+
+    // If set, the document of the active touch sequence. Unset if no touch sequence active.
+    Member<Document> m_touchSequenceDocument;
+
+    RefPtr<UserGestureToken> m_touchSequenceUserGestureToken;
+    bool m_touchPressed;
+    // True if waiting on first touch move after a touch start.
+    bool m_waitingForFirstTouchMove;
+
+};
+
+} // namespace blink
+
+WTF_ALLOW_INIT_WITH_MEM_FUNCTIONS(blink::TouchEventManager::TouchInfo);
+
+#endif // TouchEventManager_h
diff --git a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl
index 7394098..91feced 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl
+++ b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl
@@ -170,6 +170,9 @@
     void documentThreadableLoaderStartedLoadingForClient(ExecutionContext*, unsigned long identifier, ThreadableLoaderClient* client);
 
     [Resource]
+    void documentThreadableLoaderFailedToStartLoadingForClient(ExecutionContext*, ThreadableLoaderClient* client);
+
+    [Resource]
     void willSendEventSourceRequest(ExecutionContext*, ThreadableLoaderClient* eventSource);
 
     [Resource]
diff --git a/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp
index 795bb92..bf1a65ff 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp
@@ -635,21 +635,42 @@
     m_resourcesData->setResourceType(IdentifiersFactory::requestId(identifier), InspectorPageAgent::ScriptResource);
 }
 
+void InspectorResourceAgent::clearPendingRequestData()
+{
+    if (m_pendingRequestType == InspectorPageAgent::XHRResource)
+        m_pendingXHRReplayData.clear();
+    m_pendingRequest = nullptr;
+}
+
 void InspectorResourceAgent::documentThreadableLoaderStartedLoadingForClient(unsigned long identifier, ThreadableLoaderClient* client)
 {
     if (!client)
         return;
-    ASSERT(client == m_pendingRequest || !m_pendingRequest);
-    if (client != m_pendingRequest)
+    if (client != m_pendingRequest) {
+        ASSERT(!m_pendingRequest);
         return;
+    }
+
     m_knownRequestIdMap.set(client, identifier);
     String requestId = IdentifiersFactory::requestId(identifier);
     m_resourcesData->setResourceType(requestId, m_pendingRequestType);
     if (m_pendingRequestType == InspectorPageAgent::XHRResource) {
         m_resourcesData->setXHRReplayData(requestId, m_pendingXHRReplayData.get());
-        m_pendingXHRReplayData.clear();
     }
-    m_pendingRequest = nullptr;
+
+    clearPendingRequestData();
+}
+
+void InspectorResourceAgent::documentThreadableLoaderFailedToStartLoadingForClient(ThreadableLoaderClient* client)
+{
+    if (!client)
+        return;
+    if (client != m_pendingRequest) {
+        ASSERT(!m_pendingRequest);
+        return;
+    }
+
+    clearPendingRequestData();
 }
 
 void InspectorResourceAgent::willLoadXHR(XMLHttpRequest* xhr, ThreadableLoaderClient* client, const AtomicString& method, const KURL& url, bool async, PassRefPtr<EncodedFormData> formData, const HTTPHeaderMap& headers, bool includeCredentials)
@@ -685,8 +706,7 @@
 
 void InspectorResourceAgent::didFinishXHRInternal(ExecutionContext* context, XMLHttpRequest* xhr, ThreadableLoaderClient* client, const AtomicString& method, const String& url, bool success)
 {
-    m_pendingRequest = nullptr;
-    m_pendingXHRReplayData.clear();
+    clearPendingRequestData();
 
     // This method will be called from the XHR.
     // We delay deleting the replay XHR, as deleting here may delete the caller.
@@ -750,7 +770,7 @@
 void InspectorResourceAgent::didFinishEventSourceRequest(ThreadableLoaderClient* eventSource)
 {
     m_knownRequestIdMap.remove(eventSource);
-    m_pendingRequest = nullptr;
+    clearPendingRequestData();
 }
 
 void InspectorResourceAgent::removedResourceFromMemoryCache(Resource* cachedResource)
diff --git a/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.h b/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.h
index 13df8ce..f8af775 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.h
+++ b/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.h
@@ -97,6 +97,7 @@
     bool shouldBlockRequest(const ResourceRequest&);
 
     void documentThreadableLoaderStartedLoadingForClient(unsigned long identifier, ThreadableLoaderClient*);
+    void documentThreadableLoaderFailedToStartLoadingForClient(ThreadableLoaderClient*);
     void willLoadXHR(XMLHttpRequest*, ThreadableLoaderClient*, const AtomicString& method, const KURL&, bool async, PassRefPtr<EncodedFormData> body, const HTTPHeaderMap& headers, bool includeCrendentials);
     void didFailXHRLoading(ExecutionContext*, XMLHttpRequest*, ThreadableLoaderClient*, const AtomicString&, const String&);
     void didFinishXHRLoading(ExecutionContext*, XMLHttpRequest*, ThreadableLoaderClient*, const AtomicString&, const String&);
@@ -163,6 +164,7 @@
 
     bool canGetResponseBodyBlob(const String& requestId);
     void getResponseBodyBlob(const String& requestId, PassOwnPtr<GetResponseBodyCallback>);
+    void clearPendingRequestData();
 
     Member<InspectedFrames> m_inspectedFrames;
     String m_userAgentOverride;
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlock.h b/third_party/WebKit/Source/core/layout/LayoutBlock.h
index 120557d2e..a9ac7fe 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBlock.h
+++ b/third_party/WebKit/Source/core/layout/LayoutBlock.h
@@ -500,7 +500,7 @@
     unsigned m_widthAvailableToChildrenChanged  : 1;
     unsigned m_heightAvailableToChildrenChanged  : 1;
     unsigned m_isSelfCollapsing : 1; // True if margin-before and margin-after are adjoining.
-    mutable unsigned m_descendantsWithFloatsMarkedForLayout : 1;
+    unsigned m_descendantsWithFloatsMarkedForLayout : 1;
 
     unsigned m_hasPositionedObjects : 1;
     unsigned m_hasPercentHeightDescendants : 1;
diff --git a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
index c92e55a5..a7ffcac 100644
--- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
@@ -292,6 +292,7 @@
 
         ScrollPositionMap scrollMap;
         if (LayoutBlock::finishDelayUpdateScrollInfo(&layoutScope, &scrollMap)) {
+            prepareOrderIteratorAndMargins();
             layoutFlexItems(false, layoutScope);
             for (auto& entry : scrollMap) {
                 entry.key->scrollToPosition(entry.value, ScrollOffsetClamped);
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.h b/third_party/WebKit/Source/core/layout/LayoutObject.h
index c6139fb..b55d4f535 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.h
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.h
@@ -88,7 +88,6 @@
 enum MarkingBehavior {
     MarkOnlyThis,
     MarkContainerChain,
-    MarkContainerChainInLayout,
 };
 
 enum MapCoordinatesMode {
@@ -2013,8 +2012,8 @@
             TRACE_EVENT_SCOPE_THREAD,
             "data",
             InspectorLayoutInvalidationTrackingEvent::data(this, reason));
-        if (markParents != MarkOnlyThis && (!layouter || layouter->root() != this))
-            markContainerChainForLayout(!layouter && markParents == MarkContainerChain, layouter);
+        if (markParents == MarkContainerChain && (!layouter || layouter->root() != this))
+            markContainerChainForLayout(!layouter, layouter);
     }
 }
 
@@ -2050,8 +2049,8 @@
     bool alreadyNeededLayout = normalChildNeedsLayout();
     setNormalChildNeedsLayout(true);
     // FIXME: Replace MarkOnlyThis with the SubtreeLayoutScope code path and remove the MarkingBehavior argument entirely.
-    if (!alreadyNeededLayout && markParents != MarkOnlyThis && (!layouter || layouter->root() != this))
-        markContainerChainForLayout(!layouter && markParents == MarkContainerChain, layouter);
+    if (!alreadyNeededLayout && markParents == MarkContainerChain && (!layouter || layouter->root() != this))
+        markContainerChainForLayout(!layouter, layouter);
 }
 
 inline void LayoutObject::setNeedsPositionedMovementLayout()
diff --git a/third_party/WebKit/Source/core/layout/LayoutView.cpp b/third_party/WebKit/Source/core/layout/LayoutView.cpp
index 67bbb1b..4b389045 100644
--- a/third_party/WebKit/Source/core/layout/LayoutView.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutView.cpp
@@ -486,9 +486,6 @@
 
 bool LayoutView::mapToVisualRectInAncestorSpace(const LayoutBoxModelObject* ancestor, LayoutRect& rect, MapCoordinatesFlags mode, VisualRectFlags visualRectFlags) const
 {
-    if (document().printing())
-        return true;
-
     // Convert the rect into the physical coordinates space of this LayoutView.
     flipForWritingMode(rect);
 
diff --git a/third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp b/third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp
index 574c7c5e..096ca91 100644
--- a/third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp
+++ b/third_party/WebKit/Source/core/layout/PaintInvalidationState.cpp
@@ -14,54 +14,8 @@
 #include "core/layout/svg/SVGLayoutSupport.h"
 #include "core/paint/PaintLayer.h"
 
-// We can't enable this by default because saturated operations of LayoutUnit
-// don't conform commutative law for overflowing results, preventing us from
-// making fast path and slow path always return the same result.
-#define ASSERT_SAME_RESULT_SLOW_AND_FAST_PATH (0 && ENABLE(ASSERT))
-
 namespace blink {
 
-#if ASSERT_SAME_RESULT_SLOW_AND_FAST_PATH
-// Make sure that the fast path and the slow path generate the same rect.
-void assertRectsEqual(const LayoutObject& object, const LayoutBoxModelObject& ancestor, const LayoutRect& rect, const LayoutRect& slowPathRect)
-{
-    // TODO(wangxianzhu): This is for cases that a sub-frame creates a root PaintInvalidationState
-    // which doesn't inherit clip from ancestor frames.
-    // Remove the condition when we eliminate the latter case of PaintInvalidationState(const LayoutView&, ...).
-    if (object.isLayoutView())
-        return;
-
-    // We ignore ancestor clipping for FixedPosition in fast path.
-    if (object.styleRef().position() == FixedPosition)
-        return;
-
-    // TODO(crbug.com/597903): Fast path and slow path should generate equal empty rects.
-    if (rect.isEmpty() && slowPathRect.isEmpty())
-        return;
-
-    if (rect == slowPathRect)
-        return;
-
-    // Tolerate the difference between the two paths when crossing frame boundaries.
-    if (object.view() != ancestor.view()) {
-        LayoutRect inflatedRect = rect;
-        inflatedRect.inflate(1);
-        if (inflatedRect.contains(slowPathRect))
-            return;
-        LayoutRect inflatedSlowPathRect = slowPathRect;
-        inflatedSlowPathRect.inflate(1);
-        if (inflatedSlowPathRect.contains(rect))
-            return;
-    }
-
-#ifndef NDEBUG
-    WTFLogAlways("Fast path paint invalidation rect differs from slow path: %s vs %s", rect.toString().ascii().data(), slowPathRect.toString().ascii().data());
-    showLayoutTree(&object);
-#endif
-    ASSERT_NOT_REACHED();
-}
-#endif
-
 static bool supportsCachedOffsets(const LayoutObject& object)
 {
     return !object.hasTransformRelatedProperty()
@@ -89,6 +43,9 @@
 #if ENABLE(ASSERT)
     , m_didUpdateForChildren(false)
 #endif
+#ifdef CHECK_FAST_PATH_SLOW_PATH_EQUALITY
+    , m_canCheckFastPathSlowPathEquality(layoutView == m_paintInvalidationContainer)
+#endif
 {
     if (!supportsCachedOffsets(layoutView)) {
         m_cachedOffsetsEnabled = false;
@@ -121,6 +78,9 @@
 #if ENABLE(ASSERT)
     , m_didUpdateForChildren(false)
 #endif
+#ifdef CHECK_FAST_PATH_SLOW_PATH_EQUALITY
+    , m_canCheckFastPathSlowPathEquality(parentState.m_canCheckFastPathSlowPathEquality)
+#endif
 {
     if (currentObject == parentState.m_currentObject) {
         // Sometimes we create a new PaintInvalidationState from parentState on the same object
@@ -201,6 +161,9 @@
 
         m_clipped = false; // Will be updated in updateForChildren().
         m_paintOffset = LayoutSize();
+#ifdef CHECK_FAST_PATH_SLOW_PATH_EQUALITY
+        m_canCheckFastPathSlowPathEquality = true;
+#endif
         return;
     }
 
@@ -235,7 +198,12 @@
         // In the above way to get paint offset, we can't get accurate clip rect, so just assume no clip.
         // Clip on fixed-position is rare, in case that paintInvalidationContainer crosses frame boundary
         // and the LayoutView is clipped by something in owner document.
-        m_clipped = false;
+        if (m_clipped) {
+            m_clipped = false;
+#ifdef CHECK_FAST_PATH_SLOW_PATH_EQUALITY
+            m_canCheckFastPathSlowPathEquality = false;
+#endif
+        }
         return;
     }
 
@@ -348,7 +316,7 @@
             if (m_currentObject.isSVG() && !m_currentObject.isSVGRoot())
                 point = m_svgTransform.mapPoint(point);
             point += FloatPoint(m_paintOffset);
-#if ASSERT_SAME_RESULT_SLOW_AND_FAST_PATH
+#ifdef CHECK_FAST_PATH_SLOW_PATH_EQUALITY
             // TODO(wangxianzhu): We can't enable this ASSERT for now because of crbug.com/597745.
             // ASSERT(point == slowLocalOriginToAncestorPoint(m_currentObject, m_paintInvalidationContainer, FloatPoint());
 #endif
@@ -384,9 +352,9 @@
         rect.move(m_paintOffset);
         if (m_clipped)
             rect.intersect(m_clipRect);
-#if ASSERT_SAME_RESULT_SLOW_AND_FAST_PATH
+#ifdef CHECK_FAST_PATH_SLOW_PATH_EQUALITY
         LayoutRect slowPathRect = SVGLayoutSupport::clippedOverflowRectForPaintInvalidation(m_currentObject, *m_paintInvalidationContainer);
-        assertRectsEqual(m_currentObject, m_paintInvalidationContainer, rect, slowPathRect);
+        assertFastPathAndSlowPathRectsEqual(rect, slowPathRect);
 #endif
     } else {
         // TODO(wangxianzhu): Sometimes m_cachedOffsetsEnabled==false doesn't mean we can't use cached
@@ -412,15 +380,15 @@
     ASSERT(!m_didUpdateForChildren);
 
     if (m_cachedOffsetsEnabled) {
-#if ASSERT_SAME_RESULT_SLOW_AND_FAST_PATH
+#ifdef CHECK_FAST_PATH_SLOW_PATH_EQUALITY
         LayoutRect slowPathRect(rect);
         slowMapToVisualRectInAncestorSpace(m_currentObject, *m_paintInvalidationContainer, slowPathRect);
 #endif
         rect.move(m_paintOffset);
         if (m_clipped)
             rect.intersect(m_clipRect);
-#if ASSERT_SAME_RESULT_SLOW_AND_FAST_PATH
-        assertRectsEqual(m_currentObject, *m_paintInvalidationContainer, rect, slowPathRect);
+#ifdef CHECK_FAST_PATH_SLOW_PATH_EQUALITY
+        assertFastPathAndSlowPathRectsEqual(rect, slowPathRect);
 #endif
     } else {
         slowMapToVisualRectInAncestorSpace(m_currentObject, *m_paintInvalidationContainer, rect);
@@ -455,4 +423,56 @@
     return m_enclosingSelfPaintingLayer;
 }
 
+#ifdef CHECK_FAST_PATH_SLOW_PATH_EQUALITY
+
+static bool mayHaveBeenSaturated(LayoutUnit value)
+{
+    // This is not accurate, just to avoid too big values.
+    return value.abs() >= LayoutUnit::max() / 2;
+}
+
+static bool mayHaveBeenSaturated(const LayoutRect& rect)
+{
+    return mayHaveBeenSaturated(rect.x()) || mayHaveBeenSaturated(rect.y()) || mayHaveBeenSaturated(rect.width()) || mayHaveBeenSaturated(rect.height());
+}
+
+void PaintInvalidationState::assertFastPathAndSlowPathRectsEqual(const LayoutRect& fastPathRect, const LayoutRect& slowPathRect) const
+{
+    if (!m_canCheckFastPathSlowPathEquality)
+        return;
+
+    // TODO(crbug.com/597903): Fast path and slow path should generate equal empty rects.
+    if (fastPathRect.isEmpty() && slowPathRect.isEmpty())
+        return;
+
+    if (fastPathRect == slowPathRect)
+        return;
+
+    // LayoutUnit uses saturated arithmetic operations. If any interim or final result is saturated,
+    // the same operations in different order produce different results. Don't compare results
+    // if any of them may have been saturated.
+    if (mayHaveBeenSaturated(fastPathRect) || mayHaveBeenSaturated(slowPathRect))
+        return;
+
+    // Tolerate the difference between the two paths when crossing frame boundaries.
+    if (m_currentObject.view() != m_paintInvalidationContainer->view()) {
+        LayoutRect inflatedFastPathRect = fastPathRect;
+        inflatedFastPathRect.inflate(1);
+        if (inflatedFastPathRect.contains(slowPathRect))
+            return;
+        LayoutRect inflatedSlowPathRect = slowPathRect;
+        inflatedSlowPathRect.inflate(1);
+        if (inflatedSlowPathRect.contains(fastPathRect))
+            return;
+    }
+
+    WTFLogAlways("Fast path paint invalidation rect differs from slow path: fast: %s vs slow: %s",
+        fastPathRect.toString().ascii().data(), slowPathRect.toString().ascii().data());
+    showLayoutTree(&m_currentObject);
+
+    ASSERT_NOT_REACHED();
+}
+
+#endif // CHECK_FAST_PATH_SLOW_PATH_EQUALITY
+
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/PaintInvalidationState.h b/third_party/WebKit/Source/core/layout/PaintInvalidationState.h
index 50e2c73..196cbf9 100644
--- a/third_party/WebKit/Source/core/layout/PaintInvalidationState.h
+++ b/third_party/WebKit/Source/core/layout/PaintInvalidationState.h
@@ -142,6 +142,15 @@
 #if ENABLE(ASSERT)
     bool m_didUpdateForChildren;
 #endif
+
+#if ENABLE(ASSERT) && !defined(NDEBUG)
+// #define CHECK_FAST_PATH_SLOW_PATH_EQUALITY
+#endif
+
+#ifdef CHECK_FAST_PATH_SLOW_PATH_EQUALITY
+    void assertFastPathAndSlowPathRectsEqual(const LayoutRect& fastPathRect, const LayoutRect& slowPathRect) const;
+    bool m_canCheckFastPathSlowPathEquality;
+#endif
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ScrollAnchor.cpp b/third_party/WebKit/Source/core/layout/ScrollAnchor.cpp
index dbefd1b..642b37e 100644
--- a/third_party/WebKit/Source/core/layout/ScrollAnchor.cpp
+++ b/third_party/WebKit/Source/core/layout/ScrollAnchor.cpp
@@ -172,9 +172,21 @@
 
     LayoutSize adjustment = computeRelativeOffset(m_anchorObject, m_scroller, m_corner) - m_savedRelativeOffset;
     if (!adjustment.isZero()) {
-        m_scroller->setScrollPosition(
-            m_scroller->scrollPositionDouble() + DoubleSize(adjustment),
-            AnchoringScroll);
+        ScrollAnimatorBase* animator = m_scroller->existingScrollAnimator();
+        if (!animator || !animator->hasRunningAnimation()) {
+            m_scroller->setScrollPosition(
+                m_scroller->scrollPositionDouble() + DoubleSize(adjustment),
+                AnchoringScroll);
+        } else {
+            // If in the middle of a scroll animation, stop the animation, make
+            // the adjustment, and continue the animation on the pending delta.
+            FloatSize pendingDelta = animator->desiredTargetPosition() - FloatPoint(m_scroller->scrollPositionDouble());
+            animator->cancelAnimation();
+            m_scroller->setScrollPosition(
+                m_scroller->scrollPositionDouble() + DoubleSize(adjustment),
+                AnchoringScroll);
+            animator->userScroll(ScrollByPixel, pendingDelta);
+        }
         // Update UMA metric.
         DEFINE_STATIC_LOCAL(EnumerationHistogram, adjustedOffsetHistogram,
             ("Layout.ScrollAnchor.AdjustedScrollOffset", 2));
diff --git a/third_party/WebKit/Source/core/layout/TextAutosizer.cpp b/third_party/WebKit/Source/core/layout/TextAutosizer.cpp
index a1477fc..bd8e1ee1 100644
--- a/third_party/WebKit/Source/core/layout/TextAutosizer.cpp
+++ b/third_party/WebKit/Source/core/layout/TextAutosizer.cpp
@@ -398,8 +398,6 @@
                 if (!cell->needsLayout())
                     continue;
 
-                // TODO(kojii): Callers should pass SubtreeLayoutScope to give
-                // to beginLayout/inflate.
                 beginLayout(cell, nullptr);
                 inflate(cell, nullptr, DescendToInnerBlocks);
                 endLayout(cell);
@@ -993,10 +991,8 @@
         m_stylesRetainedDuringLayout.append(&currentStyle);
 
         layoutObject->setStyleInternal(style.release());
-        // TODO(kojii): layouter should not be nullptr once all callers are
-        // fixed to pass SubtreeLayoutScope.
         DCHECK(!layouter || layoutObject->isDescendantOf(&layouter->root()));
-        layoutObject->setNeedsLayoutAndFullPaintInvalidation(LayoutInvalidationReason::TextAutosizing, MarkContainerChainInLayout, layouter);
+        layoutObject->setNeedsLayoutAndFullPaintInvalidation(LayoutInvalidationReason::TextAutosizing, MarkContainerChain, layouter);
         break;
 
     case LayoutNeeded:
diff --git a/third_party/WebKit/Source/core/layout/TextAutosizer.h b/third_party/WebKit/Source/core/layout/TextAutosizer.h
index a99f0751..8a65400 100644
--- a/third_party/WebKit/Source/core/layout/TextAutosizer.h
+++ b/third_party/WebKit/Source/core/layout/TextAutosizer.h
@@ -73,8 +73,6 @@
     class LayoutScope {
         STACK_ALLOCATED();
     public:
-        // TODO(kojii): SubtreeLayoutScope should not be optional once all
-        // callers are fixed.
         explicit LayoutScope(LayoutBlock*, SubtreeLayoutScope* = nullptr);
         ~LayoutScope();
     protected:
diff --git a/third_party/WebKit/Source/core/layout/api/LineLayoutSVGInlineText.h b/third_party/WebKit/Source/core/layout/api/LineLayoutSVGInlineText.h
index 06cbd997..c251d09 100644
--- a/third_party/WebKit/Source/core/layout/api/LineLayoutSVGInlineText.h
+++ b/third_party/WebKit/Source/core/layout/api/LineLayoutSVGInlineText.h
@@ -32,9 +32,9 @@
         return toSVGInlineText()->metricsList();
     }
 
-    SVGTextLayoutAttributes& layoutAttributes()
+    SVGCharacterDataMap& characterDataMap()
     {
-        return *toSVGInlineText()->layoutAttributes();
+        return toSVGInlineText()->characterDataMap();
     }
 
     bool characterStartsNewTextChunk(int position) const
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGInlineText.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGInlineText.cpp
index be19897..fb03e76 100644
--- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGInlineText.cpp
+++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGInlineText.cpp
@@ -54,7 +54,6 @@
 LayoutSVGInlineText::LayoutSVGInlineText(Node* n, PassRefPtr<StringImpl> string)
     : LayoutText(n, normalizeWhitespace(string))
     , m_scalingFactor(1)
-    , m_layoutAttributes(this)
 {
 }
 
@@ -137,8 +136,8 @@
     if (!position && parent()->isSVGTextPath() && !previousSibling())
         return true;
 
-    const SVGCharacterDataMap::const_iterator it = m_layoutAttributes.characterDataMap().find(static_cast<unsigned>(position + 1));
-    if (it == m_layoutAttributes.characterDataMap().end())
+    const SVGCharacterDataMap::const_iterator it = m_characterDataMap.find(static_cast<unsigned>(position + 1));
+    if (it == m_characterDataMap.end())
         return false;
 
     return it->value.hasX() || it->value.hasY();
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGInlineText.h b/third_party/WebKit/Source/core/layout/svg/LayoutSVGInlineText.h
index 67f3aaf..1c24427 100644
--- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGInlineText.h
+++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGInlineText.h
@@ -23,7 +23,7 @@
 #define LayoutSVGInlineText_h
 
 #include "core/layout/LayoutText.h"
-#include "core/layout/svg/SVGTextLayoutAttributes.h"
+#include "core/layout/svg/SVGCharacterData.h"
 #include "core/layout/svg/SVGTextMetrics.h"
 #include "wtf/Vector.h"
 
@@ -34,8 +34,8 @@
     LayoutSVGInlineText(Node*, PassRefPtr<StringImpl>);
 
     bool characterStartsNewTextChunk(int position) const;
-    SVGTextLayoutAttributes* layoutAttributes() { return &m_layoutAttributes; }
-    const SVGTextLayoutAttributes* layoutAttributes() const { return &m_layoutAttributes; }
+    SVGCharacterDataMap& characterDataMap() { return m_characterDataMap; }
+    const SVGCharacterDataMap& characterDataMap() const { return m_characterDataMap; }
 
     const Vector<SVGTextMetrics>& metricsList() const { return m_metrics; }
 
@@ -72,7 +72,7 @@
 
     float m_scalingFactor;
     Font m_scaledFont;
-    SVGTextLayoutAttributes m_layoutAttributes;
+    SVGCharacterDataMap m_characterDataMap;
     Vector<SVGTextMetrics> m_metrics;
 };
 
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp
index 21ba55ca..598b5ead 100644
--- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp
+++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp
@@ -31,7 +31,6 @@
 #include "core/layout/HitTestResult.h"
 #include "core/layout/LayoutAnalyzer.h"
 #include "core/layout/LayoutState.h"
-#include "core/layout/LayoutView.h"
 #include "core/layout/PointerEventsHitRules.h"
 #include "core/layout/api/LineLayoutItem.h"
 #include "core/layout/svg/LayoutSVGInline.h"
@@ -43,10 +42,7 @@
 #include "core/layout/svg/line/SVGRootInlineBox.h"
 #include "core/paint/SVGTextPainter.h"
 #include "core/style/ShadowList.h"
-#include "core/svg/SVGLengthList.h"
 #include "core/svg/SVGTextElement.h"
-#include "core/svg/SVGTransformList.h"
-#include "core/svg/SVGURIReference.h"
 #include "platform/FloatConversion.h"
 #include "platform/geometry/FloatQuad.h"
 
@@ -77,12 +73,12 @@
 
 LayoutSVGText::~LayoutSVGText()
 {
-    ASSERT(m_layoutAttributes.isEmpty());
+    ASSERT(m_descendantTextNodes.isEmpty());
 }
 
 void LayoutSVGText::willBeDestroyed()
 {
-    m_layoutAttributes.clear();
+    m_descendantTextNodes.clear();
 
     LayoutSVGBlock::willBeDestroyed();
 }
@@ -102,17 +98,17 @@
     return findTextRoot(start);
 }
 
-static inline void collectLayoutAttributes(LayoutObject* text, Vector<SVGTextLayoutAttributes*>& attributes)
+static inline void collectDescendantTextNodes(LayoutSVGText& textRoot, Vector<LayoutSVGInlineText*>& descendantTextNodes)
 {
-    for (LayoutObject* descendant = text; descendant; descendant = descendant->nextInPreOrder(text)) {
+    for (LayoutObject* descendant = textRoot.firstChild(); descendant; descendant = descendant->nextInPreOrder(&textRoot)) {
         if (descendant->isSVGInlineText())
-            attributes.append(toLayoutSVGInlineText(descendant)->layoutAttributes());
+            descendantTextNodes.append(toLayoutSVGInlineText(descendant));
     }
 }
 
 void LayoutSVGText::invalidatePositioningValues(LayoutInvalidationReasonForTracing reason)
 {
-    m_layoutAttributes.clear();
+    m_descendantTextNodes.clear();
     setNeedsPositioningValuesUpdate();
     setNeedsLayoutAndFullPaintInvalidation(reason);
 }
@@ -120,7 +116,7 @@
 void LayoutSVGText::subtreeChildWasAdded()
 {
     if (beingDestroyed() || !everHadLayout()) {
-        ASSERT(m_layoutAttributes.isEmpty());
+        ASSERT(m_descendantTextNodes.isEmpty());
         return;
     }
     if (documentBeingDestroyed())
@@ -135,7 +131,7 @@
 void LayoutSVGText::subtreeChildWillBeRemoved()
 {
     if (beingDestroyed() || !everHadLayout()) {
-        ASSERT(m_layoutAttributes.isEmpty());
+        ASSERT(m_descendantTextNodes.isEmpty());
         return;
     }
 
@@ -149,7 +145,7 @@
 {
     ASSERT(!beingDestroyed());
     if (!everHadLayout()) {
-        ASSERT(m_layoutAttributes.isEmpty());
+        ASSERT(m_descendantTextNodes.isEmpty());
         return;
     }
 
@@ -172,12 +168,12 @@
     }
 }
 
-static inline void checkLayoutAttributesConsistency(LayoutSVGText* text, Vector<SVGTextLayoutAttributes*>& expectedLayoutAttributes)
+static inline void checkDescendantTextNodeConsistency(LayoutSVGText& text, Vector<LayoutSVGInlineText*>& expectedDescendantTextNodes)
 {
 #if ENABLE(ASSERT)
-    Vector<SVGTextLayoutAttributes*> newLayoutAttributes;
-    collectLayoutAttributes(text, newLayoutAttributes);
-    ASSERT(newLayoutAttributes == expectedLayoutAttributes);
+    Vector<LayoutSVGInlineText*> newDescendantTextNodes;
+    collectDescendantTextNodes(text, newDescendantTextNodes);
+    ASSERT(newDescendantTextNodes == expectedDescendantTextNodes);
 #endif
 }
 
@@ -216,8 +212,8 @@
     // When the x/y/dx/dy/rotate lists change, we need to recompute the layout
     // attributes.
     if (m_needsPositioningValuesUpdate) {
-        m_layoutAttributes.clear();
-        collectLayoutAttributes(this, m_layoutAttributes);
+        m_descendantTextNodes.clear();
+        collectDescendantTextNodes(*this, m_descendantTextNodes);
 
         SVGTextLayoutAttributesBuilder(*this).buildLayoutAttributes();
 
@@ -226,7 +222,7 @@
         updateParentBoundaries = true;
     }
 
-    checkLayoutAttributesConsistency(this, m_layoutAttributes);
+    checkDescendantTextNodeConsistency(*this, m_descendantTextNodes);
 
     // Reduced version of LayoutBlock::layoutBlock(), which only takes care of SVG text.
     // All if branches that could cause early exit in LayoutBlocks layoutBlock() method are turned into assertions.
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.h b/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.h
index 9c636c2..d009deae4 100644
--- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.h
+++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.h
@@ -23,13 +23,11 @@
 #define LayoutSVGText_h
 
 #include "core/layout/svg/LayoutSVGBlock.h"
-#include "platform/transforms/AffineTransform.h"
 
 namespace blink {
 
 class LayoutSVGInlineText;
 class SVGTextElement;
-class SVGTextLayoutAttributes;
 
 class LayoutSVGText final : public LayoutSVGBlock {
 public:
@@ -50,7 +48,7 @@
     static const LayoutSVGText* locateLayoutSVGTextAncestor(const LayoutObject*);
 
     bool needsReordering() const { return m_needsReordering; }
-    Vector<SVGTextLayoutAttributes*>& layoutAttributes() { return m_layoutAttributes; }
+    const Vector<LayoutSVGInlineText*>& descendantTextNodes() const { return m_descendantTextNodes; }
 
     void subtreeChildWasAdded();
     void subtreeChildWillBeRemoved();
@@ -85,7 +83,7 @@
     bool m_needsPositioningValuesUpdate : 1;
     bool m_needsTransformUpdate : 1;
     bool m_needsTextMetricsUpdate : 1;
-    Vector<SVGTextLayoutAttributes*> m_layoutAttributes;
+    Vector<LayoutSVGInlineText*> m_descendantTextNodes;
 };
 
 DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutSVGText, isSVGText());
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributes.h b/third_party/WebKit/Source/core/layout/svg/SVGCharacterData.h
similarity index 69%
rename from third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributes.h
rename to third_party/WebKit/Source/core/layout/svg/SVGCharacterData.h
index 27d81c76..9427fe8 100644
--- a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributes.h
+++ b/third_party/WebKit/Source/core/layout/svg/SVGCharacterData.h
@@ -17,18 +17,15 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef SVGTextLayoutAttributes_h
-#define SVGTextLayoutAttributes_h
+#ifndef SVGCharacterData_h
+#define SVGCharacterData_h
 
 #include "wtf/Allocator.h"
 #include "wtf/HashMap.h"
 #include "wtf/MathExtras.h"
-#include "wtf/Noncopyable.h"
 
 namespace blink {
 
-class LayoutSVGInlineText;
-
 struct SVGCharacterData {
     DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
     SVGCharacterData();
@@ -49,28 +46,6 @@
     float rotate;
 };
 
-typedef HashMap<unsigned, SVGCharacterData> SVGCharacterDataMap;
-
-class SVGTextLayoutAttributes {
-    DISALLOW_NEW();
-    WTF_MAKE_NONCOPYABLE(SVGTextLayoutAttributes);
-public:
-    SVGTextLayoutAttributes(LayoutSVGInlineText*);
-
-    void clear();
-    static float emptyValue() { return std::numeric_limits<float>::quiet_NaN(); }
-    static bool isEmptyValue(float value) { return std::isnan(value); }
-
-    LayoutSVGInlineText* context() const { return m_context; }
-
-    SVGCharacterDataMap& characterDataMap() { return m_characterDataMap; }
-    const SVGCharacterDataMap& characterDataMap() const { return m_characterDataMap; }
-
-private:
-    LayoutSVGInlineText* m_context;
-    SVGCharacterDataMap m_characterDataMap;
-};
-
 inline SVGCharacterData::SVGCharacterData()
     : x(emptyValue())
     , y(emptyValue())
@@ -80,6 +55,8 @@
 {
 }
 
+typedef HashMap<unsigned, SVGCharacterData> SVGCharacterDataMap;
+
 } // namespace blink
 
 #endif
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributes.cpp b/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributes.cpp
deleted file mode 100644
index d9de03c..0000000
--- a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributes.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) Research In Motion Limited 2010-11. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "core/layout/svg/SVGTextLayoutAttributes.h"
-
-namespace blink {
-
-SVGTextLayoutAttributes::SVGTextLayoutAttributes(LayoutSVGInlineText* context)
-    : m_context(context)
-{
-}
-
-void SVGTextLayoutAttributes::clear()
-{
-    m_characterDataMap.clear();
-}
-
-} // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributesBuilder.cpp b/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributesBuilder.cpp
index 5c248811..f2c8cd5 100644
--- a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributesBuilder.cpp
+++ b/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributesBuilder.cpp
@@ -30,8 +30,8 @@
 
 void updateLayoutAttributes(LayoutSVGInlineText& text, unsigned& valueListPosition, const SVGCharacterDataMap& allCharactersMap)
 {
-    SVGTextLayoutAttributes& attributes = *text.layoutAttributes();
-    attributes.clear();
+    SVGCharacterDataMap& characterDataMap = text.characterDataMap();
+    characterDataMap.clear();
 
     const Vector<SVGTextMetrics>& metricsList = text.metricsList();
     auto metricsEnd = metricsList.end();
@@ -42,7 +42,7 @@
 
         auto it = allCharactersMap.find(valueListPosition + 1);
         if (it != allCharactersMap.end())
-            attributes.characterDataMap().set(currentPosition + 1, it->value);
+            characterDataMap.set(currentPosition + 1, it->value);
 
         // Increase the position in the value/attribute list with one for each
         // "character unit" (that will be displayed.)
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributesBuilder.h b/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributesBuilder.h
index e09cf19f..67f6f192 100644
--- a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributesBuilder.h
+++ b/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutAttributesBuilder.h
@@ -20,7 +20,7 @@
 #ifndef SVGTextLayoutAttributesBuilder_h
 #define SVGTextLayoutAttributesBuilder_h
 
-#include "core/layout/svg/SVGTextLayoutAttributes.h"
+#include "core/layout/svg/SVGCharacterData.h"
 #include "platform/heap/Handle.h"
 #include "wtf/Allocator.h"
 #include "wtf/Vector.h"
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.cpp b/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.cpp
index 4da94e4..7d74996e 100644
--- a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.cpp
+++ b/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.cpp
@@ -33,9 +33,9 @@
 
 namespace blink {
 
-SVGTextLayoutEngine::SVGTextLayoutEngine(Vector<SVGTextLayoutAttributes*>& layoutAttributes)
-    : m_layoutAttributes(layoutAttributes)
-    , m_layoutAttributesPosition(0)
+SVGTextLayoutEngine::SVGTextLayoutEngine(const Vector<LayoutSVGInlineText*>& descendantTextNodes)
+    : m_descendantTextNodes(descendantTextNodes)
+    , m_currentLogicalTextNodeIndex(0)
     , m_logicalCharacterOffset(0)
     , m_logicalMetricsListOffset(0)
     , m_isVerticalText(false)
@@ -47,7 +47,7 @@
     , m_textPathSpacing(0)
     , m_textPathScaling(1)
 {
-    ASSERT(!m_layoutAttributes.isEmpty());
+    ASSERT(!m_descendantTextNodes.isEmpty());
 }
 
 SVGTextLayoutEngine::~SVGTextLayoutEngine() = default;
@@ -156,7 +156,7 @@
 {
     // Build text chunks for all <textPath> children, using the line layout algorithm.
     // This is needeed as text-anchor is just an additional startOffset for text paths.
-    SVGTextLayoutEngine lineLayout(m_layoutAttributes);
+    SVGTextLayoutEngine lineLayout(m_descendantTextNodes);
     lineLayout.m_textLengthSpacingInEffect = m_textLengthSpacingInEffect;
     lineLayout.layoutCharactersInTextBoxes(flowBox);
 
@@ -276,65 +276,54 @@
     m_lineLayoutBoxes.clear();
 }
 
-const SVGTextLayoutAttributes* SVGTextLayoutEngine::nextLogicalAttributes()
+const LayoutSVGInlineText* SVGTextLayoutEngine::nextLogicalTextNode()
 {
-    ASSERT(m_layoutAttributesPosition < m_layoutAttributes.size());
-    ++m_layoutAttributesPosition;
-    if (m_layoutAttributesPosition == m_layoutAttributes.size())
+    ASSERT(m_currentLogicalTextNodeIndex < m_descendantTextNodes.size());
+    ++m_currentLogicalTextNodeIndex;
+    if (m_currentLogicalTextNodeIndex == m_descendantTextNodes.size())
         return nullptr;
 
     m_logicalMetricsListOffset = 0;
     m_logicalCharacterOffset = 0;
-    return m_layoutAttributes[m_layoutAttributesPosition];
+    return m_descendantTextNodes[m_currentLogicalTextNodeIndex];
 }
 
-const SVGTextLayoutAttributes* SVGTextLayoutEngine::currentLogicalCharacterMetrics(SVGTextMetrics& logicalMetrics)
+const LayoutSVGInlineText* SVGTextLayoutEngine::currentLogicalCharacterMetrics(SVGTextMetrics& logicalMetrics)
 {
-    // If we're consumed all layout attributes, there can be no more metrics.
-    if (m_layoutAttributesPosition == m_layoutAttributes.size())
+    // If we've consumed all text nodes, there can be no more metrics.
+    if (m_currentLogicalTextNodeIndex == m_descendantTextNodes.size())
         return nullptr;
 
-    const SVGTextLayoutAttributes* logicalAttributes = m_layoutAttributes[m_layoutAttributesPosition];
-    // If we reached the end of the text node associated with the current set
-    // of layout attributes, try to move to the next text node/set of layout
-    // attributes.
-    ASSERT(m_logicalCharacterOffset <= logicalAttributes->context()->textLength());
-    if (m_logicalCharacterOffset == logicalAttributes->context()->textLength()) {
-        logicalAttributes = nextLogicalAttributes();
-        if (!logicalAttributes)
-            return nullptr;
-    }
-
-    // We have set of layout attributes. Find the first non-collapsed text
-    // metrics cell.
-    const Vector<SVGTextMetrics>* metricsList = &logicalAttributes->context()->metricsList();
+    const LayoutSVGInlineText* logicalTextNode = m_descendantTextNodes[m_currentLogicalTextNodeIndex];
+    const Vector<SVGTextMetrics>* metricsList = &logicalTextNode->metricsList();
     unsigned metricsListSize = metricsList->size();
-    while (true) {
-        // If we run out of metrics, move to the next set of layout attributes.
-        if (m_logicalMetricsListOffset == metricsListSize) {
-            logicalAttributes = nextLogicalAttributes();
-            if (!logicalAttributes)
-                return nullptr;
+    ASSERT(m_logicalMetricsListOffset <= metricsListSize);
 
-            metricsList = &logicalAttributes->context()->metricsList();
+    // Find the next non-collapsed text metrics cell.
+    while (true) {
+        // If we run out of metrics, move to the next set of non-empty layout
+        // attributes.
+        if (m_logicalMetricsListOffset == metricsListSize) {
+            logicalTextNode = nextLogicalTextNode();
+            if (!logicalTextNode)
+                return nullptr;
+            metricsList = &logicalTextNode->metricsList();
             metricsListSize = metricsList->size();
+            // Return to the while so that we check if the new metrics list is
+            // non-empty before using it.
             continue;
         }
 
         ASSERT(metricsListSize);
-        ASSERT(m_logicalMetricsListOffset < metricsListSize);
         logicalMetrics = metricsList->at(m_logicalMetricsListOffset);
-        if (logicalMetrics.isEmpty() || (!logicalMetrics.width() && !logicalMetrics.height())) {
-            advanceToNextLogicalCharacter(logicalMetrics);
-            continue;
-        }
-
         // Stop if we found the next valid logical text metrics object.
-        return logicalAttributes;
+        if (!logicalMetrics.isEmpty())
+            break;
+
+        advanceToNextLogicalCharacter(logicalMetrics);
     }
 
-    ASSERT_NOT_REACHED();
-    return nullptr;
+    return logicalTextNode;
 }
 
 void SVGTextLayoutEngine::advanceToNextLogicalCharacter(const SVGTextMetrics& logicalMetrics)
@@ -379,15 +368,11 @@
         }
 
         SVGTextMetrics logicalMetrics(SVGTextMetrics::SkippedSpaceMetrics);
-        const SVGTextLayoutAttributes* logicalAttributes = currentLogicalCharacterMetrics(logicalMetrics);
-        if (!logicalAttributes)
+        const LayoutSVGInlineText* logicalTextNode = currentLogicalCharacterMetrics(logicalMetrics);
+        if (!logicalTextNode)
             break;
 
-        const SVGCharacterDataMap& characterDataMap = logicalAttributes->characterDataMap();
-        SVGCharacterData data;
-        SVGCharacterDataMap::const_iterator it = characterDataMap.find(m_logicalCharacterOffset + 1);
-        if (it != characterDataMap.end())
-            data = it->value;
+        const SVGCharacterData data = logicalTextNode->characterDataMap().get(m_logicalCharacterOffset + 1);
 
         // TODO(fs): Use the return value to eliminate the additional
         // hash-lookup below when determining if this text box should be tagged
@@ -397,7 +382,7 @@
         // When we've advanced to the box start offset, determine using the original x/y values,
         // whether this character starts a new text chunk, before doing any further processing.
         if (m_visualMetricsIterator.characterOffset() == textBox->start())
-            textBox->setStartsNewTextChunk(logicalAttributes->context()->characterStartsNewTextChunk(m_logicalCharacterOffset));
+            textBox->setStartsNewTextChunk(logicalTextNode->characterStartsNewTextChunk(m_logicalCharacterOffset));
 
         bool hasRelativePosition = applyRelativePositionAdjustmentsIfNeeded(data);
 
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.h b/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.h
index 368551b92..5e61b74 100644
--- a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.h
+++ b/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.h
@@ -23,8 +23,6 @@
 #include "core/layout/api/LineLayoutSVGInlineText.h"
 #include "core/layout/svg/LayoutSVGInlineText.h"
 #include "core/layout/svg/SVGTextFragment.h"
-#include "core/layout/svg/SVGTextLayoutAttributes.h"
-#include "core/layout/svg/SVGTextMetrics.h"
 #include "wtf/Allocator.h"
 #include "wtf/Vector.h"
 
@@ -36,6 +34,7 @@
 class PathPositionMapper;
 class SVGInlineFlowBox;
 class SVGInlineTextBox;
+class SVGTextMetrics;
 
 // SVGTextLayoutEngine performs the second layout phase for SVG text.
 //
@@ -49,11 +48,9 @@
     STACK_ALLOCATED();
     WTF_MAKE_NONCOPYABLE(SVGTextLayoutEngine);
 public:
-    SVGTextLayoutEngine(Vector<SVGTextLayoutAttributes*>&);
+    SVGTextLayoutEngine(const Vector<LayoutSVGInlineText*>&);
     ~SVGTextLayoutEngine();
 
-    Vector<SVGTextLayoutAttributes*>& layoutAttributes() { return m_layoutAttributes; }
-
     void layoutCharactersInTextBoxes(InlineFlowBox* start);
     void finishLayout();
 
@@ -71,13 +68,13 @@
     void layoutInlineTextBox(SVGInlineTextBox*);
     void layoutTextOnLineOrPath(SVGInlineTextBox*, LineLayoutSVGInlineText, const ComputedStyle&);
 
-    const SVGTextLayoutAttributes* nextLogicalAttributes();
-    const SVGTextLayoutAttributes* currentLogicalCharacterMetrics(SVGTextMetrics&);
+    const LayoutSVGInlineText* nextLogicalTextNode();
+    const LayoutSVGInlineText* currentLogicalCharacterMetrics(SVGTextMetrics&);
     void advanceToNextLogicalCharacter(const SVGTextMetrics&);
 
     // Logical iteration state.
-    Vector<SVGTextLayoutAttributes*>& m_layoutAttributes;
-    unsigned m_layoutAttributesPosition;
+    const Vector<LayoutSVGInlineText*>& m_descendantTextNodes;
+    unsigned m_currentLogicalTextNodeIndex;
     unsigned m_logicalCharacterOffset;
     unsigned m_logicalMetricsListOffset;
 
diff --git a/third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp b/third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp
index 18675ed..a02e485 100644
--- a/third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp
+++ b/third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp
@@ -50,15 +50,15 @@
 {
     LayoutSVGText& textRoot = toLayoutSVGText(*LineLayoutAPIShim::layoutObjectFrom(block()));
 
-    Vector<SVGTextLayoutAttributes*>& layoutAttributes = textRoot.layoutAttributes();
-    if (layoutAttributes.isEmpty())
+    const Vector<LayoutSVGInlineText*>& descendantTextNodes = textRoot.descendantTextNodes();
+    if (descendantTextNodes.isEmpty())
         return;
 
     if (textRoot.needsReordering())
         reorderValueLists();
 
     // Perform SVG text layout phase two (see SVGTextLayoutEngine for details).
-    SVGTextLayoutEngine characterLayout(layoutAttributes);
+    SVGTextLayoutEngine characterLayout(descendantTextNodes);
     characterLayout.layoutCharactersInTextBoxes(this);
 
     // Perform SVG text layout phase three (see SVGTextChunkBuilder for details).
@@ -156,12 +156,12 @@
 static inline void swapPositioningValuesInTextBoxes(SVGInlineTextBox* firstTextBox, SVGInlineTextBox* lastTextBox)
 {
     LineLayoutSVGInlineText firstTextNode = LineLayoutSVGInlineText(firstTextBox->getLineLayoutItem());
-    SVGCharacterDataMap& firstCharacterDataMap = firstTextNode.layoutAttributes().characterDataMap();
+    SVGCharacterDataMap& firstCharacterDataMap = firstTextNode.characterDataMap();
     SVGCharacterDataMap::iterator itFirst = firstCharacterDataMap.find(firstTextBox->start() + 1);
     if (itFirst == firstCharacterDataMap.end())
         return;
     LineLayoutSVGInlineText lastTextNode = LineLayoutSVGInlineText(lastTextBox->getLineLayoutItem());
-    SVGCharacterDataMap& lastCharacterDataMap = lastTextNode.layoutAttributes().characterDataMap();
+    SVGCharacterDataMap& lastCharacterDataMap = lastTextNode.characterDataMap();
     SVGCharacterDataMap::iterator itLast = lastCharacterDataMap.find(lastTextBox->start() + 1);
     if (itLast == lastCharacterDataMap.end())
         return;
diff --git a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
index 8951304..0cb013b 100644
--- a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
@@ -145,6 +145,7 @@
     m_redirectMode = request.fetchRedirectMode();
 
     if (!m_sameOriginRequest && m_options.crossOriginRequestPolicy == DenyCrossOriginRequests) {
+        InspectorInstrumentation::documentThreadableLoaderFailedToStartLoadingForClient(m_document, m_client);
         ThreadableLoaderClient* client = m_client;
         clear();
         client->didFail(ResourceError(errorDomainBlinkInternal, 0, request.url().getString(), "Cross origin requests are not supported."));
@@ -257,6 +258,7 @@
     // is no reason to send a request, preflighted or not, that's guaranteed
     // to be denied.
     if (!SchemeRegistry::shouldTreatURLSchemeAsCORSEnabled(request.url().protocol())) {
+        InspectorInstrumentation::documentThreadableLoaderFailedToStartLoadingForClient(m_document, m_client);
         ThreadableLoaderClient* client = m_client;
         clear();
         client->didFailAccessControlCheck(ResourceError(errorDomainBlinkInternal, 0, request.url().getString(), "Cross origin requests are only supported for protocol schemes: " + SchemeRegistry::listOfCORSEnabledURLSchemes() + "."));
@@ -842,6 +844,8 @@
             newRequest.setOriginRestriction(FetchRequest::NoOriginRestriction);
         ASSERT(!resource());
 
+        WeakPtr<DocumentThreadableLoader> self(m_weakFactory.createWeakPtr());
+
         if (request.requestContext() == WebURLRequest::RequestContextVideo || request.requestContext() == WebURLRequest::RequestContextAudio)
             setResource(RawResource::fetchMedia(newRequest, document().fetcher()));
         else if (request.requestContext() == WebURLRequest::RequestContextManifest)
@@ -849,9 +853,20 @@
         else
             setResource(RawResource::fetch(newRequest, document().fetcher()));
 
+        // setResource() might call notifyFinished() synchronously, and thus
+        // clear() might be called and |this| may be dead here.
+        if (!self)
+            return;
+
         if (!resource()) {
+            InspectorInstrumentation::documentThreadableLoaderFailedToStartLoadingForClient(m_document, m_client);
             ThreadableLoaderClient* client = m_client;
             clear();
+            // setResource() might call notifyFinished() and thus clear()
+            // synchronously, and in such cases ThreadableLoaderClient is
+            // already notified and |client| is null.
+            if (!client)
+                return;
             client->didFail(ResourceError(errorDomainBlinkInternal, 0, requestURL.getString(), "Failed to start loading."));
             // |this| may be dead here.
             return;
@@ -860,6 +875,8 @@
         if (resource()->loader()) {
             unsigned long identifier = resource()->identifier();
             InspectorInstrumentation::documentThreadableLoaderStartedLoadingForClient(m_document, identifier, m_client);
+        } else {
+            InspectorInstrumentation::documentThreadableLoaderFailedToStartLoadingForClient(m_document, m_client);
         }
         return;
     }
diff --git a/third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.cpp b/third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.cpp
index b29be4d..b10144a 100644
--- a/third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.cpp
+++ b/third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.cpp
@@ -14,6 +14,7 @@
 
 OffscreenCanvas::OffscreenCanvas(const IntSize& size)
     : m_size(size)
+    , m_originClean(true)
 {
 }
 
@@ -102,6 +103,13 @@
     renderingContextFactories()[type] = std::move(renderingContextFactory);
 }
 
+bool OffscreenCanvas::originClean() const
+{
+    // TODO(crbug.com/607575): Make Settings accessable in worker and use
+    // disableReadingFromCanvas to determine originClean value.
+    return m_originClean;
+}
+
 DEFINE_TRACE(OffscreenCanvas)
 {
     visitor->trace(m_context);
diff --git a/third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.h b/third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.h
index f97398d3..f6e592a7 100644
--- a/third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.h
+++ b/third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.h
@@ -43,6 +43,9 @@
 
     static void registerRenderingContextFactory(PassOwnPtr<CanvasRenderingContextFactory>);
 
+    bool originClean() const;
+    void setOriginTainted() { m_originClean = false; }
+
     DECLARE_VIRTUAL_TRACE();
 
 private:
@@ -56,6 +59,8 @@
     int m_canvasId = -1; // DOMNodeIds starts from 0, using -1 to indicate no associated canvas element.
     IntSize m_size;
     bool m_isNeutered = false;
+
+    bool m_originClean;
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/page/PageAnimator.cpp b/third_party/WebKit/Source/core/page/PageAnimator.cpp
index 5e86b465..19a7dd32 100644
--- a/third_party/WebKit/Source/core/page/PageAnimator.cpp
+++ b/third_party/WebKit/Source/core/page/PageAnimator.cpp
@@ -57,9 +57,9 @@
                 for (ScrollableArea* scrollableArea : animatingScrollableAreasCopy)
                     scrollableArea->serviceScrollAnimations(monotonicAnimationStartTime);
             }
+            SVGDocumentExtensions::serviceOnAnimationFrame(*document);
         }
-        // TODO(skyostil): These functions should not run for documents without views.
-        SVGDocumentExtensions::serviceOnAnimationFrame(*document, monotonicAnimationStartTime);
+        // TODO(skyostil): This function should not run for documents without views.
         document->serviceScriptedAnimations(monotonicAnimationStartTime);
     }
 
diff --git a/third_party/WebKit/Source/core/paint/NinePieceImagePainter.cpp b/third_party/WebKit/Source/core/paint/NinePieceImagePainter.cpp
index 334f029..a0e7b245 100644
--- a/third_party/WebKit/Source/core/paint/NinePieceImagePainter.cpp
+++ b/third_party/WebKit/Source/core/paint/NinePieceImagePainter.cpp
@@ -42,15 +42,19 @@
 
     // NinePieceImage returns the image slices without effective zoom applied and thus we compute
     // the nine piece grid on top of the image in unzoomed coordinates.
-    LayoutSize defaultObjectSize = borderImageRect.size();
-    defaultObjectSize.scale(1 / style.effectiveZoom());
-    IntSize imageSize = roundedIntSize(styleImage->imageSize(m_layoutObject, 1, defaultObjectSize));
+    //
+    // FIXME: The default object size passed to imageSize() should be scaled by the zoom factor
+    // passed in. In this case it means that borderImageRect should be passed in compensated by
+    // effective zoom, since the scale factor is one. For generated images, the actual image data
+    // (gradient stops, etc.) are scaled to effective zoom instead so we must take care not to cause
+    // scale of them again.
+    IntSize imageSize = roundedIntSize(styleImage->imageSize(m_layoutObject, 1, borderImageRect.size()));
 
     IntRectOutsets borderWidths(style.borderTopWidth(), style.borderRightWidth(),
         style.borderBottomWidth(), style.borderLeftWidth());
     NinePieceImageGrid grid(ninePieceImage, imageSize, pixelSnappedIntRect(borderImageRect), borderWidths);
 
-    RefPtr<Image> image = styleImage->image(m_layoutObject, imageSize, 1);
+    RefPtr<Image> image = styleImage->image(m_layoutObject, imageSize, style.effectiveZoom());
 
     InterpolationQuality interpolationQuality = BoxPainter::chooseInterpolationQuality(m_layoutObject, image.get(), 0, rectWithOutsets.size());
     InterpolationQuality previousInterpolationQuality = graphicsContext.imageInterpolationQuality();
diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.cpp b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
index fd6d49a..6185791 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayer.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
@@ -1334,6 +1334,8 @@
         const LayoutBoxModelObject& previousPaintInvalidationContainer = layoutObject()->parent()->containerForPaintInvalidation();
         if (!previousPaintInvalidationContainer.styleRef().isStackingContext()) {
             layoutObject()->invalidatePaintIncludingNonSelfPaintingLayerDescendants(previousPaintInvalidationContainer);
+            // Set needsRepaint along the original compositingContainer chain.
+            layoutObject()->parent()->enclosingLayer()->setNeedsRepaint();
             didSetPaintInvalidation = true;
         }
     }
diff --git a/third_party/WebKit/Source/core/streams/ReadableStream.js b/third_party/WebKit/Source/core/streams/ReadableStream.js
index 46eef54..644af500 100644
--- a/third_party/WebKit/Source/core/streams/ReadableStream.js
+++ b/third_party/WebKit/Source/core/streams/ReadableStream.js
@@ -505,10 +505,6 @@
     return stream[readableStreamBits] & DISTURBED;
   }
 
-  function SetReadableStreamDisturbed(stream) {
-    return stream[readableStreamBits] |= DISTURBED;
-  }
-
   function IsReadableStreamLocked(stream) {
     return stream[readableStreamReader] !== undefined;
   }
@@ -818,7 +814,6 @@
   binding.AcquireReadableStreamReader = AcquireReadableStreamReader;
   binding.IsReadableStream = IsReadableStream;
   binding.IsReadableStreamDisturbed = IsReadableStreamDisturbed;
-  binding.SetReadableStreamDisturbed = SetReadableStreamDisturbed;
   binding.IsReadableStreamLocked = IsReadableStreamLocked;
   binding.IsReadableStreamReadable = IsReadableStreamReadable;
   binding.IsReadableStreamClosed = IsReadableStreamClosed;
diff --git a/third_party/WebKit/Source/core/streams/ReadableStreamOperations.cpp b/third_party/WebKit/Source/core/streams/ReadableStreamOperations.cpp
index 612a1ad4..c931da1 100644
--- a/third_party/WebKit/Source/core/streams/ReadableStreamOperations.cpp
+++ b/third_party/WebKit/Source/core/streams/ReadableStreamOperations.cpp
@@ -65,14 +65,6 @@
     return V8ScriptRunner::callExtraOrCrash(scriptState, "IsReadableStreamDisturbed", args)->ToBoolean()->Value();
 }
 
-void ReadableStreamOperations::setDisturbed(ScriptState* scriptState, ScriptValue stream)
-{
-    ASSERT(isReadableStream(scriptState, stream));
-
-    v8::Local<v8::Value> args[] = { stream.v8Value() };
-    V8ScriptRunner::callExtraOrCrash(scriptState, "SetReadableStreamDisturbed", args);
-}
-
 bool ReadableStreamOperations::isLocked(ScriptState* scriptState, ScriptValue stream)
 {
     ASSERT(isReadableStream(scriptState, stream));
diff --git a/third_party/WebKit/Source/core/streams/ReadableStreamOperations.h b/third_party/WebKit/Source/core/streams/ReadableStreamOperations.h
index bd885ba6..0051bee 100644
--- a/third_party/WebKit/Source/core/streams/ReadableStreamOperations.h
+++ b/third_party/WebKit/Source/core/streams/ReadableStreamOperations.h
@@ -43,10 +43,6 @@
     // This function assumes |isReadableStream(stream)|.
     static bool isDisturbed(ScriptState*, ScriptValue stream);
 
-    // SetReadableStreamDisturbed
-    // This function assumes |isReadableStream(stream)|.
-    static void setDisturbed(ScriptState*, ScriptValue stream);
-
     // IsReadableStreamLocked
     // This function assumes |isReadableStream(stream)|.
     static bool isLocked(ScriptState*, ScriptValue stream);
diff --git a/third_party/WebKit/Source/core/streams/ReadableStreamOperationsTest.cpp b/third_party/WebKit/Source/core/streams/ReadableStreamOperationsTest.cpp
index 573ccd1ab..9cd2e60 100644
--- a/third_party/WebKit/Source/core/streams/ReadableStreamOperationsTest.cpp
+++ b/third_party/WebKit/Source/core/streams/ReadableStreamOperationsTest.cpp
@@ -359,16 +359,6 @@
     EXPECT_FALSE(underlyingSource->hasPendingActivity());
 }
 
-TEST_F(ReadableStreamOperationsTest, SetDisturbed)
-{
-    ScriptValue stream = evalWithPrintingError("new ReadableStream()");
-    ASSERT_FALSE(stream.isEmpty());
-
-    EXPECT_FALSE(ReadableStreamOperations::isDisturbed(getScriptState(), stream));
-    ReadableStreamOperations::setDisturbed(getScriptState(), stream);
-    EXPECT_TRUE(ReadableStreamOperations::isDisturbed(getScriptState(), stream));
-}
-
 TEST_F(ReadableStreamOperationsTest, IsReadable)
 {
     ScriptValue readable = evalWithPrintingError("new ReadableStream()");
diff --git a/third_party/WebKit/Source/core/svg/SVGDocumentExtensions.cpp b/third_party/WebKit/Source/core/svg/SVGDocumentExtensions.cpp
index cb607ff..8939f49f 100644
--- a/third_party/WebKit/Source/core/svg/SVGDocumentExtensions.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGDocumentExtensions.cpp
@@ -86,20 +86,20 @@
     return m_resources.get(id);
 }
 
-void SVGDocumentExtensions::serviceOnAnimationFrame(Document& document, double monotonicAnimationStartTime)
+void SVGDocumentExtensions::serviceOnAnimationFrame(Document& document)
 {
     if (!document.svgExtensions())
         return;
-    document.accessSVGExtensions().serviceAnimations(monotonicAnimationStartTime);
+    document.accessSVGExtensions().serviceAnimations();
 }
 
-void SVGDocumentExtensions::serviceAnimations(double monotonicAnimationStartTime)
+void SVGDocumentExtensions::serviceAnimations()
 {
     if (RuntimeEnabledFeatures::smilEnabled()) {
         HeapVector<Member<SVGSVGElement>> timeContainers;
         copyToVector(m_timeContainers, timeContainers);
         for (const auto& container : timeContainers)
-            container->timeContainer()->serviceAnimations(monotonicAnimationStartTime);
+            container->timeContainer()->serviceAnimations();
     }
 
     SVGElementSet webAnimationsPendingSVGElements;
diff --git a/third_party/WebKit/Source/core/svg/SVGDocumentExtensions.h b/third_party/WebKit/Source/core/svg/SVGDocumentExtensions.h
index 5ecbb1b2..a825a447 100644
--- a/third_party/WebKit/Source/core/svg/SVGDocumentExtensions.h
+++ b/third_party/WebKit/Source/core/svg/SVGDocumentExtensions.h
@@ -55,7 +55,7 @@
     void removeResource(const AtomicString& id);
     LayoutSVGResourceContainer* resourceById(const AtomicString& id) const;
 
-    static void serviceOnAnimationFrame(Document&, double monotonicAnimationStartTime);
+    static void serviceOnAnimationFrame(Document&);
 
     void startAnimations();
     void pauseAnimations();
@@ -107,7 +107,7 @@
     void removeElementFromPendingResources(Element*);
     SVGPendingElements* removePendingResource(const AtomicString& id);
 
-    void serviceAnimations(double monotonicAnimationStartTime);
+    void serviceAnimations();
 
     // The following two functions are used for scheduling a pending resource to be removed.
     void markPendingResourcesForRemoval(const AtomicString&);
diff --git a/third_party/WebKit/Source/core/svg/animation/SMILTimeContainer.cpp b/third_party/WebKit/Source/core/svg/animation/SMILTimeContainer.cpp
index acd0547..0a18091f 100644
--- a/third_party/WebKit/Source/core/svg/animation/SMILTimeContainer.cpp
+++ b/third_party/WebKit/Source/core/svg/animation/SMILTimeContainer.cpp
@@ -409,7 +409,7 @@
     }
 }
 
-void SMILTimeContainer::serviceAnimations(double monotonicAnimationStartTime)
+void SMILTimeContainer::serviceAnimations()
 {
     if (m_frameSchedulingState != AnimationFrame)
         return;
diff --git a/third_party/WebKit/Source/core/svg/animation/SMILTimeContainer.h b/third_party/WebKit/Source/core/svg/animation/SMILTimeContainer.h
index db097f7..33775a3 100644
--- a/third_party/WebKit/Source/core/svg/animation/SMILTimeContainer.h
+++ b/third_party/WebKit/Source/core/svg/animation/SMILTimeContainer.h
@@ -62,7 +62,7 @@
     void resume();
     void setElapsed(SMILTime);
 
-    void serviceAnimations(double monotonicAnimationStartTime);
+    void serviceAnimations();
     bool hasAnimations() const;
 
     void setDocumentOrderIndexesDirty() { m_documentOrderIndexesDirty = true; }
diff --git a/third_party/WebKit/Source/core/workers/WorkerBackingThread.cpp b/third_party/WebKit/Source/core/workers/WorkerBackingThread.cpp
index 040ce92..7267083c 100644
--- a/third_party/WebKit/Source/core/workers/WorkerBackingThread.cpp
+++ b/third_party/WebKit/Source/core/workers/WorkerBackingThread.cpp
@@ -17,6 +17,34 @@
 
 namespace blink {
 
+#define DEFINE_STATIC_LOCAL_WITH_LOCK(type, name, arguments) \
+    ASSERT(isolatesMutex().locked()); \
+    static type& name = *new type arguments
+
+static Mutex& isolatesMutex()
+{
+    DEFINE_THREAD_SAFE_STATIC_LOCAL(Mutex, mutex, new Mutex);
+    return mutex;
+}
+
+static HashSet<v8::Isolate*>& isolates()
+{
+    DEFINE_STATIC_LOCAL_WITH_LOCK(HashSet<v8::Isolate*>, isolates, ());
+    return isolates;
+}
+
+static void addWorkerIsolate(v8::Isolate* isolate)
+{
+    MutexLocker lock(isolatesMutex());
+    isolates().add(isolate);
+}
+
+static void removeWorkerIsolate(v8::Isolate* isolate)
+{
+    MutexLocker lock(isolatesMutex());
+    isolates().remove(isolate);
+}
+
 WorkerBackingThread::WorkerBackingThread(const char* name, bool shouldCallGCOnShutdown)
     : m_backingThread(WebThreadSupportingGC::create(name))
     , m_isOwningThread(true)
@@ -63,6 +91,7 @@
 {
     DCHECK(!m_isolate);
     m_isolate = V8PerIsolateData::initialize();
+    addWorkerIsolate(m_isolate);
     V8Initializer::initializeWorker(m_isolate);
     m_backingThread->initialize();
 
@@ -89,7 +118,17 @@
     m_backingThread->shutdown();
 
     V8PerIsolateData::destroy(m_isolate);
+    removeWorkerIsolate(m_isolate);
     m_isolate = nullptr;
 }
 
+// static
+void WorkerBackingThread::MemoryPressureNotificationToWorkerThreadIsolates(
+    v8::MemoryPressureLevel level)
+{
+    MutexLocker lock(isolatesMutex());
+    for (v8::Isolate* isolate : isolates())
+        isolate->MemoryPressureNotification(level);
+}
+
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/workers/WorkerBackingThread.h b/third_party/WebKit/Source/core/workers/WorkerBackingThread.h
index 08b3fc2..afbc4a0 100644
--- a/third_party/WebKit/Source/core/workers/WorkerBackingThread.h
+++ b/third_party/WebKit/Source/core/workers/WorkerBackingThread.h
@@ -61,6 +61,9 @@
 
     v8::Isolate* isolate() { return m_isolate; }
 
+    static void MemoryPressureNotificationToWorkerThreadIsolates(
+        v8::MemoryPressureLevel);
+
 private:
     WorkerBackingThread(const char* name, bool shouldCallGCOnShutdown);
     WorkerBackingThread(WebThread*, bool shouldCallGCOnSHutdown);
diff --git a/third_party/WebKit/Source/devtools/front_end/emulation/AdvancedApp.js b/third_party/WebKit/Source/devtools/front_end/emulation/AdvancedApp.js
index 1b30aa8..26c3302a 100644
--- a/third_party/WebKit/Source/devtools/front_end/emulation/AdvancedApp.js
+++ b/third_party/WebKit/Source/devtools/front_end/emulation/AdvancedApp.js
@@ -24,6 +24,7 @@
         this._rootSplitWidget.show(rootView.element);
 
         this._rootSplitWidget.setSidebarWidget(WebInspector.inspectorView);
+        WebInspector.inspectorView.setOwnerSplit(this._rootSplitWidget);
 
         this._inspectedPagePlaceholder = new WebInspector.InspectedPagePlaceholder();
         this._inspectedPagePlaceholder.addEventListener(WebInspector.InspectedPagePlaceholder.Events.Update, this._onSetInspectedPageBounds.bind(this), this);
diff --git a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js
index 946ee71..4b297da 100644
--- a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js
@@ -434,7 +434,7 @@
 
         if (this._type === WebInspector.DeviceModeModel.Type.Device) {
             var orientation = this._device.orientationByName(this._mode.orientation);
-            var outline = new Insets(0, 0, 0, 0);
+            var outline = new Insets(0, 20, 0, 0);
             if (Runtime.experiments.isEnabled("deviceFrames") && this._deviceOutlineSetting.get())
                 outline = orientation.outlineInsets || outline;
             this._fitScale = this._calculateFitScale(orientation.width, orientation.height);
@@ -448,7 +448,7 @@
         } else if (this._type === WebInspector.DeviceModeModel.Type.None) {
             this._fitScale = this._calculateFitScale(this._availableSize.width, this._availableSize.height);
             this._appliedUserAgentType = WebInspector.DeviceModeModel.UA.Desktop;
-            this._applyDeviceMetrics(this._availableSize, new Insets(0, 0, 0, 0), new Insets(0, 0, 0, 0), 1, 0, false, "", resetPageScaleFactor);
+            this._applyDeviceMetrics(this._availableSize, new Insets(0, 0, 0, 0), new Insets(0, 20, 0, 0), 1, 0, false, "", resetPageScaleFactor);
             this._applyUserAgent("");
             this._applyTouch(false, false);
         } else if (this._type === WebInspector.DeviceModeModel.Type.Responsive) {
@@ -462,7 +462,7 @@
             var defaultDeviceScaleFactor = mobile ? WebInspector.DeviceModeModel.defaultMobileScaleFactor : 0;
             this._fitScale = this._calculateFitScale(this._widthSetting.get(), this._heightSetting.get());
             this._appliedUserAgentType = this._uaSetting.get();
-            this._applyDeviceMetrics(new Size(screenWidth, screenHeight), new Insets(0, 0, 0, 0), new Insets(0, 0, 0, 0), this._scaleSetting.get(), this._deviceScaleFactorSetting.get() || defaultDeviceScaleFactor, mobile, screenHeight >= screenWidth ? "portraitPrimary" : "landscapePrimary", resetPageScaleFactor);
+            this._applyDeviceMetrics(new Size(screenWidth, screenHeight), new Insets(0, 0, 0, 0), new Insets(0, 20, 0, 0), this._scaleSetting.get(), this._deviceScaleFactorSetting.get() || defaultDeviceScaleFactor, mobile, screenHeight >= screenWidth ? "portraitPrimary" : "landscapePrimary", resetPageScaleFactor);
             this._applyUserAgent(mobile ? WebInspector.DeviceModeModel._defaultMobileUserAgent : "");
             this._applyTouch(this._uaSetting.get() === WebInspector.DeviceModeModel.UA.DesktopTouch || this._uaSetting.get() === WebInspector.DeviceModeModel.UA.Mobile, this._uaSetting.get() === WebInspector.DeviceModeModel.UA.Mobile);
         }
diff --git a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeView.js b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeView.js
index 47ce70d..c4447ec 100644
--- a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeView.js
+++ b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeView.js
@@ -380,6 +380,17 @@
         var mainTarget = WebInspector.targetManager.mainTarget();
         if (!mainTarget)
             return;
+        WebInspector.DOMModel.muteHighlight();
+
+        var zoomFactor = WebInspector.zoomManager.zoomFactor();
+        var rect = this._contentArea.getBoundingClientRect();
+        var availableSize = new Size(Math.max(rect.width * zoomFactor, 1), Math.max(rect.height * zoomFactor, 1));
+
+        if (availableSize.width < this._model.screenRect().width ||
+            availableSize.height < this._model.screenRect().height) {
+            WebInspector.inspectorView.minimize();
+        }
+
         mainTarget.pageAgent().captureScreenshot(screenshotCaptured.bind(this));
 
         /**
@@ -389,8 +400,11 @@
          */
         function screenshotCaptured(error, content)
         {
-            if (error)
+            if (error) {
+                WebInspector.DOMModel.unmuteHighlight();
+                WebInspector.inspectorView.restore();
                 return;
+            }
 
             // Create a canvas to splice the images together.
             var canvas = createElement("canvas");
@@ -441,6 +455,8 @@
                 link.download = fileName + ".png";
                 link.href = canvas.toDataURL("image/png");
                 link.click();
+                WebInspector.DOMModel.unmuteHighlight();
+                WebInspector.inspectorView.restore();
             }
         }
     },
diff --git a/third_party/WebKit/Source/devtools/front_end/gonzales/SCSSParser.js b/third_party/WebKit/Source/devtools/front_end/gonzales/SCSSParser.js
index 04cd9eb..2b04317 100644
--- a/third_party/WebKit/Source/devtools/front_end/gonzales/SCSSParser.js
+++ b/third_party/WebKit/Source/devtools/front_end/gonzales/SCSSParser.js
@@ -10,51 +10,67 @@
 {
 }
 
-/**
- * @constructor
- */
-WebInspector.SCSSParser.Result = function()
-{
-    this.properties = [];
-    this.variables = [];
-    this.mixins = [];
-}
-
 WebInspector.SCSSParser.prototype = {
     /**
      * @override
      * @param {string} content
-     * @return {!WebInspector.SCSSParser.Result}
+     * @return {!Array<!WebInspector.SCSSParser.Rule>}
      */
     parse: function(content)
     {
-        var result = new WebInspector.SCSSParser.Result();
         var ast = null;
         try {
             ast = gonzales.parse(content, {syntax: "scss"});
         } catch (e) {
-            return result;
+            return [];
         }
 
-        var extractedNodes = [];
-        WebInspector.SCSSParser.extractNodes(ast, extractedNodes);
+        /** @type {!{properties: !Array<!Gonzales.Node>, node: !Gonzales.Node}} */
+        var rootBlock = {
+            properties: [],
+            node: ast
+        };
+        /** @type {!Array<!{properties: !Array<!Gonzales.Node>, node: !Gonzales.Node}>} */
+        var blocks = [rootBlock];
+        ast.selectors = [];
+        WebInspector.SCSSParser.extractNodes(ast, blocks, rootBlock);
 
-        for (var node of extractedNodes) {
+        var rules = [];
+        for (var block of blocks)
+            this._handleBlock(block, rules);
+        return rules;
+    },
+
+    /**
+     * @param {!{node: !Gonzales.Node, properties: !Array<!Gonzales.Node>}} block
+     * @param {!Array<!WebInspector.SCSSParser.Rule>} output
+     */
+    _handleBlock: function(block, output)
+    {
+        var selectors = block.node.selectors.map(WebInspector.SCSSParser.rangeFromNode);
+        var properties = [];
+        var styleRange = WebInspector.SCSSParser.rangeFromNode(block.node);
+        styleRange.startColumn += 1;
+        styleRange.endColumn -= 1;
+        for (var node of block.properties) {
             if (node.type === "declaration")
-                this._handleDeclaration(node, result);
+                this._handleDeclaration(node, properties);
             else if (node.type === "include")
-                this._handleInclude(node, result);
+                this._handleInclude(node, properties);
             else if (node.type === "multilineComment" && node.start.line === node.end.line)
-                this._handleComment(node, result);
+                this._handleComment(node, properties);
         }
-        return result;
+        if (!selectors.length && !properties.length)
+            return;
+        var rule = new WebInspector.SCSSParser.Rule(selectors, properties, styleRange);
+        output.push(rule);
     },
 
     /**
      * @param {!Gonzales.Node} node
-     * @param {!WebInspector.SCSSParser.Result} result
+     * @param {!Array<!WebInspector.SCSSParser.Property>} output
      */
-    _handleDeclaration: function(node, result)
+    _handleDeclaration: function(node, output)
     {
         var propertyNode = node.content.find(node => node.type === "property");
         var delimeterNode = node.content.find(node => node.type === "propertyDelimiter");
@@ -67,18 +83,14 @@
         var range = /** @type {!WebInspector.TextRange} */(node.declarationRange);
 
         var property = new WebInspector.SCSSParser.Property(range, nameRange, valueRange, false);
-        var isVariable = !!propertyNode.content.find(node => node.type === "variable");
-        if (isVariable)
-            result.variables.push(property);
-        else
-            result.properties.push(property);
+        output.push(property);
     },
 
     /**
      * @param {!Gonzales.Node} node
-     * @param {!WebInspector.SCSSParser.Result} result
+     * @param {!Array<!WebInspector.SCSSParser.Property>} output
      */
-    _handleInclude: function(node, result)
+    _handleInclude: function(node, output)
     {
         var mixinName = node.content.find(node => node.type === "ident");
         if (!mixinName)
@@ -92,25 +104,25 @@
             var range = WebInspector.SCSSParser.rangeFromNode(node);
             var valueRange = WebInspector.SCSSParser.rangeFromNode(parameter);
             var property = new WebInspector.SCSSParser.Property(range, nameRange, valueRange, false);
-            result.mixins.push(property);
+            output.push(property);
         }
     },
 
     /**
      * @param {!Gonzales.Node} node
-     * @param {!WebInspector.SCSSParser.Result} result
+     * @param {!Array<!WebInspector.SCSSParser.Property>} output
      */
-    _handleComment: function(node, result)
+    _handleComment: function(node, output)
     {
         if (node.start.line !== node.end.line)
             return;
         var innerText = /** @type {string} */(node.content);
         var innerResult = this.parse(innerText);
-        if (innerResult.properties.length !== 1 || innerResult.variables.length !== 0 || innerResult.mixins.length !== 0)
+        if (innerResult.length !== 1 || innerResult[0].properties.length !== 1)
             return;
-        var property = innerResult.properties[0];
+        var property = innerResult[0].properties[0];
         var disabledProperty = property.rebaseInsideOneLineComment(node);
-        result.properties.push(disabledProperty);
+        output.push(disabledProperty);
     },
 }
 
@@ -167,28 +179,55 @@
 }
 
 /**
- * @param {!Gonzales.Node} node
- * @param {!Array<!Gonzales.Node>} output
+ * @constructor
+ * @param {!Array<!WebInspector.TextRange>} selectors
+ * @param {!Array<!WebInspector.SCSSParser.Property>} properties
+ * @param {!WebInspector.TextRange} styleRange
  */
-WebInspector.SCSSParser.extractNodes = function(node, output)
+WebInspector.SCSSParser.Rule = function(selectors, properties, styleRange)
+{
+    this.selectors = selectors;
+    this.properties = properties;
+    this.styleRange = styleRange;
+}
+
+/**
+ * @param {!Gonzales.Node} node
+ * @param {!Array<{node: !Gonzales.Node, properties: !Array<!Gonzales.Node>}>} blocks
+ * @param {!{node: !Gonzales.Node, properties: !Array<!Gonzales.Node>}} lastBlock
+ */
+WebInspector.SCSSParser.extractNodes = function(node, blocks, lastBlock)
 {
     if (!Array.isArray(node.content))
         return;
+    if (node.type === "block") {
+        lastBlock = {
+            node: node,
+            properties: []
+        };
+        blocks.push(lastBlock);
+    }
     var lastDeclaration = null;
+    var selectors = [];
     for (var i = 0; i < node.content.length; ++i) {
         var child = node.content[i];
         if (child.type === "declarationDelimiter" && lastDeclaration) {
             lastDeclaration.declarationRange.endLine = child.end.line - 1;
             lastDeclaration.declarationRange.endColumn = child.end.column;
             lastDeclaration = null;
+        } else if (child.type === "selector") {
+            selectors.push(child);
+        } else if (child.type === "block") {
+            child.selectors = selectors;
+            selectors = [];
         }
         if (child.type === "include" || child.type === "declaration" || child.type === "multilineComment")
-            output.push(child);
+            lastBlock.properties.push(child);
         if (child.type === "declaration") {
             lastDeclaration = child;
             lastDeclaration.declarationRange = WebInspector.TextRange.createFromLocation(child.start.line - 1, child.start.column - 1);
         }
-        WebInspector.SCSSParser.extractNodes(child, output);
+        WebInspector.SCSSParser.extractNodes(child, blocks, lastBlock);
     }
     if (lastDeclaration) {
         lastDeclaration.declarationRange.endLine = node.end.line - 1;
diff --git a/third_party/WebKit/Source/devtools/front_end/main/Main.js b/third_party/WebKit/Source/devtools/front_end/main/Main.js
index 711852f5..d012c5a 100644
--- a/third_party/WebKit/Source/devtools/front_end/main/Main.js
+++ b/third_party/WebKit/Source/devtools/front_end/main/Main.js
@@ -113,7 +113,6 @@
         Runtime.experiments.register("layoutEditor", "Layout editor", true);
         Runtime.experiments.register("inspectTooltip", "Dark inspect element tooltip");
         Runtime.experiments.register("liveSASS", "Live SASS", true);
-        Runtime.experiments.register("networkRequestsOnTimeline", "Network requests on Timeline", true);
         Runtime.experiments.register("privateScriptInspection", "Private script inspection");
         Runtime.experiments.register("reducedIndentation", "Reduced indentation in Elements DOM tree");
         Runtime.experiments.register("requestBlocking", "Request blocking", true);
diff --git a/third_party/WebKit/Source/devtools/front_end/main/renderingOptions.css b/third_party/WebKit/Source/devtools/front_end/main/renderingOptions.css
index 019ddf0..bb269e5 100644
--- a/third_party/WebKit/Source/devtools/front_end/main/renderingOptions.css
+++ b/third_party/WebKit/Source/devtools/front_end/main/renderingOptions.css
@@ -22,15 +22,3 @@
     margin-bottom: 10px;
     background: #f0f0f0;
 }
-
-.dt-checkbox-text {
-    color: #262626;
-    font-size: 12px;
-    margin-left: 6px;
-}
-
-.dt-checkbox-subtitle {
-    color: #4a4a4a;
-    font-size: 10px;
-    margin-top: 2px;
-}
diff --git a/third_party/WebKit/Source/devtools/front_end/network/NetworkConfigView.js b/third_party/WebKit/Source/devtools/front_end/network/NetworkConfigView.js
index 4542502..cf8604a 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/NetworkConfigView.js
+++ b/third_party/WebKit/Source/devtools/front_end/network/NetworkConfigView.js
@@ -126,7 +126,7 @@
             otherUserAgentElement.value = value;
             otherUserAgentElement.title = value;
         } else {
-            otherUserAgentElement.focus();
+            otherUserAgentElement.select();
         }
     }
 
@@ -145,17 +145,13 @@
 
         if (!selectionRestored)
             userAgentSelectElement.selectedIndex = 0;
-
-        if (otherUserAgentElement.value !== value) {
-            otherUserAgentElement.value = value;
-            otherUserAgentElement.title = value;
-        }
     }
 
     function textChanged()
     {
         if (userAgentSetting.get() !== otherUserAgentElement.value) {
             userAgentSetting.set(otherUserAgentElement.value);
+            otherUserAgentElement.title = otherUserAgentElement.value;
             settingChanged();
         }
     }
diff --git a/third_party/WebKit/Source/devtools/front_end/network/RequestPreviewView.js b/third_party/WebKit/Source/devtools/front_end/network/RequestPreviewView.js
index c090848..5c77d9ee 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/RequestPreviewView.js
+++ b/third_party/WebKit/Source/devtools/front_end/network/RequestPreviewView.js
@@ -148,8 +148,10 @@
         }
 
         var xmlView = this._xmlView();
-        if (xmlView)
-            return xmlView;
+        if (xmlView) {
+            callback(xmlView);
+            return;
+        }
 
         WebInspector.JSONView.parseJSON(this._requestContent()).then(chooseView.bind(this)).then(callback);
 
diff --git a/third_party/WebKit/Source/devtools/front_end/resources/CookieItemsView.js b/third_party/WebKit/Source/devtools/front_end/resources/CookieItemsView.js
index 96df23c..980e14a8 100644
--- a/third_party/WebKit/Source/devtools/front_end/resources/CookieItemsView.js
+++ b/third_party/WebKit/Source/devtools/front_end/resources/CookieItemsView.js
@@ -125,7 +125,7 @@
         function populateResourcesForDocuments(resource)
         {
             var url = resource.documentURL.asParsedURL();
-            if (url && url.host == this._cookieDomain)
+            if (url && url.securityOrigin() == this._cookieDomain)
                 resourceURLsForDocumentURL.push(resource.url);
         }
         WebInspector.forAllResources(populateResourcesForDocuments.bind(this));
diff --git a/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js b/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js
index 07a53fe..34d38ccd 100644
--- a/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js
+++ b/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js
@@ -61,16 +61,22 @@
     {
         if (!event)
             return new WebInspector.SASSSupport.AST(document, []);
-        var data = /** @type {!{properties: !Array<!Object>, variables: !Array<!Object>, mixins: !Array<!Object>}} */(event.data);
-        var properties = data.properties.map(createProperty);
-        var variables = data.variables.map(createProperty);
-        var mixins = data.mixins.map(createProperty);
-        var rules = [
-            new WebInspector.SASSSupport.Rule(document, "variables", WebInspector.TextRange.createFromLocation(0, 0), variables),
-            new WebInspector.SASSSupport.Rule(document, "properties", WebInspector.TextRange.createFromLocation(0, 0), properties),
-            new WebInspector.SASSSupport.Rule(document, "mixins", WebInspector.TextRange.createFromLocation(0, 0), mixins)
-        ];
-
+        var data = /** @type {!Array<!Object>} */(event.data);
+        var rules = [];
+        for (var i = 0; i < data.length; ++i) {
+            var rulePayload = data[i];
+            var selectorText = "";
+            if (rulePayload.selectors.length) {
+                var first = rulePayload.selectors[0];
+                var last = rulePayload.selectors.peekLast();
+                var selectorRange = new WebInspector.TextRange(first.startLine, first.startColumn, last.endLine, last.endColumn);
+                selectorText = text.extract(selectorRange);
+            }
+            var properties = rulePayload.properties.map(createProperty);
+            var range = WebInspector.TextRange.fromObject(rulePayload.styleRange);
+            var rule = new WebInspector.SASSSupport.Rule(document, selectorText, range, properties);
+            rules.push(rule);
+        }
         return new WebInspector.SASSSupport.AST(document, rules);
     }
 
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/DOMModel.js b/third_party/WebKit/Source/devtools/front_end/sdk/DOMModel.js
index 840766e..919c1d9 100644
--- a/third_party/WebKit/Source/devtools/front_end/sdk/DOMModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/sdk/DOMModel.js
@@ -1135,6 +1135,17 @@
         domModel.highlightDOMNode(0);
 }
 
+WebInspector.DOMModel.muteHighlight = function()
+{
+    WebInspector.DOMModel.hideDOMNodeHighlight();
+    WebInspector.DOMModel._highlightDisabled = true;
+}
+
+WebInspector.DOMModel.unmuteHighlight = function()
+{
+    WebInspector.DOMModel._highlightDisabled = false;
+}
+
 WebInspector.DOMModel.cancelSearch = function()
 {
     for (var domModel of WebInspector.DOMModel.instances())
@@ -1737,6 +1748,8 @@
      */
     highlightDOMNodeWithConfig: function(nodeId, config, backendNodeId, objectId)
     {
+        if (WebInspector.DOMModel._highlightDisabled)
+            return;
         config = config || { mode: "all", showInfo: undefined, selectors: undefined };
         if (this._hideDOMNodeHighlightTimeout) {
             clearTimeout(this._hideDOMNodeHighlightTimeout);
@@ -1764,6 +1777,8 @@
      */
     highlightFrame: function(frameId)
     {
+        if (WebInspector.DOMModel._highlightDisabled)
+            return;
         this._highlighter.highlightFrame(frameId);
     },
 
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/RemoteObject.js b/third_party/WebKit/Source/devtools/front_end/sdk/RemoteObject.js
index bba2c6e..905d050a 100644
--- a/third_party/WebKit/Source/devtools/front_end/sdk/RemoteObject.js
+++ b/third_party/WebKit/Source/devtools/front_end/sdk/RemoteObject.js
@@ -978,13 +978,25 @@
         if (--resultCounter)
             return;
         if (savedOwnProperties && savedAccessorProperties) {
-            var combinedList = savedAccessorProperties.slice(0);
+            var propertiesMap = new Map();
+            var propertySymbols = [];
+            for (var i = 0; i < savedAccessorProperties.length; i++) {
+                var property = savedAccessorProperties[i];
+                if (property.symbol)
+                    propertySymbols.push(property);
+                else
+                    propertiesMap.set(property.name, property);
+            }
             for (var i = 0; i < savedOwnProperties.length; i++) {
                 var property = savedOwnProperties[i];
-                if (!property.isAccessorProperty())
-                    combinedList.push(property);
+                if (property.isAccessorProperty())
+                    continue;
+                if (property.symbol)
+                    propertySymbols.push(property);
+                else
+                    propertiesMap.set(property.name, property);
             }
-            return callback(combinedList, savedInternalProperties ? savedInternalProperties : null);
+            return callback(propertiesMap.valuesArray().concat(propertySymbols), savedInternalProperties ? savedInternalProperties : null);
         } else {
             callback(null, null);
         }
diff --git a/third_party/WebKit/Source/devtools/front_end/security/SecurityPanel.js b/third_party/WebKit/Source/devtools/front_end/security/SecurityPanel.js
index 88ac526..fc19961 100644
--- a/third_party/WebKit/Source/devtools/front_end/security/SecurityPanel.js
+++ b/third_party/WebKit/Source/devtools/front_end/security/SecurityPanel.js
@@ -23,16 +23,11 @@
 
     /** @type {!Map<!WebInspector.SecurityPanel.Origin, !WebInspector.SecurityPanel.OriginState>} */
     this._origins = new Map();
-    WebInspector.targetManager.addModelListener(WebInspector.ResourceTreeModel, WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._onMainFrameNavigated, this);
 
     /** @type {!Map<!WebInspector.NetworkLogView.MixedContentFilterValues, number>} */
     this._filterRequestCounts = new Map();
 
     WebInspector.targetManager.observeTargets(this, WebInspector.Target.Type.Page);
-
-    WebInspector.targetManager.addModelListener(WebInspector.NetworkManager, WebInspector.NetworkManager.EventTypes.ResponseReceived, this._onResponseReceived, this);
-    WebInspector.targetManager.addModelListener(WebInspector.NetworkManager, WebInspector.NetworkManager.EventTypes.RequestFinished, this._onRequestFinished, this);
-    WebInspector.targetManager.addModelListener(WebInspector.SecurityModel, WebInspector.SecurityModel.EventTypes.SecurityStateChanged, this._onSecurityStateChanged, this);
 }
 
 /** @typedef {string} */
@@ -248,7 +243,17 @@
      */
     targetAdded: function(target)
     {
-        WebInspector.SecurityModel.fromTarget(target);
+        if (this._target)
+            return;
+
+        this._target = target;
+
+        target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._onMainFrameNavigated, this);
+        target.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.ResponseReceived, this._onResponseReceived, this);
+        target.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestFinished, this._onRequestFinished, this);
+
+        var securityModel = WebInspector.SecurityModel.fromTarget(target);
+        securityModel.addEventListener(WebInspector.SecurityModel.EventTypes.SecurityStateChanged, this._onSecurityStateChanged, this);
     },
 
     /**
@@ -277,11 +282,12 @@
         var request = this._lastResponseReceivedForLoaderId.get(frame.loaderId);
         this._clearOrigins();
 
-        var origin = WebInspector.ParsedURL.splitURLIntoPathComponents(request.url)[0];
-        this._sidebarTree.setMainOrigin(origin);
 
-        if (request)
+        if (request) {
+            var origin = WebInspector.ParsedURL.splitURLIntoPathComponents(request.url)[0];
+            this._sidebarTree.setMainOrigin(origin);
             this._processRequest(request);
+        }
     },
 
     __proto__: WebInspector.PanelWithSidebar.prototype
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/AdvancedSearchView.js b/third_party/WebKit/Source/devtools/front_end/sources/AdvancedSearchView.js
index 6cc960f..b311cb6 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/AdvancedSearchView.js
+++ b/third_party/WebKit/Source/devtools/front_end/sources/AdvancedSearchView.js
@@ -18,7 +18,7 @@
 
     this._searchPanelElement = this.contentElement.createChild("div", "search-drawer-header");
     this._searchPanelElement.addEventListener("keydown", this._onKeyDown.bind(this), false);
-    this._searchPanelElement.addEventListener("keyup", this._onKeyUp.bind(this), false);
+    this._searchPanelElement.addEventListener("input", this._onInput.bind(this), false);
 
     this._searchResultsElement = this.contentElement.createChild("div");
     this._searchResultsElement.className = "search-results";
@@ -296,7 +296,7 @@
         }
     },
 
-    _onKeyUp: function()
+    _onInput: function()
     {
         if (this._search.value && this._search.value.length)
             this._searchInputClearElement.hidden = false;
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptOutlineDialog.js b/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptOutlineDialog.js
index f431c29..ab25ee9 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptOutlineDialog.js
+++ b/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptOutlineDialog.js
@@ -25,7 +25,7 @@
  */
 WebInspector.JavaScriptOutlineDialog.show = function(uiSourceCode, selectItemCallback)
 {
-    new WebInspector.FilteredListWidget(new WebInspector.JavaScriptOutlineDialog(uiSourceCode, selectItemCallback), false).showAsDialog();
+    new WebInspector.FilteredListWidget(new WebInspector.JavaScriptOutlineDialog(uiSourceCode, selectItemCallback)).showAsDialog();
 }
 
 WebInspector.JavaScriptOutlineDialog.prototype = {
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/OpenResourceDialog.js b/third_party/WebKit/Source/devtools/front_end/sources/OpenResourceDialog.js
index fb136b0..600f6a01 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/OpenResourceDialog.js
+++ b/third_party/WebKit/Source/devtools/front_end/sources/OpenResourceDialog.js
@@ -54,6 +54,15 @@
         return !WebInspector.Project.isServiceProject(project);
     },
 
+    /**
+     * @override
+     * @return {boolean}
+     */
+    renderAsTwoRows: function()
+    {
+        return true;
+    },
+
     __proto__: WebInspector.FilteredUISourceCodeListDelegate.prototype
 }
 
@@ -65,7 +74,7 @@
  */
 WebInspector.OpenResourceDialog.show = function(sourcesView, query, defaultScores, history)
 {
-    var filteredItemSelectionDialog = new WebInspector.FilteredListWidget(new WebInspector.OpenResourceDialog(sourcesView, defaultScores, history), true);
+    var filteredItemSelectionDialog = new WebInspector.FilteredListWidget(new WebInspector.OpenResourceDialog(sourcesView, defaultScores, history));
     filteredItemSelectionDialog.showAsDialog();
     filteredItemSelectionDialog.setQuery(query);
 }
@@ -105,6 +114,15 @@
         return this._types.indexOf(project.type()) !== -1;
     },
 
+    /**
+     * @override
+     * @return {boolean}
+     */
+    renderAsTwoRows: function()
+    {
+        return true;
+    },
+
     __proto__: WebInspector.FilteredUISourceCodeListDelegate.prototype
 }
 
@@ -115,7 +133,7 @@
  */
 WebInspector.SelectUISourceCodeForProjectTypesDialog.show = function(name, types, callback)
 {
-    var filteredItemSelectionDialog = new WebInspector.FilteredListWidget(new WebInspector.SelectUISourceCodeForProjectTypesDialog(types, callback), true);
+    var filteredItemSelectionDialog = new WebInspector.FilteredListWidget(new WebInspector.SelectUISourceCodeForProjectTypesDialog(types, callback));
     filteredItemSelectionDialog.showAsDialog();
     filteredItemSelectionDialog.setQuery(name);
 }
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/StyleSheetOutlineDialog.js b/third_party/WebKit/Source/devtools/front_end/sources/StyleSheetOutlineDialog.js
index 1c4281e..651733f 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/StyleSheetOutlineDialog.js
+++ b/third_party/WebKit/Source/devtools/front_end/sources/StyleSheetOutlineDialog.js
@@ -48,7 +48,7 @@
 WebInspector.StyleSheetOutlineDialog.show = function(uiSourceCode, selectItemCallback)
 {
     WebInspector.StyleSheetOutlineDialog._instanceForTests = new WebInspector.StyleSheetOutlineDialog(uiSourceCode, selectItemCallback);
-    new WebInspector.FilteredListWidget(WebInspector.StyleSheetOutlineDialog._instanceForTests, false).showAsDialog();
+    new WebInspector.FilteredListWidget(WebInspector.StyleSheetOutlineDialog._instanceForTests).showAsDialog();
 }
 
 WebInspector.StyleSheetOutlineDialog.prototype = {
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/sourcesSearch.css b/third_party/WebKit/Source/devtools/front_end/sources/sourcesSearch.css
index 0f1fd639..ed822d13 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/sourcesSearch.css
+++ b/third_party/WebKit/Source/devtools/front_end/sources/sourcesSearch.css
@@ -8,6 +8,8 @@
     flex: none;
     display: flex;
     border-bottom: 2px solid #e8e8e8;
+    white-space: nowrap;
+    overflow: hidden;
 }
 
 .search-drawer-header input.search-config-search {
@@ -17,6 +19,7 @@
     border-radius: 2px;
     color: #303030;
     border: none;
+    min-width: 95px;
 }
 
 .search-drawer-header .search-icon {
@@ -63,7 +66,7 @@
 }
 
 .search-drawer-header label.search-config-label {
-    margin: 2px 0px;
+    margin: 2px 4px;
     margin-left: 8px;
     color: #303030;
     display: flex;
@@ -81,6 +84,9 @@
 .search-toolbar-summary .search-message {
     padding-top: 2px;
     padding-left: 1ex;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    overflow: hidden;
 }
 
 #search-results-pane-file-based li {
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineFlameChart.js b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineFlameChart.js
index 9b37d44..4e1bbc97 100644
--- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineFlameChart.js
+++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineFlameChart.js
@@ -316,13 +316,14 @@
     };
 
     this._interactionsHeaderLevel2 = {
-        padding: 4,
+        padding: 2,
         height: 17,
         collapsible: true,
         color: WebInspector.themeSupport.patchColor("#222", WebInspector.ThemeSupport.ColorUsage.Foreground),
         font: this._font,
         backgroundColor: WebInspector.themeSupport.patchColor("white", WebInspector.ThemeSupport.ColorUsage.Background),
-        nestingLevel: 1
+        nestingLevel: 1,
+        shareHeaderLine: true
     };
 }
 
@@ -384,9 +385,12 @@
         this._entryTypeByLevel = [];
         /** @type {!Array<string>} */
         this._entryIndexToTitle = [];
-        /** @type {!Array.<!WebInspector.TimelineFlameChartMarker>} */
+        /** @type {!Array<!WebInspector.TimelineFlameChartMarker>} */
         this._markers = [];
-        this._asyncColorByCategory = {};
+        /** @type {!Map<!WebInspector.TimelineCategory, string>} */
+        this._asyncColorByCategory = new Map();
+        /** @type {!Map<!WebInspector.TimelineIRModel.Phases, string>} */
+        this._asyncColorByInteractionPhase = new Map();
     },
 
     /**
@@ -666,6 +670,18 @@
      */
     entryColor: function(entryIndex)
     {
+        // This is not annotated due to closure compiler failure to properly infer cache container's template type.
+        function patchColorAndCache(cache, key, lookupColor)
+        {
+            var color = cache.get(key);
+            if (color)
+                return color;
+            var parsedColor = WebInspector.Color.parse(lookupColor(key));
+            color = parsedColor.setAlpha(0.7).asString(WebInspector.Color.Format.RGBA) || "";
+            cache.set(key, color);
+            return color;
+        }
+
         var type = this._entryType(entryIndex);
         if (type === WebInspector.TimelineFlameChartEntryType.Event) {
             var event = /** @type {!WebInspector.TracingModel.Event} */ (this._entryData[entryIndex]);
@@ -673,14 +689,12 @@
                 return WebInspector.TimelineUIUtils.eventColor(event);
             if (event.hasCategory(WebInspector.TimelineModel.Category.Console) || event.hasCategory(WebInspector.TimelineModel.Category.UserTiming))
                 return this._consoleColorGenerator.colorForID(event.name);
+            if (event.hasCategory(WebInspector.TimelineModel.Category.LatencyInfo)) {
+                var phase = WebInspector.TimelineIRModel.phaseForEvent(event) || WebInspector.TimelineIRModel.Phases.Uncategorized;
+                return patchColorAndCache(this._asyncColorByInteractionPhase, phase, WebInspector.TimelineUIUtils.interactionPhaseColor);
+            }
             var category = WebInspector.TimelineUIUtils.eventStyle(event).category;
-            var color = this._asyncColorByCategory[category.name];
-            if (color)
-                return color;
-            var parsedColor = WebInspector.Color.parse(category.color);
-            color = parsedColor.setAlpha(0.7).asString(WebInspector.Color.Format.RGBA) || "";
-            this._asyncColorByCategory[category.name] = color;
-            return color;
+            return patchColorAndCache(this._asyncColorByCategory, category, () => category.color);
         }
         if (type === WebInspector.TimelineFlameChartEntryType.Frame)
             return "white";
@@ -737,9 +751,9 @@
         if (type === WebInspector.TimelineFlameChartEntryType.Event) {
             var event = /** @type {!WebInspector.TracingModel.Event} */ (this._entryData[entryIndex]);
             if (event.hasCategory(WebInspector.TimelineModel.Category.LatencyInfo) && event.timeWaitingForMainThread) {
-                context.fillStyle = "rgba(255, 140, 120, 0.6)";
+                context.fillStyle = "hsla(0, 70%, 60%, 1)";
                 var width = Math.floor(unclippedBarX - barX + event.timeWaitingForMainThread * timeToPixels);
-                context.fillRect(barX, barY, width, barHeight - 1);
+                context.fillRect(barX, barY + barHeight - 3, width, 2);
             }
             if (event.warning)
                 paintWarningDecoration(barX, barWidth - 1.5);
@@ -1306,13 +1320,9 @@
     this._networkDataProvider = new WebInspector.TimelineFlameChartNetworkDataProvider(this._model);
     this._networkView = new WebInspector.FlameChart(this._networkDataProvider, this);
 
-    if (Runtime.experiments.isEnabled("networkRequestsOnTimeline")) {
-        this._splitWidget.setMainWidget(this._mainView);
-        this._splitWidget.setSidebarWidget(this._networkView);
-        this._splitWidget.show(this.element);
-    } else {
-        this._mainView.show(this.element);
-    }
+    this._splitWidget.setMainWidget(this._mainView);
+    this._splitWidget.setSidebarWidget(this._networkView);
+    this._splitWidget.show(this.element);
 
     this._onMainEntrySelected = this._onEntrySelected.bind(this, this._dataProvider);
     this._onNetworkEntrySelected = this._onEntrySelected.bind(this, this._networkDataProvider);
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineIRModel.js b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineIRModel.js
index 0f9331f..59bdecc 100644
--- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineIRModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineIRModel.js
@@ -19,7 +19,8 @@
     Scroll: "Scroll",
     Fling: "Fling",
     Drag: "Drag",
-    Animation: "Animation"
+    Animation: "Animation",
+    Uncategorized: "Uncategorized"
 };
 
 /**
@@ -62,6 +63,17 @@
     mouse: 40,
 };
 
+WebInspector.TimelineIRModel._eventIRPhase = Symbol("eventIRPhase");
+
+/**
+ * @param {!WebInspector.TracingModel.Event} event
+ * @return {!WebInspector.TimelineIRModel.Phases}
+ */
+WebInspector.TimelineIRModel.phaseForEvent = function(event)
+{
+    return event[WebInspector.TimelineIRModel._eventIRPhase];
+}
+
 WebInspector.TimelineIRModel.prototype = {
     /**
      * @param {!WebInspector.TimelineModel} timelineModel
@@ -99,6 +111,7 @@
         var phases = WebInspector.TimelineIRModel.Phases;
         var thresholdsMs = WebInspector.TimelineIRModel._mergeThresholdsMs;
 
+        var scrollStart;
         var flingStart;
         var touchStart;
         var firstTouchMove;
@@ -112,6 +125,20 @@
                 console.assert(false, "Unordered input events");
             var type = this._inputEventType(event.name);
             switch (type) {
+
+            case eventTypes.ScrollBegin:
+                this._scrolls.append(this._segmentForEvent(event, phases.Scroll));
+                scrollStart = event;
+                break;
+
+            case eventTypes.ScrollEnd:
+                if (scrollStart)
+                    this._scrolls.append(this._segmentForEventRange(scrollStart, event, phases.Scroll));
+                else
+                    this._scrolls.append(this._segmentForEvent(event, phases.Scroll));
+                scrollStart = null;
+                break;
+
             case eventTypes.ScrollUpdate:
                 touchStart = null; // Since we're scrolling now, disregard other touch gestures.
                 this._scrolls.append(this._segmentForEvent(event, phases.Scroll));
@@ -129,7 +156,7 @@
                 // FIXME: also process renderer fling events.
                 if (!flingStart)
                     break;
-                this._scrolls.append(new WebInspector.Segment(flingStart.startTime, event.endTime, phases.Fling));
+                this._scrolls.append(this._segmentForEventRange(flingStart, event, phases.Fling));
                 flingStart = null;
                 break;
 
@@ -156,6 +183,7 @@
                     break;
                 }
                 touchStart = event;
+                event.steps[0][WebInspector.TimelineIRModel._eventIRPhase] = phases.Response;
                 firstTouchMove = null;
                 break;
 
@@ -168,7 +196,7 @@
                     this._drags.append(this._segmentForEvent(event, phases.Drag));
                 } else if (touchStart) {
                     firstTouchMove = event;
-                    this._responses.append(new WebInspector.Segment(touchStart.startTime, event.endTime, phases.Response));
+                    this._responses.append(this._segmentForEventRange(touchStart, event, phases.Response));
                 }
                 break;
 
@@ -199,8 +227,9 @@
             case eventTypes.MouseWheel:
                 // Do not consider first MouseWheel as trace viewer's implementation does -- in case of MouseWheel it's not really special.
                 if (mouseWheel && canMerge(thresholdsMs.mouse, mouseWheel, event))
-                    this._scrolls.append(new WebInspector.Segment(mouseWheel.endTime, event.startTime, phases.Scroll));
-                this._scrolls.append(this._segmentForEvent(event, phases.Scroll));
+                    this._scrolls.append(this._segmentForEventRange(mouseWheel, event, phases.Scroll));
+                else
+                    this._scrolls.append(this._segmentForEvent(event, phases.Scroll));
                 mouseWheel = event;
                 break;
             }
@@ -234,10 +263,33 @@
      */
     _segmentForEvent: function(event, phase)
     {
+        this._setPhaseForEvent(event, phase);
         return new WebInspector.Segment(event.startTime, event.endTime, phase);
     },
 
     /**
+     * @param {!WebInspector.TracingModel.AsyncEvent} startEvent
+     * @param {!WebInspector.TracingModel.AsyncEvent} endEvent
+     * @param {!WebInspector.TimelineIRModel.Phases} phase
+     * @return {!WebInspector.Segment}
+     */
+    _segmentForEventRange: function(startEvent, endEvent, phase)
+    {
+        this._setPhaseForEvent(startEvent, phase);
+        this._setPhaseForEvent(endEvent, phase);
+        return new WebInspector.Segment(startEvent.startTime, endEvent.endTime, phase);
+    },
+
+    /**
+     * @param {!WebInspector.TracingModel.AsyncEvent} asyncEvent
+     * @param {!WebInspector.TimelineIRModel.Phases} phase
+     */
+    _setPhaseForEvent: function(asyncEvent, phase)
+    {
+        asyncEvent.steps[0][WebInspector.TimelineIRModel._eventIRPhase] = phase;
+    },
+
+    /**
      * @return {!Array<!WebInspector.Segment>}
      */
     interactionRecords: function()
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js b/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js
index 737026e5..5506797 100644
--- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js
+++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js
@@ -378,29 +378,26 @@
 
         this._panelToolbar.appendText(WebInspector.UIString("Capture:"));
 
-        this._captureNetworkSetting.addChangeListener(this._onNetworkChanged, this);
+        var screenshotCheckbox = this._createSettingCheckbox(
+            WebInspector.UIString("Screenshots"), this._captureFilmStripSetting, WebInspector.UIString("Capture screenshots while recording. (Has small performance overhead)"));
+
         if (!Runtime.experiments.isEnabled("timelineRecordingPerspectives") || perspectiveSetting.get() === WebInspector.TimelinePanel.Perspectives.Custom) {
-            if (Runtime.experiments.isEnabled("networkRequestsOnTimeline")) {
-                this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(WebInspector.UIString("Network"),
-                                                                                 this._captureNetworkSetting,
-                                                                                 WebInspector.UIString("Capture network requests information")));
-            }
-            this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(WebInspector.UIString("JS Profile"),
-                                                                             this._captureJSProfileSetting,
-                                                                             WebInspector.UIString("Capture JavaScript stacks with sampling profiler. (Has performance overhead)")));
-            this._captureMemorySetting.addChangeListener(this._onModeChanged, this);
-            this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(WebInspector.UIString("Memory"),
-                                                                             this._captureMemorySetting,
-                                                                             WebInspector.UIString("Capture memory information on every timeline event.")));
-            this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(WebInspector.UIString("Paint"),
-                                                                             this._captureLayersAndPicturesSetting,
-                                                                             WebInspector.UIString("Capture graphics layer positions and painted pictures. (Has performance overhead)")));
+            this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(
+                WebInspector.UIString("Network"), this._captureNetworkSetting, WebInspector.UIString("Show network requests information")));
+            this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(
+                WebInspector.UIString("JS Profile"), this._captureJSProfileSetting, WebInspector.UIString("Capture JavaScript stacks with sampling profiler. (Has small performance overhead)")));
+            this._panelToolbar.appendToolbarItem(screenshotCheckbox);
+            this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(
+                WebInspector.UIString("Memory"), this._captureMemorySetting, WebInspector.UIString("Capture memory information on every timeline event.")));
+            this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(
+                WebInspector.UIString("Paint"), this._captureLayersAndPicturesSetting, WebInspector.UIString("Capture graphics layer positions and rasterization draw calls. (Has large performance overhead)")));
+        } else {
+            this._panelToolbar.appendToolbarItem(screenshotCheckbox);
         }
 
+        this._captureNetworkSetting.addChangeListener(this._onNetworkChanged, this);
+        this._captureMemorySetting.addChangeListener(this._onModeChanged, this);
         this._captureFilmStripSetting.addChangeListener(this._onModeChanged, this);
-        this._panelToolbar.appendToolbarItem(this._createSettingCheckbox(WebInspector.UIString("Screenshots"),
-                                                                         this._captureFilmStripSetting,
-                                                                         WebInspector.UIString("Capture screenshots while recording. (Has performance overhead)")));
 
         this._panelToolbar.appendSeparator();
         var garbageCollectButton = new WebInspector.ToolbarButton(WebInspector.UIString("Collect garbage"), "garbage-collect-toolbar-item");
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineUIUtils.js b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineUIUtils.js
index dd2220d..9b36e53 100644
--- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineUIUtils.js
+++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineUIUtils.js
@@ -226,7 +226,8 @@
             [WebInspector.TimelineIRModel.Phases.Scroll, {color: "hsl(256, 67%, 70%)", label: WebInspector.UIString("Scroll")}],
             [WebInspector.TimelineIRModel.Phases.Fling, {color: "hsl(256, 67%, 70%)", label: WebInspector.UIString("Fling")}],
             [WebInspector.TimelineIRModel.Phases.Drag, {color: "hsl(256, 67%, 70%)", label: WebInspector.UIString("Drag")}],
-            [WebInspector.TimelineIRModel.Phases.Animation, {color: "hsl(256, 67%, 70%)", label: WebInspector.UIString("Animation")}]
+            [WebInspector.TimelineIRModel.Phases.Animation, {color: "hsl(256, 67%, 70%)", label: WebInspector.UIString("Animation")}],
+            [WebInspector.TimelineIRModel.Phases.Uncategorized, {color: "hsl(0, 0%, 87%)", label: WebInspector.UIString("Uncategorized")}]
         ]);
         WebInspector.TimelineUIUtils._interactionPhaseStylesMap = map;
     }
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/Dialog.js b/third_party/WebKit/Source/devtools/front_end/ui/Dialog.js
index fb24054..dda2f680 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/Dialog.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui/Dialog.js
@@ -105,6 +105,16 @@
     },
 
     /**
+     * @param {number=} positionX
+     * @param {number=} positionY
+     */
+    setPosition: function(positionX, positionY)
+    {
+        this._defaultPositionX = positionX;
+        this._defaultPositionY = positionY;
+    },
+
+    /**
      * @param {!Size} size
      */
     setMaxSize: function(size)
@@ -194,11 +204,21 @@
             height = Math.min(height, this._maxSize.height);
         }
 
-        var positionX = (container.offsetWidth - width) / 2;
-        positionX = Number.constrain(positionX, 0, container.offsetWidth - width);
+        var positionX;
+        if (typeof this._defaultPositionX === "number") {
+            positionX = this._defaultPositionX;
+        } else {
+            positionX = (container.offsetWidth - width) / 2;
+            positionX = Number.constrain(positionX, 0, container.offsetWidth - width);
+        }
 
-        var positionY = (container.offsetHeight - height) / 2;
-        positionY = Number.constrain(positionY, 0, container.offsetHeight - height);
+        var positionY;
+        if (typeof this._defaultPositionY === "number") {
+            positionY = this._defaultPositionY;
+        } else {
+            positionY = (container.offsetHeight - height) / 2;
+            positionY = Number.constrain(positionY, 0, container.offsetHeight - height);
+        }
 
         this.element.style.width = width + "px";
         this.element.style.height = height + "px";
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/InspectorView.js b/third_party/WebKit/Source/devtools/front_end/ui/InspectorView.js
index 7fd72994..8f053313 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/InspectorView.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui/InspectorView.js
@@ -547,6 +547,26 @@
         this._tabOrderSetting.set(tabOrders);
     },
 
+    /**
+     * @param {!WebInspector.SplitWidget} splitWidget
+     */
+    setOwnerSplit: function(splitWidget)
+    {
+        this._ownerSplitWidget = splitWidget;
+    },
+
+    minimize: function()
+    {
+        if (this._ownerSplitWidget)
+            this._ownerSplitWidget.setSidebarMinimized(true);
+    },
+
+    restore: function()
+    {
+        if (this._ownerSplitWidget)
+            this._ownerSplitWidget.setSidebarMinimized(false);
+    },
+
     __proto__: WebInspector.VBox.prototype
 };
 
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/checkboxTextLabel.css b/third_party/WebKit/Source/devtools/front_end/ui/checkboxTextLabel.css
index bf773091..5d876fe 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/checkboxTextLabel.css
+++ b/third_party/WebKit/Source/devtools/front_end/ui/checkboxTextLabel.css
@@ -55,6 +55,10 @@
 
 } /* media */
 
+::content .dt-checkbox-text {
+    margin-left: 3px;
+}
+
 ::content .dt-checkbox-subtitle {
     color: gray;
 }
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/inspectorCommon.css b/third_party/WebKit/Source/devtools/front_end/ui/inspectorCommon.css
index 3fd0816..a6f546e 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/inspectorCommon.css
+++ b/third_party/WebKit/Source/devtools/front_end/ui/inspectorCommon.css
@@ -163,7 +163,7 @@
 
 input[type="search"]:focus,
 input[type="text"]:focus {
-    outline: auto 5px -webkit-focus-ring-color;
+    outline: auto rgb(56, 121, 217);
 }
 
 
diff --git a/third_party/WebKit/Source/devtools/front_end/ui_lazy/CommandMenu.js b/third_party/WebKit/Source/devtools/front_end/ui_lazy/CommandMenu.js
index 4446daf3..76bac863 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui_lazy/CommandMenu.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui_lazy/CommandMenu.js
@@ -55,6 +55,8 @@
     this._appendAvailableCommands();
 }
 
+WebInspector.CommandMenuDelegate.MaterialPaletteColors = ["#F44336", "#E91E63", "#9C27B0", "#673AB7", "#3F51B5", "#03A9F4", "#00BCD4", "#009688", "#4CAF50", "#8BC34A", "#CDDC39", "#FFC107", "#FF9800", "#FF5722", "#795548", "#9E9E9E", "#607D8B"];
+
 WebInspector.CommandMenuDelegate.prototype = {
     _appendAvailableCommands: function()
     {
@@ -81,7 +83,8 @@
          */
         function commandComparator(left, right)
         {
-            return left.title().compareTo(right.title());
+            var cats = left.category().compareTo(right.category());
+            return cats ? cats : left.title().compareTo(right.title());
         }
     },
 
@@ -122,9 +125,9 @@
         }
 
         // Score panel/drawer reveals above regular actions.
-        if (command.title().startsWith("Panel"))
+        if (command.category().startsWith("Panel"))
             score += 2;
-        else if (command.title().startsWith("Drawer"))
+        else if (command.category().startsWith("Drawer"))
             score += 1;
 
         return score;
@@ -140,7 +143,12 @@
     renderItem: function(itemIndex, query, titleElement, subtitleElement)
     {
         var command = this._commands[itemIndex];
-        titleElement.textContent = command.title();
+        titleElement.removeChildren();
+        var tagElement = titleElement.createChild("span", "tag");
+        var index = String.hashCode(command.category()) % WebInspector.CommandMenuDelegate.MaterialPaletteColors.length;
+        tagElement.style.backgroundColor = WebInspector.CommandMenuDelegate.MaterialPaletteColors[index];
+        tagElement.textContent = command.category();
+        titleElement.createTextChild(command.title());
         this.highlightRanges(titleElement, query);
         subtitleElement.textContent = command.shortcut();
     },
@@ -164,21 +172,32 @@
         return false;
     },
 
+    /**
+     * @override
+     * @return {boolean}
+     */
+    renderMonospace: function()
+    {
+        return false;
+    },
+
     __proto__: WebInspector.FilteredListWidget.Delegate.prototype
 }
 
 /**
  * @constructor
+ * @param {string} category
  * @param {string} title
  * @param {string} key
  * @param {string} shortcut
  * @param {function()} executeHandler
  * @param {function()=} availableHandler
  */
-WebInspector.CommandMenu.Command = function(title, key, shortcut, executeHandler, availableHandler)
+WebInspector.CommandMenu.Command = function(category, title, key, shortcut, executeHandler, availableHandler)
 {
+    this._category = category;
     this._title = title;
-    this._key = title + "\0" + key;
+    this._key = category + "\0" + title + "\0" + key;
     this._shortcut = shortcut;
     this._executeHandler = executeHandler;
     this._availableHandler = availableHandler;
@@ -188,6 +207,14 @@
     /**
      * @return {string}
      */
+    category: function()
+    {
+        return this._category;
+    },
+
+    /**
+     * @return {string}
+     */
     title: function()
     {
         return this._title;
@@ -235,9 +262,8 @@
 WebInspector.CommandMenu.createCommand = function(category, keys, title, shortcut, executeHandler, availableHandler)
 {
     // Separate keys by null character, to prevent fuzzy matching from matching across them.
-    var key = keys ? keys.split(",").join("\0") : "";
-    title = category ? WebInspector.UIString("%s: %s", category, title) : title;
-    return new WebInspector.CommandMenu.Command(title, key, shortcut, executeHandler, availableHandler);
+    var key = keys.replace(/,/g, "\0");
+    return new WebInspector.CommandMenu.Command(category, title, key, shortcut, executeHandler, availableHandler);
 }
 
 /**
@@ -329,7 +355,7 @@
      */
     handleAction: function(context, actionId)
     {
-        new WebInspector.FilteredListWidget(new WebInspector.CommandMenuDelegate(), false).showAsDialog();
+        new WebInspector.FilteredListWidget(new WebInspector.CommandMenuDelegate()).showAsDialog();
         InspectorFrontendHost.bringToFront();
         return true;
     }
diff --git a/third_party/WebKit/Source/devtools/front_end/ui_lazy/FilteredListWidget.js b/third_party/WebKit/Source/devtools/front_end/ui_lazy/FilteredListWidget.js
index 0c014fa..e3f4bf7 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui_lazy/FilteredListWidget.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui_lazy/FilteredListWidget.js
@@ -9,19 +9,20 @@
  * @extends {WebInspector.VBox}
  * @implements {WebInspector.ViewportControl.Provider}
  * @param {!WebInspector.FilteredListWidget.Delegate} delegate
- * @param {boolean} renderAsTwoRows
  */
-WebInspector.FilteredListWidget = function(delegate, renderAsTwoRows)
+WebInspector.FilteredListWidget = function(delegate)
 {
     WebInspector.VBox.call(this, true);
 
-    this._renderAsTwoRows = renderAsTwoRows;
+    this._renderAsTwoRows = delegate.renderAsTwoRows();
 
     this.contentElement.classList.add("filtered-list-widget");
     this.contentElement.addEventListener("keydown", this._onKeyDown.bind(this), false);
+    if (delegate.renderMonospace())
+        this.contentElement.classList.add("monospace");
     this.registerRequiredCSS("ui_lazy/filteredListWidget.css");
 
-    this._promptElement = this.contentElement.createChild("div", "monospace filtered-list-widget-input");
+    this._promptElement = this.contentElement.createChild("div", "filtered-list-widget-input");
     this._promptElement.setAttribute("spellcheck", "false");
     this._promptElement.setAttribute("contenteditable", "plaintext-only");
     this._prompt = new WebInspector.TextPrompt(this._autocomplete.bind(this));
@@ -35,7 +36,6 @@
     this._viewportControl = new WebInspector.ViewportControl(this);
     this._itemElementsContainer = this._viewportControl.element;
     this._itemElementsContainer.classList.add("container");
-    this._itemElementsContainer.classList.add("monospace");
     this._itemElementsContainer.addEventListener("click", this._onClick.bind(this), false);
     this.contentElement.appendChild(this._itemElementsContainer);
 
@@ -72,7 +72,8 @@
     showAsDialog: function()
     {
         this._dialog = new WebInspector.Dialog();
-        this._dialog.setMaxSize(new Size(504, 600));
+        this._dialog.setMaxSize(new Size(504, 340));
+        this._dialog.setPosition(undefined, 22);
         this.show(this._dialog.element);
         this._dialog.show();
     },
@@ -520,6 +521,22 @@
     },
 
     /**
+     * @return {boolean}
+     */
+    renderMonospace: function()
+    {
+        return true;
+    },
+
+    /**
+     * @return {boolean}
+     */
+    renderAsTwoRows: function()
+    {
+        return false;
+    },
+
+    /**
      * @param {number} itemIndex
      * @param {string} promptValue
      */
diff --git a/third_party/WebKit/Source/devtools/front_end/ui_lazy/FlameChart.js b/third_party/WebKit/Source/devtools/front_end/ui_lazy/FlameChart.js
index b4c4859..1673cc1 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui_lazy/FlameChart.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui_lazy/FlameChart.js
@@ -106,7 +106,7 @@
     /** @const */
     this._arrowSide = 8;
     /** @const */
-    this._expansionArrowX = this._headerLeftPadding + this._arrowSide / 2;
+    this._expansionArrowIndent = this._headerLeftPadding + this._arrowSide / 2;
     /** @const */
     this._headerLabelXPadding = 3;
     /** @const */
@@ -844,10 +844,10 @@
      */
     _toggleGroupVisibility: function(groupIndex)
     {
+        if (!this._isGroupCollapsible(groupIndex))
+            return;
         var groups = this._rawTimelineData.groups;
         var group = groups[groupIndex];
-        if (!group.style.collapsible)
-            return;
         group.expanded = !group.expanded;
         this._groupExpansionState[group.name] = group.expanded;
         if (this._groupExpansionSetting)
@@ -1368,7 +1368,7 @@
         context.translate(0, -top);
 
         context.fillStyle = WebInspector.themeSupport.patchColor("#eee", colorUsage.Background);
-        forEachGroup((offset, index, group) => {
+        forEachGroup.call(this, (offset, index, group) => {
             var paddingHeight = group.style.padding;
             if (paddingHeight < 5)
                 return;
@@ -1379,7 +1379,7 @@
 
         context.strokeStyle = WebInspector.themeSupport.patchColor("#bbb", colorUsage.Background);
         context.beginPath();
-        forEachGroup((offset, index, group, isFirst) => {
+        forEachGroup.call(this, (offset, index, group, isFirst) => {
             if (isFirst || group.style.padding < 4)
                 return;
             hLine(offset - 2.5);
@@ -1387,12 +1387,14 @@
         hLine(lastGroupOffset + 0.5);
         context.stroke();
 
-        forEachGroup((offset, index, group) => {
-            if (group.style.shareHeaderLine)
+        forEachGroup.call(this, (offset, index, group) => {
+            if (group.style.useFirstLineForOverview)
                 return;
-            if ((!group.style.collapsible || group.expanded)) {
-                context.fillStyle = group.style.backgroundColor;
-                context.fillRect(0, offset, width, group.style.height);
+            if (!this._isGroupCollapsible(index) || group.expanded) {
+                if (!group.style.shareHeaderLine) {
+                    context.fillStyle = group.style.backgroundColor;
+                    context.fillRect(0, offset, width, group.style.height);
+                }
                 return;
             }
             var nextGroup = index + 1;
@@ -1403,23 +1405,23 @@
         });
 
         context.save();
-        forEachGroup((offset, index, group) => {
+        forEachGroup.call(this, (offset, index, group) => {
             context.font = group.style.font;
-            if (group.style.collapsible && !group.expanded || group.style.shareHeaderLine) {
+            if (this._isGroupCollapsible(index) && !group.expanded || group.style.shareHeaderLine) {
                 var width = this._labelWidthForGroup(context, group);
                 context.fillStyle = WebInspector.Color.parse(group.style.backgroundColor).setAlpha(0.7).asString(null);
                 context.fillRect(this._headerLeftPadding - this._headerLabelXPadding, offset + this._headerLabelYPadding, width, barHeight - 2 * this._headerLabelYPadding);
             }
             context.fillStyle = group.style.color;
-            context.fillText(group.name, Math.floor(this._expansionArrowX + this._arrowSide), offset + textBaseHeight);
+            context.fillText(group.name, Math.floor(this._expansionArrowIndent * (group.style.nestingLevel + 1) + this._arrowSide), offset + textBaseHeight);
         });
         context.restore();
 
         context.fillStyle = WebInspector.themeSupport.patchColor("#6e6e6e", colorUsage.Foreground);
         context.beginPath();
-        forEachGroup((offset, index, group) => {
-            if (group.style.collapsible)
-                drawExpansionArrow.call(this, this._expansionArrowX, offset + textBaseHeight - this._arrowSide / 2, !!group.expanded)
+        forEachGroup.call(this, (offset, index, group) => {
+            if (this._isGroupCollapsible(index))
+                drawExpansionArrow.call(this, this._expansionArrowIndent * (group.style.nestingLevel + 1), offset + textBaseHeight - this._arrowSide / 2, !!group.expanded)
         });
         context.fill();
 
@@ -1459,6 +1461,7 @@
 
         /**
          * @param {function(number, number, !WebInspector.FlameChart.Group, boolean)} callback
+         * @this {WebInspector.FlameChart}
          */
         function forEachGroup(callback)
         {
@@ -1475,7 +1478,7 @@
                     firstGroup = false;
                 }
                 var parentGroupVisible = groupStack.peekLast().visible;
-                var thisGroupVisible = parentGroupVisible && (!group.style.collapsible || group.expanded);
+                var thisGroupVisible = parentGroupVisible && (!this._isGroupCollapsible(i) || group.expanded);
                 groupStack.push({nestingLevel: group.style.nestingLevel, visible: thisGroupVisible});
                 if (!parentGroupVisible || groupTop + group.style.height < top)
                     continue;
@@ -1491,7 +1494,7 @@
      */
     _labelWidthForGroup: function(context, group)
     {
-       return this._measureWidth(context, group.name) + 1.5 * this._arrowSide + 2 * this._headerLabelXPadding;
+       return this._measureWidth(context, group.name) + this._expansionArrowIndent * (group.style.nestingLevel + 1) + 2 * this._headerLabelXPadding;
     },
 
     /**
@@ -1706,7 +1709,7 @@
                     groupStack.pop();
                     nextLevel = false;
                 }
-                var thisGroupIsVisible = style.collapsible ? groups[groupIndex].expanded : true;
+                var thisGroupIsVisible = groupIndex >= 0 && this._isGroupCollapsible(groupIndex) ? groups[groupIndex].expanded : true;
                 var parentGroupIsVisible = groupStack.peekLast().visible;
                 visible = thisGroupIsVisible && parentGroupIsVisible;
                 groupStack.push({nestingLevel: style.nestingLevel, visible: visible});
@@ -1716,10 +1719,11 @@
                 if (parentGroupIsVisible && !style.shareHeaderLine)
                     currentOffset += style.height;
             }
-            var thisLevelIsVisible = visible || groupIndex >= 0 && groups[groupIndex].style.useFirstLineForOverview && level === groups[groupIndex].startLevel;
+            var isFirstOnLevel = groupIndex >= 0 && level === groups[groupIndex].startLevel;
+            var thisLevelIsVisible = visible || isFirstOnLevel && groups[groupIndex].style.useFirstLineForOverview;
             this._visibleLevels[level] = thisLevelIsVisible;
             this._visibleLevelOffsets[level] = currentOffset;
-            if (thisLevelIsVisible)
+            if (thisLevelIsVisible || (parentGroupIsVisible && style.shareHeaderLine && isFirstOnLevel))
                 currentOffset += this._barHeight;
         }
         if (groupIndex >= 0)
@@ -1728,6 +1732,23 @@
     },
 
     /**
+     * @param {number} index
+     */
+    _isGroupCollapsible: function(index)
+    {
+        var groups = this._rawTimelineData.groups || [];
+        var style = groups[index].style;
+        if (!style.shareHeaderLine || !style.collapsible)
+            return !!style.collapsible;
+        var isLastGroup = index + 1 >= groups.length;
+        if (!isLastGroup && groups[index + 1].style.nestingLevel > style.nestingLevel)
+            return true;
+        var nextGroupLevel = isLastGroup ? this._dataProvider.maxStackDepth() : groups[index + 1].startLevel;
+        // For groups that only have one line and share header line, pretend these are not collapsible.
+        return nextGroupLevel !== groups[index].startLevel + 1;
+    },
+
+    /**
      * @param {number} entryIndex
      */
     setSelectedEntry: function(entryIndex)
diff --git a/third_party/WebKit/Source/devtools/front_end/ui_lazy/filteredListWidget.css b/third_party/WebKit/Source/devtools/front_end/ui_lazy/filteredListWidget.css
index 7ed987b..0f3299b 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui_lazy/filteredListWidget.css
+++ b/third_party/WebKit/Source/devtools/front_end/ui_lazy/filteredListWidget.css
@@ -13,7 +13,7 @@
 .filtered-list-widget-prompt-element {
     flex: 0 0 36px;
     border: 0;
-    box-shadow: rgba(140, 140, 140, 0.5) 0 4px 16px;
+    box-shadow: rgba(140, 140, 140, 0.2) 0 2px 2px;
     margin: 0;
     padding: 0 6px;
     z-index: 1;
@@ -30,11 +30,11 @@
 .filtered-list-widget > div.container {
     flex: auto;
     overflow-y: auto;
-    background: white;
+    background: #fbfbfb;
 }
 
 .filtered-list-widget-item {
-    padding: 6px;
+    padding: 4px 6px;
     white-space: nowrap;
     text-overflow: ellipsis;
     overflow: hidden;
@@ -42,7 +42,7 @@
 }
 
 .filtered-list-widget-item.selected {
-    background-color: #eee;
+    background-color: #f0f0f0;
 }
 
 .filtered-list-widget-item span.highlight {
@@ -77,3 +77,15 @@
 .filtered-list-widget-item.two-rows {
     border-bottom: 1px solid rgb(235, 235, 235);
 }
+
+.tag {
+    color: white;
+    padding: 1px 3px;
+    margin-right: 5px;
+    border-radius: 2px;
+    line-height: 18px;
+}
+
+.filtered-list-widget-item .tag .highlight {
+    color: white;
+}
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.cpp
index f5e3f8a3..a3deac29 100644
--- a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.cpp
+++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.cpp
@@ -72,41 +72,6 @@
     visitor->trace(m_gatt);
 }
 
-unsigned BluetoothDevice::deviceClass(bool& isNull)
-{
-    isNull = false;
-    return m_webDevice->deviceClass;
-}
-
-String BluetoothDevice::vendorIDSource()
-{
-    switch (m_webDevice->vendorIDSource) {
-    case WebBluetoothDevice::VendorIDSource::Unknown: return String();
-    case WebBluetoothDevice::VendorIDSource::Bluetooth: return "bluetooth";
-    case WebBluetoothDevice::VendorIDSource::USB: return "usb";
-    }
-    ASSERT_NOT_REACHED();
-    return String();
-}
-
-unsigned BluetoothDevice::vendorID(bool& isNull)
-{
-    isNull = false;
-    return m_webDevice->vendorID;
-}
-
-unsigned BluetoothDevice::productID(bool& isNull)
-{
-    isNull = false;
-    return m_webDevice->productID;
-}
-
-unsigned BluetoothDevice::productVersion(bool& isNull)
-{
-    isNull = false;
-    return m_webDevice->productVersion;
-}
-
 Vector<String> BluetoothDevice::uuids()
 {
     Vector<String> uuids(m_webDevice->uuids.size());
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.h b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.h
index f609ae3..7d5e1db 100644
--- a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.h
+++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.h
@@ -73,11 +73,6 @@
     String id() { return m_webDevice->id; }
     String name() { return m_webDevice->name; }
     BluetoothAdvertisingData* adData() { return m_adData; }
-    unsigned deviceClass(bool& isNull);
-    String vendorIDSource();
-    unsigned vendorID(bool& isNull);
-    unsigned productID(bool& isNull);
-    unsigned productVersion(bool& isNull);
     BluetoothRemoteGATTServer* gatt() { return m_gatt; }
     Vector<String> uuids();
     // TODO(ortuno): Remove connectGATT
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.idl b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.idl
index 8de909e5..88d3e13 100644
--- a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.idl
+++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.idl
@@ -6,11 +6,6 @@
 
 // Implement BluetoothDevice interface: http://crbug.com/421668
 
-enum VendorIDSource {
-    "bluetooth",
-    "usb"
-};
-
 [
     DependentLifetime,
     RuntimeEnabled=WebBluetooth,
@@ -23,11 +18,6 @@
     readonly    attribute DOMString id;
     readonly    attribute DOMString?                 name;
     readonly    attribute BluetoothAdvertisingData   adData;
-    readonly    attribute unsigned long?             deviceClass;
-    readonly    attribute VendorIDSource?            vendorIDSource;
-    readonly    attribute unsigned long?             vendorID;
-    readonly    attribute unsigned long?             productID;
-    readonly    attribute unsigned long?             productVersion;
     readonly    attribute BluetoothRemoteGATTServer  gatt;
     readonly    attribute UUID[]                     uuids;
     [CallWith=ScriptState, DeprecateAs=BluetoothDeviceConnectGATT] Promise<BluetoothRemoteGATTServer> connectGATT ();
diff --git a/third_party/WebKit/Source/modules/cachestorage/Cache.idl b/third_party/WebKit/Source/modules/cachestorage/Cache.idl
index 8657ca0..33459356 100644
--- a/third_party/WebKit/Source/modules/cachestorage/Cache.idl
+++ b/third_party/WebKit/Source/modules/cachestorage/Cache.idl
@@ -7,11 +7,11 @@
 [
     Exposed=(Window,Worker),
 ] interface Cache {
-    [CallWith=ScriptState, RaisesException] Promise<Response> match(RequestInfo request, optional CacheQueryOptions options);
+    [CallWith=ScriptState, RaisesException] Promise<any> match(RequestInfo request, optional CacheQueryOptions options);
     [CallWith=ScriptState, RaisesException] Promise<sequence<Response>> matchAll(optional RequestInfo request, optional CacheQueryOptions options);
     [CallWith=ScriptState, RaisesException] Promise<void> add(RequestInfo request);
     [CallWith=ScriptState, RaisesException] Promise<void> addAll(sequence<RequestInfo> requests);
     [CallWith=ScriptState, RaisesException] Promise<void> put(RequestInfo request, Response response);
     [CallWith=ScriptState, ImplementedAs=deleteFunction, RaisesException] Promise<boolean> delete(RequestInfo request, optional CacheQueryOptions options);
-    [CallWith=ScriptState, RaisesException] Promise<sequence<Response>> keys(optional RequestInfo request, optional CacheQueryOptions options);
+    [CallWith=ScriptState, RaisesException] Promise<sequence<Request>> keys(optional RequestInfo request, optional CacheQueryOptions options);
 };
diff --git a/third_party/WebKit/Source/modules/cachestorage/CacheStorage.idl b/third_party/WebKit/Source/modules/cachestorage/CacheStorage.idl
index dc7562d..389a314 100644
--- a/third_party/WebKit/Source/modules/cachestorage/CacheStorage.idl
+++ b/third_party/WebKit/Source/modules/cachestorage/CacheStorage.idl
@@ -6,9 +6,9 @@
 [
     Exposed=(Window,Worker),
 ] interface CacheStorage {
+  [CallWith=ScriptState, RaisesException] Promise<any> match(RequestInfo request, optional CacheQueryOptions options);
   [CallWith=ScriptState, RaisesException] Promise<boolean> has(DOMString cacheName);
   [CallWith=ScriptState, RaisesException] Promise<Cache> open(DOMString cacheName);
   [CallWith=ScriptState, RaisesException, ImplementedAs=deleteFunction] Promise<boolean> delete(DOMString cacheName);
   [CallWith=ScriptState, RaisesException] Promise<sequence<DOMString>> keys();
-  [CallWith=ScriptState, RaisesException] Promise<Response> match(RequestInfo request, optional CacheQueryOptions options);
 };
diff --git a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
index 1f6d8b4..29c48be 100644
--- a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
+++ b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
@@ -858,7 +858,7 @@
     return nullptr;
 }
 
-void BaseRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSource, double x, double y, ExceptionState& exceptionState)
+void BaseRenderingContext2D::drawImage(ExecutionContext* executionContext, const CanvasImageSourceUnion& imageSource, double x, double y, ExceptionState& exceptionState)
 {
     CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource, exceptionState);
     if (!imageSourceInternal)
@@ -866,10 +866,10 @@
     FloatSize defaultObjectSize(width(), height());
     FloatSize sourceRectSize = imageSourceInternal->elementSize(defaultObjectSize);
     FloatSize destRectSize = imageSourceInternal->defaultDestinationSize(defaultObjectSize);
-    drawImage(imageSourceInternal, 0, 0, sourceRectSize.width(), sourceRectSize.height(), x, y, destRectSize.width(), destRectSize.height(), exceptionState);
+    drawImage(executionContext, imageSourceInternal, 0, 0, sourceRectSize.width(), sourceRectSize.height(), x, y, destRectSize.width(), destRectSize.height(), exceptionState);
 }
 
-void BaseRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSource,
+void BaseRenderingContext2D::drawImage(ExecutionContext* executionContext, const CanvasImageSourceUnion& imageSource,
     double x, double y, double width, double height, ExceptionState& exceptionState)
 {
     CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource, exceptionState);
@@ -877,17 +877,17 @@
         return;
     FloatSize defaultObjectSize(this->width(), this->height());
     FloatSize sourceRectSize = imageSourceInternal->elementSize(defaultObjectSize);
-    drawImage(imageSourceInternal, 0, 0, sourceRectSize.width(), sourceRectSize.height(), x, y, width, height, exceptionState);
+    drawImage(executionContext, imageSourceInternal, 0, 0, sourceRectSize.width(), sourceRectSize.height(), x, y, width, height, exceptionState);
 }
 
-void BaseRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSource,
+void BaseRenderingContext2D::drawImage(ExecutionContext* executionContext, const CanvasImageSourceUnion& imageSource,
     double sx, double sy, double sw, double sh,
     double dx, double dy, double dw, double dh, ExceptionState& exceptionState)
 {
     CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource, exceptionState);
     if (!imageSourceInternal)
         return;
-    drawImage(imageSourceInternal, sx, sy, sw, sh, dx, dy, dw, dh, exceptionState);
+    drawImage(executionContext, imageSourceInternal, sx, sy, sw, sh, dx, dy, dw, dh, exceptionState);
 }
 
 bool BaseRenderingContext2D::shouldDrawImageAntialiased(const FloatRect& destRect) const
@@ -981,7 +981,7 @@
     return false;
 }
 
-void BaseRenderingContext2D::drawImage(CanvasImageSource* imageSource,
+void BaseRenderingContext2D::drawImage(ExecutionContext* executionContext, CanvasImageSource* imageSource,
     double sx, double sy, double sw, double sh,
     double dx, double dy, double dw, double dh, ExceptionState& exceptionState)
 {
@@ -1052,7 +1052,7 @@
             buffer->setHasExpensiveOp();
     }
 
-    if (originClean() && wouldTaintOrigin(imageSource, nullptr))
+    if (originClean() && wouldTaintOrigin(imageSource, executionContext))
         setOriginTainted();
 }
 
@@ -1089,7 +1089,7 @@
     return gradient;
 }
 
-CanvasPattern* BaseRenderingContext2D::createPattern(ScriptState* scriptState, const CanvasImageSourceUnion& imageSource, const String& repetitionType, ExceptionState& exceptionState)
+CanvasPattern* BaseRenderingContext2D::createPattern(ExecutionContext* executionContext, const CanvasImageSourceUnion& imageSource, const String& repetitionType, ExceptionState& exceptionState)
 {
     Pattern::RepeatMode repeatMode = CanvasPattern::parseRepetitionType(repetitionType, exceptionState);
     if (exceptionState.hadException())
@@ -1122,7 +1122,7 @@
     }
     ASSERT(imageForRendering);
 
-    bool originClean = !wouldTaintOrigin(imageSourceInternal, scriptState);
+    bool originClean = !wouldTaintOrigin(imageSourceInternal, executionContext);
 
     return CanvasPattern::create(imageForRendering.release(), repeatMode, originClean);
 }
diff --git a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h
index d6e3121..628cfdc7 100644
--- a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h
+++ b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h
@@ -106,14 +106,14 @@
     void fillRect(double x, double y, double width, double height);
     void strokeRect(double x, double y, double width, double height);
 
-    void drawImage(const CanvasImageSourceUnion&, double x, double y, ExceptionState&);
-    void drawImage(const CanvasImageSourceUnion&, double x, double y, double width, double height, ExceptionState&);
-    void drawImage(const CanvasImageSourceUnion&, double sx, double sy, double sw, double sh, double dx, double dy, double dw, double dh, ExceptionState&);
-    void drawImage(CanvasImageSource*, double sx, double sy, double sw, double sh, double dx, double dy, double dw, double dh, ExceptionState&);
+    void drawImage(ExecutionContext*, const CanvasImageSourceUnion&, double x, double y, ExceptionState&);
+    void drawImage(ExecutionContext*, const CanvasImageSourceUnion&, double x, double y, double width, double height, ExceptionState&);
+    void drawImage(ExecutionContext*, const CanvasImageSourceUnion&, double sx, double sy, double sw, double sh, double dx, double dy, double dw, double dh, ExceptionState&);
+    void drawImage(ExecutionContext*, CanvasImageSource*, double sx, double sy, double sw, double sh, double dx, double dy, double dw, double dh, ExceptionState&);
 
     CanvasGradient* createLinearGradient(double x0, double y0, double x1, double y1);
     CanvasGradient* createRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1, ExceptionState&);
-    CanvasPattern* createPattern(ScriptState*, const CanvasImageSourceUnion&, const String& repetitionType, ExceptionState&);
+    CanvasPattern* createPattern(ExecutionContext*, const CanvasImageSourceUnion&, const String& repetitionType, ExceptionState&);
 
     ImageData* createImageData(ImageData*, ExceptionState&) const;
     ImageData* createImageData(double width, double height, ExceptionState&) const;
@@ -128,7 +128,7 @@
 
     virtual bool originClean() const = 0;
     virtual void setOriginTainted() = 0;
-    virtual bool wouldTaintOrigin(CanvasImageSource*, ScriptState*) = 0;
+    virtual bool wouldTaintOrigin(CanvasImageSource*, ExecutionContext*) = 0;
 
     virtual int width() const = 0;
     virtual int height() const = 0;
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp
index b138cec..2cfdac6 100644
--- a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp
+++ b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp
@@ -424,7 +424,7 @@
         serializedFont.appendLiteral("italic ");
     if (fontDescription.weight() == FontWeightBold)
         serializedFont.appendLiteral("bold ");
-    if (fontDescription.variant() == FontVariantSmallCaps)
+    if (fontDescription.variantCaps() == FontDescription::SmallCaps)
         serializedFont.appendLiteral("small-caps ");
 
     serializedFont.appendNumber(fontDescription.computedPixelSize());
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.h b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.h
index 0b6cf689..d1134323 100644
--- a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.h
+++ b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.h
@@ -143,7 +143,7 @@
     // BaseRenderingContext2D implementation
     bool originClean() const final;
     void setOriginTainted() final;
-    bool wouldTaintOrigin(CanvasImageSource* source, ScriptState*) final { return CanvasRenderingContext::wouldTaintOrigin(source); }
+    bool wouldTaintOrigin(CanvasImageSource* source, ExecutionContext*) final { return CanvasRenderingContext::wouldTaintOrigin(source); }
 
     int width() const final;
     int height() const final;
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.idl b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.idl
index d559ea35b..19e2ca9 100644
--- a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.idl
+++ b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.idl
@@ -56,7 +56,7 @@
     // compositing
     attribute unrestricted double globalAlpha; // (default 1.0)
     attribute DOMString globalCompositeOperation; // (default source-over)
-    [RuntimeEnabled=ExperimentalCanvasFeatures] attribute DOMString filter; // (default 'none')
+    attribute DOMString filter; // (default 'none')
 
     // image smoothing
     [ImplementedAs=imageSmoothingEnabled, DeprecateAs=PrefixedImageSmoothingEnabled] attribute boolean webkitImageSmoothingEnabled;
@@ -68,7 +68,7 @@
     attribute (DOMString or CanvasGradient or CanvasPattern) fillStyle; // (default black)
     CanvasGradient createLinearGradient(double x0, double y0, double x1, double y1);
     [RaisesException] CanvasGradient createRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1);
-    [CallWith=ScriptState, RaisesException] CanvasPattern? createPattern(CanvasImageSource image, [TreatNullAs=NullString] DOMString repetitionType);
+    [CallWith=ExecutionContext, RaisesException] CanvasPattern? createPattern(CanvasImageSource image, [TreatNullAs=NullString] DOMString repetitionType);
 
     // shadows
     attribute unrestricted double shadowOffsetX;
@@ -105,9 +105,9 @@
     TextMetrics measureText(DOMString text);
 
     // drawing images
-    [RaisesException] void drawImage(CanvasImageSource image, unrestricted double x, unrestricted double y);
-    [RaisesException] void drawImage(CanvasImageSource image, unrestricted double x, unrestricted double y, unrestricted double width, unrestricted double height);
-    [RaisesException] void drawImage(CanvasImageSource image, unrestricted double sx, unrestricted double sy, unrestricted double sw, unrestricted double sh, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh);
+    [CallWith=ExecutionContext, RaisesException] void drawImage(CanvasImageSource image, unrestricted double x, unrestricted double y);
+    [CallWith=ExecutionContext, RaisesException] void drawImage(CanvasImageSource image, unrestricted double x, unrestricted double y, unrestricted double width, unrestricted double height);
+    [CallWith=ExecutionContext, RaisesException] void drawImage(CanvasImageSource image, unrestricted double sx, unrestricted double sy, unrestricted double sw, unrestricted double sh, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh);
 
     // hit regions
     [RuntimeEnabled=ExperimentalCanvasFeatures, RaisesException] void addHitRegion(optional HitRegionOptions options);
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp
index 65d43de..da34ec8 100644
--- a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp
+++ b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp
@@ -325,33 +325,33 @@
     createContext(NonOpaque);
     NonThrowableExceptionState exceptionState;
 
-    TEST_OVERDRAW_1(1, drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState));
+    TEST_OVERDRAW_1(1, drawImage(canvasElement().getExecutionContext(), &m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState));
     EXPECT_FALSE(exceptionState.hadException());
-    TEST_OVERDRAW_1(1, drawImage(&m_opaqueBitmap, 0, 0, 1, 1, 0, 0, 10, 10, exceptionState));
+    TEST_OVERDRAW_1(1, drawImage(canvasElement().getExecutionContext(), &m_opaqueBitmap, 0, 0, 1, 1, 0, 0, 10, 10, exceptionState));
     EXPECT_FALSE(exceptionState.hadException());
-    TEST_OVERDRAW_2(0, setGlobalAlpha(0.5f), drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState));
+    TEST_OVERDRAW_2(0, setGlobalAlpha(0.5f), drawImage(canvasElement().getExecutionContext(), &m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState));
     EXPECT_FALSE(exceptionState.hadException());
-    TEST_OVERDRAW_1(0, drawImage(&m_alphaBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState));
+    TEST_OVERDRAW_1(0, drawImage(canvasElement().getExecutionContext(), &m_alphaBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState));
     EXPECT_FALSE(exceptionState.hadException());
-    TEST_OVERDRAW_2(0, setGlobalAlpha(0.5f), drawImage(&m_alphaBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState));
+    TEST_OVERDRAW_2(0, setGlobalAlpha(0.5f), drawImage(canvasElement().getExecutionContext(), &m_alphaBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState));
     EXPECT_FALSE(exceptionState.hadException());
-    TEST_OVERDRAW_1(0, drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 1, 0, 10, 10, exceptionState));
+    TEST_OVERDRAW_1(0, drawImage(canvasElement().getExecutionContext(), &m_opaqueBitmap, 0, 0, 10, 10, 1, 0, 10, 10, exceptionState));
     EXPECT_FALSE(exceptionState.hadException());
-    TEST_OVERDRAW_1(0, drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 9, 9, exceptionState));
+    TEST_OVERDRAW_1(0, drawImage(canvasElement().getExecutionContext(), &m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 9, 9, exceptionState));
     EXPECT_FALSE(exceptionState.hadException());
-    TEST_OVERDRAW_1(1, drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 11, 11, exceptionState));
+    TEST_OVERDRAW_1(1, drawImage(canvasElement().getExecutionContext(), &m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 11, 11, exceptionState));
     EXPECT_FALSE(exceptionState.hadException());
-    TEST_OVERDRAW_2(1, translate(-1, 0), drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 1, 0, 10, 10, exceptionState));
+    TEST_OVERDRAW_2(1, translate(-1, 0), drawImage(canvasElement().getExecutionContext(), &m_opaqueBitmap, 0, 0, 10, 10, 1, 0, 10, 10, exceptionState));
     EXPECT_FALSE(exceptionState.hadException());
-    TEST_OVERDRAW_2(0, translate(-1, 0), drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState));
+    TEST_OVERDRAW_2(0, translate(-1, 0), drawImage(canvasElement().getExecutionContext(), &m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState));
     EXPECT_FALSE(exceptionState.hadException());
-    TEST_OVERDRAW_2(0, setFillStyle(opaqueGradient()), drawImage(&m_alphaBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState)); // fillStyle ignored by drawImage
+    TEST_OVERDRAW_2(0, setFillStyle(opaqueGradient()), drawImage(canvasElement().getExecutionContext(), &m_alphaBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState)); // fillStyle ignored by drawImage
     EXPECT_FALSE(exceptionState.hadException());
-    TEST_OVERDRAW_2(1, setFillStyle(alphaGradient()), drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState)); // fillStyle ignored by drawImage
+    TEST_OVERDRAW_2(1, setFillStyle(alphaGradient()), drawImage(canvasElement().getExecutionContext(), &m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState)); // fillStyle ignored by drawImage
     EXPECT_FALSE(exceptionState.hadException());
-    TEST_OVERDRAW_2(1, setGlobalCompositeOperation(String("copy")), drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 1, 0, 10, 10, exceptionState));
+    TEST_OVERDRAW_2(1, setGlobalCompositeOperation(String("copy")), drawImage(canvasElement().getExecutionContext(), &m_opaqueBitmap, 0, 0, 10, 10, 1, 0, 10, 10, exceptionState));
     EXPECT_FALSE(exceptionState.hadException());
-    TEST_OVERDRAW_3(0, rect(0, 0, 5, 5), clip(), drawImage(&m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState));
+    TEST_OVERDRAW_3(0, rect(0, 0, 5, 5), clip(), drawImage(canvasElement().getExecutionContext(), &m_opaqueBitmap, 0, 0, 10, 10, 0, 0, 10, 10, exceptionState));
     EXPECT_FALSE(exceptionState.hadException());
 }
 
@@ -457,7 +457,7 @@
     // Go through an ImageBitmap to avoid triggering a display list fallback
     ImageBitmap* sourceImageBitmap = ImageBitmap::create(sourceCanvas, IntRect(IntPoint(0, 0), sourceSize), defaultOptions);
 
-    context2d()->drawImage(sourceImageBitmap, 0, 0, 1, 1, 0, 0, 1, 1, exceptionState);
+    context2d()->drawImage(canvasElement().getExecutionContext(), sourceImageBitmap, 0, 0, 1, 1, 0, 0, 1, 1, exceptionState);
     EXPECT_FALSE(exceptionState.hadException());
 
     EXPECT_FALSE(canvasElement().shouldBeDirectComposited());
@@ -481,7 +481,7 @@
     // Go through an ImageBitmap to avoid triggering a display list fallback
     ImageBitmap* sourceImageBitmap = ImageBitmap::create(sourceCanvas, IntRect(IntPoint(0, 0), sourceSize), defaultOptions);
 
-    context2d()->drawImage(sourceImageBitmap, 0, 0, 1, 1, 0, 0, 1, 1, exceptionState);
+    context2d()->drawImage(canvasElement().getExecutionContext(), sourceImageBitmap, 0, 0, 1, 1, 0, 0, 1, 1, exceptionState);
     EXPECT_FALSE(exceptionState.hadException());
 
     EXPECT_TRUE(canvasElement().shouldBeDirectComposited());
@@ -676,7 +676,7 @@
     TrackExceptionState exceptionState;
     CanvasImageSourceUnion imageSource;
     imageSource.setImageBitmap(imageBitmapDerived);
-    context->drawImage(imageSource, 0, 0, exceptionState);
+    context->drawImage(canvas->getExecutionContext(), imageSource, 0, 0, exceptionState);
 }
 
 TEST_F(CanvasRenderingContext2DTest, GPUMemoryUpdateForAcceleratedCanvas)
diff --git a/third_party/WebKit/Source/modules/csspaint/PaintRenderingContext2D.h b/third_party/WebKit/Source/modules/csspaint/PaintRenderingContext2D.h
index 6e12cbac..55ab09b 100644
--- a/third_party/WebKit/Source/modules/csspaint/PaintRenderingContext2D.h
+++ b/third_party/WebKit/Source/modules/csspaint/PaintRenderingContext2D.h
@@ -33,7 +33,7 @@
     // is always clean, and unable to taint it.
     bool originClean() const final { return true; }
     void setOriginTainted() final { }
-    bool wouldTaintOrigin(CanvasImageSource*, ScriptState*) final { return false; }
+    bool wouldTaintOrigin(CanvasImageSource*, ExecutionContext*) final { return false; }
 
     int width() const final;
     int height() const final;
diff --git a/third_party/WebKit/Source/modules/csspaint/PaintRenderingContext2D.idl b/third_party/WebKit/Source/modules/csspaint/PaintRenderingContext2D.idl
index 6661cb6..d0f23408 100644
--- a/third_party/WebKit/Source/modules/csspaint/PaintRenderingContext2D.idl
+++ b/third_party/WebKit/Source/modules/csspaint/PaintRenderingContext2D.idl
@@ -34,7 +34,7 @@
     attribute (DOMString or CanvasGradient or CanvasPattern) fillStyle; // (default black)
     CanvasGradient createLinearGradient(double x0, double y0, double x1, double y1);
     [RaisesException] CanvasGradient createRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1);
-    [CallWith=ScriptState, RaisesException] CanvasPattern? createPattern(CanvasImageSource image, [TreatNullAs=NullString] DOMString repetitionType);
+    [CallWith=ExecutionContext, RaisesException] CanvasPattern? createPattern(CanvasImageSource image, [TreatNullAs=NullString] DOMString repetitionType);
 
     // shadows
     attribute unrestricted double shadowOffsetX;
@@ -62,9 +62,9 @@
     boolean isPointInStroke(Path2D path, unrestricted double x, unrestricted double y);
 
     // drawing images
-    [RaisesException] void drawImage(CanvasImageSource image, unrestricted double x, unrestricted double y);
-    [RaisesException] void drawImage(CanvasImageSource image, unrestricted double x, unrestricted double y, unrestricted double width, unrestricted double height);
-    [RaisesException] void drawImage(CanvasImageSource image, unrestricted double sx, unrestricted double sy, unrestricted double sw, unrestricted double sh, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh);
+    [CallWith=ExecutionContext, RaisesException] void drawImage(CanvasImageSource image, unrestricted double x, unrestricted double y);
+    [CallWith=ExecutionContext, RaisesException] void drawImage(CanvasImageSource image, unrestricted double x, unrestricted double y, unrestricted double width, unrestricted double height);
+    [CallWith=ExecutionContext, RaisesException] void drawImage(CanvasImageSource image, unrestricted double sx, unrestricted double sy, unrestricted double sw, unrestricted double sh, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh);
 
     // FIXME: factor out to CanvasDrawingStyles
     // line caps/joins
diff --git a/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.cpp b/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.cpp
index 24361c56..7e6c231e 100644
--- a/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.cpp
+++ b/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.cpp
@@ -123,8 +123,7 @@
 
     RefPtr<BlobDataHandle> blobDataHandle = m_reader->drainAsBlobDataHandle(policy);
     if (blobDataHandle) {
-        lockAndDisturb();
-        close();
+        closeAndLockAndDisturb();
         return blobDataHandle.release();
     }
     return nullptr;
@@ -139,8 +138,7 @@
 
     RefPtr<EncodedFormData> formData = m_reader->drainAsFormData();
     if (formData) {
-        lockAndDisturb();
-        close();
+        closeAndLockAndDisturb();
         return formData.release();
     }
     return nullptr;
@@ -150,16 +148,22 @@
 {
     ASSERT(!isStreamLocked());
     ASSERT(!isStreamDisturbed());
-    lockAndDisturb();
+    // We need to call these before calling closeAndLockAndDisturb.
+    const bool isClosed = isStreamClosed();
+    const bool isErrored = isStreamErrored();
+    OwnPtr<FetchDataConsumerHandle> handle = m_handle.release();
 
-    if (isStreamClosed())
+    closeAndLockAndDisturb();
+
+    if (isClosed) {
+        // Note that the stream cannot be "draining", because it doesn't have
+        // the internal buffer.
         return createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumerHandle());
-    if (isStreamErrored())
+    }
+    if (isErrored)
         return createFetchDataConsumerHandleFromWebHandle(createUnexpectedErrorDataConsumerHandle());
 
-    ASSERT(m_handle);
-    OwnPtr<FetchDataConsumerHandle> handle = m_handle.release();
-    close();
+    ASSERT(handle);
     return handle.release();
 }
 
@@ -291,23 +295,19 @@
     return m_stream->isDisturbed();
 }
 
-void BodyStreamBuffer::setDisturbed()
+void BodyStreamBuffer::closeAndLockAndDisturb()
 {
-    if (RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled()) {
-        ScriptState::Scope scope(m_scriptState.get());
-        ReadableStreamOperations::setDisturbed(m_scriptState.get(), stream());
-    } else {
-        m_stream->setIsDisturbed();
+    if (isStreamReadable()) {
+        // Note that the stream cannot be "draining", because it doesn't have
+        // the internal buffer.
+        close();
     }
-}
 
-void BodyStreamBuffer::lockAndDisturb()
-{
     if (RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled()) {
         ScriptState::Scope scope(m_scriptState.get());
         NonThrowableExceptionState exceptionState;
-        ReadableStreamOperations::getReader(m_scriptState.get(), stream(), exceptionState);
-        ReadableStreamOperations::setDisturbed(m_scriptState.get(), stream());
+        ScriptValue reader = ReadableStreamOperations::getReader(m_scriptState.get(), stream(), exceptionState);
+        ReadableStreamOperations::read(m_scriptState.get(), reader);
     } else {
         NonThrowableExceptionState exceptionState;
         m_stream->getBytesReader(m_scriptState->getExecutionContext(), exceptionState);
diff --git a/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.h b/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.h
index 40fc856f7..6431e0a 100644
--- a/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.h
+++ b/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.h
@@ -28,9 +28,9 @@
 class MODULES_EXPORT BodyStreamBuffer final : public UnderlyingSourceBase, public UnderlyingSource, public WebDataConsumerHandle::Client {
     WTF_MAKE_NONCOPYABLE(BodyStreamBuffer);
     USING_GARBAGE_COLLECTED_MIXIN(BodyStreamBuffer);
+public:
     // Needed because we have to release |m_reader| promptly.
     EAGERLY_FINALIZE();
-public:
     // |handle| cannot be null and cannot be locked.
     BodyStreamBuffer(ScriptState*, PassOwnPtr<FetchDataConsumerHandle> /* handle */);
 
@@ -66,7 +66,7 @@
     bool isStreamErrored();
     bool isStreamLocked();
     bool isStreamDisturbed();
-    void setDisturbed();
+    void closeAndLockAndDisturb();
 
     DEFINE_INLINE_TRACE()
     {
@@ -79,7 +79,6 @@
 private:
     class LoaderClient;
 
-    void lockAndDisturb();
     void close();
     void error();
     void processData();
diff --git a/third_party/WebKit/Source/modules/fetch/FetchManager.cpp b/third_party/WebKit/Source/modules/fetch/FetchManager.cpp
index 0c17135..464af08b 100644
--- a/third_party/WebKit/Source/modules/fetch/FetchManager.cpp
+++ b/third_party/WebKit/Source/modules/fetch/FetchManager.cpp
@@ -74,9 +74,9 @@
     void dispose();
 
     class SRIVerifier final : public GarbageCollectedFinalized<SRIVerifier>, public WebDataConsumerHandle::Client {
+    public:
         // Promptly clear m_handle and m_reader.
         EAGERLY_FINALIZE();
-    public:
         // SRIVerifier takes ownership of |handle| and |response|.
         // |updater| must be garbage collected. The other arguments
         // all must have the lifetime of the give loader.
diff --git a/third_party/WebKit/Source/modules/fetch/FetchRequestData.cpp b/third_party/WebKit/Source/modules/fetch/FetchRequestData.cpp
index 99c69b0..c94a2f1 100644
--- a/third_party/WebKit/Source/modules/fetch/FetchRequestData.cpp
+++ b/third_party/WebKit/Source/modules/fetch/FetchRequestData.cpp
@@ -84,7 +84,7 @@
     if (m_buffer) {
         request->m_buffer = m_buffer;
         m_buffer = new BodyStreamBuffer(scriptState, createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumerHandle()));
-        m_buffer->setDisturbed();
+        m_buffer->closeAndLockAndDisturb();
     }
     return request;
 }
diff --git a/third_party/WebKit/Source/modules/fetch/Request.cpp b/third_party/WebKit/Source/modules/fetch/Request.cpp
index cc1a6f8..a486260 100644
--- a/third_party/WebKit/Source/modules/fetch/Request.cpp
+++ b/third_party/WebKit/Source/modules/fetch/Request.cpp
@@ -363,10 +363,14 @@
     // "If |input| is a Request object and |input|'s request's body is
     // non-null, run these substeps:"
     if (inputRequest && inputRequest->bodyBuffer()) {
-        // "Set |input|'s body to an empty byte stream."
-        inputRequest->m_request->setBuffer(new BodyStreamBuffer(scriptState, createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumerHandle())));
-        // "Set |input|'s disturbed flag."
-        inputRequest->bodyBuffer()->setDisturbed();
+        // "Let |dummyStream| be an empty ReadableStream object."
+        auto dummyStream = new BodyStreamBuffer(scriptState, createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumerHandle()));
+        // "Set |input|'s request's body to a new body whose stream is
+        // |dummyStream|."
+        inputRequest->m_request->setBuffer(dummyStream);
+        // "Let |reader| be the result of getting reader from |dummyStream|."
+        // "Read all bytes from |dummyStream| with |reader|."
+        inputRequest->bodyBuffer()->closeAndLockAndDisturb();
     }
 
     // "Return |r|."
diff --git a/third_party/WebKit/Source/modules/filesystem/DataTransferItemFileSystem.idl b/third_party/WebKit/Source/modules/filesystem/DataTransferItemFileSystem.idl
index 28f3151..19ec070 100644
--- a/third_party/WebKit/Source/modules/filesystem/DataTransferItemFileSystem.idl
+++ b/third_party/WebKit/Source/modules/filesystem/DataTransferItemFileSystem.idl
@@ -29,5 +29,5 @@
  */
 
 partial interface DataTransferItem {
-    [CallWith=ExecutionContext] Entry webkitGetAsEntry();
+    [CallWith=ExecutionContext, Measure] Entry webkitGetAsEntry();
 };
diff --git a/third_party/WebKit/Source/modules/filesystem/Entry.cpp b/third_party/WebKit/Source/modules/filesystem/Entry.cpp
index 79a4480..159bc405 100644
--- a/third_party/WebKit/Source/modules/filesystem/Entry.cpp
+++ b/third_party/WebKit/Source/modules/filesystem/Entry.cpp
@@ -31,6 +31,7 @@
 
 #include "core/dom/ExecutionContext.h"
 #include "core/fileapi/FileError.h"
+#include "core/frame/UseCounter.h"
 #include "core/html/VoidCallback.h"
 #include "modules/filesystem/DirectoryEntry.h"
 #include "modules/filesystem/EntryCallback.h"
@@ -47,31 +48,55 @@
 {
 }
 
-void Entry::getMetadata(MetadataCallback* successCallback, ErrorCallback* errorCallback)
+DOMFileSystem* Entry::filesystem(ExecutionContext* context) const
 {
+    if (m_fileSystem->type() == FileSystemTypeIsolated)
+        UseCounter::count(context, UseCounter::Entry_Filesystem_AttributeGetter_IsolatedFileSystem);
+    return filesystem();
+}
+
+void Entry::getMetadata(ExecutionContext* context, MetadataCallback* successCallback, ErrorCallback* errorCallback)
+{
+    if (m_fileSystem->type() == FileSystemTypeIsolated)
+        UseCounter::count(context, UseCounter::Entry_GetMetadata_Method_IsolatedFileSystem);
     m_fileSystem->getMetadata(this, successCallback, errorCallback);
 }
 
-void Entry::moveTo(DirectoryEntry* parent, const String& name, EntryCallback* successCallback, ErrorCallback* errorCallback) const
+void Entry::moveTo(ExecutionContext* context, DirectoryEntry* parent, const String& name, EntryCallback* successCallback, ErrorCallback* errorCallback) const
 {
+    if (m_fileSystem->type() == FileSystemTypeIsolated)
+        UseCounter::count(context, UseCounter::Entry_MoveTo_Method_IsolatedFileSystem);
     m_fileSystem->move(this, parent, name, successCallback, errorCallback);
 }
 
-void Entry::copyTo(DirectoryEntry* parent, const String& name, EntryCallback* successCallback, ErrorCallback* errorCallback) const
+void Entry::copyTo(ExecutionContext* context, DirectoryEntry* parent, const String& name, EntryCallback* successCallback, ErrorCallback* errorCallback) const
 {
+    if (m_fileSystem->type() == FileSystemTypeIsolated)
+        UseCounter::count(context, UseCounter::Entry_CopyTo_Method_IsolatedFileSystem);
     m_fileSystem->copy(this, parent, name, successCallback, errorCallback);
 }
 
-void Entry::remove(VoidCallback* successCallback, ErrorCallback* errorCallback) const
+void Entry::remove(ExecutionContext* context, VoidCallback* successCallback, ErrorCallback* errorCallback) const
 {
+    if (m_fileSystem->type() == FileSystemTypeIsolated)
+        UseCounter::count(context, UseCounter::Entry_Remove_Method_IsolatedFileSystem);
     m_fileSystem->remove(this, successCallback, errorCallback);
 }
 
-void Entry::getParent(EntryCallback* successCallback, ErrorCallback* errorCallback) const
+void Entry::getParent(ExecutionContext* context, EntryCallback* successCallback, ErrorCallback* errorCallback) const
 {
+    if (m_fileSystem->type() == FileSystemTypeIsolated)
+        UseCounter::count(context, UseCounter::Entry_GetParent_Method_IsolatedFileSystem);
     m_fileSystem->getParent(this, successCallback, errorCallback);
 }
 
+String Entry::toURL(ExecutionContext* context) const
+{
+    if (m_fileSystem->type() == FileSystemTypeIsolated)
+        UseCounter::count(context, UseCounter::Entry_ToURL_Method_IsolatedFileSystem);
+    return static_cast<const EntryBase*>(this)->toURL();
+}
+
 DEFINE_TRACE(Entry)
 {
     EntryBase::trace(visitor);
diff --git a/third_party/WebKit/Source/modules/filesystem/Entry.h b/third_party/WebKit/Source/modules/filesystem/Entry.h
index 9cdc16d4..f7e04b5 100644
--- a/third_party/WebKit/Source/modules/filesystem/Entry.h
+++ b/third_party/WebKit/Source/modules/filesystem/Entry.h
@@ -49,12 +49,14 @@
     DEFINE_WRAPPERTYPEINFO();
 public:
     DOMFileSystem* filesystem() const { return static_cast<DOMFileSystem*>(m_fileSystem.get()); }
+    DOMFileSystem* filesystem(ExecutionContext*) const;
 
-    void getMetadata(MetadataCallback* successCallback = nullptr, ErrorCallback* = nullptr);
-    void moveTo(DirectoryEntry* parent, const String& name = String(), EntryCallback* successCallback = nullptr, ErrorCallback* = nullptr) const;
-    void copyTo(DirectoryEntry* parent, const String& name = String(), EntryCallback* successCallback = nullptr, ErrorCallback* = nullptr) const;
-    void remove(VoidCallback* successCallback = nullptr, ErrorCallback* = nullptr) const;
-    void getParent(EntryCallback* successCallback = nullptr, ErrorCallback* = nullptr) const;
+    void getMetadata(ExecutionContext*, MetadataCallback* successCallback = nullptr, ErrorCallback* = nullptr);
+    void moveTo(ExecutionContext*, DirectoryEntry* parent, const String& name = String(), EntryCallback* successCallback = nullptr, ErrorCallback* = nullptr) const;
+    void copyTo(ExecutionContext*, DirectoryEntry* parent, const String& name = String(), EntryCallback* successCallback = nullptr, ErrorCallback* = nullptr) const;
+    void remove(ExecutionContext*, VoidCallback* successCallback = nullptr, ErrorCallback* = nullptr) const;
+    void getParent(ExecutionContext*, EntryCallback* successCallback = nullptr, ErrorCallback* = nullptr) const;
+    String toURL(ExecutionContext*) const;
 
     DECLARE_VIRTUAL_TRACE();
 
diff --git a/third_party/WebKit/Source/modules/filesystem/Entry.idl b/third_party/WebKit/Source/modules/filesystem/Entry.idl
index 9810353..de008ac 100644
--- a/third_party/WebKit/Source/modules/filesystem/Entry.idl
+++ b/third_party/WebKit/Source/modules/filesystem/Entry.idl
@@ -35,12 +35,12 @@
     readonly attribute boolean isDirectory;
     readonly attribute DOMString name;
     readonly attribute DOMString fullPath;
-    readonly attribute DOMFileSystem filesystem;
+    [CallWith=ExecutionContext] readonly attribute DOMFileSystem filesystem;
 
-    void getMetadata(MetadataCallback successCallback, optional ErrorCallback errorCallback);
-    void moveTo(DirectoryEntry parent, [TreatUndefinedAs=NullString] optional DOMString? name, optional EntryCallback successCallback, optional ErrorCallback errorCallback);
-    void copyTo(DirectoryEntry parent, [TreatUndefinedAs=NullString] optional DOMString? name, optional EntryCallback successCallback, optional ErrorCallback errorCallback);
-    DOMString toURL();
-    void remove(VoidCallback successCallback, optional ErrorCallback errorCallback);
-    void getParent(optional EntryCallback successCallback, optional ErrorCallback errorCallback);
+    [CallWith=ExecutionContext] void getMetadata(MetadataCallback successCallback, optional ErrorCallback errorCallback);
+    [CallWith=ExecutionContext] void moveTo(DirectoryEntry parent, [TreatUndefinedAs=NullString] optional DOMString? name, optional EntryCallback successCallback, optional ErrorCallback errorCallback);
+    [CallWith=ExecutionContext] void copyTo(DirectoryEntry parent, [TreatUndefinedAs=NullString] optional DOMString? name, optional EntryCallback successCallback, optional ErrorCallback errorCallback);
+    [CallWith=ExecutionContext] DOMString toURL();
+    [CallWith=ExecutionContext] void remove(VoidCallback successCallback, optional ErrorCallback errorCallback);
+    [CallWith=ExecutionContext] void getParent(optional EntryCallback successCallback, optional ErrorCallback errorCallback);
 };
diff --git a/third_party/WebKit/Source/modules/filesystem/HTMLInputElementFileSystem.idl b/third_party/WebKit/Source/modules/filesystem/HTMLInputElementFileSystem.idl
index c55dcd9..cd7bf1fb 100644
--- a/third_party/WebKit/Source/modules/filesystem/HTMLInputElementFileSystem.idl
+++ b/third_party/WebKit/Source/modules/filesystem/HTMLInputElementFileSystem.idl
@@ -31,5 +31,5 @@
 [
     RuntimeEnabled=FileSystem,
 ] partial interface HTMLInputElement {
-    [CallWith=ExecutionContext] readonly attribute Entry[] webkitEntries;
+    [CallWith=ExecutionContext, Measure] readonly attribute Entry[] webkitEntries;
 };
diff --git a/third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp b/third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp
index 4d55d835..874ca55 100644
--- a/third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp
+++ b/third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp
@@ -8,15 +8,31 @@
 #include "bindings/core/v8/ScriptPromiseResolver.h"
 #include "core/dom/DOMException.h"
 #include "core/dom/ExceptionCode.h"
+#include "core/fileapi/Blob.h"
 #include "core/frame/ImageBitmap.h"
 #include "modules/EventTargetModules.h"
 #include "modules/mediastream/MediaStreamTrack.h"
+#include "platform/mojo/MojoHelper.h"
 #include "public/platform/Platform.h"
+#include "public/platform/ServiceRegistry.h"
 #include "public/platform/WebImageCaptureFrameGrabber.h"
 #include "public/platform/WebMediaStreamTrack.h"
 
 namespace blink {
 
+namespace {
+
+const char kNoServiceError[] = "ImageCapture service unavailable.";
+
+bool trackIsInactive(const MediaStreamTrack& track)
+{
+    // Spec instructs to return an exception if the Track's readyState() is not
+    // "live". Also reject if the track is disabled or muted.
+    return track.readyState() != "live" || !track.enabled() || track.muted();
+}
+
+} // anonymous namespace
+
 ImageCapture* ImageCapture::create(ExecutionContext* context, MediaStreamTrack* track, ExceptionState& exceptionState)
 {
     if (track->kind() != "video") {
@@ -30,6 +46,9 @@
 ImageCapture::~ImageCapture()
 {
     DCHECK(!hasEventListeners());
+    // There should be no more outstanding |m_serviceRequests| at this point
+    // since each of them holds a persistent handle to this object.
+    DCHECK(m_serviceRequests.isEmpty());
 }
 
 const AtomicString& ImageCapture::interfaceName() const
@@ -50,26 +69,49 @@
 void ImageCapture::contextDestroyed()
 {
     removeAllEventListeners();
+    m_serviceRequests.clear();
     DCHECK(!hasEventListeners());
 }
 
+ScriptPromise ImageCapture::takePhoto(ScriptState* scriptState, ExceptionState& exceptionState)
+{
+
+    ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
+    ScriptPromise promise = resolver->promise();
+
+    if (trackIsInactive(*m_streamTrack)) {
+        resolver->reject(DOMException::create(InvalidStateError, "The associated Track is in an invalid state."));
+        return promise;
+    }
+
+    if (!m_service) {
+        resolver->reject(DOMException::create(NotFoundError, kNoServiceError));
+        return promise;
+    }
+
+    m_serviceRequests.add(resolver);
+
+    // m_streamTrack->component()->source()->id() is the renderer "name" of the camera;
+    // TODO(mcasas) consider sending the security origin as well:
+    // scriptState->getExecutionContext()->getSecurityOrigin()->toString()
+    m_service->TakePhoto(m_streamTrack->component()->source()->id(), createBaseCallback(bind<String, mojo::WTFArray<uint8_t>>(&ImageCapture::onTakePhoto, this, resolver)));
+    return promise;
+}
+
 ScriptPromise ImageCapture::grabFrame(ScriptState* scriptState, ExceptionState& exceptionState)
 {
     ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
     ScriptPromise promise = resolver->promise();
 
-    // Spec instructs to return an exception if the track's ready state is not "live". Also reject if the track is disabled or muted.
-    if (m_streamTrack->readyState() != "live" || !m_streamTrack->enabled() || m_streamTrack->muted()) {
+    if (trackIsInactive(*m_streamTrack)) {
         resolver->reject(DOMException::create(InvalidStateError, "The associated Track is in an invalid state."));
         return promise;
     }
 
     // Create |m_frameGrabber| the first time.
-    if (!m_frameGrabber) {
+    if (!m_frameGrabber)
         m_frameGrabber = adoptPtr(Platform::current()->createImageCaptureFrameGrabber());
 
-    }
-
     if (!m_frameGrabber) {
         resolver->reject(DOMException::create(UnknownError, "Couldn't create platform resources"));
         return promise;
@@ -88,6 +130,30 @@
     , m_streamTrack(track)
 {
     DCHECK(m_streamTrack);
+    DCHECK(!m_service.is_bound());
+
+    Platform::current()->serviceRegistry()->connectToRemoteService(mojo::GetProxy(&m_service));
+
+    m_service.set_connection_error_handler(createBaseCallback(bind(&ImageCapture::onServiceConnectionError, WeakPersistentThisPointer<ImageCapture>(this))));
+}
+
+void ImageCapture::onTakePhoto(ScriptPromiseResolver* resolver, const String& mimeType, mojo::WTFArray<uint8_t> data)
+{
+    if (!m_serviceRequests.contains(resolver))
+        return;
+
+    DCHECK(!data.is_null());
+    const auto& storage = data.storage();
+    resolver->resolve(Blob::create(storage.data(), storage.size(), mimeType));
+    m_serviceRequests.remove(resolver);
+}
+
+void ImageCapture::onServiceConnectionError()
+{
+    m_service.reset();
+    for (ScriptPromiseResolver* resolver : m_serviceRequests)
+        resolver->reject(DOMException::create(NotFoundError, kNoServiceError));
+    m_serviceRequests.clear();
 }
 
 bool ImageCapture::addEventListenerInternal(const AtomicString& eventType, EventListener* listener, const EventListenerOptions& options)
@@ -98,6 +164,7 @@
 DEFINE_TRACE(ImageCapture)
 {
     visitor->trace(m_streamTrack);
+    visitor->trace(m_serviceRequests);
     EventTargetWithInlineData::trace(visitor);
     ContextLifecycleObserver::trace(visitor);
 }
diff --git a/third_party/WebKit/Source/modules/imagecapture/ImageCapture.h b/third_party/WebKit/Source/modules/imagecapture/ImageCapture.h
index 16633e5b..a02f91d 100644
--- a/third_party/WebKit/Source/modules/imagecapture/ImageCapture.h
+++ b/third_party/WebKit/Source/modules/imagecapture/ImageCapture.h
@@ -12,6 +12,7 @@
 #include "modules/EventTargetModules.h"
 #include "modules/ModulesExport.h"
 #include "platform/AsyncMethodRunner.h"
+#include "public/platform/modules/imagecapture/image_capture.mojom-blink.h"
 
 namespace blink {
 
@@ -43,6 +44,8 @@
 
     MediaStreamTrack* videoStreamTrack() const { return m_streamTrack.get(); }
 
+    ScriptPromise takePhoto(ScriptState*, ExceptionState&);
+
     ScriptPromise grabFrame(ScriptState*, ExceptionState&);
 
     DECLARE_VIRTUAL_TRACE();
@@ -50,11 +53,17 @@
 private:
     ImageCapture(ExecutionContext*, MediaStreamTrack*);
 
+    void onTakePhoto(ScriptPromiseResolver*, const String& mimeType, mojo::WTFArray<uint8_t> data);
+    void onServiceConnectionError();
+
     // EventTarget implementation.
     bool addEventListenerInternal(const AtomicString& eventType, EventListener*, const EventListenerOptions&) override;
 
     Member<MediaStreamTrack> m_streamTrack;
     OwnPtr<WebImageCaptureFrameGrabber> m_frameGrabber;
+    mojom::blink::ImageCapturePtr m_service;
+
+    HeapHashSet<Member<ScriptPromiseResolver>> m_serviceRequests;
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/modules/imagecapture/ImageCapture.idl b/third_party/WebKit/Source/modules/imagecapture/ImageCapture.idl
index c5c76552..c8c306e 100644
--- a/third_party/WebKit/Source/modules/imagecapture/ImageCapture.idl
+++ b/third_party/WebKit/Source/modules/imagecapture/ImageCapture.idl
@@ -13,5 +13,6 @@
 ] interface ImageCapture {
     readonly attribute MediaStreamTrack videoStreamTrack;
 
+    [CallWith=ScriptState, RaisesException] Promise<Blob> takePhoto();
     [CallWith=ScriptState, RaisesException] Promise<ImageBitmap> grabFrame();
 };
diff --git a/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp b/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp
index 758318b..2463338 100644
--- a/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp
+++ b/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp
@@ -33,17 +33,17 @@
 // BaseRenderingContext2D implementation
 bool OffscreenCanvasRenderingContext2D::originClean() const
 {
-    return m_originClean;
+    return getOffscreenCanvas()->originClean();
 }
 
 void OffscreenCanvasRenderingContext2D::setOriginTainted()
 {
-    m_originClean = false;
+    return getOffscreenCanvas()->setOriginTainted();
 }
 
-bool OffscreenCanvasRenderingContext2D::wouldTaintOrigin(CanvasImageSource* source, ScriptState* scriptState)
+bool OffscreenCanvasRenderingContext2D::wouldTaintOrigin(CanvasImageSource* source, ExecutionContext* executionContext)
 {
-    if (scriptState->getExecutionContext()->isWorkerGlobalScope()) {
+    if (executionContext->isWorkerGlobalScope()) {
         // Currently, we only support passing in ImageBitmap as source image in
         // drawImage() or createPattern() in a OffscreenCanvas2d in worker.
         ASSERT(source->isImageBitmap());
@@ -91,6 +91,7 @@
     // TODO: crbug.com/593514 Add support for GPU rendering
     RefPtr<SkImage> skImage = m_imageBuffer->newSkImageSnapshot(PreferNoAcceleration, SnapshotReasonUnknown);
     RefPtr<StaticBitmapImage> image = StaticBitmapImage::create(skImage.release());
+    image->setOriginClean(this->originClean());
     m_imageBuffer.clear(); // "Transfer" means no retained buffer
     return ImageBitmap::create(image.release());
 }
diff --git a/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.h b/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.h
index 1db409c7..62a9763 100644
--- a/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.h
+++ b/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.h
@@ -45,7 +45,7 @@
     // BaseRenderingContext2D implementation
     bool originClean() const final;
     void setOriginTainted() final;
-    bool wouldTaintOrigin(CanvasImageSource*, ScriptState*) final;
+    bool wouldTaintOrigin(CanvasImageSource*, ExecutionContext*) final;
 
     int width() const final;
     int height() const final;
@@ -79,7 +79,6 @@
 
 private:
     bool m_hasAlpha;
-    bool m_originClean = true;
     OwnPtr<ImageBuffer> m_imageBuffer;
 };
 
diff --git a/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.idl b/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.idl
index 755300f..480041c 100644
--- a/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.idl
+++ b/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.idl
@@ -16,7 +16,7 @@
     attribute (DOMString or CanvasGradient or CanvasPattern) fillStyle; // (default black)
     CanvasGradient createLinearGradient(double x0, double y0, double x1, double y1);
     [RaisesException] CanvasGradient createRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1);
-    [CallWith=ScriptState, RaisesException, Exposed=Worker] CanvasPattern? createPattern(CanvasImageSource image, [TreatNullAs=NullString] DOMString repetitionType);
+    [CallWith=ExecutionContext, RaisesException, Exposed=Worker] CanvasPattern? createPattern(CanvasImageSource image, [TreatNullAs=NullString] DOMString repetitionType);
 
     // CanvasRect interface
     void clearRect(unrestricted double x, unrestricted double y, unrestricted double width, unrestricted double height);
@@ -30,6 +30,12 @@
     void stroke();
     void stroke(Path2D path);
 
+    // drawing images
+    // TODO(crbug.com/563856): Expose these API to Window with more layout tests
+    [CallWith=ExecutionContext, Exposed=Worker, RaisesException] void drawImage(CanvasImageSource image, unrestricted double x, unrestricted double y);
+    [CallWith=ExecutionContext, Exposed=Worker, RaisesException] void drawImage(CanvasImageSource image, unrestricted double x, unrestricted double y, unrestricted double width, unrestricted double height);
+    [CallWith=ExecutionContext, Exposed=Worker, RaisesException] void drawImage(CanvasImageSource image, unrestricted double sx, unrestricted double sy, unrestricted double sw, unrestricted double sh, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh);
+
     // Line caps/joins
     attribute unrestricted double lineWidth; // (default 1)
     attribute DOMString lineCap; // "butt", "round", "square" (default "butt")
diff --git a/third_party/WebKit/Source/modules/payments/PaymentDetailsTestHelper.cpp b/third_party/WebKit/Source/modules/payments/PaymentDetailsTestHelper.cpp
index b5ace51..b2906e54 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentDetailsTestHelper.cpp
+++ b/third_party/WebKit/Source/modules/payments/PaymentDetailsTestHelper.cpp
@@ -8,8 +8,11 @@
 #include "platform/heap/HeapAllocator.h"
 
 namespace blink {
+namespace {
 
-PaymentItem buildPaymentItemForTest(PaymentTestDataToChange data, PaymentTestModificationType modificationType, const String& valueToUse)
+// PaymentItem and ShippingOption have identical structure.
+template <typename PaymentItemOrShippingOption>
+void setValues(PaymentItemOrShippingOption& original, PaymentTestDataToChange data, PaymentTestModificationType modificationType, const String& valueToUse)
 {
     CurrencyAmount itemAmount;
     if (data == PaymentTestDataCurrencyCode) {
@@ -18,68 +21,48 @@
     } else {
         itemAmount.setCurrencyCode("USD");
     }
-    if (data == PaymentTestDataAmount) {
+    if (data == PaymentTestDataValue) {
         if (modificationType == PaymentTestOverwriteValue)
             itemAmount.setValue(valueToUse);
     } else {
         itemAmount.setValue("9.99");
     }
 
-    PaymentItem item;
-    item.setAmount(itemAmount);
+    if (data != PaymentTestDataAmount || modificationType != PaymentTestRemoveKey)
+        original.setAmount(itemAmount);
+
     if (data == PaymentTestDataId) {
         if (modificationType == PaymentTestOverwriteValue)
-            item.setId(valueToUse);
+            original.setId(valueToUse);
     } else {
-        item.setId("total");
+        original.setId("id");
     }
     if (data == PaymentTestDataLabel) {
         if (modificationType == PaymentTestOverwriteValue)
-            item.setLabel(valueToUse);
+            original.setLabel(valueToUse);
     } else {
-        item.setLabel("Total charge");
+        original.setLabel("Label");
     }
+}
 
+} // namespace
+
+PaymentItem buildPaymentItemForTest(PaymentTestDataToChange data, PaymentTestModificationType modificationType, const String& valueToUse)
+{
+    PaymentItem item;
+    setValues(item, data, modificationType, valueToUse);
     return item;
 }
 
 ShippingOption buildShippingOptionForTest(PaymentTestDataToChange data, PaymentTestModificationType modificationType, const String& valueToUse)
 {
-    CurrencyAmount shippingAmount;
-    if (data == PaymentTestDataCurrencyCode) {
-        if (modificationType == PaymentTestOverwriteValue)
-            shippingAmount.setCurrencyCode(valueToUse);
-    } else {
-        shippingAmount.setCurrencyCode("USD");
-    }
-    if (data == PaymentTestDataAmount) {
-        if (modificationType == PaymentTestOverwriteValue)
-            shippingAmount.setValue(valueToUse);
-    } else {
-        shippingAmount.setValue("9.99");
-    }
-
     ShippingOption shippingOption;
-    shippingOption.setAmount(shippingAmount);
-    if (data == PaymentTestDataId) {
-        if (modificationType == PaymentTestOverwriteValue)
-            shippingOption.setId(valueToUse);
-    } else {
-        shippingOption.setId("standard");
-    }
-    if (data == PaymentTestDataLabel) {
-        if (modificationType == PaymentTestOverwriteValue)
-            shippingOption.setLabel(valueToUse);
-    } else {
-        shippingOption.setLabel("Standard shipping");
-    }
-
+    setValues(shippingOption, data, modificationType, valueToUse);
     return shippingOption;
 }
 
 PaymentDetails buildPaymentDetailsForTest(PaymentTestDetailToChange detail, PaymentTestDataToChange data, PaymentTestModificationType modificationType, const String& valueToUse)
 {
-
     PaymentItem item;
     if (detail == PaymentTestDetailItem)
         item = buildPaymentItemForTest(data, modificationType, valueToUse);
diff --git a/third_party/WebKit/Source/modules/payments/PaymentDetailsTestHelper.h b/third_party/WebKit/Source/modules/payments/PaymentDetailsTestHelper.h
index 786e6a7..6a99283 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentDetailsTestHelper.h
+++ b/third_party/WebKit/Source/modules/payments/PaymentDetailsTestHelper.h
@@ -22,8 +22,9 @@
     PaymentTestDataNone,
     PaymentTestDataId,
     PaymentTestDataLabel,
+    PaymentTestDataAmount,
     PaymentTestDataCurrencyCode,
-    PaymentTestDataAmount
+    PaymentTestDataValue,
 };
 
 enum PaymentTestModificationType {
diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp b/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp
index ea50249f..2d04ec27b 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp
+++ b/third_party/WebKit/Source/modules/payments/PaymentRequest.cpp
@@ -108,12 +108,12 @@
 {
     String errorMessage;
     for (const auto& item : items) {
-        if (!item.hasId()) {
+        if (!item.hasId() || item.id().isEmpty()) {
             exceptionState.throwTypeError("Item id required");
             return;
         }
 
-        if (!item.hasLabel()) {
+        if (!item.hasLabel() || item.label().isEmpty()) {
             exceptionState.throwTypeError("Item label required");
             return;
         }
@@ -293,8 +293,8 @@
         }
     }
 
-    // Set the currently selected option if only one option was passed.
-    if (details.hasShippingOptions() && details.shippingOptions().size() == 1)
+    // Set the currently selected option if only one option is passed and shipping is requested.
+    if (options.requestShipping() && details.hasShippingOptions() && details.shippingOptions().size() == 1)
         m_shippingOption = details.shippingOptions().begin()->id();
 }
 
@@ -309,20 +309,12 @@
     DCHECK(!m_completeResolver);
 
     String errorMessage;
-    if (!PaymentsValidators::isValidRegionCodeFormat(address->region_code, &errorMessage)
-        || !PaymentsValidators::isValidLanguageCodeFormat(address->language_code, &errorMessage)
-        || !PaymentsValidators::isValidScriptCodeFormat(address->script_code, &errorMessage)) {
+    if (!PaymentsValidators::isValidShippingAddress(address, &errorMessage)) {
         m_showResolver->reject(DOMException::create(SyntaxError, errorMessage));
         cleanUp();
         return;
     }
 
-    if (address->language_code.isEmpty() && !address->script_code.isEmpty()) {
-        m_showResolver->reject(DOMException::create(SyntaxError, "If language code is empty, then script code should also be empty"));
-        cleanUp();
-        return;
-    }
-
     m_shippingAddress = new ShippingAddress(std::move(address));
     Event* event = Event::create(EventTypeNames::shippingaddresschange);
     event->setTarget(this);
@@ -343,6 +335,19 @@
 {
     DCHECK(m_showResolver);
     DCHECK(!m_completeResolver);
+
+    if (response->shipping_address) {
+        String errorMessage;
+        if (!PaymentsValidators::isValidShippingAddress(response->shipping_address, &errorMessage)) {
+            m_showResolver->reject(DOMException::create(SyntaxError, errorMessage));
+            cleanUp();
+            return;
+        }
+
+        m_shippingAddress = new ShippingAddress(std::move(response->shipping_address));
+        m_shippingOption = response->shipping_option_id;
+    }
+
     m_showResolver->resolve(new PaymentResponse(std::move(response), this));
 }
 
diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequest.h b/third_party/WebKit/Source/modules/payments/PaymentRequest.h
index 6641cc63..0fd13e06 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentRequest.h
+++ b/third_party/WebKit/Source/modules/payments/PaymentRequest.h
@@ -30,7 +30,8 @@
 class ScriptState;
 class ShippingAddress;
 
-class MODULES_EXPORT PaymentRequest final : public EventTargetWithInlineData, WTF_NON_EXPORTED_BASE(public mojom::blink::PaymentRequestClient), public PaymentCompleter, public ContextLifecycleObserver {
+// TODO(thakis): Make this class final again once https://crbug.com/608705 is fixed.
+class MODULES_EXPORT PaymentRequest /* final */ : public EventTargetWithInlineData, WTF_NON_EXPORTED_BASE(public mojom::blink::PaymentRequestClient), public PaymentCompleter, public ContextLifecycleObserver {
     DEFINE_WRAPPERTYPEINFO();
     USING_GARBAGE_COLLECTED_MIXIN(PaymentRequest)
     WTF_MAKE_NONCOPYABLE(PaymentRequest);
diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequestDetailsTest.cpp b/third_party/WebKit/Source/modules/payments/PaymentRequestDetailsTest.cpp
index d60c2b9..842af6e1 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentRequestDetailsTest.cpp
+++ b/third_party/WebKit/Source/modules/payments/PaymentRequestDetailsTest.cpp
@@ -54,7 +54,6 @@
     ExceptionCode m_expectedExceptionCode;
 };
 
-
 class PaymentRequestDetailsTest : public testing::TestWithParam<DetailsTestCase> {
 public:
     PaymentRequestDetailsTest()
@@ -87,18 +86,32 @@
         EXPECT_EQ(GetParam().getExpectedExceptionCode(), getExceptionState().code());
 }
 
-INSTANTIATE_TEST_CASE_P(RequiredData,
+INSTANTIATE_TEST_CASE_P(MissingData,
     PaymentRequestDetailsTest,
     testing::Values(
         DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestRemoveKey, "", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailItem, PaymentTestDataId, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailItem, PaymentTestDataLabel, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataAmount, PaymentTestRemoveKey, "", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataId, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataLabel, PaymentTestRemoveKey, "", true, V8TypeError)));
 
+INSTANTIATE_TEST_CASE_P(EmptyData,
+    PaymentRequestDetailsTest,
+    testing::Values(
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataId, PaymentTestOverwriteValue, "", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataLabel, PaymentTestOverwriteValue, "", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataId, PaymentTestOverwriteValue, "", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataLabel, PaymentTestOverwriteValue, "", true, V8TypeError)));
+
 INSTANTIATE_TEST_CASE_P(ValidCurrencyCodeFormat,
     PaymentRequestDetailsTest,
     testing::Values(
@@ -119,50 +132,61 @@
         DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "usd", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "", true, V8TypeError)));
 
-INSTANTIATE_TEST_CASE_P(ValidAmountFormat,
+INSTANTIATE_TEST_CASE_P(ValidValueFormat,
     PaymentRequestDetailsTest,
     testing::Values(
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "0"),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "-0"),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "1"),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "10"),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "-3"),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "10.99"),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "-3.00"),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "01234567890123456789.0123456789"),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "01234567890123456789012345678.9"),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "012345678901234567890123456789"),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "-01234567890123456789.0123456789"),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "-01234567890123456789012345678.9"),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "-012345678901234567890123456789"),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataAmount, PaymentTestOverwriteValue, "0"),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataAmount, PaymentTestOverwriteValue, "-0"),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataAmount, PaymentTestOverwriteValue, "1"),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataAmount, PaymentTestOverwriteValue, "10"),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataAmount, PaymentTestOverwriteValue, "-3"),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataAmount, PaymentTestOverwriteValue, "10.99"),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataAmount, PaymentTestOverwriteValue, "-3.00"),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataAmount, PaymentTestOverwriteValue, "01234567890123456789.0123456789"),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataAmount, PaymentTestOverwriteValue, "01234567890123456789012345678.9"),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataAmount, PaymentTestOverwriteValue, "012345678901234567890123456789"),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataAmount, PaymentTestOverwriteValue, "-01234567890123456789.0123456789"),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataAmount, PaymentTestOverwriteValue, "-01234567890123456789012345678.9"),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataAmount, PaymentTestOverwriteValue, "-012345678901234567890123456789")));
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "0"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "-0"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "1"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "10"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "-3"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "10.99"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "-3.00"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "01234567890123456789.0123456789"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "01234567890123456789012345678.9"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "012345678901234567890123456789"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "-01234567890123456789.0123456789"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "-01234567890123456789012345678.9"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "-012345678901234567890123456789"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "0"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "-0"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "1"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "10"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "-3"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "10.99"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "-3.00"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "01234567890123456789.0123456789"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "01234567890123456789012345678.9"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "012345678901234567890123456789"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "-01234567890123456789.0123456789"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "-01234567890123456789012345678.9"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "-012345678901234567890123456789")));
 
-INSTANTIATE_TEST_CASE_P(InvalidAmountFormat,
+INSTANTIATE_TEST_CASE_P(InvalidValueFormat,
     PaymentRequestDetailsTest,
     testing::Values(
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "-", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "notdigits", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "ALSONOTDIGITS", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "10.", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, ".99", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "-10.", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "10-", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "1-0", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "1.0.0", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestOverwriteValue, "1/3", true, V8TypeError)));
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "-", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "notdigits", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "ALSONOTDIGITS", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "10.", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, ".99", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "-10.", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "10-", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "1-0", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "1.0.0", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "1/3", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "-", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "notdigits", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "ALSONOTDIGITS", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "10.", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, ".99", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "-10.", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "10-", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "1-0", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "1.0.0", true, V8TypeError),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "1/3", true, V8TypeError)));
 
 } // namespace
 } // namespace blink
diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequestTest.cpp b/third_party/WebKit/Source/modules/payments/PaymentRequestTest.cpp
index da50d216..bbbf258 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentRequestTest.cpp
+++ b/third_party/WebKit/Source/modules/payments/PaymentRequestTest.cpp
@@ -13,11 +13,12 @@
 #include "modules/payments/PaymentItem.h"
 #include "modules/payments/ShippingOption.h"
 #include "platform/heap/HeapAllocator.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "wtf/OwnPtr.h"
+#include <utility>
 
 namespace blink {
-
 namespace {
 
 class PaymentRequestTest : public testing::Test {
@@ -102,8 +103,10 @@
 {
     PaymentDetails details;
     details.setItems(HeapVector<PaymentItem>(1, buildPaymentItemForTest()));
+    PaymentOptions options;
+    options.setRequestShipping(true);
 
-    PaymentRequest* request = PaymentRequest::create(getScriptState(), Vector<String>(1, "foo"), details, getExceptionState());
+    PaymentRequest* request = PaymentRequest::create(getScriptState(), Vector<String>(1, "foo"), details, options, getExceptionState());
 
     EXPECT_TRUE(request->shippingOption().isNull());
 }
@@ -113,21 +116,49 @@
     PaymentDetails details;
     details.setItems(HeapVector<PaymentItem>(1, buildPaymentItemForTest()));
     details.setShippingOptions(HeapVector<ShippingOption>(2, buildShippingOptionForTest()));
+    PaymentOptions options;
+    options.setRequestShipping(true);
+
+    PaymentRequest* request = PaymentRequest::create(getScriptState(), Vector<String>(1, "foo"), details, options, getExceptionState());
+
+    EXPECT_TRUE(request->shippingOption().isNull());
+}
+
+TEST_F(PaymentRequestTest, SelectSingleAvailableShippingOptionWhenShippingRequested)
+{
+    PaymentDetails details;
+    details.setItems(HeapVector<PaymentItem>(1, buildPaymentItemForTest()));
+    details.setShippingOptions(HeapVector<ShippingOption>(1, buildShippingOptionForTest(PaymentTestDataId, PaymentTestOverwriteValue, "standard")));
+    PaymentOptions options;
+    options.setRequestShipping(true);
+
+    PaymentRequest* request = PaymentRequest::create(getScriptState(), Vector<String>(1, "foo"), details, options, getExceptionState());
+
+    EXPECT_EQ("standard", request->shippingOption());
+}
+
+TEST_F(PaymentRequestTest, DontSelectSingleAvailableShippingOptionByDefault)
+{
+    PaymentDetails details;
+    details.setItems(HeapVector<PaymentItem>(1, buildPaymentItemForTest()));
+    details.setShippingOptions(HeapVector<ShippingOption>(1, buildShippingOptionForTest(PaymentTestDataId, PaymentTestOverwriteValue, "standard")));
 
     PaymentRequest* request = PaymentRequest::create(getScriptState(), Vector<String>(1, "foo"), details, getExceptionState());
 
     EXPECT_TRUE(request->shippingOption().isNull());
 }
 
-TEST_F(PaymentRequestTest, SelectSingleAvailableShippingOption)
+TEST_F(PaymentRequestTest, DontSelectSingleAvailableShippingOptionWhenShippingNotRequested)
 {
     PaymentDetails details;
     details.setItems(HeapVector<PaymentItem>(1, buildPaymentItemForTest()));
     details.setShippingOptions(HeapVector<ShippingOption>(1, buildShippingOptionForTest()));
+    PaymentOptions options;
+    options.setRequestShipping(false);
 
-    PaymentRequest* request = PaymentRequest::create(getScriptState(), Vector<String>(1, "foo"), details, getExceptionState());
+    PaymentRequest* request = PaymentRequest::create(getScriptState(), Vector<String>(1, "foo"), details, options, getExceptionState());
 
-    EXPECT_EQ("standard", request->shippingOption());
+    EXPECT_TRUE(request->shippingOption().isNull());
 }
 
 TEST_F(PaymentRequestTest, AbortWithoutShowShouldThrow)
@@ -139,5 +170,156 @@
     EXPECT_TRUE(getExceptionState().hadException());
 }
 
+class MockFunction : public ScriptFunction {
+public:
+    static v8::Local<v8::Function> noExpectations(ScriptState* scriptState)
+    {
+        MockFunction* self = new MockFunction(scriptState);
+        return self->bindToV8Function();
+    }
+
+    static v8::Local<v8::Function> expectCall(ScriptState* scriptState)
+    {
+        MockFunction* self = new MockFunction(scriptState);
+        EXPECT_CALL(*self, call(testing::_));
+        return self->bindToV8Function();
+    }
+
+    static v8::Local<v8::Function> expectNoCall(ScriptState* scriptState)
+    {
+        MockFunction* self = new MockFunction(scriptState);
+        EXPECT_CALL(*self, call(testing::_)).Times(0);
+        return self->bindToV8Function();
+    }
+
+private:
+    explicit MockFunction(ScriptState* scriptState)
+        : ScriptFunction(scriptState)
+    {
+        ON_CALL(*this, call(testing::_)).WillByDefault(testing::ReturnArg<0>());
+    }
+
+    MOCK_METHOD1(call, ScriptValue(ScriptValue));
+};
+
+TEST_F(PaymentRequestTest, CanAbortAfterShow)
+{
+    ScriptState::Scope scope(getScriptState());
+    PaymentRequest* request = PaymentRequest::create(getScriptState(), Vector<String>(1, "foo"), buildPaymentDetailsForTest(), getExceptionState());
+    EXPECT_FALSE(getExceptionState().hadException());
+
+    request->show(getScriptState()).then(MockFunction::expectNoCall(getScriptState()), MockFunction::noExpectations(getScriptState()));
+    request->abort(getExceptionState());
+
+    EXPECT_FALSE(getExceptionState().hadException());
+}
+
+TEST_F(PaymentRequestTest, RejectShowPromiseOnInvalidShippingAddress)
+{
+    ScriptState::Scope scope(getScriptState());
+    PaymentRequest* request = PaymentRequest::create(getScriptState(), Vector<String>(1, "foo"), buildPaymentDetailsForTest(), getExceptionState());
+    EXPECT_FALSE(getExceptionState().hadException());
+
+    request->show(getScriptState()).then(MockFunction::expectNoCall(getScriptState()), MockFunction::expectCall(getScriptState()));
+
+    static_cast<mojom::blink::PaymentRequestClient*>(request)->OnShippingAddressChange(mojom::blink::ShippingAddress::New());
+}
+
+TEST_F(PaymentRequestTest, DontRejectShowPromiseForValidShippingAddress)
+{
+    ScriptState::Scope scope(getScriptState());
+    PaymentRequest* request = PaymentRequest::create(getScriptState(), Vector<String>(1, "foo"), buildPaymentDetailsForTest(), getExceptionState());
+    EXPECT_FALSE(getExceptionState().hadException());
+    mojom::blink::ShippingAddressPtr shippingAddress = mojom::blink::ShippingAddress::New();
+    shippingAddress->region_code = "US";
+    shippingAddress->language_code = "en";
+    shippingAddress->script_code = "Latn";
+
+    request->show(getScriptState()).then(MockFunction::expectNoCall(getScriptState()), MockFunction::expectNoCall(getScriptState()));
+
+    static_cast<mojom::blink::PaymentRequestClient*>(request)->OnShippingAddressChange(std::move(shippingAddress));
+}
+
+TEST_F(PaymentRequestTest, ResolveShowPromiseWithoutShippingAddressInResponse)
+{
+    ScriptState::Scope scope(getScriptState());
+    PaymentRequest* request = PaymentRequest::create(getScriptState(), Vector<String>(1, "foo"), buildPaymentDetailsForTest(), getExceptionState());
+    EXPECT_FALSE(getExceptionState().hadException());
+
+    request->show(getScriptState()).then(MockFunction::expectCall(getScriptState()), MockFunction::expectNoCall(getScriptState()));
+
+    static_cast<mojom::blink::PaymentRequestClient*>(request)->OnPaymentResponse(mojom::blink::PaymentResponse::New());
+}
+
+TEST_F(PaymentRequestTest, OnShippingOptionChange)
+{
+    ScriptState::Scope scope(getScriptState());
+    PaymentRequest* request = PaymentRequest::create(getScriptState(), Vector<String>(1, "foo"), buildPaymentDetailsForTest(), getExceptionState());
+    EXPECT_FALSE(getExceptionState().hadException());
+
+    request->show(getScriptState()).then(MockFunction::expectNoCall(getScriptState()), MockFunction::expectNoCall(getScriptState()));
+
+    static_cast<mojom::blink::PaymentRequestClient*>(request)->OnShippingOptionChange("standardShipping");
+}
+
+TEST_F(PaymentRequestTest, CannotCallShowTwice)
+{
+    ScriptState::Scope scope(getScriptState());
+    PaymentRequest* request = PaymentRequest::create(getScriptState(), Vector<String>(1, "foo"), buildPaymentDetailsForTest(), getExceptionState());
+    EXPECT_FALSE(getExceptionState().hadException());
+    request->show(getScriptState());
+
+    request->show(getScriptState()).then(MockFunction::expectNoCall(getScriptState()), MockFunction::expectCall(getScriptState()));
+}
+
+TEST_F(PaymentRequestTest, CannotCallCompleteTwice)
+{
+    ScriptState::Scope scope(getScriptState());
+    PaymentRequest* request = PaymentRequest::create(getScriptState(), Vector<String>(1, "foo"), buildPaymentDetailsForTest(), getExceptionState());
+    EXPECT_FALSE(getExceptionState().hadException());
+    request->show(getScriptState());
+    static_cast<mojom::blink::PaymentRequestClient*>(request)->OnPaymentResponse(mojom::blink::PaymentResponse::New());
+    request->complete(getScriptState(), false);
+
+    request->complete(getScriptState(), true).then(MockFunction::expectNoCall(getScriptState()), MockFunction::expectCall(getScriptState()));
+}
+
+TEST_F(PaymentRequestTest, RejectShowPromiseOnError)
+{
+    ScriptState::Scope scope(getScriptState());
+    PaymentRequest* request = PaymentRequest::create(getScriptState(), Vector<String>(1, "foo"), buildPaymentDetailsForTest(), getExceptionState());
+    EXPECT_FALSE(getExceptionState().hadException());
+
+    request->show(getScriptState()).then(MockFunction::expectNoCall(getScriptState()), MockFunction::expectCall(getScriptState()));
+
+    static_cast<mojom::blink::PaymentRequestClient*>(request)->OnError();
+}
+
+TEST_F(PaymentRequestTest, RejectCompletePromiseOnError)
+{
+    ScriptState::Scope scope(getScriptState());
+    PaymentRequest* request = PaymentRequest::create(getScriptState(), Vector<String>(1, "foo"), buildPaymentDetailsForTest(), getExceptionState());
+    EXPECT_FALSE(getExceptionState().hadException());
+    request->show(getScriptState());
+    static_cast<mojom::blink::PaymentRequestClient*>(request)->OnPaymentResponse(mojom::blink::PaymentResponse::New());
+
+    request->complete(getScriptState(), true).then(MockFunction::expectNoCall(getScriptState()), MockFunction::expectCall(getScriptState()));
+
+    static_cast<mojom::blink::PaymentRequestClient*>(request)->OnError();
+}
+
+TEST_F(PaymentRequestTest, ResolvePromiseOnComplete)
+{
+    ScriptState::Scope scope(getScriptState());
+    PaymentRequest* request = PaymentRequest::create(getScriptState(), Vector<String>(1, "foo"), buildPaymentDetailsForTest(), getExceptionState());
+    EXPECT_FALSE(getExceptionState().hadException());
+    request->show(getScriptState());
+    static_cast<mojom::blink::PaymentRequestClient*>(request)->OnPaymentResponse(mojom::blink::PaymentResponse::New());
+
+    request->complete(getScriptState(), true).then(MockFunction::expectCall(getScriptState()), MockFunction::expectNoCall(getScriptState()));
+
+    static_cast<mojom::blink::PaymentRequestClient*>(request)->OnComplete();
+}
+
 } // namespace
 } // namespace blink
diff --git a/third_party/WebKit/Source/modules/payments/PaymentResponseTest.cpp b/third_party/WebKit/Source/modules/payments/PaymentResponseTest.cpp
index ff36604..5677cb4 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentResponseTest.cpp
+++ b/third_party/WebKit/Source/modules/payments/PaymentResponseTest.cpp
@@ -6,9 +6,9 @@
 
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/ScriptState.h"
+#include "bindings/core/v8/ScriptValue.h"
 #include "core/testing/DummyPageHolder.h"
 #include "modules/payments/PaymentCompleter.h"
-#include "modules/payments/PaymentDetailsTestHelper.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "wtf/OwnPtr.h"
@@ -43,7 +43,6 @@
     PaymentResponseTest()
         : m_page(DummyPageHolder::create())
     {
-        m_page->document().setSecurityOrigin(SecurityOrigin::create(KURL(KURL(), "https://www.example.com/")));
     }
 
     ~PaymentResponseTest() override {}
@@ -58,6 +57,7 @@
 
 TEST_F(PaymentResponseTest, DataCopiedOver)
 {
+    ScriptState::Scope scope(getScriptState());
     mojom::blink::PaymentResponsePtr input = mojom::blink::PaymentResponse::New();
     input->method_name = "foo";
     input->stringified_details = "{\"transactionId\": 123}";
@@ -65,12 +65,20 @@
 
     PaymentResponse output(std::move(input), completeCallback);
 
-    // TODO(rouslan): Verify that output.details() contains parsed input->stringified_details.
-    EXPECT_FALSE(getExceptionState().hadException());
     EXPECT_EQ("foo", output.methodName());
+
+    ScriptValue details = output.details(getScriptState(), getExceptionState());
+
+    ASSERT_FALSE(getExceptionState().hadException());
+    ASSERT_TRUE(details.v8Value()->IsObject());
+
+    ScriptValue transactionId(getScriptState(), details.v8Value().As<v8::Object>()->Get(v8String(getScriptState()->isolate(), "transactionId")));
+
+    ASSERT_TRUE(transactionId.v8Value()->IsNumber());
+    EXPECT_EQ(123, transactionId.v8Value().As<v8::Number>()->Value());
 }
 
-TEST_F(PaymentResponseTest, CompleteCalled)
+TEST_F(PaymentResponseTest, CompleteCalledWithSuccess)
 {
     mojom::blink::PaymentResponsePtr input = mojom::blink::PaymentResponse::New();
     input->method_name = "foo";
@@ -78,11 +86,23 @@
     MockPaymentCompleter* completeCallback = new MockPaymentCompleter;
     PaymentResponse output(std::move(input), completeCallback);
 
-    EXPECT_FALSE(getExceptionState().hadException());
     EXPECT_CALL(*completeCallback, complete(getScriptState(), true));
 
     output.complete(getScriptState(), true);
 }
 
+TEST_F(PaymentResponseTest, CompleteCalledWithFailure)
+{
+    mojom::blink::PaymentResponsePtr input = mojom::blink::PaymentResponse::New();
+    input->method_name = "foo";
+    input->stringified_details = "{\"transactionId\": 123}";
+    MockPaymentCompleter* completeCallback = new MockPaymentCompleter;
+    PaymentResponse output(std::move(input), completeCallback);
+
+    EXPECT_CALL(*completeCallback, complete(getScriptState(), false));
+
+    output.complete(getScriptState(), false);
+}
+
 } // namespace
 } // namespace blink
diff --git a/third_party/WebKit/Source/modules/payments/PaymentsValidators.cpp b/third_party/WebKit/Source/modules/payments/PaymentsValidators.cpp
index e57a9a4..cc6b0cf 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentsValidators.cpp
+++ b/third_party/WebKit/Source/modules/payments/PaymentsValidators.cpp
@@ -64,4 +64,25 @@
     return false;
 }
 
+bool PaymentsValidators::isValidShippingAddress(const mojom::blink::ShippingAddressPtr& address, String* optionalErrorMessage)
+{
+    if (!isValidRegionCodeFormat(address->region_code, optionalErrorMessage))
+        return false;
+
+    if (!isValidLanguageCodeFormat(address->language_code, optionalErrorMessage))
+        return false;
+
+    if (!isValidScriptCodeFormat(address->script_code, optionalErrorMessage))
+        return false;
+
+    if (address->language_code.isEmpty() && !address->script_code.isEmpty()) {
+        if (optionalErrorMessage)
+            *optionalErrorMessage = "If language code is empty, then script code should also be empty";
+
+        return false;
+    }
+
+    return true;
+}
+
 } // namespace blink
diff --git a/third_party/WebKit/Source/modules/payments/PaymentsValidators.h b/third_party/WebKit/Source/modules/payments/PaymentsValidators.h
index 9aba4015..672f3be 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentsValidators.h
+++ b/third_party/WebKit/Source/modules/payments/PaymentsValidators.h
@@ -6,6 +6,7 @@
 #define PaymentsValidators_h
 
 #include "modules/ModulesExport.h"
+#include "public/platform/modules/payments/payment_request.mojom-blink.h"
 #include "wtf/Allocator.h"
 #include "wtf/text/WTFString.h"
 
@@ -29,6 +30,13 @@
 
     // Returns true if |code| is a valid ISO 15924 script code.
     static bool isValidScriptCodeFormat(const String& code, String* optionalErrorMessage);
+
+    // Returns true if the shipping address is valid:
+    //  - Has a valid region code
+    //  - Has a valid language code, if any.
+    //  - Has a valid script code, if any.
+    // A script code should be present only if language code is present.
+    static bool isValidShippingAddress(const mojom::blink::ShippingAddressPtr&, String* optionalErrorMessage);
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/modules/payments/PaymentsValidatorsTest.cpp b/third_party/WebKit/Source/modules/payments/PaymentsValidatorsTest.cpp
index 7ea0bac..274d4eae 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentsValidatorsTest.cpp
+++ b/third_party/WebKit/Source/modules/payments/PaymentsValidatorsTest.cpp
@@ -167,5 +167,51 @@
         TestCase("latn", false),
         TestCase("LATN", false)));
 
+struct ShippingAddressTestCase {
+    ShippingAddressTestCase(const char* regionCode, const char* languageCode, const char* scriptCode, bool expectedValid)
+        : regionCode(regionCode)
+        , languageCode(languageCode)
+        , scriptCode(scriptCode)
+        , expectedValid(expectedValid)
+    {
+    }
+    ~ShippingAddressTestCase() {}
+
+    const char* regionCode;
+    const char* languageCode;
+    const char* scriptCode;
+    bool expectedValid;
+};
+
+class PaymentsShippingAddressValidatorTest : public testing::TestWithParam<ShippingAddressTestCase> {
+};
+
+TEST_P(PaymentsShippingAddressValidatorTest, IsValidShippingAddress)
+{
+    mojom::blink::ShippingAddressPtr address = mojom::blink::ShippingAddress::New();
+    address->region_code = GetParam().regionCode;
+    address->language_code = GetParam().languageCode;
+    address->script_code = GetParam().scriptCode;
+
+    String errorMessage;
+    EXPECT_EQ(GetParam().expectedValid, PaymentsValidators::isValidShippingAddress(address, &errorMessage)) << errorMessage;
+    EXPECT_EQ(GetParam().expectedValid, errorMessage.isEmpty()) << errorMessage;
+
+    EXPECT_EQ(GetParam().expectedValid, PaymentsValidators::isValidShippingAddress(address, nullptr));
+}
+
+INSTANTIATE_TEST_CASE_P(ShippingAddresses,
+    PaymentsShippingAddressValidatorTest,
+    testing::Values(
+        ShippingAddressTestCase("US", "en", "Latn", true),
+        ShippingAddressTestCase("US", "en", "", true),
+        ShippingAddressTestCase("US", "", "", true),
+        // Invalid shipping addresses
+        ShippingAddressTestCase("", "", "", false),
+        ShippingAddressTestCase("InvalidRegionCode", "", "", false),
+        ShippingAddressTestCase("US", "InvalidLanguageCode", "", false),
+        ShippingAddressTestCase("US", "en", "InvalidScriptCode", false),
+        ShippingAddressTestCase("US", "", "Latn", false)));
+
 } // namespace
 } // namespace blink
diff --git a/third_party/WebKit/Source/modules/quota/StorageManager.cpp b/third_party/WebKit/Source/modules/quota/StorageManager.cpp
index 783c855..06bdb6b 100644
--- a/third_party/WebKit/Source/modules/quota/StorageManager.cpp
+++ b/third_party/WebKit/Source/modules/quota/StorageManager.cpp
@@ -21,41 +21,9 @@
 
 namespace {
 
-class DurableStorageQueryCallbacks final : public WebPermissionCallback {
+class DurableStorageCallbacks final : public WebPermissionCallback {
 public:
-    DurableStorageQueryCallbacks(ScriptPromiseResolver* resolver)
-        : m_resolver(resolver)
-    {
-    }
-
-    void onSuccess(WebPermissionStatus status) override
-    {
-        String toReturn;
-        switch (status) {
-        case WebPermissionStatusGranted:
-            toReturn = "granted";
-            break;
-        case WebPermissionStatusDenied:
-            toReturn = "denied";
-            break;
-        case WebPermissionStatusPrompt:
-            toReturn = "default";
-            break;
-        }
-        m_resolver->resolve(toReturn);
-    }
-    void onError() override
-    {
-        ASSERT_NOT_REACHED();
-    }
-
-private:
-    Persistent<ScriptPromiseResolver> m_resolver;
-};
-
-class DurableStorageRequestCallbacks final : public WebPermissionCallback {
-public:
-    DurableStorageRequestCallbacks(ScriptPromiseResolver* resolver)
+    DurableStorageCallbacks(ScriptPromiseResolver* resolver)
         : m_resolver(resolver)
     {
     }
@@ -106,7 +74,7 @@
 
 } // namespace
 
-ScriptPromise StorageManager::requestPersistent(ScriptState* scriptState)
+ScriptPromise StorageManager::persist(ScriptState* scriptState)
 {
     ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
     ScriptPromise promise = resolver->promise();
@@ -130,12 +98,12 @@
         resolver->reject(DOMException::create(InvalidStateError, "In its current state, the global scope can't request permissions."));
         return promise;
     }
-    permissionClient->requestPermission(WebPermissionTypeDurableStorage, KURL(KURL(), scriptState->getExecutionContext()->getSecurityOrigin()->toString()), new DurableStorageRequestCallbacks(resolver));
+    permissionClient->requestPermission(WebPermissionTypeDurableStorage, KURL(KURL(), scriptState->getExecutionContext()->getSecurityOrigin()->toString()), new DurableStorageCallbacks(resolver));
 
     return promise;
 }
 
-ScriptPromise StorageManager::persistentPermission(ScriptState* scriptState)
+ScriptPromise StorageManager::persisted(ScriptState* scriptState)
 {
     ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
     ScriptPromise promise = resolver->promise();
@@ -144,7 +112,7 @@
         resolver->reject(DOMException::create(InvalidStateError, "In its current state, the global scope can't query permissions."));
         return promise;
     }
-    permissionClient->queryPermission(WebPermissionTypeDurableStorage, KURL(KURL(), scriptState->getExecutionContext()->getSecurityOrigin()->toString()), new DurableStorageQueryCallbacks(resolver));
+    permissionClient->queryPermission(WebPermissionTypeDurableStorage, KURL(KURL(), scriptState->getExecutionContext()->getSecurityOrigin()->toString()), new DurableStorageCallbacks(resolver));
     return promise;
 }
 
diff --git a/third_party/WebKit/Source/modules/quota/StorageManager.h b/third_party/WebKit/Source/modules/quota/StorageManager.h
index 643ffe5..79e4096 100644
--- a/third_party/WebKit/Source/modules/quota/StorageManager.h
+++ b/third_party/WebKit/Source/modules/quota/StorageManager.h
@@ -16,8 +16,9 @@
 class StorageManager final : public GarbageCollected<StorageManager>, public ScriptWrappable {
 DEFINE_WRAPPERTYPEINFO();
 public:
-    ScriptPromise requestPersistent(ScriptState*);
-    ScriptPromise persistentPermission(ScriptState*);
+    ScriptPromise persisted(ScriptState*);
+    ScriptPromise persist(ScriptState*);
+
     ScriptPromise estimate(ScriptState*);
     DECLARE_TRACE();
 };
diff --git a/third_party/WebKit/Source/modules/quota/StorageManager.idl b/third_party/WebKit/Source/modules/quota/StorageManager.idl
index 628d4985..5d14e58 100644
--- a/third_party/WebKit/Source/modules/quota/StorageManager.idl
+++ b/third_party/WebKit/Source/modules/quota/StorageManager.idl
@@ -4,14 +4,12 @@
 
 // https://storage.spec.whatwg.org/#storagemanager
 
-enum PersistentStoragePermission { "default", "denied", "granted" };
-
 [
     Exposed=(Window,Worker),
     RuntimeEnabled=DurableStorage,
 ] interface StorageManager {
-    [Exposed=Window, CallWith=ScriptState] Promise<boolean> requestPersistent();
-    [CallWith=ScriptState] Promise<PersistentStoragePermission> persistentPermission();
+    [CallWith=ScriptState] Promise<boolean> persisted();
+    [Exposed=Window, CallWith=ScriptState] Promise<boolean> persist();
 
     [CallWith=ScriptState] Promise<StorageEstimate> estimate();
 };
diff --git a/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.cpp b/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.cpp
index c06e0f3..9bff5cd 100644
--- a/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.cpp
@@ -891,6 +891,14 @@
     }
 }
 
+void AbstractAudioContext::rejectPendingDecodeAudioDataResolvers()
+{
+    // Now reject any pending decodeAudioData resolvers
+    for (auto& resolver : m_decodeAudioResolvers)
+        resolver->reject(DOMException::create(InvalidStateError, "Audio context is going away"));
+    m_decodeAudioResolvers.clear();
+}
+
 void AbstractAudioContext::rejectPendingResolvers()
 {
     ASSERT(isMainThread());
@@ -903,10 +911,7 @@
     m_resumeResolvers.clear();
     m_isResolvingResumePromises = false;
 
-    // Now reject any pending decodeAudioData resolvers
-    for (auto& resolver : m_decodeAudioResolvers)
-        resolver->reject(DOMException::create(InvalidStateError, "Audio context is going away"));
-    m_decodeAudioResolvers.clear();
+    rejectPendingDecodeAudioDataResolvers();
 }
 
 const AtomicString& AbstractAudioContext::interfaceName() const
diff --git a/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.h b/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.h
index 42e175a2..75e8d765 100644
--- a/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.h
+++ b/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.h
@@ -118,11 +118,15 @@
 
     size_t currentSampleFrame() const
     {
+        // TODO: What is the correct value for the current frame if the destination node has gone
+        // away?  0 is a valid frame.
         return m_destinationNode ? m_destinationNode->audioDestinationHandler().currentSampleFrame() : 0;
     }
 
     double currentTime() const
     {
+        // TODO: What is the correct value for the current time if the destination node has gone
+        // away? 0 is a valid time.
         return m_destinationNode ? m_destinationNode->audioDestinationHandler().currentTime() : 0;
     }
 
@@ -281,6 +285,9 @@
 
     void setClosedContextSampleRate(float newSampleRate) { m_closedContextSampleRate = newSampleRate; }
     float closedContextSampleRate() const { return m_closedContextSampleRate; }
+
+    void rejectPendingDecodeAudioDataResolvers();
+
 private:
     bool m_isCleared;
     void clear();
@@ -312,7 +319,8 @@
     void resolvePromisesForResume();
     void resolvePromisesForResumeOnMainThread();
 
-    void rejectPendingResolvers();
+    // When the context is going away, reject any pending script promise resolvers.
+    virtual void rejectPendingResolvers();
 
     // True if we're in the process of resolving promises for resume().  Resolving can take some
     // time and the audio context process loop is very fast, so we don't want to call resolve an
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioBufferSourceNode.cpp b/third_party/WebKit/Source/modules/webaudio/AudioBufferSourceNode.cpp
index fee8a966..ed24376 100644
--- a/third_party/WebKit/Source/modules/webaudio/AudioBufferSourceNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/AudioBufferSourceNode.cpp
@@ -583,8 +583,8 @@
 // ----------------------------------------------------------------
 AudioBufferSourceNode::AudioBufferSourceNode(AbstractAudioContext& context, float sampleRate)
     : AudioScheduledSourceNode(context)
-    , m_playbackRate(AudioParam::create(context, 1.0))
-    , m_detune(AudioParam::create(context, 0.0))
+    , m_playbackRate(AudioParam::create(context, ParamTypeAudioBufferSourcePlaybackRate, 1.0))
+    , m_detune(AudioParam::create(context, ParamTypeAudioBufferSourceDetune, 0.0))
 {
     setHandler(AudioBufferSourceHandler::create(*this, sampleRate, m_playbackRate->handler(), m_detune->handler()));
 }
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioParam.cpp b/third_party/WebKit/Source/modules/webaudio/AudioParam.cpp
index aa505aa..ab6894a 100644
--- a/third_party/WebKit/Source/modules/webaudio/AudioParam.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/AudioParam.cpp
@@ -40,6 +40,49 @@
     return *m_destinationHandler;
 }
 
+String AudioParamHandler::getParamName() const
+{
+    // The returned string should be the name of the node and the name of the AudioParam for
+    // that node.
+    switch (m_paramType) {
+    case ParamTypeAudioBufferSourcePlaybackRate:
+        return "AudioBufferSource.playbackRate";
+    case ParamTypeAudioBufferSourceDetune:
+        return "AudioBufferSource.detune";
+    case ParamTypeBiquadFilterFrequency:
+        return "BiquadFilter.frequency";
+    case ParamTypeBiquadFilterQ:
+        return "BiquadFilter.Q";
+    case ParamTypeBiquadFilterGain:
+        return "BiquadFilter.gain";
+    case ParamTypeBiquadFilterDetune:
+        return "BiquadFilter.detune";
+    case ParamTypeDelayDelayTime:
+        return "Delay.delayTime";
+    case ParamTypeDynamicsCompressorThreshold:
+        return "DynamicsCompressor.threshold";
+    case ParamTypeDynamicsCompressorKnee:
+        return "DynamicsCompressor.knee";
+    case ParamTypeDynamicsCompressorRatio:
+        return "DynamicsCompressor.ratio";
+    case ParamTypeDynamicsCompressorAttack:
+        return "DynamicsCompressor.attack";
+    case ParamTypeDynamicsCompressorRelease:
+        return "DynamicsCompressor.release";
+    case ParamTypeGainGain:
+        return "Gain.gain";
+    case ParamTypeOscillatorFrequency:
+        return "Oscillator.frequency";
+    case ParamTypeOscillatorDetune:
+        return "Oscillator.detune";
+    case ParamTypeStereoPannerPan:
+        return "StereoPanner.pan";
+    };
+
+    NOTREACHED();
+    return "UnknownNode.unknownAudioParam";
+}
+
 float AudioParamHandler::value()
 {
     // Update value for timeline.
@@ -193,15 +236,15 @@
 
 // ----------------------------------------------------------------
 
-AudioParam::AudioParam(AbstractAudioContext& context, double defaultValue)
-    : m_handler(AudioParamHandler::create(context, defaultValue))
+AudioParam::AudioParam(AbstractAudioContext& context, AudioParamType paramType, double defaultValue)
+    : m_handler(AudioParamHandler::create(context, paramType, defaultValue))
     , m_context(context)
 {
 }
 
-AudioParam* AudioParam::create(AbstractAudioContext& context, double defaultValue)
+AudioParam* AudioParam::create(AbstractAudioContext& context, AudioParamType paramType, double defaultValue)
 {
-    return new AudioParam(context, defaultValue);
+    return new AudioParam(context, paramType, defaultValue);
 }
 
 DEFINE_TRACE(AudioParam)
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioParam.h b/third_party/WebKit/Source/modules/webaudio/AudioParam.h
index ca19b33..42bffe7 100644
--- a/third_party/WebKit/Source/modules/webaudio/AudioParam.h
+++ b/third_party/WebKit/Source/modules/webaudio/AudioParam.h
@@ -43,6 +43,28 @@
 
 class AudioNodeOutput;
 
+// Each AudioParam gets an identifier here.  This is mostly for instrospection if warnings or
+// other messages need to be printed. It's useful to know what the AudioParam represents.  The
+// name should include the node type and the name of the AudioParam.
+enum AudioParamType {
+    ParamTypeAudioBufferSourcePlaybackRate,
+    ParamTypeAudioBufferSourceDetune,
+    ParamTypeBiquadFilterFrequency,
+    ParamTypeBiquadFilterQ,
+    ParamTypeBiquadFilterGain,
+    ParamTypeBiquadFilterDetune,
+    ParamTypeDelayDelayTime,
+    ParamTypeDynamicsCompressorThreshold,
+    ParamTypeDynamicsCompressorKnee,
+    ParamTypeDynamicsCompressorRatio,
+    ParamTypeDynamicsCompressorAttack,
+    ParamTypeDynamicsCompressorRelease,
+    ParamTypeGainGain,
+    ParamTypeOscillatorFrequency,
+    ParamTypeOscillatorDetune,
+    ParamTypeStereoPannerPan
+};
+
 // AudioParamHandler is an actual implementation of web-exposed AudioParam
 // interface. Each of AudioParam object creates and owns an AudioParamHandler,
 // and it is responsible for all of AudioParam tasks. An AudioParamHandler
@@ -52,12 +74,16 @@
 // dies.
 class AudioParamHandler final : public ThreadSafeRefCounted<AudioParamHandler>, public AudioSummingJunction {
 public:
+    AudioParamType getParamType() const { return m_paramType; }
+    // Return a nice name for the AudioParam.
+    String getParamName() const;
+
     static const double DefaultSmoothingConstant;
     static const double SnapThreshold;
 
-    static PassRefPtr<AudioParamHandler> create(AbstractAudioContext& context, double defaultValue)
+    static PassRefPtr<AudioParamHandler> create(AbstractAudioContext& context, AudioParamType paramType, double defaultValue)
     {
-        return adoptRef(new AudioParamHandler(context, defaultValue));
+        return adoptRef(new AudioParamHandler(context, paramType, defaultValue));
     }
 
     // This should be used only in audio rendering thread.
@@ -102,8 +128,9 @@
 
     float intrinsicValue() const { return noBarrierLoad(&m_intrinsicValue); }
 private:
-    AudioParamHandler(AbstractAudioContext& context, double defaultValue)
+    AudioParamHandler(AbstractAudioContext& context, AudioParamType paramType, double defaultValue)
         : AudioSummingJunction(context.deferredTaskHandler())
+        , m_paramType(paramType)
         , m_intrinsicValue(defaultValue)
         , m_defaultValue(defaultValue)
         , m_smoothedValue(defaultValue)
@@ -114,6 +141,10 @@
     void calculateFinalValues(float* values, unsigned numberOfValues, bool sampleAccurate);
     void calculateTimelineValues(float* values, unsigned numberOfValues);
 
+    // The type of AudioParam, indicating what this AudioParam represents and what node it belongs
+    // to.  Mostly for informational purposes and doesn't affect implementation.
+    AudioParamType m_paramType;
+
     // Intrinsic value
     float m_intrinsicValue;
     void setIntrinsicValue(float newValue) { noBarrierStore(&m_intrinsicValue, newValue); }
@@ -133,13 +164,16 @@
 class AudioParam final : public GarbageCollectedFinalized<AudioParam>, public ScriptWrappable {
     DEFINE_WRAPPERTYPEINFO();
 public:
-    static AudioParam* create(AbstractAudioContext&, double defaultValue);
+    static AudioParam* create(AbstractAudioContext&, AudioParamType, double defaultValue);
     DECLARE_TRACE();
     // |handler| always returns a valid object.
     AudioParamHandler& handler() const { return *m_handler; }
     // |context| always returns a valid object.
     AbstractAudioContext* context() const { return m_context; }
 
+    AudioParamType getParamType() const { return handler().getParamType(); }
+    String getParamName() const;
+
     float value() const;
     void setValue(float);
     float defaultValue() const;
@@ -151,7 +185,7 @@
     AudioParam* cancelScheduledValues(double startTime, ExceptionState&);
 
 private:
-    AudioParam(AbstractAudioContext&, double defaultValue);
+    AudioParam(AbstractAudioContext&, AudioParamType, double defaultValue);
 
     RefPtr<AudioParamHandler> m_handler;
     Member<AbstractAudioContext> m_context;
diff --git a/third_party/WebKit/Source/modules/webaudio/BiquadFilterNode.cpp b/third_party/WebKit/Source/modules/webaudio/BiquadFilterNode.cpp
index 45a2fc7..90951fcc1 100644
--- a/third_party/WebKit/Source/modules/webaudio/BiquadFilterNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/BiquadFilterNode.cpp
@@ -29,10 +29,10 @@
 
 BiquadFilterNode::BiquadFilterNode(AbstractAudioContext& context, float sampleRate)
     : AudioNode(context)
-    , m_frequency(AudioParam::create(context, 350.0))
-    , m_q(AudioParam::create(context, 1))
-    , m_gain(AudioParam::create(context, 0.0))
-    , m_detune(AudioParam::create(context, 0.0))
+    , m_frequency(AudioParam::create(context, ParamTypeBiquadFilterFrequency, 350.0))
+    , m_q(AudioParam::create(context, ParamTypeBiquadFilterQ, 1))
+    , m_gain(AudioParam::create(context, ParamTypeBiquadFilterGain, 0.0))
+    , m_detune(AudioParam::create(context, ParamTypeBiquadFilterDetune, 0.0))
 {
     setHandler(AudioBasicProcessorHandler::create(AudioHandler::NodeTypeBiquadFilter, *this, sampleRate, adoptPtr(new BiquadProcessor(sampleRate, 1, m_frequency->handler(), m_q->handler(), m_gain->handler(), m_detune->handler()))));
 }
diff --git a/third_party/WebKit/Source/modules/webaudio/DelayNode.cpp b/third_party/WebKit/Source/modules/webaudio/DelayNode.cpp
index 7e1ecc8..4a3adf66 100644
--- a/third_party/WebKit/Source/modules/webaudio/DelayNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/DelayNode.cpp
@@ -36,7 +36,7 @@
 
 DelayNode::DelayNode(AbstractAudioContext& context, float sampleRate, double maxDelayTime)
     : AudioNode(context)
-    , m_delayTime(AudioParam::create(context, 0.0))
+    , m_delayTime(AudioParam::create(context, ParamTypeDelayDelayTime, 0.0))
 {
     setHandler(AudioBasicProcessorHandler::create(AudioHandler::NodeTypeDelay, *this, sampleRate, adoptPtr(new DelayProcessor(sampleRate, 1, m_delayTime->handler(), maxDelayTime))));
 }
diff --git a/third_party/WebKit/Source/modules/webaudio/DynamicsCompressorNode.cpp b/third_party/WebKit/Source/modules/webaudio/DynamicsCompressorNode.cpp
index ce43aeb..dd77f7b 100644
--- a/third_party/WebKit/Source/modules/webaudio/DynamicsCompressorNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/DynamicsCompressorNode.cpp
@@ -127,11 +127,11 @@
 
 DynamicsCompressorNode::DynamicsCompressorNode(AbstractAudioContext& context, float sampleRate)
     : AudioNode(context)
-    , m_threshold(AudioParam::create(context, -24))
-    , m_knee(AudioParam::create(context, 30))
-    , m_ratio(AudioParam::create(context, 12))
-    , m_attack(AudioParam::create(context, 0.003))
-    , m_release(AudioParam::create(context, 0.250))
+    , m_threshold(AudioParam::create(context, ParamTypeDynamicsCompressorThreshold, -24))
+    , m_knee(AudioParam::create(context, ParamTypeDynamicsCompressorKnee, 30))
+    , m_ratio(AudioParam::create(context, ParamTypeDynamicsCompressorRatio, 12))
+    , m_attack(AudioParam::create(context, ParamTypeDynamicsCompressorAttack, 0.003))
+    , m_release(AudioParam::create(context, ParamTypeDynamicsCompressorRelease, 0.250))
 {
     setHandler(DynamicsCompressorHandler::create(
         *this,
diff --git a/third_party/WebKit/Source/modules/webaudio/GainNode.cpp b/third_party/WebKit/Source/modules/webaudio/GainNode.cpp
index 581becb..6c8ad44 100644
--- a/third_party/WebKit/Source/modules/webaudio/GainNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/GainNode.cpp
@@ -116,7 +116,7 @@
 
 GainNode::GainNode(AbstractAudioContext& context, float sampleRate)
     : AudioNode(context)
-    , m_gain(AudioParam::create(context, 1.0))
+    , m_gain(AudioParam::create(context, ParamTypeGainGain, 1.0))
 {
     setHandler(GainHandler::create(*this, sampleRate, m_gain->handler()));
 }
diff --git a/third_party/WebKit/Source/modules/webaudio/OfflineAudioContext.cpp b/third_party/WebKit/Source/modules/webaudio/OfflineAudioContext.cpp
index e00c3ee..247e8a98 100644
--- a/third_party/WebKit/Source/modules/webaudio/OfflineAudioContext.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/OfflineAudioContext.cpp
@@ -373,14 +373,37 @@
     // Wait until the suspend map is available for the removal.
     AutoLocker locker(this);
 
-    // |frame| must exist in the map. However, it can be removed already in a
-    // very rare case. See: crbug.com/568796
-    RELEASE_ASSERT(m_scheduledSuspends.contains(frame));
+    // If the context is going away, m_scheduledSuspends could have had all its entries removed.
+    // Check for that here.
+    if (m_scheduledSuspends.size()) {
+        // |frame| must exist in the map.
+        DCHECK(m_scheduledSuspends.contains(frame));
 
-    SuspendMap::iterator it = m_scheduledSuspends.find(frame);
-    it->value->resolve();
+        SuspendMap::iterator it = m_scheduledSuspends.find(frame);
+        it->value->resolve();
 
-    m_scheduledSuspends.remove(it);
+        m_scheduledSuspends.remove(it);
+    }
+}
+
+void OfflineAudioContext::rejectPendingResolvers()
+{
+    ASSERT(isMainThread());
+
+    // Wait until the suspend map is available for removal.
+    AutoLocker locker(this);
+
+    // Offline context is going away so reject any promises that are still pending.
+
+    for (auto& pendingSuspendResolver : m_scheduledSuspends) {
+        pendingSuspendResolver.value->reject(DOMException::create(
+            InvalidStateError, "Audio context is going away"));
+    }
+
+    m_scheduledSuspends.clear();
+    ASSERT(m_resumeResolvers.size() == 0);
+
+    rejectPendingDecodeAudioDataResolvers();
 }
 
 bool OfflineAudioContext::shouldSuspend()
diff --git a/third_party/WebKit/Source/modules/webaudio/OfflineAudioContext.h b/third_party/WebKit/Source/modules/webaudio/OfflineAudioContext.h
index 946e26d..e347a644 100644
--- a/third_party/WebKit/Source/modules/webaudio/OfflineAudioContext.h
+++ b/third_party/WebKit/Source/modules/webaudio/OfflineAudioContext.h
@@ -55,6 +55,8 @@
     // CANNOT be called from an OfflineAudioContext.
     ScriptPromise suspendContext(ScriptState*) final;
 
+    void rejectPendingResolvers() override;
+
     bool hasRealtimeConstraint() final { return false; }
 
     DEFINE_ATTRIBUTE_EVENT_LISTENER(complete);
diff --git a/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.cpp b/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.cpp
index ee8e116..65829d3 100644
--- a/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.cpp
@@ -201,8 +201,12 @@
 
     // The actual rendering has been suspended. Notify the context.
     if (context()->getExecutionContext()) {
-        context()->getExecutionContext()->postTask(BLINK_FROM_HERE,
-            createCrossThreadTask(&OfflineAudioDestinationHandler::notifySuspend, this));
+        context()->getExecutionContext()->postTask(
+            BLINK_FROM_HERE,
+            createCrossThreadTask(
+                &OfflineAudioDestinationHandler::notifySuspend,
+                this,
+                context()->currentSampleFrame()));
     }
 }
 
@@ -217,10 +221,12 @@
     }
 }
 
-void OfflineAudioDestinationHandler::notifySuspend()
+void OfflineAudioDestinationHandler::notifySuspend(size_t frame)
 {
+    ASSERT(isMainThread());
+
     if (context())
-        context()->resolveSuspendOnMainThread(context()->currentSampleFrame());
+        context()->resolveSuspendOnMainThread(frame);
 }
 
 void OfflineAudioDestinationHandler::notifyComplete()
diff --git a/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.h b/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.h
index b900a92..47f23e3 100644
--- a/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.h
+++ b/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.h
@@ -81,7 +81,7 @@
     void finishOfflineRendering();
 
     // Suspend/completion callbacks for the main thread.
-    void notifySuspend();
+    void notifySuspend(size_t);
     void notifyComplete();
 
     // The offline version of render() method. If the rendering needs to be
diff --git a/third_party/WebKit/Source/modules/webaudio/OscillatorNode.cpp b/third_party/WebKit/Source/modules/webaudio/OscillatorNode.cpp
index 07b2a65..8636b518 100644
--- a/third_party/WebKit/Source/modules/webaudio/OscillatorNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/OscillatorNode.cpp
@@ -333,9 +333,9 @@
 OscillatorNode::OscillatorNode(AbstractAudioContext& context, float sampleRate)
     : AudioScheduledSourceNode(context)
     // Use musical pitch standard A440 as a default.
-    , m_frequency(AudioParam::create(context, 440))
+    , m_frequency(AudioParam::create(context, ParamTypeOscillatorFrequency, 440))
     // Default to no detuning.
-    , m_detune(AudioParam::create(context, 0))
+    , m_detune(AudioParam::create(context, ParamTypeOscillatorDetune, 0))
 {
     setHandler(OscillatorHandler::create(*this, sampleRate, m_frequency->handler(), m_detune->handler()));
 }
diff --git a/third_party/WebKit/Source/modules/webaudio/StereoPannerNode.cpp b/third_party/WebKit/Source/modules/webaudio/StereoPannerNode.cpp
index 0692d9f..de4c8ce 100644
--- a/third_party/WebKit/Source/modules/webaudio/StereoPannerNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/StereoPannerNode.cpp
@@ -136,7 +136,7 @@
 
 StereoPannerNode::StereoPannerNode(AbstractAudioContext& context, float sampleRate)
     : AudioNode(context)
-    , m_pan(AudioParam::create(context, 0))
+    , m_pan(AudioParam::create(context, ParamTypeStereoPannerPan, 0))
 {
     setHandler(StereoPannerHandler::create(*this, sampleRate, m_pan->handler()));
 }
diff --git a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
index 1cb6bc8..d72fab0 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
@@ -779,7 +779,8 @@
         return false;
     }
 
-    if (m_supportedInternalFormatsStorage.find(internalformat) == m_supportedInternalFormatsStorage.end()) {
+    if (m_supportedInternalFormatsStorage.find(internalformat) == m_supportedInternalFormatsStorage.end()
+        && (functionType == TexStorageType2D && !m_compressedTextureFormats.contains(internalformat))) {
         synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid internalformat");
         return false;
     }
diff --git a/third_party/WebKit/Source/modules/webusb/NavigatorUSB.idl b/third_party/WebKit/Source/modules/webusb/NavigatorUSB.idl
index 33c10de..5ff4ed6 100644
--- a/third_party/WebKit/Source/modules/webusb/NavigatorUSB.idl
+++ b/third_party/WebKit/Source/modules/webusb/NavigatorUSB.idl
@@ -5,6 +5,7 @@
 // http://wicg.github.io/webusb/#device-enumeration
 
 [
+    RuntimeEnabled=WebUSB,
 ] partial interface Navigator {
-    [OriginTrialEnabled=WebUSB] readonly attribute USB usb;
+    readonly attribute USB usb;
 };
diff --git a/third_party/WebKit/Source/modules/webusb/USB.idl b/third_party/WebKit/Source/modules/webusb/USB.idl
index 341c2d1..ed41259 100644
--- a/third_party/WebKit/Source/modules/webusb/USB.idl
+++ b/third_party/WebKit/Source/modules/webusb/USB.idl
@@ -6,7 +6,7 @@
 
 [
     NoInterfaceObject,
-    OriginTrialEnabled=WebUSB,
+    RuntimeEnabled=WebUSB,
 ] interface USB : EventTarget {
     attribute EventHandler onconnect;
     attribute EventHandler ondisconnect;
diff --git a/third_party/WebKit/Source/modules/webusb/USBAlternateInterface.idl b/third_party/WebKit/Source/modules/webusb/USBAlternateInterface.idl
index 40a046a..c04ffe4 100644
--- a/third_party/WebKit/Source/modules/webusb/USBAlternateInterface.idl
+++ b/third_party/WebKit/Source/modules/webusb/USBAlternateInterface.idl
@@ -7,7 +7,7 @@
 [
     Constructor(USBInterface deviceInterface, octet alternateSetting),
     RaisesException=Constructor,
-    OriginTrialEnabled=WebUSB,
+    RuntimeEnabled=WebUSB,
 ] interface USBAlternateInterface {
     readonly attribute octet alternateSetting;
     readonly attribute octet interfaceClass;
diff --git a/third_party/WebKit/Source/modules/webusb/USBConfiguration.idl b/third_party/WebKit/Source/modules/webusb/USBConfiguration.idl
index 0874a41e..360181c 100644
--- a/third_party/WebKit/Source/modules/webusb/USBConfiguration.idl
+++ b/third_party/WebKit/Source/modules/webusb/USBConfiguration.idl
@@ -7,7 +7,7 @@
 [
     Constructor(USBDevice device, octet configurationValue),
     RaisesException=Constructor,
-    OriginTrialEnabled=WebUSB,
+    RuntimeEnabled=WebUSB,
 ] interface USBConfiguration {
     readonly attribute octet configurationValue;
     readonly attribute DOMString? configurationName;
diff --git a/third_party/WebKit/Source/modules/webusb/USBConnectionEvent.idl b/third_party/WebKit/Source/modules/webusb/USBConnectionEvent.idl
index be53425..beaba0e 100644
--- a/third_party/WebKit/Source/modules/webusb/USBConnectionEvent.idl
+++ b/third_party/WebKit/Source/modules/webusb/USBConnectionEvent.idl
@@ -6,7 +6,7 @@
 
 [
     Constructor(DOMString type, optional USBConnectionEventInit eventInitDict),
-    OriginTrialEnabled=WebUSB,
+    RuntimeEnabled=WebUSB,
 ] interface USBConnectionEvent : Event {
     readonly attribute USBDevice device;
 };
diff --git a/third_party/WebKit/Source/modules/webusb/USBDevice.idl b/third_party/WebKit/Source/modules/webusb/USBDevice.idl
index e4602e5..1c9d7616 100644
--- a/third_party/WebKit/Source/modules/webusb/USBDevice.idl
+++ b/third_party/WebKit/Source/modules/webusb/USBDevice.idl
@@ -13,7 +13,7 @@
 // http://wicg.github.io/webusb/#device-usage
 
 [
-    OriginTrialEnabled=WebUSB,
+    RuntimeEnabled=WebUSB,
 ] interface USBDevice {
     readonly attribute DOMString guid;
     readonly attribute octet usbVersionMajor;
diff --git a/third_party/WebKit/Source/modules/webusb/USBEndpoint.idl b/third_party/WebKit/Source/modules/webusb/USBEndpoint.idl
index fdfa3fe..47843da 100644
--- a/third_party/WebKit/Source/modules/webusb/USBEndpoint.idl
+++ b/third_party/WebKit/Source/modules/webusb/USBEndpoint.idl
@@ -18,7 +18,7 @@
 [
     Constructor(USBAlternateInterface alternate, octet endpointNumber, USBDirection direction),
     RaisesException=Constructor,
-    OriginTrialEnabled=WebUSB,
+    RuntimeEnabled=WebUSB,
 ] interface USBEndpoint {
     readonly attribute octet endpointNumber;
     readonly attribute USBDirection direction;
diff --git a/third_party/WebKit/Source/modules/webusb/USBInTransferResult.idl b/third_party/WebKit/Source/modules/webusb/USBInTransferResult.idl
index cd6cf72..0427f1e 100644
--- a/third_party/WebKit/Source/modules/webusb/USBInTransferResult.idl
+++ b/third_party/WebKit/Source/modules/webusb/USBInTransferResult.idl
@@ -5,7 +5,7 @@
 // http://wicg.github.io/webusb/#idl-def-usbintransferresult
 
 [
-    OriginTrialEnabled=WebUSB,
+    RuntimeEnabled=WebUSB,
 ] interface USBInTransferResult {
     readonly attribute DataView data;
     readonly attribute USBTransferStatus status;
diff --git a/third_party/WebKit/Source/modules/webusb/USBInterface.idl b/third_party/WebKit/Source/modules/webusb/USBInterface.idl
index 06dfe70..7e74005 100644
--- a/third_party/WebKit/Source/modules/webusb/USBInterface.idl
+++ b/third_party/WebKit/Source/modules/webusb/USBInterface.idl
@@ -7,7 +7,7 @@
 [
     Constructor(USBConfiguration configuration, octet interfaceNumber),
     RaisesException=Constructor,
-    OriginTrialEnabled=WebUSB,
+    RuntimeEnabled=WebUSB,
 ] interface USBInterface {
     readonly attribute octet interfaceNumber;
     readonly attribute USBAlternateInterface? alternate;
diff --git a/third_party/WebKit/Source/modules/webusb/USBIsochronousInTransferPacket.idl b/third_party/WebKit/Source/modules/webusb/USBIsochronousInTransferPacket.idl
index 0aeb1ca..7521185 100644
--- a/third_party/WebKit/Source/modules/webusb/USBIsochronousInTransferPacket.idl
+++ b/third_party/WebKit/Source/modules/webusb/USBIsochronousInTransferPacket.idl
@@ -5,7 +5,7 @@
 // https://wicg.github.io/webusb/#idl-def-usbisochronousintransferpacket
 
 [
-    OriginTrialEnabled=WebUSB,
+    RuntimeEnabled=WebUSB,
 ] interface USBIsochronousInTransferPacket {
     readonly attribute USBTransferStatus status;
     readonly attribute DataView data;
diff --git a/third_party/WebKit/Source/modules/webusb/USBIsochronousInTransferResult.idl b/third_party/WebKit/Source/modules/webusb/USBIsochronousInTransferResult.idl
index b18898c..1846705 100644
--- a/third_party/WebKit/Source/modules/webusb/USBIsochronousInTransferResult.idl
+++ b/third_party/WebKit/Source/modules/webusb/USBIsochronousInTransferResult.idl
@@ -5,7 +5,7 @@
 // https://wicg.github.io/webusb/#idl-def-usbisochronousintransferresult
 
 [
-    OriginTrialEnabled=WebUSB,
+    RuntimeEnabled=WebUSB,
 ] interface USBIsochronousInTransferResult {
     readonly attribute DataView data;
     readonly attribute sequence<USBIsochronousInTransferPacket> packets;
diff --git a/third_party/WebKit/Source/modules/webusb/USBIsochronousOutTransferPacket.idl b/third_party/WebKit/Source/modules/webusb/USBIsochronousOutTransferPacket.idl
index fc35e9d..6d2a10e 100644
--- a/third_party/WebKit/Source/modules/webusb/USBIsochronousOutTransferPacket.idl
+++ b/third_party/WebKit/Source/modules/webusb/USBIsochronousOutTransferPacket.idl
@@ -5,7 +5,7 @@
 // https://wicg.github.io/webusb/#idl-def-usbisochronousouttransferpacket
 
 [
-    OriginTrialEnabled=WebUSB,
+    RuntimeEnabled=WebUSB,
 ] interface USBIsochronousOutTransferPacket {
     readonly attribute USBTransferStatus status;
     readonly attribute unsigned long bytesWritten;
diff --git a/third_party/WebKit/Source/modules/webusb/USBIsochronousOutTransferResult.idl b/third_party/WebKit/Source/modules/webusb/USBIsochronousOutTransferResult.idl
index 8021204..1dc2bf6 100644
--- a/third_party/WebKit/Source/modules/webusb/USBIsochronousOutTransferResult.idl
+++ b/third_party/WebKit/Source/modules/webusb/USBIsochronousOutTransferResult.idl
@@ -5,7 +5,7 @@
 // https://wicg.github.io/webusb/#idl-def-usbisochronousouttransferresult
 
 [
-    OriginTrialEnabled=WebUSB,
+    RuntimeEnabled=WebUSB,
 ] interface USBIsochronousOutTransferResult {
     readonly attribute sequence<USBIsochronousOutTransferPacket> packets;
 };
diff --git a/third_party/WebKit/Source/modules/webusb/USBOutTransferResult.idl b/third_party/WebKit/Source/modules/webusb/USBOutTransferResult.idl
index 86b58312..ba75f82 100644
--- a/third_party/WebKit/Source/modules/webusb/USBOutTransferResult.idl
+++ b/third_party/WebKit/Source/modules/webusb/USBOutTransferResult.idl
@@ -5,7 +5,7 @@
 // http://wicg.github.io/webusb/#idl-def-usbouttransferresult
 
 [
-    OriginTrialEnabled=WebUSB,
+    RuntimeEnabled=WebUSB,
 ] interface USBOutTransferResult {
     readonly attribute unsigned long bytesWritten;
     readonly attribute USBTransferStatus status;
diff --git a/third_party/WebKit/Source/platform/BUILD.gn b/third_party/WebKit/Source/platform/BUILD.gn
index be644415..1876150 100644
--- a/third_party/WebKit/Source/platform/BUILD.gn
+++ b/third_party/WebKit/Source/platform/BUILD.gn
@@ -410,6 +410,7 @@
     sources += [
       "exported/linux/WebFontRenderStyle.cpp",
       "fonts/linux/FontPlatformDataLinux.cpp",
+      "fonts/linux/FontRenderStyle.h",
     ]
     set_sources_assignment_filter(sources_assignment_filter)
   } else {
diff --git a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
index 403d782..e233f0cdc 100644
--- a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
+++ b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
@@ -74,6 +74,7 @@
 DisplayList2dCanvas status=stable
 DocumentWriteEvaluator
 DurableStorage status=experimental
+DOMConvenienceAPI status=experimental
 ForceDisplayList2dCanvas
 // See crbug.com/585250.
 ForceDisable2dCanvasCopyOnWrite
@@ -101,7 +102,7 @@
 GetUserMedia depends_on=MediaDevices, status=experimental
 GlobalCacheStorage status=stable
 HiResEventTimeStamp status=stable
-ImageCapture status=test
+ImageCapture status=experimental
 ImageColorProfiles
 ImageOrientation status=test
 ImageRenderingPixelated status=stable
@@ -221,7 +222,7 @@
 WebBluetooth
 WebGLDraftExtensions status=experimental
 WebGLImageChromium
-WebUSB status=experimental, origin_trial_feature_name=WebUSB
+WebUSB status=experimental
 WebVR depends_on=GeometryInterfaces, status=test
 WebVTTRegions status=experimental
 V8IdleTasks
diff --git a/third_party/WebKit/Source/platform/blink_platform.gypi b/third_party/WebKit/Source/platform/blink_platform.gypi
index 2624327..701586a 100644
--- a/third_party/WebKit/Source/platform/blink_platform.gypi
+++ b/third_party/WebKit/Source/platform/blink_platform.gypi
@@ -419,7 +419,6 @@
       'fonts/FontFeatureSettings.h',
       'fonts/FontPlatformData.cpp',
       'fonts/FontPlatformData.h',
-      'fonts/FontRenderStyle.h',
       'fonts/GenericFontFamilySettings.cpp',
       'fonts/GenericFontFamilySettings.h',
       'fonts/GlyphBuffer.h',
@@ -450,6 +449,7 @@
       'fonts/android/FontCacheAndroid.cpp',
       'fonts/linux/FontCacheLinux.cpp',
       'fonts/linux/FontPlatformDataLinux.cpp',
+      'fonts/linux/FontRenderStyle.h',
       'fonts/mac/FontFamilyMatcherMac.h',
       'fonts/mac/FontFamilyMatcherMac.mm',
       'fonts/mac/FontCacheMac.mm',
diff --git a/third_party/WebKit/Source/platform/exported/WebFontDescription.cpp b/third_party/WebKit/Source/platform/exported/WebFontDescription.cpp
index 1ba694c..348ad320 100644
--- a/third_party/WebKit/Source/platform/exported/WebFontDescription.cpp
+++ b/third_party/WebKit/Source/platform/exported/WebFontDescription.cpp
@@ -40,7 +40,7 @@
     genericFamily = static_cast<GenericFamily>(desc.genericFamily());
     size = desc.specifiedSize();
     italic = desc.style() == FontStyleItalic;
-    smallCaps = desc.variant() == FontVariantSmallCaps;
+    smallCaps = desc.variantCaps() == FontDescription::SmallCaps;
     weight = static_cast<Weight>(desc.weight());
     smoothing = static_cast<Smoothing>(desc.fontSmoothing());
     letterSpacing = desc.letterSpacing();
@@ -58,7 +58,7 @@
     desc.setSpecifiedSize(size);
     desc.setComputedSize(size);
     desc.setStyle(italic ? FontStyleItalic : FontStyleNormal);
-    desc.setVariant(smallCaps ? FontVariantSmallCaps : FontVariantNormal);
+    desc.setVariantCaps(smallCaps ? FontDescription::SmallCaps : FontDescription::CapsNormal);
     desc.setWeight(static_cast<FontWeight>(weight));
     desc.setFontSmoothing(static_cast<FontSmoothingMode>(smoothing));
     desc.setLetterSpacing(letterSpacing);
diff --git a/third_party/WebKit/Source/platform/exported/linux/WebFontRenderStyle.cpp b/third_party/WebKit/Source/platform/exported/linux/WebFontRenderStyle.cpp
index 60a41b3..a359690 100644
--- a/third_party/WebKit/Source/platform/exported/linux/WebFontRenderStyle.cpp
+++ b/third_party/WebKit/Source/platform/exported/linux/WebFontRenderStyle.cpp
@@ -30,7 +30,7 @@
 
 #include "public/platform/linux/WebFontRenderStyle.h"
 
-#include "platform/fonts/FontRenderStyle.h"
+#include "platform/fonts/linux/FontRenderStyle.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/platform/fonts/Font.cpp b/third_party/WebKit/Source/platform/fonts/Font.cpp
index 094bfeb..82c94d40 100644
--- a/third_party/WebKit/Source/platform/fonts/Font.cpp
+++ b/third_party/WebKit/Source/platform/fonts/Font.cpp
@@ -409,14 +409,10 @@
 
 CodePath Font::codePath(const TextRunPaintInfo& runInfo) const
 {
-// TODO(eae): Disable the always use complex text feature on Android for now as
-// it caused a memory regression for webview. crbug.com/577306
-#if !OS(ANDROID)
     if (RuntimeEnabledFeatures::alwaysUseComplexTextEnabled()
         || LayoutTestSupport::alwaysUseComplexTextForTest()) {
         return ComplexPath;
     }
-#endif
 
     const TextRun& run = runInfo.run;
 
@@ -524,7 +520,7 @@
     ASSERT(isMainThread());
 
     if (variant == AutoVariant) {
-        if (m_fontDescription.variant() == FontVariantSmallCaps) {
+        if (m_fontDescription.variantCaps() == FontDescription::SmallCaps) {
             bool includeDefault = false;
             UChar32 upperC = toUpper(c, m_fontDescription.locale(includeDefault));
             if (upperC != c) {
diff --git a/third_party/WebKit/Source/platform/fonts/FontDescription.cpp b/third_party/WebKit/Source/platform/fonts/FontDescription.cpp
index 4ffcf1fb1..2d164d9 100644
--- a/third_party/WebKit/Source/platform/fonts/FontDescription.cpp
+++ b/third_party/WebKit/Source/platform/fonts/FontDescription.cpp
@@ -107,7 +107,7 @@
 
 FontTraits FontDescription::traits() const
 {
-    return FontTraits(style(), variant(), weight(), stretch());
+    return FontTraits(style(), weight(), stretch());
 }
 
 FontDescription::VariantLigatures FontDescription::getVariantLigatures() const
@@ -140,7 +140,6 @@
 void FontDescription::setTraits(FontTraits traits)
 {
     setStyle(traits.style());
-    setVariant(traits.variant());
     setWeight(traits.weight());
     setStretch(traits.stretch());
 }
diff --git a/third_party/WebKit/Source/platform/fonts/FontDescription.h b/third_party/WebKit/Source/platform/fonts/FontDescription.h
index 4e326e63..bc1c2f7 100644
--- a/third_party/WebKit/Source/platform/fonts/FontDescription.h
+++ b/third_party/WebKit/Source/platform/fonts/FontDescription.h
@@ -73,7 +73,6 @@
         m_fields.m_orientation = static_cast<unsigned>(FontOrientation::Horizontal);
         m_fields.m_widthVariant = RegularWidth;
         m_fields.m_style = FontStyleNormal;
-        m_fields.m_variant = FontVariantNormal;
         m_fields.m_variantCaps = CapsNormal;
         m_fields.m_isAbsoluteSize = false;
         m_fields.m_weight = FontWeightNormal;
@@ -149,7 +148,6 @@
     bool hasSizeAdjust() const { return m_sizeAdjust != FontSizeAdjustNone; }
     FontStyle style() const { return static_cast<FontStyle>(m_fields.m_style); }
     int computedPixelSize() const { return int(m_computedSize + 0.5f); }
-    FontVariant variant() const { return static_cast<FontVariant>(m_fields.m_variant); }
     FontVariantCaps variantCaps() const { return static_cast<FontVariantCaps>(m_fields.m_variantCaps); }
     bool isAbsoluteSize() const { return m_fields.m_isAbsoluteSize; }
     FontWeight weight() const { return static_cast<FontWeight>(m_fields.m_weight); }
@@ -200,7 +198,6 @@
     void setAdjustedSize(float s) { m_adjustedSize = clampTo<float>(s); }
     void setSizeAdjust(float aspect) { m_sizeAdjust = clampTo<float>(aspect); }
     void setStyle(FontStyle i) { m_fields.m_style = i; }
-    void setVariant(FontVariant c) { m_fields.m_variant = c; }
     void setVariantCaps(FontVariantCaps variantCaps) { m_fields.m_variantCaps = variantCaps; }
     void setVariantLigatures(const VariantLigatures&);
     void setIsAbsoluteSize(bool s) { m_fields.m_isAbsoluteSize = s; }
@@ -268,7 +265,6 @@
         unsigned m_widthVariant : 2; // FontWidthVariant
 
         unsigned m_style : 2; // FontStyle
-        unsigned m_variant : 1; // FontVariant
         unsigned m_variantCaps : 3; // FontVariantCaps
         unsigned m_isAbsoluteSize : 1; // Whether or not CSS specified an explicit size
         // (logical sizes like "medium" don't count).
diff --git a/third_party/WebKit/Source/platform/fonts/FontDescriptionTest.cpp b/third_party/WebKit/Source/platform/fonts/FontDescriptionTest.cpp
index a54d3f5ea..00e4b6c 100644
--- a/third_party/WebKit/Source/platform/fonts/FontDescriptionTest.cpp
+++ b/third_party/WebKit/Source/platform/fonts/FontDescriptionTest.cpp
@@ -36,7 +36,6 @@
     FontDescription target;
     target.setTraits(FontTraits(bitfield));
     EXPECT_EQ(source.style(), target.style());
-    EXPECT_EQ(source.variant(), target.variant());
     EXPECT_EQ(source.weight(), target.weight());
     EXPECT_EQ(source.stretch(), target.stretch());
 }
@@ -45,73 +44,61 @@
 {
     FontDescription source;
     source.setStyle(FontStyleNormal);
-    source.setVariant(FontVariantNormal);
     source.setWeight(FontWeightNormal);
     source.setStretch(FontStretchNormal);
     assertDescriptionMatchesMask(source, source.traits().bitfield());
 
     source.setStyle(FontStyleNormal);
-    source.setVariant(FontVariantNormal);
     source.setWeight(FontWeightNormal);
     source.setStretch(FontStretchExtraCondensed);
     assertDescriptionMatchesMask(source, source.traits().bitfield());
 
     source.setStyle(FontStyleItalic);
-    source.setVariant(FontVariantNormal);
     source.setWeight(FontWeight900);
     source.setStretch(FontStretchUltraExpanded);
     assertDescriptionMatchesMask(source, source.traits().bitfield());
 
     source.setStyle(FontStyleItalic);
-    source.setVariant(FontVariantSmallCaps);
     source.setWeight(FontWeight100);
     source.setStretch(FontStretchExtraExpanded);
     assertDescriptionMatchesMask(source, source.traits().bitfield());
 
     source.setStyle(FontStyleItalic);
-    source.setVariant(FontVariantNormal);
     source.setWeight(FontWeight900);
     source.setStretch(FontStretchNormal);
     assertDescriptionMatchesMask(source, source.traits().bitfield());
 
     source.setStyle(FontStyleItalic);
-    source.setVariant(FontVariantNormal);
     source.setWeight(FontWeight800);
     source.setStretch(FontStretchNormal);
     assertDescriptionMatchesMask(source, source.traits().bitfield());
 
     source.setStyle(FontStyleItalic);
-    source.setVariant(FontVariantNormal);
     source.setWeight(FontWeight700);
     source.setStretch(FontStretchNormal);
     assertDescriptionMatchesMask(source, source.traits().bitfield());
 
     source.setStyle(FontStyleItalic);
-    source.setVariant(FontVariantNormal);
     source.setWeight(FontWeight600);
     source.setStretch(FontStretchNormal);
     assertDescriptionMatchesMask(source, source.traits().bitfield());
 
     source.setStyle(FontStyleItalic);
-    source.setVariant(FontVariantNormal);
     source.setWeight(FontWeight500);
     source.setStretch(FontStretchNormal);
     assertDescriptionMatchesMask(source, source.traits().bitfield());
 
     source.setStyle(FontStyleItalic);
-    source.setVariant(FontVariantNormal);
     source.setWeight(FontWeight400);
     source.setStretch(FontStretchNormal);
     assertDescriptionMatchesMask(source, source.traits().bitfield());
 
     source.setStyle(FontStyleItalic);
-    source.setVariant(FontVariantNormal);
     source.setWeight(FontWeight300);
     source.setStretch(FontStretchUltraExpanded);
     assertDescriptionMatchesMask(source, source.traits().bitfield());
 
     source.setStyle(FontStyleItalic);
-    source.setVariant(FontVariantNormal);
     source.setWeight(FontWeight200);
     source.setStretch(FontStretchNormal);
     assertDescriptionMatchesMask(source, source.traits().bitfield());
@@ -146,10 +133,6 @@
         FontStyleOblique,
         FontStyleItalic
     };
-    FontVariant variants[] = {
-        FontVariantNormal,
-        FontVariantSmallCaps
-    };
 
     FontDescription source;
     WTF::Vector<unsigned> hashes;
@@ -159,12 +142,9 @@
             source.setStretch(stretches[j]);
             for (size_t k = 0; k < WTF_ARRAY_LENGTH(styles); k++) {
                 source.setStyle(styles[k]);
-                for (size_t m = 0; m < WTF_ARRAY_LENGTH(variants); m++) {
-                    source.setVariant(variants[m]);
-                    unsigned hash = source.styleHashWithoutFamilyList();
-                    ASSERT_FALSE(hashes.contains(hash));
-                    hashes.append(hash);
-                }
+                unsigned hash = source.styleHashWithoutFamilyList();
+                ASSERT_FALSE(hashes.contains(hash));
+                hashes.append(hash);
             }
         }
     }
diff --git a/third_party/WebKit/Source/platform/fonts/FontPlatformData.cpp b/third_party/WebKit/Source/platform/fonts/FontPlatformData.cpp
index 209c675..04b7fe6 100644
--- a/third_party/WebKit/Source/platform/fonts/FontPlatformData.cpp
+++ b/third_party/WebKit/Source/platform/fonts/FontPlatformData.cpp
@@ -41,16 +41,10 @@
 
 FontPlatformData::FontPlatformData(WTF::HashTableDeletedValueType)
     : m_typeface(nullptr)
-#if !OS(WIN)
-    , m_family(CString())
-#endif
     , m_textSize(0)
     , m_syntheticBold(false)
     , m_syntheticItalic(false)
     , m_orientation(FontOrientation::Horizontal)
-#if !OS(MACOSX)
-    , m_style(FontRenderStyle())
-#endif
     , m_isHashTableDeletedValue(true)
 #if OS(WIN)
     , m_paintTextFlags(0)
@@ -62,16 +56,10 @@
 
 FontPlatformData::FontPlatformData()
     : m_typeface(nullptr)
-#if !OS(WIN)
-    , m_family(CString())
-#endif
     , m_textSize(0)
     , m_syntheticBold(false)
     , m_syntheticItalic(false)
     , m_orientation(FontOrientation::Horizontal)
-#if !OS(MACOSX)
-    , m_style(FontRenderStyle())
-#endif
     , m_isHashTableDeletedValue(false)
 #if OS(WIN)
     , m_paintTextFlags(0)
@@ -83,16 +71,10 @@
 
 FontPlatformData::FontPlatformData(float size, bool syntheticBold, bool syntheticItalic, FontOrientation orientation)
     : m_typeface(nullptr)
-#if !OS(WIN)
-    , m_family(CString())
-#endif
     , m_textSize(size)
     , m_syntheticBold(syntheticBold)
     , m_syntheticItalic(syntheticItalic)
     , m_orientation(orientation)
-#if !OS(MACOSX)
-    , m_style(FontRenderStyle())
-#endif
     , m_isHashTableDeletedValue(false)
 #if OS(WIN)
     , m_paintTextFlags(0)
@@ -111,7 +93,7 @@
     , m_syntheticBold(source.m_syntheticBold)
     , m_syntheticItalic(source.m_syntheticItalic)
     , m_orientation(source.m_orientation)
-#if !OS(MACOSX)
+#if OS(LINUX) || OS(ANDROID)
     , m_style(source.m_style)
 #endif
     , m_harfBuzzFace(nullptr)
@@ -133,7 +115,7 @@
     , m_syntheticBold(src.m_syntheticBold)
     , m_syntheticItalic(src.m_syntheticItalic)
     , m_orientation(src.m_orientation)
-#if !OS(MACOSX)
+#if OS(LINUX) || OS(ANDROID)
     , m_style(src.m_style)
 #endif
     , m_harfBuzzFace(nullptr)
@@ -203,7 +185,7 @@
     m_syntheticItalic = other.m_syntheticItalic;
     m_harfBuzzFace = nullptr;
     m_orientation = other.m_orientation;
-#if !OS(MACOSX)
+#if OS(LINUX) || OS(ANDROID)
     m_style = other.m_style;
 #endif
 
@@ -231,7 +213,7 @@
         && m_isHashTableDeletedValue == a.m_isHashTableDeletedValue
         && m_syntheticBold == a.m_syntheticBold
         && m_syntheticItalic == a.m_syntheticItalic
-#if !OS(MACOSX)
+#if OS(LINUX) || OS(ANDROID)
         && m_style == a.m_style
 #endif
         && m_orientation == a.m_orientation;
@@ -281,20 +263,20 @@
 bool FontPlatformData::hasSpaceInLigaturesOrKerning(
     TypesettingFeatures features) const
 {
-    const HarfBuzzFace* hbFace = harfBuzzFace();
+    HarfBuzzFace* hbFace = harfBuzzFace();
     if (!hbFace)
         return false;
 
     hb_face_t* face = hbFace->face();
     ASSERT(face);
-    OwnPtr<hb_font_t> font = adoptPtr(hbFace->createFont());
+    hb_font_t* font = hbFace->getScaledFont();
     ASSERT(font);
 
     hb_codepoint_t space;
     // If the space glyph isn't present in the font then each space character
     // will be rendering using a fallback font, which grantees that it cannot
     // affect the shape of the preceding word.
-    if (!hb_font_get_glyph(font.get(), spaceCharacter, 0, &space))
+    if (!hb_font_get_glyph(font, spaceCharacter, 0, &space))
         return false;
 
     if (!hb_ot_layout_has_substitution(face)
diff --git a/third_party/WebKit/Source/platform/fonts/FontPlatformData.h b/third_party/WebKit/Source/platform/fonts/FontPlatformData.h
index 4e85939..cc065750 100644
--- a/third_party/WebKit/Source/platform/fonts/FontPlatformData.h
+++ b/third_party/WebKit/Source/platform/fonts/FontPlatformData.h
@@ -37,7 +37,6 @@
 #include "platform/SharedBuffer.h"
 #include "platform/fonts/FontDescription.h"
 #include "platform/fonts/FontOrientation.h"
-#include "platform/fonts/FontRenderStyle.h"
 #include "platform/fonts/SmallCapsIterator.h"
 #include "platform/fonts/opentype/OpenTypeVerticalData.h"
 #include "wtf/Allocator.h"
@@ -47,6 +46,10 @@
 #include "wtf/text/CString.h"
 #include "wtf/text/StringImpl.h"
 
+#if OS(LINUX) || OS(ANDROID)
+#include "platform/fonts/linux/FontRenderStyle.h"
+#endif // OS(LINUX) || OS(ANDROID)
+
 #if OS(MACOSX)
 OBJC_CLASS NSFont;
 
@@ -117,18 +120,13 @@
     unsigned minSizeForAntiAlias() const { return m_minSizeForAntiAlias; }
     void setMinSizeForSubpixel(float size) { m_minSizeForSubpixel = size; }
     float minSizeForSubpixel() const { return m_minSizeForSubpixel; }
-    void setHinting(SkPaint::Hinting style)
-    {
-        m_style.useAutoHint = 0;
-        m_style.hintStyle = style;
-    }
 #endif
     bool fontContainsCharacter(UChar32 character);
 
     PassRefPtr<OpenTypeVerticalData> verticalData() const;
     PassRefPtr<SharedBuffer> openTypeTable(SkFontTableTag) const;
 
-#if !OS(MACOSX)
+#if OS(LINUX) || OS(ANDROID)
     // The returned styles are all actual styles without FontRenderStyle::NoPreference.
     const FontRenderStyle& getFontRenderStyle() const { return m_style; }
 #endif
@@ -160,7 +158,7 @@
     bool m_syntheticItalic;
     FontOrientation m_orientation;
 private:
-#if !OS(MACOSX)
+#if OS(LINUX) || OS(ANDROID)
     FontRenderStyle m_style;
 #endif
 
diff --git a/third_party/WebKit/Source/platform/fonts/FontTraits.h b/third_party/WebKit/Source/platform/fonts/FontTraits.h
index fb2c16f..cab91fdf 100644
--- a/third_party/WebKit/Source/platform/fonts/FontTraits.h
+++ b/third_party/WebKit/Source/platform/fonts/FontTraits.h
@@ -72,38 +72,25 @@
     FontStyleItalic = 2
 };
 
-// TODO(drott): crbug.com/516673 Move this from here to FontDescription,
-// what's the spec equivalent of FontTraits?
-// Variant is not used for font matching and should probably
-// not be part of FontTraits.
-enum FontVariant {
-    FontVariantNormal = 0,
-    FontVariantSmallCaps = 1
-};
-
 typedef unsigned FontTraitsBitfield;
 
 struct FontTraits {
     DISALLOW_NEW();
-    FontTraits(FontStyle style, FontVariant variant, FontWeight weight, FontStretch stretch)
+    FontTraits(FontStyle style, FontWeight weight, FontStretch stretch)
     {
         m_traits.m_style = style;
-        // TODO(drott): crbug.com/516673 Variant is not relevant for font selection,
-        // should be removed here.
-        m_traits.m_variant = variant;
         m_traits.m_weight = weight;
         m_traits.m_stretch = stretch;
         m_traits.m_filler = 0;
-        ASSERT(!(m_bitfield >> 11));
+        DCHECK_EQ(m_bitfield >> 10, 0u);
     }
     FontTraits(FontTraitsBitfield bitfield)
         : m_bitfield(bitfield)
     {
-        ASSERT(!m_traits.m_filler);
-        ASSERT(!(m_bitfield >> 11));
+        DCHECK_EQ(m_traits.m_filler, 0u);
+        DCHECK_EQ(m_bitfield >> 10, 0u);
     }
     FontStyle style() const { return static_cast<FontStyle>(m_traits.m_style); }
-    FontVariant variant() const { return static_cast<FontVariant>(m_traits.m_variant); }
     FontWeight weight() const { return static_cast<FontWeight>(m_traits.m_weight); }
     FontStretch stretch() const { return static_cast<FontStretch>(m_traits.m_stretch); }
     FontTraitsBitfield bitfield() const { return m_bitfield; }
@@ -111,10 +98,9 @@
     union {
         struct {
             unsigned m_style : 2;
-            unsigned m_variant : 1;
             unsigned m_weight : 4;
             unsigned m_stretch : 4;
-            unsigned m_filler : 21;
+            unsigned m_filler : 22;
         } m_traits;
         FontTraitsBitfield m_bitfield;
     };
diff --git a/third_party/WebKit/Source/platform/fonts/FontRenderStyle.h b/third_party/WebKit/Source/platform/fonts/linux/FontRenderStyle.h
similarity index 100%
rename from third_party/WebKit/Source/platform/fonts/FontRenderStyle.h
rename to third_party/WebKit/Source/platform/fonts/linux/FontRenderStyle.h
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShapeIterator.h b/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShapeIterator.h
index 6418ecf..be4690a 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShapeIterator.h
+++ b/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShapeIterator.h
@@ -55,7 +55,7 @@
         m_shapeByWord = m_font->canShapeWordByWord();
     }
 
-    bool next(RefPtr<ShapeResult>* wordResult)
+    bool next(RefPtr<const ShapeResult>* wordResult)
     {
         if (UNLIKELY(m_textRun.allowTabs()))
             return nextForAllowTabs(wordResult);
@@ -72,14 +72,16 @@
     }
 
 private:
-    PassRefPtr<ShapeResult> shapeWordWithoutSpacing(const TextRun& wordRun, const Font* font)
+    PassRefPtr<const ShapeResult> shapeWordWithoutSpacing(
+        const TextRun& wordRun, const Font* font)
     {
-        ShapeCacheEntry* cacheEntry = m_shapeCache->add(wordRun, ShapeCacheEntry());
+        ShapeCacheEntry* cacheEntry = m_shapeCache->add(wordRun,
+            ShapeCacheEntry());
         if (cacheEntry && cacheEntry->m_shapeResult)
             return cacheEntry->m_shapeResult;
 
         HarfBuzzShaper shaper(font, wordRun);
-        RefPtr<ShapeResult> shapeResult = shaper.shapeResult();
+        RefPtr<const ShapeResult> shapeResult = shaper.shapeResult();
         if (!shapeResult)
             return nullptr;
 
@@ -89,16 +91,17 @@
         return shapeResult.release();
     }
 
-    PassRefPtr<ShapeResult> shapeWord(const TextRun& wordRun, const Font* font)
+    PassRefPtr<const ShapeResult> shapeWord(const TextRun& wordRun,
+        const Font* font)
     {
         if (LIKELY(!m_spacing.hasSpacing()))
             return shapeWordWithoutSpacing(wordRun, font);
 
-        RefPtr<ShapeResult> result = shapeWordWithoutSpacing(wordRun, font);
+        RefPtr<const ShapeResult> result = shapeWordWithoutSpacing(wordRun, font);
         return result->applySpacingToCopy(m_spacing, wordRun);
     }
 
-    bool nextWord(RefPtr<ShapeResult>* wordResult)
+    bool nextWord(RefPtr<const ShapeResult>* wordResult)
     {
         return shapeToEndIndex(wordResult, nextWordEndIndex());
     }
@@ -160,7 +163,7 @@
         }
     }
 
-    bool shapeToEndIndex(RefPtr<ShapeResult>* result, unsigned endIndex)
+    bool shapeToEndIndex(RefPtr<const ShapeResult>* result, unsigned endIndex)
     {
         if (!endIndex || endIndex <= m_startIndex)
             return false;
@@ -187,7 +190,7 @@
         }
     }
 
-    bool nextForAllowTabs(RefPtr<ShapeResult>* wordResult)
+    bool nextForAllowTabs(RefPtr<const ShapeResult>* wordResult)
     {
         unsigned length = m_textRun.length();
         if (m_startIndex >= length)
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaper.cpp b/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaper.cpp
index 92f9592a..beef9f1 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaper.cpp
+++ b/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaper.cpp
@@ -40,7 +40,7 @@
     FloatRect* glyphBounds)
 {
     float width = 0;
-    RefPtr<ShapeResult> wordResult;
+    RefPtr<const ShapeResult> wordResult;
     CachingWordShapeIterator iterator(m_shapeCache, run, font);
     while (iterator.next(&wordResult)) {
         if (wordResult) {
@@ -65,7 +65,7 @@
     ShapeResultBuffer* resultsBuffer)
 {
     CachingWordShapeIterator iterator(shapeCache, run, font);
-    RefPtr<ShapeResult> wordResult;
+    RefPtr<const ShapeResult> wordResult;
     float totalWidth = 0;
     while (iterator.next(&wordResult)) {
         if (wordResult) {
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaperTest.cpp b/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaperTest.cpp
index a8623c6..de852dd 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaperTest.cpp
+++ b/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaperTest.cpp
@@ -39,16 +39,17 @@
     hb_script_t script = HB_SCRIPT_INVALID;
 };
 
-static inline ShapeResultTestInfo* testInfo(RefPtr<ShapeResult>& result)
+static inline const ShapeResultTestInfo* testInfo(
+    RefPtr<const ShapeResult>& result)
 {
-    return static_cast<ShapeResultTestInfo*>(result.get());
+    return static_cast<const ShapeResultTestInfo*>(result.get());
 }
 
 TEST_F(CachingWordShaperTest, LatinLeftToRightByWord)
 {
     TextRun textRun(reinterpret_cast<const LChar*>("ABC DEF."), 8);
 
-    RefPtr<ShapeResult> result;
+    RefPtr<const ShapeResult> result;
     CachingWordShapeIterator iterator(cache.get(), textRun, &font);
     ASSERT_TRUE(iterator.next(&result));
     ASSERT_TRUE(testInfo(result)->runInfoForTesting(0, startIndex, numGlyphs, script));
@@ -77,7 +78,7 @@
     TextRun textRun(str, 5);
 
     unsigned offset = 0;
-    RefPtr<ShapeResult> result;
+    RefPtr<const ShapeResult> result;
     CachingWordShapeIterator iterator(cache.get(), textRun, &font);
     ASSERT_TRUE(iterator.next(&result));
     ASSERT_TRUE(testInfo(result)->runInfoForTesting(0, startIndex, numGlyphs, script));
@@ -192,7 +193,7 @@
     };
     TextRun textRun(str, 10);
 
-    RefPtr<ShapeResult> wordResult;
+    RefPtr<const ShapeResult> wordResult;
     CachingWordShapeIterator iterator(cache.get(), textRun, &font);
 
     ASSERT_TRUE(iterator.next(&wordResult));
@@ -230,7 +231,7 @@
     };
     TextRun textRun(str, 7);
 
-    RefPtr<ShapeResult> wordResult;
+    RefPtr<const ShapeResult> wordResult;
     CachingWordShapeIterator iterator(cache.get(), textRun, &font);
 
     ASSERT_TRUE(iterator.next(&wordResult));
@@ -259,7 +260,7 @@
     };
     TextRun textRun(str, 4);
 
-    RefPtr<ShapeResult> wordResult;
+    RefPtr<const ShapeResult> wordResult;
     CachingWordShapeIterator iterator(cache.get(), textRun, &font);
 
     ASSERT_TRUE(iterator.next(&wordResult));
@@ -283,7 +284,7 @@
     };
     TextRun textRun(str, 2);
 
-    RefPtr<ShapeResult> wordResult;
+    RefPtr<const ShapeResult> wordResult;
     CachingWordShapeIterator iterator(cache.get(), textRun, &font);
 
     ASSERT_TRUE(iterator.next(&wordResult));
@@ -318,7 +319,7 @@
     };
     TextRun textRun(str, 22);
 
-    RefPtr<ShapeResult> wordResult;
+    RefPtr<const ShapeResult> wordResult;
     CachingWordShapeIterator iterator(cache.get(), textRun, &font);
 
     ASSERT_TRUE(iterator.next(&wordResult));
@@ -342,7 +343,7 @@
     };
     TextRun textRun(str, 11);
 
-    RefPtr<ShapeResult> wordResult;
+    RefPtr<const ShapeResult> wordResult;
     CachingWordShapeIterator iterator(cache.get(), textRun, &font);
 
     ASSERT_TRUE(iterator.next(&wordResult));
@@ -361,7 +362,7 @@
     };
     TextRun textRun(str, 4);
 
-    RefPtr<ShapeResult> wordResult;
+    RefPtr<const ShapeResult> wordResult;
     CachingWordShapeIterator iterator(cache.get(), textRun, &font);
 
     ASSERT_TRUE(iterator.next(&wordResult));
@@ -393,7 +394,7 @@
     };
     TextRun textRun(str, 23);
 
-    RefPtr<ShapeResult> wordResult;
+    RefPtr<const ShapeResult> wordResult;
     CachingWordShapeIterator iterator(cache.get(), textRun, &font);
 
     ASSERT_TRUE(iterator.next(&wordResult));
@@ -415,7 +416,7 @@
     };
     TextRun textRun(str, 3);
 
-    RefPtr<ShapeResult> wordResult;
+    RefPtr<const ShapeResult> wordResult;
     CachingWordShapeIterator iterator(cache.get(), textRun, &font);
 
     ASSERT_TRUE(iterator.next(&wordResult));
@@ -433,7 +434,7 @@
     };
     TextRun textRun(str, 3);
 
-    RefPtr<ShapeResult> wordResult;
+    RefPtr<const ShapeResult> wordResult;
     CachingWordShapeIterator iterator(cache.get(), textRun, &font);
 
     ASSERT_TRUE(iterator.next(&wordResult));
@@ -454,7 +455,7 @@
     };
     TextRun textRun(str, 2);
 
-    RefPtr<ShapeResult> wordResult;
+    RefPtr<const ShapeResult> wordResult;
     CachingWordShapeIterator iterator(cache.get(), textRun, &font);
 
     ASSERT_TRUE(iterator.next(&wordResult));
@@ -472,7 +473,7 @@
     };
     TextRun textRun(str, 2);
 
-    RefPtr<ShapeResult> wordResult;
+    RefPtr<const ShapeResult> wordResult;
     CachingWordShapeIterator iterator(cache.get(), textRun, &font);
 
     ASSERT_TRUE(iterator.next(&wordResult));
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.cpp b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.cpp
index 402642e..cfec720 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.cpp
+++ b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.cpp
@@ -50,8 +50,6 @@
 
 namespace blink {
 
-const hb_tag_t HarfBuzzFace::vertTag = HB_TAG('v', 'e', 'r', 't');
-
 // Though we have FontCache class, which provides the cache mechanism for
 // WebKit's font objects, we also need additional caching layer for HarfBuzz
 // to reduce the memory consumption because hb_face_t should be associated with
@@ -70,7 +68,6 @@
     }
 
     hb_face_t* face() { return m_face; }
-    HashMap<uint32_t, uint16_t>* glyphCache() { return &m_glyphCache; }
 
 private:
     explicit FaceCacheEntry(hb_face_t* face)
@@ -78,7 +75,6 @@
     { }
 
     hb_face_t* m_face;
-    HashMap<uint32_t, uint16_t> m_glyphCache;
 };
 
 typedef HashMap<uint64_t, RefPtr<FaceCacheEntry>, WTF::IntHash<uint64_t>, WTF::UnsignedWithZeroKeyHashTraits<uint64_t>> HarfBuzzFaceCache;
@@ -98,7 +94,7 @@
         result.storedValue->value = FaceCacheEntry::create(createFace());
     result.storedValue->value->ref();
     m_face = result.storedValue->value->face();
-    m_glyphCacheForFaceCacheEntry = result.storedValue->value->glyphCache();
+    prepareHarfBuzzFontData();
 }
 
 HarfBuzzFace::~HarfBuzzFace()
@@ -111,27 +107,22 @@
         harfBuzzFaceCache()->remove(m_uniqueID);
 }
 
+// struct to carry user-pointer data for hb_font_t callback functions.
 struct HarfBuzzFontData {
     USING_FAST_MALLOC(HarfBuzzFontData);
     WTF_MAKE_NONCOPYABLE(HarfBuzzFontData);
 public:
+
+    HarfBuzzFontData() {}
     HarfBuzzFontData(WTF::HashMap<uint32_t, uint16_t>* glyphCacheForFaceCacheEntry, hb_face_t* face, PassRefPtr<UnicodeRangeSet> rangeSet)
-        : m_glyphCacheForFaceCacheEntry(glyphCacheForFaceCacheEntry)
-        , m_face(face)
+        : m_face(face)
         , m_hbOpenTypeFont(nullptr)
         , m_rangeSet(rangeSet)
     {
     }
 
-    ~HarfBuzzFontData()
-    {
-        if (m_hbOpenTypeFont)
-            hb_font_destroy(m_hbOpenTypeFont);
-    }
-
     SkPaint m_paint;
     RefPtr<SimpleFontData> m_simpleFontData;
-    WTF::HashMap<uint32_t, uint16_t>* m_glyphCacheForFaceCacheEntry;
     hb_face_t* m_face;
     hb_font_t* m_hbOpenTypeFont;
     RefPtr<UnicodeRangeSet> m_rangeSet;
@@ -175,10 +166,6 @@
     }
 }
 
-#if !defined(HB_VERSION_ATLEAST)
-#define HB_VERSION_ATLEAST(major, minor, micro) 0
-#endif
-
 static hb_bool_t harfBuzzGetGlyph(hb_font_t* hbFont, void* fontData, hb_codepoint_t unicode, hb_codepoint_t variationSelector, hb_codepoint_t* glyph, void* userData)
 {
     HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData);
@@ -187,34 +174,7 @@
     if (hbFontData->m_rangeSet && !hbFontData->m_rangeSet->contains(unicode))
         return false;
 
-    if (variationSelector) {
-#if !HB_VERSION_ATLEAST(0, 9, 28)
-        return false;
-#else
-        // Skia does not support variation selectors, but hb does.
-        // We're not fully ready to switch to hb-ot-font yet,
-        // but are good enough to get glyph IDs for OpenType fonts.
-        if (!hbFontData->m_hbOpenTypeFont) {
-            hbFontData->m_hbOpenTypeFont = hb_font_create(hbFontData->m_face);
-            hb_ot_font_set_funcs(hbFontData->m_hbOpenTypeFont);
-        }
-        return hb_font_get_glyph(hbFontData->m_hbOpenTypeFont, unicode, variationSelector, glyph);
-        // When not found, glyph_func should return false rather than fallback to the base.
-        // http://lists.freedesktop.org/archives/harfbuzz/2015-May/004888.html
-#endif
-    }
-
-    WTF::HashMap<uint32_t, uint16_t>::AddResult result = hbFontData->m_glyphCacheForFaceCacheEntry->add(unicode, 0);
-    if (result.isNewEntry) {
-        SkPaint* paint = &hbFontData->m_paint;
-        paint->setTextEncoding(SkPaint::kUTF32_TextEncoding);
-        uint16_t glyph16;
-        paint->textToGlyphs(&unicode, sizeof(hb_codepoint_t), &glyph16);
-        result.storedValue->value = glyph16;
-        *glyph = glyph16;
-    }
-    *glyph = result.storedValue->value;
-    return !!*glyph;
+    return hb_font_get_glyph(hb_font_get_parent(hbFont), unicode, variationSelector, glyph);
 }
 
 static hb_position_t harfBuzzGetGlyphHorizontalAdvance(hb_font_t* hbFont, void* fontData, hb_codepoint_t glyph, void* userData)
@@ -226,13 +186,6 @@
     return advance;
 }
 
-static hb_bool_t harfBuzzGetGlyphHorizontalOrigin(hb_font_t* hbFont, void* fontData, hb_codepoint_t glyph, hb_position_t* x, hb_position_t* y, void* userData)
-{
-    // Just return true, following the way that HarfBuzz-FreeType
-    // implementation does.
-    return true;
-}
-
 static hb_bool_t harfBuzzGetGlyphVerticalOrigin(hb_font_t* hbFont, void* fontData, hb_codepoint_t glyph, hb_position_t* x, hb_position_t* y, void* userData)
 {
     HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(fontData);
@@ -301,7 +254,6 @@
         hb_font_funcs_set_glyph_func(harfBuzzSkiaFontFuncs, harfBuzzGetGlyph, 0, 0);
         hb_font_funcs_set_glyph_h_advance_func(harfBuzzSkiaFontFuncs, harfBuzzGetGlyphHorizontalAdvance, 0, 0);
         hb_font_funcs_set_glyph_h_kerning_func(harfBuzzSkiaFontFuncs, harfBuzzGetGlyphHorizontalKerning, 0, 0);
-        hb_font_funcs_set_glyph_h_origin_func(harfBuzzSkiaFontFuncs, harfBuzzGetGlyphHorizontalOrigin, 0, 0);
         hb_font_funcs_set_glyph_v_advance_func(harfBuzzSkiaFontFuncs, harfBuzzGetGlyphVerticalAdvance, 0, 0);
         hb_font_funcs_set_glyph_v_origin_func(harfBuzzSkiaFontFuncs, harfBuzzGetGlyphVerticalOrigin, 0, 0);
         hb_font_funcs_set_glyph_extents_func(harfBuzzSkiaFontFuncs, harfBuzzGetGlyphExtents, 0, 0);
@@ -333,12 +285,6 @@
 }
 #endif
 
-static void destroyHarfBuzzFontData(void* userData)
-{
-    HarfBuzzFontData* hbFontData = reinterpret_cast<HarfBuzzFontData*>(userData);
-    delete hbFontData;
-}
-
 hb_face_t* HarfBuzzFace::createFace()
 {
 #if OS(MACOSX)
@@ -350,19 +296,26 @@
     return face;
 }
 
-hb_font_t* HarfBuzzFace::createFont(PassRefPtr<UnicodeRangeSet> rangeSet) const
+void HarfBuzzFace::prepareHarfBuzzFontData()
 {
-    HarfBuzzFontData* hbFontData = new HarfBuzzFontData(m_glyphCacheForFaceCacheEntry, m_face, rangeSet);
-    m_platformData->setupPaint(&hbFontData->m_paint);
-    hbFontData->m_simpleFontData = FontCache::fontCache()->fontDataFromFontPlatformData(m_platformData);
-    ASSERT(hbFontData->m_simpleFontData);
-    hb_font_t* font = hb_font_create(m_face);
-    hb_font_set_funcs(font, harfBuzzSkiaGetFontFuncs(), hbFontData, destroyHarfBuzzFontData);
-    float size = m_platformData->size();
-    int scale = SkiaScalarToHarfBuzzPosition(size);
-    hb_font_set_scale(font, scale, scale);
-    hb_font_make_immutable(font);
-    return font;
+    m_harfBuzzFontData = adoptPtr(new HarfBuzzFontData());
+    m_harfBuzzFontData->m_simpleFontData = FontCache::fontCache()->fontDataFromFontPlatformData(m_platformData);
+    ASSERT(m_harfBuzzFontData->m_simpleFontData);
+    OwnPtr<hb_font_t> otFont = adoptPtr(hb_font_create(m_face));
+    hb_ot_font_set_funcs(otFont.get());
+    // Creating a sub font means that non-available functions
+    // are found from the parent.
+    m_unscaledFont = adoptPtr(hb_font_create_sub_font(otFont.get()));
+    hb_font_set_funcs(m_unscaledFont.get(), harfBuzzSkiaGetFontFuncs(), m_harfBuzzFontData.get(), nullptr);
+}
+
+hb_font_t* HarfBuzzFace::getScaledFont(PassRefPtr<UnicodeRangeSet> rangeSet)
+{
+    m_platformData->setupPaint(&m_harfBuzzFontData->m_paint);
+    m_harfBuzzFontData->m_rangeSet = rangeSet;
+    int scale = SkiaScalarToHarfBuzzPosition(m_platformData->size());
+    hb_font_set_scale(m_unscaledFont.get(), scale, scale);
+    return m_unscaledFont.get();
 }
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.h b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.h
index 9f7c15a..cdc3233 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.h
+++ b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.h
@@ -45,12 +45,11 @@
 namespace blink {
 
 class FontPlatformData;
+struct HarfBuzzFontData;
 
 class HarfBuzzFace : public RefCounted<HarfBuzzFace> {
     WTF_MAKE_NONCOPYABLE(HarfBuzzFace);
 public:
-    static const hb_tag_t vertTag;
-    static const hb_tag_t vrt2Tag;
 
     static PassRefPtr<HarfBuzzFace> create(FontPlatformData* platformData, uint64_t uniqueID)
     {
@@ -61,18 +60,20 @@
     // In order to support the restricting effect of unicode-range optionally a
     // range restriction can be passed in, which will restrict which glyphs we
     // return in the harfBuzzGetGlyph function.
-    hb_font_t* createFont(PassRefPtr<UnicodeRangeSet> = nullptr) const;
+    hb_font_t* getScaledFont(PassRefPtr<UnicodeRangeSet> = nullptr);
     hb_face_t* face() const { return m_face; }
 
 private:
     HarfBuzzFace(FontPlatformData*, uint64_t);
 
     hb_face_t* createFace();
+    void prepareHarfBuzzFontData();
 
     FontPlatformData* m_platformData;
     uint64_t m_uniqueID;
     hb_face_t* m_face;
-    WTF::HashMap<uint32_t, uint16_t>* m_glyphCacheForFaceCacheEntry;
+    OwnPtr<hb_font_t> m_unscaledFont;
+    OwnPtr<HarfBuzzFontData> m_harfBuzzFontData;
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzShaper.cpp b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzShaper.cpp
index 204da72b..cc6689e4 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzShaper.cpp
+++ b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzShaper.cpp
@@ -276,7 +276,6 @@
     m_features.remove(0, m_countFeatures);
 }
 
-
 // A port of hb_icu_script_to_script because harfbuzz on CrOS is built
 // without hb-icu. See http://crbug.com/356929
 static inline hb_script_t ICUScriptToHBScript(UScriptCode script)
@@ -313,8 +312,8 @@
     hb_buffer_set_direction(harfBuzzBuffer, TextDirectionToHBDirection(m_textRun.direction(),
         m_font->getFontDescription().orientation(), currentFont));
 
-    HarfBuzzScopedPtr<hb_font_t> harfBuzzFont(face->createFont(currentFontRangeSet), hb_font_destroy);
-    hb_shape(harfBuzzFont.get(), harfBuzzBuffer, m_features.isEmpty() ? 0 : m_features.data(), m_features.size());
+    hb_font_t* hbFont = face->getScaledFont(currentFontRangeSet);
+    hb_shape(hbFont, harfBuzzBuffer, m_features.isEmpty() ? 0 : m_features.data(), m_features.size());
 
     return true;
 }
@@ -526,18 +525,8 @@
     const String& localeString = fontDescription.locale();
     CString locale = localeString.latin1();
     const hb_language_t language = hb_language_from_string(locale.data(), locale.length());
-    FontDescription::FontVariantCaps requestedCaps = fontDescription.variantCaps();
 
-    // TODO(drott): crbug.com/585746 We need to to implement the font-variant
-    // shorthand to map correctly to font-variant-subproperties. This adapter
-    // code here activates small caps processing when either font-variant:
-    // small-caps is specified in the older CSS syntax, or when
-    // font-variant-caps: is specifying a non CapsNormal value.
-    if (requestedCaps == FontDescription::CapsNormal
-        && fontDescription.variant() == FontVariantSmallCaps)
-        requestedCaps = FontDescription::SmallCaps;
-
-    bool needsCapsHandling = requestedCaps != FontDescription::CapsNormal;
+    bool needsCapsHandling = fontDescription.variantCaps() != FontDescription::CapsNormal;
     OpenTypeCapsSupport capsSupport;
 
     RunSegmenter::RunSegmenterRange segmentRange = {
@@ -599,7 +588,7 @@
             SmallCapsIterator::SmallCapsBehavior smallCapsBehavior = SmallCapsIterator::SmallCapsSameCase;
             if (needsCapsHandling) {
                 capsSupport = OpenTypeCapsSupport(currentFont->platformData().harfBuzzFace(),
-                    requestedCaps,
+                    fontDescription.variantCaps(),
                     ICUScriptToHBScript(segmentRange.script));
                 if (capsSupport.needsRunCaseSplitting())
                     splitUntilNextCaseChange(currentQueueItem, smallCapsBehavior);
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/ShapeCache.h b/third_party/WebKit/Source/platform/fonts/shaping/ShapeCache.h
index 1e778a5..5d44f65 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/ShapeCache.h
+++ b/third_party/WebKit/Source/platform/fonts/shaping/ShapeCache.h
@@ -48,7 +48,7 @@
     {
         m_shapeResult = nullptr;
     }
-    RefPtr<ShapeResult> m_shapeResult;
+    RefPtr<const ShapeResult> m_shapeResult;
 };
 
 class ShapeCache {
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResult.cpp b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResult.cpp
index 40352ea8..4d29d84 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResult.cpp
+++ b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResult.cpp
@@ -160,7 +160,7 @@
 {
 }
 
-size_t ShapeResult::byteSize()
+size_t ShapeResult::byteSize() const
 {
     size_t selfByteSize = sizeof(this);
     for (unsigned i = 0; i < m_runs.size(); ++i) {
@@ -265,7 +265,7 @@
 }
 
 PassRefPtr<ShapeResult> ShapeResult::applySpacingToCopy(
-    ShapeResultSpacing& spacing, const TextRun& run)
+    ShapeResultSpacing& spacing, const TextRun& run) const
 {
     RefPtr<ShapeResult> result = ShapeResult::create(*this);
     result->applySpacing(spacing, run);
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResult.h b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResult.h
index bb00c3e..7dcafcf 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResult.h
+++ b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResult.h
@@ -69,12 +69,12 @@
     bool hasVerticalOffsets() const { return m_hasVerticalOffsets; }
 
     // For memory reporting.
-    size_t byteSize();
+    size_t byteSize() const;
 
     int offsetForPosition(float targetX) const;
 
     PassRefPtr<ShapeResult> applySpacingToCopy(ShapeResultSpacing&,
-        const TextRun&);
+        const TextRun&) const;
 
 protected:
     struct RunInfo;
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.cpp b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.cpp
index d5f9f6b..789f3944 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.cpp
+++ b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.cpp
@@ -214,7 +214,7 @@
         unsigned wordOffset = textRun.length();
         for (unsigned j = 0; j < m_results.size(); j++) {
             unsigned resolvedIndex = m_results.size() - 1 - j;
-            const RefPtr<ShapeResult>& wordResult = m_results[resolvedIndex];
+            const RefPtr<const ShapeResult>& wordResult = m_results[resolvedIndex];
             for (unsigned i = 0; i < wordResult->m_runs.size(); i++) {
                 advance += fillGlyphBufferForRun<RTL>(glyphBuffer,
                     wordResult->m_runs[i].get(), advance, from, to,
@@ -225,7 +225,7 @@
     } else {
         unsigned wordOffset = 0;
         for (unsigned j = 0; j < m_results.size(); j++) {
-            const RefPtr<ShapeResult>& wordResult = m_results[j];
+            const RefPtr<const ShapeResult>& wordResult = m_results[j];
             for (unsigned i = 0; i < wordResult->m_runs.size(); i++) {
                 advance += fillGlyphBufferForRun<LTR>(glyphBuffer,
                     wordResult->m_runs[i].get(), advance, from, to, wordOffset);
@@ -245,7 +245,7 @@
 
     for (unsigned j = 0; j < m_results.size(); j++) {
         unsigned resolvedIndex = textRun.rtl() ? m_results.size() - 1 - j : j;
-        const RefPtr<ShapeResult>& wordResult = m_results[resolvedIndex];
+        const RefPtr<const ShapeResult>& wordResult = m_results[resolvedIndex];
         for (unsigned i = 0; i < wordResult->m_runs.size(); i++) {
             unsigned resolvedOffset = wordOffset -
                 (textRun.rtl() ? wordResult->numCharacters() : 0);
@@ -279,7 +279,7 @@
 
     unsigned totalNumCharacters = 0;
     for (unsigned j = 0; j < m_results.size(); j++) {
-        const RefPtr<ShapeResult> result = m_results[j];
+        const RefPtr<const ShapeResult> result = m_results[j];
         if (direction == RTL) {
             // Convert logical offsets to visual offsets, because results are in
             // logical order while runs are in visual order.
@@ -364,7 +364,7 @@
 {
     Vector<CharacterRange> ranges;
     float currentX = direction == RTL ? totalWidth : 0;
-    for (const RefPtr<ShapeResult> result : m_results) {
+    for (const RefPtr<const ShapeResult> result : m_results) {
         if (direction == RTL)
             currentX -= result->width();
         unsigned runCount = result->m_runs.size();
@@ -385,7 +385,7 @@
     if (run.rtl()) {
         totalOffset = run.length();
         for (unsigned i = m_results.size(); i; --i) {
-            const RefPtr<ShapeResult>& wordResult = m_results[i - 1];
+            const RefPtr<const ShapeResult>& wordResult = m_results[i - 1];
             if (!wordResult)
                 continue;
             totalOffset -= wordResult->numCharacters();
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.h b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.h
index cef6c27..df498cfa 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.h
+++ b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.h
@@ -23,7 +23,7 @@
     ShapeResultBuffer()
         : m_hasVerticalOffsets(false) { }
 
-    void appendResult(PassRefPtr<ShapeResult> result)
+    void appendResult(PassRefPtr<const ShapeResult> result)
     {
         m_hasVerticalOffsets |= result->hasVerticalOffsets();
         m_results.append(result);
@@ -54,7 +54,7 @@
         Vector<CharacterRange>&);
 
     // Empirically, cases where we get more than 50 ShapeResults are extremely rare.
-    Vector<RefPtr<ShapeResult>, 64>m_results;
+    Vector<RefPtr<const ShapeResult>, 64>m_results;
     bool m_hasVerticalOffsets;
 };
 
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultTestInfo.cpp b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultTestInfo.cpp
index 185726d2..e7f28f7 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultTestInfo.cpp
+++ b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultTestInfo.cpp
@@ -15,7 +15,7 @@
 }
 
 bool ShapeResultTestInfo::runInfoForTesting(unsigned runIndex,
-    unsigned& startIndex, unsigned& numGlyphs, hb_script_t& script)
+    unsigned& startIndex, unsigned& numGlyphs, hb_script_t& script) const
 {
     if (runIndex < m_runs.size() && m_runs[runIndex]) {
         startIndex = m_runs[runIndex]->m_startIndex;
@@ -27,13 +27,13 @@
 }
 
 uint16_t ShapeResultTestInfo::glyphForTesting(unsigned runIndex,
-    size_t glyphIndex)
+    size_t glyphIndex) const
 {
     return m_runs[runIndex]->m_glyphData[glyphIndex].glyph;
 }
 
 float ShapeResultTestInfo::advanceForTesting(unsigned runIndex,
-    size_t glyphIndex)
+    size_t glyphIndex) const
 {
     return m_runs[runIndex]->m_glyphData[glyphIndex].advance;
 }
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultTestInfo.h b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultTestInfo.h
index d8dd283..0de820e 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultTestInfo.h
+++ b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultTestInfo.h
@@ -15,9 +15,9 @@
 public:
     unsigned numberOfRunsForTesting() const;
     bool runInfoForTesting(unsigned runIndex, unsigned& startIndex,
-        unsigned& numGlyphs, hb_script_t&);
-    uint16_t glyphForTesting(unsigned runIndex, size_t glyphIndex);
-    float advanceForTesting(unsigned runIndex, size_t glyphIndex);
+        unsigned& numGlyphs, hb_script_t&) const;
+    uint16_t glyphForTesting(unsigned runIndex, size_t glyphIndex) const;
+    float advanceForTesting(unsigned runIndex, size_t glyphIndex) const;
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
index 9895364d..5f750f02e 100644
--- a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
+++ b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
@@ -201,6 +201,9 @@
         return false;
 
     gpu::gles2::GLES2Interface* gl = contextGL();
+    if (!gl)
+        return false;
+
     GLuint imageTexture = skia::GrBackendObjectToGrGLTextureInfo(image->getTextureHandle(true))->fID;
     gl->CopySubTextureCHROMIUM(imageTexture, imageInfo.m_textureId, 0, 0, 0, 0, m_size.width(), m_size.height(), GL_FALSE, GL_FALSE, GL_FALSE);
 
@@ -236,6 +239,9 @@
     }
 
     gpu::gles2::GLES2Interface* gl = contextGL();
+    if (!gl)
+        return Canvas2DLayerBridge::ImageInfo();
+
     GLuint imageId = gl->CreateGpuMemoryBufferImageCHROMIUM(m_size.width(), m_size.height(), GL_RGBA, GC3D_SCANOUT_CHROMIUM);
     if (!imageId)
         return Canvas2DLayerBridge::ImageInfo();
@@ -256,7 +262,7 @@
 void Canvas2DLayerBridge::deleteCHROMIUMImage(ImageInfo info)
 {
     gpu::gles2::GLES2Interface* gl = contextGL();
-    if (gl->GetGraphicsResetStatusKHR() != GL_NO_ERROR)
+    if (!gl)
         return;
 
     GLenum target = GC3D_TEXTURE_RECTANGLE_ARB;
@@ -322,6 +328,9 @@
     mailboxInfo.m_mailbox.textureTarget = GL_TEXTURE_2D;
 
     gpu::gles2::GLES2Interface* gl = contextGL();
+    if (!gl)
+        return false;
+
     GLuint textureID = skia::GrBackendObjectToGrGLTextureInfo(mailboxInfo.m_image->getTextureHandle(true))->fID;
     gl->BindTexture(GL_TEXTURE_2D, textureID);
     gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, getGLFilter());
@@ -694,8 +703,9 @@
     // Check on m_layer is necessary because contextGL() may be called during
     // the destruction of m_layer
     if (m_layer && !m_destructionInProgress) {
-        // Ensure rate limiter is disabled if context is lost.
-        checkSurfaceValid();
+        // Call checkSurfaceValid to ensure rate limiter is disabled if context is lost.
+        if (!checkSurfaceValid())
+            return nullptr;
     }
     return m_contextProvider ? m_contextProvider->contextGL() : nullptr;
 }
diff --git a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.h b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.h
index 4b83705..e91d6581 100644
--- a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.h
+++ b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.h
@@ -67,7 +67,10 @@
 #define CANVAS2D_HIBERNATION_ENABLED 0
 
 // IOSurfaces are a primitive only present on OS X.
-#define USE_IOSURFACE_FOR_2D_CANVAS 1
+// IOSurfaces can't be used right now because the compositor returns them while
+// they are they still in use by the Window Server, and the SyncToken isn't
+// relevant. https://crbug.com/608026.
+#define USE_IOSURFACE_FOR_2D_CANVAS 0
 #else
 #define CANVAS2D_HIBERNATION_ENABLED 1
 #define USE_IOSURFACE_FOR_2D_CANVAS 0
diff --git a/third_party/WebKit/Source/platform/heap/Heap.h b/third_party/WebKit/Source/platform/heap/Heap.h
index 681aa7c4..40482db 100644
--- a/third_party/WebKit/Source/platform/heap/Heap.h
+++ b/third_party/WebKit/Source/platform/heap/Heap.h
@@ -531,7 +531,9 @@
 public:                                                \
     typedef int IsEagerlyFinalizedMarker
 #else
-#define EAGERLY_FINALIZE() typedef int IsEagerlyFinalizedMarker
+#define EAGERLY_FINALIZE()                             \
+public:                                                \
+    typedef int IsEagerlyFinalizedMarker
 #endif
 
 inline Address ThreadHeap::allocateOnArenaIndex(ThreadState* state, size_t size, int arenaIndex, size_t gcInfoIndex, const char* typeName)
diff --git a/third_party/WebKit/Source/platform/image-encoders/skia/JPEGImageEncoder.cpp b/third_party/WebKit/Source/platform/image-encoders/skia/JPEGImageEncoder.cpp
index d2dc0eb..8078e81 100644
--- a/third_party/WebKit/Source/platform/image-encoders/skia/JPEGImageEncoder.cpp
+++ b/third_party/WebKit/Source/platform/image-encoders/skia/JPEGImageEncoder.cpp
@@ -209,7 +209,7 @@
     if (!imageData.pixels())
         return false;
 
-    OwnPtr<JPEGImageEncoderState> encoderState = JPEGImageEncoderState::create(IntSize(imageData.width(), imageData.height()), quality, output);
+    OwnPtr<JPEGImageEncoderState> encoderState = JPEGImageEncoderState::create(imageData.size(), quality, output);
     if (!encoderState)
         return false;
 
diff --git a/third_party/WebKit/Source/platform/image-encoders/skia/PNGImageEncoder.cpp b/third_party/WebKit/Source/platform/image-encoders/skia/PNGImageEncoder.cpp
index 5b227c6..4594168 100644
--- a/third_party/WebKit/Source/platform/image-encoders/skia/PNGImageEncoder.cpp
+++ b/third_party/WebKit/Source/platform/image-encoders/skia/PNGImageEncoder.cpp
@@ -109,7 +109,7 @@
     if (!imageData.pixels())
         return false;
 
-    return encodePixels(IntSize(imageData.width(), imageData.height()), imageData.pixels(), output);
+    return encodePixels(imageData.size(), imageData.pixels(), output);
 }
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/platform/image-encoders/skia/WEBPImageEncoder.cpp b/third_party/WebKit/Source/platform/image-encoders/skia/WEBPImageEncoder.cpp
index e377f63..47711ba 100644
--- a/third_party/WebKit/Source/platform/image-encoders/skia/WEBPImageEncoder.cpp
+++ b/third_party/WebKit/Source/platform/image-encoders/skia/WEBPImageEncoder.cpp
@@ -105,7 +105,7 @@
     if (!imageData.pixels())
         return false;
 
-    return encodePixels(IntSize(imageData.width(), imageData.height()), imageData.pixels(), quality, output);
+    return encodePixels(imageData.size(), imageData.pixels(), quality, output);
 }
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp b/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp
index de40738..61742d3 100644
--- a/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp
+++ b/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp
@@ -73,6 +73,8 @@
 
 FloatPoint ScrollAnimator::desiredTargetPosition() const
 {
+    if (m_runState == RunState::WaitingToCancelOnCompositor)
+        return currentPosition();
     return (m_animationCurve || m_runState == RunState::WaitingToSendToCompositor)
         ? m_targetOffset : currentPosition();
 }
@@ -148,10 +150,10 @@
         resetAnimationState();
 
     if (m_runState == RunState::WaitingToCancelOnCompositor) {
-        // Ignore user scroll if WaitingToCancelOnCompositor. Can be in this
-        // state when holding down an arrow.
-        // TODO(ymalik): Handle this case by either updating the target on the
-        // current scroll or starting a new animation (see crbug.com/599876).
+        ASSERT(m_animationCurve);
+        m_targetOffset = targetPos;
+        if (registerAndScheduleAnimation())
+            m_runState = RunState::WaitingToCancelOnCompositorButNewScroll;
         return true;
     }
 
@@ -271,7 +273,8 @@
     }
 
     if (m_compositorAnimationId && m_runState != RunState::RunningOnCompositor
-        && m_runState != RunState::RunningOnCompositorButNeedsUpdate) {
+        && m_runState != RunState::RunningOnCompositorButNeedsUpdate
+        && m_runState != RunState::WaitingToCancelOnCompositorButNewScroll) {
         // If the current run state is WaitingToSendToCompositor but we have a
         // non-zero compositor animation id, there's a currently running
         // compositor animation that needs to be removed here before the new
@@ -296,24 +299,26 @@
         }
     }
 
-    if (m_runState == RunState::WaitingToSendToCompositor
-        || m_runState == RunState::RunningOnCompositorButNeedsUpdate) {
+    if (m_runState == RunState::RunningOnCompositorButNeedsUpdate
+        || m_runState == RunState::WaitingToCancelOnCompositorButNewScroll) {
+        // Abort the running animation before a new one with an updated
+        // target is added.
+        abortAnimation();
+
+        m_compositorAnimationId = 0;
+        m_compositorAnimationGroupId = 0;
+
+        m_animationCurve->updateTarget(m_timeFunction() - m_startTime,
+            compositorOffsetFromBlinkOffset(m_targetOffset));
+        if (m_runState == RunState::WaitingToCancelOnCompositorButNewScroll)
+            m_animationCurve->setInitialValue(compositorOffsetFromBlinkOffset(currentPosition()));
+        m_runState = RunState::WaitingToSendToCompositor;
+    }
+
+    if (m_runState == RunState::WaitingToSendToCompositor) {
         if (!m_compositorAnimationAttachedToLayerId)
             reattachCompositorPlayerIfNeeded(getScrollableArea()->compositorAnimationTimeline());
 
-        if (m_runState == RunState::RunningOnCompositorButNeedsUpdate) {
-            // Abort the running animation before a new one with an updated
-            // target is added.
-            abortAnimation();
-
-            m_compositorAnimationId = 0;
-            m_compositorAnimationGroupId = 0;
-
-            m_animationCurve->updateTarget(m_timeFunction() - m_startTime,
-                compositorOffsetFromBlinkOffset(m_targetOffset));
-            m_runState = RunState::WaitingToSendToCompositor;
-        }
-
         if (!m_animationCurve) {
             m_animationCurve = adoptPtr(CompositorFactory::current().createScrollOffsetAnimationCurve(
                 compositorOffsetFromBlinkOffset(m_targetOffset),
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollAnimatorCompositorCoordinator.cpp b/third_party/WebKit/Source/platform/scroll/ScrollAnimatorCompositorCoordinator.cpp
index 5dcc838..41858117 100644
--- a/third_party/WebKit/Source/platform/scroll/ScrollAnimatorCompositorCoordinator.cpp
+++ b/third_party/WebKit/Source/platform/scroll/ScrollAnimatorCompositorCoordinator.cpp
@@ -51,6 +51,7 @@
     case RunState::Idle:
     case RunState::RunningOnCompositor:
         return false;
+    case RunState::WaitingToCancelOnCompositorButNewScroll:
     case RunState::PostAnimationCleanup:
     case RunState::WaitingToSendToCompositor:
     case RunState::RunningOnMainThread:
@@ -104,6 +105,7 @@
     case RunState::RunningOnMainThread:
         m_runState = RunState::PostAnimationCleanup;
         break;
+    case RunState::WaitingToCancelOnCompositorButNewScroll:
     case RunState::RunningOnCompositorButNeedsUpdate:
     case RunState::RunningOnCompositor:
         m_runState = RunState::WaitingToCancelOnCompositor;
@@ -118,6 +120,7 @@
     switch (m_runState) {
     case RunState::Idle:
     case RunState::WaitingToCancelOnCompositor:
+    case RunState::WaitingToCancelOnCompositorButNewScroll:
     case RunState::PostAnimationCleanup:
     case RunState::RunningOnCompositorButNeedsTakeover:
     case RunState::WaitingToSendToCompositor:
@@ -153,6 +156,7 @@
         ASSERT_NOT_REACHED();
         break;
     case RunState::WaitingToSendToCompositor:
+    case RunState::WaitingToCancelOnCompositorButNewScroll:
         break;
     case RunState::RunningOnCompositor:
     case RunState::RunningOnCompositorButNeedsUpdate:
@@ -253,6 +257,8 @@
         return String("PostAnimationCleanup");
     case RunState::RunningOnCompositorButNeedsTakeover:
         return String("RunningOnCompositorButNeedsTakeover");
+    case RunState::WaitingToCancelOnCompositorButNewScroll:
+        return String("WaitingToCancelOnCompositorButNewScroll");
     }
     ASSERT_NOT_REACHED();
     return String();
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollAnimatorCompositorCoordinator.h b/third_party/WebKit/Source/platform/scroll/ScrollAnimatorCompositorCoordinator.h
index 6819510..9b69df7 100644
--- a/third_party/WebKit/Source/platform/scroll/ScrollAnimatorCompositorCoordinator.h
+++ b/third_party/WebKit/Source/platform/scroll/ScrollAnimatorCompositorCoordinator.h
@@ -114,6 +114,12 @@
         // on the main thread. This could happen if a main thread scrolling
         // reason is added while animating the scroll offset.
         RunningOnCompositorButNeedsTakeover,
+
+        // Waiting to cancel the animation currently running on the compositor
+        // while another animation is requested. In this case, the currently
+        // running animation is aborted and an animation to the new target
+        // from the current position is started.
+        WaitingToCancelOnCompositorButNewScroll,
     };
 
     OwnPtr<CompositorAnimationPlayer> m_compositorPlayer;
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollAnimatorTest.cpp b/third_party/WebKit/Source/platform/scroll/ScrollAnimatorTest.cpp
index 87cdcad..679f5a6 100644
--- a/third_party/WebKit/Source/platform/scroll/ScrollAnimatorTest.cpp
+++ b/third_party/WebKit/Source/platform/scroll/ScrollAnimatorTest.cpp
@@ -457,8 +457,8 @@
         .WillRepeatedly(Return(IntPoint(1000, 1000)));
     // Called when reset, not setting anywhere else.
     EXPECT_CALL(*scrollableArea, setScrollOffset(_, _)).Times(1);
-    // Called from first and last user scroll, and first update.
-    EXPECT_CALL(*scrollableArea, registerForAnimation()).Times(3);
+    // Called from userScroll, and first update.
+    EXPECT_CALL(*scrollableArea, registerForAnimation()).Times(4);
     EXPECT_CALL(*scrollableArea, scheduleAnimation()).Times(AtLeast(1))
         .WillRepeatedly(Return(true));
 
@@ -485,31 +485,33 @@
     EXPECT_EQ(scrollAnimator->m_runState,
         ScrollAnimatorCompositorCoordinator::RunState::WaitingToCancelOnCompositor);
 
-    // Second user scroll should not affect the run state.
+    // Unrelated scroll position update.
+    scrollAnimator->setCurrentPosition(FloatPoint(50, 0));
+
+    // Desired target position should be that of the second scroll.
     result = scrollAnimator->userScroll(ScrollByLine, FloatSize(100, 0));
     EXPECT_TRUE(scrollAnimator->hasAnimationThatRequiresService());
     EXPECT_TRUE(result.didScrollX);
     EXPECT_FLOAT_EQ(0.0, result.unusedScrollDeltaX);
     EXPECT_EQ(scrollAnimator->m_runState,
-        ScrollAnimatorCompositorCoordinator::RunState::WaitingToCancelOnCompositor);
-    // Desired target position is what it was before.
-    EXPECT_EQ(100, scrollAnimator->desiredTargetPosition().x());
+        ScrollAnimatorCompositorCoordinator::RunState::WaitingToCancelOnCompositorButNewScroll);
+    EXPECT_EQ(150, scrollAnimator->desiredTargetPosition().x());
     EXPECT_EQ(0, scrollAnimator->desiredTargetPosition().y());
 
     // Update compositor animation.
     gMockedTime += 0.05;
     scrollAnimator->updateCompositorAnimations();
     EXPECT_EQ(scrollAnimator->m_runState,
-        ScrollAnimatorCompositorCoordinator::RunState::Idle);
+        ScrollAnimatorCompositorCoordinator::RunState::RunningOnCompositor);
 
-    // Third user scroll after compositor update is treated like a new scroll.
+    // Third user scroll after compositor update updates the target.
     result = scrollAnimator->userScroll(ScrollByLine, FloatSize(100, 0));
     EXPECT_TRUE(scrollAnimator->hasAnimationThatRequiresService());
     EXPECT_TRUE(result.didScrollX);
     EXPECT_FLOAT_EQ(0.0, result.unusedScrollDeltaX);
     EXPECT_EQ(scrollAnimator->m_runState,
-        ScrollAnimatorCompositorCoordinator::RunState::WaitingToSendToCompositor);
-    EXPECT_EQ(100, scrollAnimator->desiredTargetPosition().x());
+        ScrollAnimatorCompositorCoordinator::RunState::RunningOnCompositorButNeedsUpdate);
+    EXPECT_EQ(250, scrollAnimator->desiredTargetPosition().x());
     EXPECT_EQ(0, scrollAnimator->desiredTargetPosition().y());
     reset(*scrollAnimator);
 
diff --git a/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptSource.js b/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptSource.js
index 9c7d693..01ebb220 100644
--- a/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptSource.js
+++ b/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptSource.js
@@ -836,8 +836,14 @@
         this.className = className;
     this.description = injectedScript._describe(object);
 
-    if (generatePreview && this.type === "object" && this.subtype !== "node" && this.subtype !== "proxy")
-        this.preview = this._generatePreview(object, undefined, columnNames, isTable, skipEntriesPreview);
+    if (generatePreview && this.type === "object") {
+        if (this.subtype === "proxy") {
+            this.preview = this._generatePreview(InjectedScriptHost.proxyTargetValue(object), undefined, columnNames, isTable, skipEntriesPreview);
+            this.preview.lossless = false;
+        } else if (this.subtype !== "node") {
+            this.preview = this._generatePreview(object, undefined, columnNames, isTable, skipEntriesPreview);
+        }
+    }
 
     if (injectedScript._customObjectFormatterEnabled) {
         var customPreview = this._customPreview(object, objectGroupName, customObjectConfig);
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp b/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp
index 040d28e..6ff055b 100644
--- a/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp
+++ b/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp
@@ -53,6 +53,7 @@
     setFunctionProperty(context, injectedScriptHost, "suppressWarningsAndCallFunction", V8InjectedScriptHost::suppressWarningsAndCallFunctionCallback, debuggerExternal);
     setFunctionProperty(context, injectedScriptHost, "setNonEnumProperty", V8InjectedScriptHost::setNonEnumPropertyCallback, debuggerExternal);
     setFunctionProperty(context, injectedScriptHost, "bind", V8InjectedScriptHost::bindCallback, debuggerExternal);
+    setFunctionProperty(context, injectedScriptHost, "proxyTargetValue", V8InjectedScriptHost::proxyTargetValueCallback, debuggerExternal);
     return injectedScriptHost;
 }
 
@@ -257,6 +258,18 @@
     info.GetReturnValue().Set(id);
 }
 
+void V8InjectedScriptHost::proxyTargetValueCallback(const v8::FunctionCallbackInfo<v8::Value>& info)
+{
+    if (info.Length() != 1 || !info[0]->IsProxy()) {
+        ASSERT_NOT_REACHED();
+        return;
+    }
+    v8::Local<v8::Object> target = info[0].As<v8::Proxy>();
+    while (target->IsProxy())
+        target = v8::Local<v8::Proxy>::Cast(target)->GetTarget();
+    info.GetReturnValue().Set(target);
+}
+
 v8::Local<v8::Private> V8Debugger::scopeExtensionPrivate(v8::Isolate* isolate)
 {
     return v8::Private::ForApi(isolate, toV8StringInternalized(isolate, "V8Debugger#scopeExtension"));
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.h b/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.h
index 7f3669f4..2694bac 100644
--- a/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.h
+++ b/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.h
@@ -35,6 +35,7 @@
     static void setNonEnumPropertyCallback(const v8::FunctionCallbackInfo<v8::Value>&);
     static void setFunctionVariableValueCallback(const v8::FunctionCallbackInfo<v8::Value>&);
     static void bindCallback(const v8::FunctionCallbackInfo<v8::Value>&);
+    static void proxyTargetValueCallback(const v8::FunctionCallbackInfo<v8::Value>&);
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/web/PopupMenuImpl.cpp b/third_party/WebKit/Source/web/PopupMenuImpl.cpp
index 184978c4..618be41 100644
--- a/third_party/WebKit/Source/web/PopupMenuImpl.cpp
+++ b/third_party/WebKit/Source/web/PopupMenuImpl.cpp
@@ -56,18 +56,6 @@
     return nullptr;
 }
 
-const char* fontVariantToString(FontVariant variant)
-{
-    switch (variant) {
-    case FontVariantNormal:
-        return "normal";
-    case FontVariantSmallCaps:
-        return "small-caps";
-    }
-    NOTREACHED();
-    return nullptr;
-}
-
 // TODO crbug.com/516675 Add stretch to serialization
 
 const char* fontStyleToString(FontStyle style)
@@ -186,7 +174,7 @@
         addProperty("textTransform", String(textTransformToString(baseStyle().textTransform())), m_buffer);
         addProperty("fontSize", baseFont().specifiedSize(), m_buffer);
         addProperty("fontStyle", String(fontStyleToString(baseFont().style())), m_buffer);
-        addProperty("fontVariant", String(fontVariantToString(baseFont().variant())), m_buffer);
+        addProperty("fontVariant", baseFont().variantCaps() == FontDescription::SmallCaps ? String("small-caps") : String(), m_buffer);
 
         PagePopupClient::addString("fontFamily: [", m_buffer);
         for (const FontFamily* f = &baseFont().family(); f; f = f->next()) {
@@ -342,8 +330,10 @@
     }
     if (baseFont.style() != fontDescription.style())
         addProperty("fontStyle", String(fontStyleToString(fontDescription.style())), data);
-    if (baseFont.variant() != fontDescription.variant())
-        addProperty("fontVariant", String(fontVariantToString(fontDescription.variant())), data);
+
+    if (baseFont.variantCaps() != fontDescription.variantCaps() && fontDescription.variantCaps() == FontDescription::SmallCaps)
+        addProperty("fontVariant", String("small-caps"), data);
+
     if (baseStyle.textTransform() != style->textTransform())
         addProperty("textTransform", String(textTransformToString(style->textTransform())), data);
 
diff --git a/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp b/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp
index d77299aa..62db45f 100644
--- a/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp
+++ b/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp
@@ -53,6 +53,8 @@
 #include "platform/heap/Handle.h"
 #include "platform/network/ContentSecurityPolicyParsers.h"
 #include "platform/network/ContentSecurityPolicyResponseHeaders.h"
+#include "platform/network/NetworkUtils.h"
+#include "platform/weborigin/SecurityOrigin.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebURLRequest.h"
 #include "public/platform/modules/serviceworker/WebServiceWorkerProvider.h"
@@ -131,6 +133,22 @@
     DCHECK(!m_mainScriptLoader);
     DCHECK_EQ(m_pauseAfterDownloadState, DontPauseAfterDownload);
     m_workerStartData = data;
+
+    // TODO(mkwst): This really needs to be piped through from the requesting
+    // document, like we're doing for SharedWorkers. That turns out to be
+    // incredibly convoluted, and since ServiceWorkers are locked to the same
+    // origin as the page which requested them, the only time it would come
+    // into play is a DNS poisoning attack after the page load. It's something
+    // we should fix, but we're taking this shortcut for the prototype.
+    //
+    // https://crbug.com/590714
+    KURL scriptURL = m_workerStartData.scriptURL;
+    m_workerStartData.addressSpace = WebAddressSpacePublic;
+    if (NetworkUtils::isReservedIPAddress(scriptURL.host()))
+        m_workerStartData.addressSpace = WebAddressSpacePrivate;
+    if (SecurityOrigin::create(scriptURL)->isLocalhost())
+        m_workerStartData.addressSpace = WebAddressSpaceLocal;
+
     if (data.pauseAfterDownloadMode == WebEmbeddedWorkerStartData::PauseAfterDownload)
         m_pauseAfterDownloadState = DoPauseAfterDownload;
     prepareShadowPageForLoader();
@@ -317,7 +335,7 @@
         *m_mainFrame->frame()->document(),
         m_workerStartData.scriptURL,
         DenyCrossOriginRequests,
-        m_mainFrame->frame()->document()->addressSpace(),
+        m_workerStartData.addressSpace,
         nullptr,
         bind(&WebEmbeddedWorkerImpl::onScriptLoaderFinished, this));
     // Do nothing here since onScriptLoaderFinished() might have been already
@@ -386,6 +404,7 @@
 
     KURL scriptURL = m_mainScriptLoader->url();
     WorkerThreadStartMode startMode = m_workerInspectorProxy->workerStartMode(document);
+
     OwnPtr<WorkerThreadStartupData> startupData = WorkerThreadStartupData::create(
         scriptURL,
         m_workerStartData.userAgent,
diff --git a/third_party/WebKit/Source/web/WebInputEventConversion.cpp b/third_party/WebKit/Source/web/WebInputEventConversion.cpp
index 9aebc43..ce7c5bb 100644
--- a/third_party/WebKit/Source/web/WebInputEventConversion.cpp
+++ b/third_party/WebKit/Source/web/WebInputEventConversion.cpp
@@ -454,7 +454,6 @@
     m_pointerProperties = point;
     m_state = toPlatformTouchPointState(point.state);
 
-    // This assumes convertFromRootFrame does only translations, not scales.
     FloatPoint floatPos = convertHitPointToRootFrame(widget, point.position);
     IntPoint flooredPoint = flooredIntPoint(floatPos);
     m_pos = widget->convertFromRootFrame(flooredPoint) + (floatPos - flooredPoint);
diff --git a/third_party/WebKit/Source/web/WebKit.cpp b/third_party/WebKit/Source/web/WebKit.cpp
index f0ac13e62..0e66ffa0 100644
--- a/third_party/WebKit/Source/web/WebKit.cpp
+++ b/third_party/WebKit/Source/web/WebKit.cpp
@@ -36,6 +36,7 @@
 #include "bindings/core/v8/V8Initializer.h"
 #include "core/animation/AnimationClock.h"
 #include "core/page/Page.h"
+#include "core/workers/WorkerBackingThread.h"
 #include "gin/public/v8_platform.h"
 #include "modules/ModulesInitializer.h"
 #include "platform/LayoutTestSupport.h"
@@ -176,4 +177,11 @@
     WTF::Partitions::decommitFreeableMemory();
 }
 
+void MemoryPressureNotificationToWorkerThreadIsolates(
+    v8::MemoryPressureLevel level)
+{
+    WorkerBackingThread::
+        MemoryPressureNotificationToWorkerThreadIsolates(level);
+}
+
 } // namespace blink
diff --git a/third_party/WebKit/Source/web/tests/WebViewTest.cpp b/third_party/WebKit/Source/web/tests/WebViewTest.cpp
index 295b546..ab465a0 100644
--- a/third_party/WebKit/Source/web/tests/WebViewTest.cpp
+++ b/third_party/WebKit/Source/web/tests/WebViewTest.cpp
@@ -2165,16 +2165,18 @@
         "<div id=\"div4\" style=\"padding: 10px; margin: 10px; border: 2px "
         "solid skyblue; float: left; width: 190px; height: 30px; "
         "color: rgb(0, 0, 0); font-family: myahem; font-size: 8px; font-style: "
-        "normal; font-variant: normal; font-weight: normal; letter-spacing: "
+        "normal; font-variant-ligatures: normal; font-variant-caps: normal; "
+        "font-weight: normal; letter-spacing: "
         "normal; line-height: normal; orphans: 2; text-align: start; "
         "text-indent: 0px; text-transform: none; white-space: normal; widows: "
         "2; word-spacing: 0px; -webkit-text-stroke-width: 0px;\">Air "
         "conditioner</div><div id=\"div5\" style=\"padding: 10px; margin: "
         "10px; border: 2px solid skyblue; float: left; width: "
         "190px; height: 30px; color: rgb(0, 0, 0); font-family: myahem; "
-        "font-size: 8px; font-style: normal; font-variant: normal; "
-        "font-weight: normal; letter-spacing: normal; line-height: normal; "
-        "orphans: 2; text-align: start; text-indent: 0px; text-transform: "
+        "font-size: 8px; font-style: normal; font-variant-ligatures: normal; "
+        "font-variant-caps: normal; font-weight: normal; "
+        "letter-spacing: normal; line-height: normal; orphans: 2; "
+        "text-align: start; text-indent: 0px; text-transform: "
         "none; white-space: normal; widows: 2; word-spacing: 0px; "
         "-webkit-text-stroke-width: 0px;\">Price 10,000,000won</div>";
     WebString clipText;
@@ -2198,18 +2200,20 @@
         "<div id=\"div4\" style=\"padding: 10px; margin: 10px; border: 2px "
         "solid skyblue; float: left; width: 190px; height: 30px; "
         "color: rgb(0, 0, 0); font-family: myahem; font-size: 8px; font-style: "
-        "normal; font-variant: normal; font-weight: normal; letter-spacing: "
+        "normal; font-variant-ligatures: normal; font-variant-caps: normal; "
+        "font-weight: normal; letter-spacing: "
         "normal; line-height: normal; orphans: 2; text-align: start; "
         "text-indent: 0px; text-transform: none; white-space: normal; widows: "
         "2; word-spacing: 0px; -webkit-text-stroke-width: 0px;\">Air "
         "conditioner</div><div id=\"div5\" style=\"padding: 10px; margin: "
         "10px; border: 2px solid skyblue; float: left; width: "
         "190px; height: 30px; color: rgb(0, 0, 0); font-family: myahem; "
-        "font-size: 8px; font-style: normal; font-variant: normal; "
-        "font-weight: normal; letter-spacing: normal; line-height: normal; "
-        "orphans: 2; text-align: start; text-indent: 0px; text-transform: "
-        "none; white-space: normal; widows: 2; word-spacing: 0px; "
-        "-webkit-text-stroke-width: 0px;\">Price 10,000,000won</div>";
+        "font-size: 8px; font-style: normal; font-variant-ligatures: normal; "
+        "font-variant-caps: normal; font-weight: normal; letter-spacing: normal; "
+        "line-height: normal; orphans: 2; text-align: start; text-indent: 0px; "
+        "text-transform: none; white-space: normal; widows: 2; "
+        "word-spacing: 0px; -webkit-text-stroke-width: 0px;\">"
+        "Price 10,000,000won</div>";
     WebString clipText;
     WebString clipHtml;
     WebRect clipRect;
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/lint_test_expectations_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/lint_test_expectations_unittest.py
index 001052a..dd8fa4a 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/lint_test_expectations_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/lint_test_expectations_unittest.py
@@ -101,8 +101,7 @@
         self.assertEqual(res, [])
         self.assertEqual(host.ports_parsed, ['a', 'b', 'b-win'])
 
-    # TODO(crbug.com/603753) - reenable this when the ARB is restarted.
-    def disabled_test_lint_test_files(self):
+    def test_lint_test_files(self):
         logging_stream = StringIO.StringIO()
         options = optparse.Values({'platform': 'test-mac-mac10.10'})
         host = MockHost()
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py
index a555f766..df9e5ec 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py
@@ -170,10 +170,6 @@
         if self.REBASELINE_MODIFIER in expectations:
             expectation_line.warnings.append('REBASELINE should only be used for running rebaseline.py. Cannot be checked in.')
 
-        # TODO(crbug.com/603753) - Don't let NeedsRebaseline be checked in while the auto-rebaseline-bot is down.
-        if self.NEEDS_REBASELINE_MODIFIER in expectations:
-            expectation_line.warnings.append('NeedsRebaseline is broken at the moment. See crbug.com/603753.')
-
         if self.NEEDS_REBASELINE_MODIFIER in expectations or self.NEEDS_MANUAL_REBASELINE_MODIFIER in expectations:
             for test in expectation_line.matching_tests:
                 if self._port.reference_files(test):
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations_unittest.py
index 3ac89c4..d7e03a8 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations_unittest.py
@@ -189,8 +189,7 @@
         s = self._exp.get_test_set(CRASH)
         self.assertEqual(s, set(['failures/expected/crash.html', 'failures/expected/image_checksum.html']))
 
-    # TODO(crbug.com/603753) - reenable this when the ARB is restarted.
-    def disabled_test_needs_rebaseline_reftest(self):
+    def test_needs_rebaseline_reftest(self):
         try:
             filesystem = self._port.host.filesystem
             filesystem.write_text_file(filesystem.join(self._port.layout_tests_dir(),
@@ -209,8 +208,7 @@
 expectations:2 A reftest cannot be marked as NeedsRebaseline/NeedsManualRebaseline failures/expected/needsmanualrebaseline.html"""
             self.assertEqual(str(e), warnings)
 
-    # TODO(crbug.com/603753) - reenable this when the ARB is restarted.
-    def disabled_test_parse_warning(self):
+    def test_parse_warning(self):
         try:
             filesystem = self._port.host.filesystem
             filesystem.write_text_file(filesystem.join(self._port.layout_tests_dir(), 'disabled-test.html-disabled'), 'content')
diff --git a/third_party/WebKit/public/BUILD.gn b/third_party/WebKit/public/BUILD.gn
index a2533d9..d16eb8a7 100644
--- a/third_party/WebKit/public/BUILD.gn
+++ b/third_party/WebKit/public/BUILD.gn
@@ -183,6 +183,7 @@
   sources = [
     "platform/modules/bluetooth/web_bluetooth.mojom",
     "platform/modules/geolocation/geolocation.mojom",
+    "platform/modules/imagecapture/image_capture.mojom",
     "platform/modules/notifications/notification.mojom",
     "platform/modules/permissions/permission.mojom",
     "platform/modules/permissions/permission_status.mojom",
diff --git a/third_party/WebKit/public/blink.gyp b/third_party/WebKit/public/blink.gyp
index e8c15dc..b9c5dd8 100644
--- a/third_party/WebKit/public/blink.gyp
+++ b/third_party/WebKit/public/blink.gyp
@@ -35,6 +35,7 @@
         'blink_mojo_sources': [
             'platform/modules/bluetooth/web_bluetooth.mojom',
             'platform/modules/geolocation/geolocation.mojom',
+            'platform/modules/imagecapture/image_capture.mojom',
             'platform/modules/notifications/notification.mojom',
             'platform/modules/permissions/permission.mojom',
             'platform/modules/permissions/permission_status.mojom',
diff --git a/third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothDevice.h b/third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothDevice.h
index 771f94b..2c2dfcc 100644
--- a/third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothDevice.h
+++ b/third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothDevice.h
@@ -12,31 +12,15 @@
 
 // Information describing a Bluetooth device provided by the platform.
 struct WebBluetoothDevice {
-    enum class VendorIDSource {
-        Unknown,
-        Bluetooth,
-        USB
-    };
-
     WebBluetoothDevice(const WebString& id,
         const WebString& name,
         int8_t txPower,
         int8_t rssi,
-        int32_t deviceClass,
-        VendorIDSource vendorIDSource,
-        uint16_t vendorID,
-        uint16_t productID,
-        uint16_t productVersion,
         const WebVector<WebString>& uuids)
         : id(id)
         , name(name)
         , txPower(txPower)
         , rssi(rssi)
-        , deviceClass(deviceClass)
-        , vendorIDSource(vendorIDSource)
-        , vendorID(vendorID)
-        , productID(productID)
-        , productVersion(productVersion)
         , uuids(uuids)
     {
     }
@@ -48,11 +32,6 @@
     // A value of 127 denotes an invalid power.
     const int8_t txPower;
     const int8_t rssi;
-    const int32_t deviceClass;
-    const VendorIDSource vendorIDSource;
-    const uint16_t vendorID;
-    const uint16_t productID;
-    const uint16_t productVersion;
     const WebVector<WebString> uuids;
 };
 
diff --git a/third_party/WebKit/public/platform/modules/imagecapture/OWNERS b/third_party/WebKit/public/platform/modules/imagecapture/OWNERS
new file mode 100644
index 0000000..9e621796
--- /dev/null
+++ b/third_party/WebKit/public/platform/modules/imagecapture/OWNERS
@@ -0,0 +1,13 @@
+# Changes to Mojo interfaces require a security review to avoid
+# introducing new sandbox escapes.
+per-file *.mojom=set noparent
+per-file *.mojom=dcheng@chromium.org
+per-file *.mojom=inferno@chromium.org
+per-file *.mojom=jln@chromium.org
+per-file *.mojom=jschuh@chromium.org
+per-file *.mojom=kenrb@chromium.org
+per-file *.mojom=mkwst@chromium.org
+per-file *.mojom=nasko@chromium.org
+per-file *.mojom=palmer@chromium.org
+per-file *.mojom=tsepez@chromium.org
+per-file *.mojom=wfh@chromium.org
diff --git a/third_party/WebKit/public/platform/modules/imagecapture/image_capture.mojom b/third_party/WebKit/public/platform/modules/imagecapture/image_capture.mojom
new file mode 100644
index 0000000..11c909f
--- /dev/null
+++ b/third_party/WebKit/public/platform/modules/imagecapture/image_capture.mojom
@@ -0,0 +1,11 @@
+// Copyright 2016 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.
+
+module blink.mojom;
+
+interface ImageCapture
+{
+    TakePhoto(string sourceid)
+        => (string mime_type, array<uint8> data);
+};
diff --git a/third_party/WebKit/public/platform/modules/payments/payment_request.mojom b/third_party/WebKit/public/platform/modules/payments/payment_request.mojom
index 9b4cb7b6..daaccec 100644
--- a/third_party/WebKit/public/platform/modules/payments/payment_request.mojom
+++ b/third_party/WebKit/public/platform/modules/payments/payment_request.mojom
@@ -42,6 +42,9 @@
   //
   // {"nameOnCard": "Jon Doe", "pan": "4111 1111 1111 1111"}
   string stringified_details;
+
+  ShippingAddress? shipping_address;
+  string? shipping_option_id;
 };
 
 interface PaymentRequestClient {
diff --git a/third_party/WebKit/public/web/WebEmbeddedWorkerStartData.h b/third_party/WebKit/public/web/WebEmbeddedWorkerStartData.h
index 3f54a7d4..5692378 100644
--- a/third_party/WebKit/public/web/WebEmbeddedWorkerStartData.h
+++ b/third_party/WebKit/public/web/WebEmbeddedWorkerStartData.h
@@ -32,6 +32,7 @@
 #define WebEmbeddedWorkerStartData_h
 
 #include "WebContentSecurityPolicy.h"
+#include "public/platform/WebAddressSpace.h"
 #include "public/platform/WebString.h"
 #include "public/platform/WebURL.h"
 #include "public/web/WebSettings.h"
@@ -55,6 +56,8 @@
     WebSettings::V8CacheOptions v8CacheOptions;
     bool dataSaverEnabled;
 
+    WebAddressSpace addressSpace;
+
     WebEmbeddedWorkerStartData()
         : pauseAfterDownloadMode(DontPauseAfterDownload)
         , waitForDebuggerMode(DontWaitForDebugger)
diff --git a/third_party/WebKit/public/web/WebKit.h b/third_party/WebKit/public/web/WebKit.h
index 0ee53fd2..d483405 100644
--- a/third_party/WebKit/public/web/WebKit.h
+++ b/third_party/WebKit/public/web/WebKit.h
@@ -35,6 +35,7 @@
 
 namespace v8 {
 class Isolate;
+enum class MemoryPressureLevel;
 }
 
 namespace blink {
@@ -84,6 +85,10 @@
 // performance and memory usage.
 BLINK_EXPORT void decommitFreeableMemory();
 
+// Send memory pressure notification to worker thread isolate.
+BLINK_EXPORT void MemoryPressureNotificationToWorkerThreadIsolates(
+    v8::MemoryPressureLevel);
+
 } // namespace blink
 
 #endif
diff --git a/third_party/WebKit/public/web/WebWidgetClient.h b/third_party/WebKit/public/web/WebWidgetClient.h
index 849a3d0..b7c6987 100644
--- a/third_party/WebKit/public/web/WebWidgetClient.h
+++ b/third_party/WebKit/public/web/WebWidgetClient.h
@@ -38,6 +38,7 @@
 #include "public/platform/WebRect.h"
 #include "public/platform/WebScreenInfo.h"
 #include "public/web/WebMeaningfulLayout.h"
+#include "public/web/WebTextDirection.h"
 #include "public/web/WebTouchAction.h"
 
 namespace blink {
diff --git a/third_party/boringssl/BUILD.gn b/third_party/boringssl/BUILD.gn
index 11e9829..25186b6 100644
--- a/third_party/boringssl/BUILD.gn
+++ b/third_party/boringssl/BUILD.gn
@@ -134,6 +134,7 @@
     ]
     deps = [
       ":boringssl",
+      "//build/win:default_exe_manifest",
     ]
   }
 
@@ -187,10 +188,14 @@
         libfuzzer_options = [ "max_len=3072" ]
       } else if ("client" == fuzzer) {
         libfuzzer_options = [ "max_len=20000" ]
+      } else if ("pkcs8" == fuzzer) {
+        libfuzzer_options = [ "max_len=2048" ]
       } else if ("privkey" == fuzzer) {
         libfuzzer_options = [ "max_len=2048" ]
       } else if ("server" == fuzzer) {
         libfuzzer_options = [ "max_len=4096" ]
+      } else if ("spki" == fuzzer) {
+        libfuzzer_options = [ "max_len=1024" ]
       }
     }
   }
diff --git a/third_party/boringssl/boringssl.gyp b/third_party/boringssl/boringssl.gyp
index f1a9384d..311fee4 100644
--- a/third_party/boringssl/boringssl.gyp
+++ b/third_party/boringssl/boringssl.gyp
@@ -8,6 +8,49 @@
   ],
   'targets': [
     {
+      'target_name': 'boringssl_nacl_win64',
+      'type': '<(component)',
+      'sources': [
+        '<@(boringssl_crypto_sources)',
+      ],
+      'defines': [
+        'BORINGSSL_IMPLEMENTATION',
+        'BORINGSSL_NO_STATIC_INITIALIZER',
+        'OPENSSL_NO_ASM',
+        'OPENSSL_SMALL',
+      ],
+      'configurations': {
+        'Common_Base': {
+          'msvs_target_platform': 'x64',
+        },
+      },
+      # TODO(davidben): Fix size_t truncations in BoringSSL.
+      # https://crbug.com/429039
+      'msvs_disabled_warnings': [ 4267, ],
+      'conditions': [
+        ['component == "shared_library"', {
+          'defines': [
+            'BORINGSSL_SHARED_LIBRARY',
+          ],
+        }],
+      ],
+      'include_dirs': [
+        'src/include',
+      ],
+      'direct_dependent_settings': {
+        'include_dirs': [
+          'src/include',
+        ],
+        'conditions': [
+          ['component == "shared_library"', {
+            'defines': [
+              'BORINGSSL_SHARED_LIBRARY',
+            ],
+          }],
+        ],
+      },
+    },
+    {
       'target_name': 'boringssl',
       'type': '<(component)',
       'sources': [
diff --git a/third_party/class-dump/README.chromium b/third_party/class-dump/README.chromium
index 54bb4056..64e2a6ea 100644
--- a/third_party/class-dump/README.chromium
+++ b/third_party/class-dump/README.chromium
@@ -1,7 +1,7 @@
 Name: class-dump
 URL: https://github.com/nygard/class-dump
 Version: 3.5
-License: GPL
+License: NOT_SHIPPED
 Revision: 978d177ca6f0d2e5e34acf3e8dadc63e3140ebbc
 Security Critical: NO
 
diff --git a/third_party/custom_tabs_client/BUILD.gn b/third_party/custom_tabs_client/BUILD.gn
index 5eb4e4627..ef99dee 100644
--- a/third_party/custom_tabs_client/BUILD.gn
+++ b/third_party/custom_tabs_client/BUILD.gn
@@ -11,13 +11,18 @@
 }
 
 android_apk("custom_tabs_client_example_apk") {
-  java_files = [ "src/Application/src/main/java/org/chromium/customtabsclient/MainActivity.java" ]
+  java_files = [
+    "src/Application/src/main/java/org/chromium/customtabsclient/BottomBarManager.java",
+    "src/Application/src/main/java/org/chromium/customtabsclient/MainActivity.java",
+    "src/Application/src/main/java/org/chromium/customtabsclient/SessionHelper.java",
+  ]
   android_manifest = "src/Application/src/main/AndroidManifest.xml"
   apk_name = "CustomTabsClientExample"
   deps = [
     ":chrome_tabs_client_example_apk_resources",
     ":custom_tabs_client_shared_lib",
     ":custom_tabs_support_lib",
+    "//third_party/android_tools:android_support_v13_java",
   ]
   chromium_code = false
 }
diff --git a/third_party/drmemory/README.chromium b/third_party/drmemory/README.chromium
index b7b79e90..b347e45 100644
--- a/third_party/drmemory/README.chromium
+++ b/third_party/drmemory/README.chromium
@@ -1,7 +1,7 @@
 Name: Dr. Memory
 Short Name: drmemory
 URL: http://drmemory.org
-Version: 1.9.16880
+Version: 1.9.16923
 License: LGPL 2.1
 License File: NOT_SHIPPED
 Security Critical: no
diff --git a/third_party/drmemory/drmemory-windows-sfx.exe.sha1 b/third_party/drmemory/drmemory-windows-sfx.exe.sha1
index c2c29e26..5bc8e18 100644
--- a/third_party/drmemory/drmemory-windows-sfx.exe.sha1
+++ b/third_party/drmemory/drmemory-windows-sfx.exe.sha1
@@ -1 +1 @@
-1232e54b56f1e42faa126bd751722e4ed5ac69f6
\ No newline at end of file
+be556bb1fd36374e23800aa0335c3518318137e7
\ No newline at end of file
diff --git a/third_party/gif_player/BUILD.gn b/third_party/gif_player/BUILD.gn
index ab0cd6f2..dcbc8b0 100644
--- a/third_party/gif_player/BUILD.gn
+++ b/third_party/gif_player/BUILD.gn
@@ -9,5 +9,5 @@
     "src/jp/tomorrowkey/android/gifplayer/BaseGifDrawable.java",
     "src/jp/tomorrowkey/android/gifplayer/BaseGifImage.java",
   ]
-  run_findbugs = false
+  run_findbugs_override = false
 }
diff --git a/third_party/harfbuzz-ng/NEWS b/third_party/harfbuzz-ng/NEWS
index 721d528..e62b1989 100644
--- a/third_party/harfbuzz-ng/NEWS
+++ b/third_party/harfbuzz-ng/NEWS
@@ -1,3 +1,15 @@
+Overview of changes leading to 1.2.7
+Monday, May 2, 2016
+====================================
+
+- Blacklist another version of Times New Roman (Bold) Italic from Windows 7.
+- Fix Mongolian Free Variation Selectors shaping with certain fonts.
+- Fix Tibetan shorthand contractions shaping.
+- Improved list of language tag mappings.
+- Unbreak build on Windows CE.
+- Make 'glyf' table loading lazy in hb-ot-font.
+
+
 Overview of changes leading to 1.2.6
 Friday, April 8, 2016
 ====================================
diff --git a/third_party/harfbuzz-ng/README.chromium b/third_party/harfbuzz-ng/README.chromium
index 16577f2..7ba5a08 100644
--- a/third_party/harfbuzz-ng/README.chromium
+++ b/third_party/harfbuzz-ng/README.chromium
@@ -1,8 +1,8 @@
 Name: harfbuzz-ng
 Short Name: harfbuzz-ng
 URL: http://harfbuzz.org
-Version: 1.2.6
-Date: 20160408
+Version: 1.2.7
+Date: 20160502
 Security Critical: yes
 License: MIT
 License File: COPYING
diff --git a/third_party/harfbuzz-ng/harfbuzz.gyp b/third_party/harfbuzz-ng/harfbuzz.gyp
index 2064a26c..335e2d4f 100644
--- a/third_party/harfbuzz-ng/harfbuzz.gyp
+++ b/third_party/harfbuzz-ng/harfbuzz.gyp
@@ -72,6 +72,7 @@
             'src/hb-ot-map-private.hh',
             'src/hb-ot-maxp-table.hh',
             'src/hb-ot-name-table.hh',
+            'src/hb-ot-post-table.hh',
             'src/hb-ot-shape.cc',
             'src/hb-ot-shape-complex-arabic.cc',
             'src/hb-ot-shape-complex-arabic-fallback.hh',
diff --git a/third_party/harfbuzz-ng/src/hb-open-type-private.hh b/third_party/harfbuzz-ng/src/hb-open-type-private.hh
index 80ad687..df683ca 100644
--- a/third_party/harfbuzz-ng/src/hb-open-type-private.hh
+++ b/third_party/harfbuzz-ng/src/hb-open-type-private.hh
@@ -101,7 +101,8 @@
 #define DEFINE_SIZE_STATIC(size) \
   DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size)); \
   static const unsigned int static_size = (size); \
-  static const unsigned int min_size = (size)
+  static const unsigned int min_size = (size); \
+  inline unsigned int get_size (void) const { return (size); }
 
 #define DEFINE_SIZE_UNION(size, _member) \
   DEFINE_INSTANCE_ASSERTION (this->u._member.static_size == (size)); \
@@ -671,6 +672,15 @@
   DEFINE_SIZE_STATIC (2);
 };
 
+/* 32-bit signed fixed-point number (16.16). */
+struct Fixed: LONG
+{
+  //inline float to_float (void) const { return ???; }
+  //inline void set_float (float f) { v.set (f * ???); }
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
 /* Date represented in number of seconds since 12:00 midnight, January 1,
  * 1904. The value is represented as a signed 64-bit integer. */
 struct LONGDATETIME
diff --git a/third_party/harfbuzz-ng/src/hb-ot-font.cc b/third_party/harfbuzz-ng/src/hb-ot-font.cc
index 61c7036..39fc849 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-font.cc
+++ b/third_party/harfbuzz-ng/src/hb-ot-font.cc
@@ -36,6 +36,7 @@
 #include "hb-ot-hhea-table.hh"
 #include "hb-ot-hmtx-table.hh"
 #include "hb-ot-os2-table.hh"
+//#include "hb-ot-post-table.hh"
 
 
 struct hb_ot_face_metrics_accelerator_t
@@ -299,13 +300,54 @@
   }
 };
 
+template <typename T>
+struct hb_lazy_loader_t
+{
+  inline void init (hb_face_t *face_)
+  {
+    face = face_;
+    instance = NULL;
+  }
+
+  inline void fini (void)
+  {
+    if (instance && instance != &OT::Null(T))
+    {
+      instance->fini();
+      free (instance);
+    }
+  }
+
+  inline const T* operator-> (void) const
+  {
+  retry:
+    T *p = (T *) hb_atomic_ptr_get (&instance);
+    if (unlikely (!p))
+    {
+      p = (T *) calloc (1, sizeof (T));
+      if (unlikely (!p))
+        return &OT::Null(T);
+      p->init (face);
+      if (unlikely (!hb_atomic_ptr_cmpexch (const_cast<T **>(&instance), NULL, p)))
+      {
+	p->fini ();
+	goto retry;
+      }
+    }
+    return p;
+  }
+
+  private:
+  hb_face_t *face;
+  T *instance;
+};
 
 struct hb_ot_font_t
 {
   hb_ot_face_cmap_accelerator_t cmap;
   hb_ot_face_metrics_accelerator_t h_metrics;
   hb_ot_face_metrics_accelerator_t v_metrics;
-  hb_ot_face_glyf_accelerator_t glyf;
+  hb_lazy_loader_t<hb_ot_face_glyf_accelerator_t> glyf;
 };
 
 
@@ -389,7 +431,7 @@
 			 void *user_data HB_UNUSED)
 {
   const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
-  bool ret = ot_font->glyf.get_extents (glyph, extents);
+  bool ret = ot_font->glyf->get_extents (glyph, extents);
   extents->x_bearing = font->em_scale_x (extents->x_bearing);
   extents->y_bearing = font->em_scale_y (extents->y_bearing);
   extents->width     = font->em_scale_x (extents->width);
diff --git a/third_party/harfbuzz-ng/src/hb-ot-layout-common-private.hh b/third_party/harfbuzz-ng/src/hb-ot-layout-common-private.hh
index 6c7bac09..34fa1b77 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-layout-common-private.hh
+++ b/third_party/harfbuzz-ng/src/hb-ot-layout-common-private.hh
@@ -770,7 +770,11 @@
     TRACE_SERIALIZE (this);
     if (unlikely (!c->extend_min (*this))) return_trace (false);
 
-    if (unlikely (!num_glyphs)) return_trace (true);
+    if (unlikely (!num_glyphs))
+    {
+      rangeRecord.len.set (0);
+      return_trace (true);
+    }
 
     unsigned int num_ranges = 1;
     for (unsigned int i = 1; i < num_glyphs; i++)
diff --git a/third_party/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh b/third_party/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh
index 691334c..56c5015 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh
+++ b/third_party/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh
@@ -319,7 +319,7 @@
       if (!c->check_glyph_property (&info, lookup_props))
 	return SKIP_YES;
 
-      if (unlikely (_hb_glyph_info_is_default_ignorable (&info) &&
+      if (unlikely (_hb_glyph_info_is_default_ignorable_and_not_fvs (&info) &&
 		    (ignore_zwnj || !_hb_glyph_info_is_zwnj (&info)) &&
 		    (ignore_zwj || !_hb_glyph_info_is_zwj (&info))))
 	return SKIP_MAYBE;
diff --git a/third_party/harfbuzz-ng/src/hb-ot-layout-private.hh b/third_party/harfbuzz-ng/src/hb-ot-layout-private.hh
index b5c670f..778b2c44 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-layout-private.hh
+++ b/third_party/harfbuzz-ng/src/hb-ot-layout-private.hh
@@ -218,23 +218,24 @@
  * - General_Category: 5 bits.
  * - A bit each for:
  *   * Is it Default_Ignorable(); we have a modified Default_Ignorable().
- *   * Is it U+200D ZWJ?
- *   * Is it U+200C ZWNJ?
+ *   * Whether it's one of the three Mongolian Free Variation Selectors.
+ *   * One free bit right now.
  *
  * The high-byte has different meanings, switched by the Gen-Cat:
  * - For Mn,Mc,Me: the modified Combining_Class.
+ * - For Cf: whether it's ZWJ, ZWNJ, or something else.
  * - For Ws: index of which space character this is, if space fallback
  *   is needed, ie. we don't set this by default, only if asked to.
- *
- * If needed, we can use the ZWJ/ZWNJ to use the high byte as well,
- * freeing two more bits.
  */
 
 enum hb_unicode_props_flags_t {
-  UPROPS_MASK_ZWJ       = 0x20u,
-  UPROPS_MASK_ZWNJ      = 0x40u,
-  UPROPS_MASK_IGNORABLE = 0x80u,
-  UPROPS_MASK_GEN_CAT   = 0x1Fu
+  UPROPS_MASK_GEN_CAT	= 0x001Fu,
+  UPROPS_MASK_IGNORABLE	= 0x0020u,
+  UPROPS_MASK_FVS	= 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3 */
+
+  /* If GEN_CAT=FORMAT, top byte masks: */
+  UPROPS_MASK_Cf_ZWJ	= 0x0100u,
+  UPROPS_MASK_Cf_ZWNJ	= 0x0200u
 };
 HB_MARK_AS_FLAG_T (hb_unicode_props_flags_t);
 
@@ -253,8 +254,17 @@
     {
       buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES;
       props |=  UPROPS_MASK_IGNORABLE;
-      if (u == 0x200Cu) props |= UPROPS_MASK_ZWNJ;
-      if (u == 0x200Du) props |= UPROPS_MASK_ZWJ;
+      if (u == 0x200Cu) props |= UPROPS_MASK_Cf_ZWNJ;
+      if (u == 0x200Du) props |= UPROPS_MASK_Cf_ZWJ;
+      /* Mongolian Free Variation Selectors need to be remembered
+       * because although we need to hide them like default-ignorables,
+       * they need to non-ignorable during shaping.  This is similar to
+       * what we do for joiners in Indic-like shapers, but since the
+       * FVSes are GC=Mn, we have use a separate bit to remember them.
+       * Fixes:
+       * https://github.com/behdad/harfbuzz/issues/234
+       */
+      if (unlikely (hb_in_range (u, 0x180Bu, 0x180Du))) props |= UPROPS_MASK_FVS;
     }
     else if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL (gen_cat)))
     {
@@ -350,31 +360,44 @@
 static inline hb_bool_t
 _hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info)
 {
-  return (info->unicode_props() & UPROPS_MASK_IGNORABLE) && !_hb_glyph_info_ligated (info);
+  return (info->unicode_props() & UPROPS_MASK_IGNORABLE) &&
+	 !_hb_glyph_info_ligated (info);
+}
+static inline hb_bool_t
+_hb_glyph_info_is_default_ignorable_and_not_fvs (const hb_glyph_info_t *info)
+{
+  return ((info->unicode_props() & (UPROPS_MASK_IGNORABLE|UPROPS_MASK_FVS))
+	  == UPROPS_MASK_IGNORABLE) &&
+	 !_hb_glyph_info_ligated (info);
 }
 
+static inline bool
+_hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info)
+{
+  return _hb_glyph_info_get_general_category (info) ==
+	 HB_UNICODE_GENERAL_CATEGORY_FORMAT;
+}
 static inline hb_bool_t
 _hb_glyph_info_is_zwnj (const hb_glyph_info_t *info)
 {
-  return !!(info->unicode_props() & UPROPS_MASK_ZWNJ);
+  return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWNJ);
 }
-
 static inline hb_bool_t
 _hb_glyph_info_is_zwj (const hb_glyph_info_t *info)
 {
-  return !!(info->unicode_props() & UPROPS_MASK_ZWJ);
+  return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWJ);
 }
-
 static inline hb_bool_t
 _hb_glyph_info_is_joiner (const hb_glyph_info_t *info)
 {
-  return !!(info->unicode_props() & (UPROPS_MASK_ZWNJ | UPROPS_MASK_ZWJ));
+  return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & (UPROPS_MASK_Cf_ZWNJ|UPROPS_MASK_Cf_ZWJ));
 }
-
 static inline void
 _hb_glyph_info_flip_joiners (hb_glyph_info_t *info)
 {
-  info->unicode_props() ^= UPROPS_MASK_ZWNJ | UPROPS_MASK_ZWJ;
+  if (!_hb_glyph_info_is_unicode_format (info))
+    return;
+  info->unicode_props() ^= UPROPS_MASK_Cf_ZWNJ | UPROPS_MASK_Cf_ZWJ;
 }
 
 /* lig_props: aka lig_id / lig_comp
diff --git a/third_party/harfbuzz-ng/src/hb-ot-layout.cc b/third_party/harfbuzz-ng/src/hb-ot-layout.cc
index 5628ac3..29749bc 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-layout.cc
+++ b/third_party/harfbuzz-ng/src/hb-ot-layout.cc
@@ -70,12 +70,18 @@
     unsigned int gsub_len = hb_blob_get_length (layout->gsub_blob);
     unsigned int gpos_len = hb_blob_get_length (layout->gpos_blob);
     if (0
-      || (442 == gdef_len && 42038 == gpos_len && 2874 == gsub_len) /* Windows 7 timesi.ttf */
-      || (430 == gdef_len && 40662 == gpos_len && 2874 == gsub_len) /* Windows 7 timesbi.ttf */
-      || (442 == gdef_len && 39116 == gpos_len && 2874 == gsub_len) /* Windows ??? timesi.ttf */
-      || (430 == gdef_len && 39374 == gpos_len && 2874 == gsub_len) /* Windows ??? timesbi.ttf */
-      || (490 == gdef_len && 41638 == gpos_len && 3046 == gsub_len) /* OS X 10.11.3 Times New Roman Italic.ttf */
-      || (478 == gdef_len && 41902 == gpos_len && 3046 == gsub_len) /* OS X 10.11.3 Times New Roman Bold Italic.ttf */
+      /* sha1sum:c5ee92f0bca4bfb7d06c4d03e8cf9f9cf75d2e8a Windows 7? timesi.ttf */
+      || (442 == gdef_len && 42038 == gpos_len && 2874 == gsub_len)
+      /* sha1sum:37fc8c16a0894ab7b749e35579856c73c840867b Windows 7? timesbi.ttf */
+      || (430 == gdef_len && 40662 == gpos_len && 2874 == gsub_len)
+      /* sha1sum:19fc45110ea6cd3cdd0a5faca256a3797a069a80 Windows 7 timesi.ttf */
+      || (442 == gdef_len && 39116 == gpos_len && 2874 == gsub_len)
+      /* sha1sum:6d2d3c9ed5b7de87bc84eae0df95ee5232ecde26 Windows 7 timesbi.ttf */
+      || (430 == gdef_len && 39374 == gpos_len && 2874 == gsub_len)
+      /* sha1sum:8583225a8b49667c077b3525333f84af08c6bcd8 OS X 10.11.3 Times New Roman Italic.ttf */
+      || (490 == gdef_len && 41638 == gpos_len && 3046 == gsub_len)
+      /* sha1sum:ec0f5a8751845355b7c3271d11f9918a966cb8c9 OS X 10.11.3 Times New Roman Bold Italic.ttf */
+      || (478 == gdef_len && 41902 == gpos_len && 3046 == gsub_len)
     )
     {
       /* In certain versions of Times New Roman Italic and Bold Italic,
diff --git a/third_party/harfbuzz-ng/src/hb-ot-post-table.hh b/third_party/harfbuzz-ng/src/hb-ot-post-table.hh
new file mode 100644
index 0000000..82ab388
--- /dev/null
+++ b/third_party/harfbuzz-ng/src/hb-ot-post-table.hh
@@ -0,0 +1,119 @@
+/*
+ * Copyright © 2016  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_POST_TABLE_HH
+#define HB_OT_POST_TABLE_HH
+
+#include "hb-open-type-private.hh"
+
+
+namespace OT {
+
+
+/*
+ * post -- PostScript
+ */
+
+#define HB_OT_TAG_post HB_TAG('p','o','s','t')
+
+
+struct postV2Tail
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (numberOfGlyphs.sanitize (c) &&
+		  c->check_array (glyphNameIndex, sizeof (USHORT), numberOfGlyphs));
+  }
+
+  USHORT	numberOfGlyphs;		/* Number of glyphs (this should be the
+					 * same as numGlyphs in 'maxp' table). */
+  USHORT	glyphNameIndex[VAR];	/* This is not an offset, but is the
+					 * ordinal number of the glyph in 'post'
+					 * string tables. */
+  BYTE		namesX[VAR];		/* Glyph names with length bytes [variable]
+					 * (a Pascal string). */
+
+  DEFINE_SIZE_ARRAY2 (2, glyphNameIndex, namesX);
+};
+
+struct post
+{
+  static const hb_tag_t tableTag = HB_OT_TAG_post;
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!c->check_struct (this)))
+      return_trace (false);
+    if (version.to_int () == 0x00020000)
+    {
+      const postV2Tail &v2 = StructAfter<postV2Tail>(*this);
+      return_trace (v2.sanitize (c));
+    }
+    return_trace (true);
+  }
+
+  public:
+  FixedVersion<>version;		/* 0x00010000 for version 1.0
+					 * 0x00020000 for version 2.0
+					 * 0x00025000 for version 2.5 (deprecated)
+					 * 0x00030000 for version 3.0 */
+  Fixed		italicAngle;		/* Italic angle in counter-clockwise degrees
+					 * from the vertical. Zero for upright text,
+					 * negative for text that leans to the right
+					 * (forward). */
+  FWORD		underlinePosition;	/* This is the suggested distance of the top
+					 * of the underline from the baseline
+					 * (negative values indicate below baseline).
+					 * The PostScript definition of this FontInfo
+					 * dictionary key (the y coordinate of the
+					 * center of the stroke) is not used for
+					 * historical reasons. The value of the
+					 * PostScript key may be calculated by
+					 * subtracting half the underlineThickness
+					 * from the value of this field. */
+  FWORD		underlineThickness;	/* Suggested values for the underline
+					   thickness. */
+  ULONG		isFixedPitch;		/* Set to 0 if the font is proportionally
+					 * spaced, non-zero if the font is not
+					 * proportionally spaced (i.e. monospaced). */
+  ULONG		minMemType42;		/* Minimum memory usage when an OpenType font
+					 * is downloaded. */
+  ULONG		maxMemType42;		/* Maximum memory usage when an OpenType font
+					 * is downloaded. */
+  ULONG		minMemType1;		/* Minimum memory usage when an OpenType font
+					 * is downloaded as a Type 1 font. */
+  ULONG		maxMemType1;		/* Maximum memory usage when an OpenType font
+					 * is downloaded as a Type 1 font. */
+/*postV2Tail	v2[VAR];*/
+  DEFINE_SIZE_STATIC (32);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_POST_TABLE_HH */
diff --git a/third_party/harfbuzz-ng/src/hb-ot-tag.cc b/third_party/harfbuzz-ng/src/hb-ot-tag.cc
index 9a6a120..04835576d 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-tag.cc
+++ b/third_party/harfbuzz-ng/src/hb-ot-tag.cc
@@ -186,14 +186,18 @@
   {"aa",	HB_TAG('A','F','R',' ')},	/* Afar */
   {"ab",	HB_TAG('A','B','K',' ')},	/* Abkhazian */
   {"abq",	HB_TAG('A','B','A',' ')},	/* Abaza */
+  {"acf",	HB_TAG('F','A','N',' ')},	/* French Antillean */
   {"ach",	HB_TAG('A','C','H',' ')},	/* Acoli */
+  {"acr",	HB_TAG('A','C','R',' ')},	/* Achi */
   {"ada",	HB_TAG('D','N','G',' ')},	/* Dangme */
   {"ady",	HB_TAG('A','D','Y',' ')},	/* Adyghe */
   {"af",	HB_TAG('A','F','K',' ')},	/* Afrikaans */
+  {"ahg",	HB_TAG('A','G','W',' ')},	/* Agaw */
   {"aii",	HB_TAG('S','W','A',' ')},	/* Swadaya Aramaic */
   {"aio",	HB_TAG('A','I','O',' ')},	/* Aiton */
   {"aiw",	HB_TAG('A','R','I',' ')},	/* Aari */
   {"ak",	HB_TAG('T','W','I',' ')},	/* Akan [macrolanguage] */
+  {"aka",	HB_TAG('A','K','A',' ')},	/* Akan */
   {"alt",	HB_TAG('A','L','T',' ')},	/* [Southern] Altai */
   {"am",	HB_TAG('A','M','H',' ')},	/* Amharic */
   {"amf",	HB_TAG('H','B','N',' ')},	/* Hammer-Banna */
@@ -206,6 +210,7 @@
   {"as",	HB_TAG('A','S','M',' ')},	/* Assamese */
   {"ast",	HB_TAG('A','S','T',' ')},	/* Asturian/Asturleonese/Bable/Leonese */
   {"ath",	HB_TAG('A','T','H',' ')},	/* Athapaskan [family] */
+  {"atj",	HB_TAG('R','C','R',' ')},	/* R-Cree */
   {"atv",	HB_TAG('A','L','T',' ')},	/* [Northern] Altai */
   {"av",	HB_TAG('A','V','R',' ')},	/* Avaric */
   {"awa",	HB_TAG('A','W','A',' ')},	/* Awadhi */
@@ -214,6 +219,7 @@
   {"azb",	HB_TAG('A','Z','B',' ')},	/* South Azerbaijani */
   {"azj",	HB_TAG('A','Z','E',' ')},	/* North Azerbaijani */
   {"ba",	HB_TAG('B','S','H',' ')},	/* Bashkir */
+  {"bad",	HB_TAG('B','A','D','0')},	/* Banda */
   {"bai",	HB_TAG('B','M','L',' ')},	/* Bamileke [family] */
   {"bal",	HB_TAG('B','L','I',' ')},	/* Baluchi [macrolangauge] */
   {"ban",	HB_TAG('B','A','N',' ')},	/* Balinese */
@@ -222,11 +228,13 @@
   {"bci",	HB_TAG('B','A','U',' ')},	/* Baoulé */
   {"bcl",	HB_TAG('B','I','K',' ')},	/* Central Bikol */
   {"bcq",	HB_TAG('B','C','H',' ')},	/* Bench */
+  {"bdy",	HB_TAG('B','D','Y',' ')},	/* Bandjalang */
   {"be",	HB_TAG('B','E','L',' ')},	/* Belarusian */
   {"bem",	HB_TAG('B','E','M',' ')},	/* Bemba (Zambia) */
   {"ber",	HB_TAG('B','E','R',' ')},	/* Berber [family] */
   {"bfq",	HB_TAG('B','A','D',' ')},	/* Badaga */
   {"bft",	HB_TAG('B','L','T',' ')},	/* Balti */
+  {"bfu",	HB_TAG('L','A','H',' ')},	/* Lahuli */
   {"bfy",	HB_TAG('B','A','G',' ')},	/* Baghelkhandi */
   {"bg",	HB_TAG('B','G','R',' ')},	/* Bulgarian */
   {"bgc",	HB_TAG('B','G','C',' ')},	/* Haryanvi */
@@ -260,11 +268,13 @@
   {"bxr",	HB_TAG('R','B','U',' ')},	/* Russian Buriat */
   {"byn",	HB_TAG('B','I','L',' ')},	/* Bilen */
   {"ca",	HB_TAG('C','A','T',' ')},	/* Catalan */
+  {"cak",	HB_TAG('C','A','K',' ')},	/* Kaqchikel */
   {"cbk",	HB_TAG('C','B','K',' ')},	/* Chavacano */
   {"ce",	HB_TAG('C','H','E',' ')},	/* Chechen */
   {"ceb",	HB_TAG('C','E','B',' ')},	/* Cebuano */
   {"cgg",	HB_TAG('C','G','G',' ')},	/* Chiga */
   {"ch",	HB_TAG('C','H','A',' ')},	/* Chamorro */
+  {"chk",	HB_TAG('C','H','K','0')},	/* Chuukese */
   {"cho",	HB_TAG('C','H','O',' ')},	/* Choctaw */
   {"chp",	HB_TAG('C','H','P',' ')},	/* Chipewyan */
   {"chr",	HB_TAG('C','H','R',' ')},	/* Cherokee */
@@ -272,9 +282,12 @@
   {"ckb",	HB_TAG('K','U','R',' ')},	/* Central Kurdish (Sorani) */
   {"ckt",	HB_TAG('C','H','K',' ')},	/* Chukchi */
   {"cop",	HB_TAG('C','O','P',' ')},	/* Coptic */
+  {"cpp",	HB_TAG('C','P','P',' ')},	/* Creoles */
   {"cr",	HB_TAG('C','R','E',' ')},	/* Cree */
+  {"cre",	HB_TAG('Y','C','R',' ')},	/* Y-Cree */
   {"crh",	HB_TAG('C','R','T',' ')},	/* Crimean Tatar */
   {"crj",	HB_TAG('E','C','R',' ')},	/* [Southern] East Cree */
+  {"crk",	HB_TAG('W','C','R',' ')},	/* West-Cree */
   {"crl",	HB_TAG('E','C','R',' ')},	/* [Northern] East Cree */
   {"crm",	HB_TAG('M','C','R',' ')},	/* Moose Cree */
   {"crx",	HB_TAG('C','R','R',' ')},	/* Carrier */
@@ -283,21 +296,27 @@
   {"ctg",	HB_TAG('C','T','G',' ')},	/* Chittagonian */
   {"cts",	HB_TAG('B','I','K',' ')},	/* Northern Catanduanes Bikol */
   {"cu",	HB_TAG('C','S','L',' ')},	/* Church Slavic */
+  {"cuk",	HB_TAG('C','U','K',' ')},	/* San Blas Kuna */
   {"cv",	HB_TAG('C','H','U',' ')},	/* Chuvash */
   {"cwd",	HB_TAG('D','C','R',' ')},	/* Woods Cree */
   {"cy",	HB_TAG('W','E','L',' ')},	/* Welsh */
   {"da",	HB_TAG('D','A','N',' ')},	/* Danish */
   {"dap",	HB_TAG('N','I','S',' ')},	/* Nisi (India) */
   {"dar",	HB_TAG('D','A','R',' ')},	/* Dargwa */
+  {"dax",	HB_TAG('D','A','X',' ')},	/* Dayi */
   {"de",	HB_TAG('D','E','U',' ')},	/* German */
   {"dgo",	HB_TAG('D','G','O',' ')},	/* Dogri */
   {"dhd",	HB_TAG('M','A','W',' ')},	/* Dhundari */
+  {"dhg",	HB_TAG('D','H','G',' ')},	/* Dhangu */
   {"din",	HB_TAG('D','N','K',' ')},	/* Dinka [macrolanguage] */
   {"diq",	HB_TAG('D','I','Q',' ')},	/* Dimli */
   {"dje",	HB_TAG('D','J','R',' ')},	/* Zarma */
+  {"djr",	HB_TAG('D','J','R','0')},	/* Djambarrpuyngu */
   {"dng",	HB_TAG('D','U','N',' ')},	/* Dungan */
+  {"dnj",	HB_TAG('D','N','J',' ')},	/* Dan */
   {"doi",	HB_TAG('D','G','R',' ')},	/* Dogri [macrolanguage] */
   {"dsb",	HB_TAG('L','S','B',' ')},	/* Lower Sorbian */
+  {"duj",	HB_TAG('D','U','J',' ')},	/* Dhuwal */
   {"dv",	HB_TAG('D','I','V',' ')},	/* Dhivehi/Divehi/Maldivian */
   {"dyu",	HB_TAG('J','U','L',' ')},	/* Jula */
   {"dz",	HB_TAG('D','Z','N',' ')},	/* Dzongkha */
@@ -307,23 +326,30 @@
   {"el",	HB_TAG('E','L','L',' ')},	/* Modern Greek (1453-) */
   {"emk",	HB_TAG('M','N','K',' ')},	/* Eastern Maninkakan */
   {"en",	HB_TAG('E','N','G',' ')},	/* English */
+  {"enf",	HB_TAG('F','N','E',' ')},	/* Forest Nenets */
+  {"enh",	HB_TAG('T','N','E',' ')},	/* Tundra Nenets */
   {"eo",	HB_TAG('N','T','O',' ')},	/* Esperanto */
   {"eot",	HB_TAG('B','T','I',' ')},	/* Beti (Côte d'Ivoire) */
   {"es",	HB_TAG('E','S','P',' ')},	/* Spanish */
+  {"esu",	HB_TAG('E','S','U',' ')},	/* Central Yupik */
   {"et",	HB_TAG('E','T','I',' ')},	/* Estonian [macrolanguage] */
   {"eu",	HB_TAG('E','U','Q',' ')},	/* Basque */
   {"eve",	HB_TAG('E','V','N',' ')},	/* Even */
   {"evn",	HB_TAG('E','V','K',' ')},	/* Evenki */
   {"fa",	HB_TAG('F','A','R',' ')},	/* Persian [macrolanguage] */
+  {"fan",	HB_TAG('F','A','N','0')},	/* Fang */
+  {"fat",	HB_TAG('F','A','T',' ')},	/* Fanti */
   {"ff",	HB_TAG('F','U','L',' ')},	/* Fulah [macrolanguage] */
   {"fi",	HB_TAG('F','I','N',' ')},	/* Finnish */
   {"fil",	HB_TAG('P','I','L',' ')},	/* Filipino */
   {"fj",	HB_TAG('F','J','I',' ')},	/* Fijian */
+  {"flm",	HB_TAG('H','A','L',' ')},	/* Halam */
   {"fo",	HB_TAG('F','O','S',' ')},	/* Faroese */
   {"fon",	HB_TAG('F','O','N',' ')},	/* Fon */
   {"fr",	HB_TAG('F','R','A',' ')},	/* French */
   {"frc",	HB_TAG('F','R','C',' ')},	/* Cajun French */
   {"frp",	HB_TAG('F','R','P',' ')},	/* Arpitan/Francoprovençal */
+  {"fuf",	HB_TAG('F','T','A',' ')},	/* Futa */
   {"fur",	HB_TAG('F','R','L',' ')},	/* Friulian */
   {"fuv",	HB_TAG('F','U','V',' ')},	/* Nigerian Fulfulde */
   {"fy",	HB_TAG('F','R','I',' ')},	/* Western Frisian */
@@ -334,17 +360,24 @@
   {"gd",	HB_TAG('G','A','E',' ')},	/* Scottish Gaelic */
   {"gez",	HB_TAG('G','E','Z',' ')},	/* Ge'ez */
   {"ggo",	HB_TAG('G','O','N',' ')},	/* Southern Gondi */
+  {"gih",	HB_TAG('G','I','H',' ')},	/* Githabul */
+  {"gil",	HB_TAG('G','I','L','0')},	/* Kiribati (Gilbertese) */
+  {"gkp",	HB_TAG('G','K','P',' ')},	/* Kpelle (Guinea) */
   {"gl",	HB_TAG('G','A','L',' ')},	/* Galician */
   {"gld",	HB_TAG('N','A','N',' ')},	/* Nanai */
+  {"gle",	HB_TAG('I','R','T',' ')},	/* Irish Traditional */
   {"glk",	HB_TAG('G','L','K',' ')},	/* Gilaki */
   {"gn",	HB_TAG('G','U','A',' ')},	/* Guarani [macrolanguage] */
+  {"gnn",	HB_TAG('G','N','N',' ')},	/* Gumatj */
   {"gno",	HB_TAG('G','O','N',' ')},	/* Northern Gondi */
   {"gog",	HB_TAG('G','O','G',' ')},	/* Gogo */
   {"gon",	HB_TAG('G','O','N',' ')},	/* Gondi [macrolanguage] */
   {"grt",	HB_TAG('G','R','O',' ')},	/* Garo */
   {"gru",	HB_TAG('S','O','G',' ')},	/* Sodo Gurage */
+  {"gsw",	HB_TAG('A','L','S',' ')},	/* Alsatian */
   {"gu",	HB_TAG('G','U','J',' ')},	/* Gujarati */
   {"guc",	HB_TAG('G','U','C',' ')},	/* Wayuu */
+  {"guf",	HB_TAG('G','U','F',' ')},	/* Gupapuyngu */
   {"guk",	HB_TAG('G','M','Z',' ')},	/* Gumuz */
 /*{"guk",	HB_TAG('G','U','K',' ')},*/	/* Gumuz (in SIL fonts) */
   {"guz",	HB_TAG('G','U','Z',' ')},	/* Ekegusii/Gusii */
@@ -357,6 +390,7 @@
   {"he",	HB_TAG('I','W','R',' ')},	/* Hebrew */
   {"hi",	HB_TAG('H','I','N',' ')},	/* Hindi */
   {"hil",	HB_TAG('H','I','L',' ')},	/* Hiligaynon */
+  {"hmn",	HB_TAG('H','M','N',' ')},	/* Hmong */
   {"hnd",	HB_TAG('H','N','D',' ')},	/* [Southern] Hindko */
   {"hne",	HB_TAG('C','H','H',' ')},	/* Chattisgarhi */
   {"hno",	HB_TAG('H','N','D',' ')},	/* [Northern] Hindko */
@@ -370,11 +404,13 @@
   {"hy",	HB_TAG('H','Y','E',' ')},	/* Armenian */
   {"hz",	HB_TAG('H','E','R',' ')},	/* Herero */
   {"ia",	HB_TAG('I','N','A',' ')},	/* Interlingua (International Auxiliary Language Association) */
+  {"iba",	HB_TAG('I','B','A',' ')},	/* Iban */
   {"ibb",	HB_TAG('I','B','B',' ')},	/* Ibibio */
   {"id",	HB_TAG('I','N','D',' ')},	/* Indonesian */
   {"ie",	HB_TAG('I','L','E',' ')},	/* Interlingue/Occidental */
   {"ig",	HB_TAG('I','B','O',' ')},	/* Igbo */
   {"igb",	HB_TAG('E','B','I',' ')},	/* Ebira */
+  {"ii",	HB_TAG('Y','I','M',' ')},	/* Yi Modern */
   {"ijc",	HB_TAG('I','J','O',' ')},	/* Izon */
   {"ijo",	HB_TAG('I','J','O',' ')},	/* Ijo [family] */
   {"ik",	HB_TAG('I','P','K',' ')},	/* Inupiaq [macrolanguage] */
@@ -390,15 +426,20 @@
   {"jv",	HB_TAG('J','A','V',' ')},	/* Javanese */
   {"ka",	HB_TAG('K','A','T',' ')},	/* Georgian */
   {"kaa",	HB_TAG('K','R','K',' ')},	/* Karakalpak */
-  {"kab",	HB_TAG('K','A','B',' ')},	/* Kabyle */
+  {"kab",	HB_TAG('K','A','B','0')},	/* Kabyle */
   {"kam",	HB_TAG('K','M','B',' ')},	/* Kamba (Kenya) */
   {"kar",	HB_TAG('K','R','N',' ')},	/* Karen [family] */
+  {"kat",	HB_TAG('K','G','E',' ')},	/* Khutsuri Georgian */
   {"kbd",	HB_TAG('K','A','B',' ')},	/* Kabardian */
   {"kde",	HB_TAG('K','D','E',' ')},	/* Makonde */
   {"kdr",	HB_TAG('K','R','M',' ')},	/* Karaim */
   {"kdt",	HB_TAG('K','U','Y',' ')},	/* Kuy */
+  {"kea",	HB_TAG('K','E','A',' ')},	/* Kabuverdianu (Crioulo) */
+  {"kek",	HB_TAG('K','E','K',' ')},	/* Kekchi */
   {"kex",	HB_TAG('K','K','N',' ')},	/* Kokni */
+  {"kfa",	HB_TAG('K','O','D',' ')},	/* Kodagu */
   {"kfr",	HB_TAG('K','A','C',' ')},	/* Kachchi */
+  {"kfx",	HB_TAG('K','U','L',' ')},	/* Kulvi */
   {"kfy",	HB_TAG('K','M','N',' ')},	/* Kumaoni */
   {"kg",	HB_TAG('K','O','N',' ')},	/* Kongo [macrolanguage] */
   {"kha",	HB_TAG('K','S','I',' ')},	/* Khasi */
@@ -407,7 +448,9 @@
 /*{"kht",	HB_TAG('K','H','T',' ')},*/	/* Khamti (OpenType spec and SIL fonts) */
   {"khw",	HB_TAG('K','H','W',' ')},	/* Khowar */
   {"ki",	HB_TAG('K','I','K',' ')},	/* Gikuyu/Kikuyu */
+  {"kiu",	HB_TAG('K','I','U',' ')},	/* Kirmanjki */
   {"kj",	HB_TAG('K','U','A',' ')},	/* Kuanyama/Kwanyama */
+  {"kjd",	HB_TAG('K','J','D',' ')},	/* Southern Kiwai */
   {"kjh",	HB_TAG('K','H','A',' ')},	/* Khakass */
   {"kjp",	HB_TAG('K','J','P',' ')},	/* Pwo Eastern Karen */
   {"kk",	HB_TAG('K','A','Z',' ')},	/* Kazakh */
@@ -421,6 +464,8 @@
   {"ko",	HB_TAG('K','O','R',' ')},	/* Korean */
   {"koi",	HB_TAG('K','O','P',' ')},	/* Komi-Permyak */
   {"kok",	HB_TAG('K','O','K',' ')},	/* Konkani [macrolanguage] */
+  {"kon",	HB_TAG('K','O','N','0')},	/* Kongo */
+  {"kos",	HB_TAG('K','O','S',' ')},	/* Kosraean */
   {"kpe",	HB_TAG('K','P','L',' ')},	/* Kpelle [macrolanguage] */
   {"kpv",	HB_TAG('K','O','Z',' ')},	/* Komi-Zyrian */
   {"kpy",	HB_TAG('K','Y','K',' ')},	/* Koryak */
@@ -430,9 +475,11 @@
   {"krl",	HB_TAG('K','R','L',' ')},	/* Karelian */
   {"kru",	HB_TAG('K','U','U',' ')},	/* Kurukh */
   {"ks",	HB_TAG('K','S','H',' ')},	/* Kashmiri */
-  {"ksh",	HB_TAG('K','S','H',' ')},	/* Kölsch */
+  {"ksh",	HB_TAG('K','S','H','0')},	/* Ripuarian, Kölsch */
 /*{"ksw",	HB_TAG('K','R','N',' ')},*/	/* S'gaw Karen (Microsoft fonts?) */
   {"ksw",	HB_TAG('K','S','W',' ')},	/* S'gaw Karen (OpenType spec and SIL fonts) */
+  {"ktb",	HB_TAG('K','E','B',' ')},	/* Kebena */
+  {"ktu",	HB_TAG('K','O','N',' ')},	/* Kikongo */
   {"ku",	HB_TAG('K','U','R',' ')},	/* Kurdish [macrolanguage] */
   {"kum",	HB_TAG('K','U','M',' ')},	/* Kumyk */
   {"kv",	HB_TAG('K','O','M',' ')},	/* Komi [macrolanguage] */
@@ -460,6 +507,7 @@
   {"lmo",	HB_TAG('L','M','O',' ')},	/* Lombard */
   {"ln",	HB_TAG('L','I','N',' ')},	/* Lingala */
   {"lo",	HB_TAG('L','A','O',' ')},	/* Lao */
+  {"lom",	HB_TAG('L','O','M',' ')},	/* Loma */
   {"lrc",	HB_TAG('L','R','C',' ')},	/* Northern Luri */
   {"lt",	HB_TAG('L','T','H',' ')},	/* Lithuanian */
   {"lu",	HB_TAG('L','U','B',' ')},	/* Luba-Katanga */
@@ -474,6 +522,8 @@
   {"mag",	HB_TAG('M','A','G',' ')},	/* Magahi */
   {"mai",	HB_TAG('M','T','H',' ')},	/* Maithili */
   {"mak",	HB_TAG('M','K','R',' ')},	/* Makasar */
+  {"mal",	HB_TAG('M','A','L',' ')},	/* Malayalam */
+  {"mam",	HB_TAG('M','A','M',' ')},	/* Mam */
   {"man",	HB_TAG('M','N','K',' ')},	/* Manding/Mandingo [macrolanguage] */
   {"mdc",	HB_TAG('M','L','E',' ')},	/* Male (Papua New Guinea) */
   {"mdf",	HB_TAG('M','O','K',' ')},	/* Moksha */
@@ -516,6 +566,7 @@
   {"mww",	HB_TAG('M','W','W',' ')},	/* Hmong Daw */
   {"my",	HB_TAG('B','R','M',' ')},	/* Burmese */
   {"mym",	HB_TAG('M','E','N',' ')},	/* Me'en */
+  {"myn",	HB_TAG('M','Y','N',' ')},	/* Mayan */
   {"myq",	HB_TAG('M','N','K',' ')},	/* Forest Maninka (retired code) */
   {"myv",	HB_TAG('E','R','Z',' ')},	/* Erzya */
   {"mzn",	HB_TAG('M','Z','N',' ')},	/* Mazanderani */
@@ -533,6 +584,7 @@
   {"ng",	HB_TAG('N','D','G',' ')},	/* Ndonga */
   {"nga",	HB_TAG('N','G','A',' ')},	/* Ngabaka */
   {"ngl",	HB_TAG('L','M','W',' ')},	/* Lomwe */
+  {"ngo",	HB_TAG('S','X','T',' ')},	/* Sutu */
   {"niu",	HB_TAG('N','I','U',' ')},	/* Niuean */
   {"niv",	HB_TAG('G','I','L',' ')},	/* Gilyak */
   {"nl",	HB_TAG('N','L','D',' ')},	/* Dutch */
@@ -553,13 +605,15 @@
   {"oc",	HB_TAG('O','C','I',' ')},	/* Occitan (post 1500) */
   {"oj",	HB_TAG('O','J','B',' ')},	/* Ojibwa [macrolanguage] */
   {"ojs",	HB_TAG('O','C','R',' ')},	/* Oji-Cree */
+  {"okm",	HB_TAG('K','O','H',' ')},	/* Korean Old Hangul */
   {"om",	HB_TAG('O','R','O',' ')},	/* Oromo [macrolanguage] */
   {"or",	HB_TAG('O','R','I',' ')},	/* Oriya */
   {"os",	HB_TAG('O','S','S',' ')},	/* Ossetian */
   {"pa",	HB_TAG('P','A','N',' ')},	/* Panjabi */
   {"pag",	HB_TAG('P','A','G',' ')},	/* Pangasinan */
   {"pam",	HB_TAG('P','A','M',' ')},	/* Kapampangan/Pampanga */
-  {"pap",	HB_TAG('P','A','P',' ')},	/* Papiamento */
+  {"pap",	HB_TAG('P','A','P','0')},	/* Papiamento */
+  {"pau",	HB_TAG('P','A','U',' ')},	/* Palauan */
   {"pcc",	HB_TAG('P','C','C',' ')},	/* Bouyei */
   {"pcd",	HB_TAG('P','C','D',' ')},	/* Picard */
   {"pce",	HB_TAG('P','L','G',' ')},	/* [Ruching] Palaung */
@@ -573,24 +627,34 @@
   {"plp",	HB_TAG('P','A','P',' ')},	/* Palpa */
   {"pms",	HB_TAG('P','M','S',' ')},	/* Piemontese */
   {"pnb",	HB_TAG('P','N','B',' ')},	/* Western Panjabi */
+  {"poh",	HB_TAG('P','O','H',' ')},	/* Pocomchi */
+  {"pon",	HB_TAG('P','O','N',' ')},	/* Pohnpeian */
   {"prs",	HB_TAG('D','R','I',' ')},	/* Afghan Persian/Dari */
   {"ps",	HB_TAG('P','A','S',' ')},	/* Pashto/Pushto [macrolanguage] */
   {"pt",	HB_TAG('P','T','G',' ')},	/* Portuguese */
   {"pwo",	HB_TAG('P','W','O',' ')},	/* Pwo Western Karen */
   {"qu",	HB_TAG('Q','U','Z',' ')},	/* Quechua [macrolanguage] */
   {"quc",	HB_TAG('Q','U','C',' ')},	/* K'iche'/Quiché */
+  {"quh",	HB_TAG('Q','U','H',' ')},	/* Quechua (Bolivia) */
   {"quz",	HB_TAG('Q','U','Z',' ')},	/* Cusco Quechua */
+  {"qvi",	HB_TAG('Q','V','I',' ')},	/* Quechua (Ecuador) */
+  {"qwh",	HB_TAG('Q','W','H',' ')},	/* Quechua (Peru) */
   {"raj",	HB_TAG('R','A','J',' ')},	/* Rajasthani [macrolanguage] */
+  {"rar",	HB_TAG('R','A','R',' ')},	/* Rarotongan */
   {"rbb",	HB_TAG('P','L','G',' ')},	/* Rumai Palaung */
   {"rej",	HB_TAG('R','E','J',' ')},	/* Rejang */
   {"ria",	HB_TAG('R','I','A',' ')},	/* Riang (India) */
+  {"rif",	HB_TAG('R','I','F',' ')},	/* Tarifit */
   {"ril",	HB_TAG('R','I','A',' ')},	/* Riang (Myanmar) */
+  {"rit",	HB_TAG('R','I','T',' ')},	/* Ritarungo */
   {"rki",	HB_TAG('A','R','K',' ')},	/* Rakhine */
+  {"rkw",	HB_TAG('R','K','W',' ')},	/* Arakwal */
   {"rm",	HB_TAG('R','M','S',' ')},	/* Romansh */
   {"rmy",	HB_TAG('R','M','Y',' ')},	/* Vlax Romani */
   {"rn",	HB_TAG('R','U','N',' ')},	/* Rundi */
   {"ro",	HB_TAG('R','O','M',' ')},	/* Romanian */
   {"rom",	HB_TAG('R','O','Y',' ')},	/* Romany [macrolanguage] */
+  {"rtm",	HB_TAG('R','T','M',' ')},	/* Rotuman */
   {"ru",	HB_TAG('R','U','S',' ')},	/* Russian */
   {"rue",	HB_TAG('R','S','Y',' ')},	/* Rusyn */
   {"rup",	HB_TAG('R','U','P',' ')},	/* Aromanian/Arumanian/Macedo-Romanian */
@@ -598,6 +662,7 @@
   {"rwr",	HB_TAG('M','A','W',' ')},	/* Marwari (India) */
   {"sa",	HB_TAG('S','A','N',' ')},	/* Sanskrit */
   {"sah",	HB_TAG('Y','A','K',' ')},	/* Yakut */
+  {"sam",	HB_TAG('P','A','A',' ')},	/* Palestinian Aramaic */
   {"sas",	HB_TAG('S','A','S',' ')},	/* Sasak */
   {"sat",	HB_TAG('S','A','T',' ')},	/* Santali */
   {"sc",	HB_TAG('S','R','D',' ')},	/* Sardinian [macrolanguage] */
@@ -614,6 +679,7 @@
   {"sgs",	HB_TAG('S','G','S',' ')},	/* Samogitian */
   {"sgw",	HB_TAG('C','H','G',' ')},	/* Sebat Bet Gurage */
 /*{"sgw",	HB_TAG('S','G','W',' ')},*/	/* Sebat Bet Gurage (in SIL fonts) */
+  {"shi",	HB_TAG('S','H','I',' ')},	/* Tachelhit */
   {"shn",	HB_TAG('S','H','N',' ')},	/* Shan */
   {"si",	HB_TAG('S','N','H',' ')},	/* Sinhala */
   {"sid",	HB_TAG('S','I','D',' ')},	/* Sidamo */
@@ -626,7 +692,7 @@
   {"smj",	HB_TAG('L','S','M',' ')},	/* Lule Sami */
   {"smn",	HB_TAG('I','S','M',' ')},	/* Inari Sami */
   {"sms",	HB_TAG('S','K','S',' ')},	/* Skolt Sami */
-  {"sn",	HB_TAG('S','N','A',' ')},	/* Shona */
+  {"sn",	HB_TAG('S','N','A','0')},	/* Shona */
   {"snk",	HB_TAG('S','N','K',' ')},	/* Soninke */
   {"so",	HB_TAG('S','M','L',' ')},	/* Somali */
   {"sop",	HB_TAG('S','O','P',' ')},	/* Songe */
@@ -664,20 +730,24 @@
   {"tiv",	HB_TAG('T','I','V',' ')},	/* Tiv */
   {"tk",	HB_TAG('T','K','M',' ')},	/* Turkmen */
   {"tl",	HB_TAG('T','G','L',' ')},	/* Tagalog */
-  {"tmh",	HB_TAG('t','m','h',' ')},	/* Tamashek [macrolanguage] */
+  {"tmh",	HB_TAG('T','M','H',' ')},	/* Tamashek */
   {"tn",	HB_TAG('T','N','A',' ')},	/* Tswana */
   {"to",	HB_TAG('T','G','N',' ')},	/* Tonga (Tonga Islands) */
+  {"tod",	HB_TAG('T','O','D','0')},	/* Toma */
+  {"toi",	HB_TAG('T','N','G',' ')},	/* Tonga */
   {"tpi",	HB_TAG('T','P','I',' ')},	/* Tok Pisin */
   {"tr",	HB_TAG('T','R','K',' ')},	/* Turkish */
   {"tru",	HB_TAG('T','U','A',' ')},	/* Turoyo Aramaic */
   {"ts",	HB_TAG('T','S','G',' ')},	/* Tsonga */
   {"tt",	HB_TAG('T','A','T',' ')},	/* Tatar */
   {"tum",	HB_TAG('T','U','M',' ')},	/* Tumbuka */
+  {"tvl",	HB_TAG('T','V','L',' ')},	/* Tuvalu */
   {"tw",	HB_TAG('T','W','I',' ')},	/* Twi */
   {"ty",	HB_TAG('T','H','T',' ')},	/* Tahitian */
   {"tyv",	HB_TAG('T','U','V',' ')},	/* Tuvin */
   {"tyz",	HB_TAG('T','Y','Z',' ')},	/* Tày */
   {"tzm",	HB_TAG('T','Z','M',' ')},	/* Central Atlas Tamazight */
+  {"tzo",	HB_TAG('T','Z','O',' ')},	/* Tzotzil */
   {"udm",	HB_TAG('U','D','M',' ')},	/* Udmurt */
   {"ug",	HB_TAG('U','Y','G',' ')},	/* Uighur */
   {"uk",	HB_TAG('U','K','R',' ')},	/* Ukrainian */
@@ -703,68 +773,56 @@
   {"wry",	HB_TAG('M','A','W',' ')},	/* Merwari */
   {"wtm",	HB_TAG('W','T','M',' ')},	/* Mewati */
   {"xal",	HB_TAG('K','L','M',' ')},	/* Kalmyk */
+  {"xan",	HB_TAG('S','E','K',' ')},	/* Sekota */
   {"xh",	HB_TAG('X','H','S',' ')},	/* Xhosa */
+  {"xjb",	HB_TAG('X','J','B',' ')},	/* Minjangbal */
   {"xog",	HB_TAG('X','O','G',' ')},	/* Soga */
   {"xom",	HB_TAG('K','M','O',' ')},	/* Komo (Sudan) */
+  {"xpe",	HB_TAG('X','P','E',' ')},	/* Kpelle (Liberia) */
   {"xsl",	HB_TAG('S','S','L',' ')},	/* South Slavey */
   {"xst",	HB_TAG('S','I','G',' ')},	/* Silt'e (retired code) */
   {"xwo",	HB_TAG('T','O','D',' ')},	/* Written Oirat (Todo) */
   {"yao",	HB_TAG('Y','A','O',' ')},	/* Yao */
+  {"yap",	HB_TAG('Y','A','P',' ')},	/* Yapese */
   {"yi",	HB_TAG('J','I','I',' ')},	/* Yiddish [macrolanguage] */
   {"yo",	HB_TAG('Y','B','A',' ')},	/* Yoruba */
   {"yso",	HB_TAG('N','I','S',' ')},	/* Nisi (China) */
   {"za",	HB_TAG('Z','H','A',' ')},	/* Chuang/Zhuang [macrolanguage] */
   {"zea",	HB_TAG('Z','E','A',' ')},	/* Zeeuws */
+  {"zgh",	HB_TAG('Z','G','H',' ')},	/* Standard Morrocan Tamazigh */
   {"zne",	HB_TAG('Z','N','D',' ')},	/* Zande */
   {"zu",	HB_TAG('Z','U','L',' ')}, 	/* Zulu */
-  {"zum",	HB_TAG('L','R','C',' ')}	/* Kumzari */
+  {"zum",	HB_TAG('L','R','C',' ')},	/* Kumzari */
+  {"zza",	HB_TAG('Z','Z','A',' ')},	/* Zazaki */
 
   /* The corresponding languages IDs for the following IDs are unclear,
    * overlap, or are architecturally weird. Needs more research. */
 
-/*{"ahg/awn/xan?",	HB_TAG('A','G','W',' ')},*/	/* Agaw */
-/*{"gsw?/gsw-FR?",	HB_TAG('A','L','S',' ')},*/	/* Alsatian */
+/*{"chp",	HB_TAG('S','A','Y',' ')},*/	/* Sayisi */
+/*{"cwd",	HB_TAG('T','C','R',' ')},*/	/* TH-Cree */
+/*{"emk",	HB_TAG('E','M','K',' ')},*/	/* Eastern Maninkakan */
 /*{"krc",	HB_TAG('B','A','L',' ')},*/	/* Balkar */
 /*{"??",	HB_TAG('B','C','R',' ')},*/	/* Bible Cree */
 /*{"zh?",	HB_TAG('C','H','N',' ')},*/	/* Chinese (seen in Microsoft fonts) */
-/*{"acf/gcf?",	HB_TAG('F','A','N',' ')},*/	/* French Antillean */
-/*{"enf?/yrk?",	HB_TAG('F','N','E',' ')},*/	/* Forest Nenets */
-/*{"fuf?",	HB_TAG('F','T','A',' ')},*/	/* Futa */
 /*{"ar-Syrc?",	HB_TAG('G','A','R',' ')},*/	/* Garshuni */
-/*{"cfm/rnl?",	HB_TAG('H','A','L',' ')},*/	/* Halam */
-/*{"ga-Latg?/Latg?",	HB_TAG('I','R','T',' ')},*/	/* Irish Traditional */
+/*{"hy?",	HB_TAG('H','Y','E','0')},*/	/* Armenian East (ISO 639-3 hye according to Microsoft, but that’s equivalent to ISO 639-1 hy) */
+/*{"ga-Latg?/"	HB_TAG('I','R','T',' ')},*/	/* Irish Traditional */
 /*{"krc",	HB_TAG('K','A','R',' ')},*/	/* Karachay */
-/*{"alw?/ktb?",	HB_TAG('K','E','B',' ')},*/	/* Kebena */
-/*{"Geok",	HB_TAG('K','G','E',' ')},*/	/* Khutsuri Georgian */
+/*{"ka-Geok?",	HB_TAG('K','G','E',' ')},*/	/* Khutsuri Georgian */
 /*{"kca",	HB_TAG('K','H','K',' ')},*/	/* Khanty-Kazim */
 /*{"kca",	HB_TAG('K','H','S',' ')},*/	/* Khanty-Shurishkar */
 /*{"kca",	HB_TAG('K','H','V',' ')},*/	/* Khanty-Vakhi */
-/*{"guz?/kqs?/kss?",	HB_TAG('K','I','S',' ')},*/	/* Kisii */
-/*{"kfa/kfi?/kpb?/xua?/xuj?",	HB_TAG('K','O','D',' ')},*/	/* Kodagu */
-/*{"okm?/oko?",	HB_TAG('K','O','H',' ')},*/	/* Korean Old Hangul */
-/*{"kon?/ktu?/...",	HB_TAG('K','O','N',' ')},*/	/* Kikongo */
-/*{"kfx?",	HB_TAG('K','U','L',' ')},*/	/* Kulvi */
-/*{"??",	HB_TAG('L','A','H',' ')},*/	/* Lahuli */
-/*{"??",	HB_TAG('L','C','R',' ')},*/	/* L-Cree */
+/*{"kqs, kss",	HB_TAG('K','I','S',' ')},*/	/* Kisii */
+/*{"lua",	HB_TAG('L','U','A',' ')},*/	/* Luba-Lulua */
+/*{"mlq",	HB_TAG('M','L','N',' ')},*/	/* Malinke */
+/*{"nso",	HB_TAG('N','S','O',' ')},*/	/* Sotho, Northern */
 /*{"??",	HB_TAG('M','A','L',' ')},*/	/* Malayalam Traditional */
-/*{"mnk?/mlq?/...",	HB_TAG('M','L','N',' ')},*/	/* Malinke */
-/*{"??",	HB_TAG('N','C','R',' ')},*/	/* N-Cree */
-/*{"??",	HB_TAG('N','H','C',' ')},*/	/* Norway House Cree */
-/*{"jpa?/sam?",	HB_TAG('P','A','A',' ')},*/	/* Palestinian Aramaic */
-/*{"polyton",	HB_TAG('P','G','R',' ')},*/	/* Polytonic Greek */
-/*{"??",	HB_TAG('Q','I','N',' ')},*/	/* Asho Chin */
-/*{"??",	HB_TAG('R','C','R',' ')},*/	/* R-Cree */
-/*{"chp?",	HB_TAG('S','A','Y',' ')},*/	/* Sayisi */
-/*{"xan?",	HB_TAG('S','E','K',' ')},*/	/* Sekota */
-/*{"ngo?",	HB_TAG('S','X','T',' ')},*/	/* Sutu */
-/*{"??",	HB_TAG('T','C','R',' ')},*/	/* TH-Cree */
-/*{"tnz?/tog?/toi?",	HB_TAG('T','N','G',' ')},*/	/* Tonga */
-/*{"enh?/yrk?",	HB_TAG('T','N','E',' ')},*/	/* Tundra Nenets */
-/*{"??",	HB_TAG('W','C','R',' ')},*/	/* West-Cree */
-/*{"cre?",	HB_TAG('Y','C','R',' ')},*/	/* Y-Cree */
+/*{"csw",	HB_TAG('N','C','R',' ')},*/	/* N-Cree */
+/*{"csw",	HB_TAG('N','H','C',' ')},*/	/* Norway House Cree */
+/*{"el-polyton",	HB_TAG('P','G','R',' ')},*/	/* Polytonic Greek */
+/*{"bgr, cnh, cnw, czt, sez, tcp, csy, ctd, flm, pck, tcz, zom, cmr, dao, hlt, cka, cnk, mrh, mwg, cbl, cnb, csh",	HB_TAG('Q','I','N',' ')},*/	/* Chin */
 /*{"??",	HB_TAG('Y','I','C',' ')},*/	/* Yi Classic */
-/*{"ii?/Yiii?",	HB_TAG('Y','I','M',' ')},*/	/* Yi Modern */
-/*{"??",	HB_TAG('Z','H','P',' ')},*/	/* Chinese Phonetic */
+/*{"zh-Latn-pinyin",	HB_TAG('Z','H','P',' ')},*/	/* Chinese Phonetic */
 };
 
 typedef struct {
diff --git a/third_party/harfbuzz-ng/src/hb-private.hh b/third_party/harfbuzz-ng/src/hb-private.hh
index 179e4e9..d58a695 100644
--- a/third_party/harfbuzz-ng/src/hb-private.hh
+++ b/third_party/harfbuzz-ng/src/hb-private.hh
@@ -169,6 +169,7 @@
 #  if defined(_WIN32_WCE)
      /* Some things not defined on Windows CE. */
 #    define strdup _strdup
+#    define vsnprintf _vsnprintf
 #    define getenv(Name) NULL
 #    if _WIN32_WCE < 0x800
 #      define setlocale(Category, Locale) "C"
diff --git a/third_party/harfbuzz-ng/src/hb-unicode-private.hh b/third_party/harfbuzz-ng/src/hb-unicode-private.hh
index ed45374..0cb99f0a 100644
--- a/third_party/harfbuzz-ng/src/hb-unicode-private.hh
+++ b/third_party/harfbuzz-ng/src/hb-unicode-private.hh
@@ -115,6 +115,8 @@
     /* XXX This hack belongs to the Tibetan shaper:
      * Reorder PADMA to ensure it comes after any vowel marks. */
     if (unlikely (unicode == 0x0FC6u)) return 254;
+    /* Reorder TSA -PHRU to reorder before U+0F74 */
+    if (unlikely (unicode == 0x0F39u)) return 127;
 
     return _hb_modified_combining_class[combining_class (unicode)];
   }
@@ -343,10 +345,12 @@
 #define HB_MODIFIED_COMBINING_CLASS_CCC118 118 /* sign u / sign uu */
 #define HB_MODIFIED_COMBINING_CLASS_CCC122 122 /* mai * */
 
-/* Tibetan */
+/* Tibetan
+ * Modify U+0F74 (ccc=132) to reorder before ccc=130 marks.
+ */
 #define HB_MODIFIED_COMBINING_CLASS_CCC129 129 /* sign aa */
 #define HB_MODIFIED_COMBINING_CLASS_CCC130 130 /* sign i */
-#define HB_MODIFIED_COMBINING_CLASS_CCC132 132 /* sign u */
+#define HB_MODIFIED_COMBINING_CLASS_CCC132 128 /* sign u */
 
 
 /* Misc */
diff --git a/third_party/harfbuzz-ng/src/hb-version.h b/third_party/harfbuzz-ng/src/hb-version.h
index 20cf366..c90db6b 100644
--- a/third_party/harfbuzz-ng/src/hb-version.h
+++ b/third_party/harfbuzz-ng/src/hb-version.h
@@ -38,9 +38,9 @@
 
 #define HB_VERSION_MAJOR 1
 #define HB_VERSION_MINOR 2
-#define HB_VERSION_MICRO 5
+#define HB_VERSION_MICRO 7
 
-#define HB_VERSION_STRING "1.2.5"
+#define HB_VERSION_STRING "1.2.7"
 
 #define HB_VERSION_ATLEAST(major,minor,micro) \
 	((major)*10000+(minor)*100+(micro) <= \
diff --git a/third_party/ijar/README.chromium b/third_party/ijar/README.chromium
index 8f6bb02..0d19b31c 100644
--- a/third_party/ijar/README.chromium
+++ b/third_party/ijar/README.chromium
@@ -2,7 +2,7 @@
 URL: https://github.com/google/bazel/tree/master/third_party/ijar
 Version: 0
 Revision: 31c8878fa3ed34356d90642c19e46e4a06d84f4a
-License: Apache 2.0
+License: NOT_SHIPPED
 Security Critical: No
 
 Description:
diff --git a/third_party/jmake/BUILD.gn b/third_party/jmake/BUILD.gn
index 7b9b0a9..2598dbe 100644
--- a/third_party/jmake/BUILD.gn
+++ b/third_party/jmake/BUILD.gn
@@ -27,5 +27,5 @@
     "src/org/pantsbuild/jmake/BinaryProjectDatabaseReader.java",
   ]
   main_class = "org.pantsbuild.jmake.Main"
-  enable_incremental_javac = false
+  enable_incremental_javac_override = false
 }
diff --git a/third_party/jmake/README.chromium b/third_party/jmake/README.chromium
index 0caab77..e0e9c8c9 100644
--- a/third_party/jmake/README.chromium
+++ b/third_party/jmake/README.chromium
@@ -2,7 +2,7 @@
 URL: https://github.com/pantsbuild/jmake
 Version: 0
 Revision: 7761ee3e1537ccc61820c0d30061eb09edaf1c93
-License: GPL 2.0
+License: NOT_SHIPPED
 Security Critical: No
 License Android Compatible: No
 
diff --git a/third_party/libjingle/README.chromium b/third_party/libjingle/README.chromium
index 5049f9f..5359e04b 100644
--- a/third_party/libjingle/README.chromium
+++ b/third_party/libjingle/README.chromium
@@ -1,7 +1,7 @@
 Name: libjingle
 URL: http://www.webrtc.org
 Version: unknown
-Revision: 12556
+Revision: 12581
 License: BSD
 License File: source/talk/COPYING
 Security Critical: yes
diff --git a/third_party/libjingle/libjingle_nacl.gyp b/third_party/libjingle/libjingle_nacl.gyp
index 99dd667..d972382 100644
--- a/third_party/libjingle/libjingle_nacl.gyp
+++ b/third_party/libjingle/libjingle_nacl.gyp
@@ -160,7 +160,6 @@
         '<(webrtc_base)/ratetracker.h',
         '<(webrtc_base)/scoped_autorelease_pool.h',
         '<(webrtc_base)/scoped_autorelease_pool.mm',
-        '<(webrtc_base)/scoped_ptr.h',
         '<(webrtc_base)/sec_buffer.h',
         '<(webrtc_base)/sha1.cc',
         '<(webrtc_base)/sha1.h',
diff --git a/third_party/markdown/README.chromium b/third_party/markdown/README.chromium
index 1d0f2188..adb84d7 100644
--- a/third_party/markdown/README.chromium
+++ b/third_party/markdown/README.chromium
@@ -4,7 +4,7 @@
 Version: 2.3.1
 Date: March 22, 2013
 Revision: commit 0ea0bac85a749a13381b721cde44214d9193406c
-License: BSD License
+License: NOT_SHIPPED
 License File: LICENSE
 Security Critical: no
 
diff --git a/third_party/netty-tcnative/BUILD.gn b/third_party/netty-tcnative/BUILD.gn
index 0b3be1c2..2af63f5 100644
--- a/third_party/netty-tcnative/BUILD.gn
+++ b/third_party/netty-tcnative/BUILD.gn
@@ -98,7 +98,7 @@
     "src/java/src/org/apache/tomcat/jni/Time.java",
     "src/java/src/org/apache/tomcat/jni/User.java",
   ]
-  run_findbugs = false
+  run_findbugs_override = false
   deps = [
     "//base:base_java",
   ]
diff --git a/third_party/ocmock/README.chromium b/third_party/ocmock/README.chromium
index 890cb60..889c559 100644
--- a/third_party/ocmock/README.chromium
+++ b/third_party/ocmock/README.chromium
@@ -2,7 +2,7 @@
 URL: https://github.com/erikdoe/ocmock
 Version: unknown
 Revision: 8b8793cf29a5bac0541421ea06c7dff071afb25e
-License: BSD with advertising clause
+License: NOT_SHIPPED
 License File: License.txt
 Security Critical: no
 
diff --git a/third_party/polymer/v1_0/find_unused_elements.py b/third_party/polymer/v1_0/find_unused_elements.py
new file mode 100755
index 0000000..5899993
--- /dev/null
+++ b/third_party/polymer/v1_0/find_unused_elements.py
@@ -0,0 +1,165 @@
+#!/usr/bin/python2
+
+# Copyright 2016 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.
+
+"""Identifies Polymer elements that downloaded but not used by Chrome.
+
+Only finds "first-order" unused elements; re-run after removing unused elements
+to check if other elements have become unused.
+"""
+
+import os
+import re
+import subprocess
+
+
+class UnusedElementsDetector:
+  """Finds unused Polymer elements."""
+
+  # Unused elements to ignore because we plan to use them soon.
+  __whitelist = (
+    # TODO(dschuyler): Use element or remove from whitelist.
+    'carbon-route',
+    # TODO(tsergeant): Use element or remove from whitelist.
+    'iron-scroll-threshold',
+    # Necessary for closure.
+    'polymer-externs',
+  )
+
+  @staticmethod
+  def __StripHtmlComments(filename):
+    """Returns the contents of an HTML file with <!-- --> comments stripped.
+
+    Not a real parser.
+
+    Args:
+      filename: The name of the file to read.
+
+    Returns:
+      A string consisting of the file contents with comments removed.
+    """
+    with open(filename) as f:
+      return re.sub('<!--.*?-->', '', f.read(), flags=re.MULTILINE|re.DOTALL)
+
+  @staticmethod
+  def __StripJsComments(filename):
+    """Returns the minified contents of a JavaScript file with comments and
+    grit directives removed.
+
+    Args:
+      filename: The name of the file to read.
+
+    Returns:
+      A string consisting of the minified file contents with comments and grit
+      directives removed.
+    """
+    with open(filename) as f:
+      text = f.read()
+    text = re.sub('<if .*?>', '', text)
+    text = re.sub('</if>', '', text)
+
+    proc = subprocess.Popen(['uglifyjs', filename], stdout=subprocess.PIPE)
+    return proc.stdout.read()
+
+  @staticmethod
+  def __StripComments(filename):
+    """Returns the contents of a JavaScript or HTML file with comments removed.
+
+    Args:
+      filename: The name of the file to read.
+
+    Returns:
+      A string consisting of the file contents processed via
+      __StripHtmlComments or __StripJsComments.
+    """
+    if filename.endswith('.html'):
+      text = UnusedElementsDetector.__StripHtmlComments(filename)
+    elif filename.endswith('.js'):
+      text = UnusedElementsDetector.__StripJsComments(filename)
+    else:
+      assert False, 'Invalid filename: %s' % filename
+    return text
+
+  @staticmethod
+  def Run():
+    """Finds unused Polymer elements and prints a summary."""
+    proc = subprocess.Popen(
+      ['git', 'rev-parse', '--show-toplevel'],
+      stdout=subprocess.PIPE)
+    src_dir = proc.stdout.read().strip()
+    polymer_dir = os.path.dirname(os.path.realpath(__file__))
+    components_dir = os.path.join(polymer_dir, 'components-chromium')
+
+    elements = []
+    for name in os.listdir(components_dir):
+      path = os.path.join(components_dir, name)
+      if os.path.isdir(path):
+        elements.append(name)
+
+    relevant_src_dirs = (
+      os.path.join(src_dir, 'chrome'),
+      os.path.join(src_dir, 'ui'),
+      os.path.join(src_dir, 'components'),
+      components_dir
+    )
+
+    for element in elements:
+      if element in UnusedElementsDetector.__whitelist:
+        continue
+
+    unused_elements = []
+    for element in elements:
+      if (element not in UnusedElementsDetector.__whitelist and
+          not UnusedElementsDetector.__IsImported(element, relevant_src_dirs)):
+        unused_elements.append(element)
+
+    if len(unused_elements):
+      print 'Found unused elements: %s\nRemove from bower.json and re-run ' \
+        'reproduce.sh, or add to whitelist in %s' % (
+          ', '.join(unused_elements), os.path.basename(__file__))
+
+  @staticmethod
+  def __IsImported(element_dir, dirs):
+    """Returns whether the element directory is used in HTML or JavaScript.
+
+    Args:
+      element_dir: The name of the element's directory.
+      dirs: The directories in which to check for usage.
+
+    Returns:
+      True if the element's directory is used in |dirs|.
+    """
+    polymer_dir = os.path.dirname(os.path.realpath(__file__))
+    components_dir = os.path.join(polymer_dir, 'components-chromium')
+    for path in dirs:
+      # Find an import or script referencing the tag's directory.
+      for (dirpath, _, filenames) in os.walk(path):
+        # Ignore the element's own files.
+        if dirpath.startswith(os.path.join(components_dir, element_dir)):
+          continue
+
+        for filename in filenames:
+          if not filename.endswith('.html') and not filename.endswith('.js'):
+            continue
+
+          # Skip generated files that may include the element source.
+          if filename in ('crisper.js', 'vulcanized.html'):
+            continue
+
+          with open(os.path.join(dirpath, filename)) as f:
+            text = f.read()
+          if not re.search('/%s/' % element_dir, text):
+            continue
+
+          # Check the file again, ignoring comments (e.g. example imports and
+          # scripts).
+          if re.search('/%s' % element_dir,
+                       UnusedElementsDetector.__StripComments(
+                         os.path.join(dirpath, filename))):
+            return True
+    return False
+
+
+UnusedElementsDetector.Run()
diff --git a/third_party/polymer/v1_0/reproduce.sh b/third_party/polymer/v1_0/reproduce.sh
index 01b6cbf..1b1feba 100755
--- a/third_party/polymer/v1_0/reproduce.sh
+++ b/third_party/polymer/v1_0/reproduce.sh
@@ -21,12 +21,13 @@
 check_dep "which npm" "npm" "visiting https://nodejs.org/en/"
 check_dep "which bower" "bower" "npm install -g bower"
 check_dep "which crisper" "crisper" "npm install -g crisper"
+check_dep "which uglifyjs" "uglifyjs" "npm install -g uglifyjs"
 check_dep "which rsync" "rsync" "apt-get install rsync"
 check_dep "python -c 'import bs4'" "bs4" "apt-get install python-bs4"
 
 set -e
 
-cd "$(dirname "$0")"
+pushd "$(dirname "$0")" > /dev/null
 
 rm -rf components
 rm -rf ../../web-animations-js/sources
@@ -105,3 +106,8 @@
 
 echo 'Vulcanizing dependent UIs (i.e. downloads)...'
 python ../../../chrome/browser/resources/md_downloads/vulcanize.py
+
+popd > /dev/null
+
+echo 'Searching for unused elements...'
+"$(dirname "$0")"/find_unused_elements.py
diff --git a/third_party/proguard/README.chromium b/third_party/proguard/README.chromium
index 4dc86a8..76389a1c 100644
--- a/third_party/proguard/README.chromium
+++ b/third_party/proguard/README.chromium
@@ -2,7 +2,7 @@
 URL: http://proguard.sourceforge.net/
 Version: 5.2.1
 Date: February 9, 2016
-License: GPL v2
+License: NOT_SHIPPED
 Security Critical: no
 
 Description:
diff --git a/third_party/web-animations-js/OWNERS b/third_party/web-animations-js/OWNERS
index 48e0528a..0dc1b469 100644
--- a/third_party/web-animations-js/OWNERS
+++ b/third_party/web-animations-js/OWNERS
@@ -1 +1,2 @@
-dzhioev@chromium.org
\ No newline at end of file
+dzhioev@chromium.org
+michaelpg@chromium.org
diff --git a/tools/android/loading/cloud/backend/README.md b/tools/android/loading/cloud/backend/README.md
index e9e1a9a..49fc0ca3 100644
--- a/tools/android/loading/cloud/backend/README.md
+++ b/tools/android/loading/cloud/backend/README.md
@@ -99,12 +99,14 @@
 -   `src_path` (string): Path to the Chromium source directory.
 -   `taskqueue_tag` (string): Tag used by the worker when pulling tasks from
     `clovis-queue`.
--   `trace_database_filename` (string, optional): Filename for the trace
-    database in Cloud Storage. Must be unique per worker to avoid concurrent
-    access. Defaults to `trace_database.json`.
--   `destruct_instance_name` (string, optional): Name of the instance the worker
-    will destroy when there are no remaining tasks to process. This is only
-    relevant when running in the cloud.
+-   `instance_name` (string, optional): Name of the Compute Engine instance this
+    script is running on.
+-   `worker_log_file` (string, optional): Path to the log file capturing the
+    output of `worker.py`, to be uploaded to Cloud Storage.
+-   `self_destruct` (boolean, optional): Whether the worker will destroy the
+    Compute Engine instance when there are no remaining tasks to process. This
+    is only relevant when running in the cloud, and requires `instance_name` to
+    be defined.
 
 ## Use the app
 
diff --git a/tools/android/loading/cloud/backend/failure_database.py b/tools/android/loading/cloud/backend/failure_database.py
new file mode 100644
index 0000000..4fdfde7c
--- /dev/null
+++ b/tools/android/loading/cloud/backend/failure_database.py
@@ -0,0 +1,39 @@
+# Copyright 2016 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 json
+
+class FailureDatabase(object):
+  """Logs the failures happening in the Clovis backend."""
+
+  def __init__(self, json_string=None):
+    """Loads a FailureDatabase from a string returned by ToJsonString()."""
+    if json_string:
+      self._failures_dict = json.loads(json_string)
+    else:
+      self._failures_dict = {}
+
+  def ToJsonDict(self):
+    """Returns a dict representing this instance."""
+    return self._failures_dict
+
+  def ToJsonString(self):
+    """Returns a string representing this instance."""
+    return json.dumps(self.ToJsonDict(), indent=2)
+
+  def AddFailure(self, failure_name, failure_content=None):
+    """Adds a failure with the given name and content. If the failure already
+    exists, it will increment the associated count.
+
+    Args:
+      failure_name (str): name of the failure.
+      failure_content (str): content of the failure (e.g. the URL or task that
+                             is failing).
+    """
+    content = failure_content if failure_content else 'error_count'
+    if failure_name not in self._failures_dict:
+      self._failures_dict[failure_name] = {}
+    error_count = self._failures_dict[failure_name].get(content, 0)
+    self._failures_dict[failure_name][content] = error_count + 1
+
diff --git a/tools/android/loading/cloud/backend/startup-script.sh b/tools/android/loading/cloud/backend/startup-script.sh
index 69cb7d9..23cedb0 100644
--- a/tools/android/loading/cloud/backend/startup-script.sh
+++ b/tools/android/loading/cloud/backend/startup-script.sh
@@ -65,27 +65,29 @@
 chown root:root /usr/local/sbin/chrome-devel-sandbox
 chmod 4755 /usr/local/sbin/chrome-devel-sandbox
 
-# Make sure the pythonapp user owns the application code
+# Make sure the pythonapp user owns the application code.
 chown -R pythonapp:pythonapp /opt/app
 
 # Create the configuration file for this deployment.
 DEPLOYMENT_CONFIG_PATH=/opt/app/clovis/deployment_config.json
 TASKQUEUE_TAG=`get_instance_metadata taskqueue-tag`
 if [ "$(get_instance_metadata self-destruct)" == "false" ]; then
-  SELF_DESTRUCT_CONFIG_LINE=""
+  SELF_DESTRUCT="False"
 else
-  SELF_DESTRUCT_CONFIG_LINE="\"destruct_instance_name\" : \"$INSTANCE_NAME\","
+  SELF_DESTRUCT="True"
 fi
+WORKER_LOG_PATH=/opt/app/clovis/worker.log
 
 cat >$DEPLOYMENT_CONFIG_PATH << EOF
 {
-  $SELF_DESTRUCT_CONFIG_LINE
+  "instance_name" : "$INSTANCE_NAME",
   "project_name" : "$PROJECTID",
   "cloud_storage_path" : "$CLOUD_STORAGE_PATH",
   "chrome_path" : "/opt/app/clovis/binaries/chrome",
   "src_path" : "/opt/app/clovis/src",
   "taskqueue_tag" : "$TASKQUEUE_TAG",
-  "trace_database_filename" : "trace_database_${INSTANCE_NAME}.json"
+  "worker_log_path" : "$WORKER_LOG_PATH",
+  "self_destruct" : "$SELF_DESTRUCT"
 }
 EOF
 
@@ -101,9 +103,9 @@
 cat >/etc/supervisor/conf.d/python-app.conf << EOF
 [program:pythonapp]
 directory=/opt/app/clovis/src/tools/android/loading/cloud/backend
-command=python worker.py --config $DEPLOYMENT_CONFIG_PATH
+command=python -u worker.py --config $DEPLOYMENT_CONFIG_PATH
 autostart=true
-autorestart=true
+autorestart=unexpected
 user=pythonapp
 # Environment variables ensure that the application runs inside of the
 # configured virtualenv.
@@ -111,8 +113,8 @@
     PATH="/opt/app/clovis/env/bin:/usr/bin", \
     HOME="/home/pythonapp",USER="pythonapp", \
     CHROME_DEVEL_SANDBOX="/usr/local/sbin/chrome-devel-sandbox"
-stdout_logfile=syslog
-stderr_logfile=syslog
+stdout_logfile=$WORKER_LOG_PATH
+stderr_logfile=$WORKER_LOG_PATH
 EOF
 
 supervisorctl reread
diff --git a/tools/android/loading/cloud/backend/worker.py b/tools/android/loading/cloud/backend/worker.py
index cef7044..038f251 100644
--- a/tools/android/loading/cloud/backend/worker.py
+++ b/tools/android/loading/cloud/backend/worker.py
@@ -21,6 +21,7 @@
 import controller
 from cloud.common.clovis_task import ClovisTask
 from cloud.common.google_instance_helper import GoogleInstanceHelper
+from failure_database import FailureDatabase
 from google_storage_accessor import GoogleStorageAccessor
 import loading_trace
 from loading_trace_database import LoadingTraceDatabase
@@ -33,9 +34,13 @@
     self._project_name = config['project_name']
     self._taskqueue_tag = config['taskqueue_tag']
     self._src_path = config['src_path']
-    self._destruct_instance_name = config.get('destruct_instance_name')
+    self._instance_name = config.get('instance_name')
+    self._worker_log_path = config.get('worker_log_path')
     self._credentials = GoogleCredentials.get_application_default()
     self._logger = logger
+    self._self_destruct = config.get('self_destruct')
+    if self._self_destruct and not self._instance_name:
+      self._logger.error('Self destruction requires an instance name.')
 
     # Separate the cloud storage path into the bucket and the base path under
     # the bucket.
@@ -51,13 +56,29 @@
         credentials=self._credentials, project_name=self._project_name,
         bucket_name=self._bucket_name)
 
+    if self._instance_name:
+      trace_database_filename = 'trace_database_%s.json' % self._instance_name
+      failure_database_filename = \
+          'failure_database_%s.json' % self._instance_name
+    else:
+      trace_database_filename = 'trace_database.json'
+      failure_database_filename = 'failure_dabatase.json'
     self._traces_dir = os.path.join(self._base_path_in_bucket, 'traces')
-    self._trace_database_path = os.path.join(
-        self._traces_dir,
-        config.get('trace_database_filename', 'trace_database.json'))
+    self._trace_database_path = os.path.join(self._traces_dir,
+                                             trace_database_filename)
+    self._failures_dir = os.path.join(self._base_path_in_bucket, 'failures')
+    self._failure_database_path = os.path.join(self._failures_dir,
+                                               failure_database_filename)
 
-    # Recover any existing trace database in case the worker died.
+    # Recover any existing trace database and failures in case the worker died.
     self._DownloadTraceDatabase()
+    self._DownloadFailureDatabase()
+
+    if self._trace_database.ToJsonDict() or self._failure_database.ToJsonDict():
+      # Script is restarting after a crash, or there are already files from a
+      # previous run in the directory.
+      self._failure_database.AddFailure('startup_with_dirty_state')
+      self._UploadFailureDatabase()
 
     # Initialize the global options that will be used during trace generation.
     options.OPTIONS.ParseArgs([])
@@ -96,16 +117,30 @@
     self._logger.info('Downloading trace database')
     trace_database_string = self._google_storage_accessor.DownloadAsString(
         self._trace_database_path) or '{}'
-    trace_database_dict = json.loads(trace_database_string)
-    self._trace_database = LoadingTraceDatabase(trace_database_dict)
+    self._trace_database = LoadingTraceDatabase.FromJsonString(
+        trace_database_string)
 
   def _UploadTraceDatabase(self):
     """Uploads the trace database to CloudStorage."""
     self._logger.info('Uploading trace database')
     self._google_storage_accessor.UploadString(
-        json.dumps(self._trace_database.ToJsonDict(), indent=2),
+        self._trace_database.ToJsonString(),
         self._trace_database_path)
 
+  def _DownloadFailureDatabase(self):
+    """Downloads the failure database from CloudStorage."""
+    self._logger.info('Downloading failure database')
+    failure_database_string = self._google_storage_accessor.DownloadAsString(
+        self._failure_database_path)
+    self._failure_database = FailureDatabase(failure_database_string)
+
+  def _UploadFailureDatabase(self):
+    """Uploads the failure database to CloudStorage."""
+    self._logger.info('Uploading failure database')
+    self._google_storage_accessor.UploadString(
+        self._failure_database.ToJsonString(),
+        self._failure_database_path)
+
   def _FetchClovisTask(self, project_name, task_api, queue_name):
     """Fetches a ClovisTask from the task queue.
 
@@ -132,27 +167,43 @@
     # once it is fixed.
     retry_count = google_task['retry_count']
     max_retry_count = 3
-    if retry_count >= max_retry_count:
+    skip_task = retry_count >= max_retry_count
+    if skip_task:
       task_api.tasks().delete(project=project_name, taskqueue=queue_name,
                               task=task_id).execute()
-      return self._FetchClovisTask(project_name, task_api, queue_name)
 
     clovis_task = ClovisTask.FromBase64(google_task['payloadBase64'])
+
+    if retry_count > 0:
+      self._failure_database.AddFailure('task_queue_retry',
+                                        clovis_task.ToJsonString())
+      self._UploadFailureDatabase()
+
+    if skip_task:
+      return self._FetchClovisTask(project_name, task_api, queue_name)
+
     return (clovis_task, task_id)
 
   def _Finalize(self):
     """Called before exiting."""
     self._logger.info('Done')
+    # Upload the worker log.
+    if self._worker_log_path:
+      self._logger.info('Uploading worker log.')
+      remote_log_path = os.path.join(self._base_path_in_bucket, 'worker_log')
+      if self._instance_name:
+        remote_log_path += '_' + self._instance_name
+      self._google_storage_accessor.UploadFile(self._worker_log_path,
+                                               remote_log_path)
     # Self destruct.
-    if self._destruct_instance_name:
-      self._logger.info('Starting instance destruction: ' +
-                        self._destruct_instance_name)
+    if self._self_destruct:
+      self._logger.info('Starting instance destruction: ' + self._instance_name)
       google_instance_helper = GoogleInstanceHelper(
           self._credentials, self._project_name, self._logger)
-      success = google_instance_helper.DeleteInstance(
-          self._taskqueue_tag, self._destruct_instance_name)
+      success = google_instance_helper.DeleteInstance(self._taskqueue_tag,
+                                                      self._instance_name)
       if not success:
-        self._logger.error('Self destruction failed')
+        self._logger.error('Self destruction failed.')
     # Do not add anything after this line, as the instance might be killed at
     # any time.
 
@@ -217,6 +268,41 @@
 
     return trace_metadata
 
+  def _HandleTraceGenerationResults(self, local_filename, log_filename,
+                                    remote_filename, trace_metadata):
+    """Updates the trace database and the failure database after a trace
+    generation. Uploads the trace and the log.
+    Results related to successful traces are uploaded in the _traces_dir
+    directory, and failures are uploaded in the _failures_dir directory.
+
+    Args:
+      local_filename (str): Path to the local file containing the trace.
+      log_filename (str): Path to the local file containing the log.
+      remote_filename (str): Name of the target remote file where the trace and
+                             the log (with a .log extension added) are uploaded.
+      trace_metadata (dict): Metadata associated with the trace generation.
+    """
+    if trace_metadata['succeeded']:
+      remote_trace_location = os.path.join(self._traces_dir, remote_filename)
+      full_cloud_storage_path = os.path.join('gs://' + self._bucket_name,
+                                             remote_trace_location)
+      self._trace_database.SetTrace(full_cloud_storage_path, trace_metadata)
+    else:
+      remote_trace_location = os.path.join(self._failures_dir, remote_filename)
+      self._failure_database.AddFailure('trace_collection',
+                                        trace_metadata['url'])
+
+    if os.path.isfile(local_filename):
+      self._logger.debug('Uploading: %s' % remote_trace_location)
+      self._google_storage_accessor.UploadFile(local_filename,
+                                               remote_trace_location)
+    else:
+      self._logger.warning('No trace found at: ' + local_filename)
+
+    self._logger.debug('Uploading analyze log')
+    remote_log_location = remote_trace_location + '.log'
+    self._google_storage_accessor.UploadFile(log_filename, remote_log_location)
+
   def _ProcessClovisTask(self, clovis_task):
     """Processes one clovis_task."""
     if clovis_task.Action() != 'trace':
@@ -230,39 +316,33 @@
     emulate_device = params.get('emulate_device')
     emulate_network = params.get('emulate_network')
 
-    failures_dir = os.path.join(self._base_path_in_bucket, 'failures')
-    # TODO(blundell): Fix this up.
-    logs_dir = os.path.join(self._base_path_in_bucket, 'analyze_logs')
     log_filename = 'analyze.log'
     # Avoid special characters in storage object names
     pattern = re.compile(r"[#\?\[\]\*/]")
 
+    failure_happened = False
+    success_happened = False
+
     while len(urls) > 0:
       url = urls.pop()
       local_filename = pattern.sub('_', url)
       for repeat in range(repeat_count):
         self._logger.debug('Generating trace for URL: %s' % url)
-        remote_filename = os.path.join(local_filename, str(repeat))
         trace_metadata = self._GenerateTrace(
             url, emulate_device, emulate_network, local_filename, log_filename)
         if trace_metadata['succeeded']:
-          self._logger.debug('Uploading: %s' % remote_filename)
-          remote_trace_location = os.path.join(self._traces_dir,
-                                               remote_filename)
-          self._google_storage_accessor.UploadFile(local_filename,
-                                                   remote_trace_location)
-          full_cloud_storage_path = os.path.join('gs://' + self._bucket_name,
-                                                 remote_trace_location)
-          self._trace_database.SetTrace(full_cloud_storage_path, trace_metadata)
+          success_happened = True
         else:
           self._logger.warning('Trace generation failed for URL: %s' % url)
-          if os.path.isfile(local_filename):
-            self._google_storage_accessor.UploadFile(
-                local_filename, os.path.join(failures_dir, remote_filename))
-        self._logger.debug('Uploading analyze log')
-        self._google_storage_accessor.UploadFile(
-            log_filename, os.path.join(logs_dir, remote_filename))
-    self._UploadTraceDatabase()
+          failure_happened = True
+        remote_filename = os.path.join(local_filename, str(repeat))
+        self._HandleTraceGenerationResults(
+            local_filename, log_filename, remote_filename, trace_metadata)
+
+    if success_happened:
+      self._UploadTraceDatabase()
+    if failure_happened:
+      self._UploadFailureDatabase()
 
 if __name__ == '__main__':
   parser = argparse.ArgumentParser(
diff --git a/tools/android/loading/cloud/frontend/clovis_frontend.py b/tools/android/loading/cloud/frontend/clovis_frontend.py
index cb2f2c2d..b5379c6 100644
--- a/tools/android/loading/cloud/frontend/clovis_frontend.py
+++ b/tools/android/loading/cloud/frontend/clovis_frontend.py
@@ -63,8 +63,8 @@
   if live_instance_count > 0 or live_instance_count == -1:
     clovis_logger.info('Retry later, instances still alive for tag: ' + tag)
     poll_interval_minutes = 10
-    deferred.defer(PollWorkers, tag, start_time, email_address, task_url,
-                   _countdown=(60 * poll_interval_minutes))
+    deferred.defer(PollWorkers, tag, start_time, timeout_hours, email_address,
+                   task_url, _countdown=(60 * poll_interval_minutes))
     return
 
   Finalize(tag, email_address, 'SUCCESS', task_url)
diff --git a/tools/android/loading/devtools_monitor.py b/tools/android/loading/devtools_monitor.py
index e8930e9..ead9bce 100644
--- a/tools/android/loading/devtools_monitor.py
+++ b/tools/android/loading/devtools_monitor.py
@@ -10,6 +10,7 @@
 import logging
 import os
 import sys
+import time
 
 file_dir = os.path.dirname(__file__)
 sys.path.append(os.path.join(file_dir, '..', '..', 'perf'))
@@ -88,6 +89,8 @@
   TRACING_DONE_EVENT = 'Tracing.tracingComplete'
   TRACING_STREAM_EVENT = 'Tracing.tracingComplete'  # Same as TRACING_DONE.
   TRACING_TIMEOUT = 300
+  HTTP_ATTEMPTS = 10
+  HTTP_ATTEMPT_INTERVAL_SECONDS = 0.1
 
   def __init__(self, hostname, port):
     """Initializes the connection with a DevTools server.
@@ -352,17 +355,22 @@
 
   def _HttpRequest(self, path):
     assert path[0] == '/'
-    r = httplib.HTTPConnection(self._http_hostname, self._http_port)
-    try:
-      r.request('GET', '/json' + path)
-      response = r.getresponse()
-      if response.status != 200:
-        raise DevToolsConnectionException(
-            'Cannot connect to DevTools, reponse code %d' % response.status)
-      raw_response = response.read()
-    finally:
-      r.close()
-    return raw_response
+    for _ in xrange(self.HTTP_ATTEMPTS):
+      r = httplib.HTTPConnection(self._http_hostname, self._http_port)
+      try:
+        r.request('GET', '/json' + path)
+        response = r.getresponse()
+        if response.status != 200:
+          raise DevToolsConnectionException(
+              'Cannot connect to DevTools, reponse code %d' % response.status)
+        return response.read()
+      except httplib.BadStatusLine as exception:
+        logging.warning('Devtools HTTP connection failed: %s' % repr(exception))
+        time.sleep(self.HTTP_ATTEMPT_INTERVAL_SECONDS)
+      finally:
+        r.close()
+    # Raise the exception that has failed the last attempt.
+    raise
 
   def _Connect(self):
     assert not self._ws
diff --git a/tools/android/loading/loading_trace_database.py b/tools/android/loading/loading_trace_database.py
index dad6153..91705aa2 100644
--- a/tools/android/loading/loading_trace_database.py
+++ b/tools/android/loading/loading_trace_database.py
@@ -31,6 +31,10 @@
     """Returns a dict representing this instance."""
     return self._traces_dict
 
+  def ToJsonString(self):
+    """Returns a string representing this instance."""
+    return json.dumps(self._traces_dict, indent=2)
+
   def ToJsonFile(self, json_path):
     """Saves a json file representing this instance."""
     json_dict = self.ToJsonDict()
@@ -43,6 +47,11 @@
     return LoadingTraceDatabase(json_dict)
 
   @classmethod
+  def FromJsonString(cls, json_string):
+    """Returns an instance from a string returned by ToJsonString()."""
+    return LoadingTraceDatabase(json.loads(json_string))
+
+  @classmethod
   def FromJsonFile(cls, json_path):
     """Returns an instance from a json file saved by ToJsonFile()."""
     with open(json_path) as input_file:
diff --git a/tools/android/loading/request_track.py b/tools/android/loading/request_track.py
index 8bd62da..8248af1b 100644
--- a/tools/android/loading/request_track.py
+++ b/tools/android/loading/request_track.py
@@ -664,7 +664,8 @@
     _CopyFromDictToObject(redirect_response, r,
                           (('headers', 'response_headers'),
                            ('encodedDataLength', 'encoded_data_length'),
-                           ('fromDiskCache', 'from_disk_cache')))
+                           ('fromDiskCache', 'from_disk_cache'),
+                           ('protocol', 'protocol'), ('status', 'status')))
     r.timing = Timing.FromDevToolsDict(redirect_response['timing'])
 
     redirect_index = self._redirects_count_by_id[request_id]
diff --git a/tools/android/loading/sandwich_metrics.py b/tools/android/loading/sandwich_metrics.py
index 339cf72..b472ce60 100644
--- a/tools/android/loading/sandwich_metrics.py
+++ b/tools/android/loading/sandwich_metrics.py
@@ -8,6 +8,7 @@
 """
 
 import collections
+import json
 import logging
 import os
 import shutil
@@ -27,12 +28,21 @@
 
 import loading_trace as loading_trace_module
 import sandwich_runner
+import sandwich_misc
 import tracing
 
 
 CSV_FIELD_NAMES = [
     'repeat_id',
     'url',
+    'subresource_discoverer',
+    'subresource_count',
+    # The amount of subresources detected at SetupBenchmark step.
+    'subresource_count_theoretic',
+    # Amount of subresources for caching as suggested by the subresource
+    # discoverer.
+    'cached_subresource_count_theoretic',
+    'cached_subresource_count',
     'total_load',
     'js_onload_event',
     'browser_malloc_avg',
@@ -182,6 +192,30 @@
   }
 
 
+def _ExtractBenchmarkStatistics(benchmark_setup, loading_trace):
+  """Extracts some useful statistics from a benchmark run.
+
+  Args:
+    benchmark_setup: benchmark_setup: dict representing the benchmark setup
+        JSON. The JSON format is according to:
+            SandwichTaskBuilder.PopulateLoadBenchmark.SetupBenchmark.
+    loading_trace: loading_trace_module.LoadingTrace.
+
+  Returns:
+    Dictionary with all extracted fields set.
+  """
+  return {
+    'subresource_discoverer': benchmark_setup['subresource_discoverer'],
+    'subresource_count': len(sandwich_misc.ListUrlRequests(
+        loading_trace, sandwich_misc.RequestOutcome.All)),
+    'subresource_count_theoretic': len(benchmark_setup['url_resources']),
+    'cached_subresource_count': len(sandwich_misc.ListUrlRequests(
+        loading_trace, sandwich_misc.RequestOutcome.ServedFromCache)),
+    'cached_subresource_count_theoretic':
+        len(benchmark_setup['cache_whitelist']),
+  }
+
+
 def _ExtractCompletenessRecordFromVideo(video_path):
   """Extracts the completeness record from a video.
 
@@ -241,10 +275,13 @@
   return speed_index
 
 
-def _ExtractMetricsFromRunDirectory(run_directory_path):
+def _ExtractMetricsFromRunDirectory(benchmark_setup, run_directory_path):
   """Extracts all the metrics from traces and video of a sandwich run.
 
   Args:
+    benchmark_setup: benchmark_setup: dict representing the benchmark setup
+        JSON. The JSON format is according to:
+            SandwichTaskBuilder.PopulateLoadBenchmark.SetupBenchmark.
     run_directory_path: Path of the run directory.
 
   Returns:
@@ -256,6 +293,8 @@
   run_metrics = {'url': loading_trace.url}
   run_metrics.update(_ExtractDefaultMetrics(loading_trace))
   run_metrics.update(_ExtractMemoryMetrics(loading_trace))
+  run_metrics.update(
+      _ExtractBenchmarkStatistics(benchmark_setup, loading_trace))
   video_path = os.path.join(run_directory_path, 'video.mp4')
   if os.path.isfile(video_path):
     logging.info('processing speed-index video \'%s\'' % video_path)
@@ -268,17 +307,20 @@
   return run_metrics
 
 
-def ExtractMetricsFromRunnerOutputDirectory(output_directory_path):
+def ExtractMetricsFromRunnerOutputDirectory(benchmark_setup_path,
+                                            output_directory_path):
   """Extracts all the metrics from all the traces of a sandwich runner output
   directory.
 
   Args:
+    benchmark_setup_path: Path of the JSON of the benchmark setup.
     output_directory_path: The sandwich runner's output directory to extract the
         metrics from.
 
   Returns:
     List of dictionaries.
   """
+  benchmark_setup = json.load(open(benchmark_setup_path))
   assert os.path.isdir(output_directory_path)
   metrics = []
   for node_name in os.listdir(output_directory_path):
@@ -289,7 +331,8 @@
     except ValueError:
       continue
     run_directory_path = os.path.join(output_directory_path, node_name)
-    run_metrics = _ExtractMetricsFromRunDirectory(run_directory_path)
+    run_metrics = _ExtractMetricsFromRunDirectory(
+        benchmark_setup, run_directory_path)
     run_metrics['repeat_id'] = repeat_id
     assert set(run_metrics.keys()) == set(CSV_FIELD_NAMES)
     metrics.append(run_metrics)
diff --git a/tools/android/loading/sandwich_metrics_unittest.py b/tools/android/loading/sandwich_metrics_unittest.py
index e7553bc3..ea813e2 100644
--- a/tools/android/loading/sandwich_metrics_unittest.py
+++ b/tools/android/loading/sandwich_metrics_unittest.py
@@ -232,19 +232,6 @@
     with self.assertRaises(ValueError):
       puller.ComputeSpeedIndex(completness_record)
 
-  def testCommandLine(self):
-    tmp_dir = tempfile.mkdtemp()
-    for dirname in ['1', '2', 'whatever']:
-      os.mkdir(os.path.join(tmp_dir, dirname))
-      LoadingTrace(_MINIMALIST_TRACE_EVENTS).ToJsonFile(
-          os.path.join(tmp_dir, dirname, sandwich_runner.TRACE_FILENAME))
-
-    process = subprocess.Popen(['python', puller.__file__, tmp_dir])
-    process.wait()
-    shutil.rmtree(tmp_dir)
-
-    self.assertEquals(0, process.returncode)
-
 
 if __name__ == '__main__':
   unittest.main()
diff --git a/tools/android/loading/sandwich_misc.py b/tools/android/loading/sandwich_misc.py
index 5ecc064..a99f9732 100644
--- a/tools/android/loading/sandwich_misc.py
+++ b/tools/android/loading/sandwich_misc.py
@@ -75,6 +75,13 @@
   wpr_archive.Persist()
 
 
+def _FilterOutDataRequests(requests):
+  for request in filter(lambda r: not r.IsDataRequest(), requests):
+    if request.protocol not in {'http/0.9', 'http/1.0', 'http/1.1'}:
+      raise RuntimeError('Unknown request protocol {}'.format(request.protocol))
+    yield request
+
+
 def ExtractDiscoverableUrls(loading_trace_path, subresource_discoverer):
   """Extracts discoverable resource urls from a loading trace according to a
   sub-resource discoverer.
@@ -117,16 +124,7 @@
   # Prune out data:// requests.
   whitelisted_urls = set()
   logging.info('white-listing %s' % first_resource_request.url)
-  for request in discovered_requests:
-    # Work-around where the protocol may be none for an unclear reason yet.
-    # TODO(gabadie): Follow up on this with Clovis guys and possibly remove
-    #   this work-around.
-    if not request.protocol:
-      logging.warning('ignoring %s (no protocol)' % request.url)
-      continue
-    # Ignore data protocols.
-    if not request.protocol.startswith('http'):
-      continue
+  for request in _FilterOutDataRequests(discovered_requests):
     logging.info('white-listing %s' % request.url)
     whitelisted_urls.add(request.url)
   return whitelisted_urls
@@ -154,35 +152,29 @@
     logging.error('+     ' + url)
 
 
-class _RequestOutcome:
+class RequestOutcome:
   All, ServedFromCache, NotServedFromCache = range(3)
 
 
-def _ListUrlRequests(trace, request_kind):
+def ListUrlRequests(trace, request_kind):
   """Lists requested URLs from a trace.
 
   Args:
     trace: (LoadingTrace) loading trace.
-    request_kind: _RequestOutcome indicating the subset of requests to output.
+    request_kind: RequestOutcome indicating the subset of requests to output.
 
   Returns:
     set([str])
   """
   urls = set()
-  for request_event in trace.request_track.GetEvents():
-    if request_event.protocol == None:
-      continue
-    if request_event.protocol.startswith('data'):
-      continue
-    if not request_event.protocol.startswith('http'):
-      raise RuntimeError('Unknown protocol {}'.format(request_event.protocol))
-    if (request_kind == _RequestOutcome.ServedFromCache and
+  for request_event in _FilterOutDataRequests(trace.request_track.GetEvents()):
+    if (request_kind == RequestOutcome.ServedFromCache and
         request_event.from_disk_cache):
       urls.add(request_event.url)
-    elif (request_kind == _RequestOutcome.NotServedFromCache and
+    elif (request_kind == RequestOutcome.NotServedFromCache and
         not request_event.from_disk_cache):
       urls.add(request_event.url)
-    elif request_kind == _RequestOutcome.All:
+    elif request_kind == RequestOutcome.All:
       urls.add(request_event.url)
   return urls
 
@@ -216,12 +208,12 @@
     trace = LoadingTrace.FromJsonFile(trace_path)
     logging.info('verifying %s from %s' % (trace.url, trace_path))
     _PrintUrlSetComparison(url_resources,
-        _ListUrlRequests(trace, _RequestOutcome.All), 'All resources')
+        ListUrlRequests(trace, RequestOutcome.All), 'All resources')
     _PrintUrlSetComparison(url_resources.intersection(cache_whitelist),
-        _ListUrlRequests(trace, _RequestOutcome.ServedFromCache),
+        ListUrlRequests(trace, RequestOutcome.ServedFromCache),
         'Cached resources')
     sent_url_requests = \
-        _ListUrlRequests(trace, _RequestOutcome.NotServedFromCache)
+        ListUrlRequests(trace, RequestOutcome.NotServedFromCache)
     _PrintUrlSetComparison(url_resources.difference(cache_whitelist),
         sent_url_requests, 'Non cached resources')
     all_sent_url_requests.update(sent_url_requests)
@@ -278,9 +270,8 @@
       continue
     logging.info('lists resources of %s from %s' % (trace.url, trace_path))
     urls_set = set()
-    for request_event in trace.request_track.GetEvents():
-      if not request_event.protocol.startswith('http'):
-        continue
+    for request_event in _FilterOutDataRequests(
+        trace.request_track.GetEvents()):
       if request_event.url not in urls_set:
         logging.info('  %s' % request_event.url)
         urls_set.add(request_event.url)
diff --git a/tools/android/loading/sandwich_task_builder.py b/tools/android/loading/sandwich_task_builder.py
index ea763ecb..318f869 100644
--- a/tools/android/loading/sandwich_task_builder.py
+++ b/tools/android/loading/sandwich_task_builder.py
@@ -201,6 +201,7 @@
       with open(SetupBenchmark.path, 'w') as output:
         json.dump({
             'cache_whitelist': [url for url in whitelisted_urls],
+            'subresource_discoverer': subresource_discoverer,
             'url_resources': url_resources,
           }, output)
 
@@ -234,7 +235,7 @@
           SetupBenchmark.path, RunBenchmark.path)
       trace_metrics_list = \
           sandwich_metrics.ExtractMetricsFromRunnerOutputDirectory(
-              RunBenchmark.path)
+              SetupBenchmark.path, RunBenchmark.path)
       trace_metrics_list.sort(key=lambda e: e['repeat_id'])
       with open(ExtractMetrics.path, 'w') as csv_file:
         writer = csv.DictWriter(csv_file,
diff --git a/tools/battor_agent/battor_agent_bin.cc b/tools/battor_agent/battor_agent_bin.cc
index 7424d1d..d309a12d 100644
--- a/tools/battor_agent/battor_agent_bin.cc
+++ b/tools/battor_agent/battor_agent_bin.cc
@@ -135,17 +135,18 @@
         StartTracing();
       } else if (cmd.find("StopTracing") != std::string::npos) {
         std::vector<std::string> tokens = TokenizeString(cmd);
-        if (tokens.size() == 1 && tokens[0] == "StopTracing") {
-          // No path given.
-          StopTracing();
-        } else if (tokens.size() == 2 && tokens[0] == "StopTracing") {
-          // Path given.
-          StopTracing(tokens[1]);
-        } else {
+        if (tokens[0] != "StopTracing" || tokens.size() > 2) {
           std::cout << "Invalid StopTracing command." << endl;
           std::cout << kUsage << endl;
           continue;
         }
+
+        // tokens[1] contains the optional output file argument, which allows
+        // users to dump the trace to a file instead instead of to STDOUT.
+        std::string trace_output_file =
+            tokens.size() == 2 ? tokens[1] : std::string();
+
+        StopTracing(trace_output_file);
         break;
       } else if (cmd == "SupportsExplicitClockSync") {
         PrintSupportsExplicitClockSync();
@@ -209,8 +210,8 @@
     done_.Signal();
   }
 
-  void StopTracing(const std::string& path = "") {
-    trace_output_file_ = path;
+  void StopTracing(const std::string& trace_output_file) {
+    trace_output_file_ = trace_output_file;
     io_thread_.task_runner()->PostTask(
         FROM_HERE,
         base::Bind(&BattOrAgent::StopTracing, base::Unretained(agent_.get())));
@@ -223,8 +224,7 @@
     if (error == BATTOR_ERROR_NONE) {
       if (trace_output_file_.empty()) {
         std::cout << trace;
-      }
-      else {
+      } else {
         std::ofstream trace_stream(trace_output_file_);
         if (!trace_stream.is_open()) {
           std::cout << "Tracing output file could not be opened." << endl;
@@ -298,7 +298,6 @@
   std::unique_ptr<BattOrAgent> agent_;
 
   std::string trace_output_file_;
-
 };
 
 }  // namespace battor
diff --git a/tools/gn/BUILD.gn b/tools/gn/BUILD.gn
index 204d909f..d377ca3 100644
--- a/tools/gn/BUILD.gn
+++ b/tools/gn/BUILD.gn
@@ -207,6 +207,10 @@
     "visual_studio_utils.h",
     "visual_studio_writer.cc",
     "visual_studio_writer.h",
+    "xcode_object.cc",
+    "xcode_object.h",
+    "xcode_writer.cc",
+    "xcode_writer.h",
     "xml_element_writer.cc",
     "xml_element_writer.h",
   ]
diff --git a/tools/gn/DEPS b/tools/gn/DEPS
new file mode 100644
index 0000000..0de07bb
--- /dev/null
+++ b/tools/gn/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+third_party/re2",
+]
diff --git a/tools/gn/bootstrap/bootstrap.py b/tools/gn/bootstrap/bootstrap.py
index 523a3c0..2262ab4a 100755
--- a/tools/gn/bootstrap/bootstrap.py
+++ b/tools/gn/bootstrap/bootstrap.py
@@ -114,23 +114,32 @@
   return 0
 
 
-def build_gn_with_ninja_manually(tempdir, options):
-  root_gen_dir = os.path.join(tempdir, 'gen')
-  mkdir_p(root_gen_dir)
-
-  mkdir_p(os.path.join(root_gen_dir, 'base', 'allocator'))
+def write_buildflag_header_manually(root_gen_dir, header, flags):
+  mkdir_p(os.path.join(root_gen_dir, os.path.dirname(header)))
   with tempfile.NamedTemporaryFile() as f:
-    f.write('--flags USE_EXPERIMENTAL_ALLOCATOR_SHIM=%s'
-            % ('true' if is_linux else 'false'))
+    f.write('--flags')
+    for name,value in flags.items():
+      f.write(' ' + name + '=' + value)
     f.flush()
 
     check_call([
         os.path.join(SRC_ROOT, 'build', 'write_buildflag_header.py'),
-        '--output', 'base/allocator/features.h',
+        '--output', header,
         '--gen-dir', root_gen_dir,
         '--definitions', f.name,
     ])
 
+
+def build_gn_with_ninja_manually(tempdir, options):
+  root_gen_dir = os.path.join(tempdir, 'gen')
+  mkdir_p(root_gen_dir)
+
+  write_buildflag_header_manually(root_gen_dir, 'base/allocator/features.h',
+      {'USE_EXPERIMENTAL_ALLOCATOR_SHIM': 'true' if is_linux else 'false'})
+
+  write_buildflag_header_manually(root_gen_dir, 'base/debug/debugging_flags.h',
+      {'ENABLE_PROFILING': 'false'})
+
   if is_mac:
     # //base/build_time.cc needs base/generated_build_date.h,
     # and this file is only included for Mac builds.
diff --git a/tools/gn/bundle_data.h b/tools/gn/bundle_data.h
index d742674..9a2ea07 100644
--- a/tools/gn/bundle_data.h
+++ b/tools/gn/bundle_data.h
@@ -98,6 +98,9 @@
   SourceDir& plugins_dir() { return plugins_dir_; }
   const SourceDir& plugins_dir() const { return plugins_dir_; }
 
+  std::string& product_type() { return product_type_; }
+  const std::string& product_type() const { return product_type_; }
+
   // Recursive collection of all bundle_data that the target depends on.
   const UniqueTargets& bundle_deps() const { return bundle_deps_; }
 
@@ -112,6 +115,12 @@
   SourceDir resources_dir_;
   SourceDir executable_dir_;
   SourceDir plugins_dir_;
+
+  // This is the target type as known to Xcode. This is only used to generate
+  // the Xcode project file when using --ide=xcode.
+  std::string product_type_;
+
+  DISALLOW_COPY_AND_ASSIGN(BundleData);
 };
 
 #endif  // TOOLS_GN_BUNDLE_DATA_H_
diff --git a/tools/gn/command_gen.cc b/tools/gn/command_gen.cc
index fee3f1a..74a5d90 100644
--- a/tools/gn/command_gen.cc
+++ b/tools/gn/command_gen.cc
@@ -20,6 +20,7 @@
 #include "tools/gn/switches.h"
 #include "tools/gn/target.h"
 #include "tools/gn/visual_studio_writer.h"
+#include "tools/gn/xcode_writer.h"
 
 namespace commands {
 
@@ -32,7 +33,11 @@
 const char kSwitchIdeValueVs[] = "vs";
 const char kSwitchIdeValueVs2013[] = "vs2013";
 const char kSwitchIdeValueVs2015[] = "vs2015";
+const char kSwitchIdeValueXcode[] = "xcode";
+const char kSwitchNinjaExtraArgs[] = "ninja-extra-args";
+const char kSwitchRootTarget[] = "root-target";
 const char kSwitchSln[] = "sln";
+const char kSwitchWorkspace[] = "workspace";
 
 // Called on worker thread to write the ninja file.
 void BackgroundDoWrite(const Target* target) {
@@ -188,6 +193,19 @@
                    "ms\n");
     }
     return res;
+  } else if (ide == kSwitchIdeValueXcode) {
+    bool res = XcodeWriter::RunAndWriteFiles(
+        command_line->GetSwitchValueASCII(kSwitchWorkspace),
+        command_line->GetSwitchValueASCII(kSwitchRootTarget),
+        command_line->GetSwitchValueASCII(kSwitchNinjaExtraArgs),
+        command_line->GetSwitchValueASCII(kSwitchFilters), build_settings,
+        builder, err);
+    if (res && !command_line->HasSwitch(switches::kQuiet)) {
+      OutputString("Generating Xcode projects took " +
+                   base::Int64ToString(timer.Elapsed().InMilliseconds()) +
+                   "ms\n");
+    }
+    return res;
   }
 
   *err = Err(Location(), "Unknown IDE: " + ide);
@@ -225,16 +243,35 @@
     "             (default Visual Studio version: 2015)\n"
     "      \"vs2013\" - Visual Studio 2013 project/solution files.\n"
     "      \"vs2015\" - Visual Studio 2015 project/solution files.\n"
-    "\n"
-    "  --sln=<file_name>\n"
-    "      Override default sln file name (\"all\"). Solution file is written\n"
-    "      to the root build directory. Only for Visual Studio.\n"
+    "      \"xcode\" - Xcode workspace/solution files.\n"
     "\n"
     "  --filters=<path_prefixes>\n"
     "      Semicolon-separated list of label patterns used to limit the set\n"
     "      of generated projects (see \"gn help label_pattern\"). Only\n"
-    "      matching targets will be included to the solution. Only for Visual\n"
-    "      Studio.\n"
+    "      matching targets will be included to the solution. Only used for\n"
+    "      Visual Studio and Xcode.\n"
+    "\n"
+    "Visual Studio Flags\n"
+    "\n"
+    "  --sln=<file_name>\n"
+    "      Override default sln file name (\"all\"). Solution file is written\n"
+    "      to the root build directory.\n"
+    "\n"
+    "Xcode Flags\n"
+    "\n"
+    "  --workspace=<file_name>\n"
+    "      Override defaut workspace file name (\"all\"). The workspace file\n"
+    "      is written to the root build directory.\n"
+    "\n"
+    "  --ninja-extra-args=<string>\n"
+    "      This string is passed without any quoting to the ninja invocation\n"
+    "      command-line. Can be used to configure ninja flags, like \"-j\" if\n"
+    "      using goma for example.\n"
+    "\n"
+    "  --root-target=<target_name>\n"
+    "      Name of the target corresponding to \"All\" target in Xcode. If\n"
+    "      unset, \"All\" invokes ninja without any target thus build all the\n"
+    "      targets.\n"
     "\n"
     "Eclipse IDE Support\n"
     "\n"
diff --git a/tools/gn/commands.cc b/tools/gn/commands.cc
index ed7a009..8682d92 100644
--- a/tools/gn/commands.cc
+++ b/tools/gn/commands.cc
@@ -5,6 +5,7 @@
 #include "tools/gn/commands.h"
 
 #include "base/command_line.h"
+#include "base/strings/string_split.h"
 #include "tools/gn/builder.h"
 #include "tools/gn/filesystem_utils.h"
 #include "tools/gn/item.h"
@@ -468,6 +469,27 @@
   }
 }
 
+bool FilterPatternsFromString(const BuildSettings* build_settings,
+                              const std::string& label_list_string,
+                              std::vector<LabelPattern>* filters,
+                              Err* err) {
+  std::vector<std::string> tokens = base::SplitString(
+      label_list_string, ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+  SourceDir root_dir =
+      SourceDirForCurrentDirectory(build_settings->root_path());
+
+  filters->reserve(tokens.size());
+  for (const std::string& token : tokens) {
+    LabelPattern pattern =
+        LabelPattern::GetPattern(root_dir, Value(nullptr, token), err);
+    if (err->has_error())
+      return false;
+    filters->push_back(pattern);
+  }
+
+  return true;
+}
+
 void FilterAndPrintTargets(bool indent, std::vector<const Target*>* targets) {
   if (targets->empty())
     return;
diff --git a/tools/gn/commands.h b/tools/gn/commands.h
index 9d8af5c..fdd10fc 100644
--- a/tools/gn/commands.h
+++ b/tools/gn/commands.h
@@ -140,6 +140,12 @@
                              const std::vector<LabelPattern>& filter,
                              UniqueVector<const Target*>* output);
 
+// Builds a list of pattern from a semicolon-separated list of labels.
+bool FilterPatternsFromString(const BuildSettings* build_settings,
+                              const std::string& label_list_string,
+                              std::vector<LabelPattern>* filters,
+                              Err* err);
+
 // These are the documentation strings for the command-line flags used by
 // FilterAndPrintTargets. Commands that call that function should incorporate
 // these into their help.
diff --git a/tools/gn/create_bundle_target_generator.cc b/tools/gn/create_bundle_target_generator.cc
index 6085419..8374998 100644
--- a/tools/gn/create_bundle_target_generator.cc
+++ b/tools/gn/create_bundle_target_generator.cc
@@ -41,6 +41,14 @@
                     variables::kBundlePlugInsDir,
                     &bundle_data.plugins_dir()))
     return;
+
+  const Value* value = scope_->GetValue(variables::kProductType, true);
+  if (value) {
+    if (!value->VerifyTypeIs(Value::STRING, err_))
+      return;
+
+    bundle_data.product_type().assign(value->string_value());
+  }
 }
 
 bool CreateBundleTargetGenerator::GetBundleDir(
@@ -53,6 +61,8 @@
   if (!value->VerifyTypeIs(Value::STRING, err_))
     return false;
   std::string str = value->string_value();
+  if (!str.empty() && str[str.size() - 1] != '/')
+    str.push_back('/');
   if (!EnsureStringIsInOutputDir(GetBuildSettings()->build_dir(), str,
                                  value->origin(), err_))
     return false;
diff --git a/tools/gn/docs/cookbook.md b/tools/gn/docs/cookbook.md
index cdd6a03..687d9eb 100644
--- a/tools/gn/docs/cookbook.md
+++ b/tools/gn/docs/cookbook.md
@@ -305,8 +305,8 @@
 | `base/base.gyp:run_all_unittests`                                                  | `//base/test:run_all_unittests`          |                      |
 | `base/base.gyp:test_support_base`                                                  | `//base/test:test_support`               |                      |
 | `base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations` | `//base/third_party/dynamic_annotations` |                      |
-| `build/linux/system.gyp:*` (except ssl)                                            | `//build/config/linux:*`                 | Linux system targets |
-| `build/linux/system.gyp:ssl`                                                       | `//crypto:platform`                      | SSL                  |
+| `build/linux/system.gyp:*` (except nss)                                            | `//build/config/linux:*`                 | Linux system targets |
+| `build/linux/system.gyp:nss`                                                       | `//crypto:platform`                      | SSL                  |
 | `net/third_party/nss/ssl.gyp:libssl`                                               | `//crypto:platform`                      | SSL                  |
 | `skia/skia.gyp:skia`                                                               | `//skia`                                 |                      |
 | `testing/gmock.gyp:gmock`                                                          | `//testing/gmock`                        | Secondary tree       |
diff --git a/tools/gn/function_forward_variables_from.cc b/tools/gn/function_forward_variables_from.cc
index dd3629b..8f3b90de 100644
--- a/tools/gn/function_forward_variables_from.cc
+++ b/tools/gn/function_forward_variables_from.cc
@@ -54,6 +54,18 @@
         return;
       }
 
+      // Don't allow clobbering existing values.
+      const Value* existing_value = dest->GetValue(storage_key);
+      if (existing_value) {
+        *err = Err(cur, "Clobbering existing value.",
+            "The current scope already defines a value \"" +
+             cur.string_value() + "\".\nforward_variables_from() won't clobber "
+             "existing values. If you want to\nmerge lists, you'll need to "
+             "do this explicitly.");
+        err->AppendSubErr(Err(*existing_value, "value being clobbered."));
+        return;
+      }
+
       // Keep the origin information from the original value. The normal
       // usage is for this to be used in a template, and if there's an error,
       // the user expects to see the line where they set the variable
diff --git a/tools/gn/function_forward_variables_from_unittest.cc b/tools/gn/function_forward_variables_from_unittest.cc
index e5137a4..2e6f5a2 100644
--- a/tools/gn/function_forward_variables_from_unittest.cc
+++ b/tools/gn/function_forward_variables_from_unittest.cc
@@ -8,28 +8,46 @@
 
 TEST(FunctionForwardVariablesFrom, List) {
   Scheduler scheduler;
-  TestWithScope setup;
-
-  // Defines a template and copy the two x and y, and z values out.
-  TestParseInput input(
-    "template(\"a\") {\n"
-    "  forward_variables_from(invoker, [\"x\", \"y\", \"z\"])\n"
-    "  assert(!defined(z))\n"  // "z" should still be undefined.
-    "  print(\"$target_name, $x, $y\")\n"
-    "}\n"
-    "a(\"target\") {\n"
-    "  x = 1\n"
-    "  y = 2\n"
-    "}\n");
-
-  ASSERT_FALSE(input.has_error());
-
   Err err;
-  input.parsed()->Execute(setup.scope(), &err);
-  ASSERT_FALSE(err.has_error()) << err.message();
+  std::string program =
+      "template(\"a\") {\n"
+      "  forward_variables_from(invoker, [\"x\", \"y\", \"z\"])\n"
+      "  assert(!defined(z))\n"  // "z" should still be undefined.
+      "  print(\"$target_name, $x, $y\")\n"
+      "}\n"
+      "a(\"target\") {\n"
+      "  x = 1\n"
+      "  y = 2\n"
+      "}\n";
 
-  EXPECT_EQ("target, 1, 2\n", setup.print_output());
-  setup.print_output().clear();
+  {
+    TestWithScope setup;
+
+    // Defines a template and copy the two x and y, and z values out.
+    TestParseInput input(program);
+    ASSERT_FALSE(input.has_error());
+
+    input.parsed()->Execute(setup.scope(), &err);
+    ASSERT_FALSE(err.has_error()) << err.message();
+
+    EXPECT_EQ("target, 1, 2\n", setup.print_output());
+    setup.print_output().clear();
+  }
+
+  {
+    TestWithScope setup;
+
+    // Test that the same input but forwarding a variable with the name of
+    // something in the given scope throws an error rather than clobbering it.
+    // This uses the same known-good program as before, but adds another
+    // variable in the scope before it.
+    TestParseInput clobber("x = 1\n" + program);
+    ASSERT_FALSE(clobber.has_error());
+
+    clobber.parsed()->Execute(setup.scope(), &err);
+    ASSERT_TRUE(err.has_error());  // Should thow a clobber error.
+    EXPECT_EQ("Clobbering existing value.", err.message());
+  }
 }
 
 TEST(FunctionForwardVariablesFrom, ListWithExclusion) {
diff --git a/tools/gn/functions_target.cc b/tools/gn/functions_target.cc
index 7ec5a50..cc863ac 100644
--- a/tools/gn/functions_target.cc
+++ b/tools/gn/functions_target.cc
@@ -331,7 +331,8 @@
     "Variables\n"
     "\n"
     "  bundle_root_dir*, bundle_resources_dir*, bundle_executable_dir*,\n"
-    "  bundle_plugins_dir*, deps, data_deps, public_deps, visibility\n"
+    "  bundle_plugins_dir*, deps, data_deps, public_deps, visibility,\n"
+    "  product_type\n"
     "  * = required\n"
     "\n"
     "Example\n"
@@ -378,6 +379,7 @@
     "      }\n"
     "\n"
     "      create_bundle(\"${app_name}.app\") {\n"
+    "        product_type = \"com.apple.product-type.application\"\n"
     "        deps = [\n"
     "          \":${app_name}_bundle_executable\",\n"
     "          \":${app_name}_bundle_info_plist\",\n"
diff --git a/tools/gn/gn.gyp b/tools/gn/gn.gyp
index 79f83a7..86b5d4b3c 100644
--- a/tools/gn/gn.gyp
+++ b/tools/gn/gn.gyp
@@ -207,6 +207,10 @@
         'visual_studio_utils.h',
         'visual_studio_writer.cc',
         'visual_studio_writer.h',
+        'xcode_object.cc',
+        'xcode_object.h',
+        'xcode_writer.cc',
+        'xcode_writer.h',
         'xml_element_writer.cc',
         'xml_element_writer.h',
       ],
diff --git a/tools/gn/gn_main.cc b/tools/gn/gn_main.cc
index 135ed56..245270ee 100644
--- a/tools/gn/gn_main.cc
+++ b/tools/gn/gn_main.cc
@@ -73,9 +73,12 @@
   if (found_command != command_map.end()) {
     retval = found_command->second.runner(args);
   } else {
-    Err(Location(),
-        "Command \"" + command + "\" unknown.").PrintToStdout();
-    commands::RunHelp(std::vector<std::string>());
+    Err(Location(), "Command \"" + command + "\" unknown.").PrintToStdout();
+    OutputString(
+        "Available commands (type \"gn help <command>\" for more details):\n");
+    for (const auto& cmd : commands::GetCommands())
+      PrintShortHelp(cmd.second.help_short);
+
     retval = 1;
   }
 
diff --git a/tools/gn/source_file_type.cc b/tools/gn/source_file_type.cc
index 72b872c..328b2abb 100644
--- a/tools/gn/source_file_type.cc
+++ b/tools/gn/source_file_type.cc
@@ -11,7 +11,8 @@
   base::StringPiece extension = FindExtension(&file.value());
   if (extension == "cc" || extension == "cpp" || extension == "cxx")
     return SOURCE_CPP;
-  if (extension == "h")
+  if (extension == "h" || extension == "hpp" || extension == "hxx" ||
+      extension == "hh")
     return SOURCE_H;
   if (extension == "c")
     return SOURCE_C;
diff --git a/tools/gn/variables.cc b/tools/gn/variables.cc
index eea5bca..a65d940 100644
--- a/tools/gn/variables.cc
+++ b/tools/gn/variables.cc
@@ -1326,6 +1326,19 @@
     "  using \"msvc\"-style precompiled headers. It will be implicitly added\n"
     "  to the sources of the target. See \"gn help precompiled_header\".\n";
 
+const char kProductType[] = "product_type";
+const char kProductType_HelpShort[] =
+    "product_type: [string] Product type for Xcode projects.";
+const char kProductType_Help[] =
+    "product_type: Product type for Xcode projects.\n"
+    "\n"
+    "  Correspond to the type of the product of a create_bundle target. Only\n"
+    "  meaningful to Xcode (used as part of the Xcode project generation).\n"
+    "\n"
+    "  When generating Xcode project files, only create_bundle target with\n"
+    "  a non-empty product_type will have a corresponding target in Xcode\n"
+    "  project.\n";
+
 const char kPublic[] = "public";
 const char kPublic_HelpShort[] =
     "public: [file list] Declare public header files for a target.";
@@ -1698,6 +1711,7 @@
     INSERT_VARIABLE(Outputs)
     INSERT_VARIABLE(PrecompiledHeader)
     INSERT_VARIABLE(PrecompiledSource)
+    INSERT_VARIABLE(ProductType)
     INSERT_VARIABLE(Public)
     INSERT_VARIABLE(PublicConfigs)
     INSERT_VARIABLE(PublicDeps)
diff --git a/tools/gn/variables.h b/tools/gn/variables.h
index 2523c1f..0aaa8e0 100644
--- a/tools/gn/variables.h
+++ b/tools/gn/variables.h
@@ -215,6 +215,10 @@
 extern const char kPrecompiledSource_HelpShort[];
 extern const char kPrecompiledSource_Help[];
 
+extern const char kProductType[];
+extern const char kProductType_HelpShort[];
+extern const char kProductType_Help[];
+
 extern const char kPublic[];
 extern const char kPublic_HelpShort[];
 extern const char kPublic_Help[];
diff --git a/tools/gn/visual_studio_writer.cc b/tools/gn/visual_studio_writer.cc
index 87dfa81..50d6878a 100644
--- a/tools/gn/visual_studio_writer.cc
+++ b/tools/gn/visual_studio_writer.cc
@@ -12,7 +12,6 @@
 #include <string>
 
 #include "base/logging.h"
-#include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "tools/gn/builder.h"
@@ -237,18 +236,10 @@
   if (dir_filters.empty()) {
     targets = builder->GetAllResolvedTargets();
   } else {
-    std::vector<std::string> tokens = base::SplitString(
-        dir_filters, ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
-    SourceDir root_dir =
-        SourceDirForCurrentDirectory(build_settings->root_path());
-
     std::vector<LabelPattern> filters;
-    for (const std::string& token : tokens) {
-      LabelPattern pattern =
-          LabelPattern::GetPattern(root_dir, Value(nullptr, token), err);
-      if (err->has_error())
-        return false;
-      filters.push_back(pattern);
+    if (!commands::FilterPatternsFromString(build_settings, dir_filters,
+                                            &filters, err)) {
+      return false;
     }
 
     commands::FilterTargetsByPatterns(builder->GetAllResolvedTargets(), filters,
diff --git a/tools/gn/xcode_object.cc b/tools/gn/xcode_object.cc
new file mode 100644
index 0000000..bc89944
--- /dev/null
+++ b/tools/gn/xcode_object.cc
@@ -0,0 +1,858 @@
+// Copyright 2016 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 "tools/gn/xcode_object.h"
+
+#include <iomanip>
+#include <sstream>
+#include <utility>
+
+#include "base/files/file_path.h"
+#include "base/logging.h"
+#include "base/memory/ptr_util.h"
+#include "base/strings/string_util.h"
+
+// Helper methods -------------------------------------------------------------
+
+namespace {
+struct IndentRules {
+  bool one_line;
+  unsigned level;
+};
+
+std::vector<std::unique_ptr<PBXObject>> EmptyPBXObjectVector() {
+  return std::vector<std::unique_ptr<PBXObject>>();
+}
+
+bool CharNeedEscaping(char c) {
+  if (base::IsAsciiAlpha(c) || base::IsAsciiDigit(c))
+    return false;
+  if (c == '$' || c == '.' || c == '/' || c == '_')
+    return false;
+  return true;
+}
+
+bool StringNeedEscaping(const std::string& string) {
+  if (string.empty())
+    return true;
+  if (string.find("___") != std::string::npos)
+    return true;
+
+  for (char c : string) {
+    if (CharNeedEscaping(c))
+      return true;
+  }
+  return false;
+}
+
+std::string EncodeString(const std::string& string) {
+  if (!StringNeedEscaping(string))
+    return string;
+
+  std::stringstream buffer;
+  buffer << '"';
+  for (char c : string) {
+    if (c <= 31) {
+      switch (c) {
+        case '\a':
+          buffer << "\\a";
+          break;
+        case '\b':
+          buffer << "\\b";
+          break;
+        case '\t':
+          buffer << "\\t";
+          break;
+        case '\n':
+        case '\r':
+          buffer << "\\n";
+          break;
+        case '\v':
+          buffer << "\\v";
+          break;
+        case '\f':
+          buffer << "\\f";
+          break;
+        default:
+          buffer << std::hex << std::setw(4) << std::left << "\\U"
+                 << static_cast<unsigned>(c);
+          break;
+      }
+    } else {
+      if (c == '"' || c == '\\')
+        buffer << '\\';
+      buffer << c;
+    }
+  }
+  buffer << '"';
+  return buffer.str();
+}
+
+const char* GetSourceType(const base::FilePath::StringType& ext) {
+  std::map<base::FilePath::StringType, const char*> extension_map = {
+      {FILE_PATH_LITERAL(".a"), "archive.ar"},
+      {FILE_PATH_LITERAL(".app"), "wrapper.application"},
+      {FILE_PATH_LITERAL(".bdic"), "file"},
+      {FILE_PATH_LITERAL(".bundle"), "wrapper.cfbundle"},
+      {FILE_PATH_LITERAL(".c"), "sourcecode.c.c"},
+      {FILE_PATH_LITERAL(".cc"), "sourcecode.cpp.cpp"},
+      {FILE_PATH_LITERAL(".cpp"), "sourcecode.cpp.cpp"},
+      {FILE_PATH_LITERAL(".css"), "text.css"},
+      {FILE_PATH_LITERAL(".cxx"), "sourcecode.cpp.cpp"},
+      {FILE_PATH_LITERAL(".dart"), "sourcecode"},
+      {FILE_PATH_LITERAL(".dylib"), "compiled.mach-o.dylib"},
+      {FILE_PATH_LITERAL(".framework"), "wrapper.framework"},
+      {FILE_PATH_LITERAL(".h"), "sourcecode.c.h"},
+      {FILE_PATH_LITERAL(".hxx"), "sourcecode.cpp.h"},
+      {FILE_PATH_LITERAL(".icns"), "image.icns"},
+      {FILE_PATH_LITERAL(".java"), "sourcecode.java"},
+      {FILE_PATH_LITERAL(".js"), "sourcecode.javascript"},
+      {FILE_PATH_LITERAL(".kext"), "wrapper.kext"},
+      {FILE_PATH_LITERAL(".m"), "sourcecode.c.objc"},
+      {FILE_PATH_LITERAL(".mm"), "sourcecode.cpp.objcpp"},
+      {FILE_PATH_LITERAL(".nib"), "wrapper.nib"},
+      {FILE_PATH_LITERAL(".o"), "compiled.mach-o.objfile"},
+      {FILE_PATH_LITERAL(".pdf"), "image.pdf"},
+      {FILE_PATH_LITERAL(".pl"), "text.script.perl"},
+      {FILE_PATH_LITERAL(".plist"), "text.plist.xml"},
+      {FILE_PATH_LITERAL(".pm"), "text.script.perl"},
+      {FILE_PATH_LITERAL(".png"), "image.png"},
+      {FILE_PATH_LITERAL(".py"), "text.script.python"},
+      {FILE_PATH_LITERAL(".r"), "sourcecode.rez"},
+      {FILE_PATH_LITERAL(".rez"), "sourcecode.rez"},
+      {FILE_PATH_LITERAL(".s"), "sourcecode.asm"},
+      {FILE_PATH_LITERAL(".storyboard"), "file.storyboard"},
+      {FILE_PATH_LITERAL(".strings"), "text.plist.strings"},
+      {FILE_PATH_LITERAL(".swift"), "sourcecode.swift"},
+      {FILE_PATH_LITERAL(".ttf"), "file"},
+      {FILE_PATH_LITERAL(".xcassets"), "folder.assetcatalog"},
+      {FILE_PATH_LITERAL(".xcconfig"), "text.xcconfig"},
+      {FILE_PATH_LITERAL(".xcdatamodel"), "wrapper.xcdatamodel"},
+      {FILE_PATH_LITERAL(".xcdatamodeld"), "wrapper.xcdatamodeld"},
+      {FILE_PATH_LITERAL(".xib"), "file.xib"},
+      {FILE_PATH_LITERAL(".y"), "sourcecode.yacc"},
+  };
+
+  const auto& iter = extension_map.find(ext);
+  if (iter != extension_map.end()) {
+    return iter->second;
+  }
+
+  return "text";
+}
+
+bool HasExplicitFileType(const base::FilePath::StringType& ext) {
+  return ext == FILE_PATH_LITERAL(".dart");
+}
+
+bool IsSourceFileForIndexing(const base::FilePath::StringType& ext) {
+  return ext == FILE_PATH_LITERAL(".c") || ext == FILE_PATH_LITERAL(".cc") ||
+         ext == FILE_PATH_LITERAL(".cpp") || ext == FILE_PATH_LITERAL(".cxx") ||
+         ext == FILE_PATH_LITERAL(".m") || ext == FILE_PATH_LITERAL(".mm");
+}
+
+void PrintValue(std::ostream& out, IndentRules rules, unsigned value) {
+  out << value;
+}
+
+void PrintValue(std::ostream& out, IndentRules rules, const char* value) {
+  out << EncodeString(value);
+}
+
+void PrintValue(std::ostream& out,
+                IndentRules rules,
+                const std::string& value) {
+  out << EncodeString(value);
+}
+
+void PrintValue(std::ostream& out, IndentRules rules, const PBXObject* value) {
+  out << value->Reference();
+}
+
+template <typename ObjectClass>
+void PrintValue(std::ostream& out,
+                IndentRules rules,
+                const std::unique_ptr<ObjectClass>& value) {
+  PrintValue(out, rules, value.get());
+}
+
+template <typename ValueType>
+void PrintValue(std::ostream& out,
+                IndentRules rules,
+                const std::vector<ValueType>& values) {
+  IndentRules sub_rule{rules.one_line, rules.level + 1};
+  out << "(" << (rules.one_line ? " " : "\n");
+  for (const auto& value : values) {
+    if (!sub_rule.one_line)
+      out << std::string(sub_rule.level, '\t');
+
+    PrintValue(out, sub_rule, value);
+    out << "," << (rules.one_line ? " " : "\n");
+  }
+
+  if (!rules.one_line && rules.level)
+    out << std::string(rules.level, '\t');
+  out << ")";
+}
+
+template <typename ValueType>
+void PrintValue(std::ostream& out,
+                IndentRules rules,
+                const std::map<std::string, ValueType>& values) {
+  IndentRules sub_rule{rules.one_line, rules.level + 1};
+  out << "{" << (rules.one_line ? " " : "\n");
+  for (const auto& pair : values) {
+    if (!sub_rule.one_line)
+      out << std::string(sub_rule.level, '\t');
+
+    out << pair.first << " = ";
+    PrintValue(out, sub_rule, pair.second);
+    out << ";" << (rules.one_line ? " " : "\n");
+  }
+
+  if (!rules.one_line && rules.level)
+    out << std::string(rules.level, '\t');
+  out << "}";
+}
+
+template <typename ValueType>
+void PrintProperty(std::ostream& out,
+                   IndentRules rules,
+                   const char* name,
+                   ValueType&& value) {
+  if (!rules.one_line && rules.level)
+    out << std::string(rules.level, '\t');
+
+  out << name << " = ";
+  PrintValue(out, rules, std::forward<ValueType>(value));
+  out << ";" << (rules.one_line ? " " : "\n");
+}
+}  // namespace
+
+// PBXObjectClass -------------------------------------------------------------
+
+const char* ToString(PBXObjectClass cls) {
+  switch (cls) {
+    case PBXAggregateTargetClass:
+      return "PBXAggregateTarget";
+    case PBXBuildFileClass:
+      return "PBXBuildFile";
+    case PBXFileReferenceClass:
+      return "PBXFileReference";
+    case PBXFrameworksBuildPhaseClass:
+      return "PBXFrameworksBuildPhase";
+    case PBXGroupClass:
+      return "PBXGroup";
+    case PBXNativeTargetClass:
+      return "PBXNativeTarget";
+    case PBXProjectClass:
+      return "PBXProject";
+    case PBXShellScriptBuildPhaseClass:
+      return "PBXShellScriptBuildPhase";
+    case PBXSourcesBuildPhaseClass:
+      return "PBXSourcesBuildPhase";
+    case XCBuildConfigurationClass:
+      return "XCBuildConfiguration";
+    case XCConfigurationListClass:
+      return "XCConfigurationList";
+  }
+  NOTREACHED();
+  return nullptr;
+}
+
+// PBXObjectVisitor -----------------------------------------------------------
+
+PBXObjectVisitor::PBXObjectVisitor() {}
+
+PBXObjectVisitor::~PBXObjectVisitor() {}
+
+// PBXObject ------------------------------------------------------------------
+
+PBXObject::PBXObject() {}
+
+PBXObject::~PBXObject() {}
+
+void PBXObject::SetId(const std::string& id) {
+  DCHECK(id_.empty());
+  DCHECK(!id.empty());
+  id_.assign(id);
+}
+
+std::string PBXObject::Reference() const {
+  std::string comment = Comment();
+  if (comment.empty())
+    return id_;
+
+  return id_ + " /* " + comment + " */";
+}
+
+std::string PBXObject::Comment() const {
+  return Name();
+}
+
+void PBXObject::Visit(PBXObjectVisitor& visitor) {
+  visitor.Visit(this);
+}
+
+// PBXBuildPhase --------------------------------------------------------------
+
+PBXBuildPhase::PBXBuildPhase() {}
+
+PBXBuildPhase::~PBXBuildPhase() {}
+
+// PBXTarget ------------------------------------------------------------------
+
+PBXTarget::PBXTarget(const std::string& name,
+                     const std::string& shell_script,
+                     const std::string& config_name,
+                     const PBXAttributes& attributes)
+    : configurations_(new XCConfigurationList(config_name, attributes, this)),
+      name_(name) {
+  if (!shell_script.empty()) {
+    build_phases_.push_back(
+        base::WrapUnique(new PBXShellScriptBuildPhase(name, shell_script)));
+  }
+}
+
+PBXTarget::~PBXTarget() {}
+
+std::string PBXTarget::Name() const {
+  return name_;
+}
+
+void PBXTarget::Visit(PBXObjectVisitor& visitor) {
+  PBXObject::Visit(visitor);
+  configurations_->Visit(visitor);
+  for (const auto& build_phase : build_phases_) {
+    build_phase->Visit(visitor);
+  }
+}
+
+// PBXAggregateTarget ---------------------------------------------------------
+
+PBXAggregateTarget::PBXAggregateTarget(const std::string& name,
+                                       const std::string& shell_script,
+                                       const std::string& config_name,
+                                       const PBXAttributes& attributes)
+    : PBXTarget(name, shell_script, config_name, attributes) {}
+
+PBXAggregateTarget::~PBXAggregateTarget() {}
+
+PBXObjectClass PBXAggregateTarget::Class() const {
+  return PBXAggregateTargetClass;
+}
+
+void PBXAggregateTarget::Print(std::ostream& out, unsigned indent) const {
+  const std::string indent_str(indent, '\t');
+  const IndentRules rules = {false, indent + 1};
+  out << indent_str << Reference() << " = {\n";
+  PrintProperty(out, rules, "isa", ToString(Class()));
+  PrintProperty(out, rules, "buildConfigurationList", configurations_);
+  PrintProperty(out, rules, "buildPhases", build_phases_);
+  PrintProperty(out, rules, "dependencies", EmptyPBXObjectVector());
+  PrintProperty(out, rules, "name", name_);
+  PrintProperty(out, rules, "productName", name_);
+  out << indent_str << "};\n";
+}
+
+// PBXBuildFile ---------------------------------------------------------------
+
+PBXBuildFile::PBXBuildFile(const PBXFileReference* file_reference,
+                           const PBXSourcesBuildPhase* build_phase)
+    : file_reference_(file_reference), build_phase_(build_phase) {
+  DCHECK(file_reference_);
+  DCHECK(build_phase_);
+}
+
+PBXBuildFile::~PBXBuildFile() {}
+
+PBXObjectClass PBXBuildFile::Class() const {
+  return PBXBuildFileClass;
+}
+
+std::string PBXBuildFile::Name() const {
+  return file_reference_->Name() + " in " + build_phase_->Name();
+}
+
+void PBXBuildFile::Print(std::ostream& out, unsigned indent) const {
+  const std::string indent_str(indent, '\t');
+  const IndentRules rules = {true, 0};
+  out << indent_str << Reference() << " = {";
+  PrintProperty(out, rules, "isa", ToString(Class()));
+  PrintProperty(out, rules, "fileRef", file_reference_);
+  out << "};\n";
+}
+
+// PBXFileReference -----------------------------------------------------------
+
+PBXFileReference::PBXFileReference(const std::string& name,
+                                   const std::string& path,
+                                   const std::string& type)
+    : name_(name), path_(path), type_(type) {}
+
+PBXFileReference::~PBXFileReference() {}
+
+PBXObjectClass PBXFileReference::Class() const {
+  return PBXFileReferenceClass;
+}
+
+std::string PBXFileReference::Name() const {
+  return path_;
+}
+
+void PBXFileReference::Print(std::ostream& out, unsigned indent) const {
+  const std::string indent_str(indent, '\t');
+  const IndentRules rules = {true, 0};
+  out << indent_str << Reference() << " = {";
+  PrintProperty(out, rules, "isa", ToString(Class()));
+
+  if (!type_.empty()) {
+    PrintProperty(out, rules, "explicitFileType", type_);
+    PrintProperty(out, rules, "includeInIndex", 0u);
+  } else {
+    const base::FilePath::StringType ext =
+        base::FilePath::FromUTF8Unsafe(path_).Extension();
+
+    if (HasExplicitFileType(ext))
+      PrintProperty(out, rules, "explicitFileType", GetSourceType(ext));
+    else
+      PrintProperty(out, rules, "lastKnownFileType", GetSourceType(ext));
+  }
+
+  if (name_ != path_ && !name_.empty())
+    PrintProperty(out, rules, "name", name_);
+
+  PrintProperty(out, rules, "path", path_);
+  PrintProperty(out, rules, "sourceTree",
+                type_.empty() ? "<group>" : "BUILT_PRODUCTS_DIR");
+  out << "};\n";
+}
+
+// PBXFrameworksBuildPhase ----------------------------------------------------
+
+PBXFrameworksBuildPhase::PBXFrameworksBuildPhase() {}
+
+PBXFrameworksBuildPhase::~PBXFrameworksBuildPhase() {}
+
+PBXObjectClass PBXFrameworksBuildPhase::Class() const {
+  return PBXFrameworksBuildPhaseClass;
+}
+
+std::string PBXFrameworksBuildPhase::Name() const {
+  return "Frameworks";
+}
+
+void PBXFrameworksBuildPhase::Print(std::ostream& out, unsigned indent) const {
+  const std::string indent_str(indent, '\t');
+  const IndentRules rules = {false, indent + 1};
+  out << indent_str << Reference() << " = {\n";
+  PrintProperty(out, rules, "isa", ToString(Class()));
+  PrintProperty(out, rules, "buildActionMask", 0x7fffffffu);
+  PrintProperty(out, rules, "files", EmptyPBXObjectVector());
+  PrintProperty(out, rules, "runOnlyForDeploymentPostprocessing", 0u);
+  out << indent_str << "};\n";
+}
+
+// PBXGroup -------------------------------------------------------------------
+
+PBXGroup::PBXGroup(const std::string& path, const std::string& name)
+    : name_(name), path_(path) {}
+
+PBXGroup::~PBXGroup() {}
+
+PBXObject* PBXGroup::AddChild(std::unique_ptr<PBXObject> child) {
+  DCHECK(child);
+  children_.push_back(std::move(child));
+  return children_.back().get();
+}
+
+PBXFileReference* PBXGroup::AddSourceFile(const std::string& source_path) {
+  DCHECK(!source_path.empty());
+  std::string::size_type sep = source_path.find("/");
+  if (sep == std::string::npos) {
+    children_.push_back(base::WrapUnique(
+        new PBXFileReference(std::string(), source_path, std::string())));
+    return static_cast<PBXFileReference*>(children_.back().get());
+  }
+
+  PBXGroup* group = nullptr;
+  base::StringPiece component(source_path.data(), sep);
+  for (const auto& child : children_) {
+    if (child->Class() != PBXGroupClass)
+      continue;
+
+    PBXGroup* child_as_group = static_cast<PBXGroup*>(child.get());
+    if (child_as_group->path_ == component) {
+      group = child_as_group;
+      break;
+    }
+  }
+
+  if (!group) {
+    children_.push_back(base::WrapUnique(new PBXGroup(component.as_string())));
+    group = static_cast<PBXGroup*>(children_.back().get());
+  }
+
+  DCHECK(group);
+  DCHECK(group->path_ == component);
+  return group->AddSourceFile(source_path.substr(sep + 1));
+}
+
+PBXObjectClass PBXGroup::Class() const {
+  return PBXGroupClass;
+}
+
+std::string PBXGroup::Name() const {
+  if (!name_.empty())
+    return name_;
+  if (!path_.empty())
+    return path_;
+  return std::string();
+}
+
+void PBXGroup::Visit(PBXObjectVisitor& visitor) {
+  PBXObject::Visit(visitor);
+  for (const auto& child : children_) {
+    child->Visit(visitor);
+  }
+}
+
+void PBXGroup::Print(std::ostream& out, unsigned indent) const {
+  const std::string indent_str(indent, '\t');
+  const IndentRules rules = {false, indent + 1};
+  out << indent_str << Reference() << " = {\n";
+  PrintProperty(out, rules, "isa", ToString(Class()));
+  PrintProperty(out, rules, "children", children_);
+  if (!name_.empty())
+    PrintProperty(out, rules, "name", name_);
+  if (!path_.empty())
+    PrintProperty(out, rules, "path", path_);
+  PrintProperty(out, rules, "sourceTree", "<group>");
+  out << indent_str << "};\n";
+}
+
+// PBXNativeTarget ------------------------------------------------------------
+
+PBXNativeTarget::PBXNativeTarget(const std::string& name,
+                                 const std::string& shell_script,
+                                 const std::string& config_name,
+                                 const PBXAttributes& attributes,
+                                 const std::string& product_type,
+                                 const PBXFileReference* product_reference)
+    : PBXTarget(name, shell_script, config_name, attributes),
+      product_reference_(product_reference),
+      product_type_(product_type) {
+  DCHECK(product_reference_);
+  build_phases_.push_back(base::WrapUnique(new PBXSourcesBuildPhase));
+  source_build_phase_ =
+      static_cast<PBXSourcesBuildPhase*>(build_phases_.back().get());
+
+  build_phases_.push_back(base::WrapUnique(new PBXFrameworksBuildPhase));
+}
+
+PBXNativeTarget::~PBXNativeTarget() {}
+
+void PBXNativeTarget::AddFileForIndexing(
+    const PBXFileReference* file_reference) {
+  DCHECK(file_reference);
+  source_build_phase_->AddBuildFile(
+      base::WrapUnique(new PBXBuildFile(file_reference, source_build_phase_)));
+}
+
+PBXObjectClass PBXNativeTarget::Class() const {
+  return PBXNativeTargetClass;
+}
+
+void PBXNativeTarget::Print(std::ostream& out, unsigned indent) const {
+  const std::string indent_str(indent, '\t');
+  const IndentRules rules = {false, indent + 1};
+  out << indent_str << Reference() << " = {\n";
+  PrintProperty(out, rules, "isa", ToString(Class()));
+  PrintProperty(out, rules, "buildConfigurationList", configurations_);
+  PrintProperty(out, rules, "buildPhases", build_phases_);
+  PrintProperty(out, rules, "buildRules", EmptyPBXObjectVector());
+  PrintProperty(out, rules, "dependencies", EmptyPBXObjectVector());
+  PrintProperty(out, rules, "name", name_);
+  PrintProperty(out, rules, "productName", name_);
+  PrintProperty(out, rules, "productReference", product_reference_);
+  PrintProperty(out, rules, "productType", product_type_);
+  out << indent_str << "};\n";
+}
+
+// PBXProject -----------------------------------------------------------------
+
+PBXProject::PBXProject(const std::string& name,
+                       const std::string& config_name,
+                       const std::string& source_path,
+                       const PBXAttributes& attributes)
+    : name_(name), config_name_(config_name), target_for_indexing_(nullptr) {
+  attributes_["BuildIndependentTargetsInParallel"] = "YES";
+
+  main_group_.reset(new PBXGroup);
+  sources_ = static_cast<PBXGroup*>(main_group_->AddChild(
+      base::WrapUnique(new PBXGroup(source_path, "Source"))));
+  products_ = static_cast<PBXGroup*>(main_group_->AddChild(
+      base::WrapUnique(new PBXGroup(std::string(), "Product"))));
+  main_group_->AddChild(base::WrapUnique(new PBXGroup(std::string(), "Build")));
+
+  configurations_.reset(new XCConfigurationList(config_name, attributes, this));
+}
+
+PBXProject::~PBXProject() {}
+
+void PBXProject::AddSourceFile(const std::string& source_path) {
+  PBXFileReference* file_reference = sources_->AddSourceFile(source_path);
+  const base::FilePath::StringType ext =
+      base::FilePath::FromUTF8Unsafe(source_path).Extension();
+  if (!IsSourceFileForIndexing(ext))
+    return;
+
+  if (!target_for_indexing_) {
+    PBXAttributes attributes;
+    attributes["EXECUTABLE_PREFIX"] = "";
+    attributes["HEADER_SEARCH_PATHS"] = sources_->path();
+    attributes["PRODUCT_NAME"] = name_;
+
+    PBXFileReference* product_reference = static_cast<PBXFileReference*>(
+        products_->AddChild(base::WrapUnique(new PBXFileReference(
+            std::string(), name_, "compiled.mach-o.executable"))));
+
+    const char product_type[] = "com.apple.product-type.tool";
+    targets_.push_back(base::WrapUnique(
+        new PBXNativeTarget(name_, std::string(), config_name_, attributes,
+                            product_type, product_reference)));
+    target_for_indexing_ = static_cast<PBXNativeTarget*>(targets_.back().get());
+  }
+
+  DCHECK(target_for_indexing_);
+  target_for_indexing_->AddFileForIndexing(file_reference);
+}
+
+void PBXProject::AddAggregateTarget(const std::string& name,
+                                    const std::string& shell_script) {
+  PBXAttributes attributes;
+  attributes["CODE_SIGNING_REQUIRED"] = "NO";
+  attributes["CONFIGURATION_BUILD_DIR"] = ".";
+  attributes["PRODUCT_NAME"] = name;
+
+  targets_.push_back(base::WrapUnique(
+      new PBXAggregateTarget(name, shell_script, config_name_, attributes)));
+}
+
+void PBXProject::AddNativeTarget(const std::string& name,
+                                 const std::string& type,
+                                 const std::string& output_name,
+                                 const std::string& output_type,
+                                 const std::string& shell_script) {
+  const base::FilePath::StringType ext =
+      base::FilePath::FromUTF8Unsafe(output_name).Extension();
+
+  PBXFileReference* product = static_cast<PBXFileReference*>(
+      products_->AddChild(base::WrapUnique(new PBXFileReference(
+          name, output_name, type.empty() ? GetSourceType(ext) : type))));
+
+  PBXAttributes attributes;
+  attributes["CODE_SIGNING_REQUIRED"] = "NO";
+  attributes["CONFIGURATION_BUILD_DIR"] = ".";
+  attributes["PRODUCT_NAME"] = name;
+
+  targets_.push_back(base::WrapUnique(new PBXNativeTarget(
+      name, shell_script, config_name_, attributes, output_type, product)));
+}
+
+void PBXProject::SetProjectDirPath(const std::string& project_dir_path) {
+  DCHECK(!project_dir_path.empty());
+  project_dir_path_.assign(project_dir_path);
+}
+
+void PBXProject::SetProjectRoot(const std::string& project_root) {
+  DCHECK(!project_root.empty());
+  project_root_.assign(project_root);
+}
+
+void PBXProject::AddTarget(std::unique_ptr<PBXTarget> target) {
+  DCHECK(target);
+  targets_.push_back(std::move(target));
+}
+
+PBXObjectClass PBXProject::Class() const {
+  return PBXProjectClass;
+}
+
+std::string PBXProject::Name() const {
+  return name_;
+}
+
+std::string PBXProject::Comment() const {
+  return "Project object";
+}
+
+void PBXProject::Visit(PBXObjectVisitor& visitor) {
+  PBXObject::Visit(visitor);
+  configurations_->Visit(visitor);
+  main_group_->Visit(visitor);
+  for (const auto& target : targets_) {
+    target->Visit(visitor);
+  }
+}
+
+void PBXProject::Print(std::ostream& out, unsigned indent) const {
+  const std::string indent_str(indent, '\t');
+  const IndentRules rules = {false, indent + 1};
+  out << indent_str << Reference() << " = {\n";
+  PrintProperty(out, rules, "isa", ToString(Class()));
+  PrintProperty(out, rules, "attributes", attributes_);
+  PrintProperty(out, rules, "buildConfigurationList", configurations_);
+  PrintProperty(out, rules, "compatibilityVersion", "Xcode 3.2");
+  PrintProperty(out, rules, "developmentRegion", "English");
+  PrintProperty(out, rules, "hasScannedForEncodings", 1u);
+  PrintProperty(out, rules, "knownRegions", std::vector<std::string>({"en"}));
+  PrintProperty(out, rules, "mainGroup", main_group_);
+  PrintProperty(out, rules, "projectDirPath", project_dir_path_);
+  PrintProperty(out, rules, "projectRoot", project_root_);
+  PrintProperty(out, rules, "targets", targets_);
+  out << indent_str << "};\n";
+}
+
+// PBXShellScriptBuildPhase ---------------------------------------------------
+
+PBXShellScriptBuildPhase::PBXShellScriptBuildPhase(
+    const std::string& name,
+    const std::string& shell_script)
+    : name_("Action \"Compile and copy " + name + " via ninja\""),
+      shell_script_(shell_script) {}
+
+PBXShellScriptBuildPhase::~PBXShellScriptBuildPhase() {}
+
+PBXObjectClass PBXShellScriptBuildPhase::Class() const {
+  return PBXShellScriptBuildPhaseClass;
+}
+
+std::string PBXShellScriptBuildPhase::Name() const {
+  return name_;
+}
+
+void PBXShellScriptBuildPhase::Print(std::ostream& out, unsigned indent) const {
+  const std::string indent_str(indent, '\t');
+  const IndentRules rules = {false, indent + 1};
+  out << indent_str << Reference() << " = {\n";
+  PrintProperty(out, rules, "isa", ToString(Class()));
+  PrintProperty(out, rules, "buildActionMask", 0x7fffffffu);
+  PrintProperty(out, rules, "files", EmptyPBXObjectVector());
+  PrintProperty(out, rules, "inputPaths", EmptyPBXObjectVector());
+  PrintProperty(out, rules, "name", name_);
+  PrintProperty(out, rules, "outputPaths", EmptyPBXObjectVector());
+  PrintProperty(out, rules, "runOnlyForDeploymentPostprocessing", 0u);
+  PrintProperty(out, rules, "shellPath", "/bin/sh");
+  PrintProperty(out, rules, "shellScript", shell_script_);
+  PrintProperty(out, rules, "showEnvVarsInLog", 0u);
+  out << indent_str << "};\n";
+}
+
+// PBXSourcesBuildPhase -------------------------------------------------------
+
+PBXSourcesBuildPhase::PBXSourcesBuildPhase() {}
+
+PBXSourcesBuildPhase::~PBXSourcesBuildPhase() {}
+
+void PBXSourcesBuildPhase::AddBuildFile(
+    std::unique_ptr<PBXBuildFile> build_file) {
+  files_.push_back(std::move(build_file));
+}
+
+PBXObjectClass PBXSourcesBuildPhase::Class() const {
+  return PBXSourcesBuildPhaseClass;
+}
+
+std::string PBXSourcesBuildPhase::Name() const {
+  return "Sources";
+}
+
+void PBXSourcesBuildPhase::Visit(PBXObjectVisitor& visitor) {
+  PBXBuildPhase::Visit(visitor);
+  for (const auto& file : files_) {
+    file->Visit(visitor);
+  }
+}
+
+void PBXSourcesBuildPhase::Print(std::ostream& out, unsigned indent) const {
+  const std::string indent_str(indent, '\t');
+  const IndentRules rules = {false, indent + 1};
+  out << indent_str << Reference() << " = {\n";
+  PrintProperty(out, rules, "isa", ToString(Class()));
+  PrintProperty(out, rules, "buildActionMask", 0x7fffffffu);
+  PrintProperty(out, rules, "files", files_);
+  PrintProperty(out, rules, "runOnlyForDeploymentPostprocessing", 0u);
+  out << indent_str << "};\n";
+}
+
+// XCBuildConfiguration -------------------------------------------------------
+
+XCBuildConfiguration::XCBuildConfiguration(const std::string& name,
+                                           const PBXAttributes& attributes)
+    : attributes_(attributes), name_(name) {}
+
+XCBuildConfiguration::~XCBuildConfiguration() {}
+
+PBXObjectClass XCBuildConfiguration::Class() const {
+  return XCBuildConfigurationClass;
+}
+
+std::string XCBuildConfiguration::Name() const {
+  return name_;
+}
+
+void XCBuildConfiguration::Print(std::ostream& out, unsigned indent) const {
+  const std::string indent_str(indent, '\t');
+  const IndentRules rules = {false, indent + 1};
+  out << indent_str << Reference() << " = {\n";
+  PrintProperty(out, rules, "isa", ToString(Class()));
+  PrintProperty(out, rules, "buildSettings", attributes_);
+  PrintProperty(out, rules, "name", name_);
+  out << indent_str << "};\n";
+}
+
+// XCConfigurationList --------------------------------------------------------
+
+XCConfigurationList::XCConfigurationList(const std::string& name,
+                                         const PBXAttributes& attributes,
+                                         const PBXObject* owner_reference)
+    : owner_reference_(owner_reference) {
+  DCHECK(owner_reference_);
+  configurations_.push_back(
+      base::WrapUnique(new XCBuildConfiguration(name, attributes)));
+}
+
+XCConfigurationList::~XCConfigurationList() {}
+
+PBXObjectClass XCConfigurationList::Class() const {
+  return XCConfigurationListClass;
+}
+
+std::string XCConfigurationList::Name() const {
+  std::stringstream buffer;
+  buffer << "Build configuration list for "
+         << ToString(owner_reference_->Class()) << " \""
+         << owner_reference_->Name() << "\"";
+  return buffer.str();
+}
+
+void XCConfigurationList::Visit(PBXObjectVisitor& visitor) {
+  PBXObject::Visit(visitor);
+  for (const auto& configuration : configurations_) {
+    configuration->Visit(visitor);
+  }
+}
+
+void XCConfigurationList::Print(std::ostream& out, unsigned indent) const {
+  const std::string indent_str(indent, '\t');
+  const IndentRules rules = {false, indent + 1};
+  out << indent_str << Reference() << " = {\n";
+  PrintProperty(out, rules, "isa", ToString(Class()));
+  PrintProperty(out, rules, "buildConfigurations", configurations_);
+  PrintProperty(out, rules, "defaultConfigurationIsVisible", 1u);
+  PrintProperty(out, rules, "defaultConfigurationName",
+                configurations_[0]->Name());
+  out << indent_str << "};\n";
+}
diff --git a/tools/gn/xcode_object.h b/tools/gn/xcode_object.h
new file mode 100644
index 0000000..25f2415
--- /dev/null
+++ b/tools/gn/xcode_object.h
@@ -0,0 +1,392 @@
+// Copyright 2016 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 TOOLS_GN_XCODE_OBJECT_H_
+#define TOOLS_GN_XCODE_OBJECT_H_
+
+#include <iosfwd>
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/macros.h"
+
+// Helper classes to generate Xcode project files.
+//
+// This code is based on gyp xcodeproj_file.py generator. It does not support
+// all features of Xcode project but instead just enough to implement a hybrid
+// mode where Xcode uses external scripts to perform the compilation steps.
+//
+// See https://chromium.googlesource.com/external/gyp/+/master/pylib/gyp/xcodeproj_file.py
+// for more information on Xcode project file format.
+
+// PBXObjectClass -------------------------------------------------------------
+
+enum PBXObjectClass {
+  // Those values needs to stay sorted in alphabetic order.
+  PBXAggregateTargetClass,
+  PBXBuildFileClass,
+  PBXFileReferenceClass,
+  PBXFrameworksBuildPhaseClass,
+  PBXGroupClass,
+  PBXNativeTargetClass,
+  PBXProjectClass,
+  PBXShellScriptBuildPhaseClass,
+  PBXSourcesBuildPhaseClass,
+  XCBuildConfigurationClass,
+  XCConfigurationListClass,
+};
+
+const char* ToString(PBXObjectClass cls);
+
+// Forward-declarations -------------------------------------------------------
+
+class PBXAggregateTarget;
+class PBXBuildFile;
+class PBXFileReference;
+class PBXBuildPhase;
+class PBXFrameworksBuildPhase;
+class PBXGroup;
+class PBXNativeTarget;
+class PBXObject;
+class PBXProject;
+class PBXShellScriptBuildPhase;
+class PBXSourcesBuildPhase;
+class PBXTarget;
+class XCBuildConfiguration;
+class XCConfigurationList;
+
+using PBXAttributes = std::map<std::string, std::string>;
+
+// PBXObjectVisitor -----------------------------------------------------------
+
+class PBXObjectVisitor {
+ public:
+  PBXObjectVisitor();
+  virtual ~PBXObjectVisitor();
+  virtual void Visit(PBXObject* object) = 0;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(PBXObjectVisitor);
+};
+
+// PBXObject ------------------------------------------------------------------
+
+class PBXObject {
+ public:
+  PBXObject();
+  virtual ~PBXObject();
+
+  const std::string id() const { return id_; }
+  void SetId(const std::string& id);
+
+  std::string Reference() const;
+
+  virtual PBXObjectClass Class() const = 0;
+  virtual std::string Name() const = 0;
+  virtual std::string Comment() const;
+  virtual void Visit(PBXObjectVisitor& visitor);
+  virtual void Print(std::ostream& out, unsigned indent) const = 0;
+
+ private:
+  std::string id_;
+
+  DISALLOW_COPY_AND_ASSIGN(PBXObject);
+};
+
+// PBXBuildPhase --------------------------------------------------------------
+
+class PBXBuildPhase : public PBXObject {
+ public:
+  PBXBuildPhase();
+  ~PBXBuildPhase() override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(PBXBuildPhase);
+};
+
+// PBXTarget ------------------------------------------------------------------
+
+class PBXTarget : public PBXObject {
+ public:
+  PBXTarget(const std::string& name,
+            const std::string& shell_script,
+            const std::string& config_name,
+            const PBXAttributes& attributes);
+  ~PBXTarget() override;
+
+  // PXBObject implementation.
+  std::string Name() const override;
+  void Visit(PBXObjectVisitor& visitor) override;
+
+ protected:
+  std::unique_ptr<XCConfigurationList> configurations_;
+  std::vector<std::unique_ptr<PBXBuildPhase>> build_phases_;
+  PBXSourcesBuildPhase* source_build_phase_;
+  std::string name_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(PBXTarget);
+};
+
+// PBXAggregateTarget ---------------------------------------------------------
+
+class PBXAggregateTarget : public PBXTarget {
+ public:
+  PBXAggregateTarget(const std::string& name,
+                     const std::string& shell_script,
+                     const std::string& config_name,
+                     const PBXAttributes& attributes);
+  ~PBXAggregateTarget() override;
+
+  // PXBObject implementation.
+  PBXObjectClass Class() const override;
+  void Print(std::ostream& out, unsigned indent) const override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(PBXAggregateTarget);
+};
+
+// PBXBuildFile ---------------------------------------------------------------
+
+class PBXBuildFile : public PBXObject {
+ public:
+  PBXBuildFile(const PBXFileReference* file_reference,
+               const PBXSourcesBuildPhase* build_phase);
+  ~PBXBuildFile() override;
+
+  // PXBObject implementation.
+  PBXObjectClass Class() const override;
+  std::string Name() const override;
+  void Print(std::ostream& out, unsigned indent) const override;
+
+ private:
+  const PBXFileReference* file_reference_;
+  const PBXSourcesBuildPhase* build_phase_;
+
+  DISALLOW_COPY_AND_ASSIGN(PBXBuildFile);
+};
+
+// PBXFileReference -----------------------------------------------------------
+
+class PBXFileReference : public PBXObject {
+ public:
+  PBXFileReference(const std::string& name,
+                   const std::string& path,
+                   const std::string& type);
+  ~PBXFileReference() override;
+
+  // PBXObject implementation.
+  PBXObjectClass Class() const override;
+  std::string Name() const override;
+  void Print(std::ostream& out, unsigned indent) const override;
+
+ private:
+  std::string name_;
+  std::string path_;
+  std::string type_;
+
+  DISALLOW_COPY_AND_ASSIGN(PBXFileReference);
+};
+
+// PBXFrameworksBuildPhase ----------------------------------------------------
+
+class PBXFrameworksBuildPhase : public PBXBuildPhase {
+ public:
+  PBXFrameworksBuildPhase();
+  ~PBXFrameworksBuildPhase() override;
+
+  // PBXObject implementation.
+  PBXObjectClass Class() const override;
+  std::string Name() const override;
+  void Print(std::ostream& out, unsigned indent) const override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(PBXFrameworksBuildPhase);
+};
+
+// PBXGroup -------------------------------------------------------------------
+
+class PBXGroup : public PBXObject {
+ public:
+  explicit PBXGroup(const std::string& path = std::string(),
+                    const std::string& name = std::string());
+  ~PBXGroup() override;
+
+  const std::string& path() const { return path_; }
+
+  PBXObject* AddChild(std::unique_ptr<PBXObject> child);
+  PBXFileReference* AddSourceFile(const std::string& source_path);
+
+  // PBXObject implementation.
+  PBXObjectClass Class() const override;
+  std::string Name() const override;
+  void Visit(PBXObjectVisitor& visitor) override;
+  void Print(std::ostream& out, unsigned indent) const override;
+
+ private:
+  std::vector<std::unique_ptr<PBXObject>> children_;
+  std::string name_;
+  std::string path_;
+
+  DISALLOW_COPY_AND_ASSIGN(PBXGroup);
+};
+
+// PBXNativeTarget ------------------------------------------------------------
+
+class PBXNativeTarget : public PBXTarget {
+ public:
+  PBXNativeTarget(const std::string& name,
+                  const std::string& shell_script,
+                  const std::string& config_name,
+                  const PBXAttributes& attributes,
+                  const std::string& product_type,
+                  const PBXFileReference* product_reference);
+  ~PBXNativeTarget() override;
+
+  void AddFileForIndexing(const PBXFileReference* file_reference);
+
+  // PBXObject implementation.
+  PBXObjectClass Class() const override;
+  void Print(std::ostream& out, unsigned indent) const override;
+
+ private:
+  const PBXFileReference* product_reference_;
+  std::string product_type_;
+
+  DISALLOW_COPY_AND_ASSIGN(PBXNativeTarget);
+};
+
+// PBXProject -----------------------------------------------------------------
+
+class PBXProject : public PBXObject {
+ public:
+  PBXProject(const std::string& name,
+             const std::string& config_name,
+             const std::string& source_path,
+             const PBXAttributes& attributes);
+  ~PBXProject() override;
+
+  void AddSourceFile(const std::string& source_path);
+  void AddAggregateTarget(const std::string& name,
+                          const std::string& shell_script);
+  void AddNativeTarget(const std::string& name,
+                       const std::string& type,
+                       const std::string& output_name,
+                       const std::string& output_type,
+                       const std::string& shell_script);
+
+  void SetProjectDirPath(const std::string& project_dir_path);
+  void SetProjectRoot(const std::string& project_root);
+  void AddTarget(std::unique_ptr<PBXTarget> target);
+
+  // PBXObject implementation.
+  PBXObjectClass Class() const override;
+  std::string Name() const override;
+  std::string Comment() const override;
+  void Visit(PBXObjectVisitor& visitor) override;
+  void Print(std::ostream& out, unsigned indent) const override;
+
+ private:
+  PBXAttributes attributes_;
+  std::unique_ptr<XCConfigurationList> configurations_;
+  std::unique_ptr<PBXGroup> main_group_;
+  std::string project_dir_path_;
+  std::string project_root_;
+  std::vector<std::unique_ptr<PBXTarget>> targets_;
+  std::string name_;
+  std::string config_name_;
+
+  PBXGroup* sources_;
+  PBXGroup* products_;
+  PBXNativeTarget* target_for_indexing_;
+
+  DISALLOW_COPY_AND_ASSIGN(PBXProject);
+};
+
+// PBXShellScriptBuildPhase ---------------------------------------------------
+
+class PBXShellScriptBuildPhase : public PBXBuildPhase {
+ public:
+  PBXShellScriptBuildPhase(const std::string& name,
+                           const std::string& shell_script);
+  ~PBXShellScriptBuildPhase() override;
+
+  // PBXObject implementation.
+  PBXObjectClass Class() const override;
+  std::string Name() const override;
+  void Print(std::ostream& out, unsigned indent) const override;
+
+ private:
+  std::string name_;
+  std::string shell_script_;
+
+  DISALLOW_COPY_AND_ASSIGN(PBXShellScriptBuildPhase);
+};
+
+// PBXSourcesBuildPhase -------------------------------------------------------
+
+class PBXSourcesBuildPhase : public PBXBuildPhase {
+ public:
+  PBXSourcesBuildPhase();
+  ~PBXSourcesBuildPhase() override;
+
+  void AddBuildFile(std::unique_ptr<PBXBuildFile> build_file);
+
+  // PBXObject implementation.
+  PBXObjectClass Class() const override;
+  std::string Name() const override;
+  void Visit(PBXObjectVisitor& visitor) override;
+  void Print(std::ostream& out, unsigned indent) const override;
+
+ private:
+  std::vector<std::unique_ptr<PBXBuildFile>> files_;
+
+  DISALLOW_COPY_AND_ASSIGN(PBXSourcesBuildPhase);
+};
+
+// XCBuildConfiguration -------------------------------------------------------
+
+class XCBuildConfiguration : public PBXObject {
+ public:
+  XCBuildConfiguration(const std::string& name,
+                       const PBXAttributes& attributes);
+  ~XCBuildConfiguration() override;
+
+  // PBXObject implementation.
+  PBXObjectClass Class() const override;
+  std::string Name() const override;
+  void Print(std::ostream& out, unsigned indent) const override;
+
+ private:
+  PBXAttributes attributes_;
+  std::string name_;
+
+  DISALLOW_COPY_AND_ASSIGN(XCBuildConfiguration);
+};
+
+// XCConfigurationList --------------------------------------------------------
+
+class XCConfigurationList : public PBXObject {
+ public:
+  XCConfigurationList(const std::string& name,
+                      const PBXAttributes& attributes,
+                      const PBXObject* owner_reference);
+  ~XCConfigurationList() override;
+
+  // PBXObject implementation.
+  PBXObjectClass Class() const override;
+  std::string Name() const override;
+  void Visit(PBXObjectVisitor& visitor) override;
+  void Print(std::ostream& out, unsigned indent) const override;
+
+ private:
+  std::vector<std::unique_ptr<XCBuildConfiguration>> configurations_;
+  const PBXObject* owner_reference_;
+
+  DISALLOW_COPY_AND_ASSIGN(XCConfigurationList);
+};
+
+#endif  // TOOLS_GN_XCODE_OBJECT_H_
diff --git a/tools/gn/xcode_writer.cc b/tools/gn/xcode_writer.cc
new file mode 100644
index 0000000..4168f7f
--- /dev/null
+++ b/tools/gn/xcode_writer.cc
@@ -0,0 +1,432 @@
+// Copyright 2016 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 "tools/gn/xcode_writer.h"
+
+#include <iomanip>
+#include <map>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <utility>
+
+#include "base/environment.h"
+#include "base/logging.h"
+#include "base/sha1.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_util.h"
+#include "tools/gn/args.h"
+#include "tools/gn/build_settings.h"
+#include "tools/gn/builder.h"
+#include "tools/gn/commands.h"
+#include "tools/gn/deps_iterator.h"
+#include "tools/gn/filesystem_utils.h"
+#include "tools/gn/settings.h"
+#include "tools/gn/source_file.h"
+#include "tools/gn/target.h"
+#include "tools/gn/value.h"
+#include "tools/gn/variables.h"
+#include "tools/gn/xcode_object.h"
+
+namespace {
+
+XcodeWriter::TargetOsType GetTargetOs(const Args& args) {
+  const Value* target_os_value = args.GetArgOverride(variables::kTargetOs);
+  if (target_os_value) {
+    if (target_os_value->type() == Value::STRING) {
+      if (target_os_value->string_value() == "ios")
+        return XcodeWriter::WRITER_TARGET_OS_IOS;
+    }
+  }
+  return XcodeWriter::WRITER_TARGET_OS_MACOS;
+}
+
+std::string GetArchs(const Args& args) {
+  const Value* target_cpu_value = args.GetArgOverride(variables::kTargetCpu);
+  if (target_cpu_value) {
+    if (target_cpu_value->type() == Value::STRING) {
+      if (target_cpu_value->string_value() == "x86")
+        return "i386";
+      if (target_cpu_value->string_value() == "x64")
+        return "x86_64";
+      if (target_cpu_value->string_value() == "arm")
+        return "armv7";
+      if (target_cpu_value->string_value() == "armv7")
+        return "armv7";
+      if (target_cpu_value->string_value() == "arm64")
+        return "armv64";
+    }
+  }
+  return "x86_64";
+}
+
+std::string GetBuildScript(const std::string& target_name,
+                           const std::string& build_path,
+                           const std::string& ninja_extra_args) {
+  std::stringstream script;
+  script << "echo note: \"Compile and copy " << target_name << " via ninja\"\n"
+         << "exec ";
+  if (!build_path.empty())
+    script << "env PATH=\"" << build_path << "\" ";
+  script << "ninja -C .";
+  if (!ninja_extra_args.empty())
+    script << " " << ninja_extra_args;
+  if (!target_name.empty())
+    script << " " << target_name;
+  script << "\nexit 1\n";
+  return script.str();
+}
+
+class CollectPBXObjectsPerClassHelper : public PBXObjectVisitor {
+ public:
+  CollectPBXObjectsPerClassHelper() {}
+
+  void Visit(PBXObject* object) override {
+    DCHECK(object);
+    objects_per_class_[object->Class()].push_back(object);
+  }
+
+  const std::map<PBXObjectClass, std::vector<const PBXObject*>>&
+  objects_per_class() const {
+    return objects_per_class_;
+  }
+
+ private:
+  std::map<PBXObjectClass, std::vector<const PBXObject*>> objects_per_class_;
+
+  DISALLOW_COPY_AND_ASSIGN(CollectPBXObjectsPerClassHelper);
+};
+
+std::map<PBXObjectClass, std::vector<const PBXObject*>>
+CollectPBXObjectsPerClass(PBXProject* project) {
+  CollectPBXObjectsPerClassHelper visitor;
+  project->Visit(visitor);
+  return visitor.objects_per_class();
+}
+
+class RecursivelyAssignIdsHelper : public PBXObjectVisitor {
+ public:
+  RecursivelyAssignIdsHelper(const std::string& seed)
+      : seed_(seed), counter_(0) {}
+
+  void Visit(PBXObject* object) override {
+    std::stringstream buffer;
+    buffer << seed_ << " " << object->Name() << " " << counter_;
+    std::string hash = base::SHA1HashString(buffer.str());
+    DCHECK_EQ(hash.size() % 4, 0u);
+
+    uint32_t id[3] = {0, 0, 0};
+    const uint32_t* ptr = reinterpret_cast<const uint32_t*>(hash.data());
+    for (size_t i = 0; i < hash.size() / 4; i++)
+      id[i % 3] ^= ptr[i];
+
+    object->SetId(base::HexEncode(id, sizeof(id)));
+    ++counter_;
+  }
+
+ private:
+  std::string seed_;
+  int64_t counter_;
+
+  DISALLOW_COPY_AND_ASSIGN(RecursivelyAssignIdsHelper);
+};
+
+void RecursivelyAssignIds(PBXProject* project) {
+  RecursivelyAssignIdsHelper visitor(project->Name());
+  project->Visit(visitor);
+}
+
+}  // namespace
+
+// static
+bool XcodeWriter::RunAndWriteFiles(const std::string& workspace_name,
+                                   const std::string& root_target_name,
+                                   const std::string& ninja_extra_args,
+                                   const std::string& dir_filters_string,
+                                   const BuildSettings* build_settings,
+                                   Builder* builder,
+                                   Err* err) {
+  const XcodeWriter::TargetOsType target_os =
+      GetTargetOs(build_settings->build_args());
+
+  PBXAttributes attributes;
+  switch (target_os) {
+    case XcodeWriter::WRITER_TARGET_OS_IOS:
+      attributes["SDKROOT"] = "iphoneos";
+      attributes["TARGETED_DEVICE_FAMILY"] = "1,2";
+      break;
+    case XcodeWriter::WRITER_TARGET_OS_MACOS:
+      attributes["ARCHS"] = GetArchs(build_settings->build_args());
+      attributes["SDKROOT"] = "macosx10.11";
+      break;
+  }
+
+  const std::string source_path =
+      base::FilePath::FromUTF8Unsafe(
+          RebasePath("//", build_settings->build_dir()))
+          .StripTrailingSeparators()
+          .AsUTF8Unsafe();
+
+  std::string config_name = build_settings->build_dir()
+                                .Resolve(base::FilePath())
+                                .StripTrailingSeparators()
+                                .BaseName()
+                                .AsUTF8Unsafe();
+  DCHECK(!config_name.empty());
+
+  std::string::size_type separator = config_name.find('-');
+  if (separator != std::string::npos)
+    config_name = config_name.substr(0, separator);
+
+  std::vector<const Target*> targets;
+  std::vector<const Target*> all_targets = builder->GetAllResolvedTargets();
+  if (!XcodeWriter::FilterTargets(build_settings, all_targets,
+                                  dir_filters_string, &targets, err)) {
+    return false;
+  }
+
+  XcodeWriter workspace(workspace_name);
+  workspace.CreateProductsProject(targets, attributes, source_path, config_name,
+                                  root_target_name, ninja_extra_args,
+                                  target_os);
+
+  workspace.CreateSourcesProject(all_targets, build_settings->build_dir(),
+                                 attributes, source_path, config_name,
+                                 target_os);
+
+  return workspace.WriteFiles(build_settings, err);
+}
+
+XcodeWriter::XcodeWriter(const std::string& name) : name_(name) {
+  if (name_.empty())
+    name_.assign("all");
+}
+
+XcodeWriter::~XcodeWriter() {}
+
+// static
+bool XcodeWriter::FilterTargets(const BuildSettings* build_settings,
+                                const std::vector<const Target*>& all_targets,
+                                const std::string& dir_filters_string,
+                                std::vector<const Target*>* targets,
+                                Err* err) {
+  // Filter targets according to the semicolon-delimited list of label patterns,
+  // if defined, first.
+  targets->reserve(all_targets.size());
+  if (dir_filters_string.empty()) {
+    *targets = all_targets;
+  } else {
+    std::vector<LabelPattern> filters;
+    if (!commands::FilterPatternsFromString(build_settings, dir_filters_string,
+                                            &filters, err)) {
+      return false;
+    }
+
+    commands::FilterTargetsByPatterns(all_targets, filters, targets);
+  }
+
+  // Filter out all target of type EXECUTABLE that are direct dependency of
+  // a BUNDLE_DATA target (under the assumption that they will be part of a
+  // CREATE_BUNDLE target generating an application bundle). Sort the list
+  // of targets per pointer to use binary search for the removal.
+  std::sort(targets->begin(), targets->end());
+
+  for (const Target* target : all_targets) {
+    if (!target->settings()->is_default())
+      continue;
+
+    if (target->output_type() != Target::BUNDLE_DATA)
+      continue;
+
+    for (const auto& pair : target->GetDeps(Target::DEPS_LINKED)) {
+      if (pair.ptr->output_type() != Target::EXECUTABLE)
+        continue;
+
+      auto iter = std::lower_bound(targets->begin(), targets->end(), pair.ptr);
+      if (iter != targets->end() && *iter == pair.ptr)
+        targets->erase(iter);
+    }
+  }
+
+  // Sort the list of targets per-label to get a consistent ordering of them
+  // in the generated Xcode project (and thus stability of the file generated).
+  std::sort(targets->begin(), targets->end(),
+            [](const Target* a, const Target* b) {
+              return a->label().name() < b->label().name();
+            });
+
+  return true;
+}
+
+void XcodeWriter::CreateProductsProject(
+    const std::vector<const Target*>& targets,
+    const PBXAttributes& attributes,
+    const std::string& source_path,
+    const std::string& config_name,
+    const std::string& root_target,
+    const std::string& ninja_extra_args,
+    TargetOsType target_os) {
+  std::unique_ptr<PBXProject> main_project(
+      new PBXProject("products", config_name, source_path, attributes));
+
+  std::string build_path;
+  std::unique_ptr<base::Environment> env(base::Environment::Create());
+  env->GetVar("PATH", &build_path);
+
+  main_project->AddAggregateTarget(
+      "All", GetBuildScript(root_target, build_path, ninja_extra_args));
+
+  for (const Target* target : targets) {
+    switch (target->output_type()) {
+      case Target::EXECUTABLE:
+        if (target_os == XcodeWriter::WRITER_TARGET_OS_IOS)
+          continue;
+
+        main_project->AddNativeTarget(
+            target->label().name(), "compiled.mach-o.executable",
+            target->output_name().empty() ? target->label().name()
+                                          : target->output_name(),
+            "com.apple.product-type.tool",
+            GetBuildScript(target->label().name(), build_path,
+                           ninja_extra_args));
+        break;
+
+      case Target::CREATE_BUNDLE:
+        if (target->bundle_data().product_type().empty())
+          continue;
+
+        main_project->AddNativeTarget(
+            target->label().name(), std::string(),
+            target->bundle_data()
+                .GetBundleRootDirOutput(target->settings())
+                .Resolve(base::FilePath())
+                .AsUTF8Unsafe(),
+            target->bundle_data().product_type(),
+            GetBuildScript(target->label().name(), build_path,
+                           ninja_extra_args));
+        break;
+
+      default:
+        break;
+    }
+  }
+
+  projects_.push_back(std::move(main_project));
+}
+
+void XcodeWriter::CreateSourcesProject(
+    const std::vector<const Target*>& targets,
+    const SourceDir& root_build_dir,
+    const PBXAttributes& attributes,
+    const std::string& source_path,
+    const std::string& config_name,
+    TargetOsType target_os) {
+  std::vector<SourceFile> sources;
+  for (const Target* target : targets) {
+    if (!target->settings()->is_default())
+      continue;
+
+    for (const SourceFile& source : target->sources()) {
+      if (source.is_system_absolute())
+        continue;
+
+      if (IsStringInOutputDir(root_build_dir, source.value()))
+        continue;
+
+      sources.push_back(source);
+    }
+  }
+
+  std::unique_ptr<PBXProject> sources_for_indexing(
+      new PBXProject("sources", config_name, source_path, attributes));
+
+  // Sort sources to ensure determinisn of the project file generation and
+  // remove duplicate reference to the source files (can happen due to the
+  // bundle_data targets).
+  std::sort(sources.begin(), sources.end());
+  sources.erase(std::unique(sources.begin(), sources.end()), sources.end());
+
+  for (const SourceFile& source : sources) {
+    base::FilePath source_path = source.Resolve(base::FilePath());
+    sources_for_indexing->AddSourceFile(source_path.AsUTF8Unsafe());
+  }
+
+  projects_.push_back(std::move(sources_for_indexing));
+}
+
+bool XcodeWriter::WriteFiles(const BuildSettings* build_settings, Err* err) {
+  for (const auto& project : projects_) {
+    if (!WriteProjectFile(build_settings, project.get(), err))
+      return false;
+  }
+
+  SourceFile xcworkspacedata_file =
+      build_settings->build_dir().ResolveRelativeFile(
+          Value(nullptr, name_ + ".xcworkspace/contents.xcworkspacedata"), err);
+  if (xcworkspacedata_file.is_null())
+    return false;
+
+  std::stringstream xcworkspacedata_string_out;
+  WriteWorkspaceContent(xcworkspacedata_string_out);
+
+  return WriteFileIfChanged(build_settings->GetFullPath(xcworkspacedata_file),
+                            xcworkspacedata_string_out.str(), err);
+}
+
+bool XcodeWriter::WriteProjectFile(const BuildSettings* build_settings,
+                                   PBXProject* project,
+                                   Err* err) {
+  SourceFile pbxproj_file = build_settings->build_dir().ResolveRelativeFile(
+      Value(nullptr, project->Name() + ".xcodeproj/project.pbxproj"), err);
+  if (pbxproj_file.is_null())
+    return false;
+
+  std::stringstream pbxproj_string_out;
+  WriteProjectContent(pbxproj_string_out, project);
+
+  if (!WriteFileIfChanged(build_settings->GetFullPath(pbxproj_file),
+                          pbxproj_string_out.str(), err))
+    return false;
+
+  return true;
+}
+
+void XcodeWriter::WriteWorkspaceContent(std::ostream& out) {
+  out << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+      << "<Workspace version = \"1.0\">\n";
+  for (const auto& project : projects_) {
+    out << "  <FileRef location = \"group:" << project->Name()
+        << ".xcodeproj\"></FileRef>\n";
+  }
+  out << "</Workspace>\n";
+}
+
+void XcodeWriter::WriteProjectContent(std::ostream& out, PBXProject* project) {
+  RecursivelyAssignIds(project);
+
+  out << "// !$*UTF8*$!\n"
+      << "{\n"
+      << "\tarchiveVersion = 1;\n"
+      << "\tclasses = {\n"
+      << "\t};\n"
+      << "\tobjectVersion = 46;\n"
+      << "\tobjects = {\n";
+
+  for (auto& pair : CollectPBXObjectsPerClass(project)) {
+    out << "\n"
+        << "/* Begin " << ToString(pair.first) << " section */\n";
+    std::sort(pair.second.begin(), pair.second.end(),
+              [](const PBXObject* a, const PBXObject* b) {
+                return a->id() < b->id();
+              });
+    for (const auto& object : pair.second) {
+      object->Print(out, 2);
+    }
+    out << "/* End " << ToString(pair.first) << " section */\n";
+  }
+
+  out << "\t};\n"
+      << "\trootObject = " << project->Reference() << ";\n"
+      << "}\n";
+}
diff --git a/tools/gn/xcode_writer.h b/tools/gn/xcode_writer.h
new file mode 100644
index 0000000..dd162c6
--- /dev/null
+++ b/tools/gn/xcode_writer.h
@@ -0,0 +1,97 @@
+// Copyright 2016 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 TOOLS_GN_XCODE_WRITER_H_
+#define TOOLS_GN_XCODE_WRITER_H_
+
+#include <iosfwd>
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/macros.h"
+
+class Builder;
+class BuildSettings;
+class Err;
+class SourceDir;
+class Target;
+
+using PBXAttributes = std::map<std::string, std::string>;
+class PBXProject;
+
+class XcodeWriter {
+ public:
+  enum TargetOsType {
+    WRITER_TARGET_OS_IOS,
+    WRITER_TARGET_OS_MACOS,
+  };
+
+  // Writes Xcode workspace and project files.
+  //
+  // |workspace_name| is the optional name of the workspace file name ("all"
+  // is used if not specified). |root_target_name| is the name of the main
+  // target corresponding to building "All" (for example "gn_all" in Chromium).
+  // |ninja_extra_args| are additional arguments to pass to ninja invocation
+  // (can be used to increase limit of concurrent processes when using goma).
+  // |dir_filters_string| is optional semicolon-separated list of label patterns
+  // used to limit the set of generated projects. Only matching targets will be
+  // included to the workspace. On failure will populate |err| and return false.
+  static bool RunAndWriteFiles(const std::string& workspace_name,
+                               const std::string& root_target_name,
+                               const std::string& ninja_extra_args,
+                               const std::string& dir_filters_string,
+                               const BuildSettings* build_settings,
+                               Builder* builder,
+                               Err* err);
+
+ private:
+  XcodeWriter(const std::string& name);
+  ~XcodeWriter();
+
+  // Filters the list of targets to only return the targets with artifacts
+  // usable from Xcode (mostly application bundles). On failure populate |err|
+  // and return false.
+  static bool FilterTargets(const BuildSettings* build_settings,
+                            const std::vector<const Target*>& all_targets,
+                            const std::string& dir_filters_string,
+                            std::vector<const Target*>* targets,
+                            Err* err);
+
+  // Generate the "products.xcodeproj" project that reference all products
+  // (i.e. targets that have a build artefact usable from Xcode, mostly
+  // application bundles).
+  void CreateProductsProject(const std::vector<const Target*>& targets,
+                             const PBXAttributes& attributes,
+                             const std::string& source_path,
+                             const std::string& config_name,
+                             const std::string& root_target,
+                             const std::string& ninja_extra_args,
+                             TargetOsType target_os);
+
+  // Generates the "sources.xcodeproj" project that reference all source
+  // files to allow Xcode to index them.
+  void CreateSourcesProject(const std::vector<const Target*>& targets,
+                            const SourceDir& root_build_dir,
+                            const PBXAttributes& attributes,
+                            const std::string& source_path,
+                            const std::string& config_name,
+                            TargetOsType target_os);
+
+  bool WriteFiles(const BuildSettings* build_settings, Err* err);
+  bool WriteProjectFile(const BuildSettings* build_settings,
+                        PBXProject* project,
+                        Err* err);
+
+  void WriteWorkspaceContent(std::ostream& out);
+  void WriteProjectContent(std::ostream& out, PBXProject* project);
+
+  std::string name_;
+  std::vector<std::unique_ptr<PBXProject>> projects_;
+
+  DISALLOW_COPY_AND_ASSIGN(XcodeWriter);
+};
+
+#endif  // TOOLS_GN_XCODE_WRITER_H_
diff --git a/tools/ipc_fuzzer/BUILD.gn b/tools/ipc_fuzzer/BUILD.gn
index 7f33cef..ce31589 100644
--- a/tools/ipc_fuzzer/BUILD.gn
+++ b/tools/ipc_fuzzer/BUILD.gn
@@ -19,7 +19,7 @@
   include_dirs = [ "." ]
 }
 
-if (enable_ipc_fuzzer && (is_linux || is_mac || is_win)) {
+if (enable_ipc_fuzzer) {
   assert(!is_component_build, "IPC fuzzer does not support component builds.")
 
   group("ipc_fuzzer_all") {
diff --git a/tools/ipc_fuzzer/ipc_fuzzer.gni b/tools/ipc_fuzzer/ipc_fuzzer.gni
index 1c7d8ca..f4f41ac5 100644
--- a/tools/ipc_fuzzer/ipc_fuzzer.gni
+++ b/tools/ipc_fuzzer/ipc_fuzzer.gni
@@ -2,7 +2,15 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/chrome_build.gni")
+import("//build/config/chromecast_build.gni")
+import("//build/config/sanitizers/sanitizers.gni")
+
 declare_args() {
-  # Don't build IPC fuzzer by default.
-  enable_ipc_fuzzer = false
+  # Build IPC fuzzer by default if it's a supported configuration. For
+  # sanitizer builds, this needs to be enabled explicitly as they can be slow
+  # (especially MSan).
+  enable_ipc_fuzzer =
+      is_clang && !is_component_build && !is_official_build && !is_chromecast &&
+      !using_sanitizer && (is_linux || is_mac || is_win)
 }
diff --git a/tools/ipc_fuzzer/message_lib/BUILD.gn b/tools/ipc_fuzzer/message_lib/BUILD.gn
index 2c6503e..f6a20169 100644
--- a/tools/ipc_fuzzer/message_lib/BUILD.gn
+++ b/tools/ipc_fuzzer/message_lib/BUILD.gn
@@ -2,6 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/features.gni")
+
 static_library("ipc_message_lib") {
   configs += [ "//tools/ipc_fuzzer:ipc_fuzzer_tool_config" ]
   public_deps = [
@@ -9,7 +11,6 @@
     "//chrome/common",
     "//chrome/common/safe_browsing:proto",
     "//components/content_settings/content/common",
-    "//components/nacl/common",
     "//components/network_hints/common",
     "//components/page_load_metrics/common",
     "//components/pdf/common",
@@ -36,4 +37,8 @@
     "message_names.cc",
     "message_names.h",
   ]
+
+  if (enable_nacl) {
+    public_deps += [ "//components/nacl/common" ]
+  }
 }
diff --git a/tools/ipc_fuzzer/message_replay/replay_process.cc b/tools/ipc_fuzzer/message_replay/replay_process.cc
index 54b56de8..dcee5c77 100644
--- a/tools/ipc_fuzzer/message_replay/replay_process.cc
+++ b/tools/ipc_fuzzer/message_replay/replay_process.cc
@@ -105,8 +105,7 @@
   std::string process_type =
       base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
           switches::kProcessType);
-  bool should_use_mojo = process_type == switches::kRendererProcess &&
-                         content::ShouldUseMojoChannel();
+  bool should_use_mojo = process_type == switches::kRendererProcess;
   if (should_use_mojo) {
     std::string token =
         base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
diff --git a/tools/licenses.py b/tools/licenses.py
index 9a6602b..7a77710c 100755
--- a/tools/licenses.py
+++ b/tools/licenses.py
@@ -29,6 +29,9 @@
     # Placeholder directory only, not third-party code.
     os.path.join('third_party','adobe'),
 
+    # Already covered by //third_party/android_tools.
+    os.path.join('third_party','android_tools_internal'),
+
     # Apache 2.0 license. See crbug.com/140478
     os.path.join('third_party','bidichecker'),
 
@@ -42,11 +45,13 @@
     os.path.join('build','secondary'),
     os.path.join('third_party','bison'),
     os.path.join('third_party','blanketjs'),
+    os.path.join('third_party','chromite'),
     os.path.join('third_party','cygwin'),
     os.path.join('third_party','gles2_conform'),
     os.path.join('third_party','gnu_binutils'),
     os.path.join('third_party','gold'),
     os.path.join('third_party','gperf'),
+    os.path.join('third_party','jarjar'),
     os.path.join('third_party','kasko'),
     os.path.join('third_party','lighttpd'),
     os.path.join('third_party','llvm'),
@@ -56,6 +61,7 @@
     os.path.join('third_party','pefile'),
     os.path.join('third_party','perl'),
     os.path.join('third_party','psyco_win32'),
+    os.path.join('third_party','pyelftools'),
     os.path.join('third_party','pylib'),
     os.path.join('third_party','pywebsocket'),
     os.path.join('third_party','qunit'),
@@ -166,12 +172,6 @@
         "URL": "http://code.google.com/p/pdfium/",
         "License": "BSD",
     },
-    os.path.join('third_party', 'pdfsqueeze'): {
-        "Name": "pdfsqueeze",
-        "URL": "http://code.google.com/p/pdfsqueeze/",
-        "License": "Apache 2.0",
-        "License File": "COPYING",
-    },
     os.path.join('third_party', 'ppapi'): {
         "Name": "ppapi",
         "URL": "http://code.google.com/p/ppapi/",
@@ -298,7 +298,6 @@
     os.path.join('third_party', 'mozilla'),
     os.path.join('third_party', 'npapi'),
     os.path.join('third_party', 'ots'),
-    os.path.join('third_party', 'pdfsqueeze'),
     os.path.join('third_party', 'ppapi'),
     os.path.join('third_party', 'qcms'),
     os.path.join('third_party', 're2'),
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index ba68e17..feda59d7 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -358,11 +358,6 @@
       'ios-device-gn': 'ios_gn',
       'ios-simulator': 'ios_gyp',
       'ios-simulator-gn': 'ios_gn',
-      'iOS_Device': 'ios_gyp',
-      'iOS_Device_(ninja)': 'ios_gyp',
-      'iOS_Device_GN': 'ios_gn',
-      'iOS_Simulator_(dbg)': 'ios_gyp',
-      'iOS_Simulator_GN_(dbg)': 'ios_gn',
     },
 
     'chromium.memory.fyi': {
@@ -765,12 +760,6 @@
       'ios-device-gn': 'ios_gn',
       'ios-simulator': 'ios_gyp',
       'ios-simulator-gn': 'ios_gn',
-      'ios_dbg_simulator': 'ios_gyp',
-      'ios_dbg_simulator_gn': 'ios_gn',
-      'ios_dbg_simulator_ninja': 'ios_gyp',
-      'ios_rel_device': 'ios_gyp',
-      'ios_rel_device_gn': 'ios_gn',
-      'ios_rel_device_ninja': 'ios_gyp',
       'mac_chromium_10.10_rel_ng': 'swarming_gpu_tests_gyp_release_trybot',
       'mac_chromium_archive_rel_ng': 'noswarming_gyp_release_trybot',
       'mac_chromium_asan_rel_ng': 'swarming_asan_dcheck_gyp_release_bot',
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 0c8172b..318f5cb 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -3324,6 +3324,27 @@
   <description>Please enter the description of this user action.</description>
 </action>
 
+<action name="Feedback.SrtPromptAccepted">
+  <owner>tmartino@chromium.org</owner>
+  <description>
+    User accepted invitation on Feedback form to download Software Removal Tool.
+  </description>
+</action>
+
+<action name="Feedback.SrtPromptClosed">
+  <owner>tmartino@chromium.org</owner>
+  <description>
+    User closed Feedback form when prompted to download Software Removal Tool.
+  </description>
+</action>
+
+<action name="Feedback.SrtPromptDeclined">
+  <owner>tmartino@chromium.org</owner>
+  <description>
+    User declined invitation on Feedback form to download Software Removal Tool.
+  </description>
+</action>
+
 <action name="FileBrowser.CreateNewFolder">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <description>Please enter the description of this user action.</description>
@@ -11741,11 +11762,13 @@
 <action name="PeopleSearch_OpenChat">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <description>Please enter the description of this user action.</description>
+  <obsolete>Deprecated.</obsolete>
 </action>
 
 <action name="PeopleSearch_SendEmail">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <description>Please enter the description of this user action.</description>
+  <obsolete>Deprecated.</obsolete>
 </action>
 
 <action name="PermissionBubbleIFrameRequestQueued">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 6ff7f086..55e5c74 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -4046,6 +4046,14 @@
   </summary>
 </histogram>
 
+<histogram name="BrowserRenderProcessHost.ChildLaunchFailureCodes"
+    enum="LaunchErrorCodes">
+  <owner>wfh@chromium.org</owner>
+  <summary>
+    The launch error codes for failed renderer process launches.
+  </summary>
+</histogram>
+
 <histogram name="BrowserRenderProcessHost.ChildLaunchFailures"
     enum="RendererType">
   <owner>wfh@chromium.org</owner>
@@ -13758,6 +13766,37 @@
   <summary>Number of calls to extension functions.</summary>
 </histogram>
 
+<histogram name="Extensions.Functions.FailedTotalExecutionTime" units="ms">
+  <owner>rdevlin.cronin@chromium.org</owner>
+  <summary>
+    The total amount of time it took to execute an extension function that
+    failed from the time the extension function is called to the time the
+    function responds. Note that since some extension functions are inherently
+    slow (anything that requires user interaction, for instance), this is not a
+    definitive source for function performance.
+  </summary>
+</histogram>
+
+<histogram name="Extensions.Functions.SucceededTotalExecutionTime" units="ms">
+  <owner>rdevlin.cronin@chromium.org</owner>
+  <summary>
+    The total amount of time it took to execute an extension function that
+    succeeded from the time the extension function is called to the time the
+    function responds. Note that since some extension functions are inherently
+    slow (anything that requires user interaction, for instance), this is not a
+    definitive source for function performance.
+  </summary>
+</histogram>
+
+<histogram name="Extensions.Functions.SynchronousExecutionTime" units="ms">
+  <owner>rdevlin.cronin@chromium.org</owner>
+  <summary>
+    The synchronous amount of time an extension function takes. Note that many
+    extension functions run asynchronously; see also
+    Extensions.Functions.[Succeeded|Failed]TotalExecutionTime.
+  </summary>
+</histogram>
+
 <histogram name="Extensions.GetUserDataTempDir" enum="GetUserDataTempDirResult">
   <obsolete>
     Deprecated 04/2016 as doesn't have data nor owner.
@@ -33224,6 +33263,14 @@
   </summary>
 </histogram>
 
+<histogram name="NewTabPage.Snippets.FetchHttpResponseOrErrorCode"
+    enum="CombinedHttpResponseAndNetErrorCode">
+  <owner>mastiz@chromium.org</owner>
+  <summary>
+    Response or error codes encountered when attempting to fetch snippets.
+  </summary>
+</histogram>
+
 <histogram name="NewTabPage.Snippets.Interactions" enum="SnippetsInteractions">
   <owner>knn@chromium.org</owner>
   <summary>
@@ -33240,6 +33287,24 @@
   </summary>
 </histogram>
 
+<histogram name="NewTabPage.Snippets.NumArticlesFetched" units="articles">
+  <owner>mastiz@chromium.org</owner>
+  <summary>
+    Android: The number of valid snippet articles fetched from the server,
+    logged every time a fetch finishes successfully.
+  </summary>
+</histogram>
+
+<histogram name="NewTabPage.Snippets.NumArticlesZeroDueToDiscarded"
+    units="articles">
+  <owner>mastiz@chromium.org</owner>
+  <summary>
+    Android: The number of snippet articles discarded by the user, logged every
+    time the list is updated resulting in an empty list (all articles
+    discarded).
+  </summary>
+</histogram>
+
 <histogram name="NewTabPage.SuggestedSite">
   <obsolete>
     Deprecated 2016-02 (and not recorded for some time before that).
@@ -60674,6 +60739,15 @@
   </summary>
 </histogram>
 
+<histogram name="WebRTC.Video.Screenshare.InputFramesPerSecond" units="fps">
+  <owner>asapersson@chromium.org</owner>
+  <summary>
+    The number of incoming frames per second for a sent (screen content) video
+    stream. Recorded when a stream is removed. The total number of frames is
+    divided by the time the video stream exists.
+  </summary>
+</histogram>
+
 <histogram name="WebRTC.Video.Screenshare.InputHeightInPixels" units="pixels">
   <owner>sprang@chromium.org</owner>
   <summary>
@@ -60856,6 +60930,15 @@
   </summary>
 </histogram>
 
+<histogram name="WebRTC.Video.SendDelayInMs" units="ms">
+  <owner>asapersson@chromium.org</owner>
+  <summary>
+    The average send delay of sent packets for a sent video stream. Recorded
+    when a stream is removed. The delay is measured from a packet is sent to the
+    transport until leaving the socket.
+  </summary>
+</histogram>
+
 <histogram name="WebRTC.Video.SendSideDelayInMs" units="ms">
   <owner>asapersson@chromium.org</owner>
   <summary>
@@ -62744,6 +62827,7 @@
   <int value="119" label="IDBDH_INVALID_ORIGIN"/>
   <int value="120" label="RFH_FAIL_PROVISIONAL_LOAD_NO_HANDLE"/>
   <int value="121" label="RFH_FAIL_PROVISIONAL_LOAD_NO_ERROR"/>
+  <int value="122" label="NI_IN_PAGE_NAVIGATION"/>
 </enum>
 
 <enum name="BadMessageReasonExtensions" type="int">
@@ -66097,6 +66181,7 @@
   <int value="12" label="Autofill"/>
   <int value="13" label="Policy"/>
   <int value="14" label="Spell Checker"/>
+  <int value="15" label="NTPSnippets"/>
 </enum>
 
 <enum name="DecodedImageOrientation" type="int">
@@ -68070,6 +68155,9 @@
   <int value="325" label="Enable queries to Quirks Server"/>
   <int value="326" label="Configure the automatic timezone detection method"/>
   <int value="327" label="Enable ending processes in Task Manager"/>
+  <int value="328"
+      label="URLs that will be granted access to video capture devices on
+             SAML login pages"/>
 </enum>
 
 <enum name="EnterprisePolicyInvalidations" type="int">
@@ -69996,6 +70084,7 @@
   <int value="1118" label="PASSWORDSPRIVATE_GETSAVEDPASSWORDLIST"/>
   <int value="1119" label="PASSWORDSPRIVATE_GETPASSWORDEXCEPTIONLIST"/>
   <int value="1120" label="INPUTMETHODPRIVATE_OPENOPTIONSPAGE"/>
+  <int value="1121" label="FEEDBACKPRIVATE_LOGSRTPROMPTRESULT"/>
 </enum>
 
 <enum name="ExtensionInstallCause" type="int">
@@ -71949,6 +72038,16 @@
   <int value="1322" label="CompositedReplication"/>
   <int value="1323" label="EncryptedMediaAllSelectedContentTypesHaveCodecs"/>
   <int value="1324" label="EncryptedMediaAllSelectedContentTypesMissingCodecs"/>
+  <int value="1325" label="V8DataTransferItem_WebkitGetAsEntry_Method"/>
+  <int value="1326" label="V8HTMLInputElement_WebkitEntries_AttributeGetter"/>
+  <int value="1327"
+      label="Entry_Filesystem_AttributeGetter_IsolatedFileSystem"/>
+  <int value="1328" label="Entry_GetMetadata_Method_IsolatedFileSystem"/>
+  <int value="1329" label="Entry_MoveTo_Method_IsolatedFileSystem"/>
+  <int value="1330" label="Entry_CopyTo_Method_IsolatedFileSystem"/>
+  <int value="1331" label="Entry_Remove_Method_IsolatedFileSystem"/>
+  <int value="1332" label="Entry_GetParent_Method_IsolatedFileSystem"/>
+  <int value="1333" label="Entry_ToURL_Method_IsolatedFileSystem"/>
 </enum>
 
 <enum name="FetchRequestMode" type="int">
@@ -72961,6 +73060,9 @@
   <int value="64893984" label="local_east_coordinate.xml"/>
   <int value="67768539" label="alert_category_id_bit_mask"/>
   <int value="79560451" label="sc_control_point"/>
+  <int value="84948752"
+      label="Eddystone Config ADV Slot Data;
+             a3c8750a-8ed3-4bdf-8a39-a01bebede295"/>
   <int value="89070880" label="blood_pressure_measurement"/>
   <int value="102699400" label="cycling_power_feature"/>
   <int value="145478270" label="glucose_feature"/>
@@ -72988,14 +73090,22 @@
   <int value="358854697" label="bond_management_feature"/>
   <int value="361317539" label="language"/>
   <int value="363167947" label="blood_pressure_feature"/>
+  <int value="364021976"
+      label="nRF candy machine; b6c31338-6c07-453e-961a-d8a8a41bf368"/>
   <int value="405569435" label="boot_keyboard_output_report"/>
   <int value="409618715" label="cycling_power_vector"/>
   <int value="419477741" label="body_composition_feature"/>
   <int value="469191968" label="Playbulb Candle Color; fffc"/>
+  <int value="473092981"
+      label="Eddystone Config Advertising Interval;
+             a3c87503-8ed3-4bdf-8a39-a01bebede295"/>
   <int value="486368335" label="location_name"/>
   <int value="512543326" label="date_of_threshold_assessment"/>
   <int value="531135021" label="cgm_specific_ops_control_point"/>
   <int value="540054581" label="magnetic_declination"/>
+  <int value="546162499"
+      label="Eddystone Config EID Identity Key;
+             a3c87509-8ed3-4bdf-8a39-a01bebede295"/>
   <int value="546355367" label="firmware_revision_string"/>
   <int value="549702960" label="humidity"/>
   <int value="557034058" label="cycling_power_control_point"/>
@@ -73015,6 +73125,9 @@
   <int value="752820597" label="boot_mouse_input_report"/>
   <int value="762835818" label="tx_power_level"/>
   <int value="765862810" label="cgm_session_start_time"/>
+  <int value="788890283"
+      label="Eddystone Config Factory reset;
+             a3c8750b-8ed3-4bdf-8a39-a01bebede295"/>
   <int value="797118889" label="time_source"/>
   <int value="839366223" label="user_index"/>
   <int value="842908520" label="rsc_measurement"/>
@@ -73032,6 +73145,12 @@
   <int value="928099812" label="system_id"/>
   <int value="928491064" label="last_name"/>
   <int value="947971228" label="temperature_type"/>
+  <int value="951656105"
+      label="Eddystone Config Remain Connectable;
+             a3c8750c-8ed3-4bdf-8a39-a01bebede295"/>
+  <int value="962656991"
+      label="Eddystone Config Public ECDH Key;
+             a3c87508-8ed3-4bdf-8a39-a01bebede295"/>
   <int value="976761505" label="local_time_information"/>
   <int value="987658962" label="glucose_measurement"/>
   <int value="1002619180" label="exact_time_256"/>
@@ -73048,6 +73167,9 @@
   <int value="1161713439" label="Playbulb Candle Effect; fffb"/>
   <int value="1167525145" label="alert_status"/>
   <int value="1183399370" label="magnetic_flux_density_3D"/>
+  <int value="1186677690"
+      label="Eddystone Config Advertised Tx Power;
+             a3c87505-8ed3-4bdf-8a39-a01bebede295"/>
   <int value="1193066711" label="uv_index"/>
   <int value="1214133688" label="vo2_max"/>
   <int value="1217613737" label="three_zone_heart_rate_limits"/>
@@ -73056,6 +73178,12 @@
   <int value="1245615057" label="pnp_id"/>
   <int value="1254532025" label="user_control_point"/>
   <int value="1288236137" label="hid_control_point"/>
+  <int value="1320278204"
+      label="Eddystone Config Radio Tx Power;
+             a3c87504-8ed3-4bdf-8a39-a01bebede295"/>
+  <int value="1329901812"
+      label="Eddystone Config Lock State;
+             a3c87506-8ed3-4bdf-8a39-a01bebede295"/>
   <int value="1333242790" label="longitude"/>
   <int value="1358488787"
       label="sport_type_for_aerobic_and_anaerobic_thresholds"/>
@@ -73074,11 +73202,19 @@
   <int value="1448457670" label="cgm_feature"/>
   <int value="1479031407" label="five_zone_heart_rate_limits"/>
   <int value="1480262218" label="height"/>
+  <int value="1501299347"
+      label="nRF candy machine; a6c31338-6c07-453e-961a-d8a8a41bf368"/>
   <int value="1502604093" label="serial_number_string"/>
   <int value="1511396316" label="ln_control_point"/>
+  <int value="1511953014"
+      label="Eddystone Config Capabilities;
+             a3c87501-8ed3-4bdf-8a39-a01bebede295"/>
   <int value="1521362289" label="indoor_positioning_configuration"/>
   <int value="1541435682" label="fat_burn_heart_rate_upper_limit"/>
   <int value="1542101224" label="plx_continuous_measurent"/>
+  <int value="1547112406"
+      label="Eddystone Config Active Slot;
+             a3c87502-8ed3-4bdf-8a39-a01bebede295"/>
   <int value="1556918420" label="supported_new_alert_category"/>
   <int value="1562359952" label="bond_management_control_point"/>
   <int value="1594190447" label="anaerobic_threshold"/>
@@ -73112,6 +73248,8 @@
   <int value="2010182602" label="csc_feature"/>
   <int value="2022949018" label="cgm_status"/>
   <int value="2025615830" label="aggregate"/>
+  <int value="2025816471"
+      label="Eddystone Config Unlock; a3c87507-8ed3-4bdf-8a39-a01bebede295"/>
   <int value="2031294873" label="uncertainty"/>
   <int value="2041423305" label="email_address"/>
   <int value="2042267197" label="age"/>
@@ -73254,6 +73392,8 @@
   <int value="869682406" label="fe60"/>
   <int value="876407493" label="location_and_navigation"/>
   <int value="878416856" label="fe85"/>
+  <int value="879242624"
+      label="nRF candy machine; a6c31337-6c07-453e-961a-d8a8a41bf368"/>
   <int value="882315332" label="fe55"/>
   <int value="889111031" label="fecd"/>
   <int value="890629650" label="running_speed_and_cadence"/>
@@ -73351,6 +73491,8 @@
   <int value="1513113754" label="fe39"/>
   <int value="1515793787" label="fef1"/>
   <int value="1548928839" label="fec5"/>
+  <int value="1549672811"
+      label="nRF candy machine; b6c31337-6c07-453e-961a-d8a8a41bf368"/>
   <int value="1553614739" label="fe6b"/>
   <int value="1563543855" label="fe72"/>
   <int value="1569655226" label="generic_access"/>
@@ -73410,6 +73552,9 @@
   <int value="1922853101" label="fe28"/>
   <int value="1925022679" label="fe57"/>
   <int value="1940012814" label="fe2a"/>
+  <int value="1942373991"
+      label="Eddystone-URL Beacon Configuration v2;
+             a3c87500-8ed3-4bdf-8a39-a01bebede295"/>
   <int value="1946977319" label="fec1"/>
   <int value="1953707948" label="fe9f"/>
   <int value="1960388103" label="fecb"/>
@@ -75117,6 +75262,8 @@
   <int value="55" label="REENABLE_UPDATES_SUCCEEDED"/>
   <int value="56" label="REENABLE_UPDATES_FAILED"/>
   <int value="57" label="UNPACKING_FAILED"/>
+  <int value="58" label="IN_USE_DOWNGRADE"/>
+  <int value="59" label="OLD_VERSION_DOWNGRADE"/>
 </enum>
 
 <enum name="InstantControllerEvent" type="int">
@@ -75932,6 +76079,45 @@
   <int value="8" label="HandleUpdateOrigins Invalid"/>
 </enum>
 
+<enum name="LaunchErrorCodes" type="int">
+  <int value="0" label="SBOX_ALL_OK"/>
+  <int value="1" label="SBOX_ERROR_GENERIC"/>
+  <int value="2" label="SBOX_ERROR_BAD_PARAMS"/>
+  <int value="3" label="SBOX_ERROR_UNSUPPORTED"/>
+  <int value="4" label="SBOX_ERROR_NO_SPACE"/>
+  <int value="5" label="SBOX_ERROR_INVALID_IPC"/>
+  <int value="6" label="SBOX_ERROR_FAILED_IPC"/>
+  <int value="7" label="SBOX_ERROR_NO_HANDLE"/>
+  <int value="8" label="SBOX_ERROR_UNEXPECTED_CALL"/>
+  <int value="9" label="SBOX_ERROR_WAIT_ALREADY_CALLED"/>
+  <int value="10" label="SBOX_ERROR_CHANNEL_ERROR"/>
+  <int value="11" label="SBOX_ERROR_CANNOT_CREATE_DESKTOP"/>
+  <int value="12" label="SBOX_ERROR_CANNOT_CREATE_WINSTATION"/>
+  <int value="13" label="SBOX_ERROR_FAILED_TO_SWITCH_BACK_WINSTATION"/>
+  <int value="14" label="SBOX_ERROR_INVALID_APP_CONTAINER"/>
+  <int value="15" label="SBOX_ERROR_INVALID_CAPABILITY"/>
+  <int value="16" label="SBOX_ERROR_CANNOT_INIT_APPCONTAINER"/>
+  <int value="17" label="SBOX_ERROR_PROC_THREAD_ATTRIBUTES"/>
+  <int value="18" label="SBOX_ERROR_CREATE_PROCESS"/>
+  <int value="19" label="SBOX_ERROR_DELEGATE_PRE_SPAWN"/>
+  <int value="20" label="SBOX_ERROR_ASSIGN_PROCESS_TO_JOB_OBJECT"/>
+  <int value="21" label="SBOX_ERROR_SET_THREAD_TOKEN"/>
+  <int value="22" label="SBOX_ERROR_GET_THREAD_CONTEXT"/>
+  <int value="23" label="SBOX_ERROR_DUPLICATE_TARGET_INFO"/>
+  <int value="24" label="SBOX_ERROR_SET_LOW_BOX_TOKEN"/>
+  <int value="25" label="SBOX_ERROR_CREATE_FILE_MAPPING"/>
+  <int value="26" label="SBOX_ERROR_DUPLICATE_SHARED_SECTION"/>
+  <int value="27" label="SBOX_ERROR_MAP_VIEW_OF_SHARED_SECTION"/>
+  <int value="28" label="SBOX_ERROR_APPLY_ASLR_MITIGATIONS"/>
+  <int value="29" label="SBOX_ERROR_SETUP_BASIC_INTERCEPTIONS"/>
+  <int value="30" label="SBOX_ERROR_SETUP_INTERCEPTION_SERVICE"/>
+  <int value="31" label="SBOX_ERROR_INITIALIZE_INTERCEPTIONS"/>
+  <int value="32" label="SBOX_ERROR_SETUP_NTDLL_IMPORTS"/>
+  <int value="33" label="SBOX_ERROR_SETUP_HANDLE_CLOSER"/>
+  <int value="1002" label="LAUNCH_RESULT_SUCCESS"/>
+  <int value="1003" label="LAUNCH_RESULT_FAILURE"/>
+</enum>
+
 <enum name="LaunchFromHomeScreen" type="int">
   <int value="0" label="Launched as standalone web app"/>
   <int value="1" label="Launched as a tab"/>
@@ -92270,6 +92456,16 @@
   <affected-histogram name="NetConnectivity5.StartPacket.First6.SeriesRecv"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="NetErrorCodeSubtype" separator="." ordering="prefix">
+  <owner>csharrison@chromium.org</owner>
+  <suffix name="NTP.Google" label="The Google web NTP"/>
+  <suffix name="NTP.ThirdParty"
+      label="The NTP served by a third party (e.g. Bing)"/>
+  <suffix name="NTP.Local" label="The local NTP"/>
+  <affected-histogram name="Net.RequestTime2.ErrAborted"/>
+  <affected-histogram name="Net.RequestTime2.Success"/>
+</histogram_suffixes>
+
 <histogram_suffixes name="NetProxyResolverExecutionTime">
   <suffix name="UrlOver2K" label="URL length was over 2K"/>
   <suffix name="UrlOver4K" label="URL length was over 4K"/>
diff --git a/tools/metrics/rappor/rappor.xml b/tools/metrics/rappor/rappor.xml
index a24f14d..0d3e322 100644
--- a/tools/metrics/rappor/rappor.xml
+++ b/tools/metrics/rappor/rappor.xml
@@ -932,6 +932,14 @@
   </summary>
 </rappor-metric>
 
+<rappor-metric name="Media.OriginUrl.MSE.PipelineError" type="ETLD_PLUS_ONE">
+  <owner>xhwang@chromium.org</owner>
+  <summary>
+    The domain and registry of the URL that loads an HTML5 media player using
+    Media Source Extensions (MSE) and ends up with an error.
+  </summary>
+</rappor-metric>
+
 <rappor-metric name="Media.OriginUrl.MSE.Secure" type="ETLD_PLUS_ONE">
   <owner>wolenetz@chromium.org</owner>
   <summary>
@@ -948,6 +956,14 @@
   </summary>
 </rappor-metric>
 
+<rappor-metric name="Media.OriginUrl.SRC.PipelineError" type="ETLD_PLUS_ONE">
+  <owner>xhwang@chromium.org</owner>
+  <summary>
+    The domain and registry of the URL that loads an HTML5 media player using
+    SRC and ends up with an error.
+  </summary>
+</rappor-metric>
+
 <rappor-metric name="NTP.ExplicitUserAction.PageNavigation.NTPTileClick"
     type="UMA_RAPPOR_TYPE">
   <owner>knn@chromium.org</owner>
diff --git a/tools/perf/benchmarks/memory.py b/tools/perf/benchmarks/memory.py
index 85350d7..7da9c50 100644
--- a/tools/perf/benchmarks/memory.py
+++ b/tools/perf/benchmarks/memory.py
@@ -37,14 +37,3 @@
   def ShouldDisable(cls, possible_browser):
     return cls.IsSvelte(possible_browser)  # http://crbug.com/555092
 
-
-@benchmark.Disabled('android')  # crbug.com/542682
-class MemoryLongRunningIdleGmailBackground(perf_benchmark.PerfBenchmark):
-  """Use (recorded) real world web sites and measure memory consumption
-  of long running idle Gmail page in background tab"""
-  test = memory.Memory
-  page_set = page_sets.LongRunningIdleGmailBackgroundPageSet
-
-  @classmethod
-  def Name(cls):
-    return 'memory.long_running_idle_gmail_background'
diff --git a/tools/perf/benchmarks/memory_infra.py b/tools/perf/benchmarks/memory_infra.py
index 1c89590..c66f59d 100644
--- a/tools/perf/benchmarks/memory_infra.py
+++ b/tools/perf/benchmarks/memory_infra.py
@@ -10,7 +10,6 @@
 from telemetry.timeline import tracing_category_filter
 from telemetry.web_perf import timeline_based_measurement
 from telemetry.web_perf.metrics import memory_timeline
-from telemetry.web_perf.metrics import v8_gc_latency
 
 import page_sets
 
@@ -111,6 +110,7 @@
   on a webview-based browser (a stand in for the Search app), and loading
   pages on a select browser.
   """
+  TBM_VERSION = 2
   page_set = page_sets.DualBrowserStorySet
   options = {'pageset_repeat': 5}
 
@@ -118,10 +118,6 @@
   def Name(cls):
     return 'memory.dual_browser_test'
 
-  def SetupBenchmarkDefaultTraceRerunOptions(self, tbm_options):
-    # This is a TBMv2 benchmark.
-    tbm_options.SetTimelineBasedMetric('memoryMetric')
-
 
 # TODO(bashi): Workaround for http://crbug.com/532075
 # @benchmark.Enabled('android') shouldn't be needed.
@@ -152,37 +148,43 @@
     return bool(cls._RE_RENDERER_VALUES.match(value.name))
 
 
+class _MemoryV8Benchmark(_MemoryInfra):
+  def CreateTimelineBasedMeasurementOptions(self):
+    v8_categories = [
+        'blink.console', 'renderer.scheduler', 'v8', 'webkit.console']
+    memory_categories = ['blink.console', 'disabled-by-default-memory-infra']
+    category_filter = tracing_category_filter.TracingCategoryFilter(
+        ','.join(['-*'] + v8_categories + memory_categories))
+    options = timeline_based_measurement.Options(category_filter)
+    options.SetTimelineBasedMetric('v8AndMemoryMetrics')
+    return options
+
+
 # Disabled on reference builds because they don't support the new
 # Tracing.requestMemoryDump DevTools API.
 # For 'reference' see http://crbug.com/540022.
 # For 'android' see http://crbug.com/579546.
 @benchmark.Disabled('reference', 'android')
-class MemoryLongRunningIdleGmailTBM(_MemoryInfra):
+class MemoryLongRunningIdleGmail(_MemoryV8Benchmark):
   """Use (recorded) real world web sites and measure memory consumption
   of long running idle Gmail page """
   page_set = page_sets.LongRunningIdleGmailPageSet
 
-  def CreateTimelineBasedMeasurementOptions(self):
-    v8_categories = [
-        'blink.console', 'renderer.scheduler', 'v8', 'webkit.console']
-    memory_categories = 'blink.console,disabled-by-default-memory-infra'
-    category_filter = tracing_category_filter.TracingCategoryFilter(
-        memory_categories)
-    for category in v8_categories:
-      category_filter.AddIncludedCategory(category)
-    options = timeline_based_measurement.Options(category_filter)
-    return options
+  @classmethod
+  def Name(cls):
+    return 'memory.long_running_idle_gmail_tbmv2'
 
-  def SetupBenchmarkDefaultTraceRerunOptions(self, tbm_options):
-    tbm_options.SetLegacyTimelineBasedMetrics((
-        v8_gc_latency.V8GCLatency(),
-        memory_timeline.MemoryTimelineMetric(),
-    ))
+
+# Disabled on reference builds because they don't support the new
+# Tracing.requestMemoryDump DevTools API.
+# For 'reference' see http://crbug.com/540022.
+# For 'android' see http://crbug.com/579546.
+@benchmark.Disabled('reference', 'android')
+class MemoryLongRunningIdleGmailBackground(_MemoryV8Benchmark):
+  """Use (recorded) real world web sites and measure memory consumption
+  of long running idle Gmail page """
+  page_set = page_sets.LongRunningIdleGmailBackgroundPageSet
 
   @classmethod
   def Name(cls):
-    return 'memory.long_running_idle_gmail_tbm'
-
-  @classmethod
-  def ShouldTearDownStateAfterEachStoryRun(cls):
-    return True
+    return 'memory.long_running_idle_gmail_background_tbmv2'
diff --git a/tools/perf/benchmarks/page_cycler.py b/tools/perf/benchmarks/page_cycler.py
index deaf9a49..084b2aa 100644
--- a/tools/perf/benchmarks/page_cycler.py
+++ b/tools/perf/benchmarks/page_cycler.py
@@ -223,6 +223,10 @@
   def Name(cls):
     return 'page_cycler.basic_oopif'
 
+  @classmethod
+  def ShouldDisable(cls, possible_browser):
+    return cls.IsSvelte(possible_browser)  # http://crbug.com/607657
+
 
 @benchmark.Disabled('all')  # crbug.com/443730
 class PageCyclerBigJs(_PageCycler):
diff --git a/tools/perf/page_sets/long_running_idle_google_cases.py b/tools/perf/page_sets/long_running_idle_google_cases.py
index 9b46f8c..302cddf 100644
--- a/tools/perf/page_sets/long_running_idle_google_cases.py
+++ b/tools/perf/page_sets/long_running_idle_google_cases.py
@@ -6,19 +6,20 @@
 
 from page_sets import google_pages
 
-STARTUP_TIME_IN_SECONDS = 2
 IDLE_TIME_IN_SECONDS = 100
+SAMPLING_INTERVAL_IN_SECONDS = 1
+STEPS = IDLE_TIME_IN_SECONDS / SAMPLING_INTERVAL_IN_SECONDS
+
+def _IdleAction(action_runner):
+  action_runner.tab.browser.DumpMemory()
+  for _ in xrange(STEPS):
+    action_runner.Wait(SAMPLING_INTERVAL_IN_SECONDS)
+    action_runner.tab.browser.DumpMemory()
 
 def _CreateIdlePageClass(base_page_cls):
   class DerivedIdlePage(base_page_cls):  # pylint: disable=no-init
     def RunPageInteractions(self, action_runner):
-      action_runner.Wait(STARTUP_TIME_IN_SECONDS)
-      with action_runner.CreateInteraction('Begin'):
-        action_runner.tab.browser.DumpMemory()
-      with action_runner.CreateInteraction('Idle'):
-        action_runner.Wait(IDLE_TIME_IN_SECONDS)
-      with action_runner.CreateInteraction('End'):
-        action_runner.tab.browser.DumpMemory()
+      _IdleAction(action_runner)
   return DerivedIdlePage
 
 
@@ -26,7 +27,7 @@
   class DerivedIdlePage(base_page_cls):  # pylint: disable=no-init
     def RunPageInteractions(self, action_runner):
       action_runner.tab.browser.tabs.New()
-      action_runner.Wait(IDLE_TIME_IN_SECONDS)
+      _IdleAction(action_runner)
   return DerivedIdlePage
 
 
diff --git a/tools/valgrind/drmemory/suppressions.txt b/tools/valgrind/drmemory/suppressions.txt
index cdb8218..9c26673d6 100644
--- a/tools/valgrind/drmemory/suppressions.txt
+++ b/tools/valgrind/drmemory/suppressions.txt
@@ -778,27 +778,6 @@
 *!IPC::internal::HandleAttachmentWin::HandleAttachmentWin
 
 HANDLE LEAK
-name=bug_586668_a
-system call NtDuplicateObject
-KERNELBASE.dll!DuplicateHandle
-KERNEL32.dll!DuplicateHandle
-mojo_system_impl.dll!mojo::edk::Channel::Message::RewriteHandles
-mojo_system_impl.dll!mojo::edk::NodeController::OnRelayPortsMessage
-mojo_system_impl.dll!mojo::edk::NodeChannel::OnChannelMessage
-mojo_system_impl.dll!mojo::edk::Channel::OnReadComplete
-
-HANDLE LEAK
-name=bug_586668_b
-system call NtDuplicateObject
-KERNELBASE.dll!DuplicateHandle
-KERNEL32.dll!DuplicateHandle
-base.dll!base::SharedMemory::DuplicateHandle
-mojo_system_impl.dll!mojo::edk::PlatformSharedBuffer::DuplicatePlatformHandle
-mojo_system_impl.dll!mojo::edk::SharedBufferDispatcher::EndSerialize
-mojo_system_impl.dll!mojo::edk::MessagePipeDispatcher::WriteMessage
-mojo_system_impl.dll!mojo::edk::Core::WriteMessage
-
-HANDLE LEAK
 name=bug_586996_b
 system call NtDuplicateObject
 KERNELBASE.dll!DuplicateHandle
@@ -824,3 +803,8 @@
 skia.dll!SkDWriteFontFileStreamWrapper::GetFileSize
 ...
 blink_platform.dll!blink::SimpleFontData::platformWidthForGlyph
+
+UNADDRESSABLE ACCESS
+name=bug_608064
+*!ExtensionService::NotifyExtensionLoaded
+*!ExtensionService::AddExtension
diff --git a/tools/valgrind/drmemory/suppressions_full.txt b/tools/valgrind/drmemory/suppressions_full.txt
index dbe998b..56a468c 100644
--- a/tools/valgrind/drmemory/suppressions_full.txt
+++ b/tools/valgrind/drmemory/suppressions_full.txt
@@ -2210,9 +2210,3 @@
 ...
 webcore_shared.dll!blink::ScriptController::createPluginWrapper
 webcore_shared.dll!blink::HTMLPlugInElement::pluginWrapper
-
-UNINITIALIZED READ
-name=bug_604066
-...
-*!base::win::`anonymous namespace'::DeadlockThread::Terminate
-*!base::win::WaitChainTest_Deadlock_Test::TestBody
diff --git a/tools/valgrind/gtest_exclude/components_unittests.gtest-drmemory_win32.txt b/tools/valgrind/gtest_exclude/components_unittests.gtest-drmemory_win32.txt
index 890ec8948..82265dc 100644
--- a/tools/valgrind/gtest_exclude/components_unittests.gtest-drmemory_win32.txt
+++ b/tools/valgrind/gtest_exclude/components_unittests.gtest-drmemory_win32.txt
@@ -1,5 +1,2 @@
 # http://crbug.com/514421
 WatcherMetricsProviderWinTest.DoesNotReportOwnProcessId
-
-# http://crbug.com/608053
-SafeBrowsingV4GetHashProtocolManagerTest.TestGetHash*
diff --git a/tools/valgrind/gtest_exclude/unit_tests.gtest-drmemory_win32.txt b/tools/valgrind/gtest_exclude/unit_tests.gtest-drmemory_win32.txt
index 031b0df..7f6ab97 100644
--- a/tools/valgrind/gtest_exclude/unit_tests.gtest-drmemory_win32.txt
+++ b/tools/valgrind/gtest_exclude/unit_tests.gtest-drmemory_win32.txt
@@ -86,8 +86,4 @@
 PluginInfoMessageFilterTest.FindEnabledPlugin
 
 # http://crbug.com/608064
-BackgroundApplicationListModelTest.*
-BackgroundModeManagerWithExtensionsTest.*
-ExtensionContextMenuModelTest.*
-SavedFilesServiceUnitTest.*
-KeywordExtensionsDelegateImplTest.*
+ChromeRuntimeAPIDelegateTest.RequestUpdateCheck
diff --git a/tools/vim/ninja-build.vim b/tools/vim/ninja-build.vim
index 70e5a83..76e2049f 100644
--- a/tools/vim/ninja-build.vim
+++ b/tools/vim/ninja-build.vim
@@ -41,17 +41,17 @@
   return candidate
 
 
-def path_to_build_dir(configuration):
-  """Returns <chrome_root>/<output_dir>/(Release|Debug)."""
+def path_to_build_dir():
+  """Returns <chrome_root>/<output_dir>/(Release|Debug|<other>)."""
 
   chrome_root = path_to_source_root()
   sys.path.append(os.path.join(chrome_root, 'tools', 'vim'))
   from ninja_output import GetNinjaOutputDirectory
-  return GetNinjaOutputDirectory(chrome_root, configuration)
+  return GetNinjaOutputDirectory(chrome_root)
 
-def compute_ninja_command_for_current_buffer(configuration=None):
+def compute_ninja_command_for_current_buffer():
   """Returns the shell command to compile the file in the current buffer."""
-  build_dir = path_to_build_dir(configuration)
+  build_dir = path_to_build_dir()
 
   # ninja needs filepaths for the ^ syntax to be relative to the
   # build directory.
@@ -65,8 +65,8 @@
   vim.command('return "%s"' % build_cmd)
 
 
-def compute_ninja_command_for_targets(targets='', configuration=None):
-  build_cmd = ' '.join(['ninja', '-C', path_to_build_dir(configuration),
+def compute_ninja_command_for_targets(targets=''):
+  build_cmd = ' '.join(['ninja', '-C', path_to_build_dir(),
                         targets])
   vim.command('return "%s"' % build_cmd)
 endpython
diff --git a/tools/vim/ninja_output.py b/tools/vim/ninja_output.py
index 5bb638ab..e6add13 100644
--- a/tools/vim/ninja_output.py
+++ b/tools/vim/ninja_output.py
@@ -10,8 +10,8 @@
 import re
 
 
-def GetNinjaOutputDirectory(chrome_root, configuration=None):
-  """Returns <chrome_root>/<output_dir>/(Release|Debug).
+def GetNinjaOutputDirectory(chrome_root):
+  """Returns <chrome_root>/<output_dir>/(Release|Debug|<other>).
 
   If either of the following environment variables are set, their
   value is used to determine the output directory:
@@ -20,11 +20,7 @@
 
   Otherwise, all directories starting with the word out are examined.
 
-  The output directory must contain {configuration}/build.ninja (if
-  configuration is None, both Debug and Release will be checked).
-
-  The configuration chosen is the one most recently generated/built,
-  but can be overriden via the <configuration> parameter.
+  The configuration chosen is the one most recently generated/built.
   """
 
   output_dirs = []
@@ -45,15 +41,13 @@
         if os.path.isdir(out):
           output_dirs.append(os.path.relpath(out, start = chrome_root))
 
-  configs = ['Debug', 'Release', 'Default']
-  if configuration:
-    configs = [configuration]
-
   def generate_paths():
-    for out_dir, config in itertools.product(output_dirs, configs):
-      path = os.path.join(chrome_root, out_dir, config)
-      if os.path.exists(os.path.join(path, 'build.ninja')):
-        yield path
+    for out_dir in output_dirs:
+      out_path = os.path.join(chrome_root, out_dir)
+      for config in os.listdir(out_path):
+        path = os.path.join(out_path, config)
+        if os.path.exists(os.path.join(path, 'build.ninja')):
+          yield path
 
   def approx_directory_mtime(path):
     # This is a heuristic; don't recurse into subdirectories.
diff --git a/tools/vim/tests/chromium.ycm_extra_conf_unittest.py b/tools/vim/tests/chromium.ycm_extra_conf_unittest.py
index bca9d4c..e073c3a8 100755
--- a/tools/vim/tests/chromium.ycm_extra_conf_unittest.py
+++ b/tools/vim/tests/chromium.ycm_extra_conf_unittest.py
@@ -80,12 +80,12 @@
       |
       +-- out
           |
-          +-- Debug
+          +-- gn
                 build.ninja
     """
     self.chrome_root = os.path.abspath(os.path.normpath(
         os.path.join(self.test_root, 'src')))
-    self.out_dir = os.path.join(self.chrome_root, 'out', 'Debug')
+    self.out_dir = os.path.join(self.chrome_root, 'out', 'gn')
 
     os.makedirs(self.chrome_root)
     os.makedirs(os.path.join(self.chrome_root, '.git'))
@@ -165,7 +165,7 @@
 
   def testOutDirNames(self):
     out_root = os.path.join(self.chrome_root, 'out_with_underscore')
-    out_dir = os.path.join(out_root, 'Debug')
+    out_dir = os.path.join(out_root, 'gn')
     shutil.move(os.path.join(self.chrome_root, 'out'),
         out_root)
 
@@ -337,4 +337,7 @@
         ])
 
 if __name__ == '__main__':
+  if not os.path.isfile('chromium.ycm_extra_conf.py'):
+    print('The test must be run from src/tools/vim/ directory')
+    sys.exit(1)
   unittest.main()
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn
index fc4c550..7c61a1f 100644
--- a/ui/android/BUILD.gn
+++ b/ui/android/BUILD.gn
@@ -117,7 +117,7 @@
     "values-uk/android_ui_strings.xml",
     "values-vi/android_ui_strings.xml",
     "values-zh-rCN/android_ui_strings.xml",
-    "values-zh-rTW/android_ui_strings.xml",
+    "values-zh/android_ui_strings.xml",
   ]
 }
 
diff --git a/ui/android/java/strings/android_ui_strings.grd b/ui/android/java/strings/android_ui_strings.grd
index 5d69aba..e318c04e 100644
--- a/ui/android/java/strings/android_ui_strings.grd
+++ b/ui/android/java/strings/android_ui_strings.grd
@@ -44,7 +44,7 @@
     <output filename="values-uk/android_ui_strings.xml" lang="uk" type="android" />
     <output filename="values-vi/android_ui_strings.xml" lang="vi" type="android" />
     <output filename="values-zh-rCN/android_ui_strings.xml" lang="zh-CN" type="android" />
-    <output filename="values-zh-rTW/android_ui_strings.xml" lang="zh-TW" type="android" />
+    <output filename="values-zh/android_ui_strings.xml" lang="zh-TW" type="android" />
   </outputs>
   <translations>
     <file lang="am" path="translations/android_ui_strings_am.xtb" />
diff --git a/ui/app_list/presenter/BUILD.gn b/ui/app_list/presenter/BUILD.gn
index 2639652..af36b7a 100644
--- a/ui/app_list/presenter/BUILD.gn
+++ b/ui/app_list/presenter/BUILD.gn
@@ -2,19 +2,23 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//testing/test.gni")
 import("//build/config/ui.gni")
+import("//mojo/public/tools/bindings/mojom.gni")
+import("//testing/test.gni")
 
 assert(use_aura)
 
 component("presenter") {
   sources = [
     "app_list_presenter.h",
+    "app_list_presenter_delegate.cc",
     "app_list_presenter_delegate.h",
     "app_list_presenter_delegate_factory.h",
     "app_list_presenter_export.h",
     "app_list_presenter_impl.cc",
     "app_list_presenter_impl.h",
+    "app_list_view_delegate_factory.cc",
+    "app_list_view_delegate_factory.h",
   ]
 
   defines = [ "APP_LIST_PRESENTER_IMPLEMENTATION" ]
@@ -29,6 +33,15 @@
   ]
 }
 
+mojom("mojom") {
+  sources = [
+    "app_list_presenter.mojom",
+  ]
+  deps = [
+    "//components/mus/public/interfaces",
+  ]
+}
+
 source_set("test_support") {
   sources = [
     "test/app_list_presenter_impl_test_api.cc",
diff --git a/ui/app_list/presenter/app_list_presenter.gyp b/ui/app_list/presenter/app_list_presenter.gyp
index 57b8e53..98e0274f 100644
--- a/ui/app_list/presenter/app_list_presenter.gyp
+++ b/ui/app_list/presenter/app_list_presenter.gyp
@@ -28,11 +28,14 @@
       'sources': [
         # Note: sources list duplicated in GN build.
         'app_list_presenter.h',
+        'app_list_presenter_delegate.cc',
         'app_list_presenter_delegate.h',
         'app_list_presenter_delegate_factory.h',
         'app_list_presenter_export.h',
         'app_list_presenter_impl.cc',
         'app_list_presenter_impl.h',
+        'app_list_view_delegate_factory.cc',
+        'app_list_view_delegate_factory.h',
       ],
       # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
       'msvs_disabled_warnings': [ 4267, ],
diff --git a/ui/app_list/presenter/app_list_presenter.h b/ui/app_list/presenter/app_list_presenter.h
index bbd4d41..cea0c9b 100644
--- a/ui/app_list/presenter/app_list_presenter.h
+++ b/ui/app_list/presenter/app_list_presenter.h
@@ -5,6 +5,8 @@
 #ifndef UI_APP_LIST_PRESENTER_APP_LIST_PRESENTER_H_
 #define UI_APP_LIST_PRESENTER_APP_LIST_PRESENTER_H_
 
+#include <stdint.h>
+
 #include "ui/app_list/presenter/app_list_presenter_export.h"
 
 namespace aura {
@@ -21,14 +23,14 @@
   // Show/hide app list window. The |window| is used to deterime in
   // which display (in which the |window| exists) the app list should
   // be shown.
-  virtual void Show(aura::Window* window) = 0;
+  virtual void Show(int64_t display_id) = 0;
 
   // Invoked to dismiss app list. This may leave the view open but hidden from
   // the user.
   virtual void Dismiss() = 0;
 
-  // Whether the app list's aura::Window is currently visible.
-  virtual bool IsVisible() const = 0;
+  // Show the app list if it is visible, hide it if it is hidden.
+  virtual void ToggleAppList(int64_t display_id) = 0;
 
   // Returns target visibility. This may differ from IsVisible() if a
   // visibility transition is in progress.
diff --git a/ui/app_list/presenter/app_list_presenter.mojom b/ui/app_list/presenter/app_list_presenter.mojom
new file mode 100644
index 0000000..0c4fe29
--- /dev/null
+++ b/ui/app_list/presenter/app_list_presenter.mojom
@@ -0,0 +1,19 @@
+// Copyright 2016 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.
+
+module app_list.mojom;
+
+import "components/mus/public/interfaces/window_manager_constants.mojom";
+
+interface AppListPresenter {
+  // Show the app list on the specified display.
+  Show(int64 display_id);
+
+  // Dismiss the app list.
+  Dismiss();
+  
+  // Show the app list (on the specified display) if it is hidden; hide the
+  // app list if it is shown.
+  ToggleAppList(int64 display_id);
+};
diff --git a/ui/app_list/presenter/app_list_presenter_delegate.cc b/ui/app_list/presenter/app_list_presenter_delegate.cc
new file mode 100644
index 0000000..16f7ef05
--- /dev/null
+++ b/ui/app_list/presenter/app_list_presenter_delegate.cc
@@ -0,0 +1,22 @@
+// Copyright 2016 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/app_list/presenter/app_list_presenter_delegate.h"
+
+#include "ui/app_list/views/app_list_view.h"
+
+namespace app_list {
+namespace {
+
+// The minimal margin (in pixels) around the app list when in centered mode.
+const int kMinimalCenteredAppListMargin = 10;
+
+}  // namespace
+
+int AppListPresenterDelegate::GetMinimumBoundsHeightForAppList(
+    const app_list::AppListView* app_list) {
+  return app_list->bounds().height() + 2 * kMinimalCenteredAppListMargin;
+}
+
+}  // namespace app_list
diff --git a/ui/app_list/presenter/app_list_presenter_delegate.h b/ui/app_list/presenter/app_list_presenter_delegate.h
index 93e71e7..d75b7567 100644
--- a/ui/app_list/presenter/app_list_presenter_delegate.h
+++ b/ui/app_list/presenter/app_list_presenter_delegate.h
@@ -5,6 +5,8 @@
 #ifndef UI_APP_LIST_PRESENTER_APP_LIST_PRESENTER_DELEGATE_H_
 #define UI_APP_LIST_PRESENTER_APP_LIST_PRESENTER_DELEGATE_H_
 
+#include <stdint.h>
+
 #include "ui/app_list/presenter/app_list_presenter_export.h"
 
 namespace aura {
@@ -33,11 +35,11 @@
 
   // Called to initialize the layout of the app list.
   virtual void Init(AppListView* view,
-                    aura::Window* root_window,
+                    int64_t display_id,
                     int current_apps_page) = 0;
 
   // Called when app list is shown.
-  virtual void OnShown(aura::Window* root_window) = 0;
+  virtual void OnShown(int64_t display_id) = 0;
 
   // Called when app list is dismissed
   virtual void OnDismissed() = 0;
@@ -46,9 +48,15 @@
   virtual void UpdateBounds() = 0;
 
   // Returns the offset vector by which the app list window should animate
-  // when it gets hidden.
+  // when it gets shown or hidden.
   virtual gfx::Vector2d GetVisibilityAnimationOffset(
       aura::Window* root_window) = 0;
+
+ protected:
+  // Offset in pixels to animation away/towards the shelf.
+  const int kAnimationOffset = 8;
+
+  int GetMinimumBoundsHeightForAppList(const app_list::AppListView* app_list);
 };
 
 }  // namespace app_list
diff --git a/ui/app_list/presenter/app_list_presenter_impl.cc b/ui/app_list/presenter/app_list_presenter_impl.cc
index f76f3f5..572528b 100644
--- a/ui/app_list/presenter/app_list_presenter_impl.cc
+++ b/ui/app_list/presenter/app_list_presenter_impl.cc
@@ -51,13 +51,11 @@
   return is_visible_ && view_ ? view_->GetWidget()->GetNativeWindow() : nullptr;
 }
 
-void AppListPresenterImpl::Show(aura::Window* window) {
+void AppListPresenterImpl::Show(int64_t display_id) {
   if (is_visible_)
     return;
 
-  DCHECK(window);
   is_visible_ = true;
-  aura::Window* root_window = window->GetRootWindow();
   if (view_) {
     ScheduleAnimation();
   } else {
@@ -67,10 +65,10 @@
     // Note the AppListViewDelegate outlives the AppListView. For Ash, the view
     // is destroyed when dismissed.
     AppListView* view = new AppListView(view_delegate);
-    presenter_delegate_->Init(view, root_window, current_apps_page_);
+    presenter_delegate_->Init(view, display_id, current_apps_page_);
     SetView(view);
   }
-  presenter_delegate_->OnShown(root_window);
+  presenter_delegate_->OnShown(display_id);
 }
 
 void AppListPresenterImpl::Dismiss() {
@@ -93,6 +91,14 @@
   ScheduleAnimation();
 }
 
+void AppListPresenterImpl::ToggleAppList(int64_t display_id) {
+  if (IsVisible()) {
+    Dismiss();
+    return;
+  }
+  Show(display_id);
+}
+
 bool AppListPresenterImpl::IsVisible() const {
   return view_ && view_->GetWidget()->IsVisible();
 }
diff --git a/ui/app_list/presenter/app_list_presenter_impl.h b/ui/app_list/presenter/app_list_presenter_impl.h
index 5bc7b50..0c7dfb3 100644
--- a/ui/app_list/presenter/app_list_presenter_impl.h
+++ b/ui/app_list/presenter/app_list_presenter_impl.h
@@ -52,14 +52,17 @@
   AppListView* GetView() { return view_; }
 
   // AppListPresenter:
-  void Show(aura::Window* window) override;
+  void Show(int64_t display_id) override;
   void Dismiss() override;
-  bool IsVisible() const override;
+  void ToggleAppList(int64_t display_id) override;
   bool GetTargetVisibility() const override;
 
  private:
   friend class test::AppListPresenterImplTestApi;
 
+  // Whether the app list's aura::Window is currently visible.
+  bool IsVisible() const;
+
   // Sets the app list view and attempts to show it.
   void SetView(AppListView* view);
 
diff --git a/ui/app_list/presenter/app_list_presenter_impl_unittest.cc b/ui/app_list/presenter/app_list_presenter_impl_unittest.cc
index 75f8c90..cd9941f 100644
--- a/ui/app_list/presenter/app_list_presenter_impl_unittest.cc
+++ b/ui/app_list/presenter/app_list_presenter_impl_unittest.cc
@@ -13,6 +13,7 @@
 #include "ui/app_list/views/app_list_view.h"
 #include "ui/aura/client/focus_client.h"
 #include "ui/aura/test/aura_test_base.h"
+#include "ui/aura/test/test_screen.h"
 #include "ui/aura/window.h"
 #include "ui/wm/core/default_activation_client.h"
 #include "ui/wm/core/window_util.h"
@@ -38,14 +39,14 @@
   // AppListPresenterDelegate:
   AppListViewDelegate* GetViewDelegate() override { return view_delegate_; }
   void Init(AppListView* view,
-            aura::Window* root_window,
+            int64_t display_id,
             int current_apps_page) override {
     init_called_ = true;
     view_ = view;
     view->InitAsFramelessWindow(container_, current_apps_page,
                                 gfx::Rect(100, 50, 300, 200));
   }
-  void OnShown(aura::Window*) override { on_shown_called_ = true; }
+  void OnShown(int64_t display_id) override { on_shown_called_ = true; }
   void OnDismissed() override { on_dismissed_called_ = true; }
   void UpdateBounds() override { update_bounds_called_ = true; }
   gfx::Vector2d GetVisibilityAnimationOffset(aura::Window*) override {
@@ -100,6 +101,7 @@
 
   AppListPresenterImpl* presenter() { return presenter_.get(); }
   aura::Window* container() { return container_.get(); }
+  int64_t GetDisplayId() { return test_screen()->GetPrimaryDisplay().id(); }
 
   // Don't cache the return of this method - a new delegate is created every
   // time the app list is shown.
@@ -143,7 +145,7 @@
 TEST_F(AppListPresenterImplTest, HideOnFocusOut) {
   aura::client::FocusClient* focus_client =
       aura::client::GetFocusClient(root_window());
-  presenter()->Show(container());
+  presenter()->Show(GetDisplayId());
   EXPECT_TRUE(delegate()->init_called());
   EXPECT_TRUE(delegate()->on_shown_called());
   EXPECT_FALSE(delegate()->on_dismissed_called());
@@ -166,7 +168,7 @@
 TEST_F(AppListPresenterImplTest, RemainVisibleWhenFocusingToSibling) {
   aura::client::FocusClient* focus_client =
       aura::client::GetFocusClient(root_window());
-  presenter()->Show(container());
+  presenter()->Show(GetDisplayId());
   focus_client->FocusWindow(presenter()->GetWindow());
   EXPECT_TRUE(presenter()->GetTargetVisibility());
   EXPECT_TRUE(delegate()->init_called());
@@ -187,7 +189,7 @@
 // Tests that UpdateBounds is called on the delegate when the root window
 // is resized.
 TEST_F(AppListPresenterImplTest, RootWindowResize) {
-  presenter()->Show(container());
+  presenter()->Show(GetDisplayId());
   EXPECT_FALSE(delegate()->update_bounds_called());
   gfx::Rect bounds = root_window()->bounds();
   bounds.Inset(-10, 0);
@@ -198,7 +200,7 @@
 // Tests that the app list is dismissed and the delegate is destroyed when the
 // app list's widget is destroyed.
 TEST_F(AppListPresenterImplTest, WidgetDestroyed) {
-  presenter()->Show(container());
+  presenter()->Show(GetDisplayId());
   EXPECT_TRUE(presenter()->GetTargetVisibility());
   presenter()->GetView()->GetWidget()->CloseNow();
   EXPECT_FALSE(presenter()->GetTargetVisibility());
diff --git a/ui/app_list/presenter/app_list_view_delegate_factory.cc b/ui/app_list/presenter/app_list_view_delegate_factory.cc
new file mode 100644
index 0000000..90cfd3d
--- /dev/null
+++ b/ui/app_list/presenter/app_list_view_delegate_factory.cc
@@ -0,0 +1,11 @@
+// Copyright 2016 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/app_list/presenter/app_list_view_delegate_factory.h"
+
+namespace app_list {
+
+AppListViewDelegateFactory::~AppListViewDelegateFactory() {}
+
+}  // namespace app_list
diff --git a/ui/app_list/presenter/app_list_view_delegate_factory.h b/ui/app_list/presenter/app_list_view_delegate_factory.h
new file mode 100644
index 0000000..612d6e3
--- /dev/null
+++ b/ui/app_list/presenter/app_list_view_delegate_factory.h
@@ -0,0 +1,22 @@
+// Copyright 2016 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_APP_LIST_PRESENTER_APP_LIST_VIEW_DELEGATE_FACTORY_H_
+#define UI_APP_LIST_PRESENTER_APP_LIST_VIEW_DELEGATE_FACTORY_H_
+
+#include "ui/app_list/presenter/app_list_presenter_export.h"
+
+namespace app_list {
+class AppListViewDelegate;
+
+class APP_LIST_PRESENTER_EXPORT AppListViewDelegateFactory {
+ public:
+  virtual ~AppListViewDelegateFactory();
+
+  virtual app_list::AppListViewDelegate* GetDelegate() = 0;
+};
+
+}  // namespace app_list
+
+#endif  // UI_APP_LIST_PRESENTER_APP_LIST_VIEW_DELEGATE_FACTORY_H_
diff --git a/ui/app_list/search/mixer_unittest.cc b/ui/app_list/search/mixer_unittest.cc
index bca736c..92e06298 100644
--- a/ui/app_list/search/mixer_unittest.cc
+++ b/ui/app_list/search/mixer_unittest.cc
@@ -31,7 +31,6 @@
 // Ignored unless AppListMixer field trial is "Blended".
 const size_t kMaxOmniboxResults = 4;
 const size_t kMaxWebstoreResults = 2;
-const size_t kMaxPeopleResults = 2;
 
 class TestSearchResult : public SearchResult {
  public:
@@ -136,7 +135,6 @@
     providers_.push_back(new TestSearchProvider("app"));
     providers_.push_back(new TestSearchProvider("omnibox"));
     providers_.push_back(new TestSearchProvider("webstore"));
-    providers_.push_back(new TestSearchProvider("people"));
 
     is_voice_query_ = false;
 
@@ -146,12 +144,10 @@
     size_t omnibox_group_id =
         mixer_->AddOmniboxGroup(kMaxOmniboxResults, 2.0, 1.0);
     size_t webstore_group_id = mixer_->AddGroup(kMaxWebstoreResults, 1.0, 0.5);
-    size_t people_group_id = mixer_->AddGroup(kMaxPeopleResults, 0.0, 1.0);
 
     mixer_->AddProviderToGroup(apps_group_id, providers_[0]);
     mixer_->AddProviderToGroup(omnibox_group_id, providers_[1]);
     mixer_->AddProviderToGroup(webstore_group_id, providers_[2]);
-    mixer_->AddProviderToGroup(people_group_id, providers_[3]);
   }
 
   void RunQuery() {
@@ -181,7 +177,6 @@
   TestSearchProvider* app_provider() { return providers_[0]; }
   TestSearchProvider* omnibox_provider() { return providers_[1]; }
   TestSearchProvider* webstore_provider() { return providers_[2]; }
-  TestSearchProvider* people_provider() { return providers_[3]; }
 
   // Sets whether test runs should be treated as a voice query.
   void set_is_voice_query(bool is_voice_query) {
@@ -215,130 +210,49 @@
     const size_t app_results;
     const size_t omnibox_results;
     const size_t webstore_results;
-    const size_t people_results;
     const char* expected_default;  // Expected results with trial off.
     const char* expected_blended;  // Expected results with trial on.
   } kTestCases[] = {
-      {0, 0, 0, 0, "", ""},
-      {10,
-       0,
-       0,
-       0,
-       "app0,app1,app2,app3",
+      {0, 0, 0, "", ""},
+      {10, 0, 0, "app0,app1,app2,app3",
        "app0,app1,app2,app3,app4,app5,app6,app7,app8,app9"},
-      {0,
-       0,
-       10,
-       0,
-       "webstore0,webstore1",
+      {0, 0, 10, "webstore0,webstore1",
        "webstore0,webstore1,webstore2,webstore3,webstore4,webstore5,webstore6,"
        "webstore7,webstore8,webstore9"},
-      {0,
-       0,
-       0,
-       10,
-       "people0,people1",
-       "people0,people1,people2,people3,people4,people5,people6,people7,"
-       "people8,people9"},
-      {4,
-       6,
-       0,
-       0,
-       "app0,app1,app2,app3,omnibox0,omnibox1",
+      {4, 6, 0, "app0,app1,app2,app3,omnibox0,omnibox1",
        "app0,omnibox0,app1,omnibox1,app2,omnibox2,app3,omnibox3"},
-      {4,
-       6,
-       2,
-       0,
-       "app0,app1,app2,app3,omnibox0,webstore0",
+      {4, 6, 2, "app0,app1,app2,app3,omnibox0,webstore0",
        "app0,omnibox0,app1,omnibox1,app2,omnibox2,app3,omnibox3,webstore0,"
        "webstore1"},
-      {4,
-       6,
-       0,
-       2,
-       "app0,app1,app2,app3,omnibox0,people0",
-       "app0,omnibox0,people0,app1,omnibox1,people1,app2,omnibox2,app3,"
-       "omnibox3"},
-      {10,
-       10,
-       10,
-       0,
-       "app0,app1,app2,app3,omnibox0,webstore0",
+      {10, 10, 10, "app0,app1,app2,app3,omnibox0,webstore0",
        "app0,omnibox0,app1,omnibox1,app2,omnibox2,app3,omnibox3,webstore0,"
        "webstore1"},
-      {0,
-       10,
-       0,
-       0,
-       "omnibox0,omnibox1,omnibox2,omnibox3,omnibox4,omnibox5",
+      {0, 10, 0, "omnibox0,omnibox1,omnibox2,omnibox3,omnibox4,omnibox5",
        "omnibox0,omnibox1,omnibox2,omnibox3,omnibox4,omnibox5,omnibox6,"
        "omnibox7,omnibox8,omnibox9"},
-      {0,
-       10,
-       1,
-       0,
-       "omnibox0,omnibox1,omnibox2,omnibox3,omnibox4,webstore0",
+      {0, 10, 1, "omnibox0,omnibox1,omnibox2,omnibox3,omnibox4,webstore0",
        "omnibox0,omnibox1,omnibox2,omnibox3,webstore0,omnibox4,omnibox5,"
        "omnibox6,omnibox7,omnibox8,omnibox9"},
-      {0,
-       10,
-       2,
-       0,
-       "omnibox0,omnibox1,omnibox2,omnibox3,webstore0,webstore1",
+      {0, 10, 2, "omnibox0,omnibox1,omnibox2,omnibox3,webstore0,webstore1",
        "omnibox0,omnibox1,omnibox2,omnibox3,webstore0,webstore1"},
-      {1,
-       10,
-       0,
-       0,
-       "app0,omnibox0,omnibox1,omnibox2,omnibox3,omnibox4",
+      {1, 10, 0, "app0,omnibox0,omnibox1,omnibox2,omnibox3,omnibox4",
        "app0,omnibox0,omnibox1,omnibox2,omnibox3,omnibox4,omnibox5,omnibox6,"
        "omnibox7,omnibox8,omnibox9"},
-      {2,
-       10,
-       0,
-       0,
-       "app0,app1,omnibox0,omnibox1,omnibox2,omnibox3",
+      {2, 10, 0, "app0,app1,omnibox0,omnibox1,omnibox2,omnibox3",
        "app0,omnibox0,app1,omnibox1,omnibox2,omnibox3"},
-      {2,
-       10,
-       1,
-       0,
-       "app0,app1,omnibox0,omnibox1,omnibox2,webstore0",
+      {2, 10, 1, "app0,app1,omnibox0,omnibox1,omnibox2,webstore0",
        "app0,omnibox0,app1,omnibox1,omnibox2,omnibox3,webstore0"},
-      {2,
-       10,
-       2,
-       0,
-       "app0,app1,omnibox0,omnibox1,webstore0,webstore1",
+      {2, 10, 2, "app0,app1,omnibox0,omnibox1,webstore0,webstore1",
        "app0,omnibox0,app1,omnibox1,omnibox2,omnibox3,webstore0,webstore1"},
-      {2,
-       0,
-       2,
-       0,
-       "app0,app1,webstore0,webstore1",
+      {2, 0, 2, "app0,app1,webstore0,webstore1",
        "app0,app1,webstore0,webstore1"},
-      {10,
-       0,
-       10,
-       10,
-       "app0,app1,app2,app3,webstore0,webstore1",
-       "app0,people0,app1,people1,app2,app3,webstore0,webstore1"},
-      {10,
-       10,
-       10,
-       10,
-       "app0,app1,app2,app3,omnibox0,webstore0",
-       "app0,omnibox0,people0,app1,omnibox1,people1,app2,omnibox2,app3,"
-       "omnibox3,webstore0,webstore1"},
-      {0, 0, 0, 0, "", ""},
+      {0, 0, 0, "", ""},
   };
 
   for (size_t i = 0; i < arraysize(kTestCases); ++i) {
     app_provider()->set_count(kTestCases[i].app_results);
     omnibox_provider()->set_count(kTestCases[i].omnibox_results);
     webstore_provider()->set_count(kTestCases[i].webstore_results);
-    people_provider()->set_count(kTestCases[i].people_results);
     RunQuery();
 
     const char* expected = GetParam() ? kTestCases[i].expected_blended
@@ -428,25 +342,6 @@
   EXPECT_EQ("omnibox1,omnibox2,omnibox0", GetResults());
 }
 
-TEST_P(MixerTest, BadRelevanceRange) {
-  // This gives relevance scores: (10.0, 0.0). Even though providers are
-  // supposed to give scores within the range [0.0, 1.0], we cannot rely on
-  // providers to do this, since they retrieve results from disparate and
-  // unreliable sources (like the Google+ API).
-  people_provider()->set_bad_relevance_range();
-  people_provider()->set_count(2);
-
-  // Give a massive boost to the second result.
-  AddKnownResult("people1", PERFECT_PRIMARY);
-
-  RunQuery();
-
-  // If the results are correctly clamped to the range [0.0, 1.0], the boost to
-  // "people1" will push it over the first result. If not, the massive base
-  // score of "people0" will erroneously keep it on top.
-  EXPECT_EQ("people1,people0", GetResults());
-}
-
 TEST_P(MixerTest, Publish) {
   std::unique_ptr<SearchResult> result1(new TestSearchResult("app1", 0));
   std::unique_ptr<SearchResult> result2(new TestSearchResult("app2", 0));
diff --git a/ui/arc/notification/arc_notification_item.cc b/ui/arc/notification/arc_notification_item.cc
index d9ac5dd..5d936ad 100644
--- a/ui/arc/notification/arc_notification_item.cc
+++ b/ui/arc/notification/arc_notification_item.cc
@@ -12,9 +12,13 @@
 #include "base/task_runner.h"
 #include "base/task_runner_util.h"
 #include "base/threading/worker_pool.h"
+#include "components/arc/bitmap/bitmap_type_converters.h"
+#include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkPaint.h"
 #include "ui/gfx/codec/png_codec.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/image/image.h"
+#include "ui/gfx/text_elider.h"
 #include "ui/message_center/message_center_style.h"
 #include "ui/message_center/notification.h"
 #include "ui/message_center/notification_types.h"
@@ -39,6 +43,49 @@
   return bitmap;
 }
 
+// Crops the image to proper size for Chrome Notification. It accepts only
+// specified aspect ratio. Otherwise, it might be letterboxed.
+SkBitmap CropImage(const SkBitmap& original_bitmap) {
+  DCHECK_NE(0, original_bitmap.width());
+  DCHECK_NE(0, original_bitmap.height());
+
+  const SkSize container_size = SkSize::Make(
+      message_center::kNotificationPreferredImageWidth,
+      message_center::kNotificationPreferredImageHeight);
+  const float container_aspect_ratio =
+      static_cast<float>(message_center::kNotificationPreferredImageWidth) /
+      message_center::kNotificationPreferredImageHeight;
+  const float image_aspect_ratio =
+      static_cast<float>(original_bitmap.width()) / original_bitmap.height();
+
+  SkRect source_rect;
+  if (image_aspect_ratio > container_aspect_ratio) {
+    float width = original_bitmap.height() * container_aspect_ratio;
+    source_rect = SkRect::MakeXYWH((original_bitmap.width() - width) / 2,
+                                   0,
+                                   width,
+                                   original_bitmap.height());
+  } else {
+    float height = original_bitmap.width() / container_aspect_ratio;
+    source_rect = SkRect::MakeXYWH(0,
+                                   (original_bitmap.height() - height) / 2,
+                                   original_bitmap.width(),
+                                   height);
+  }
+
+  SkBitmap container_bitmap;
+  container_bitmap.allocN32Pixels(container_size.width(),
+                                  container_size.height());
+  SkPaint paint;
+  paint.setFilterQuality(kHigh_SkFilterQuality);
+  SkCanvas container_image(container_bitmap);
+  container_image.drawColor(message_center::kImageBackgroundColor);
+  container_image.drawBitmapRect(
+      original_bitmap, source_rect, SkRect::MakeSize(container_size), &paint);
+
+  return container_bitmap;
+}
+
 // Converts from Android notification priority to Chrome notification priority.
 // On Android, PRIORITY_DEFAULT does not pop up, so this maps PRIORITY_DEFAULT
 // to Chrome's -1 to adapt that behavior. Also, this maps PRIORITY_LOW and _HIGH
@@ -134,10 +181,38 @@
     case mojom::ArcNotificationType::BASIC:
       type = message_center::NOTIFICATION_TYPE_BASE_FORMAT;
       break;
+    case mojom::ArcNotificationType::LIST:
+      type = message_center::NOTIFICATION_TYPE_MULTIPLE;
+
+      if (data.texts.is_null())
+        break;
+
+      for (size_t i = 0;
+           i < std::min(data.texts.size(),
+                        message_center::kNotificationMaximumItems - 1);
+           i++) {
+        rich_data.items.emplace_back(
+            base::string16(), base::UTF8ToUTF16(data.texts.at(i).get()));
+      }
+
+      if (data.texts.size() > message_center::kNotificationMaximumItems) {
+        // Show an elipsis as the 5th item if there are more than 5 items.
+        rich_data.items.emplace_back(base::string16(), gfx::kEllipsisUTF16);
+      } else if (data.texts.size() ==
+                 message_center::kNotificationMaximumItems) {
+        // Show the 5th item if there are exact 5 items.
+        rich_data.items.emplace_back(
+            base::string16(),
+            base::UTF8ToUTF16(data.texts.at(data.texts.size() - 1).get()));
+      }
+      break;
     case mojom::ArcNotificationType::IMAGE:
-      // TODO(yoshiki): Implement this types.
-      type = message_center::NOTIFICATION_TYPE_BASE_FORMAT;
-      LOG(ERROR) << "Unsupported notification type: image";
+      type = message_center::NOTIFICATION_TYPE_IMAGE;
+
+      if (!data.big_picture.is_null()) {
+        rich_data.image = gfx::Image::CreateFrom1xBitmap(
+            CropImage(data.big_picture.To<SkBitmap>()));
+      }
       break;
     case mojom::ArcNotificationType::PROGRESS:
       type = message_center::NOTIFICATION_TYPE_PROGRESS;
@@ -153,8 +228,8 @@
                                       << data.type;
 
   for (size_t i = 0; i < data.buttons.size(); i++) {
-    rich_data.buttons.push_back(message_center::ButtonInfo(
-        base::UTF8ToUTF16(data.buttons.at(i)->label.get())));
+    rich_data.buttons.emplace_back(
+        base::UTF8ToUTF16(data.buttons.at(i)->label.get()));
   }
 
   // If the client is old (version < 1), both |no_clear| and |ongoing_event|
diff --git a/ui/aura/test/test_screen.cc b/ui/aura/test/test_screen.cc
index 298c7d8..f19137c 100644
--- a/ui/aura/test/test_screen.cc
+++ b/ui/aura/test/test_screen.cc
@@ -81,6 +81,10 @@
   display_.UpdateWorkAreaFromInsets(insets);
 }
 
+display::Display TestScreen::GetPrimaryDisplay() const {
+  return display_;
+}
+
 gfx::Transform TestScreen::GetRotationTransform() const {
   gfx::Transform rotate;
   switch (display_.rotation()) {
@@ -126,8 +130,8 @@
   return Env::GetInstance()->last_mouse_location();
 }
 
-gfx::NativeWindow TestScreen::GetWindowUnderCursor() {
-  return GetWindowAtScreenPoint(GetCursorScreenPoint());
+bool TestScreen::IsWindowUnderCursor(gfx::NativeWindow window) {
+  return GetWindowAtScreenPoint(GetCursorScreenPoint()) == window;
 }
 
 gfx::NativeWindow TestScreen::GetWindowAtScreenPoint(const gfx::Point& point) {
@@ -159,10 +163,6 @@
   return display_;
 }
 
-display::Display TestScreen::GetPrimaryDisplay() const {
-  return display_;
-}
-
 void TestScreen::AddObserver(display::DisplayObserver* observer) {}
 
 void TestScreen::RemoveObserver(display::DisplayObserver* observer) {}
diff --git a/ui/aura/test/test_screen.h b/ui/aura/test/test_screen.h
index 69b0b089..25e95ff 100644
--- a/ui/aura/test/test_screen.h
+++ b/ui/aura/test/test_screen.h
@@ -37,6 +37,9 @@
   void SetUIScale(float ui_scale);
   void SetWorkAreaInsets(const gfx::Insets& insets);
 
+  // gfx::Screen overrides:
+  display::Display GetPrimaryDisplay() const override;
+
  protected:
   gfx::Transform GetRotationTransform() const;
   gfx::Transform GetUIScaleTransform() const;
@@ -49,7 +52,7 @@
 
   // display::Screen overrides:
   gfx::Point GetCursorScreenPoint() override;
-  gfx::NativeWindow GetWindowUnderCursor() override;
+  bool IsWindowUnderCursor(gfx::NativeWindow window) override;
   gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override;
   int GetNumDisplays() const override;
   std::vector<display::Display> GetAllDisplays() const override;
@@ -58,7 +61,6 @@
       const gfx::Point& point) const override;
   display::Display GetDisplayMatching(
       const gfx::Rect& match_rect) const override;
-  display::Display GetPrimaryDisplay() const override;
   void AddObserver(display::DisplayObserver* observer) override;
   void RemoveObserver(display::DisplayObserver* observer) override;
 
diff --git a/ui/aura/window_tree_host.cc b/ui/aura/window_tree_host.cc
index 9167997..f89f4cd 100644
--- a/ui/aura/window_tree_host.cc
+++ b/ui/aura/window_tree_host.cc
@@ -285,6 +285,11 @@
   FOR_EACH_OBSERVER(WindowTreeHostObserver, observers_, OnHostResized(this));
 }
 
+void WindowTreeHost::OnHostWorkspaceChanged() {
+  FOR_EACH_OBSERVER(WindowTreeHostObserver, observers_,
+                    OnHostWorkspaceChanged(this));
+}
+
 void WindowTreeHost::OnHostCloseRequested() {
   FOR_EACH_OBSERVER(WindowTreeHostObserver, observers_,
                     OnHostCloseRequested(this));
diff --git a/ui/aura/window_tree_host.h b/ui/aura/window_tree_host.h
index ed30d27..f72419c6 100644
--- a/ui/aura/window_tree_host.h
+++ b/ui/aura/window_tree_host.h
@@ -194,6 +194,7 @@
 
   void OnHostMoved(const gfx::Point& new_location);
   void OnHostResized(const gfx::Size& new_size);
+  void OnHostWorkspaceChanged();
   void OnHostCloseRequested();
   void OnHostActivated();
   void OnHostLostWindowCapture();
diff --git a/ui/aura/window_tree_host_observer.h b/ui/aura/window_tree_host_observer.h
index d96e9d3..5c06dd111 100644
--- a/ui/aura/window_tree_host_observer.h
+++ b/ui/aura/window_tree_host_observer.h
@@ -24,6 +24,9 @@
   virtual void OnHostMoved(const WindowTreeHost* host,
                            const gfx::Point& new_origin) {}
 
+  // Called when the host is moved to a different workspace.
+  virtual void OnHostWorkspaceChanged(const WindowTreeHost* host) {}
+
   // Called when the native window system sends the host request to close.
   virtual void OnHostCloseRequested(const WindowTreeHost* host) {}
 
diff --git a/ui/compositor/test/in_process_context_factory.cc b/ui/compositor/test/in_process_context_factory.cc
index f6faff08..19fa966 100644
--- a/ui/compositor/test/in_process_context_factory.cc
+++ b/ui/compositor/test/in_process_context_factory.cc
@@ -130,8 +130,6 @@
     if (shared_worker_context_provider_ &&
         !shared_worker_context_provider_->BindToCurrentThread())
       shared_worker_context_provider_ = nullptr;
-    if (shared_worker_context_provider_)
-      shared_worker_context_provider_->SetupLock();
   }
 
   gpu::gles2::ContextCreationAttribHelper attribs;
diff --git a/ui/compositor/test/in_process_context_provider.cc b/ui/compositor/test/in_process_context_provider.cc
index d01f03c..8d03305 100644
--- a/ui/compositor/test/in_process_context_provider.cc
+++ b/ui/compositor/test/in_process_context_provider.cc
@@ -144,9 +144,6 @@
     gr_context_->ResetContext(state);
 }
 
-void InProcessContextProvider::SetupLock() {
-}
-
 base::Lock* InProcessContextProvider::GetLock() {
   return &context_lock_;
 }
diff --git a/ui/compositor/test/in_process_context_provider.h b/ui/compositor/test/in_process_context_provider.h
index d1aab9c39..a7cc92e 100644
--- a/ui/compositor/test/in_process_context_provider.h
+++ b/ui/compositor/test/in_process_context_provider.h
@@ -54,7 +54,6 @@
   gpu::ContextSupport* ContextSupport() override;
   class GrContext* GrContext() override;
   void InvalidateGrContext(uint32_t state) override;
-  void SetupLock() override;
   base::Lock* GetLock() override;
   void DeleteCachedResources() override;
   void SetLostContextCallback(
diff --git a/ui/display/BUILD.gn b/ui/display/BUILD.gn
index 2f1e4109..4d4033c 100644
--- a/ui/display/BUILD.gn
+++ b/ui/display/BUILD.gn
@@ -151,6 +151,7 @@
     "chromeos/x11/display_util_x11_unittest.cc",
     "chromeos/x11/native_display_event_dispatcher_x11_unittest.cc",
     "manager/display_layout_builder_unittest.cc",
+    "manager/display_layout_unittest.cc",
     "util/display_util_unittest.cc",
     "util/edid_parser_unittest.cc",
     "win/screen_win_unittest.cc",
diff --git a/ui/display/display.gyp b/ui/display/display.gyp
index 14f413c..07e8b016 100644
--- a/ui/display/display.gyp
+++ b/ui/display/display.gyp
@@ -219,6 +219,7 @@
         'chromeos/x11/display_util_x11_unittest.cc',
         'chromeos/x11/native_display_event_dispatcher_x11_unittest.cc',
         'manager/display_layout_builder_unittest.cc',
+        'manager/display_layout_unittest.cc',
         'util/display_util_unittest.cc',
         'util/edid_parser_unittest.cc',
         'win/screen_win_unittest.cc',
diff --git a/ui/display/manager/display_layout_unittest.cc b/ui/display/manager/display_layout_unittest.cc
new file mode 100644
index 0000000..ae03687
--- /dev/null
+++ b/ui/display/manager/display_layout_unittest.cc
@@ -0,0 +1,302 @@
+// Copyright 2016 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/display/display.h"
+
+#include <tuple>
+#include <vector>
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/display/manager/display_layout.h"
+#include "ui/display/manager/display_layout_builder.h"
+
+namespace display {
+
+TEST(DisplayLayoutTest, Empty) {
+  DisplayList display_list;
+  std::vector<int64_t> updated_ids;
+
+  DisplayLayout display_layout;
+  display_layout.ApplyToDisplayList(&display_list, &updated_ids, 0);
+
+  EXPECT_EQ(0u, updated_ids.size());
+  EXPECT_EQ(0u, display_list.size());
+}
+
+TEST(DisplayLayoutTest, SingleDisplayNoPlacements) {
+  DisplayList display_list;
+  display_list.emplace_back(0, gfx::Rect(0, 0, 800, 600));
+  std::vector<int64_t> updated_ids;
+
+  DisplayLayout display_layout;
+  display_layout.ApplyToDisplayList(&display_list, &updated_ids, 0);
+
+  EXPECT_EQ(0u, updated_ids.size());
+  ASSERT_EQ(1u, display_list.size());
+  EXPECT_EQ(gfx::Rect(0, 0, 800, 600), display_list[0].bounds());
+}
+
+TEST(DisplayLayoutTest, SingleDisplayNonRelevantPlacement) {
+  DisplayList display_list;
+  display_list.emplace_back(0, gfx::Rect(0, 0, 800, 600));
+  std::vector<int64_t> updated_ids;
+
+  DisplayLayoutBuilder builder(20);
+  builder.AddDisplayPlacement(20, 40, DisplayPlacement::Position::LEFT, 150);
+  std::unique_ptr<DisplayLayout> display_layout(builder.Build());
+  display_layout->ApplyToDisplayList(&display_list, &updated_ids, 0);
+
+  EXPECT_EQ(0u, updated_ids.size());
+  ASSERT_EQ(1u, display_list.size());
+  EXPECT_EQ(gfx::Rect(0, 0, 800, 600), display_list[0].bounds());
+}
+
+namespace {
+
+class TwoDisplays
+    : public testing::TestWithParam<std::tuple<
+          // Primary Display Bounds
+          gfx::Rect,
+          // Secondary Display Bounds
+          gfx::Rect,
+          // Secondary Layout Position
+          DisplayPlacement::Position,
+          // Secondary Layout Offset
+          int,
+          // Minimum Offset Overlap
+          int,
+          // Expected Primary Display Bounds
+          gfx::Rect,
+          // Expected Secondary Display Bounds
+          gfx::Rect>> {
+ public:
+  TwoDisplays() = default;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TwoDisplays);
+};
+
+}  // namespace
+
+TEST_P(TwoDisplays, Placement) {
+  gfx::Rect primary_display_bounds = std::get<0>(GetParam());
+  gfx::Rect secondary_display_bounds = std::get<1>(GetParam());
+  DisplayPlacement::Position position = std::get<2>(GetParam());
+  int offset = std::get<3>(GetParam());
+  int minimum_offset_overlap = std::get<4>(GetParam());
+  gfx::Rect expected_primary_display_bounds = std::get<5>(GetParam());
+  gfx::Rect expected_secondary_display_bounds = std::get<6>(GetParam());
+
+  DisplayList display_list;
+  display_list.emplace_back(0, primary_display_bounds);
+  display_list.emplace_back(1, secondary_display_bounds);
+  std::vector<int64_t> updated_ids;
+
+  DisplayLayoutBuilder builder(0);
+  builder.AddDisplayPlacement(1, 0, position, offset);
+  std::unique_ptr<DisplayLayout> display_layout(builder.Build());
+  display_layout->ApplyToDisplayList(
+      &display_list, &updated_ids, minimum_offset_overlap);
+
+  ASSERT_EQ(1u, updated_ids.size());
+  EXPECT_EQ(1u, updated_ids[0]);
+  ASSERT_EQ(2u, display_list.size());
+  EXPECT_EQ(expected_primary_display_bounds, display_list[0].bounds());
+  EXPECT_EQ(expected_secondary_display_bounds, display_list[1].bounds());
+}
+
+INSTANTIATE_TEST_CASE_P(DisplayLayoutTestZero, TwoDisplays, testing::Values(
+    std::make_tuple(
+        gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768),
+        DisplayPlacement::Position::LEFT, 0, 0,
+        gfx::Rect(0, 0, 800, 600), gfx::Rect(-1024, 0, 1024, 768)),
+    std::make_tuple(
+        gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768),
+        DisplayPlacement::Position::TOP, 0, 0,
+        gfx::Rect(0, 0, 800, 600), gfx::Rect(0, -768, 1024, 768)),
+    std::make_tuple(
+        gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768),
+        DisplayPlacement::Position::RIGHT, 0, 0,
+        gfx::Rect(0, 0, 800, 600), gfx::Rect(800, 0, 1024, 768)),
+    std::make_tuple(
+        gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768),
+        DisplayPlacement::Position::BOTTOM, 0, 0,
+        gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 600, 1024, 768))));
+
+INSTANTIATE_TEST_CASE_P(DisplayLayoutTestOffset, TwoDisplays, testing::Values(
+    std::make_tuple(
+        gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768),
+        DisplayPlacement::Position::LEFT, 37, 0,
+        gfx::Rect(0, 0, 800, 600), gfx::Rect(-1024, 37, 1024, 768)),
+    std::make_tuple(
+        gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768),
+        DisplayPlacement::Position::TOP, 37, 0,
+        gfx::Rect(0, 0, 800, 600), gfx::Rect(37, -768, 1024, 768)),
+    std::make_tuple(
+        gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768),
+        DisplayPlacement::Position::RIGHT, 37, 0,
+        gfx::Rect(0, 0, 800, 600), gfx::Rect(800, 37, 1024, 768)),
+    std::make_tuple(
+        gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768),
+        DisplayPlacement::Position::BOTTOM, 37, 0,
+        gfx::Rect(0, 0, 800, 600), gfx::Rect(37, 600, 1024, 768))));
+
+INSTANTIATE_TEST_CASE_P(DisplayLayoutTestCorner, TwoDisplays, testing::Values(
+    // Top-Left
+    std::make_tuple(
+        gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60),
+        DisplayPlacement::Position::LEFT, -60, 0,
+        gfx::Rect(0, 0, 20, 40), gfx::Rect(-30, -60, 30, 60)),
+    std::make_tuple(
+        gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60),
+        DisplayPlacement::Position::TOP, -30, 0,
+        gfx::Rect(0, 0, 20, 40), gfx::Rect(-30, -60, 30, 60)),
+    // Top-Right
+    std::make_tuple(
+        gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60),
+        DisplayPlacement::Position::RIGHT, -60, 0,
+        gfx::Rect(0, 0, 20, 40), gfx::Rect(20, -60, 30, 60)),
+    std::make_tuple(
+        gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60),
+        DisplayPlacement::Position::TOP, 20, 0,
+        gfx::Rect(0, 0, 20, 40), gfx::Rect(20, -60, 30, 60)),
+    // Bottom-Right
+    std::make_tuple(
+        gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60),
+        DisplayPlacement::Position::RIGHT, 40, 0,
+        gfx::Rect(0, 0, 20, 40), gfx::Rect(20, 40, 30, 60)),
+    std::make_tuple(
+        gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60),
+        DisplayPlacement::Position::BOTTOM, 20, 0,
+        gfx::Rect(0, 0, 20, 40), gfx::Rect(20, 40, 30, 60)),
+    // Bottom-Left
+    std::make_tuple(
+        gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60),
+        DisplayPlacement::Position::LEFT, 40, 0,
+        gfx::Rect(0, 0, 20, 40), gfx::Rect(-30, 40, 30, 60)),
+    std::make_tuple(
+        gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60),
+        DisplayPlacement::Position::BOTTOM, -30, 0,
+        gfx::Rect(0, 0, 20, 40), gfx::Rect(-30, 40, 30, 60))));
+
+INSTANTIATE_TEST_CASE_P(DisplayLayoutTestZeroMinimumOverlap, TwoDisplays,
+    testing::Values(
+        std::make_tuple(
+            gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768),
+            DisplayPlacement::Position::LEFT, 0, 14,
+            gfx::Rect(0, 0, 800, 600), gfx::Rect(-1024, 0, 1024, 768)),
+        std::make_tuple(
+            gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768),
+            DisplayPlacement::Position::TOP, 0, 14,
+            gfx::Rect(0, 0, 800, 600), gfx::Rect(0, -768, 1024, 768)),
+        std::make_tuple(
+            gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768),
+            DisplayPlacement::Position::RIGHT, 0, 14,
+            gfx::Rect(0, 0, 800, 600), gfx::Rect(800, 0, 1024, 768)),
+        std::make_tuple(
+            gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768),
+            DisplayPlacement::Position::BOTTOM, 0, 14,
+            gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 600, 1024, 768))));
+
+INSTANTIATE_TEST_CASE_P(DisplayLayoutTestOffsetMinimumOverlap, TwoDisplays,
+    testing::Values(
+        std::make_tuple(
+            gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768),
+            DisplayPlacement::Position::LEFT, 37, 14,
+            gfx::Rect(0, 0, 800, 600), gfx::Rect(-1024, 37, 1024, 768)),
+        std::make_tuple(
+            gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768),
+            DisplayPlacement::Position::TOP, 37, 14,
+            gfx::Rect(0, 0, 800, 600), gfx::Rect(37, -768, 1024, 768)),
+        std::make_tuple(
+            gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768),
+            DisplayPlacement::Position::RIGHT, 37, 14,
+            gfx::Rect(0, 0, 800, 600), gfx::Rect(800, 37, 1024, 768)),
+        std::make_tuple(
+            gfx::Rect(0, 0, 800, 600), gfx::Rect(0, 0, 1024, 768),
+            DisplayPlacement::Position::BOTTOM, 37, 14,
+            gfx::Rect(0, 0, 800, 600), gfx::Rect(37, 600, 1024, 768))));
+
+INSTANTIATE_TEST_CASE_P(DisplayLayoutTestMinimumOverlap, TwoDisplays,
+    testing::Values(
+        // Top-Left
+        std::make_tuple(
+            gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60),
+            DisplayPlacement::Position::LEFT, -60, 14,
+            gfx::Rect(0, 0, 20, 40), gfx::Rect(-30, -46, 30, 60)),
+        std::make_tuple(
+            gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60),
+            DisplayPlacement::Position::TOP, -30, 14,
+            gfx::Rect(0, 0, 20, 40), gfx::Rect(-16, -60, 30, 60)),
+        // Top-Right
+        std::make_tuple(
+            gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60),
+            DisplayPlacement::Position::RIGHT, -60, 14,
+            gfx::Rect(0, 0, 20, 40), gfx::Rect(20, -46, 30, 60)),
+        std::make_tuple(
+            gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60),
+            DisplayPlacement::Position::TOP, 20, 14,
+            gfx::Rect(0, 0, 20, 40), gfx::Rect(6, -60, 30, 60)),
+        // Bottom-Right
+        std::make_tuple(
+            gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60),
+            DisplayPlacement::Position::RIGHT, 40, 14,
+            gfx::Rect(0, 0, 20, 40), gfx::Rect(20, 26, 30, 60)),
+        std::make_tuple(
+            gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60),
+            DisplayPlacement::Position::BOTTOM, 20, 14,
+            gfx::Rect(0, 0, 20, 40), gfx::Rect(6, 40, 30, 60)),
+        // Bottom-Left
+        std::make_tuple(
+            gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60),
+            DisplayPlacement::Position::LEFT, 40, 14,
+            gfx::Rect(0, 0, 20, 40), gfx::Rect(-30, 26, 30, 60)),
+        std::make_tuple(
+            gfx::Rect(0, 0, 20, 40), gfx::Rect(0, 0, 30, 60),
+            DisplayPlacement::Position::BOTTOM, -30, 14,
+            gfx::Rect(0, 0, 20, 40), gfx::Rect(-16, 40, 30, 60))));
+
+// Display Layout
+//     [1]  [4]
+//    [0][3]   [6]
+// [2]  [5]
+TEST(DisplayLayoutTest, MultipleDisplays) {
+  DisplayList display_list;
+  display_list.emplace_back(0, gfx::Rect(0, 0, 100, 100));
+  display_list.emplace_back(1, gfx::Rect(0, 0, 100, 100));
+  display_list.emplace_back(2, gfx::Rect(0, 0, 100, 100));
+  display_list.emplace_back(3, gfx::Rect(0, 0, 100, 100));
+  display_list.emplace_back(4, gfx::Rect(0, 0, 100, 100));
+  display_list.emplace_back(5, gfx::Rect(0, 0, 100, 100));
+  display_list.emplace_back(6, gfx::Rect(0, 0, 100, 100));
+  std::vector<int64_t> updated_ids;
+
+  DisplayLayoutBuilder builder(0);
+  builder.AddDisplayPlacement(1, 0, DisplayPlacement::Position::TOP, 50);
+  builder.AddDisplayPlacement(2, 0, DisplayPlacement::Position::LEFT, 100);
+  builder.AddDisplayPlacement(3, 0, DisplayPlacement::Position::RIGHT, 0);
+  builder.AddDisplayPlacement(4, 3, DisplayPlacement::Position::RIGHT, -100);
+  builder.AddDisplayPlacement(5, 3, DisplayPlacement::Position::BOTTOM, -50);
+  builder.AddDisplayPlacement(6, 4, DisplayPlacement::Position::BOTTOM, 100);
+  std::unique_ptr<DisplayLayout> display_layout(builder.Build());
+  display_layout->ApplyToDisplayList(&display_list, &updated_ids, 0);
+
+  ASSERT_EQ(6u, updated_ids.size());
+  std::sort(updated_ids.begin(), updated_ids.end());
+  EXPECT_EQ(1u, updated_ids[0]);
+  EXPECT_EQ(2u, updated_ids[1]);
+  EXPECT_EQ(3u, updated_ids[2]);
+  EXPECT_EQ(4u, updated_ids[3]);
+  EXPECT_EQ(5u, updated_ids[4]);
+  EXPECT_EQ(6u, updated_ids[5]);
+  EXPECT_EQ(gfx::Rect(0, 0, 100, 100), display_list[0].bounds());
+  EXPECT_EQ(gfx::Rect(50, -100, 100, 100), display_list[1].bounds());
+  EXPECT_EQ(gfx::Rect(-100, 100, 100, 100), display_list[2].bounds());
+  EXPECT_EQ(gfx::Rect(100, 0, 100, 100), display_list[3].bounds());
+  EXPECT_EQ(gfx::Rect(200, -100, 100, 100), display_list[4].bounds());
+  EXPECT_EQ(gfx::Rect(50, 100, 100, 100), display_list[5].bounds());
+  EXPECT_EQ(gfx::Rect(300, 0, 100, 100), display_list[6].bounds());
+}
+
+}  // namespace display
diff --git a/ui/display/win/screen_win.cc b/ui/display/win/screen_win.cc
index e79645d..0667369 100644
--- a/ui/display/win/screen_win.cc
+++ b/ui/display/win/screen_win.cc
@@ -161,11 +161,11 @@
   return ScreenToDIPPoint(cursor_pos_pixels);
 }
 
-gfx::NativeWindow ScreenWin::GetWindowUnderCursor() {
+bool ScreenWin::IsWindowUnderCursor(gfx::NativeWindow window) {
   POINT cursor_loc;
   HWND hwnd =
       ::GetCursorPos(&cursor_loc) ? ::WindowFromPoint(cursor_loc) : nullptr;
-  return GetNativeWindowFromHWND(hwnd);
+  return GetNativeWindowFromHWND(hwnd) == window;
 }
 
 gfx::NativeWindow ScreenWin::GetWindowAtScreenPoint(const gfx::Point& point) {
diff --git a/ui/display/win/screen_win.h b/ui/display/win/screen_win.h
index c35c9b3..1ea4ebe 100644
--- a/ui/display/win/screen_win.h
+++ b/ui/display/win/screen_win.h
@@ -98,7 +98,7 @@
  protected:
   // display::Screen:
   gfx::Point GetCursorScreenPoint() override;
-  gfx::NativeWindow GetWindowUnderCursor() override;
+  bool IsWindowUnderCursor(gfx::NativeWindow window) override;
   gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override;
   int GetNumDisplays() const override;
   std::vector<display::Display> GetAllDisplays() const override;
diff --git a/ui/events/BUILD.gn b/ui/events/BUILD.gn
index 9b9fff6e..7b891e0 100644
--- a/ui/events/BUILD.gn
+++ b/ui/events/BUILD.gn
@@ -66,15 +66,12 @@
 
   deps = [
     "//base/third_party/dynamic_annotations",
-    "//skia",
-    "//ui/display",
   ]
 
   public_deps = [
     ":dom_keycode_converter",
     "//base",
     "//ui/events/platform",
-    "//ui/gfx",
     "//ui/gfx/geometry",
   ]
 
@@ -303,6 +300,7 @@
     "//base",
     "//skia",
     "//ui/events/platform",
+    "//ui/gfx",
     "//ui/gfx/geometry",
   ]
 
diff --git a/ui/events/PRESUBMIT.py b/ui/events/PRESUBMIT.py
deleted file mode 100644
index ad7df12..0000000
--- a/ui/events/PRESUBMIT.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2014 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.
-
-"""Chromium presubmit script for src/ui/events
-
-See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
-for more details on the presubmit API built into depot_tools.
-"""
-
-def GetPreferredTryMasters(project, change):
-  return {
-    'tryserver.chromium.linux': {
-      'linux_chromium_chromeos_rel_ng': set(['defaulttests']),
-      'linux_chromium_chromeos_asan_rel_ng': set(['defaulttests']),
-    },
-    'tryserver.chromium.win': {
-      'win_chromium_compile_dbg_ng': set(['defaulttests']),
-    }
-  }
diff --git a/ui/events/cocoa/events_mac.mm b/ui/events/cocoa/events_mac.mm
index 003b880..55edba3 100644
--- a/ui/events/cocoa/events_mac.mm
+++ b/ui/events/cocoa/events_mac.mm
@@ -20,10 +20,6 @@
 
 namespace ui {
 
-void UpdateDeviceList() {
-  NOTIMPLEMENTED();
-}
-
 EventType EventTypeFromNative(const base::NativeEvent& native_event) {
   NSEventType type = [native_event type];
   switch (type) {
diff --git a/ui/events/event_utils.h b/ui/events/event_utils.h
index e129c47..8bf7301 100644
--- a/ui/events/event_utils.h
+++ b/ui/events/event_utils.h
@@ -39,9 +39,6 @@
 class MouseEvent;
 enum class DomCode;
 
-// Updates the list of devices for cached properties.
-EVENTS_EXPORT void UpdateDeviceList();
-
 // Returns a ui::Event wrapping a native event. Ownership of the returned value
 // is transferred to the caller.
 EVENTS_EXPORT std::unique_ptr<Event> EventFromNative(
diff --git a/ui/events/events.gyp b/ui/events/events.gyp
index 3d46faac..d887823 100644
--- a/ui/events/events.gyp
+++ b/ui/events/events.gyp
@@ -31,8 +31,6 @@
       'dependencies': [
         '<(DEPTH)/base/base.gyp:base',
         '<(DEPTH)/base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
-        '<(DEPTH)/skia/skia.gyp:skia',
-        '../gfx/gfx.gyp:gfx',
         '../gfx/gfx.gyp:gfx_geometry',
         'dom_keycode_converter',
       ],
@@ -68,7 +66,7 @@
         'latency_info.h',
       ],
       'export_dependent_settings': [
-        '../../ui/gfx/gfx.gyp:gfx',
+        '../../ui/gfx/gfx.gyp:gfx_geometry',
       ],
       'conditions': [
         ['use_x11==1', {
@@ -316,6 +314,7 @@
       'dependencies': [
         '<(DEPTH)/base/base.gyp:base',
         '<(DEPTH)/skia/skia.gyp:skia',
+        '../gfx/gfx.gyp:gfx',
         '../gfx/gfx.gyp:gfx_geometry',
         'events',
         'events_base',
diff --git a/ui/events/events_default.cc b/ui/events/events_default.cc
index b6bf22e..29bb94f 100644
--- a/ui/events/events_default.cc
+++ b/ui/events/events_default.cc
@@ -8,8 +8,6 @@
 
 namespace ui {
 
-void UpdateDeviceList() { NOTIMPLEMENTED(); }
-
 base::TimeDelta EventTimeFromNative(const base::NativeEvent& native_event) {
   const ui::Event* event = static_cast<const ui::Event*>(native_event);
   return event->time_stamp();
diff --git a/ui/events/events_stub.cc b/ui/events/events_stub.cc
index a334311..d066872 100644
--- a/ui/events/events_stub.cc
+++ b/ui/events/events_stub.cc
@@ -17,10 +17,6 @@
 // Stub implementations of platform-specific methods in events_util.h, built
 // on platforms that currently do not have a complete implementation of events.
 
-void UpdateDeviceList() {
-  NOTIMPLEMENTED();
-}
-
 EventType EventTypeFromNative(const base::NativeEvent& native_event) {
   NOTIMPLEMENTED();
   return ET_UNKNOWN;
diff --git a/ui/events/ozone/BUILD.gn b/ui/events/ozone/BUILD.gn
index b1a73238..2a8611ae 100644
--- a/ui/events/ozone/BUILD.gn
+++ b/ui/events/ozone/BUILD.gn
@@ -40,6 +40,7 @@
       "//ui/display",
       "//ui/events",
       "//ui/events:events_base",
+      "//ui/gfx",
     ]
 
     defines = [ "EVENTS_OZONE_IMPLEMENTATION" ]
diff --git a/ui/events/ozone/events_ozone.gyp b/ui/events/ozone/events_ozone.gyp
index 5412454..8be272d9 100644
--- a/ui/events/ozone/events_ozone.gyp
+++ b/ui/events/ozone/events_ozone.gyp
@@ -12,6 +12,7 @@
     'dependencies': [
       '../../../base/base.gyp:base',
       '../../../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
+      '../../gfx/gfx.gyp:gfx',
     ],
     'defines': [
       'EVENTS_OZONE_IMPLEMENTATION',
diff --git a/ui/events/platform/x11/BUILD.gn b/ui/events/platform/x11/BUILD.gn
index d2e4b89..bd33990 100644
--- a/ui/events/platform/x11/BUILD.gn
+++ b/ui/events/platform/x11/BUILD.gn
@@ -28,6 +28,7 @@
     "//ui/events/devices/x11",
     "//ui/events/platform",
     "//ui/events/x",
+    "//ui/gfx",
     "//ui/gfx/x",
   ]
 
diff --git a/ui/events/platform/x11/x11_event_source.cc b/ui/events/platform/x11/x11_event_source.cc
index 0319da9..a50cf739 100644
--- a/ui/events/platform/x11/x11_event_source.cc
+++ b/ui/events/platform/x11/x11_event_source.cc
@@ -9,6 +9,7 @@
 
 #include "base/logging.h"
 #include "ui/events/devices/x11/device_data_manager_x11.h"
+#include "ui/events/devices/x11/touch_factory_x11.h"
 #include "ui/events/event_utils.h"
 #include "ui/events/platform/platform_event_dispatcher.h"
 #include "ui/events/platform/x11/x11_hotplug_event_handler.h"
@@ -70,6 +71,13 @@
   return CurrentTime;
 }
 
+void UpdateDeviceList() {
+  XDisplay* display = gfx::GetXDisplay();
+  DeviceListCacheX11::GetInstance()->UpdateDeviceList(display);
+  TouchFactory::GetInstance()->UpdateDeviceList(display);
+  DeviceDataManagerX11::GetInstance()->UpdateDeviceList(display);
+}
+
 }  // namespace
 
 X11EventSource* X11EventSource::instance_ = nullptr;
@@ -157,7 +165,7 @@
        (xevent->xgeneric.evtype == XI_DeviceChanged &&
         static_cast<XIDeviceChangedEvent*>(xevent->xcookie.data)->reason ==
             XIDeviceChange))) {
-    ui::UpdateDeviceList();
+    UpdateDeviceList();
     hotplug_event_handler_->OnHotplugEvent();
   }
 
diff --git a/ui/events/platform/x11/x11_events_platform.gyp b/ui/events/platform/x11/x11_events_platform.gyp
index a6b7d22..5679f6a 100644
--- a/ui/events/platform/x11/x11_events_platform.gyp
+++ b/ui/events/platform/x11/x11_events_platform.gyp
@@ -16,6 +16,7 @@
     'dependencies': [
       '../../../../base/base.gyp:base',
       '../../../../build/linux/system.gyp:x11',
+      '../../../gfx/gfx.gyp:gfx',
       '../../../gfx/x/gfx_x11.gyp:gfx_x11',
       '../../devices/events_devices.gyp:events_devices',
       '../../devices/x11/events_devices_x11.gyp:events_devices_x11',
diff --git a/ui/events/win/events_win.cc b/ui/events/win/events_win.cc
index 736dcbc..cd8dbc7 100644
--- a/ui/events/win/events_win.cc
+++ b/ui/events/win/events_win.cc
@@ -139,10 +139,6 @@
 
 }  // namespace
 
-void UpdateDeviceList() {
-  NOTIMPLEMENTED();
-}
-
 EventType EventTypeFromNative(const base::NativeEvent& native_event) {
   switch (native_event.message) {
     case WM_KEYDOWN:
diff --git a/ui/events/x/events_x.cc b/ui/events/x/events_x.cc
index dae18fb2..1091d19 100644
--- a/ui/events/x/events_x.cc
+++ b/ui/events/x/events_x.cc
@@ -76,13 +76,6 @@
 
 namespace ui {
 
-void UpdateDeviceList() {
-  XDisplay* display = gfx::GetXDisplay();
-  DeviceListCacheX11::GetInstance()->UpdateDeviceList(display);
-  TouchFactory::GetInstance()->UpdateDeviceList(display);
-  DeviceDataManagerX11::GetInstance()->UpdateDeviceList(display);
-}
-
 EventType EventTypeFromNative(const base::NativeEvent& native_event) {
   return EventTypeFromXEvent(*native_event);
 }
diff --git a/ui/gfx/ipc/gfx_param_traits_macros.h b/ui/gfx/ipc/gfx_param_traits_macros.h
index f717960e..8570e1c1 100644
--- a/ui/gfx/ipc/gfx_param_traits_macros.h
+++ b/ui/gfx/ipc/gfx_param_traits_macros.h
@@ -11,6 +11,7 @@
 #include "ui/gfx/buffer_types.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 #include "ui/gfx/ipc/gfx_ipc_export.h"
+#include "ui/gfx/swap_result.h"
 #include "ipc/ipc_message_macros.h"
 
 #if defined(USE_OZONE)
@@ -27,6 +28,8 @@
 IPC_ENUM_TRAITS_MAX_VALUE(gfx::GpuMemoryBufferType,
                           gfx::GPU_MEMORY_BUFFER_TYPE_LAST)
 
+IPC_ENUM_TRAITS_MAX_VALUE(gfx::SwapResult, gfx::SwapResult::SWAP_RESULT_LAST)
+
 IPC_STRUCT_TRAITS_BEGIN(gfx::GpuMemoryBufferHandle)
   IPC_STRUCT_TRAITS_MEMBER(id)
   IPC_STRUCT_TRAITS_MEMBER(type)
diff --git a/ui/gfx/screen.h b/ui/gfx/screen.h
index 9352e79..112d3d50 100644
--- a/ui/gfx/screen.h
+++ b/ui/gfx/screen.h
@@ -39,8 +39,8 @@
   // Returns the current absolute position of the mouse pointer.
   virtual gfx::Point GetCursorScreenPoint() = 0;
 
-  // Returns the window under the cursor.
-  virtual gfx::NativeWindow GetWindowUnderCursor() = 0;
+  // Returns true if the cursor is directly over |window|.
+  virtual bool IsWindowUnderCursor(gfx::NativeWindow window) = 0;
 
   // Returns the window at the given screen coordinate |point|.
   virtual gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) = 0;
diff --git a/ui/gfx/screen_android.cc b/ui/gfx/screen_android.cc
index 41099f1..eb36444f 100644
--- a/ui/gfx/screen_android.cc
+++ b/ui/gfx/screen_android.cc
@@ -18,9 +18,9 @@
 
   gfx::Point GetCursorScreenPoint() override { return gfx::Point(); }
 
-  gfx::NativeWindow GetWindowUnderCursor() override {
+  bool IsWindowUnderCursor(gfx::NativeWindow window) override {
     NOTIMPLEMENTED();
-    return NULL;
+    return false;
   }
 
   gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override {
diff --git a/ui/gfx/screen_ios.mm b/ui/gfx/screen_ios.mm
index 6ace9c8..ec00c1b6 100644
--- a/ui/gfx/screen_ios.mm
+++ b/ui/gfx/screen_ios.mm
@@ -17,9 +17,9 @@
     return gfx::Point(0, 0);
   }
 
-  gfx::NativeWindow GetWindowUnderCursor() override {
+  bool IsWindowUnderCursor(gfx::NativeWindow window) override {
     NOTIMPLEMENTED();
-    return gfx::NativeWindow();
+    return false;
   }
 
   gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override {
diff --git a/ui/gfx/screen_mac.mm b/ui/gfx/screen_mac.mm
index b33af2d..54e7aad 100644
--- a/ui/gfx/screen_mac.mm
+++ b/ui/gfx/screen_mac.mm
@@ -95,9 +95,9 @@
     return gfx::ScreenPointFromNSPoint([NSEvent mouseLocation]);
   }
 
-  gfx::NativeWindow GetWindowUnderCursor() override {
+  bool IsWindowUnderCursor(gfx::NativeWindow window) override {
     NOTIMPLEMENTED();
-    return gfx::NativeWindow();
+    return false;
   }
 
   gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override {
diff --git a/ui/gfx/test/test_screen.cc b/ui/gfx/test/test_screen.cc
index 31361dd..d0729c1 100644
--- a/ui/gfx/test/test_screen.cc
+++ b/ui/gfx/test/test_screen.cc
@@ -19,8 +19,8 @@
   return gfx::Point();
 }
 
-gfx::NativeWindow TestScreen::GetWindowUnderCursor() {
-  return nullptr;
+bool TestScreen::IsWindowUnderCursor(gfx::NativeWindow window) {
+  return false;
 }
 
 gfx::NativeWindow TestScreen::GetWindowAtScreenPoint(const gfx::Point& point) {
diff --git a/ui/gfx/test/test_screen.h b/ui/gfx/test/test_screen.h
index 0d2b0ba9f..5c8bbb8d 100644
--- a/ui/gfx/test/test_screen.h
+++ b/ui/gfx/test/test_screen.h
@@ -26,7 +26,7 @@
 
   // gfx::Screen:
   gfx::Point GetCursorScreenPoint() override;
-  gfx::NativeWindow GetWindowUnderCursor() override;
+  bool IsWindowUnderCursor(gfx::NativeWindow window) override;
   gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override;
   int GetNumDisplays() const override;
   std::vector<gfx::Display> GetAllDisplays() const override;
diff --git a/ui/message_center/message_center_style.h b/ui/message_center/message_center_style.h
index d818726..6a04938c 100644
--- a/ui/message_center/message_center_style.h
+++ b/ui/message_center/message_center_style.h
@@ -78,7 +78,8 @@
 
 // Colors.
 extern const SkColor kNotificationBackgroundColor; // Background of the card.
-extern const SkColor kImageBackgroundColor;        // Background of the image.
+// Background of the image.
+MESSAGE_CENTER_EXPORT extern const SkColor kImageBackgroundColor;
 extern const SkColor kIconBackgroundColor;         // Used behind icons smaller
                                                    // than the icon view.
 extern const SkColor kRegularTextColor;            // Title, message, ...
@@ -98,7 +99,8 @@
     const gfx::Size& image_size);
 
 extern const int kNotificationMaximumImageHeight;  // For image notifications.
-extern const size_t kNotificationMaximumItems;     // For list notifications.
+MESSAGE_CENTER_EXPORT extern const size_t
+    kNotificationMaximumItems;     // For list notifications.
 
 // Timing.
 extern const int kAutocloseDefaultDelaySeconds;
diff --git a/ui/ozone/platform/caca/caca_window_manager.cc b/ui/ozone/platform/caca/caca_window_manager.cc
index 7e1686f90..da4466e 100644
--- a/ui/ozone/platform/caca/caca_window_manager.cc
+++ b/ui/ozone/platform/caca/caca_window_manager.cc
@@ -9,6 +9,7 @@
 #include "base/macros.h"
 #include "base/trace_event/trace_event.h"
 #include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
 #include "third_party/skia/include/core/SkSurface.h"
 #include "ui/gfx/skia_util.h"
 #include "ui/gfx/vsync_provider.h"
@@ -28,7 +29,7 @@
   bool Initialize();
 
   // ui::SurfaceOzoneCanvas overrides:
-  skia::RefPtr<SkSurface> GetSurface() override;
+  sk_sp<SkSurface> GetSurface() override;
   void ResizeCanvas(const gfx::Size& viewport_size) override;
   void PresentCanvas(const gfx::Rect& damage) override;
   std::unique_ptr<gfx::VSyncProvider> CreateVSyncProvider() override;
@@ -38,7 +39,7 @@
 
   ScopedCacaDither dither_;
 
-  skia::RefPtr<SkSurface> surface_;
+  sk_sp<SkSurface> surface_;
 
   DISALLOW_COPY_AND_ASSIGN(CacaSurface);
 };
@@ -54,7 +55,7 @@
   return true;
 }
 
-skia::RefPtr<SkSurface> CacaSurface::GetSurface() {
+sk_sp<SkSurface> CacaSurface::GetSurface() {
   return surface_;
 }
 
@@ -68,7 +69,7 @@
                                        kN32_SkColorType,
                                        kPremul_SkAlphaType);
 
-  surface_ = skia::AdoptRef(SkSurface::NewRaster(info));
+  surface_ = SkSurface::MakeRaster(info);
   if (!surface_)
     LOG(ERROR) << "Failed to create SkSurface";
 
diff --git a/ui/ozone/platform/caca/scoped_caca_types.h b/ui/ozone/platform/caca/scoped_caca_types.h
index 4b00c55..0db7b15 100644
--- a/ui/ozone/platform/caca/scoped_caca_types.h
+++ b/ui/ozone/platform/caca/scoped_caca_types.h
@@ -5,6 +5,7 @@
 #ifndef UI_OZONE_PLATFORM_CACA_SCOPED_CACA_TYPES_H_
 #define UI_OZONE_PLATFORM_CACA_SCOPED_CACA_TYPES_H_
 
+#include <memory>
 
 typedef struct caca_canvas caca_canvas_t;
 typedef struct caca_dither caca_dither_t;
diff --git a/ui/ozone/platform/drm/gpu/drm_buffer.cc b/ui/ozone/platform/drm/gpu/drm_buffer.cc
index 1c50f1c4..24981a5 100644
--- a/ui/ozone/platform/drm/gpu/drm_buffer.cc
+++ b/ui/ozone/platform/drm/gpu/drm_buffer.cc
@@ -7,6 +7,7 @@
 #include <drm_fourcc.h>
 
 #include "base/logging.h"
+#include "third_party/skia/include/core/SkSurface.h"
 #include "ui/ozone/platform/drm/gpu/drm_device.h"
 
 namespace ui {
diff --git a/ui/ozone/platform/drm/gpu/drm_buffer.h b/ui/ozone/platform/drm/gpu/drm_buffer.h
index 726cf119..a7cc4e9 100644
--- a/ui/ozone/platform/drm/gpu/drm_buffer.h
+++ b/ui/ozone/platform/drm/gpu/drm_buffer.h
@@ -9,10 +9,13 @@
 #include <stdint.h>
 
 #include "base/macros.h"
-#include "skia/ext/refptr.h"
-#include "third_party/skia/include/core/SkSurface.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
 #include "ui/ozone/platform/drm/gpu/scanout_buffer.h"
 
+class SkCanvas;
+struct SkImageInfo;
+class SkSurface;
+
 namespace ui {
 
 class DrmDevice;
diff --git a/ui/ozone/platform/drm/gpu/drm_console_buffer.cc b/ui/ozone/platform/drm/gpu/drm_console_buffer.cc
index 0fe4399d..dabc81e8 100644
--- a/ui/ozone/platform/drm/gpu/drm_console_buffer.cc
+++ b/ui/ozone/platform/drm/gpu/drm_console_buffer.cc
@@ -7,7 +7,6 @@
 #include <sys/mman.h>
 #include <xf86drmMode.h>
 
-#include "third_party/skia/include/core/SkCanvas.h"
 #include "ui/ozone/platform/drm/common/scoped_drm_types.h"
 #include "ui/ozone/platform/drm/gpu/drm_device.h"
 
diff --git a/ui/ozone/platform/drm/gpu/drm_console_buffer.h b/ui/ozone/platform/drm/gpu/drm_console_buffer.h
index 250ca3b..2c43293 100644
--- a/ui/ozone/platform/drm/gpu/drm_console_buffer.h
+++ b/ui/ozone/platform/drm/gpu/drm_console_buffer.h
@@ -10,7 +10,7 @@
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "skia/ext/refptr.h"
+#include "third_party/skia/include/core/SkImage.h"
 #include "third_party/skia/include/core/SkSurface.h"
 
 class SkCanvas;
@@ -29,9 +29,7 @@
   ~DrmConsoleBuffer();
 
   SkCanvas* canvas() { return surface_->getCanvas(); }
-  skia::RefPtr<SkImage> image() {
-    return skia::AdoptRef(surface_->newImageSnapshot());
-  }
+  sk_sp<SkImage> image() { return surface_->makeImageSnapshot(); }
 
   // Memory map the backing pixels and wrap them in |surface_|.
   bool Initialize();
diff --git a/ui/ozone/platform/drm/gpu/drm_window_unittest.cc b/ui/ozone/platform/drm/gpu/drm_window_unittest.cc
index 194dc4cd..e4a5113 100644
--- a/ui/ozone/platform/drm/gpu/drm_window_unittest.cc
+++ b/ui/ozone/platform/drm/gpu/drm_window_unittest.cc
@@ -16,6 +16,7 @@
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "third_party/skia/include/core/SkImageInfo.h"
+#include "third_party/skia/include/core/SkSurface.h"
 #include "ui/ozone/platform/drm/gpu/drm_device_generator.h"
 #include "ui/ozone/platform/drm/gpu/drm_device_manager.h"
 #include "ui/ozone/platform/drm/gpu/hardware_display_controller.h"
diff --git a/ui/ozone/platform/drm/gpu/mock_drm_device.h b/ui/ozone/platform/drm/gpu/mock_drm_device.h
index 13506eee..d7c3f3c 100644
--- a/ui/ozone/platform/drm/gpu/mock_drm_device.h
+++ b/ui/ozone/platform/drm/gpu/mock_drm_device.h
@@ -13,7 +13,7 @@
 #include <vector>
 
 #include "base/macros.h"
-#include "skia/ext/refptr.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
 #include "third_party/skia/include/core/SkSurface.h"
 #include "ui/ozone/platform/drm/gpu/drm_device.h"
 
diff --git a/ui/ozone/platform/drm/gpu/mock_dumb_buffer_generator.cc b/ui/ozone/platform/drm/gpu/mock_dumb_buffer_generator.cc
index da7bdb29..c0c62f0 100644
--- a/ui/ozone/platform/drm/gpu/mock_dumb_buffer_generator.cc
+++ b/ui/ozone/platform/drm/gpu/mock_dumb_buffer_generator.cc
@@ -4,6 +4,7 @@
 
 #include "ui/ozone/platform/drm/gpu/mock_dumb_buffer_generator.h"
 
+#include "third_party/skia/include/core/SkImageInfo.h"
 #include "ui/ozone/platform/drm/gpu/drm_buffer.h"
 
 namespace ui {
diff --git a/ui/ozone/platform/drm/gpu/screen_manager.cc b/ui/ozone/platform/drm/gpu/screen_manager.cc
index 6693d729..f29fcde 100644
--- a/ui/ozone/platform/drm/gpu/screen_manager.cc
+++ b/ui/ozone/platform/drm/gpu/screen_manager.cc
@@ -60,11 +60,10 @@
     return;
   }
 
-  skia::RefPtr<SkImage> image = saved_buffer.image();
   SkPaint paint;
   // Copy the source buffer. Do not perform any blending.
   paint.setXfermodeMode(SkXfermode::kSrc_Mode);
-  modeset_buffer.canvas()->drawImage(image.get(), 0, 0, &paint);
+  modeset_buffer.canvas()->drawImage(saved_buffer.image(), 0, 0, &paint);
 }
 
 CrtcController* GetCrtcController(HardwareDisplayController* controller,
diff --git a/ui/ozone/public/surface_ozone_canvas.h b/ui/ozone/public/surface_ozone_canvas.h
index 155a810..034d92fc 100644
--- a/ui/ozone/public/surface_ozone_canvas.h
+++ b/ui/ozone/public/surface_ozone_canvas.h
@@ -7,7 +7,7 @@
 
 #include <memory>
 
-#include "skia/ext/refptr.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
 #include "ui/ozone/ozone_base_export.h"
 
 class SkSurface;
diff --git a/ui/platform_window/x11/x11_window_base.cc b/ui/platform_window/x11/x11_window_base.cc
index 51b19ac..4544aea 100644
--- a/ui/platform_window/x11/x11_window_base.cc
+++ b/ui/platform_window/x11/x11_window_base.cc
@@ -85,6 +85,7 @@
       CopyFromParent,  // visual
       CWBackPixmap | CWBitGravity | CWOverrideRedirect, &swa);
 
+  // Setup XInput event mask.
   long event_mask = ButtonPressMask | ButtonReleaseMask | FocusChangeMask |
                     KeyPressMask | KeyReleaseMask | EnterWindowMask |
                     LeaveWindowMask | ExposureMask | VisibilityChangeMask |
@@ -92,6 +93,7 @@
                     PointerMotionMask;
   XSelectInput(xdisplay_, xwindow_, event_mask);
 
+  // Setup XInput2 event mask.
   unsigned char mask[XIMaskLen(XI_LASTEVENT)];
   memset(mask, 0, sizeof(mask));
 
@@ -103,6 +105,7 @@
   XISetMask(mask, XI_Motion);
   XISetMask(mask, XI_KeyPress);
   XISetMask(mask, XI_KeyRelease);
+  XISetMask(mask, XI_HierarchyChanged);
 
   XIEventMask evmask;
   evmask.deviceid = XIAllDevices;
diff --git a/ui/resources/default_100_percent/common/menu_overflow_down.png b/ui/resources/default_100_percent/common/menu_overflow_down.png
new file mode 100644
index 0000000..0657fe938
--- /dev/null
+++ b/ui/resources/default_100_percent/common/menu_overflow_down.png
Binary files differ
diff --git a/ui/resources/default_100_percent/common/menu_overflow_up.png b/ui/resources/default_100_percent/common/menu_overflow_up.png
new file mode 100644
index 0000000..85ef5b2
--- /dev/null
+++ b/ui/resources/default_100_percent/common/menu_overflow_up.png
Binary files differ
diff --git a/ui/resources/default_200_percent/common/menu_overflow_down.png b/ui/resources/default_200_percent/common/menu_overflow_down.png
new file mode 100644
index 0000000..ba7b149c7
--- /dev/null
+++ b/ui/resources/default_200_percent/common/menu_overflow_down.png
Binary files differ
diff --git a/ui/resources/default_200_percent/common/menu_overflow_up.png b/ui/resources/default_200_percent/common/menu_overflow_up.png
new file mode 100644
index 0000000..6202dbf
--- /dev/null
+++ b/ui/resources/default_200_percent/common/menu_overflow_up.png
Binary files differ
diff --git a/ui/resources/ui_resources.grd b/ui/resources/ui_resources.grd
index 0a53038..4ecef29 100644
--- a/ui/resources/ui_resources.grd
+++ b/ui/resources/ui_resources.grd
@@ -123,6 +123,8 @@
       <structure type="chrome_scaled_image" name="IDR_FOLDER_CLOSED_RTL" file="common/folder_closed_rtl.png" />
       <if expr="is_macosx">
         <structure type="chrome_scaled_image" name="IDR_MENU_CHECK_CHECKED" file="legacy/menu_check.png" />
+        <structure type="chrome_scaled_image" name="IDR_MENU_OVERFLOW_UP" file="common/menu_overflow_up.png" />
+        <structure type="chrome_scaled_image" name="IDR_MENU_OVERFLOW_DOWN" file="common/menu_overflow_down.png" />
       </if>
       <if expr="is_macosx or is_ios">
         <structure type="chrome_scaled_image" name="IDR_MENU_HIERARCHY_ARROW" file="mac/menu_hierarchy_arrow.png" />
diff --git a/ui/views/animation/flood_fill_ink_drop_animation.cc b/ui/views/animation/flood_fill_ink_drop_ripple.cc
similarity index 89%
rename from ui/views/animation/flood_fill_ink_drop_animation.cc
rename to ui/views/animation/flood_fill_ink_drop_ripple.cc
index 6e177aaf..f779066b 100644
--- a/ui/views/animation/flood_fill_ink_drop_animation.cc
+++ b/ui/views/animation/flood_fill_ink_drop_ripple.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 "ui/views/animation/flood_fill_ink_drop_animation.h"
+#include "ui/views/animation/flood_fill_ink_drop_ripple.h"
 
 #include <algorithm>
 
@@ -96,9 +96,9 @@
 // Returns the InkDropState sub animation duration for the given |state|.
 base::TimeDelta GetAnimationDuration(InkDropSubAnimations state) {
   return base::TimeDelta::FromMilliseconds(
-      (views::InkDropAnimation::UseFastAnimations()
+      (views::InkDropRipple::UseFastAnimations()
            ? 1
-           : views::InkDropAnimation::kSlowAnimationDurationFactor) *
+           : views::InkDropRipple::kSlowAnimationDurationFactor) *
       kAnimationDurationInMs[state]);
 }
 
@@ -106,10 +106,9 @@
 
 namespace views {
 
-FloodFillInkDropAnimation::FloodFillInkDropAnimation(
-    const gfx::Rect& clip_bounds,
-    const gfx::Point& center_point,
-    SkColor color)
+FloodFillInkDropRipple::FloodFillInkDropRipple(const gfx::Rect& clip_bounds,
+                                               const gfx::Point& center_point,
+                                               SkColor color)
     : clip_bounds_(clip_bounds),
       center_point_(center_point),
       root_layer_(ui::LAYER_NOT_DRAWN),
@@ -117,7 +116,7 @@
           color,
           std::max(clip_bounds_.width(), clip_bounds_.height()) / 2.f),
       ink_drop_state_(InkDropState::HIDDEN) {
-  root_layer_.set_name("FloodFillInkDropAnimation:ROOT_LAYER");
+  root_layer_.set_name("FloodFillInkDropRipple:ROOT_LAYER");
   root_layer_.SetMasksToBounds(true);
   root_layer_.SetBounds(clip_bounds);
 
@@ -130,34 +129,34 @@
   painted_layer_.SetVisible(true);
   painted_layer_.SetOpacity(1.0);
   painted_layer_.SetMasksToBounds(false);
-  painted_layer_.set_name("FloodFillInkDropAnimation:PAINTED_LAYER");
+  painted_layer_.set_name("FloodFillInkDropRipple:PAINTED_LAYER");
 
   root_layer_.Add(&painted_layer_);
 
   SetStateToHidden();
 }
 
-FloodFillInkDropAnimation::~FloodFillInkDropAnimation() {
+FloodFillInkDropRipple::~FloodFillInkDropRipple() {
   // Explicitly aborting all the animations ensures all callbacks are invoked
   // while this instance still exists.
   AbortAllAnimations();
 }
 
-void FloodFillInkDropAnimation::SnapToActivated() {
-  InkDropAnimation::SnapToActivated();
+void FloodFillInkDropRipple::SnapToActivated() {
+  InkDropRipple::SnapToActivated();
   SetOpacity(kVisibleOpacity);
   painted_layer_.SetTransform(GetMaxSizeTargetTransform());
 }
 
-ui::Layer* FloodFillInkDropAnimation::GetRootLayer() {
+ui::Layer* FloodFillInkDropRipple::GetRootLayer() {
   return &root_layer_;
 }
 
-bool FloodFillInkDropAnimation::IsVisible() const {
+bool FloodFillInkDropRipple::IsVisible() const {
   return root_layer_.visible();
 }
 
-void FloodFillInkDropAnimation::AnimateStateChange(
+void FloodFillInkDropRipple::AnimateStateChange(
     InkDropState old_ink_drop_state,
     InkDropState new_ink_drop_state,
     ui::LayerAnimationObserver* animation_observer) {
@@ -245,18 +244,18 @@
   }
 }
 
-void FloodFillInkDropAnimation::SetStateToHidden() {
+void FloodFillInkDropRipple::SetStateToHidden() {
   painted_layer_.SetTransform(CalculateTransform(kMinRadius));
-  root_layer_.SetOpacity(InkDropAnimation::kHiddenOpacity);
+  root_layer_.SetOpacity(InkDropRipple::kHiddenOpacity);
   root_layer_.SetVisible(false);
 }
 
-void FloodFillInkDropAnimation::AbortAllAnimations() {
+void FloodFillInkDropRipple::AbortAllAnimations() {
   root_layer_.GetAnimator()->AbortAllAnimations();
   painted_layer_.GetAnimator()->AbortAllAnimations();
 }
 
-void FloodFillInkDropAnimation::AnimateToTransform(
+void FloodFillInkDropRipple::AnimateToTransform(
     const gfx::Transform& transform,
     base::TimeDelta duration,
     ui::LayerAnimator::PreemptionStrategy preemption_strategy,
@@ -277,11 +276,11 @@
   animator->StartAnimation(sequence);
 }
 
-void FloodFillInkDropAnimation::SetOpacity(float opacity) {
+void FloodFillInkDropRipple::SetOpacity(float opacity) {
   root_layer_.SetOpacity(opacity);
 }
 
-void FloodFillInkDropAnimation::AnimateToOpacity(
+void FloodFillInkDropRipple::AnimateToOpacity(
     float opacity,
     base::TimeDelta duration,
     ui::LayerAnimator::PreemptionStrategy preemption_strategy,
@@ -302,7 +301,7 @@
   animator->StartAnimation(animation_sequence);
 }
 
-gfx::Transform FloodFillInkDropAnimation::CalculateTransform(
+gfx::Transform FloodFillInkDropRipple::CalculateTransform(
     float target_radius) const {
   const float target_scale = target_radius / circle_layer_delegate_.radius();
   const gfx::Point drawn_center_point =
@@ -317,7 +316,7 @@
   return transform;
 }
 
-gfx::Transform FloodFillInkDropAnimation::GetMaxSizeTargetTransform() const {
+gfx::Transform FloodFillInkDropRipple::GetMaxSizeTargetTransform() const {
   // TODO(estade): get rid of this 2, but make the fade out start before the
   // active/action transform is done.
   return CalculateTransform(
diff --git a/ui/views/animation/flood_fill_ink_drop_animation.h b/ui/views/animation/flood_fill_ink_drop_ripple.h
similarity index 82%
rename from ui/views/animation/flood_fill_ink_drop_animation.h
rename to ui/views/animation/flood_fill_ink_drop_ripple.h
index 303f295..795ffeb 100644
--- a/ui/views/animation/flood_fill_ink_drop_animation.h
+++ b/ui/views/animation/flood_fill_ink_drop_ripple.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 UI_VIEWS_ANIMATION_FLOOD_FILL_INK_DROP_ANIMATION_H_
-#define UI_VIEWS_ANIMATION_FLOOD_FILL_INK_DROP_ANIMATION_H_
+#ifndef UI_VIEWS_ANIMATION_FLOOD_FILL_INK_DROP_RIPPLE_H_
+#define UI_VIEWS_ANIMATION_FLOOD_FILL_INK_DROP_RIPPLE_H_
 
 #include <memory>
 #include <string>
@@ -17,8 +17,8 @@
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/transform.h"
-#include "ui/views/animation/ink_drop_animation.h"
 #include "ui/views/animation/ink_drop_painted_layer_delegates.h"
+#include "ui/views/animation/ink_drop_ripple.h"
 #include "ui/views/animation/ink_drop_state.h"
 #include "ui/views/views_export.h"
 
@@ -30,10 +30,10 @@
 class CircleLayerDelegate;
 
 namespace test {
-class FloodFillInkDropAnimationTestApi;
+class FloodFillInkDropRippleTestApi;
 }  // namespace test
 
-// An ink drop animation that starts as a small circle and flood fills a
+// An ink drop ripple that starts as a small circle and flood fills a
 // rectangle of the given size. The circle is clipped to the rectangles bounds.
 //
 // The valid InkDropState transitions are defined below:
@@ -46,22 +46,22 @@
 //   {All InkDropStates}      => ACTIVATED
 //   {All InkDropStates}      => DEACTIVATED
 //
-class VIEWS_EXPORT FloodFillInkDropAnimation : public InkDropAnimation {
+class VIEWS_EXPORT FloodFillInkDropRipple : public InkDropRipple {
  public:
-  FloodFillInkDropAnimation(const gfx::Rect& clip_bounds,
-                            const gfx::Point& center_point,
-                            SkColor color);
-  ~FloodFillInkDropAnimation() override;
+  FloodFillInkDropRipple(const gfx::Rect& clip_bounds,
+                         const gfx::Point& center_point,
+                         SkColor color);
+  ~FloodFillInkDropRipple() override;
 
-  // InkDropAnimation:
+  // InkDropRipple:
   void SnapToActivated() override;
   ui::Layer* GetRootLayer() override;
   bool IsVisible() const override;
 
  private:
-  friend class test::FloodFillInkDropAnimationTestApi;
+  friend class test::FloodFillInkDropRippleTestApi;
 
-  // InkDropAnimation:
+  // InkDropRipple:
   void AnimateStateChange(InkDropState old_ink_drop_state,
                           InkDropState new_ink_drop_state,
                           ui::LayerAnimationObserver* observer) override;
@@ -122,9 +122,9 @@
   // The current ink drop state.
   InkDropState ink_drop_state_;
 
-  DISALLOW_COPY_AND_ASSIGN(FloodFillInkDropAnimation);
+  DISALLOW_COPY_AND_ASSIGN(FloodFillInkDropRipple);
 };
 
 }  // namespace views
 
-#endif  // UI_VIEWS_ANIMATION_FLOOD_FILL_INK_DROP_ANIMATION_H_
+#endif  // UI_VIEWS_ANIMATION_FLOOD_FILL_INK_DROP_RIPPLE_H_
diff --git a/ui/views/animation/ink_drop_animation_controller.h b/ui/views/animation/ink_drop_animation_controller.h
index 7de9cc5..19cd8f9 100644
--- a/ui/views/animation/ink_drop_animation_controller.h
+++ b/ui/views/animation/ink_drop_animation_controller.h
@@ -23,7 +23,7 @@
 namespace views {
 
 // Pure virtual base class that manages the lifetime and state of an ink drop
-// animation as well as visual hover state feedback.
+// ripple as well as visual hover state feedback.
 class VIEWS_EXPORT InkDropAnimationController {
  public:
   virtual ~InkDropAnimationController() {}
diff --git a/ui/views/animation/ink_drop_animation_controller_impl.cc b/ui/views/animation/ink_drop_animation_controller_impl.cc
index 62e953b..86503f55 100644
--- a/ui/views/animation/ink_drop_animation_controller_impl.cc
+++ b/ui/views/animation/ink_drop_animation_controller_impl.cc
@@ -9,7 +9,7 @@
 #include "ui/compositor/layer.h"
 #include "ui/views/animation/ink_drop_host.h"
 #include "ui/views/animation/ink_drop_hover.h"
-#include "ui/views/animation/square_ink_drop_animation.h"
+#include "ui/views/animation/square_ink_drop_ripple.h"
 
 namespace views {
 
@@ -25,15 +25,15 @@
 
 // The duration, in milliseconds, of the hover state fade in animation when it
 // is triggered by an ink drop ripple animation ending.
-const int kHoverFadeInAfterAnimationDurationInMs = 250;
+const int kHoverFadeInAfterRippleDurationInMs = 250;
 
 // The duration, in milliseconds, of the hover state fade out animation when it
 // is triggered by an ink drop ripple animation starting.
-const int kHoverFadeOutBeforeAnimationDurationInMs = 120;
+const int kHoverFadeOutBeforeRippleDurationInMs = 120;
 
 // The amount of time in milliseconds that |hover_| should delay after a ripple
 // animation before fading in.
-const int kHoverFadeInAfterAnimationDelayInMs = 1000;
+const int kHoverFadeInAfterRippleDelayInMs = 1000;
 
 // Returns true if an ink drop with the given |ink_drop_state| should
 // automatically transition to the InkDropState::HIDDEN state.
@@ -56,50 +56,50 @@
       root_layer_(new ui::Layer(ui::LAYER_NOT_DRAWN)),
       root_layer_added_to_host_(false),
       is_hovered_(false),
-      hover_after_animation_timer_(nullptr) {
+      hover_after_ripple_timer_(nullptr) {
   root_layer_->set_name("InkDropAnimationControllerImpl:RootLayer");
 }
 
 InkDropAnimationControllerImpl::~InkDropAnimationControllerImpl() {
-  // Explicitly destroy the InkDropAnimation so that this still exists if
-  // views::InkDropAnimationObserver methods are called on this.
-  DestroyInkDropAnimation();
+  // Explicitly destroy the InkDropRipple so that this still exists if
+  // views::InkDropRippleObserver methods are called on this.
+  DestroyInkDropRipple();
   DestroyInkDropHover();
 }
 
 InkDropState InkDropAnimationControllerImpl::GetTargetInkDropState() const {
-  if (!ink_drop_animation_)
+  if (!ink_drop_ripple_)
     return InkDropState::HIDDEN;
-  return ink_drop_animation_->target_ink_drop_state();
+  return ink_drop_ripple_->target_ink_drop_state();
 }
 
 bool InkDropAnimationControllerImpl::IsVisible() const {
-  return ink_drop_animation_ && ink_drop_animation_->IsVisible();
+  return ink_drop_ripple_ && ink_drop_ripple_->IsVisible();
 }
 
 void InkDropAnimationControllerImpl::AnimateToState(
     InkDropState ink_drop_state) {
   DestroyHiddenTargetedAnimations();
-  if (!ink_drop_animation_)
-    CreateInkDropAnimation();
+  if (!ink_drop_ripple_)
+    CreateInkDropRipple();
 
   if (ink_drop_state != views::InkDropState::HIDDEN) {
     SetHoveredInternal(false, base::TimeDelta::FromMilliseconds(
-                                  kHoverFadeOutBeforeAnimationDurationInMs),
+                                  kHoverFadeOutBeforeRippleDurationInMs),
                        true);
   }
 
-  ink_drop_animation_->AnimateToState(ink_drop_state);
+  ink_drop_ripple_->AnimateToState(ink_drop_state);
 }
 
 void InkDropAnimationControllerImpl::SnapToActivated() {
   DestroyHiddenTargetedAnimations();
-  if (!ink_drop_animation_)
-    CreateInkDropAnimation();
+  if (!ink_drop_ripple_)
+    CreateInkDropRipple();
 
   SetHoveredInternal(false, base::TimeDelta(), false);
 
-  ink_drop_animation_->SnapToActivated();
+  ink_drop_ripple_->SnapToActivated();
 }
 
 void InkDropAnimationControllerImpl::SetHovered(bool is_hovered) {
@@ -113,26 +113,26 @@
 }
 
 void InkDropAnimationControllerImpl::DestroyHiddenTargetedAnimations() {
-  if (ink_drop_animation_ &&
-      (ink_drop_animation_->target_ink_drop_state() == InkDropState::HIDDEN ||
-       ShouldAnimateToHidden(ink_drop_animation_->target_ink_drop_state()))) {
-    DestroyInkDropAnimation();
+  if (ink_drop_ripple_ &&
+      (ink_drop_ripple_->target_ink_drop_state() == InkDropState::HIDDEN ||
+       ShouldAnimateToHidden(ink_drop_ripple_->target_ink_drop_state()))) {
+    DestroyInkDropRipple();
   }
 }
 
-void InkDropAnimationControllerImpl::CreateInkDropAnimation() {
-  DestroyInkDropAnimation();
-  ink_drop_animation_ = ink_drop_host_->CreateInkDropAnimation();
-  ink_drop_animation_->set_observer(this);
-  root_layer_->Add(ink_drop_animation_->GetRootLayer());
+void InkDropAnimationControllerImpl::CreateInkDropRipple() {
+  DestroyInkDropRipple();
+  ink_drop_ripple_ = ink_drop_host_->CreateInkDropRipple();
+  ink_drop_ripple_->set_observer(this);
+  root_layer_->Add(ink_drop_ripple_->GetRootLayer());
   AddRootLayerToHostIfNeeded();
 }
 
-void InkDropAnimationControllerImpl::DestroyInkDropAnimation() {
-  if (!ink_drop_animation_)
+void InkDropAnimationControllerImpl::DestroyInkDropRipple() {
+  if (!ink_drop_ripple_)
     return;
-  root_layer_->Remove(ink_drop_animation_->GetRootLayer());
-  ink_drop_animation_.reset();
+  root_layer_->Remove(ink_drop_ripple_->GetRootLayer());
+  ink_drop_ripple_.reset();
   RemoveRootLayerFromHostIfNeeded();
 }
 
@@ -157,7 +157,7 @@
 }
 
 void InkDropAnimationControllerImpl::AddRootLayerToHostIfNeeded() {
-  DCHECK(hover_ || ink_drop_animation_);
+  DCHECK(hover_ || ink_drop_ripple_);
   if (!root_layer_added_to_host_) {
     root_layer_added_to_host_ = true;
     ink_drop_host_->AddInkDropLayer(root_layer_.get());
@@ -165,7 +165,7 @@
 }
 
 void InkDropAnimationControllerImpl::RemoveRootLayerFromHostIfNeeded() {
-  if (root_layer_added_to_host_ && !hover_ && !ink_drop_animation_) {
+  if (root_layer_added_to_host_ && !hover_ && !ink_drop_ripple_) {
     root_layer_added_to_host_ = false;
     ink_drop_host_->RemoveInkDropLayer(root_layer_.get());
   }
@@ -176,7 +176,7 @@
 }
 
 // -----------------------------------------------------------------------------
-// views::InkDropAnimationObserver:
+// views::InkDropRippleObserver:
 
 void InkDropAnimationControllerImpl::AnimationStarted(
     InkDropState ink_drop_state) {}
@@ -187,14 +187,14 @@
   if (reason != InkDropAnimationEndedReason::SUCCESS)
     return;
   if (ShouldAnimateToHidden(ink_drop_state)) {
-    ink_drop_animation_->AnimateToState(views::InkDropState::HIDDEN);
+    ink_drop_ripple_->AnimateToState(views::InkDropState::HIDDEN);
   } else if (ink_drop_state == views::InkDropState::HIDDEN) {
     if (is_hovered_)
-      StartHoverAfterAnimationTimer();
+      StartHoverAfterRippleTimer();
     // TODO(bruthig): Investigate whether creating and destroying
-    // InkDropAnimations is expensive and consider creating an
-    // InkDropAnimationPool. See www.crbug.com/522175.
-    DestroyInkDropAnimation();
+    // InkDropRipples is expensive and consider creating an
+    // InkDropRipplePool. See www.crbug.com/522175.
+    DestroyInkDropRipple();
   }
 }
 
@@ -217,7 +217,7 @@
     bool is_hovered,
     base::TimeDelta animation_duration,
     bool explode) {
-  StopHoverAfterAnimationTimer();
+  StopHoverAfterRippleTimer();
 
   if (IsHoverFadingInOrVisible() == is_hovered)
     return;
@@ -231,29 +231,29 @@
   }
 }
 
-void InkDropAnimationControllerImpl::StartHoverAfterAnimationTimer() {
-  StopHoverAfterAnimationTimer();
+void InkDropAnimationControllerImpl::StartHoverAfterRippleTimer() {
+  StopHoverAfterRippleTimer();
 
-  if (!hover_after_animation_timer_)
-    hover_after_animation_timer_.reset(new base::OneShotTimer);
+  if (!hover_after_ripple_timer_)
+    hover_after_ripple_timer_.reset(new base::OneShotTimer);
 
-  hover_after_animation_timer_->Start(
+  hover_after_ripple_timer_->Start(
       FROM_HERE,
-      base::TimeDelta::FromMilliseconds(kHoverFadeInAfterAnimationDelayInMs),
-      base::Bind(&InkDropAnimationControllerImpl::HoverAfterAnimationTimerFired,
+      base::TimeDelta::FromMilliseconds(kHoverFadeInAfterRippleDelayInMs),
+      base::Bind(&InkDropAnimationControllerImpl::HoverAfterRippleTimerFired,
                  base::Unretained(this)));
 }
 
-void InkDropAnimationControllerImpl::StopHoverAfterAnimationTimer() {
-  if (hover_after_animation_timer_)
-    hover_after_animation_timer_.reset();
+void InkDropAnimationControllerImpl::StopHoverAfterRippleTimer() {
+  if (hover_after_ripple_timer_)
+    hover_after_ripple_timer_.reset();
 }
 
-void InkDropAnimationControllerImpl::HoverAfterAnimationTimerFired() {
+void InkDropAnimationControllerImpl::HoverAfterRippleTimerFired() {
   SetHoveredInternal(true, base::TimeDelta::FromMilliseconds(
-                               kHoverFadeInAfterAnimationDurationInMs),
+                               kHoverFadeInAfterRippleDurationInMs),
                      true);
-  hover_after_animation_timer_.reset();
+  hover_after_ripple_timer_.reset();
 }
 
 }  // namespace views
diff --git a/ui/views/animation/ink_drop_animation_controller_impl.h b/ui/views/animation/ink_drop_animation_controller_impl.h
index c47a0a2f..aab8595 100644
--- a/ui/views/animation/ink_drop_animation_controller_impl.h
+++ b/ui/views/animation/ink_drop_animation_controller_impl.h
@@ -11,8 +11,8 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/views/animation/ink_drop_animation_controller.h"
-#include "ui/views/animation/ink_drop_animation_observer.h"
 #include "ui/views/animation/ink_drop_hover_observer.h"
+#include "ui/views/animation/ink_drop_ripple_observer.h"
 #include "ui/views/views_export.h"
 
 namespace base {
@@ -24,7 +24,7 @@
 class InkDropAnimationControllerImplTestApi;
 }  // namespace test
 
-class InkDropAnimation;
+class InkDropRipple;
 class InkDropHost;
 class InkDropHover;
 class InkDropAnimationControllerFactoryTest;
@@ -32,7 +32,7 @@
 // A functional implementation of an InkDropAnimationController.
 class VIEWS_EXPORT InkDropAnimationControllerImpl
     : public InkDropAnimationController,
-      public InkDropAnimationObserver,
+      public InkDropRippleObserver,
       public InkDropHoverObserver {
  public:
   // Constructs an ink drop controller that will attach the ink drop to the
@@ -50,16 +50,16 @@
  private:
   friend class test::InkDropAnimationControllerImplTestApi;
 
-  // Destroys |ink_drop_animation_| if it's targeted to the HIDDEN state.
+  // Destroys |ink_drop_ripple_| if it's targeted to the HIDDEN state.
   void DestroyHiddenTargetedAnimations();
 
-  // Creates a new InkDropAnimation and sets it to |ink_drop_animation_|. If
-  // |ink_drop_animation_| wasn't null then it will be destroyed using
-  // DestroyInkDropAnimation().
-  void CreateInkDropAnimation();
+  // Creates a new InkDropRipple and sets it to |ink_drop_ripple_|. If
+  // |ink_drop_ripple_| wasn't null then it will be destroyed using
+  // DestroyInkDropRipple().
+  void CreateInkDropRipple();
 
-  // Destroys the current |ink_drop_animation_|.
-  void DestroyInkDropAnimation();
+  // Destroys the current |ink_drop_ripple_|.
+  void DestroyInkDropRipple();
 
   // Creates a new InkDropHover and sets it to |hover_|. If |hover_| wasn't null
   // then it will be destroyed using DestroyInkDropHover().
@@ -80,7 +80,7 @@
   // is visible.
   bool IsHoverFadingInOrVisible() const;
 
-  // views::InkDropAnimationObserver:
+  // views::InkDropRippleObserver:
   void AnimationStarted(InkDropState ink_drop_state) override;
   void AnimationEnded(InkDropState ink_drop_state,
                       InkDropAnimationEndedReason reason) override;
@@ -98,23 +98,23 @@
                           base::TimeDelta animation_duration,
                           bool explode);
 
-  // Starts the |hover_after_animation_timer_| timer. This will stop the current
-  // |hover_after_animation_timer_| instance if it exists.
-  void StartHoverAfterAnimationTimer();
+  // Starts the |hover_after_ripple_timer_| timer. This will stop the current
+  // |hover_after_ripple_timer_| instance if it exists.
+  void StartHoverAfterRippleTimer();
 
-  // Stops and destroys the current |hover_after_animation_timer_| instance.
-  void StopHoverAfterAnimationTimer();
+  // Stops and destroys the current |hover_after_ripple_timer_| instance.
+  void StopHoverAfterRippleTimer();
 
-  // Callback for when the |hover_after_animation_timer_| fires.
-  void HoverAfterAnimationTimerFired();
+  // Callback for when the |hover_after_ripple_timer_| fires.
+  void HoverAfterRippleTimerFired();
 
   // The host of the ink drop. Used to poll for information such as whether the
   // hover should be shown or not.
   InkDropHost* ink_drop_host_;
 
-  // The root Layer that parents the InkDropAnimation layers and the
-  // InkDropHover layers. The |root_layer_| is the one that is added and removed
-  // from the InkDropHost.
+  // The root Layer that parents the InkDropRipple layers and the InkDropHover
+  // layers. The |root_layer_| is the one that is added and removed from the
+  // InkDropHost.
   std::unique_ptr<ui::Layer> root_layer_;
 
   // True when the |root_layer_| has been added to the |ink_drop_host_|.
@@ -127,12 +127,12 @@
   // SetHovered() function.
   bool is_hovered_;
 
-  // The current InkDropAnimation. Created on demand using
-  // CreateInkDropAnimation().
-  std::unique_ptr<InkDropAnimation> ink_drop_animation_;
+  // The current InkDropRipple. Created on demand using CreateInkDropRipple().
+  std::unique_ptr<InkDropRipple> ink_drop_ripple_;
 
-  // The timer used to delay the hover fade in after an ink drop animation.
-  std::unique_ptr<base::Timer> hover_after_animation_timer_;
+  // The timer used to delay the hover fade in after an ink drop ripple
+  // animation.
+  std::unique_ptr<base::Timer> hover_after_ripple_timer_;
 
   DISALLOW_COPY_AND_ASSIGN(InkDropAnimationControllerImpl);
 };
diff --git a/ui/views/animation/ink_drop_animation_controller_impl_unittest.cc b/ui/views/animation/ink_drop_animation_controller_impl_unittest.cc
index fdee2bd6..3f3cb56e 100644
--- a/ui/views/animation/ink_drop_animation_controller_impl_unittest.cc
+++ b/ui/views/animation/ink_drop_animation_controller_impl_unittest.cc
@@ -8,7 +8,7 @@
 #include "base/test/test_simple_task_runner.h"
 #include "base/thread_task_runner_handle.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "ui/views/animation/ink_drop_animation.h"
+#include "ui/views/animation/ink_drop_ripple.h"
 #include "ui/views/animation/test/ink_drop_animation_controller_impl_test_api.h"
 #include "ui/views/animation/test/test_ink_drop_host.h"
 
diff --git a/ui/views/animation/ink_drop_animation_unittest.cc b/ui/views/animation/ink_drop_animation_unittest.cc
deleted file mode 100644
index 85434b5..0000000
--- a/ui/views/animation/ink_drop_animation_unittest.cc
+++ /dev/null
@@ -1,356 +0,0 @@
-// Copyright 2015 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_ANIMATION_INK_DROP_ANIMATION_UNITTEST_H_
-#define UI_VIEWS_ANIMATION_INK_DROP_ANIMATION_UNITTEST_H_
-
-#include "ui/views/animation/ink_drop_animation.h"
-
-#include <memory>
-
-#include "base/macros.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/geometry/size.h"
-#include "ui/views/animation/flood_fill_ink_drop_animation.h"
-#include "ui/views/animation/ink_drop_animation_observer.h"
-#include "ui/views/animation/ink_drop_state.h"
-#include "ui/views/animation/square_ink_drop_animation.h"
-#include "ui/views/animation/test/flood_fill_ink_drop_animation_test_api.h"
-#include "ui/views/animation/test/ink_drop_animation_test_api.h"
-#include "ui/views/animation/test/square_ink_drop_animation_test_api.h"
-#include "ui/views/animation/test/test_ink_drop_animation_observer.h"
-
-namespace views {
-namespace test {
-
-// Represents all the derivatives of the InkDropAnimation class. To be used with
-// the InkDropAnimationTest fixture to test all derviatives.
-enum InkDropAnimationTestTypes {
-  SQUARE_INK_DROP_ANIMATION,
-  FLOOD_FILL_INK_DROP_ANIMATION
-};
-
-// Test fixture for all InkDropAnimation class derivatives.
-//
-// To add a new derivative:
-//    1. Add a value to the InkDropAnimationTestTypes enum.
-//    2. Implement set up and tear down code for the new enum value in
-//       InkDropAnimationTest() and
-//      ~InkDropAnimationTest().
-//    3. Add the new enum value to the INSTANTIATE_TEST_CASE_P) Values list.
-class InkDropAnimationTest
-    : public testing::TestWithParam<InkDropAnimationTestTypes> {
- public:
-  InkDropAnimationTest();
-  ~InkDropAnimationTest() override;
-
- protected:
-  TestInkDropAnimationObserver observer_;
-
-  std::unique_ptr<InkDropAnimation> ink_drop_animation_;
-
-  std::unique_ptr<InkDropAnimationTestApi> test_api_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(InkDropAnimationTest);
-};
-
-InkDropAnimationTest::InkDropAnimationTest() {
-  switch (GetParam()) {
-    case SQUARE_INK_DROP_ANIMATION: {
-      SquareInkDropAnimation* square_ink_drop_animation =
-          new SquareInkDropAnimation(gfx::Size(10, 10), 2, gfx::Size(8, 8), 1,
-                                     gfx::Point(), SK_ColorBLACK);
-      ink_drop_animation_.reset(square_ink_drop_animation);
-      test_api_.reset(
-          new SquareInkDropAnimationTestApi(square_ink_drop_animation));
-      break;
-    }
-    case FLOOD_FILL_INK_DROP_ANIMATION: {
-      FloodFillInkDropAnimation* flood_fill_ink_drop_animation =
-          new FloodFillInkDropAnimation(gfx::Rect(0, 0, 10, 10), gfx::Point(),
-                                        SK_ColorBLACK);
-      ink_drop_animation_.reset(flood_fill_ink_drop_animation);
-      test_api_.reset(
-          new FloodFillInkDropAnimationTestApi(flood_fill_ink_drop_animation));
-      break;
-    }
-  }
-  ink_drop_animation_->set_observer(&observer_);
-  observer_.set_ink_drop_animation(ink_drop_animation_.get());
-  test_api_->SetDisableAnimationTimers(true);
-}
-
-InkDropAnimationTest::~InkDropAnimationTest() {}
-
-// Note: First argument is optional and intentionally left blank.
-// (it's a prefix for the generated test cases)
-INSTANTIATE_TEST_CASE_P(,
-                        InkDropAnimationTest,
-                        testing::Values(SQUARE_INK_DROP_ANIMATION,
-                                        FLOOD_FILL_INK_DROP_ANIMATION));
-
-TEST_P(InkDropAnimationTest, InitialStateAfterConstruction) {
-  EXPECT_EQ(views::InkDropState::HIDDEN,
-            ink_drop_animation_->target_ink_drop_state());
-}
-
-// Verify no animations are used when animating from HIDDEN to HIDDEN.
-TEST_P(InkDropAnimationTest, AnimateToHiddenFromInvisibleState) {
-  EXPECT_EQ(InkDropState::HIDDEN, ink_drop_animation_->target_ink_drop_state());
-
-  ink_drop_animation_->AnimateToState(InkDropState::HIDDEN);
-  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
-  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
-  EXPECT_EQ(InkDropAnimation::kHiddenOpacity, test_api_->GetCurrentOpacity());
-  EXPECT_FALSE(ink_drop_animation_->IsVisible());
-}
-
-TEST_P(InkDropAnimationTest, AnimateToHiddenFromVisibleState) {
-  ink_drop_animation_->AnimateToState(InkDropState::ACTION_PENDING);
-  test_api_->CompleteAnimations();
-  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
-  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
-
-  EXPECT_NE(InkDropState::HIDDEN, ink_drop_animation_->target_ink_drop_state());
-
-  ink_drop_animation_->AnimateToState(InkDropState::HIDDEN);
-  test_api_->CompleteAnimations();
-
-  EXPECT_EQ(3, observer_.last_animation_started_ordinal());
-  EXPECT_EQ(4, observer_.last_animation_ended_ordinal());
-  EXPECT_EQ(InkDropAnimation::kHiddenOpacity, test_api_->GetCurrentOpacity());
-}
-
-TEST_P(InkDropAnimationTest, ActionPendingOpacity) {
-  ink_drop_animation_->AnimateToState(views::InkDropState::ACTION_PENDING);
-  test_api_->CompleteAnimations();
-
-  EXPECT_EQ(InkDropAnimation::kVisibleOpacity, test_api_->GetCurrentOpacity());
-}
-
-TEST_P(InkDropAnimationTest, QuickActionOpacity) {
-  ink_drop_animation_->AnimateToState(views::InkDropState::ACTION_PENDING);
-  ink_drop_animation_->AnimateToState(views::InkDropState::ACTION_TRIGGERED);
-  test_api_->CompleteAnimations();
-
-  EXPECT_EQ(InkDropAnimation::kHiddenOpacity, test_api_->GetCurrentOpacity());
-}
-
-TEST_P(InkDropAnimationTest, SlowActionPendingOpacity) {
-  ink_drop_animation_->AnimateToState(views::InkDropState::ACTION_PENDING);
-  ink_drop_animation_->AnimateToState(
-      views::InkDropState::ALTERNATE_ACTION_PENDING);
-  test_api_->CompleteAnimations();
-
-  EXPECT_EQ(InkDropAnimation::kVisibleOpacity, test_api_->GetCurrentOpacity());
-}
-
-TEST_P(InkDropAnimationTest, SlowActionOpacity) {
-  ink_drop_animation_->AnimateToState(views::InkDropState::ACTION_PENDING);
-  ink_drop_animation_->AnimateToState(
-      views::InkDropState::ALTERNATE_ACTION_PENDING);
-  ink_drop_animation_->AnimateToState(
-      views::InkDropState::ALTERNATE_ACTION_TRIGGERED);
-  test_api_->CompleteAnimations();
-
-  EXPECT_EQ(InkDropAnimation::kHiddenOpacity, test_api_->GetCurrentOpacity());
-}
-
-TEST_P(InkDropAnimationTest, ActivatedOpacity) {
-  ink_drop_animation_->AnimateToState(views::InkDropState::ACTIVATED);
-  test_api_->CompleteAnimations();
-
-  EXPECT_EQ(InkDropAnimation::kVisibleOpacity, test_api_->GetCurrentOpacity());
-}
-
-TEST_P(InkDropAnimationTest, DeactivatedOpacity) {
-  ink_drop_animation_->AnimateToState(views::InkDropState::ACTIVATED);
-  ink_drop_animation_->AnimateToState(views::InkDropState::DEACTIVATED);
-  test_api_->CompleteAnimations();
-
-  EXPECT_EQ(InkDropAnimation::kHiddenOpacity, test_api_->GetCurrentOpacity());
-}
-
-// Verify animations are aborted during deletion and the
-// InkDropAnimationObservers are notified.
-TEST_P(InkDropAnimationTest, AnimationsAbortedDuringDeletion) {
-  ink_drop_animation_->AnimateToState(views::InkDropState::ACTION_PENDING);
-  ink_drop_animation_.reset();
-  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
-  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
-  EXPECT_EQ(views::InkDropState::ACTION_PENDING,
-            observer_.last_animation_ended_context());
-  EXPECT_EQ(InkDropAnimationEndedReason::PRE_EMPTED,
-            observer_.last_animation_ended_reason());
-}
-
-TEST_P(InkDropAnimationTest, VerifyObserversAreNotified) {
-  ink_drop_animation_->AnimateToState(InkDropState::ACTION_PENDING);
-
-  EXPECT_TRUE(test_api_->HasActiveAnimations());
-  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
-  EXPECT_TRUE(observer_.AnimationHasNotEnded());
-  EXPECT_EQ(InkDropState::ACTION_PENDING,
-            observer_.last_animation_started_context());
-
-  test_api_->CompleteAnimations();
-
-  EXPECT_FALSE(test_api_->HasActiveAnimations());
-  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
-  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
-  EXPECT_EQ(InkDropState::ACTION_PENDING,
-            observer_.last_animation_ended_context());
-}
-
-TEST_P(InkDropAnimationTest, VerifyObserversAreNotifiedOfSuccessfulAnimations) {
-  ink_drop_animation_->AnimateToState(InkDropState::ACTION_PENDING);
-  test_api_->CompleteAnimations();
-
-  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
-  EXPECT_EQ(InkDropAnimationEndedReason::SUCCESS,
-            observer_.last_animation_ended_reason());
-}
-
-TEST_P(InkDropAnimationTest, VerifyObserversAreNotifiedOfPreemptedAnimations) {
-  ink_drop_animation_->AnimateToState(InkDropState::ACTION_PENDING);
-  ink_drop_animation_->AnimateToState(InkDropState::ALTERNATE_ACTION_PENDING);
-
-  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
-  EXPECT_EQ(InkDropAnimationEndedReason::PRE_EMPTED,
-            observer_.last_animation_ended_reason());
-}
-
-TEST_P(InkDropAnimationTest, InkDropStatesPersistWhenCallingAnimateToState) {
-  ink_drop_animation_->AnimateToState(views::InkDropState::ACTION_PENDING);
-  ink_drop_animation_->AnimateToState(views::InkDropState::ACTIVATED);
-  EXPECT_EQ(views::InkDropState::ACTIVATED,
-            ink_drop_animation_->target_ink_drop_state());
-}
-
-TEST_P(InkDropAnimationTest, HideImmediatelyWithoutActiveAnimations) {
-  ink_drop_animation_->AnimateToState(views::InkDropState::ACTION_PENDING);
-  test_api_->CompleteAnimations();
-  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
-  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
-
-  EXPECT_FALSE(test_api_->HasActiveAnimations());
-  EXPECT_NE(InkDropState::HIDDEN, ink_drop_animation_->target_ink_drop_state());
-
-  ink_drop_animation_->HideImmediately();
-
-  EXPECT_FALSE(test_api_->HasActiveAnimations());
-  EXPECT_EQ(views::InkDropState::HIDDEN,
-            ink_drop_animation_->target_ink_drop_state());
-  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
-  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
-
-  EXPECT_EQ(InkDropAnimation::kHiddenOpacity, test_api_->GetCurrentOpacity());
-  EXPECT_FALSE(ink_drop_animation_->IsVisible());
-}
-
-// Verifies all active animations are aborted and the InkDropState is set to
-// HIDDEN after invoking HideImmediately().
-TEST_P(InkDropAnimationTest, HideImmediatelyWithActiveAnimations) {
-  ink_drop_animation_->AnimateToState(views::InkDropState::ACTION_PENDING);
-  EXPECT_TRUE(test_api_->HasActiveAnimations());
-  EXPECT_NE(InkDropState::HIDDEN, ink_drop_animation_->target_ink_drop_state());
-  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
-
-  ink_drop_animation_->HideImmediately();
-
-  EXPECT_FALSE(test_api_->HasActiveAnimations());
-  EXPECT_EQ(views::InkDropState::HIDDEN,
-            ink_drop_animation_->target_ink_drop_state());
-  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
-  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
-  EXPECT_EQ(InkDropState::ACTION_PENDING,
-            observer_.last_animation_ended_context());
-  EXPECT_EQ(InkDropAnimationEndedReason::PRE_EMPTED,
-            observer_.last_animation_ended_reason());
-
-  EXPECT_EQ(InkDropAnimation::kHiddenOpacity, test_api_->GetCurrentOpacity());
-  EXPECT_FALSE(ink_drop_animation_->IsVisible());
-}
-
-TEST_P(InkDropAnimationTest, SnapToActivatedWithoutActiveAnimations) {
-  ink_drop_animation_->AnimateToState(views::InkDropState::ACTION_PENDING);
-  test_api_->CompleteAnimations();
-  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
-  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
-
-  EXPECT_FALSE(test_api_->HasActiveAnimations());
-  EXPECT_NE(InkDropState::ACTIVATED,
-            ink_drop_animation_->target_ink_drop_state());
-
-  ink_drop_animation_->SnapToActivated();
-
-  EXPECT_FALSE(test_api_->HasActiveAnimations());
-  EXPECT_EQ(views::InkDropState::ACTIVATED,
-            ink_drop_animation_->target_ink_drop_state());
-  EXPECT_EQ(3, observer_.last_animation_started_ordinal());
-  EXPECT_EQ(4, observer_.last_animation_ended_ordinal());
-
-  EXPECT_EQ(InkDropAnimation::kVisibleOpacity, test_api_->GetCurrentOpacity());
-  EXPECT_TRUE(ink_drop_animation_->IsVisible());
-}
-
-// Verifies all active animations are aborted and the InkDropState is set to
-// ACTIVATED after invoking SnapToActivated().
-TEST_P(InkDropAnimationTest, SnapToActivatedWithActiveAnimations) {
-  ink_drop_animation_->AnimateToState(views::InkDropState::ACTION_PENDING);
-  EXPECT_TRUE(test_api_->HasActiveAnimations());
-  EXPECT_NE(InkDropState::ACTIVATED,
-            ink_drop_animation_->target_ink_drop_state());
-  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
-
-  ink_drop_animation_->SnapToActivated();
-
-  EXPECT_FALSE(test_api_->HasActiveAnimations());
-  EXPECT_EQ(views::InkDropState::ACTIVATED,
-            ink_drop_animation_->target_ink_drop_state());
-  EXPECT_EQ(3, observer_.last_animation_started_ordinal());
-  EXPECT_EQ(4, observer_.last_animation_ended_ordinal());
-  EXPECT_EQ(InkDropState::ACTIVATED, observer_.last_animation_ended_context());
-  EXPECT_EQ(InkDropAnimationEndedReason::SUCCESS,
-            observer_.last_animation_ended_reason());
-
-  EXPECT_EQ(InkDropAnimation::kVisibleOpacity, test_api_->GetCurrentOpacity());
-  EXPECT_TRUE(ink_drop_animation_->IsVisible());
-}
-
-TEST_P(InkDropAnimationTest, AnimateToVisibleFromHidden) {
-  EXPECT_EQ(InkDropState::HIDDEN, ink_drop_animation_->target_ink_drop_state());
-  ink_drop_animation_->AnimateToState(views::InkDropState::ACTION_PENDING);
-  EXPECT_TRUE(ink_drop_animation_->IsVisible());
-}
-
-// Verifies that the value of InkDropAnimation::target_ink_drop_state() returns
-// the most recent value passed to AnimateToState() when notifying observers
-// that an animation has started within the AnimateToState() function call.
-TEST_P(InkDropAnimationTest, TargetInkDropStateOnAnimationStarted) {
-  ink_drop_animation_->AnimateToState(views::InkDropState::ACTION_PENDING);
-  ink_drop_animation_->AnimateToState(views::InkDropState::HIDDEN);
-
-  EXPECT_EQ(3, observer_.last_animation_started_ordinal());
-  EXPECT_EQ(views::InkDropState::HIDDEN,
-            observer_.target_state_at_last_animation_started());
-}
-
-// Verifies that the value of InkDropAnimation::target_ink_drop_state() returns
-// the most recent value passed to AnimateToState() when notifying observers
-// that an animation has ended within the AnimateToState() function call.
-TEST_P(InkDropAnimationTest, TargetInkDropStateOnAnimationEnded) {
-  ink_drop_animation_->AnimateToState(views::InkDropState::ACTION_PENDING);
-  ink_drop_animation_->AnimateToState(views::InkDropState::HIDDEN);
-
-  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
-  EXPECT_EQ(views::InkDropState::HIDDEN,
-            observer_.target_state_at_last_animation_ended());
-}
-
-}  // namespace test
-}  // namespace views
-
-#endif  // UI_VIEWS_ANIMATION_INK_DROP_ANIMATION_UNITTEST_H_
diff --git a/ui/views/animation/ink_drop_host.h b/ui/views/animation/ink_drop_host.h
index 8d6dcb2..88f07b18 100644
--- a/ui/views/animation/ink_drop_host.h
+++ b/ui/views/animation/ink_drop_host.h
@@ -17,7 +17,7 @@
 
 namespace views {
 
-class InkDropAnimation;
+class InkDropRipple;
 class InkDropHover;
 
 // Used by the InkDropAnimationController to add and remove the ink drop layers
@@ -39,7 +39,7 @@
   virtual void RemoveInkDropLayer(ui::Layer* ink_drop_layer) = 0;
 
   // Creates and returns the effect used for press.
-  virtual std::unique_ptr<InkDropAnimation> CreateInkDropAnimation() const = 0;
+  virtual std::unique_ptr<InkDropRipple> CreateInkDropRipple() const = 0;
 
   // Creates and returns the effect used for hover.
   virtual std::unique_ptr<InkDropHover> CreateInkDropHover() const = 0;
diff --git a/ui/views/animation/ink_drop_host_view.cc b/ui/views/animation/ink_drop_host_view.cc
index a8714ce..faf32b0 100644
--- a/ui/views/animation/ink_drop_host_view.cc
+++ b/ui/views/animation/ink_drop_host_view.cc
@@ -7,7 +7,7 @@
 #include "ui/gfx/color_palette.h"
 #include "ui/gfx/geometry/size_conversions.h"
 #include "ui/views/animation/ink_drop_hover.h"
-#include "ui/views/animation/square_ink_drop_animation.h"
+#include "ui/views/animation/square_ink_drop_ripple.h"
 
 namespace views {
 
@@ -46,13 +46,12 @@
   SetPaintToLayer(false);
 }
 
-std::unique_ptr<InkDropAnimation> InkDropHostView::CreateInkDropAnimation()
-    const {
-  std::unique_ptr<InkDropAnimation> animation(new SquareInkDropAnimation(
+std::unique_ptr<InkDropRipple> InkDropHostView::CreateInkDropRipple() const {
+  std::unique_ptr<InkDropRipple> ripple(new SquareInkDropRipple(
       CalculateLargeInkDropSize(ink_drop_size_), kInkDropLargeCornerRadius,
       ink_drop_size_, kInkDropSmallCornerRadius, GetInkDropCenter(),
       GetInkDropBaseColor()));
-  return animation;
+  return ripple;
 }
 
 std::unique_ptr<InkDropHover> InkDropHostView::CreateInkDropHover() const {
diff --git a/ui/views/animation/ink_drop_host_view.h b/ui/views/animation/ink_drop_host_view.h
index 35f712c..e4ebe6d 100644
--- a/ui/views/animation/ink_drop_host_view.h
+++ b/ui/views/animation/ink_drop_host_view.h
@@ -14,7 +14,7 @@
 
 namespace views {
 
-class InkDropAnimation;
+class InkDropRipple;
 class InkDropHover;
 
 // A view that provides InkDropHost functionality.
@@ -26,7 +26,7 @@
   // Overridden from views::InkDropHost:
   void AddInkDropLayer(ui::Layer* ink_drop_layer) override;
   void RemoveInkDropLayer(ui::Layer* ink_drop_layer) override;
-  std::unique_ptr<InkDropAnimation> CreateInkDropAnimation() const override;
+  std::unique_ptr<InkDropRipple> CreateInkDropRipple() const override;
   std::unique_ptr<InkDropHover> CreateInkDropHover() const override;
 
   void set_ink_drop_size(const gfx::Size& size) { ink_drop_size_ = size; }
@@ -44,6 +44,6 @@
 
   DISALLOW_COPY_AND_ASSIGN(InkDropHostView);
 };
-}
+}  // namespace views
 
 #endif  // UI_VIEWS_ANIMATION_INK_DROP_HOST_VIEW_H_
diff --git a/ui/views/animation/ink_drop_animation.cc b/ui/views/animation/ink_drop_ripple.cc
similarity index 79%
rename from ui/views/animation/ink_drop_animation.cc
rename to ui/views/animation/ink_drop_ripple.cc
index 214716da..006e2f81 100644
--- a/ui/views/animation/ink_drop_animation.cc
+++ b/ui/views/animation/ink_drop_ripple.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 "ui/views/animation/ink_drop_animation.h"
+#include "ui/views/animation/ink_drop_ripple.h"
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
@@ -13,9 +13,9 @@
 
 namespace views {
 
-const double InkDropAnimation::kSlowAnimationDurationFactor = 3.0;
+const double InkDropRipple::kSlowAnimationDurationFactor = 3.0;
 
-bool InkDropAnimation::UseFastAnimations() {
+bool InkDropRipple::UseFastAnimations() {
   static bool fast =
       base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
           (::switches::kMaterialDesignInkDropAnimationSpeed)) !=
@@ -23,15 +23,15 @@
   return fast;
 }
 
-const float InkDropAnimation::kHiddenOpacity = 0.f;
-const float InkDropAnimation::kVisibleOpacity = 0.175f;
+const float InkDropRipple::kHiddenOpacity = 0.f;
+const float InkDropRipple::kVisibleOpacity = 0.175f;
 
-InkDropAnimation::InkDropAnimation()
+InkDropRipple::InkDropRipple()
     : target_ink_drop_state_(InkDropState::HIDDEN), observer_(nullptr) {}
 
-InkDropAnimation::~InkDropAnimation() {}
+InkDropRipple::~InkDropRipple() {}
 
-void InkDropAnimation::AnimateToState(InkDropState ink_drop_state) {
+void InkDropRipple::AnimateToState(InkDropState ink_drop_state) {
   // Does not return early if |target_ink_drop_state_| == |ink_drop_state| for
   // two reasons.
   // 1. The attached observers must be notified of all animations started and
@@ -45,9 +45,9 @@
   // |animation_observer|.
   ui::CallbackLayerAnimationObserver* animation_observer =
       new ui::CallbackLayerAnimationObserver(
-          base::Bind(&InkDropAnimation::AnimationStartedCallback,
+          base::Bind(&InkDropRipple::AnimationStartedCallback,
                      base::Unretained(this), ink_drop_state),
-          base::Bind(&InkDropAnimation::AnimationEndedCallback,
+          base::Bind(&InkDropRipple::AnimationEndedCallback,
                      base::Unretained(this), ink_drop_state));
 
   InkDropState old_ink_drop_state = target_ink_drop_state_;
@@ -68,7 +68,7 @@
   // AnimationEndedCallback which can delete |this|.
 }
 
-void InkDropAnimation::SnapToActivated() {
+void InkDropRipple::SnapToActivated() {
   AbortAllAnimations();
   // |animation_observer| will be deleted when AnimationEndedCallback() returns
   // true.
@@ -76,32 +76,32 @@
   // |animation_observer|.
   ui::CallbackLayerAnimationObserver* animation_observer =
       new ui::CallbackLayerAnimationObserver(
-          base::Bind(&InkDropAnimation::AnimationStartedCallback,
+          base::Bind(&InkDropRipple::AnimationStartedCallback,
                      base::Unretained(this), InkDropState::ACTIVATED),
-          base::Bind(&InkDropAnimation::AnimationEndedCallback,
+          base::Bind(&InkDropRipple::AnimationEndedCallback,
                      base::Unretained(this), InkDropState::ACTIVATED));
   GetRootLayer()->SetVisible(true);
   target_ink_drop_state_ = InkDropState::ACTIVATED;
   animation_observer->SetActive();
 }
 
-void InkDropAnimation::HideImmediately() {
+void InkDropRipple::HideImmediately() {
   AbortAllAnimations();
   SetStateToHidden();
   target_ink_drop_state_ = InkDropState::HIDDEN;
 }
 
-test::InkDropAnimationTestApi* InkDropAnimation::GetTestApi() {
+test::InkDropRippleTestApi* InkDropRipple::GetTestApi() {
   return nullptr;
 }
 
-void InkDropAnimation::AnimationStartedCallback(
+void InkDropRipple::AnimationStartedCallback(
     InkDropState ink_drop_state,
     const ui::CallbackLayerAnimationObserver& observer) {
   observer_->AnimationStarted(ink_drop_state);
 }
 
-bool InkDropAnimation::AnimationEndedCallback(
+bool InkDropRipple::AnimationEndedCallback(
     InkDropState ink_drop_state,
     const ui::CallbackLayerAnimationObserver& observer) {
   if (ink_drop_state == InkDropState::HIDDEN)
diff --git a/ui/views/animation/ink_drop_animation.h b/ui/views/animation/ink_drop_ripple.h
similarity index 84%
rename from ui/views/animation/ink_drop_animation.h
rename to ui/views/animation/ink_drop_ripple.h
index b00be7d..738bb9b 100644
--- a/ui/views/animation/ink_drop_animation.h
+++ b/ui/views/animation/ink_drop_ripple.h
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef UI_VIEWS_ANIMATION_INK_DROP_ANIMATION_H_
-#define UI_VIEWS_ANIMATION_INK_DROP_ANIMATION_H_
+#ifndef UI_VIEWS_ANIMATION_INK_DROP_RIPPLE_H_
+#define UI_VIEWS_ANIMATION_INK_DROP_RIPPLE_H_
 
 #include "base/macros.h"
 #include "ui/gfx/geometry/point.h"
-#include "ui/views/animation/ink_drop_animation_observer.h"
+#include "ui/views/animation/ink_drop_ripple_observer.h"
 #include "ui/views/animation/ink_drop_state.h"
 #include "ui/views/views_export.h"
 
@@ -20,15 +20,15 @@
 namespace views {
 
 namespace test {
-class InkDropAnimationTestApi;
+class InkDropRippleTestApi;
 }  // namespace test
 
 // Simple base class for animations that provide visual feedback for View state.
-// Manages the attached InkDropAnimationObservers.
+// Manages the attached InkDropRippleObservers.
 //
 // TODO(bruthig): Document the ink drop ripple on chromium.org and add a link to
 // the doc here.
-class VIEWS_EXPORT InkDropAnimation {
+class VIEWS_EXPORT InkDropRipple {
  public:
   // TODO(bruthig): Remove UseFastAnimations() and kSlowAnimationDurationFactor.
   // See http://crbug.com/584681
@@ -47,16 +47,14 @@
   // The opacity of the ink drop when it is visible.
   static const float kVisibleOpacity;
 
-  InkDropAnimation();
-  virtual ~InkDropAnimation();
+  InkDropRipple();
+  virtual ~InkDropRipple();
 
   // In the event that an animation is in progress for ink drop state 's1' and
   // an animation to a new state 's2' is triggered, then
   // AnimationEnded(s1, PRE_EMPTED) will be called before
   // AnimationStarted(s2).
-  void set_observer(InkDropAnimationObserver* observer) {
-    observer_ = observer;
-  }
+  void set_observer(InkDropRippleObserver* observer) { observer_ = observer; }
 
   // Animates from the current InkDropState to the new |ink_drop_state|.
   //
@@ -68,8 +66,8 @@
 
   // Immediately aborts all in-progress animations and hides the ink drop.
   //
-  // NOTE: This will NOT raise InkDropAnimation(Started|Ended) events for the
-  // state transition to HIDDEN!
+  // NOTE: This will NOT raise Animation(Started|Ended) events for the state
+  // transition to HIDDEN!
   void HideImmediately();
 
   // Immediately snaps the ink drop to the ACTIVATED target state. All pending
@@ -88,7 +86,7 @@
   // Returns a test api to access internals of this. Default implmentations
   // should return nullptr and test specific subclasses can override to return
   // an instance.
-  virtual test::InkDropAnimationTestApi* GetTestApi();
+  virtual test::InkDropRippleTestApi* GetTestApi();
 
  protected:
   // Animates the ripple from the |old_ink_drop_state| to the
@@ -121,11 +119,11 @@
   // The target InkDropState.
   InkDropState target_ink_drop_state_;
 
-  InkDropAnimationObserver* observer_;
+  InkDropRippleObserver* observer_;
 
-  DISALLOW_COPY_AND_ASSIGN(InkDropAnimation);
+  DISALLOW_COPY_AND_ASSIGN(InkDropRipple);
 };
 
 }  // namespace views
 
-#endif  // UI_VIEWS_ANIMATION_INK_DROP_ANIMATION_H_
+#endif  // UI_VIEWS_ANIMATION_INK_DROP_RIPPLE_H_
diff --git a/ui/views/animation/ink_drop_animation_observer.h b/ui/views/animation/ink_drop_ripple_observer.h
similarity index 71%
rename from ui/views/animation/ink_drop_animation_observer.h
rename to ui/views/animation/ink_drop_ripple_observer.h
index 831a6be..b294b3a 100644
--- a/ui/views/animation/ink_drop_animation_observer.h
+++ b/ui/views/animation/ink_drop_ripple_observer.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 UI_VIEWS_ANIMATION_INK_DROP_ANIMATION_OBSERVER_H_
-#define UI_VIEWS_ANIMATION_INK_DROP_ANIMATION_OBSERVER_H_
+#ifndef UI_VIEWS_ANIMATION_INK_DROP_RIPPLE_OBSERVER_H_
+#define UI_VIEWS_ANIMATION_INK_DROP_RIPPLE_OBSERVER_H_
 
 #include <string>
 
@@ -14,8 +14,8 @@
 
 namespace views {
 
-// Observer to attach to an InkDropAnimation.
-class VIEWS_EXPORT InkDropAnimationObserver {
+// Observer to attach to an InkDropRipple.
+class VIEWS_EXPORT InkDropRippleObserver {
  public:
   // An animation for the given |ink_drop_state| has started.
   virtual void AnimationStarted(InkDropState ink_drop_state) = 0;
@@ -29,13 +29,13 @@
                               InkDropAnimationEndedReason reason) = 0;
 
  protected:
-  InkDropAnimationObserver() = default;
-  virtual ~InkDropAnimationObserver() = default;
+  InkDropRippleObserver() = default;
+  virtual ~InkDropRippleObserver() = default;
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(InkDropAnimationObserver);
+  DISALLOW_COPY_AND_ASSIGN(InkDropRippleObserver);
 };
 
 }  // namespace views
 
-#endif  // UI_VIEWS_ANIMATION_INK_DROP_ANIMATION_OBSERVER_H_
+#endif  // UI_VIEWS_ANIMATION_INK_DROP_RIPPLE_OBSERVER_H_
diff --git a/ui/views/animation/ink_drop_ripple_unittest.cc b/ui/views/animation/ink_drop_ripple_unittest.cc
new file mode 100644
index 0000000..2925af0
--- /dev/null
+++ b/ui/views/animation/ink_drop_ripple_unittest.cc
@@ -0,0 +1,348 @@
+// Copyright 2015 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/animation/ink_drop_ripple.h"
+
+#include <memory>
+
+#include "base/macros.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/views/animation/flood_fill_ink_drop_ripple.h"
+#include "ui/views/animation/ink_drop_ripple_observer.h"
+#include "ui/views/animation/ink_drop_state.h"
+#include "ui/views/animation/square_ink_drop_ripple.h"
+#include "ui/views/animation/test/flood_fill_ink_drop_ripple_test_api.h"
+#include "ui/views/animation/test/ink_drop_ripple_test_api.h"
+#include "ui/views/animation/test/square_ink_drop_ripple_test_api.h"
+#include "ui/views/animation/test/test_ink_drop_ripple_observer.h"
+
+namespace views {
+namespace test {
+
+// Represents all the derivatives of the InkDropRipple class. To be used with
+// the InkDropRippleTest fixture to test all derviatives.
+enum InkDropRippleTestTypes {
+  SQUARE_INK_DROP_RIPPLE,
+  FLOOD_FILL_INK_DROP_RIPPLE
+};
+
+// Test fixture for all InkDropRipple class derivatives.
+//
+// To add a new derivative:
+//    1. Add a value to the InkDropRippleTestTypes enum.
+//    2. Implement set up and tear down code for the new enum value in
+//       InkDropRippleTest() and
+//      ~InkDropRippleTest().
+//    3. Add the new enum value to the INSTANTIATE_TEST_CASE_P) Values list.
+class InkDropRippleTest
+    : public testing::TestWithParam<InkDropRippleTestTypes> {
+ public:
+  InkDropRippleTest();
+  ~InkDropRippleTest() override;
+
+ protected:
+  TestInkDropRippleObserver observer_;
+
+  std::unique_ptr<InkDropRipple> ink_drop_ripple_;
+
+  std::unique_ptr<InkDropRippleTestApi> test_api_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(InkDropRippleTest);
+};
+
+InkDropRippleTest::InkDropRippleTest() {
+  switch (GetParam()) {
+    case SQUARE_INK_DROP_RIPPLE: {
+      SquareInkDropRipple* square_ink_drop_ripple =
+          new SquareInkDropRipple(gfx::Size(10, 10), 2, gfx::Size(8, 8), 1,
+                                  gfx::Point(), SK_ColorBLACK);
+      ink_drop_ripple_.reset(square_ink_drop_ripple);
+      test_api_.reset(new SquareInkDropRippleTestApi(square_ink_drop_ripple));
+      break;
+    }
+    case FLOOD_FILL_INK_DROP_RIPPLE: {
+      FloodFillInkDropRipple* flood_fill_ink_drop_ripple =
+          new FloodFillInkDropRipple(gfx::Rect(0, 0, 10, 10), gfx::Point(),
+                                     SK_ColorBLACK);
+      ink_drop_ripple_.reset(flood_fill_ink_drop_ripple);
+      test_api_.reset(
+          new FloodFillInkDropRippleTestApi(flood_fill_ink_drop_ripple));
+      break;
+    }
+  }
+  ink_drop_ripple_->set_observer(&observer_);
+  observer_.set_ink_drop_ripple(ink_drop_ripple_.get());
+  test_api_->SetDisableAnimationTimers(true);
+}
+
+InkDropRippleTest::~InkDropRippleTest() {}
+
+// Note: First argument is optional and intentionally left blank.
+// (it's a prefix for the generated test cases)
+INSTANTIATE_TEST_CASE_P(,
+                        InkDropRippleTest,
+                        testing::Values(SQUARE_INK_DROP_RIPPLE,
+                                        FLOOD_FILL_INK_DROP_RIPPLE));
+
+TEST_P(InkDropRippleTest, InitialStateAfterConstruction) {
+  EXPECT_EQ(views::InkDropState::HIDDEN,
+            ink_drop_ripple_->target_ink_drop_state());
+}
+
+// Verify no animations are used when animating from HIDDEN to HIDDEN.
+TEST_P(InkDropRippleTest, AnimateToHiddenFromInvisibleState) {
+  EXPECT_EQ(InkDropState::HIDDEN, ink_drop_ripple_->target_ink_drop_state());
+
+  ink_drop_ripple_->AnimateToState(InkDropState::HIDDEN);
+  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
+  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
+  EXPECT_EQ(InkDropRipple::kHiddenOpacity, test_api_->GetCurrentOpacity());
+  EXPECT_FALSE(ink_drop_ripple_->IsVisible());
+}
+
+TEST_P(InkDropRippleTest, AnimateToHiddenFromVisibleState) {
+  ink_drop_ripple_->AnimateToState(InkDropState::ACTION_PENDING);
+  test_api_->CompleteAnimations();
+  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
+  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
+
+  EXPECT_NE(InkDropState::HIDDEN, ink_drop_ripple_->target_ink_drop_state());
+
+  ink_drop_ripple_->AnimateToState(InkDropState::HIDDEN);
+  test_api_->CompleteAnimations();
+
+  EXPECT_EQ(3, observer_.last_animation_started_ordinal());
+  EXPECT_EQ(4, observer_.last_animation_ended_ordinal());
+  EXPECT_EQ(InkDropRipple::kHiddenOpacity, test_api_->GetCurrentOpacity());
+}
+
+TEST_P(InkDropRippleTest, ActionPendingOpacity) {
+  ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING);
+  test_api_->CompleteAnimations();
+
+  EXPECT_EQ(InkDropRipple::kVisibleOpacity, test_api_->GetCurrentOpacity());
+}
+
+TEST_P(InkDropRippleTest, QuickActionOpacity) {
+  ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING);
+  ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_TRIGGERED);
+  test_api_->CompleteAnimations();
+
+  EXPECT_EQ(InkDropRipple::kHiddenOpacity, test_api_->GetCurrentOpacity());
+}
+
+TEST_P(InkDropRippleTest, SlowActionPendingOpacity) {
+  ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING);
+  ink_drop_ripple_->AnimateToState(
+      views::InkDropState::ALTERNATE_ACTION_PENDING);
+  test_api_->CompleteAnimations();
+
+  EXPECT_EQ(InkDropRipple::kVisibleOpacity, test_api_->GetCurrentOpacity());
+}
+
+TEST_P(InkDropRippleTest, SlowActionOpacity) {
+  ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING);
+  ink_drop_ripple_->AnimateToState(
+      views::InkDropState::ALTERNATE_ACTION_PENDING);
+  ink_drop_ripple_->AnimateToState(
+      views::InkDropState::ALTERNATE_ACTION_TRIGGERED);
+  test_api_->CompleteAnimations();
+
+  EXPECT_EQ(InkDropRipple::kHiddenOpacity, test_api_->GetCurrentOpacity());
+}
+
+TEST_P(InkDropRippleTest, ActivatedOpacity) {
+  ink_drop_ripple_->AnimateToState(views::InkDropState::ACTIVATED);
+  test_api_->CompleteAnimations();
+
+  EXPECT_EQ(InkDropRipple::kVisibleOpacity, test_api_->GetCurrentOpacity());
+}
+
+TEST_P(InkDropRippleTest, DeactivatedOpacity) {
+  ink_drop_ripple_->AnimateToState(views::InkDropState::ACTIVATED);
+  ink_drop_ripple_->AnimateToState(views::InkDropState::DEACTIVATED);
+  test_api_->CompleteAnimations();
+
+  EXPECT_EQ(InkDropRipple::kHiddenOpacity, test_api_->GetCurrentOpacity());
+}
+
+// Verify animations are aborted during deletion and the
+// InkDropRippleObservers are notified.
+TEST_P(InkDropRippleTest, AnimationsAbortedDuringDeletion) {
+  ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING);
+  ink_drop_ripple_.reset();
+  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
+  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
+  EXPECT_EQ(views::InkDropState::ACTION_PENDING,
+            observer_.last_animation_ended_context());
+  EXPECT_EQ(InkDropAnimationEndedReason::PRE_EMPTED,
+            observer_.last_animation_ended_reason());
+}
+
+TEST_P(InkDropRippleTest, VerifyObserversAreNotified) {
+  ink_drop_ripple_->AnimateToState(InkDropState::ACTION_PENDING);
+
+  EXPECT_TRUE(test_api_->HasActiveAnimations());
+  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
+  EXPECT_TRUE(observer_.AnimationHasNotEnded());
+  EXPECT_EQ(InkDropState::ACTION_PENDING,
+            observer_.last_animation_started_context());
+
+  test_api_->CompleteAnimations();
+
+  EXPECT_FALSE(test_api_->HasActiveAnimations());
+  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
+  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
+  EXPECT_EQ(InkDropState::ACTION_PENDING,
+            observer_.last_animation_ended_context());
+}
+
+TEST_P(InkDropRippleTest, VerifyObserversAreNotifiedOfSuccessfulAnimations) {
+  ink_drop_ripple_->AnimateToState(InkDropState::ACTION_PENDING);
+  test_api_->CompleteAnimations();
+
+  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
+  EXPECT_EQ(InkDropAnimationEndedReason::SUCCESS,
+            observer_.last_animation_ended_reason());
+}
+
+TEST_P(InkDropRippleTest, VerifyObserversAreNotifiedOfPreemptedAnimations) {
+  ink_drop_ripple_->AnimateToState(InkDropState::ACTION_PENDING);
+  ink_drop_ripple_->AnimateToState(InkDropState::ALTERNATE_ACTION_PENDING);
+
+  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
+  EXPECT_EQ(InkDropAnimationEndedReason::PRE_EMPTED,
+            observer_.last_animation_ended_reason());
+}
+
+TEST_P(InkDropRippleTest, InkDropStatesPersistWhenCallingAnimateToState) {
+  ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING);
+  ink_drop_ripple_->AnimateToState(views::InkDropState::ACTIVATED);
+  EXPECT_EQ(views::InkDropState::ACTIVATED,
+            ink_drop_ripple_->target_ink_drop_state());
+}
+
+TEST_P(InkDropRippleTest, HideImmediatelyWithoutActiveAnimations) {
+  ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING);
+  test_api_->CompleteAnimations();
+  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
+  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
+
+  EXPECT_FALSE(test_api_->HasActiveAnimations());
+  EXPECT_NE(InkDropState::HIDDEN, ink_drop_ripple_->target_ink_drop_state());
+
+  ink_drop_ripple_->HideImmediately();
+
+  EXPECT_FALSE(test_api_->HasActiveAnimations());
+  EXPECT_EQ(views::InkDropState::HIDDEN,
+            ink_drop_ripple_->target_ink_drop_state());
+  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
+  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
+
+  EXPECT_EQ(InkDropRipple::kHiddenOpacity, test_api_->GetCurrentOpacity());
+  EXPECT_FALSE(ink_drop_ripple_->IsVisible());
+}
+
+// Verifies all active animations are aborted and the InkDropState is set to
+// HIDDEN after invoking HideImmediately().
+TEST_P(InkDropRippleTest, HideImmediatelyWithActiveAnimations) {
+  ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING);
+  EXPECT_TRUE(test_api_->HasActiveAnimations());
+  EXPECT_NE(InkDropState::HIDDEN, ink_drop_ripple_->target_ink_drop_state());
+  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
+
+  ink_drop_ripple_->HideImmediately();
+
+  EXPECT_FALSE(test_api_->HasActiveAnimations());
+  EXPECT_EQ(views::InkDropState::HIDDEN,
+            ink_drop_ripple_->target_ink_drop_state());
+  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
+  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
+  EXPECT_EQ(InkDropState::ACTION_PENDING,
+            observer_.last_animation_ended_context());
+  EXPECT_EQ(InkDropAnimationEndedReason::PRE_EMPTED,
+            observer_.last_animation_ended_reason());
+
+  EXPECT_EQ(InkDropRipple::kHiddenOpacity, test_api_->GetCurrentOpacity());
+  EXPECT_FALSE(ink_drop_ripple_->IsVisible());
+}
+
+TEST_P(InkDropRippleTest, SnapToActivatedWithoutActiveAnimations) {
+  ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING);
+  test_api_->CompleteAnimations();
+  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
+  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
+
+  EXPECT_FALSE(test_api_->HasActiveAnimations());
+  EXPECT_NE(InkDropState::ACTIVATED, ink_drop_ripple_->target_ink_drop_state());
+
+  ink_drop_ripple_->SnapToActivated();
+
+  EXPECT_FALSE(test_api_->HasActiveAnimations());
+  EXPECT_EQ(views::InkDropState::ACTIVATED,
+            ink_drop_ripple_->target_ink_drop_state());
+  EXPECT_EQ(3, observer_.last_animation_started_ordinal());
+  EXPECT_EQ(4, observer_.last_animation_ended_ordinal());
+
+  EXPECT_EQ(InkDropRipple::kVisibleOpacity, test_api_->GetCurrentOpacity());
+  EXPECT_TRUE(ink_drop_ripple_->IsVisible());
+}
+
+// Verifies all active animations are aborted and the InkDropState is set to
+// ACTIVATED after invoking SnapToActivated().
+TEST_P(InkDropRippleTest, SnapToActivatedWithActiveAnimations) {
+  ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING);
+  EXPECT_TRUE(test_api_->HasActiveAnimations());
+  EXPECT_NE(InkDropState::ACTIVATED, ink_drop_ripple_->target_ink_drop_state());
+  EXPECT_EQ(1, observer_.last_animation_started_ordinal());
+
+  ink_drop_ripple_->SnapToActivated();
+
+  EXPECT_FALSE(test_api_->HasActiveAnimations());
+  EXPECT_EQ(views::InkDropState::ACTIVATED,
+            ink_drop_ripple_->target_ink_drop_state());
+  EXPECT_EQ(3, observer_.last_animation_started_ordinal());
+  EXPECT_EQ(4, observer_.last_animation_ended_ordinal());
+  EXPECT_EQ(InkDropState::ACTIVATED, observer_.last_animation_ended_context());
+  EXPECT_EQ(InkDropAnimationEndedReason::SUCCESS,
+            observer_.last_animation_ended_reason());
+
+  EXPECT_EQ(InkDropRipple::kVisibleOpacity, test_api_->GetCurrentOpacity());
+  EXPECT_TRUE(ink_drop_ripple_->IsVisible());
+}
+
+TEST_P(InkDropRippleTest, AnimateToVisibleFromHidden) {
+  EXPECT_EQ(InkDropState::HIDDEN, ink_drop_ripple_->target_ink_drop_state());
+  ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING);
+  EXPECT_TRUE(ink_drop_ripple_->IsVisible());
+}
+
+// Verifies that the value of InkDropRipple::target_ink_drop_state() returns
+// the most recent value passed to AnimateToState() when notifying observers
+// that an animation has started within the AnimateToState() function call.
+TEST_P(InkDropRippleTest, TargetInkDropStateOnAnimationStarted) {
+  ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING);
+  ink_drop_ripple_->AnimateToState(views::InkDropState::HIDDEN);
+
+  EXPECT_EQ(3, observer_.last_animation_started_ordinal());
+  EXPECT_EQ(views::InkDropState::HIDDEN,
+            observer_.target_state_at_last_animation_started());
+}
+
+// Verifies that the value of InkDropRipple::target_ink_drop_state() returns
+// the most recent value passed to AnimateToState() when notifying observers
+// that an animation has ended within the AnimateToState() function call.
+TEST_P(InkDropRippleTest, TargetInkDropStateOnAnimationEnded) {
+  ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING);
+  ink_drop_ripple_->AnimateToState(views::InkDropState::HIDDEN);
+
+  EXPECT_EQ(2, observer_.last_animation_ended_ordinal());
+  EXPECT_EQ(views::InkDropState::HIDDEN,
+            observer_.target_state_at_last_animation_ended());
+}
+
+}  // namespace test
+}  // namespace views
diff --git a/ui/views/animation/square_ink_drop_animation.cc b/ui/views/animation/square_ink_drop_ripple.cc
similarity index 91%
rename from ui/views/animation/square_ink_drop_animation.cc
rename to ui/views/animation/square_ink_drop_ripple.cc
index 58320aa..142a3a6 100644
--- a/ui/views/animation/square_ink_drop_animation.cc
+++ b/ui/views/animation/square_ink_drop_ripple.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 "ui/views/animation/square_ink_drop_animation.h"
+#include "ui/views/animation/square_ink_drop_ripple.h"
 
 #include <algorithm>
 
@@ -127,9 +127,9 @@
 // Returns the InkDropState sub animation duration for the given |state|.
 base::TimeDelta GetAnimationDuration(InkDropSubAnimations state) {
   return base::TimeDelta::FromMilliseconds(
-      (views::InkDropAnimation::UseFastAnimations()
+      (views::InkDropRipple::UseFastAnimations()
            ? 1
-           : views::InkDropAnimation::kSlowAnimationDurationFactor) *
+           : views::InkDropRipple::kSlowAnimationDurationFactor) *
       kAnimationDurationInMs[state]);
 }
 
@@ -163,12 +163,12 @@
 
 namespace views {
 
-SquareInkDropAnimation::SquareInkDropAnimation(const gfx::Size& large_size,
-                                               int large_corner_radius,
-                                               const gfx::Size& small_size,
-                                               int small_corner_radius,
-                                               const gfx::Point& center_point,
-                                               SkColor color)
+SquareInkDropRipple::SquareInkDropRipple(const gfx::Size& large_size,
+                                         int large_corner_radius,
+                                         const gfx::Size& small_size,
+                                         int small_corner_radius,
+                                         const gfx::Point& center_point,
+                                         SkColor color)
     : large_size_(large_size),
       large_corner_radius_(large_corner_radius),
       small_size_(small_size),
@@ -178,7 +178,7 @@
           std::min(large_size_.width(), large_size_.height()) / 2)),
       rect_layer_delegate_(new RectangleLayerDelegate(color, large_size_)),
       root_layer_(ui::LAYER_NOT_DRAWN) {
-  root_layer_.set_name("SquareInkDropAnimation:ROOT_LAYER");
+  root_layer_.set_name("SquareInkDropRipple:ROOT_LAYER");
 
   for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i)
     AddPaintLayer(static_cast<PaintedShape>(i));
@@ -193,33 +193,33 @@
   SetStateToHidden();
 }
 
-SquareInkDropAnimation::~SquareInkDropAnimation() {
+SquareInkDropRipple::~SquareInkDropRipple() {
   // Explicitly aborting all the animations ensures all callbacks are invoked
   // while this instance still exists.
   AbortAllAnimations();
 }
 
-void SquareInkDropAnimation::SnapToActivated() {
-  InkDropAnimation::SnapToActivated();
+void SquareInkDropRipple::SnapToActivated() {
+  InkDropRipple::SnapToActivated();
   SetOpacity(kVisibleOpacity);
   InkDropTransforms transforms;
   GetActivatedTargetTransforms(&transforms);
   SetTransforms(transforms);
 }
 
-ui::Layer* SquareInkDropAnimation::GetRootLayer() {
+ui::Layer* SquareInkDropRipple::GetRootLayer() {
   return &root_layer_;
 }
 
-bool SquareInkDropAnimation::IsVisible() const {
+bool SquareInkDropRipple::IsVisible() const {
   return root_layer_.visible();
 }
 
-float SquareInkDropAnimation::GetCurrentOpacity() const {
+float SquareInkDropRipple::GetCurrentOpacity() const {
   return root_layer_.opacity();
 }
 
-std::string SquareInkDropAnimation::ToLayerName(PaintedShape painted_shape) {
+std::string SquareInkDropRipple::ToLayerName(PaintedShape painted_shape) {
   switch (painted_shape) {
     case TOP_LEFT_CIRCLE:
       return "TOP_LEFT_CIRCLE";
@@ -240,7 +240,7 @@
   return "UNKNOWN";
 }
 
-void SquareInkDropAnimation::AnimateStateChange(
+void SquareInkDropRipple::AnimateStateChange(
     InkDropState old_ink_drop_state,
     InkDropState new_ink_drop_state,
     ui::LayerAnimationObserver* animation_observer) {
@@ -379,22 +379,22 @@
   }
 }
 
-void SquareInkDropAnimation::SetStateToHidden() {
+void SquareInkDropRipple::SetStateToHidden() {
   InkDropTransforms transforms;
   // Use non-zero size to avoid visual anomalies.
   CalculateCircleTransforms(gfx::Size(1, 1), &transforms);
   SetTransforms(transforms);
-  root_layer_.SetOpacity(InkDropAnimation::kHiddenOpacity);
+  root_layer_.SetOpacity(InkDropRipple::kHiddenOpacity);
   root_layer_.SetVisible(false);
 }
 
-void SquareInkDropAnimation::AbortAllAnimations() {
+void SquareInkDropRipple::AbortAllAnimations() {
   root_layer_.GetAnimator()->AbortAllAnimations();
   for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i)
     painted_layers_[i]->GetAnimator()->AbortAllAnimations();
 }
 
-void SquareInkDropAnimation::AnimateToTransforms(
+void SquareInkDropRipple::AnimateToTransforms(
     const InkDropTransforms transforms,
     base::TimeDelta duration,
     ui::LayerAnimator::PreemptionStrategy preemption_strategy,
@@ -418,16 +418,16 @@
   }
 }
 
-void SquareInkDropAnimation::SetTransforms(const InkDropTransforms transforms) {
+void SquareInkDropRipple::SetTransforms(const InkDropTransforms transforms) {
   for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i)
     painted_layers_[i]->SetTransform(transforms[i]);
 }
 
-void SquareInkDropAnimation::SetOpacity(float opacity) {
+void SquareInkDropRipple::SetOpacity(float opacity) {
   root_layer_.SetOpacity(opacity);
 }
 
-void SquareInkDropAnimation::AnimateToOpacity(
+void SquareInkDropRipple::AnimateToOpacity(
     float opacity,
     base::TimeDelta duration,
     ui::LayerAnimator::PreemptionStrategy preemption_strategy,
@@ -448,14 +448,14 @@
   animator->StartAnimation(animation_sequence);
 }
 
-void SquareInkDropAnimation::CalculateCircleTransforms(
+void SquareInkDropRipple::CalculateCircleTransforms(
     const gfx::Size& size,
     InkDropTransforms* transforms_out) const {
   CalculateRectTransforms(size, std::min(size.width(), size.height()) / 2.0f,
                           transforms_out);
 }
 
-void SquareInkDropAnimation::CalculateRectTransforms(
+void SquareInkDropRipple::CalculateRectTransforms(
     const gfx::Size& size,
     float corner_radius,
     InkDropTransforms* transforms_out) const {
@@ -509,18 +509,18 @@
       std::max(kMinimumRectScale, size.height() / rect_delegate_height));
 }
 
-void SquareInkDropAnimation::GetCurrentTransforms(
+void SquareInkDropRipple::GetCurrentTransforms(
     InkDropTransforms* transforms_out) const {
   for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i)
     (*transforms_out)[i] = painted_layers_[i]->transform();
 }
 
-void SquareInkDropAnimation::GetActivatedTargetTransforms(
+void SquareInkDropRipple::GetActivatedTargetTransforms(
     InkDropTransforms* transforms_out) const {
   CalculateRectTransforms(small_size_, small_corner_radius_, transforms_out);
 }
 
-void SquareInkDropAnimation::AddPaintLayer(PaintedShape painted_shape) {
+void SquareInkDropRipple::AddPaintLayer(PaintedShape painted_shape) {
   ui::LayerDelegate* delegate = nullptr;
   switch (painted_shape) {
     case TOP_LEFT_CIRCLE:
diff --git a/ui/views/animation/square_ink_drop_animation.h b/ui/views/animation/square_ink_drop_ripple.h
similarity index 86%
rename from ui/views/animation/square_ink_drop_animation.h
rename to ui/views/animation/square_ink_drop_ripple.h
index 04dc09f8..dbc05ad 100644
--- a/ui/views/animation/square_ink_drop_animation.h
+++ b/ui/views/animation/square_ink_drop_ripple.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 UI_VIEWS_ANIMATION_SQUARE_INK_DROP_ANIMATION_H_
-#define UI_VIEWS_ANIMATION_SQUARE_INK_DROP_ANIMATION_H_
+#ifndef UI_VIEWS_ANIMATION_SQUARE_INK_DROP_RIPPLE_H_
+#define UI_VIEWS_ANIMATION_SQUARE_INK_DROP_RIPPLE_H_
 
 #include <memory>
 #include <string>
@@ -17,7 +17,7 @@
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/transform.h"
-#include "ui/views/animation/ink_drop_animation.h"
+#include "ui/views/animation/ink_drop_ripple.h"
 #include "ui/views/animation/ink_drop_state.h"
 #include "ui/views/views_export.h"
 
@@ -30,10 +30,10 @@
 class RectangleLayerDelegate;
 
 namespace test {
-class SquareInkDropAnimationTestApi;
+class SquareInkDropRippleTestApi;
 }  // namespace test
 
-// An ink drop animation that smoothly animates between a circle and a rounded
+// An ink drop ripple that smoothly animates between a circle and a rounded
 // rectangle of different sizes for each of the different InkDropStates. The
 // final frame for each InkDropState will be bounded by either a |large_size_|
 // rectangle or a |small_size_| rectangle.
@@ -48,23 +48,23 @@
 //   {All InkDropStates}      => ACTIVATED
 //   {All InkDropStates}      => DEACTIVATED
 //
-class VIEWS_EXPORT SquareInkDropAnimation : public InkDropAnimation {
+class VIEWS_EXPORT SquareInkDropRipple : public InkDropRipple {
  public:
-  SquareInkDropAnimation(const gfx::Size& large_size,
-                         int large_corner_radius,
-                         const gfx::Size& small_size,
-                         int small_corner_radius,
-                         const gfx::Point& center_point,
-                         SkColor color);
-  ~SquareInkDropAnimation() override;
+  SquareInkDropRipple(const gfx::Size& large_size,
+                      int large_corner_radius,
+                      const gfx::Size& small_size,
+                      int small_corner_radius,
+                      const gfx::Point& center_point,
+                      SkColor color);
+  ~SquareInkDropRipple() override;
 
-  // InkDropAnimation:
+  // InkDropRipple:
   void SnapToActivated() override;
   ui::Layer* GetRootLayer() override;
   bool IsVisible() const override;
 
  private:
-  friend class test::SquareInkDropAnimationTestApi;
+  friend class test::SquareInkDropRippleTestApi;
 
   // Enumeration of the different shapes that compose the ink drop.
   enum PaintedShape {
@@ -87,7 +87,7 @@
 
   float GetCurrentOpacity() const;
 
-  // InkDropAnimation:
+  // InkDropRipple:
   void AnimateStateChange(InkDropState old_ink_drop_state,
                           InkDropState new_ink_drop_state,
                           ui::LayerAnimationObserver* observer) override;
@@ -176,9 +176,9 @@
   // ui::Layers for all of the painted shape layers that compose the ink drop.
   std::unique_ptr<ui::Layer> painted_layers_[PAINTED_SHAPE_COUNT];
 
-  DISALLOW_COPY_AND_ASSIGN(SquareInkDropAnimation);
+  DISALLOW_COPY_AND_ASSIGN(SquareInkDropRipple);
 };
 
 }  // namespace views
 
-#endif  // UI_VIEWS_ANIMATION_SQUARE_INK_DROP_ANIMATION_H_
+#endif  // UI_VIEWS_ANIMATION_SQUARE_INK_DROP_RIPPLE_H_
diff --git a/ui/views/animation/square_ink_drop_animation_unittest.cc b/ui/views/animation/square_ink_drop_ripple_unittest.cc
similarity index 75%
rename from ui/views/animation/square_ink_drop_animation_unittest.cc
rename to ui/views/animation/square_ink_drop_ripple_unittest.cc
index 3ff0024e..44ec224 100644
--- a/ui/views/animation/square_ink_drop_animation_unittest.cc
+++ b/ui/views/animation/square_ink_drop_ripple_unittest.cc
@@ -2,10 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef UI_VIEWS_ANIMATION_INK_DROP_ANIMATION_UNITTEST_H_
-#define UI_VIEWS_ANIMATION_INK_DROP_ANIMATION_UNITTEST_H_
-
-#include "ui/views/animation/square_ink_drop_animation.h"
+#include "ui/views/animation/square_ink_drop_ripple.h"
 
 #include <memory>
 
@@ -14,17 +11,17 @@
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/geometry/size_f.h"
-#include "ui/views/animation/ink_drop_animation_observer.h"
+#include "ui/views/animation/ink_drop_ripple_observer.h"
 #include "ui/views/animation/ink_drop_state.h"
-#include "ui/views/animation/test/square_ink_drop_animation_test_api.h"
-#include "ui/views/animation/test/test_ink_drop_animation_observer.h"
+#include "ui/views/animation/test/square_ink_drop_ripple_test_api.h"
+#include "ui/views/animation/test/test_ink_drop_ripple_observer.h"
 
 namespace views {
 namespace test {
 
 namespace {
 
-using PaintedShape = views::test::SquareInkDropAnimationTestApi::PaintedShape;
+using PaintedShape = views::test::SquareInkDropRippleTestApi::PaintedShape;
 
 // Transforms a copy of |point| with |transform| and returns it.
 gfx::Point TransformPoint(const gfx::Transform& transform,
@@ -34,10 +31,10 @@
   return transformed_point;
 }
 
-class SquareInkDropAnimationCalculateTransformsTest : public testing::Test {
+class SquareInkDropRippleCalculateTransformsTest : public testing::Test {
  public:
-  SquareInkDropAnimationCalculateTransformsTest();
-  ~SquareInkDropAnimationCalculateTransformsTest() override;
+  SquareInkDropRippleCalculateTransformsTest();
+  ~SquareInkDropRippleCalculateTransformsTest() override;
 
  protected:
   // Half the width/height of the drawn ink drop.
@@ -63,66 +60,63 @@
   static const gfx::Point kDrawnBottomMidPoint;
 
   // The test target.
-  SquareInkDropAnimation ink_drop_animation_;
+  SquareInkDropRipple ink_drop_ripple_;
 
   // Provides internal access to the test target.
-  SquareInkDropAnimationTestApi test_api_;
+  SquareInkDropRippleTestApi test_api_;
 
   // The gfx::Transforms collection that is populated via the
   // Calculate*Transforms() calls.
-  SquareInkDropAnimationTestApi::InkDropTransforms transforms_;
+  SquareInkDropRippleTestApi::InkDropTransforms transforms_;
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(SquareInkDropAnimationCalculateTransformsTest);
+  DISALLOW_COPY_AND_ASSIGN(SquareInkDropRippleCalculateTransformsTest);
 };
 
-const int SquareInkDropAnimationCalculateTransformsTest::kHalfDrawnSize = 5;
-const int SquareInkDropAnimationCalculateTransformsTest::kDrawnSize =
+const int SquareInkDropRippleCalculateTransformsTest::kHalfDrawnSize = 5;
+const int SquareInkDropRippleCalculateTransformsTest::kDrawnSize =
     2 * kHalfDrawnSize;
 
-const int SquareInkDropAnimationCalculateTransformsTest::kTransformedRadius =
-    10;
-const int SquareInkDropAnimationCalculateTransformsTest::kHalfTransformedSize =
+const int SquareInkDropRippleCalculateTransformsTest::kTransformedRadius = 10;
+const int SquareInkDropRippleCalculateTransformsTest::kHalfTransformedSize =
     100;
-const int SquareInkDropAnimationCalculateTransformsTest::kTransformedSize =
+const int SquareInkDropRippleCalculateTransformsTest::kTransformedSize =
     2 * kHalfTransformedSize;
 
-const gfx::Point
-    SquareInkDropAnimationCalculateTransformsTest::kDrawnCenterPoint =
-        gfx::Point(kHalfDrawnSize, kHalfDrawnSize);
+const gfx::Point SquareInkDropRippleCalculateTransformsTest::kDrawnCenterPoint =
+    gfx::Point(kHalfDrawnSize, kHalfDrawnSize);
 
 const gfx::Point
-    SquareInkDropAnimationCalculateTransformsTest::kDrawnMidLeftPoint =
+    SquareInkDropRippleCalculateTransformsTest::kDrawnMidLeftPoint =
         gfx::Point(0, kHalfDrawnSize);
 
 const gfx::Point
-    SquareInkDropAnimationCalculateTransformsTest::kDrawnMidRightPoint =
+    SquareInkDropRippleCalculateTransformsTest::kDrawnMidRightPoint =
         gfx::Point(kDrawnSize, kHalfDrawnSize);
 
-const gfx::Point
-    SquareInkDropAnimationCalculateTransformsTest::kDrawnTopMidPoint =
-        gfx::Point(kHalfDrawnSize, 0);
+const gfx::Point SquareInkDropRippleCalculateTransformsTest::kDrawnTopMidPoint =
+    gfx::Point(kHalfDrawnSize, 0);
 
 const gfx::Point
-    SquareInkDropAnimationCalculateTransformsTest::kDrawnBottomMidPoint =
+    SquareInkDropRippleCalculateTransformsTest::kDrawnBottomMidPoint =
         gfx::Point(kHalfDrawnSize, kDrawnSize);
 
-SquareInkDropAnimationCalculateTransformsTest::
-    SquareInkDropAnimationCalculateTransformsTest()
-    : ink_drop_animation_(gfx::Size(kDrawnSize, kDrawnSize),
-                          2,
-                          gfx::Size(kHalfDrawnSize, kHalfDrawnSize),
-                          1,
-                          gfx::Point(),
-                          SK_ColorBLACK),
-      test_api_(&ink_drop_animation_) {}
+SquareInkDropRippleCalculateTransformsTest::
+    SquareInkDropRippleCalculateTransformsTest()
+    : ink_drop_ripple_(gfx::Size(kDrawnSize, kDrawnSize),
+                       2,
+                       gfx::Size(kHalfDrawnSize, kHalfDrawnSize),
+                       1,
+                       gfx::Point(),
+                       SK_ColorBLACK),
+      test_api_(&ink_drop_ripple_) {}
 
-SquareInkDropAnimationCalculateTransformsTest::
-    ~SquareInkDropAnimationCalculateTransformsTest() {}
+SquareInkDropRippleCalculateTransformsTest::
+    ~SquareInkDropRippleCalculateTransformsTest() {}
 
 }  // namespace
 
-TEST_F(SquareInkDropAnimationCalculateTransformsTest,
+TEST_F(SquareInkDropRippleCalculateTransformsTest,
        TransformedPointsUsingTransformsFromCalculateCircleTransforms) {
   test_api_.CalculateCircleTransforms(
       gfx::Size(kTransformedSize, kTransformedSize), &transforms_);
@@ -180,7 +174,7 @@
   }
 }
 
-TEST_F(SquareInkDropAnimationCalculateTransformsTest,
+TEST_F(SquareInkDropRippleCalculateTransformsTest,
        TransformedPointsUsingTransformsFromCalculateRectTransforms) {
   test_api_.CalculateRectTransforms(
       gfx::Size(kTransformedSize, kTransformedSize), kTransformedRadius,
@@ -245,5 +239,3 @@
 
 }  // namespace test
 }  // namespace views
-
-#endif  // UI_VIEWS_ANIMATION_INK_DROP_ANIMATION_UNITTEST_H_
diff --git a/ui/views/animation/test/flood_fill_ink_drop_animation_test_api.cc b/ui/views/animation/test/flood_fill_ink_drop_animation_test_api.cc
deleted file mode 100644
index eb7385ed..0000000
--- a/ui/views/animation/test/flood_fill_ink_drop_animation_test_api.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016 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/animation/test/flood_fill_ink_drop_animation_test_api.h"
-
-#include <vector>
-
-#include "base/time/time.h"
-#include "ui/compositor/layer.h"
-#include "ui/compositor/layer_animator.h"
-#include "ui/compositor/test/layer_animator_test_controller.h"
-#include "ui/views/animation/ink_drop_animation.h"
-
-namespace views {
-namespace test {
-
-FloodFillInkDropAnimationTestApi::FloodFillInkDropAnimationTestApi(
-    FloodFillInkDropAnimation* ink_drop_animation)
-    : InkDropAnimationTestApi(ink_drop_animation) {}
-
-FloodFillInkDropAnimationTestApi::~FloodFillInkDropAnimationTestApi() {}
-
-gfx::Transform FloodFillInkDropAnimationTestApi::CalculateTransform(
-    float target_radius) const {
-  return ink_drop_animation()->CalculateTransform(target_radius);
-}
-
-float FloodFillInkDropAnimationTestApi::GetCurrentOpacity() const {
-  return ink_drop_animation()->root_layer_.opacity();
-}
-
-std::vector<ui::LayerAnimator*>
-FloodFillInkDropAnimationTestApi::GetLayerAnimators() {
-  std::vector<ui::LayerAnimator*> animators =
-      InkDropAnimationTestApi::GetLayerAnimators();
-  animators.push_back(ink_drop_animation()->GetRootLayer()->GetAnimator());
-  animators.push_back(ink_drop_animation()->painted_layer_.GetAnimator());
-  return animators;
-}
-
-}  // namespace test
-}  // namespace views
diff --git a/ui/views/animation/test/flood_fill_ink_drop_animation_test_api.h b/ui/views/animation/test/flood_fill_ink_drop_animation_test_api.h
deleted file mode 100644
index 9e3436a9..0000000
--- a/ui/views/animation/test/flood_fill_ink_drop_animation_test_api.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2016 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_ANIMATION_TEST_FLOOD_FILL_INK_DROP_ANIMATION_TEST_API_H_
-#define UI_VIEWS_ANIMATION_TEST_FLOOD_FILL_INK_DROP_ANIMATION_TEST_API_H_
-
-#include <vector>
-
-#include "base/macros.h"
-#include "ui/gfx/geometry/size.h"
-#include "ui/views/animation/flood_fill_ink_drop_animation.h"
-#include "ui/views/animation/test/ink_drop_animation_test_api.h"
-
-namespace ui {
-class LayerAnimator;
-}  // namespace ui
-
-namespace views {
-namespace test {
-
-// Test API to provide internal access to a FloodFillInkDropAnimation.
-class FloodFillInkDropAnimationTestApi : public InkDropAnimationTestApi {
- public:
-  explicit FloodFillInkDropAnimationTestApi(
-      FloodFillInkDropAnimation* ink_drop_animation);
-  ~FloodFillInkDropAnimationTestApi() override;
-
-  // Wrapper functions to the wrapped InkDropAnimation:
-  gfx::Transform CalculateTransform(float target_radius) const;
-
-  // InkDropAnimationTestApi:
-  float GetCurrentOpacity() const override;
-
- protected:
-  // InkDropAnimationTestApi:
-  std::vector<ui::LayerAnimator*> GetLayerAnimators() override;
-
- private:
-  FloodFillInkDropAnimation* ink_drop_animation() {
-    return static_cast<const FloodFillInkDropAnimationTestApi*>(this)
-        ->ink_drop_animation();
-  }
-
-  FloodFillInkDropAnimation* ink_drop_animation() const {
-    return static_cast<FloodFillInkDropAnimation*>(
-        InkDropAnimationTestApi::ink_drop_animation());
-  }
-
-  DISALLOW_COPY_AND_ASSIGN(FloodFillInkDropAnimationTestApi);
-};
-
-}  // namespace test
-}  // namespace views
-
-#endif  // UI_VIEWS_ANIMATION_TEST_FLOOD_FILL_INK_DROP_ANIMATION_TEST_API_H_
diff --git a/ui/views/animation/test/flood_fill_ink_drop_ripple_test_api.cc b/ui/views/animation/test/flood_fill_ink_drop_ripple_test_api.cc
new file mode 100644
index 0000000..4445b36
--- /dev/null
+++ b/ui/views/animation/test/flood_fill_ink_drop_ripple_test_api.cc
@@ -0,0 +1,43 @@
+// Copyright 2016 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/animation/test/flood_fill_ink_drop_ripple_test_api.h"
+
+#include <vector>
+
+#include "base/time/time.h"
+#include "ui/compositor/layer.h"
+#include "ui/compositor/layer_animator.h"
+#include "ui/compositor/test/layer_animator_test_controller.h"
+#include "ui/views/animation/ink_drop_ripple.h"
+
+namespace views {
+namespace test {
+
+FloodFillInkDropRippleTestApi::FloodFillInkDropRippleTestApi(
+    FloodFillInkDropRipple* ink_drop_ripple)
+    : InkDropRippleTestApi(ink_drop_ripple) {}
+
+FloodFillInkDropRippleTestApi::~FloodFillInkDropRippleTestApi() {}
+
+gfx::Transform FloodFillInkDropRippleTestApi::CalculateTransform(
+    float target_radius) const {
+  return ink_drop_ripple()->CalculateTransform(target_radius);
+}
+
+float FloodFillInkDropRippleTestApi::GetCurrentOpacity() const {
+  return ink_drop_ripple()->root_layer_.opacity();
+}
+
+std::vector<ui::LayerAnimator*>
+FloodFillInkDropRippleTestApi::GetLayerAnimators() {
+  std::vector<ui::LayerAnimator*> animators =
+      InkDropRippleTestApi::GetLayerAnimators();
+  animators.push_back(ink_drop_ripple()->GetRootLayer()->GetAnimator());
+  animators.push_back(ink_drop_ripple()->painted_layer_.GetAnimator());
+  return animators;
+}
+
+}  // namespace test
+}  // namespace views
diff --git a/ui/views/animation/test/flood_fill_ink_drop_ripple_test_api.h b/ui/views/animation/test/flood_fill_ink_drop_ripple_test_api.h
new file mode 100644
index 0000000..ee6e52d
--- /dev/null
+++ b/ui/views/animation/test/flood_fill_ink_drop_ripple_test_api.h
@@ -0,0 +1,56 @@
+// Copyright 2016 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_ANIMATION_TEST_FLOOD_FILL_INK_DROP_RIPPLE_TEST_API_H_
+#define UI_VIEWS_ANIMATION_TEST_FLOOD_FILL_INK_DROP_RIPPLE_TEST_API_H_
+
+#include <vector>
+
+#include "base/macros.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/views/animation/flood_fill_ink_drop_ripple.h"
+#include "ui/views/animation/test/ink_drop_ripple_test_api.h"
+
+namespace ui {
+class LayerAnimator;
+}  // namespace ui
+
+namespace views {
+namespace test {
+
+// Test API to provide internal access to a FloodFillInkDropRipple.
+class FloodFillInkDropRippleTestApi : public InkDropRippleTestApi {
+ public:
+  explicit FloodFillInkDropRippleTestApi(
+      FloodFillInkDropRipple* ink_drop_ripple);
+  ~FloodFillInkDropRippleTestApi() override;
+
+  // Wrapper functions to the wrapped InkDropRipple:
+  gfx::Transform CalculateTransform(float target_radius) const;
+
+  // InkDropRippleTestApi:
+  float GetCurrentOpacity() const override;
+
+ protected:
+  // InkDropRippleTestApi:
+  std::vector<ui::LayerAnimator*> GetLayerAnimators() override;
+
+ private:
+  FloodFillInkDropRipple* ink_drop_ripple() {
+    return static_cast<const FloodFillInkDropRippleTestApi*>(this)
+        ->ink_drop_ripple();
+  }
+
+  FloodFillInkDropRipple* ink_drop_ripple() const {
+    return static_cast<FloodFillInkDropRipple*>(
+        InkDropRippleTestApi::ink_drop_ripple());
+  }
+
+  DISALLOW_COPY_AND_ASSIGN(FloodFillInkDropRippleTestApi);
+};
+
+}  // namespace test
+}  // namespace views
+
+#endif  // UI_VIEWS_ANIMATION_TEST_FLOOD_FILL_INK_DROP_RIPPLE_TEST_API_H_
diff --git a/ui/views/animation/test/ink_drop_animation_controller_impl_test_api.cc b/ui/views/animation/test/ink_drop_animation_controller_impl_test_api.cc
index a41d67c..0964396 100644
--- a/ui/views/animation/test/ink_drop_animation_controller_impl_test_api.cc
+++ b/ui/views/animation/test/ink_drop_animation_controller_impl_test_api.cc
@@ -4,11 +4,11 @@
 
 #include "ui/views/animation/test/ink_drop_animation_controller_impl_test_api.h"
 
-#include "ui/views/animation/ink_drop_animation.h"
 #include "ui/views/animation/ink_drop_animation_controller_impl.h"
 #include "ui/views/animation/ink_drop_hover.h"
-#include "ui/views/animation/test/ink_drop_animation_test_api.h"
+#include "ui/views/animation/ink_drop_ripple.h"
 #include "ui/views/animation/test/ink_drop_hover_test_api.h"
+#include "ui/views/animation/test/ink_drop_ripple_test_api.h"
 
 namespace views {
 namespace test {
@@ -42,13 +42,13 @@
                      ink_drop_hover_animators.end());
   }
 
-  if (ink_drop_controller_->ink_drop_animation_) {
-    InkDropAnimationTestApi* ink_drop_animation_test_api =
-        ink_drop_controller_->ink_drop_animation_->GetTestApi();
-    std::vector<ui::LayerAnimator*> ink_drop_animation_animators =
-        ink_drop_animation_test_api->GetLayerAnimators();
-    animators.insert(animators.end(), ink_drop_animation_animators.begin(),
-                     ink_drop_animation_animators.end());
+  if (ink_drop_controller_->ink_drop_ripple_) {
+    InkDropRippleTestApi* ink_drop_ripple_test_api =
+        ink_drop_controller_->ink_drop_ripple_->GetTestApi();
+    std::vector<ui::LayerAnimator*> ink_drop_ripple_animators =
+        ink_drop_ripple_test_api->GetLayerAnimators();
+    animators.insert(animators.end(), ink_drop_ripple_animators.begin(),
+                     ink_drop_ripple_animators.end());
   }
 
   return animators;
diff --git a/ui/views/animation/test/ink_drop_animation_controller_impl_test_api.h b/ui/views/animation/test/ink_drop_animation_controller_impl_test_api.h
index 54b80c6..97cde57 100644
--- a/ui/views/animation/test/ink_drop_animation_controller_impl_test_api.h
+++ b/ui/views/animation/test/ink_drop_animation_controller_impl_test_api.h
@@ -22,7 +22,7 @@
 namespace test {
 
 // Test API to provide internal access to an InkDropAnimationControllerImpl
-// instance. This can also be used to control the InkDropAnimation and
+// instance. This can also be used to control the InkDropRipple and
 // InkDropHover animations via the ui::test::MultiLayerAnimatorTestController
 // API.
 class InkDropAnimationControllerImplTestApi
@@ -42,7 +42,7 @@
   std::vector<ui::LayerAnimator*> GetLayerAnimators() override;
 
  private:
-  // The InkDropedAnimation to provide internal access to.
+  // The InkDropAnimationController to provide internal access to.
   InkDropAnimationControllerImpl* ink_drop_controller_;
 
   DISALLOW_COPY_AND_ASSIGN(InkDropAnimationControllerImplTestApi);
diff --git a/ui/views/animation/test/ink_drop_animation_test_api.cc b/ui/views/animation/test/ink_drop_animation_test_api.cc
deleted file mode 100644
index 0fbfb55..0000000
--- a/ui/views/animation/test/ink_drop_animation_test_api.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2015 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/animation/test/ink_drop_animation_test_api.h"
-
-namespace views {
-namespace test {
-
-InkDropAnimationTestApi::InkDropAnimationTestApi(
-    InkDropAnimation* ink_drop_animation)
-    : ui::test::MultiLayerAnimatorTestController(this),
-      ink_drop_animation_(ink_drop_animation) {}
-
-InkDropAnimationTestApi::~InkDropAnimationTestApi() {}
-
-std::vector<ui::LayerAnimator*> InkDropAnimationTestApi::GetLayerAnimators() {
-  return std::vector<ui::LayerAnimator*>();
-}
-
-}  // namespace test
-}  // namespace views
diff --git a/ui/views/animation/test/ink_drop_animation_test_api.h b/ui/views/animation/test/ink_drop_animation_test_api.h
deleted file mode 100644
index d10c73d..0000000
--- a/ui/views/animation/test/ink_drop_animation_test_api.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2015 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_ANIMATION_TEST_INK_DROP_ANIMATION_TEST_API_H_
-#define UI_VIEWS_ANIMATION_TEST_INK_DROP_ANIMATION_TEST_API_H_
-
-#include <vector>
-
-#include "base/macros.h"
-#include "ui/compositor/test/multi_layer_animator_test_controller.h"
-#include "ui/compositor/test/multi_layer_animator_test_controller_delegate.h"
-
-namespace ui {
-class LayerAnimator;
-}  // namespace ui
-
-namespace views {
-class InkDropAnimation;
-
-namespace test {
-
-// Test API to provide internal access to an InkDropAnimation instance. This can
-// also be used to control the animations via the
-// ui::test::MultiLayerAnimatorTestController API.
-class InkDropAnimationTestApi
-    : public ui::test::MultiLayerAnimatorTestController,
-      public ui::test::MultiLayerAnimatorTestControllerDelegate {
- public:
-  explicit InkDropAnimationTestApi(InkDropAnimation* ink_drop_animation);
-  ~InkDropAnimationTestApi() override;
-
-  // Gets the opacity of the ink drop.
-  virtual float GetCurrentOpacity() const = 0;
-
-  // MultiLayerAnimatorTestControllerDelegate:
-  std::vector<ui::LayerAnimator*> GetLayerAnimators() override;
-
- protected:
-  InkDropAnimation* ink_drop_animation() {
-    return static_cast<const InkDropAnimationTestApi*>(this)
-        ->ink_drop_animation();
-  }
-
-  InkDropAnimation* ink_drop_animation() const { return ink_drop_animation_; }
-
- private:
-  // The InkDropedAnimation to provide internal access to.
-  InkDropAnimation* ink_drop_animation_;
-
-  DISALLOW_COPY_AND_ASSIGN(InkDropAnimationTestApi);
-};
-
-}  // namespace test
-}  // namespace views
-
-#endif  // UI_VIEWS_ANIMATION_TEST_INK_DROP_ANIMATION_TEST_API_H_
diff --git a/ui/views/animation/test/ink_drop_ripple_test_api.cc b/ui/views/animation/test/ink_drop_ripple_test_api.cc
new file mode 100644
index 0000000..22d3f7c
--- /dev/null
+++ b/ui/views/animation/test/ink_drop_ripple_test_api.cc
@@ -0,0 +1,21 @@
+// Copyright 2015 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/animation/test/ink_drop_ripple_test_api.h"
+
+namespace views {
+namespace test {
+
+InkDropRippleTestApi::InkDropRippleTestApi(InkDropRipple* ink_drop_ripple)
+    : ui::test::MultiLayerAnimatorTestController(this),
+      ink_drop_ripple_(ink_drop_ripple) {}
+
+InkDropRippleTestApi::~InkDropRippleTestApi() {}
+
+std::vector<ui::LayerAnimator*> InkDropRippleTestApi::GetLayerAnimators() {
+  return std::vector<ui::LayerAnimator*>();
+}
+
+}  // namespace test
+}  // namespace views
diff --git a/ui/views/animation/test/ink_drop_ripple_test_api.h b/ui/views/animation/test/ink_drop_ripple_test_api.h
new file mode 100644
index 0000000..75813929
--- /dev/null
+++ b/ui/views/animation/test/ink_drop_ripple_test_api.h
@@ -0,0 +1,56 @@
+// Copyright 2015 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_ANIMATION_TEST_INK_DROP_RIPPLE_TEST_API_H_
+#define UI_VIEWS_ANIMATION_TEST_INK_DROP_RIPPLE_TEST_API_H_
+
+#include <vector>
+
+#include "base/macros.h"
+#include "ui/compositor/test/multi_layer_animator_test_controller.h"
+#include "ui/compositor/test/multi_layer_animator_test_controller_delegate.h"
+
+namespace ui {
+class LayerAnimator;
+}  // namespace ui
+
+namespace views {
+class InkDropRipple;
+
+namespace test {
+
+// Test API to provide internal access to an InkDropRipple instance. This can
+// also be used to control the animations via the
+// ui::test::MultiLayerAnimatorTestController API.
+class InkDropRippleTestApi
+    : public ui::test::MultiLayerAnimatorTestController,
+      public ui::test::MultiLayerAnimatorTestControllerDelegate {
+ public:
+  explicit InkDropRippleTestApi(InkDropRipple* ink_drop_ripple);
+  ~InkDropRippleTestApi() override;
+
+  // Gets the opacity of the ink drop.
+  virtual float GetCurrentOpacity() const = 0;
+
+  // MultiLayerAnimatorTestControllerDelegate:
+  std::vector<ui::LayerAnimator*> GetLayerAnimators() override;
+
+ protected:
+  InkDropRipple* ink_drop_ripple() {
+    return static_cast<const InkDropRippleTestApi*>(this)->ink_drop_ripple();
+  }
+
+  InkDropRipple* ink_drop_ripple() const { return ink_drop_ripple_; }
+
+ private:
+  // The InkDropedRipple to provide internal access to.
+  InkDropRipple* ink_drop_ripple_;
+
+  DISALLOW_COPY_AND_ASSIGN(InkDropRippleTestApi);
+};
+
+}  // namespace test
+}  // namespace views
+
+#endif  // UI_VIEWS_ANIMATION_TEST_INK_DROP_RIPPLE_TEST_API_H_
diff --git a/ui/views/animation/test/square_ink_drop_animation_test_api.cc b/ui/views/animation/test/square_ink_drop_animation_test_api.cc
deleted file mode 100644
index e098aa0..0000000
--- a/ui/views/animation/test/square_ink_drop_animation_test_api.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2015 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/animation/test/square_ink_drop_animation_test_api.h"
-
-#include <vector>
-
-#include "base/time/time.h"
-#include "ui/compositor/layer.h"
-#include "ui/compositor/layer_animator.h"
-#include "ui/compositor/test/layer_animator_test_controller.h"
-#include "ui/views/animation/ink_drop_animation.h"
-
-namespace views {
-namespace test {
-
-SquareInkDropAnimationTestApi::SquareInkDropAnimationTestApi(
-    SquareInkDropAnimation* ink_drop_animation)
-    : InkDropAnimationTestApi(ink_drop_animation) {}
-
-SquareInkDropAnimationTestApi::~SquareInkDropAnimationTestApi() {}
-
-void SquareInkDropAnimationTestApi::CalculateCircleTransforms(
-    const gfx::Size& size,
-    InkDropTransforms* transforms_out) const {
-  ink_drop_animation()->CalculateCircleTransforms(size, transforms_out);
-}
-void SquareInkDropAnimationTestApi::CalculateRectTransforms(
-    const gfx::Size& size,
-    float corner_radius,
-    InkDropTransforms* transforms_out) const {
-  ink_drop_animation()->CalculateRectTransforms(size, corner_radius,
-                                                transforms_out);
-}
-
-float SquareInkDropAnimationTestApi::GetCurrentOpacity() const {
-  return ink_drop_animation()->GetCurrentOpacity();
-}
-
-std::vector<ui::LayerAnimator*>
-SquareInkDropAnimationTestApi::GetLayerAnimators() {
-  std::vector<ui::LayerAnimator*> animators =
-      InkDropAnimationTestApi::GetLayerAnimators();
-  animators.push_back(ink_drop_animation()->GetRootLayer()->GetAnimator());
-  for (int i = 0; i < SquareInkDropAnimation::PAINTED_SHAPE_COUNT; ++i)
-    animators.push_back(
-        ink_drop_animation()->painted_layers_[i]->GetAnimator());
-  return animators;
-}
-
-}  // namespace test
-}  // namespace views
diff --git a/ui/views/animation/test/square_ink_drop_animation_test_api.h b/ui/views/animation/test/square_ink_drop_animation_test_api.h
deleted file mode 100644
index d8b1e882..0000000
--- a/ui/views/animation/test/square_ink_drop_animation_test_api.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2015 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_ANIMATION_TEST_SQUARE_INK_DROP_ANIMATION_TEST_API_H_
-#define UI_VIEWS_ANIMATION_TEST_SQUARE_INK_DROP_ANIMATION_TEST_API_H_
-
-#include <vector>
-
-#include "base/macros.h"
-#include "ui/gfx/geometry/size.h"
-#include "ui/views/animation/square_ink_drop_animation.h"
-#include "ui/views/animation/test/ink_drop_animation_test_api.h"
-
-namespace ui {
-class LayerAnimator;
-}  // namespace ui
-
-namespace views {
-namespace test {
-
-// Test API to provide internal access to a SquareInkDropAnimation.
-class SquareInkDropAnimationTestApi : public InkDropAnimationTestApi {
- public:
-  // Make the private typedefs accessible.
-  using InkDropTransforms = SquareInkDropAnimation::InkDropTransforms;
-  using PaintedShape = SquareInkDropAnimation::PaintedShape;
-
-  explicit SquareInkDropAnimationTestApi(
-      SquareInkDropAnimation* ink_drop_animation);
-  ~SquareInkDropAnimationTestApi() override;
-
-  // Wrapper functions to the wrapped InkDropAnimation:
-  void CalculateCircleTransforms(const gfx::Size& size,
-                                 InkDropTransforms* transforms_out) const;
-  void CalculateRectTransforms(const gfx::Size& size,
-                               float corner_radius,
-                               InkDropTransforms* transforms_out) const;
-
-  // InkDropAnimationTestApi:
-  float GetCurrentOpacity() const override;
-
- protected:
-  // InkDropAnimationTestApi:
-  std::vector<ui::LayerAnimator*> GetLayerAnimators() override;
-
- private:
-  SquareInkDropAnimation* ink_drop_animation() {
-    return static_cast<const SquareInkDropAnimationTestApi*>(this)
-        ->ink_drop_animation();
-  }
-
-  SquareInkDropAnimation* ink_drop_animation() const {
-    return static_cast<SquareInkDropAnimation*>(
-        InkDropAnimationTestApi::ink_drop_animation());
-  }
-
-  DISALLOW_COPY_AND_ASSIGN(SquareInkDropAnimationTestApi);
-};
-
-}  // namespace test
-}  // namespace views
-
-#endif  // UI_VIEWS_ANIMATION_TEST_SQUARE_INK_DROP_ANIMATION_TEST_API_H_
diff --git a/ui/views/animation/test/square_ink_drop_ripple_test_api.cc b/ui/views/animation/test/square_ink_drop_ripple_test_api.cc
new file mode 100644
index 0000000..e340a7b
--- /dev/null
+++ b/ui/views/animation/test/square_ink_drop_ripple_test_api.cc
@@ -0,0 +1,52 @@
+// Copyright 2015 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/animation/test/square_ink_drop_ripple_test_api.h"
+
+#include <vector>
+
+#include "base/time/time.h"
+#include "ui/compositor/layer.h"
+#include "ui/compositor/layer_animator.h"
+#include "ui/compositor/test/layer_animator_test_controller.h"
+#include "ui/views/animation/ink_drop_ripple.h"
+
+namespace views {
+namespace test {
+
+SquareInkDropRippleTestApi::SquareInkDropRippleTestApi(
+    SquareInkDropRipple* ink_drop_ripple)
+    : InkDropRippleTestApi(ink_drop_ripple) {}
+
+SquareInkDropRippleTestApi::~SquareInkDropRippleTestApi() {}
+
+void SquareInkDropRippleTestApi::CalculateCircleTransforms(
+    const gfx::Size& size,
+    InkDropTransforms* transforms_out) const {
+  ink_drop_ripple()->CalculateCircleTransforms(size, transforms_out);
+}
+void SquareInkDropRippleTestApi::CalculateRectTransforms(
+    const gfx::Size& size,
+    float corner_radius,
+    InkDropTransforms* transforms_out) const {
+  ink_drop_ripple()->CalculateRectTransforms(size, corner_radius,
+                                             transforms_out);
+}
+
+float SquareInkDropRippleTestApi::GetCurrentOpacity() const {
+  return ink_drop_ripple()->GetCurrentOpacity();
+}
+
+std::vector<ui::LayerAnimator*>
+SquareInkDropRippleTestApi::GetLayerAnimators() {
+  std::vector<ui::LayerAnimator*> animators =
+      InkDropRippleTestApi::GetLayerAnimators();
+  animators.push_back(ink_drop_ripple()->GetRootLayer()->GetAnimator());
+  for (int i = 0; i < SquareInkDropRipple::PAINTED_SHAPE_COUNT; ++i)
+    animators.push_back(ink_drop_ripple()->painted_layers_[i]->GetAnimator());
+  return animators;
+}
+
+}  // namespace test
+}  // namespace views
diff --git a/ui/views/animation/test/square_ink_drop_ripple_test_api.h b/ui/views/animation/test/square_ink_drop_ripple_test_api.h
new file mode 100644
index 0000000..ba960280
--- /dev/null
+++ b/ui/views/animation/test/square_ink_drop_ripple_test_api.h
@@ -0,0 +1,63 @@
+// Copyright 2015 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_ANIMATION_TEST_SQUARE_INK_DROP_RIPPLE_TEST_API_H_
+#define UI_VIEWS_ANIMATION_TEST_SQUARE_INK_DROP_RIPPLE_TEST_API_H_
+
+#include <vector>
+
+#include "base/macros.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/views/animation/square_ink_drop_ripple.h"
+#include "ui/views/animation/test/ink_drop_ripple_test_api.h"
+
+namespace ui {
+class LayerAnimator;
+}  // namespace ui
+
+namespace views {
+namespace test {
+
+// Test API to provide internal access to a SquareInkDropRipple.
+class SquareInkDropRippleTestApi : public InkDropRippleTestApi {
+ public:
+  // Make the private typedefs accessible.
+  using InkDropTransforms = SquareInkDropRipple::InkDropTransforms;
+  using PaintedShape = SquareInkDropRipple::PaintedShape;
+
+  explicit SquareInkDropRippleTestApi(SquareInkDropRipple* ink_drop_ripple);
+  ~SquareInkDropRippleTestApi() override;
+
+  // Wrapper functions to the wrapped InkDropRipple:
+  void CalculateCircleTransforms(const gfx::Size& size,
+                                 InkDropTransforms* transforms_out) const;
+  void CalculateRectTransforms(const gfx::Size& size,
+                               float corner_radius,
+                               InkDropTransforms* transforms_out) const;
+
+  // InkDropRippleTestApi:
+  float GetCurrentOpacity() const override;
+
+ protected:
+  // InkDropRippleTestApi:
+  std::vector<ui::LayerAnimator*> GetLayerAnimators() override;
+
+ private:
+  SquareInkDropRipple* ink_drop_ripple() {
+    return static_cast<const SquareInkDropRippleTestApi*>(this)
+        ->ink_drop_ripple();
+  }
+
+  SquareInkDropRipple* ink_drop_ripple() const {
+    return static_cast<SquareInkDropRipple*>(
+        InkDropRippleTestApi::ink_drop_ripple());
+  }
+
+  DISALLOW_COPY_AND_ASSIGN(SquareInkDropRippleTestApi);
+};
+
+}  // namespace test
+}  // namespace views
+
+#endif  // UI_VIEWS_ANIMATION_TEST_SQUARE_INK_DROP_RIPPLE_TEST_API_H_
diff --git a/ui/views/animation/test/test_ink_drop_animation_observer.cc b/ui/views/animation/test/test_ink_drop_animation_observer.cc
deleted file mode 100644
index 8b35faa..0000000
--- a/ui/views/animation/test/test_ink_drop_animation_observer.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2016 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/animation/test/test_ink_drop_animation_observer.h"
-
-#include "ui/views/animation/ink_drop_animation.h"
-
-namespace views {
-namespace test {
-
-TestInkDropAnimationObserver::TestInkDropAnimationObserver()
-    : target_state_at_last_animation_started_(InkDropState::HIDDEN),
-      target_state_at_last_animation_ended_(InkDropState::HIDDEN) {}
-
-TestInkDropAnimationObserver::~TestInkDropAnimationObserver() {}
-
-void TestInkDropAnimationObserver::AnimationStarted(
-    InkDropState ink_drop_state) {
-  ObserverHelper::OnAnimationStarted(ink_drop_state);
-  if (ink_drop_animation_) {
-    target_state_at_last_animation_started_ =
-        ink_drop_animation_->target_ink_drop_state();
-  }
-}
-
-void TestInkDropAnimationObserver::AnimationEnded(
-    InkDropState ink_drop_state,
-    InkDropAnimationEndedReason reason) {
-  ObserverHelper::OnAnimationEnded(ink_drop_state, reason);
-  if (ink_drop_animation_) {
-    target_state_at_last_animation_ended_ =
-        ink_drop_animation_->target_ink_drop_state();
-  }
-}
-
-}  // namespace test
-}  // namespace views
diff --git a/ui/views/animation/test/test_ink_drop_animation_observer.h b/ui/views/animation/test/test_ink_drop_animation_observer.h
deleted file mode 100644
index 12c1d19..0000000
--- a/ui/views/animation/test/test_ink_drop_animation_observer.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2016 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_ANIMATION_TEST_TEST_INK_DROP_ANIMATION_OBSERVER_H_
-#define UI_VIEWS_ANIMATION_TEST_TEST_INK_DROP_ANIMATION_OBSERVER_H_
-
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/views/animation/ink_drop_animation_observer.h"
-#include "ui/views/animation/ink_drop_state.h"
-#include "ui/views/animation/test/test_ink_drop_animation_observer_helper.h"
-
-namespace views {
-class InkDropAnimation;
-
-namespace test {
-
-// Simple InkDropAnimationObserver test double that tracks if
-// InkDropAnimationObserver methods are invoked and the parameters used for the
-// last invocation.
-class TestInkDropAnimationObserver
-    : public InkDropAnimationObserver,
-      public TestInkDropAnimationObserverHelper<InkDropState> {
- public:
-  TestInkDropAnimationObserver();
-  ~TestInkDropAnimationObserver() override;
-
-  void set_ink_drop_animation(InkDropAnimation* ink_drop_animation) {
-    ink_drop_animation_ = ink_drop_animation;
-  }
-
-  InkDropState target_state_at_last_animation_started() const {
-    return target_state_at_last_animation_started_;
-  }
-
-  InkDropState target_state_at_last_animation_ended() const {
-    return target_state_at_last_animation_ended_;
-  }
-
-  // InkDropAnimationObserver:
-  void AnimationStarted(InkDropState ink_drop_state) override;
-  void AnimationEnded(InkDropState ink_drop_state,
-                      InkDropAnimationEndedReason reason) override;
-
- private:
-  // The type this inherits from. Reduces verbosity in .cc file.
-  using ObserverHelper = TestInkDropAnimationObserverHelper<InkDropState>;
-
-  // The value of InkDropAnimation::GetTargetInkDropState() the last time an
-  // InkDropAnimationStarted() event was handled. This is only valid if
-  // |ink_drop_animation_| is not null.
-  InkDropState target_state_at_last_animation_started_;
-
-  // The value of InkDropAnimation::GetTargetInkDropState() the last time an
-  // AnimationEnded() event was handled. This is only valid if
-  // |ink_drop_animation_| is not null.
-  InkDropState target_state_at_last_animation_ended_;
-
-  // An InkDropAnimation to spy info from when notifications are handled.
-  InkDropAnimation* ink_drop_animation_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestInkDropAnimationObserver);
-};
-
-}  // namespace test
-}  // namespace views
-
-#endif  // UI_VIEWS_ANIMATION_TEST_TEST_INK_DROP_ANIMATION_OBSERVER_H_
diff --git a/ui/views/animation/test/test_ink_drop_animation_observer_helper.h b/ui/views/animation/test/test_ink_drop_animation_observer_helper.h
index 63fbab2..f9e774f4 100644
--- a/ui/views/animation/test/test_ink_drop_animation_observer_helper.h
+++ b/ui/views/animation/test/test_ink_drop_animation_observer_helper.h
@@ -1,9 +1,8 @@
 // Copyright 2016 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_ANIMATION_TEST_TEST_ANIMATION_OBSERVER_H_
-#define UI_VIEWS_ANIMATION_TEST_TEST_ANIMATION_OBSERVER_H_
+#ifndef UI_VIEWS_ANIMATION_TEST_TEST_INK_DROP_ANIMATION_OBSERVER_H_
+#define UI_VIEWS_ANIMATION_TEST_TEST_INK_DROP_ANIMATION_OBSERVER_H_
 
 #include <algorithm>
 
@@ -66,12 +65,12 @@
   //
   // Example:
   //
-  //   TestInkDropAnimationObserver observer;
-  //   observer.set_ink_drop_animation(ink_drop_animation);
+  //   TestInkDropAnimationObserverHelper<int> observer;
+  //   event_source.set_observer(observer);
   //   EXPECT_TRUE(observer.AnimationHasNotStarted());
   //
 
-  // Passes *_TRUE assertions when an InkDropAnimationStarted() event has been
+  // Passes *_TRUE assertions when an AnimationStarted() event has been
   // observed.
   testing::AssertionResult AnimationHasStarted() {
     if (last_animation_started_ordinal() > 0) {
@@ -82,8 +81,8 @@
     return testing::AssertionFailure() << "Animations have not started.";
   }
 
-  // Passes *_TRUE assertions when an InkDropAnimationStarted() event has NOT
-  // been observed.
+  // Passes *_TRUE assertions when an AnimationStarted() event has NOT been
+  // observed.
   testing::AssertionResult AnimationHasNotStarted() {
     if (last_animation_started_ordinal() < 0)
       return testing::AssertionSuccess();
@@ -92,8 +91,7 @@
                                        << ".";
   }
 
-  // Passes *_TRUE assertions when an InkDropAnimationEnded() event has been
-  // observed.
+  // Passes *_TRUE assertions when an AnimationEnded() event has been observed.
   testing::AssertionResult AnimationHasEnded() {
     if (last_animation_ended_ordinal() > 0) {
       return testing::AssertionSuccess() << "Animations were ended at ordinal="
@@ -103,7 +101,7 @@
     return testing::AssertionFailure() << "Animations have not ended.";
   }
 
-  // Passes *_TRUE assertions when an InkDropAnimationEnded() event has NOT been
+  // Passes *_TRUE assertions when an AnimationEnded() event has NOT been
   // observed.
   testing::AssertionResult AnimationHasNotEnded() {
     if (last_animation_ended_ordinal() < 0)
@@ -140,4 +138,4 @@
 }  // namespace test
 }  // namespace views
 
-#endif  // UI_VIEWS_ANIMATION_TEST_TEST_ANIMATION_OBSERVER_H_
+#endif  // UI_VIEWS_ANIMATION_TEST_TEST_INK_DROP_ANIMATION_OBSERVER_H_
diff --git a/ui/views/animation/test/test_ink_drop_host.cc b/ui/views/animation/test/test_ink_drop_host.cc
index f264e25c..a7bf5ad 100644
--- a/ui/views/animation/test/test_ink_drop_host.cc
+++ b/ui/views/animation/test/test_ink_drop_host.cc
@@ -7,43 +7,43 @@
 #include "base/memory/ptr_util.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/views/animation/ink_drop_hover.h"
-#include "ui/views/animation/square_ink_drop_animation.h"
+#include "ui/views/animation/square_ink_drop_ripple.h"
 #include "ui/views/animation/test/ink_drop_hover_test_api.h"
-#include "ui/views/animation/test/square_ink_drop_animation_test_api.h"
+#include "ui/views/animation/test/square_ink_drop_ripple_test_api.h"
 
 namespace views {
 
 namespace {
 
-// Test specific subclass of InkDropAnimation that returns a test api from
+// Test specific subclass of InkDropRipple that returns a test api from
 // GetTestApi().
-class TestInkDropAnimation : public SquareInkDropAnimation {
+class TestInkDropRipple : public SquareInkDropRipple {
  public:
-  TestInkDropAnimation(const gfx::Size& large_size,
-                       int large_corner_radius,
-                       const gfx::Size& small_size,
-                       int small_corner_radius,
-                       const gfx::Point& center_point,
-                       SkColor color)
-      : SquareInkDropAnimation(large_size,
-                               large_corner_radius,
-                               small_size,
-                               small_corner_radius,
-                               center_point,
-                               color) {}
+  TestInkDropRipple(const gfx::Size& large_size,
+                    int large_corner_radius,
+                    const gfx::Size& small_size,
+                    int small_corner_radius,
+                    const gfx::Point& center_point,
+                    SkColor color)
+      : SquareInkDropRipple(large_size,
+                            large_corner_radius,
+                            small_size,
+                            small_corner_radius,
+                            center_point,
+                            color) {}
 
-  ~TestInkDropAnimation() override {}
+  ~TestInkDropRipple() override {}
 
-  test::InkDropAnimationTestApi* GetTestApi() override {
+  test::InkDropRippleTestApi* GetTestApi() override {
     if (!test_api_)
-      test_api_.reset(new test::SquareInkDropAnimationTestApi(this));
+      test_api_.reset(new test::SquareInkDropRippleTestApi(this));
     return test_api_.get();
   }
 
  private:
-  std::unique_ptr<test::InkDropAnimationTestApi> test_api_;
+  std::unique_ptr<test::InkDropRippleTestApi> test_api_;
 
-  DISALLOW_COPY_AND_ASSIGN(TestInkDropAnimation);
+  DISALLOW_COPY_AND_ASSIGN(TestInkDropRipple);
 };
 
 // Test specific subclass of InkDropHover that returns a test api from
@@ -87,14 +87,13 @@
   --num_ink_drop_layers_;
 }
 
-std::unique_ptr<InkDropAnimation> TestInkDropHost::CreateInkDropAnimation()
-    const {
+std::unique_ptr<InkDropRipple> TestInkDropHost::CreateInkDropRipple() const {
   gfx::Size size(10, 10);
-  std::unique_ptr<InkDropAnimation> animation(
-      new TestInkDropAnimation(size, 5, size, 5, gfx::Point(), SK_ColorBLACK));
+  std::unique_ptr<InkDropRipple> ripple(
+      new TestInkDropRipple(size, 5, size, 5, gfx::Point(), SK_ColorBLACK));
   if (disable_timers_for_test_)
-    animation->GetTestApi()->SetDisableAnimationTimers(true);
-  return animation;
+    ripple->GetTestApi()->SetDisableAnimationTimers(true);
+  return ripple;
 }
 
 std::unique_ptr<InkDropHover> TestInkDropHost::CreateInkDropHover() const {
diff --git a/ui/views/animation/test/test_ink_drop_host.h b/ui/views/animation/test/test_ink_drop_host.h
index 7bb18e1a..9379c5d 100644
--- a/ui/views/animation/test/test_ink_drop_host.h
+++ b/ui/views/animation/test/test_ink_drop_host.h
@@ -30,7 +30,7 @@
   // TestInkDropHost:
   void AddInkDropLayer(ui::Layer* ink_drop_layer) override;
   void RemoveInkDropLayer(ui::Layer* ink_drop_layer) override;
-  std::unique_ptr<InkDropAnimation> CreateInkDropAnimation() const override;
+  std::unique_ptr<InkDropRipple> CreateInkDropRipple() const override;
   std::unique_ptr<InkDropHover> CreateInkDropHover() const override;
 
  private:
@@ -38,7 +38,7 @@
 
   bool should_show_hover_;
 
-  // When true, the InkDropAnimation/InkDropHover instances will have their
+  // When true, the InkDropRipple/InkDropHover instances will have their
   // timers disabled after creation.
   bool disable_timers_for_test_;
 
diff --git a/ui/views/animation/test/test_ink_drop_ripple_observer.cc b/ui/views/animation/test/test_ink_drop_ripple_observer.cc
new file mode 100644
index 0000000..f6b6747
--- /dev/null
+++ b/ui/views/animation/test/test_ink_drop_ripple_observer.cc
@@ -0,0 +1,37 @@
+// Copyright 2016 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/animation/test/test_ink_drop_ripple_observer.h"
+
+#include "ui/views/animation/ink_drop_ripple.h"
+
+namespace views {
+namespace test {
+
+TestInkDropRippleObserver::TestInkDropRippleObserver()
+    : target_state_at_last_animation_started_(InkDropState::HIDDEN),
+      target_state_at_last_animation_ended_(InkDropState::HIDDEN) {}
+
+TestInkDropRippleObserver::~TestInkDropRippleObserver() {}
+
+void TestInkDropRippleObserver::AnimationStarted(InkDropState ink_drop_state) {
+  ObserverHelper::OnAnimationStarted(ink_drop_state);
+  if (ink_drop_ripple_) {
+    target_state_at_last_animation_started_ =
+        ink_drop_ripple_->target_ink_drop_state();
+  }
+}
+
+void TestInkDropRippleObserver::AnimationEnded(
+    InkDropState ink_drop_state,
+    InkDropAnimationEndedReason reason) {
+  ObserverHelper::OnAnimationEnded(ink_drop_state, reason);
+  if (ink_drop_ripple_) {
+    target_state_at_last_animation_ended_ =
+        ink_drop_ripple_->target_ink_drop_state();
+  }
+}
+
+}  // namespace test
+}  // namespace views
diff --git a/ui/views/animation/test/test_ink_drop_ripple_observer.h b/ui/views/animation/test/test_ink_drop_ripple_observer.h
new file mode 100644
index 0000000..33d5f4a
--- /dev/null
+++ b/ui/views/animation/test/test_ink_drop_ripple_observer.h
@@ -0,0 +1,67 @@
+// Copyright 2016 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_ANIMATION_TEST_TEST_INK_DROP_RIPPLE_OBSERVER_H_
+#define UI_VIEWS_ANIMATION_TEST_TEST_INK_DROP_RIPPLE_OBSERVER_H_
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/views/animation/ink_drop_ripple_observer.h"
+#include "ui/views/animation/ink_drop_state.h"
+#include "ui/views/animation/test/test_ink_drop_animation_observer_helper.h"
+
+namespace views {
+class InkDropRipple;
+
+namespace test {
+
+// Simple InkDropRippleObserver test double that tracks if InkDropRippleObserver
+// methods are invoked and the parameters used for the last invocation.
+class TestInkDropRippleObserver
+    : public InkDropRippleObserver,
+      public TestInkDropAnimationObserverHelper<InkDropState> {
+ public:
+  TestInkDropRippleObserver();
+  ~TestInkDropRippleObserver() override;
+
+  void set_ink_drop_ripple(InkDropRipple* ink_drop_ripple) {
+    ink_drop_ripple_ = ink_drop_ripple;
+  }
+
+  InkDropState target_state_at_last_animation_started() const {
+    return target_state_at_last_animation_started_;
+  }
+
+  InkDropState target_state_at_last_animation_ended() const {
+    return target_state_at_last_animation_ended_;
+  }
+
+  // InkDropRippleObserver:
+  void AnimationStarted(InkDropState ink_drop_state) override;
+  void AnimationEnded(InkDropState ink_drop_state,
+                      InkDropAnimationEndedReason reason) override;
+
+ private:
+  // The type this inherits from. Reduces verbosity in .cc file.
+  using ObserverHelper = TestInkDropAnimationObserverHelper<InkDropState>;
+
+  // The value of InkDropRipple::GetTargetInkDropState() the last time an
+  // AnimationStarted() event was handled. This is only valid if
+  // |ink_drop_ripple_| is not null.
+  InkDropState target_state_at_last_animation_started_;
+
+  // The value of InkDropRipple::GetTargetInkDropState() the last time an
+  // AnimationEnded() event was handled. This is only valid if
+  // |ink_drop_ripple_| is not null.
+  InkDropState target_state_at_last_animation_ended_;
+
+  // An InkDropRipple to spy info from when notifications are handled.
+  InkDropRipple* ink_drop_ripple_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestInkDropRippleObserver);
+};
+
+}  // namespace test
+}  // namespace views
+
+#endif  // UI_VIEWS_ANIMATION_TEST_TEST_INK_DROP_RIPPLE_OBSERVER_H_
diff --git a/ui/views/color_chooser/color_chooser_view.cc b/ui/views/color_chooser/color_chooser_view.cc
index 0e52e96a..ca3f203 100644
--- a/ui/views/color_chooser/color_chooser_view.cc
+++ b/ui/views/color_chooser/color_chooser_view.cc
@@ -11,7 +11,6 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "skia/ext/refptr.h"
 #include "third_party/skia/include/core/SkPaint.h"
 #include "third_party/skia/include/core/SkPath.h"
 #include "third_party/skia/include/effects/SkGradientShader.h"
diff --git a/ui/views/controls/button/label_button.cc b/ui/views/controls/button/label_button.cc
index f2371ea..08c0a033 100644
--- a/ui/views/controls/button/label_button.cc
+++ b/ui/views/controls/button/label_button.cc
@@ -18,7 +18,7 @@
 #include "ui/gfx/font_list.h"
 #include "ui/gfx/geometry/vector2d.h"
 #include "ui/native_theme/native_theme.h"
-#include "ui/views/animation/flood_fill_ink_drop_animation.h"
+#include "ui/views/animation/flood_fill_ink_drop_ripple.h"
 #include "ui/views/animation/ink_drop_hover.h"
 #include "ui/views/background.h"
 #include "ui/views/controls/button/label_button_border.h"
@@ -419,13 +419,11 @@
   ink_drop_container_->SetVisible(false);
 }
 
-std::unique_ptr<views::InkDropAnimation> LabelButton::CreateInkDropAnimation()
-    const {
-  return GetText().empty()
-             ? CustomButton::CreateInkDropAnimation()
-             : base::WrapUnique(new views::FloodFillInkDropAnimation(
-                   GetLocalBounds(), GetInkDropCenter(),
-                   GetInkDropBaseColor()));
+std::unique_ptr<views::InkDropRipple> LabelButton::CreateInkDropRipple() const {
+  return GetText().empty() ? CustomButton::CreateInkDropRipple()
+                           : base::WrapUnique(new views::FloodFillInkDropRipple(
+                                 GetLocalBounds(), GetInkDropCenter(),
+                                 GetInkDropBaseColor()));
 }
 
 std::unique_ptr<views::InkDropHover> LabelButton::CreateInkDropHover() const {
diff --git a/ui/views/controls/button/label_button.h b/ui/views/controls/button/label_button.h
index a7e3a29..1fbb003 100644
--- a/ui/views/controls/button/label_button.h
+++ b/ui/views/controls/button/label_button.h
@@ -19,7 +19,7 @@
 
 namespace views {
 
-class InkDropAnimation;
+class InkDropRipple;
 class InkDropHover;
 class LabelButtonBorder;
 class Painter;
@@ -104,7 +104,7 @@
   void EnableCanvasFlippingForRTLUI(bool flip) override;
   void AddInkDropLayer(ui::Layer* ink_drop_layer) override;
   void RemoveInkDropLayer(ui::Layer* ink_drop_layer) override;
-  std::unique_ptr<InkDropAnimation> CreateInkDropAnimation() const override;
+  std::unique_ptr<InkDropRipple> CreateInkDropRipple() const override;
   std::unique_ptr<InkDropHover> CreateInkDropHover() const override;
   gfx::Point GetInkDropCenter() const override;
 
diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc
index 6290ab9..1dde6bc 100644
--- a/ui/views/controls/menu/menu_controller.cc
+++ b/ui/views/controls/menu/menu_controller.cc
@@ -1443,11 +1443,12 @@
     return false;
   }
 
-  gfx::NativeWindow window_under_mouse =
-      display::Screen::GetScreen()->GetWindowUnderCursor();
   // TODO(oshima): Replace with views only API.
-  if (!owner_ || window_under_mouse != owner_->GetNativeWindow())
+  if (!owner_ ||
+      !display::Screen::GetScreen()->IsWindowUnderCursor(
+          owner_->GetNativeWindow())) {
     return false;
+  }
 
   // The user moved the mouse outside the menu and over the owning window. See
   // if there is a sibling menu we should show.
diff --git a/ui/views/mouse_watcher_view_host.cc b/ui/views/mouse_watcher_view_host.cc
index fdf88dd9..b6856e03 100644
--- a/ui/views/mouse_watcher_view_host.cc
+++ b/ui/views/mouse_watcher_view_host.cc
@@ -49,8 +49,8 @@
   if (!widget)
     return false;
 
-  return display::Screen::GetScreen()->GetWindowUnderCursor() ==
-         widget->GetNativeWindow();
+  return display::Screen::GetScreen()->IsWindowUnderCursor(
+      widget->GetNativeWindow());
 }
 
 }  // namespace views
diff --git a/ui/views/mus/aura_init.cc b/ui/views/mus/aura_init.cc
index c3217f84..eff1450 100644
--- a/ui/views/mus/aura_init.cc
+++ b/ui/views/mus/aura_init.cc
@@ -91,7 +91,7 @@
 
 // Initialize the skia font code to go ask fontconfig underneath.
 #if defined(OS_LINUX) && !defined(OS_ANDROID)
-  font_loader_ = skia::AdoptRef(new font_service::FontLoader(connector));
+  font_loader_ = sk_make_sp<font_service::FontLoader>(connector);
   SkFontConfigInterface::SetGlobal(font_loader_.get());
 #endif
 
diff --git a/ui/views/mus/aura_init.h b/ui/views/mus/aura_init.h
index de09d8e..9330845 100644
--- a/ui/views/mus/aura_init.h
+++ b/ui/views/mus/aura_init.h
@@ -10,7 +10,7 @@
 
 #include "base/macros.h"
 #include "build/build_config.h"
-#include "skia/ext/refptr.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
 #include "ui/views/mus/mus_export.h"
 
 namespace aura {
@@ -39,7 +39,7 @@
   void InitializeResources(shell::Connector* connector);
 
 #if defined(OS_LINUX) && !defined(OS_ANDROID)
-  skia::RefPtr<font_service::FontLoader> font_loader_;
+  sk_sp<font_service::FontLoader> font_loader_;
 #endif
 
   const std::string resource_file_;
diff --git a/ui/views/mus/native_widget_mus.cc b/ui/views/mus/native_widget_mus.cc
index 45b07ff..a907856 100644
--- a/ui/views/mus/native_widget_mus.cc
+++ b/ui/views/mus/native_widget_mus.cc
@@ -634,6 +634,10 @@
   return GetWindowBoundsInScreen();
 }
 
+std::string NativeWidgetMus::GetWorkspace() const {
+  return std::string();
+}
+
 void NativeWidgetMus::SetBounds(const gfx::Rect& bounds) {
   if (!window_tree_host_)
     return;
@@ -709,9 +713,11 @@
 
   window_tree_host_->Show();
   GetNativeWindow()->Show();
-  if (state != ui::SHOW_STATE_INACTIVE)
-    Activate();
-  GetWidget()->SetInitialFocus(state);
+  if (native_widget_delegate_->CanActivate()) {
+    if (state != ui::SHOW_STATE_INACTIVE)
+      Activate();
+    GetWidget()->SetInitialFocus(state);
+  }
 }
 
 bool NativeWidgetMus::IsVisible() const {
diff --git a/ui/views/mus/native_widget_mus.h b/ui/views/mus/native_widget_mus.h
index 5dd2aca..c8ce6a29 100644
--- a/ui/views/mus/native_widget_mus.h
+++ b/ui/views/mus/native_widget_mus.h
@@ -117,6 +117,7 @@
   gfx::Rect GetWindowBoundsInScreen() const override;
   gfx::Rect GetClientAreaBoundsInScreen() const override;
   gfx::Rect GetRestoredBounds() const override;
+  std::string GetWorkspace() const override;
   void SetBounds(const gfx::Rect& bounds) override;
   void SetSize(const gfx::Size& size) override;
   void StackAbove(gfx::NativeView native_view) override;
diff --git a/ui/views/mus/native_widget_mus_unittest.cc b/ui/views/mus/native_widget_mus_unittest.cc
index e987d2c..0ed22b8e 100644
--- a/ui/views/mus/native_widget_mus_unittest.cc
+++ b/ui/views/mus/native_widget_mus_unittest.cc
@@ -132,6 +132,26 @@
   WidgetFocusManager::GetInstance()->RemoveFocusChangeListener(&focus_listener);
 }
 
+// Tests that showing a non-activatable widget does not activate it.
+// TODO(jamescook): Remove this test when widget_interactive_uittests.cc runs
+// under mus.
+TEST_F(NativeWidgetMusTest, ShowNonActivatableWidget) {
+  Widget widget;
+  WidgetActivationObserver activation_observer(&widget);
+  Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_BUBBLE);
+  params.activatable = Widget::InitParams::ACTIVATABLE_NO;
+  params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+  params.bounds = gfx::Rect(10, 20, 100, 200);
+  widget.Init(params);
+  widget.Show();
+
+  // The widget is not currently active.
+  EXPECT_FALSE(widget.IsActive());
+
+  // The widget was never active.
+  EXPECT_EQ(0u, activation_observer.changes().size());
+}
+
 // Tests that a window with an icon sets the mus::Window icon property.
 TEST_F(NativeWidgetMusTest, AppIcon) {
   // Create a Widget with a bitmap as the icon.
diff --git a/ui/views/mus/screen_mus.cc b/ui/views/mus/screen_mus.cc
index eb853388..b3baf30 100644
--- a/ui/views/mus/screen_mus.cc
+++ b/ui/views/mus/screen_mus.cc
@@ -7,6 +7,7 @@
 #include "mojo/converters/geometry/geometry_type_converters.h"
 #include "services/shell/public/cpp/connection.h"
 #include "services/shell/public/cpp/connector.h"
+#include "ui/aura/window.h"
 #include "ui/display/display_observer.h"
 #include "ui/gfx/display_finder.h"
 #include "ui/views/mus/screen_mus_delegate.h"
@@ -173,9 +174,12 @@
   return delegate_->GetCursorScreenPoint();
 }
 
-gfx::NativeWindow ScreenMus::GetWindowUnderCursor() {
-  NOTIMPLEMENTED();
-  return nullptr;
+bool ScreenMus::IsWindowUnderCursor(gfx::NativeWindow window) {
+  if (!window)
+    return false;
+
+  return window->IsVisible() &&
+      window->GetBoundsInScreen().Contains(GetCursorScreenPoint());
 }
 
 gfx::NativeWindow ScreenMus::GetWindowAtScreenPoint(const gfx::Point& point) {
diff --git a/ui/views/mus/screen_mus.h b/ui/views/mus/screen_mus.h
index dd13f4b..986ae2d 100644
--- a/ui/views/mus/screen_mus.h
+++ b/ui/views/mus/screen_mus.h
@@ -44,7 +44,7 @@
 
   // display::Screen:
   gfx::Point GetCursorScreenPoint() override;
-  gfx::NativeWindow GetWindowUnderCursor() override;
+  bool IsWindowUnderCursor(gfx::NativeWindow window) override;
   gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override;
   display::Display GetPrimaryDisplay() const override;
   display::Display GetDisplayNearestWindow(gfx::NativeView view) const override;
diff --git a/ui/views/mus/window_manager_connection.cc b/ui/views/mus/window_manager_connection.cc
index eff9a443..f52771a 100644
--- a/ui/views/mus/window_manager_connection.cc
+++ b/ui/views/mus/window_manager_connection.cc
@@ -143,12 +143,20 @@
     mus::WindowTreeConnection* connection) {}
 
 void WindowManagerConnection::OnEventObserved(const ui::Event& event) {
+  if (!event.IsLocatedEvent())
+    return;
+  // The mojo input events type converter uses the event root_location field
+  // to store screen coordinates. Screen coordinates really should be returned
+  // separately. See http://crbug.com/608547
+  gfx::Point location_in_screen = event.AsLocatedEvent()->root_location();
   if (event.type() == ui::ET_MOUSE_PRESSED) {
-    FOR_EACH_OBSERVER(PointerWatcher, pointer_watchers_,
-                      OnMousePressed(*event.AsMouseEvent()));
+    FOR_EACH_OBSERVER(
+        PointerWatcher, pointer_watchers_,
+        OnMousePressed(*event.AsMouseEvent(), location_in_screen));
   } else if (event.type() == ui::ET_TOUCH_PRESSED) {
-    FOR_EACH_OBSERVER(PointerWatcher, pointer_watchers_,
-                      OnTouchPressed(*event.AsTouchEvent()));
+    FOR_EACH_OBSERVER(
+        PointerWatcher, pointer_watchers_,
+        OnTouchPressed(*event.AsTouchEvent(), location_in_screen));
   }
 }
 
diff --git a/ui/views/mus/window_manager_connection_unittest.cc b/ui/views/mus/window_manager_connection_unittest.cc
index 2bab040..aba2644 100644
--- a/ui/views/mus/window_manager_connection_unittest.cc
+++ b/ui/views/mus/window_manager_connection_unittest.cc
@@ -25,10 +25,12 @@
   void Reset() { last_event_.reset(); }
 
   // PointerWatcher:
-  void OnMousePressed(const ui::MouseEvent& event) override {
+  void OnMousePressed(const ui::MouseEvent& event,
+                      const gfx::Point& location_in_screen) override {
     last_event_ = ui::Event::Clone(event);
   }
-  void OnTouchPressed(const ui::TouchEvent& event) override {
+  void OnTouchPressed(const ui::TouchEvent& event,
+                      const gfx::Point& location_in_screen) override {
     last_event_ = ui::Event::Clone(event);
   }
 
diff --git a/ui/views/pointer_watcher.h b/ui/views/pointer_watcher.h
index dc7fa8d..34c5f9f 100644
--- a/ui/views/pointer_watcher.h
+++ b/ui/views/pointer_watcher.h
@@ -7,6 +7,10 @@
 
 #include "ui/views/views_export.h"
 
+namespace gfx {
+class Point;
+}
+
 namespace ui {
 class MouseEvent;
 class TouchEvent;
@@ -22,8 +26,10 @@
  public:
   virtual ~PointerWatcher() {}
 
-  virtual void OnMousePressed(const ui::MouseEvent& event) = 0;
-  virtual void OnTouchPressed(const ui::TouchEvent& event) = 0;
+  virtual void OnMousePressed(const ui::MouseEvent& event,
+                              const gfx::Point& location_in_screen) = 0;
+  virtual void OnTouchPressed(const ui::TouchEvent& event,
+                              const gfx::Point& location_in_screen) = 0;
 };
 
 }  // namespace views
diff --git a/ui/views/style/mac/dialog_button_border_mac.cc b/ui/views/style/mac/dialog_button_border_mac.cc
index bcb6de6..232c66d9 100644
--- a/ui/views/style/mac/dialog_button_border_mac.cc
+++ b/ui/views/style/mac/dialog_button_border_mac.cc
@@ -5,7 +5,6 @@
 #include "ui/views/style/mac/dialog_button_border_mac.h"
 
 #include "base/logging.h"
-#include "skia/ext/refptr.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkDrawLooper.h"
 #include "third_party/skia/include/core/SkPaint.h"
diff --git a/ui/views/views.gyp b/ui/views/views.gyp
index 1a58df7..dc3183b3 100644
--- a/ui/views/views.gyp
+++ b/ui/views/views.gyp
@@ -16,8 +16,8 @@
       'animation/bounds_animator.h',
       'animation/button_ink_drop_delegate.cc',
       'animation/button_ink_drop_delegate.h',
-      'animation/ink_drop_animation.cc',
-      'animation/ink_drop_animation.h',
+      'animation/ink_drop_ripple.cc',
+      'animation/ink_drop_ripple.h',
       'animation/ink_drop_animation_controller.h',
       'animation/ink_drop_animation_controller_factory.cc',
       'animation/ink_drop_animation_controller_factory.h',
@@ -25,7 +25,7 @@
       'animation/ink_drop_animation_controller_impl.h',
       'animation/ink_drop_animation_ended_reason.cc',
       'animation/ink_drop_animation_ended_reason.h',
-      'animation/ink_drop_animation_observer.h',
+      'animation/ink_drop_ripple_observer.h',
       'animation/ink_drop_delegate.h',
       'animation/ink_drop_host.h',
       'animation/ink_drop_host_view.cc',
@@ -39,10 +39,10 @@
       'animation/ink_drop_state.h',
       'animation/scroll_animator.cc',
       'animation/scroll_animator.h',
-      'animation/flood_fill_ink_drop_animation.cc',
-      'animation/flood_fill_ink_drop_animation.h',
-      'animation/square_ink_drop_animation.cc',
-      'animation/square_ink_drop_animation.h',
+      'animation/flood_fill_ink_drop_ripple.cc',
+      'animation/flood_fill_ink_drop_ripple.h',
+      'animation/square_ink_drop_ripple.cc',
+      'animation/square_ink_drop_ripple.h',
       'background.cc',
       'background.h',
       'border.cc',
@@ -491,18 +491,18 @@
       'widget/desktop_aura/desktop_window_tree_host_ozone.cc',
     ],
     'views_test_support_sources': [
-      'animation/test/flood_fill_ink_drop_animation_test_api.cc',
-      'animation/test/flood_fill_ink_drop_animation_test_api.h',
-      'animation/test/ink_drop_animation_test_api.cc',
-      'animation/test/ink_drop_animation_test_api.h',
+      'animation/test/flood_fill_ink_drop_ripple_test_api.cc',
+      'animation/test/flood_fill_ink_drop_ripple_test_api.h',
+      'animation/test/ink_drop_ripple_test_api.cc',
+      'animation/test/ink_drop_ripple_test_api.h',
       'animation/test/ink_drop_animation_controller_impl_test_api.cc',
       'animation/test/ink_drop_animation_controller_impl_test_api.h',
       'animation/test/ink_drop_hover_test_api.cc',
       'animation/test/ink_drop_hover_test_api.h',
-      'animation/test/square_ink_drop_animation_test_api.cc',
-      'animation/test/square_ink_drop_animation_test_api.h',
-      'animation/test/test_ink_drop_animation_observer.cc',
-      'animation/test/test_ink_drop_animation_observer.h',
+      'animation/test/square_ink_drop_ripple_test_api.cc',
+      'animation/test/square_ink_drop_ripple_test_api.h',
+      'animation/test/test_ink_drop_ripple_observer.cc',
+      'animation/test/test_ink_drop_ripple_observer.h',
       'animation/test/test_ink_drop_animation_observer_helper.h',
       'animation/test/test_ink_drop_host.cc',
       'animation/test/test_ink_drop_host.h',
@@ -572,9 +572,9 @@
       'animation/bounds_animator_unittest.cc',
       'animation/ink_drop_animation_controller_factory_unittest.cc',
       'animation/ink_drop_animation_controller_impl_unittest.cc',
-      'animation/ink_drop_animation_unittest.cc',
+      'animation/ink_drop_ripple_unittest.cc',
       'animation/ink_drop_hover_unittest.cc',
-      'animation/square_ink_drop_animation_unittest.cc',
+      'animation/square_ink_drop_ripple_unittest.cc',
       'bubble/bubble_border_unittest.cc',
       'bubble/bubble_dialog_delegate_unittest.cc',
       'bubble/bubble_frame_view_unittest.cc',
diff --git a/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc b/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
index 6dc7c5f..99809d1 100644
--- a/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
+++ b/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
@@ -675,6 +675,11 @@
       desktop_window_tree_host_->GetRestoredBounds() : gfx::Rect();
 }
 
+std::string DesktopNativeWidgetAura::GetWorkspace() const {
+  return content_window_ ?
+      desktop_window_tree_host_->GetWorkspace() : std::string();
+}
+
 void DesktopNativeWidgetAura::SetBounds(const gfx::Rect& bounds) {
   if (!content_window_)
     return;
@@ -1156,6 +1161,11 @@
   native_widget_delegate_->OnNativeWidgetSizeChanged(new_bounds.size());
 }
 
+void DesktopNativeWidgetAura::OnHostWorkspaceChanged(
+    const aura::WindowTreeHost* host) {
+  native_widget_delegate_->OnNativeWidgetWorkspaceChanged();
+}
+
 void DesktopNativeWidgetAura::OnHostMoved(const aura::WindowTreeHost* host,
                                           const gfx::Point& new_origin) {
   TRACE_EVENT1("views", "DesktopNativeWidgetAura::OnHostMoved",
diff --git a/ui/views/widget/desktop_aura/desktop_native_widget_aura.h b/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
index a8c42b6a..61adcdd 100644
--- a/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
+++ b/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
@@ -123,6 +123,7 @@
   gfx::Rect GetWindowBoundsInScreen() const override;
   gfx::Rect GetClientAreaBoundsInScreen() const override;
   gfx::Rect GetRestoredBounds() const override;
+  std::string GetWorkspace() const override;
   void SetBounds(const gfx::Rect& bounds) override;
   void SetSize(const gfx::Size& size) override;
   void StackAbove(gfx::NativeView native_view) override;
@@ -225,6 +226,7 @@
   // Overridden from aura::WindowTreeHostObserver:
   void OnHostCloseRequested(const aura::WindowTreeHost* host) override;
   void OnHostResized(const aura::WindowTreeHost* host) override;
+  void OnHostWorkspaceChanged(const aura::WindowTreeHost* host) override;
   void OnHostMoved(const aura::WindowTreeHost* host,
                    const gfx::Point& new_origin) override;
 
diff --git a/ui/views/widget/desktop_aura/desktop_screen_x11.cc b/ui/views/widget/desktop_aura/desktop_screen_x11.cc
index 73c1704..e787503 100644
--- a/ui/views/widget/desktop_aura/desktop_screen_x11.cc
+++ b/ui/views/widget/desktop_aura/desktop_screen_x11.cc
@@ -149,8 +149,8 @@
   return PixelToDIPPoint(gfx::Point(root_x, root_y));
 }
 
-gfx::NativeWindow DesktopScreenX11::GetWindowUnderCursor() {
-  return GetWindowAtScreenPoint(GetCursorScreenPoint());
+bool DesktopScreenX11::IsWindowUnderCursor(gfx::NativeWindow window) {
+  return GetWindowAtScreenPoint(GetCursorScreenPoint()) == window;
 }
 
 gfx::NativeWindow DesktopScreenX11::GetWindowAtScreenPoint(
diff --git a/ui/views/widget/desktop_aura/desktop_screen_x11.h b/ui/views/widget/desktop_aura/desktop_screen_x11.h
index 5c6fdf7..2cd96023 100644
--- a/ui/views/widget/desktop_aura/desktop_screen_x11.h
+++ b/ui/views/widget/desktop_aura/desktop_screen_x11.h
@@ -38,7 +38,7 @@
 
   // Overridden from display::Screen:
   gfx::Point GetCursorScreenPoint() override;
-  gfx::NativeWindow GetWindowUnderCursor() override;
+  bool IsWindowUnderCursor(gfx::NativeWindow window) override;
   gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override;
   int GetNumDisplays() const override;
   std::vector<display::Display> GetAllDisplays() const override;
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host.h b/ui/views/widget/desktop_aura/desktop_window_tree_host.h
index fe903a4..7eee095e 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host.h
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host.h
@@ -90,6 +90,7 @@
   virtual gfx::Rect GetWindowBoundsInScreen() const = 0;
   virtual gfx::Rect GetClientAreaBoundsInScreen() const = 0;
   virtual gfx::Rect GetRestoredBounds() const = 0;
+  virtual std::string GetWorkspace() const = 0;
 
   virtual gfx::Rect GetWorkAreaBoundsInScreen() const = 0;
 
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
index e98f9a99..7591042b 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
@@ -290,6 +290,10 @@
   return display::win::ScreenWin::ScreenToDIPRect(GetHWND(), pixel_bounds);
 }
 
+std::string DesktopWindowTreeHostWin::GetWorkspace() const {
+  return std::string();
+}
+
 gfx::Rect DesktopWindowTreeHostWin::GetWorkAreaBoundsInScreen() const {
   MONITORINFO monitor_info;
   monitor_info.cbSize = sizeof(monitor_info);
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
index 8ec159e..f357a5c 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
@@ -66,6 +66,7 @@
   gfx::Rect GetWindowBoundsInScreen() const override;
   gfx::Rect GetClientAreaBoundsInScreen() const override;
   gfx::Rect GetRestoredBounds() const override;
+  std::string GetWorkspace() const override;
   gfx::Rect GetWorkAreaBoundsInScreen() const override;
   void SetShape(SkRegion* native_region) override;
   void Activate() override;
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
index 39aad49..f792797 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
@@ -14,6 +14,7 @@
 
 #include "base/command_line.h"
 #include "base/memory/ptr_util.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/trace_event/trace_event.h"
@@ -166,7 +167,6 @@
       window_mapped_(false),
       is_fullscreen_(false),
       is_always_on_top_(false),
-      is_override_redirect_(false),
       use_native_frame_(false),
       should_maximize_after_map_(false),
       use_argb_visual_(false),
@@ -564,6 +564,13 @@
   return GetWindowBoundsInScreen();
 }
 
+std::string DesktopWindowTreeHostX11::GetWorkspace() const {
+  int workspace_id;
+  if (ui::GetIntProperty(xwindow_, "_NET_WM_DESKTOP", &workspace_id))
+    return base::IntToString(workspace_id);
+  return std::string();
+}
+
 gfx::Rect DesktopWindowTreeHostX11::GetWorkAreaBoundsInScreen() const {
   return ToDIPRect(GetWorkAreaBoundsInPixels());
 }
@@ -970,11 +977,6 @@
   if (window_mapped_) {
     XWithdrawWindow(xdisplay_, xwindow_, 0);
     window_mapped_ = false;
-    if (is_override_redirect_) {
-      // If we're override-redirect, we won't receive an UnmapNotify message,
-      // so run the unmap handler directly.
-      OnX11WindowUnmapped();
-    }
   }
   native_widget_delegate_->OnNativeWidgetVisibilityChanged(false);
 }
@@ -1129,8 +1131,6 @@
   if (swa.override_redirect)
     attribute_mask |= CWOverrideRedirect;
 
-  is_override_redirect_ = swa.override_redirect;
-
   Visual* visual;
   int depth;
   ui::ChooseVisualForWindow(&visual, &depth);
@@ -1226,6 +1226,10 @@
   if (params.visible_on_all_workspaces) {
     state_atom_list.push_back(atom_cache_.GetAtom("_NET_WM_STATE_STICKY"));
     ui::SetIntProperty(xwindow_, "_NET_WM_DESKTOP", "CARDINAL", kAllDesktops);
+  } else if (!params.workspace.empty()) {
+    int workspace;
+    if (base::StringToInt(params.workspace, &workspace))
+      ui::SetIntProperty(xwindow_, "_NET_WM_DESKTOP", "CARDINAL", workspace);
   }
 
   // Setting _NET_WM_STATE by sending a message to the root_window (with
@@ -1390,38 +1394,6 @@
   }
 }
 
-void DesktopWindowTreeHostX11::OnX11WindowMapped() {
-  if (!window_mapped_) {
-    window_mapped_ = true;
-
-    FOR_EACH_OBSERVER(DesktopWindowTreeHostObserverX11,
-                      observer_list_,
-                      OnWindowMapped(xwindow_));
-
-    UpdateMinAndMaxSize();
-
-    // Some WMs only respect maximize hints after the window has been mapped.
-    // Check whether we need to re-do a maximization.
-    if (should_maximize_after_map_) {
-      Maximize();
-      should_maximize_after_map_ = false;
-    }
-  }
-
-  // If we're an override redirect window, we need to perform a full redraw
-  // because on AMD drivers we might get a MapNotify event after performing the
-  // initial draw, which can result in a blank window. crbug.com/606661.
-  if (is_override_redirect_)
-    compositor()->ScheduleFullRedraw();
-}
-
-void DesktopWindowTreeHostX11::OnX11WindowUnmapped() {
-  window_mapped_ = false;
-  FOR_EACH_OBSERVER(DesktopWindowTreeHostObserverX11,
-                    observer_list_,
-                    OnWindowUnmapped(xwindow_));
-}
-
 void DesktopWindowTreeHostX11::UpdateMinAndMaxSize() {
   if (!window_mapped_)
     return;
@@ -1694,17 +1666,12 @@
   }
 
   XMapWindow(xdisplay_, xwindow_);
-  if (is_override_redirect_) {
-    // Override redirect windows don't get routed through the window manager;
-    // we won't reliably get a MapNotify.
-    OnX11WindowMapped();
-  } else {
-    // We now block until our window is mapped. Some X11 APIs will crash and
-    // burn if passed |xwindow_| before the window is mapped, and XMapWindow is
-    // asynchronous.
-    if (ui::X11EventSource::GetInstance())
-      ui::X11EventSource::GetInstance()->BlockUntilWindowMapped(xwindow_);
-  }
+
+  // We now block until our window is mapped. Some X11 APIs will crash and
+  // burn if passed |xwindow_| before the window is mapped, and XMapWindow is
+  // asynchronous.
+  if (ui::X11EventSource::GetInstance())
+    ui::X11EventSource::GetInstance()->BlockUntilWindowMapped(xwindow_);
 }
 
 void DesktopWindowTreeHostX11::SetWindowTransparency() {
@@ -1918,11 +1885,27 @@
       break;
     }
     case MapNotify: {
-      OnX11WindowMapped();
+      window_mapped_ = true;
+
+      FOR_EACH_OBSERVER(DesktopWindowTreeHostObserverX11,
+                        observer_list_,
+                        OnWindowMapped(xwindow_));
+
+      UpdateMinAndMaxSize();
+
+      // Some WMs only respect maximize hints after the window has been mapped.
+      // Check whether we need to re-do a maximization.
+      if (should_maximize_after_map_) {
+        Maximize();
+        should_maximize_after_map_ = false;
+      }
+
       break;
     }
     case UnmapNotify: {
-      OnX11WindowUnmapped();
+      FOR_EACH_OBSERVER(DesktopWindowTreeHostObserverX11,
+                        observer_list_,
+                        OnWindowUnmapped(xwindow_));
       break;
     }
     case ClientMessage: {
@@ -2000,6 +1983,8 @@
         OnWMStateUpdated();
       else if (changed_atom == atom_cache_.GetAtom("_NET_FRAME_EXTENTS"))
         OnFrameExtentsUpdated();
+      else if (changed_atom == atom_cache_.GetAtom("_NET_WM_DESKTOP"))
+        OnHostWorkspaceChanged();
       break;
     }
     case SelectionNotify: {
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h
index 30d337d..6a963f84 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h
@@ -109,6 +109,7 @@
   gfx::Rect GetWindowBoundsInScreen() const override;
   gfx::Rect GetClientAreaBoundsInScreen() const override;
   gfx::Rect GetRestoredBounds() const override;
+  std::string GetWorkspace() const override;
   gfx::Rect GetWorkAreaBoundsInScreen() const override;
   void SetShape(SkRegion* native_region) override;
   void Activate() override;
@@ -184,13 +185,6 @@
   // Called when |xwindow_|'s _NET_FRAME_EXTENTS property is updated.
   void OnFrameExtentsUpdated();
 
-  // Called when |xwindow_| is mapped, either directly (in the case of
-  // override-redirect windows) or in response to a MapNotify event.
-  void OnX11WindowMapped();
-
-  // Called when |xwindow_| is unmapped.
-  void OnX11WindowUnmapped();
-
   // Updates |xwindow_|'s minimum and maximum size.
   void UpdateMinAndMaxSize();
 
@@ -296,9 +290,6 @@
   // True if the window should stay on top of most other windows.
   bool is_always_on_top_;
 
-  // True if the window has the override_redirect bit set.
-  bool is_override_redirect_;
-
   // True if the window has title-bar / borders provided by the window manager.
   bool use_native_frame_;
 
diff --git a/ui/views/widget/native_widget_aura.cc b/ui/views/widget/native_widget_aura.cc
index e25b323..436eaae 100644
--- a/ui/views/widget/native_widget_aura.cc
+++ b/ui/views/widget/native_widget_aura.cc
@@ -398,6 +398,10 @@
   return bounds;
 }
 
+std::string NativeWidgetAura::GetWorkspace() const {
+  return std::string();
+}
+
 void NativeWidgetAura::SetBounds(const gfx::Rect& bounds) {
   if (!window_)
     return;
diff --git a/ui/views/widget/native_widget_aura.h b/ui/views/widget/native_widget_aura.h
index 35d1575..448aa00 100644
--- a/ui/views/widget/native_widget_aura.h
+++ b/ui/views/widget/native_widget_aura.h
@@ -83,6 +83,7 @@
   gfx::Rect GetWindowBoundsInScreen() const override;
   gfx::Rect GetClientAreaBoundsInScreen() const override;
   gfx::Rect GetRestoredBounds() const override;
+  std::string GetWorkspace() const override;
   void SetBounds(const gfx::Rect& bounds) override;
   void SetSize(const gfx::Size& size) override;
   void StackAbove(gfx::NativeView native_view) override;
diff --git a/ui/views/widget/native_widget_delegate.h b/ui/views/widget/native_widget_delegate.h
index 033db2bf..e6c3b84e 100644
--- a/ui/views/widget/native_widget_delegate.h
+++ b/ui/views/widget/native_widget_delegate.h
@@ -97,6 +97,9 @@
   // e.g. maximize.
   virtual void OnNativeWidgetSizeChanged(const gfx::Size& new_size) = 0;
 
+  // Called when NativeWidget changed workspaces.
+  virtual void OnNativeWidgetWorkspaceChanged() = 0;
+
   // Called when the NativeWidget changes its window state.
   // This may happen at the same time as OnNativeWidgetSizeChanged, e.g.
   // maximize.
diff --git a/ui/views/widget/native_widget_mac.h b/ui/views/widget/native_widget_mac.h
index 0670a6a1..93402a1 100644
--- a/ui/views/widget/native_widget_mac.h
+++ b/ui/views/widget/native_widget_mac.h
@@ -80,6 +80,7 @@
   gfx::Rect GetWindowBoundsInScreen() const override;
   gfx::Rect GetClientAreaBoundsInScreen() const override;
   gfx::Rect GetRestoredBounds() const override;
+  std::string GetWorkspace() const override;
   void SetBounds(const gfx::Rect& bounds) override;
   void SetSize(const gfx::Size& size) override;
   void StackAbove(gfx::NativeView native_view) override;
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm
index 524e94a..bfde5f63 100644
--- a/ui/views/widget/native_widget_mac.mm
+++ b/ui/views/widget/native_widget_mac.mm
@@ -306,6 +306,10 @@
   return bridge_ ? bridge_->GetRestoredBounds() : gfx::Rect();
 }
 
+std::string NativeWidgetMac::GetWorkspace() const {
+  return std::string();
+}
+
 void NativeWidgetMac::SetBounds(const gfx::Rect& bounds) {
   if (bridge_)
     bridge_->SetBounds(bounds);
diff --git a/ui/views/widget/native_widget_private.h b/ui/views/widget/native_widget_private.h
index f4e5040..815ab8f 100644
--- a/ui/views/widget/native_widget_private.h
+++ b/ui/views/widget/native_widget_private.h
@@ -167,6 +167,7 @@
   virtual gfx::Rect GetWindowBoundsInScreen() const = 0;
   virtual gfx::Rect GetClientAreaBoundsInScreen() const = 0;
   virtual gfx::Rect GetRestoredBounds() const = 0;
+  virtual std::string GetWorkspace() const = 0;
   virtual void SetBounds(const gfx::Rect& bounds) = 0;
   virtual void SetSize(const gfx::Size& size) = 0;
   virtual void StackAbove(gfx::NativeView native_view) = 0;
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc
index 4cfb3db..17675e7 100644
--- a/ui/views/widget/widget.cc
+++ b/ui/views/widget/widget.cc
@@ -134,8 +134,7 @@
       layer_type(ui::LAYER_TEXTURED),
       context(nullptr),
       force_show_in_taskbar(false),
-      force_software_compositing(false) {
-}
+      force_software_compositing(false) {}
 
 Widget::InitParams::InitParams(const InitParams& other) = default;
 
@@ -489,6 +488,10 @@
   return native_widget_->GetRestoredBounds();
 }
 
+std::string Widget::GetWorkspace() const {
+  return native_widget_->GetWorkspace();
+}
+
 void Widget::SetBounds(const gfx::Rect& bounds) {
   native_widget_->SetBounds(bounds);
 }
@@ -1110,6 +1113,8 @@
     GetWindowBoundsInScreen()));
 }
 
+void Widget::OnNativeWidgetWorkspaceChanged() {}
+
 void Widget::OnNativeWidgetWindowShowStateChanged() {
   SaveWindowPlacementIfInitialized();
 }
diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h
index 4f95200..307e0453 100644
--- a/ui/views/widget/widget.h
+++ b/ui/views/widget/widget.h
@@ -249,6 +249,9 @@
     // |bounds| is in the parent's coordinate system. If the parent is not
     // specified, it's in screen's global coordinate system.
     gfx::Rect bounds;
+    // The initial workspace of the Widget.  Default is "", which means the
+    // current workspace.
+    std::string workspace;
     // When set, this value is used as the Widget's NativeWidget implementation.
     // The Widget will not construct a default one. Default is NULL.
     NativeWidget* native_widget;
@@ -424,6 +427,9 @@
   // Retrieves the restored bounds for the window.
   gfx::Rect GetRestoredBounds() const;
 
+  // Retrieves the current workspace for the window.
+  std::string GetWorkspace() const;
+
   // Sizes and/or places the widget to the specified bounds, size or position.
   void SetBounds(const gfx::Rect& bounds);
   void SetSize(const gfx::Size& size);
@@ -787,6 +793,7 @@
   gfx::Size GetMaximumSize() const override;
   void OnNativeWidgetMove() override;
   void OnNativeWidgetSizeChanged(const gfx::Size& new_size) override;
+  void OnNativeWidgetWorkspaceChanged() override;
   void OnNativeWidgetWindowShowStateChanged() override;
   void OnNativeWidgetBeginUserBoundsChange() override;
   void OnNativeWidgetEndUserBoundsChange() override;
diff --git a/ui/webui/resources/js/media_common.js b/ui/webui/resources/js/media_common.js
deleted file mode 100644
index e984508..0000000
--- a/ui/webui/resources/js/media_common.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2010 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.
-
-function pathIsVideoFile(path) {
-  return /\.(3gp|asf|avi|di?vx|f4v|fbr|mov|mp4|m4v|mpe?g4?|ogm|ogv|ogx|webm|wmv?|xvid)$/i.test(path);
-}
-
-function pathIsAudioFile(path) {
-  return /\.(aac|aiff|atrac|cda|flac|m4a|mp3|pcm|oga|ogg|raw|wav)$/i.test(path);
-}
-
-function pathIsImageFile(path) {
-  return /\.(bmp|gif|jpe?g|ico|png|webp)$/i.test(path);
-}
-
-function pathIsHtmlFile(path) {
-  return /\.(htm|html|txt)$/i.test(path);
-}
-
-function pathIsPdfFile(path) {
-  return /\.(pdf)$/i.test(path);
-}
diff --git a/ui/webui/resources/js/util.js b/ui/webui/resources/js/util.js
index 0836f68..5dcfc926 100644
--- a/ui/webui/resources/js/util.js
+++ b/ui/webui/resources/js/util.js
@@ -345,13 +345,11 @@
   var size = opt_size || 16;
   var type = opt_type || 'favicon';
 
-  // Note: Literals 'iconurl' and 'origin' must match |kIconURLParameter| and
-  // |kOriginParameter| in components/favicon_base/favicon_url_parser.cc.
-  var urlType = FAVICON_URL_REGEX.test(url) ? 'iconurl' : 'origin';
-
   return imageset(
       'chrome://' + type + '/size/' + size + '@scalefactorx/' +
-      urlType + '/' + url);
+      // Note: Literal 'iconurl' must match |kIconURLParameter| in
+      // components/favicon_base/favicon_url_parser.cc.
+      (FAVICON_URL_REGEX.test(url) ? 'iconurl/' : '') + url);
 }
 
 /**
diff --git a/ui/webui/resources/webui_resources.grd b/ui/webui/resources/webui_resources.grd
index af61541a..dfdb035 100644
--- a/ui/webui/resources/webui_resources.grd
+++ b/ui/webui/resources/webui_resources.grd
@@ -434,8 +434,6 @@
                  type="chrome_html" />
       <structure name="IDR_WEBUI_JS_LOAD_TIME_DATA"
                  file="js/load_time_data.js" type="chrome_html" />
-      <structure name="IDR_WEBUI_JS_MEDIA_COMMON"
-                 file="js/media_common.js" type="chrome_html" />
       <structure name="IDR_WEBUI_JS_PARSE_HTML_SUBSET"
                  file="js/parse_html_subset.js" type="chrome_html" />
       <structure name="IDR_WEBUI_JS_POLYMER_CONFIG"